Work your Jira backlog directly from a FRAME session

I created a jira-cli skill with the skill-creation cartridge - Jira work items become first-class citizens in any FRAME session.

One line in CLAUDE.md is all it takes to pull Jira work items directly into a FRAME session. Here’s what that looks like in practice.

In CLAUDE.md I added the following lines:

## Skills
- jira-cli — Jira issue tracker (project: FRAME)

That’s all what’s needed.


❯ list all open work items

⏺ Skill(jira-cli) ⎿ Successfully loaded skill

⏺ Here are all open work items in the FRAME project:

In Progress (1)

KeyTypeSummary
FRAME-2StoryTask 42

To Do (14)

KeyTypeSummary
FRAME-19TaskMinor code cleanup: fix docstring contradiction and extract duplicated patch text
FRAME-18TaskTest cleanup: add missing edge case tests and remove stale TDD docstrings
FRAME-17TaskFix README docs: PyYAML claim and missing env vars
FRAME-16BugUse atomic writes in patch_gsd.sh
FRAME-15BugEmit warning on notebook deletion failure
FRAME-14TaskReplace deprecated datetime.utcnow()
FRAME-13BugFix auth error misclassification on TOCTOU race
FRAME-12TaskResolve max_cache_age_days implementation gap
FRAME-11TaskReplace personal path in README and man page examples
FRAME-10BugFix _get_daily_limit() crash on non-numeric or zero env var
FRAME-9BugAdd — separator guard to nlm positional args
FRAME-8TaskPre-release gitignore cleanup: untrack .claude/, .frame/, .DS_Store
FRAME-7BugFix YAML serialization: quote URL and file path values
FRAME-4SubtaskSub-Task 2.1

15 open items total: 6 bugs, 7 tasks, 1 story, 1 subtask.


These items were generated by a code-audit cartridge run against the notebooklm skill project.

After running /frame load sw-development:

⏺ What are we building? Give me a one-line description — specific enough that “done” is unambiguous.

✻ Brewed for 1m 3s

❯ load work item FRAME-7. Fix the issue and also update the work item correctly in jira in between and at the end

⏺ Skill(jira-cli) ⎿ Successfully loaded skill

⏺ Bash(jira issue view FRAME-7) ⎿ 🐞 Bug 🚧 To Do ⌛ Thu, 26 Mar 26 👷 Unassigned 🔑️ FRAME-7 💭 0 comments 🧵 0 linked

 # Fix YAML serialization: quote URL and file path values

… +18 lines (ctrl+o to expand)

⏺ FRAME-7 loaded. The goal and acceptance criteria are well-defined. Let me work through SHAPE.


Goal: Fix YAML serialization in scripts/research.py — apply json.dumps() wrapping (or switch to yaml.dump()) to URL and file path values in _write_recipe (lines 371-376) and _build_cache_content (line 106), so values containing : or # don’t corrupt the recipe or cache files.

Does that capture the goal accurately, or do you want to adjust the wording?

❯ fits

⏺ FRAME ▸ Working on an existing codebase. → Create a branch for this session? (y / skip)

⏺ User answered Claude’s questions: ⎿ · Create a feature branch for this fix? → Yes (Recommended)

⏺ Branch name — I’ll use fix/frame-7-yaml-quoting. Confirm, or type a different name?

❯ yes

Branch created. Stack is Python 3.11 / stdlib / pytest 8.x — consistent with the existing codebase.

Constraints — are there any hard constraints on how to fix this? The ticket suggests two options: json.dumps() wrapping (consistent with existing style) or switching to yaml.dump(). Any preference, or shall I recommend?

❯ recommend

⏺ Recommendation: json.dumps() wrapping — it’s consistent with how name, description, and queries are already handled in the same functions. yaml.dump() would be a larger refactor with more test surface area, and the ticket is specifically a contained fix.

Constraint recorded as: no new dependencies; apply json.dumps() to URL/path values only — consistent with existing style.

Agreed?

❯ agreed

⏺ References — any coding conventions or style guides I should follow? Or skip — I’ll read the existing code patterns directly.

❯ skip

⏺ Acceptance Criteria — from the ticket:

▎ All URL/path values in _write_recipe and _build_cache_content are quoted; a URL containing : or # round-trips correctly through write/load.

Does that cover it, or anything to add?

❯ yes

⏺ Out of scope — what are we explicitly not building? Suggested: no changes to yaml.dump() refactor, no other YAML fields, no recipe format changes. Confirm or adjust?

❯ confirm

⏺ Path decision: This is a contained fix — two specific lines in one file, implementation approach is unambiguous, no design uncertainty. Recommend skipping DESIGN.

Full SHAPE summary to confirm before closing the gate:

Goal : Fix YAML serialization in scripts/research.py — apply json.dumps() to URL/path values in _write_recipe (lines 371-376) and _build_cache_content (line 106) Stack : Python 3.11, stdlib, pytest 8.x Branch : fix/frame-7-yaml-quoting Constraints: No new dependencies; json.dumps() only — consistent with existing style References : none Acceptance : All URL/path values in _write_recipe and _build_cache_content are quoted; a URL containing : or # round-trips correctly through write/load Out of scope: yaml.dump() refactor, other YAML fields, recipe format changes Path : Contained fix (SHAPE → BREAKDOWN → BUILD → CHECK; DESIGN skipped)

Does this look right?

❯ yes

… Claude Code doing its thing … … …

⏺ FRAME ▸ Session complete.

Project  : Fix YAML serialization — URL/path quoting in scripts/research.py
Cartridge: sw-development v1.0
Units    : 1 complete
Branch   : merged into master

PROJECT.md updated with Handoff. Safe to /clear.

Jira item FRAME-7 was set to Done in the end and got a proper comment:

Fixed in branch fix/frame-7-yaml-quoting.

Applied json.dumps() to bare URL/path list items in three locations:
- _build_cache_content (line 113): source_urls list items
- _write_recipe (line 408): urls list items
- _write_recipe (line 412): files list items

Consistent with existing json.dumps() usage for name/description/queries. 5 round-trip tests added (F-005, F-008); 176/176 passing.

Claude Code does the heavy lifting — you stay in control by answering its questions at each step.