惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

G
Google Developers Blog
博客园 - 三生石上(FineUI控件)
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
MongoDB | Blog
MongoDB | Blog
小众软件
小众软件
Y
Y Combinator Blog
博客园 - 聂微东
Google DeepMind News
Google DeepMind News
D
Docker
罗磊的独立博客
Microsoft Security Blog
Microsoft Security Blog
D
DataBreaches.Net
B
Blog
Vercel News
Vercel News
Recent Announcements
Recent Announcements
GbyAI
GbyAI
阮一峰的网络日志
阮一峰的网络日志
T
The Blog of Author Tim Ferriss
H
Hackread – Cybersecurity News, Data Breaches, AI and More
P
Proofpoint News Feed
酷 壳 – CoolShell
酷 壳 – CoolShell
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Microsoft Azure Blog
Microsoft Azure Blog
宝玉的分享
宝玉的分享

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant
From Specs to Tickets: Automating Jira Setup with Node.js...
Constanza Diaz · 2026-05-31 · via DEV Community

The plan was simple

Take the specs we'd written, turn them into Jira epics, stories and subtasks, and start sprinting.

It took longer than expected. Here's what actually happened — and what I learned.


Why automate Jira setup at all?

HandyFEM has 8 epics, 37 stories and ~160 subtasks. Creating that manually would take a full day and be error-prone. More importantly: the specs were already written in a structured format. Translating structured data into Jira issues is exactly the kind of repetitive task that should be automated.

So I wrote a Node.js script to do it via the Jira REST API.


Problem 1 — Jira Spaces ≠ Jira Classic

My account uses Jira Spaces — Atlassian's newer interface. The classic Jira has CSV import built in. Jira Spaces doesn't.

This isn't documented anywhere obviously. You discover it by looking for the import option and not finding it.

Lesson: always check which version of Jira you have before planning your workflow. The API still works, but some endpoints behave differently.


Problem 2 — The API token wasn't the issue (until it was)

First attempt: connection error. I assumed it was the token. It wasn't — it was an expired token from a previous session. Regenerating it fixed the connection.

The real lesson: curl -u email:token https://your-domain.atlassian.net/rest/api/3/myself is the fastest way to verify auth before running any script.


Problem 3 — customfield_10014 doesn't exist in team-managed projects

In classic Jira, linking a story to an epic uses a field called customfield_10014 (Epic Link). In team-managed projects (Jira Spaces), this field doesn't exist. You use parent instead.

The error was clear once I saw it:

"customfield_10014": "Field cannot be set. It is not on the appropriate screen, or unknown."

Fix: remove customfield_10014, keep only parent: { id: epicId }.


Problem 4 — Board search doesn't work for team-managed projects

The Agile API endpoint /rest/agile/1.0/board?projectKeyOrId=HFM returns empty for team-managed projects, even when the board exists.

Claude Code caught this one after the first failure — it explained the root cause and the fix: hardcode the board ID directly instead of searching for it.

// This doesn't work for team-managed projects:
const boards = await fetch(`/rest/agile/1.0/board?projectKeyOrId=HFM`)

// This does:
const board = { id: 1, name: "SCRUM board" }


What the final setup looks like

8 epics covering the full project lifecycle:

  • Planning & architecture (done)
  • Design System (in progress)
  • MVP screens (in progress)
  • Backend / Supabase
  • Security & privacy
  • PWA + SEO + emails
  • Testing & launch
  • AI Agentic features (v2)

37 stories with detailed descriptions and acceptance criteria.

~160 subtasks per story — including one for writing the blog post before closing the story. That last one matters: documentation that lives next to the work gets written. Documentation planned separately doesn't.

8 sprints mapped to the logical build order — from DS implementation to public launch in Barcelona.


Security: never hardcode tokens

The scripts use node --env-file=.env.local (native in Node v18+) to load credentials. No dotenv dependency, no token in the codebase.

node --env-file=.env.local docs/handyfem-jira-import.js

Both scripts are in .gitignore. Claude Code was instructed to never write sensitive values directly — always give instructions for the developer to add them manually.


What I'd do differently

Start with a simple API test before writing the full script. One curl call to verify auth and one to verify the project endpoint would have saved 30 minutes of debugging, and a lot of Claude tokens.

Also: when automating Jira, always check whether your project is classic or team-managed first. The API surface is different enough to matter.


The scripts

Both scripts are in docs/ in the HandyFEM repo:

  • handyfem-jira-import.js — creates epics, stories and subtasks
  • handyfem-jira-sprints.js — creates sprints and assigns issues

📚 HandyFEM App Series

🏷️ All posts in this series: #HandyFEMApp

Building in public. All mistakes included.