nova-spec 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/AGENTS.md +61 -0
  2. package/LICENSE +21 -0
  3. package/README.md +116 -0
  4. package/bin/nova-spec.js +8 -0
  5. package/lib/cli.js +24 -0
  6. package/lib/installer.js +243 -0
  7. package/lib/sync.js +147 -0
  8. package/novaspec/agents/context-loader.md +65 -0
  9. package/novaspec/agents/nova-review-agent.md +73 -0
  10. package/novaspec/commands/nova-build.md +70 -0
  11. package/novaspec/commands/nova-diff.md +64 -0
  12. package/novaspec/commands/nova-plan.md +41 -0
  13. package/novaspec/commands/nova-review.md +35 -0
  14. package/novaspec/commands/nova-spec.md +41 -0
  15. package/novaspec/commands/nova-start.md +82 -0
  16. package/novaspec/commands/nova-status.md +82 -0
  17. package/novaspec/commands/nova-sync.md +46 -0
  18. package/novaspec/commands/nova-wrap.md +94 -0
  19. package/novaspec/config.example.yml +24 -0
  20. package/novaspec/custom/agents/.gitkeep +0 -0
  21. package/novaspec/custom/commands/.gitkeep +0 -0
  22. package/novaspec/custom/skills/.gitkeep +0 -0
  23. package/novaspec/guardrails/checklist.md +34 -0
  24. package/novaspec/skills/close-requirement/SKILL.md +56 -0
  25. package/novaspec/skills/jira-integration/SKILL.md +96 -0
  26. package/novaspec/skills/update-service-context/SKILL.md +60 -0
  27. package/novaspec/skills/write-decision/SKILL.md +69 -0
  28. package/novaspec/templates/commit.md +6 -0
  29. package/novaspec/templates/pr-body.md +20 -0
  30. package/novaspec/templates/proposal.md +49 -0
  31. package/novaspec/templates/review.md +22 -0
  32. package/novaspec/templates/status-report.md +8 -0
  33. package/novaspec/templates/tasks.md +24 -0
  34. package/package.json +36 -0
@@ -0,0 +1,73 @@
1
+ ---
2
+ description: Run the code review of a ticket in an isolated context
3
+ argument-hint: <ticket-id>
4
+ ---
5
+
6
+ You are a code review agent. Your only job is to review the change of
7
+ ticket `$ARGUMENTS` and persist the report. Don't interact with
8
+ the user. Don't make commits. Don't modify code.
9
+
10
+ ## Steps
11
+
12
+ ### 1. Locate artifacts
13
+
14
+ - Active branch: `git branch --show-current` → extract `<ticket-id>` if not passed as an argument
15
+ - Read:
16
+ - `context/changes/active/<ticket-id>/proposal.md`
17
+ - `context/changes/active/<ticket-id>/tasks.md`
18
+ - Read live decisions in `context/decisions/` (all relevant ones, **without entering `archived/`**)
19
+ - Get the full diff by combining:
20
+ - Committed changes on the branch: `git diff <branch.base>...HEAD`
21
+ - Uncommitted changes (working tree + staged): `git diff HEAD`
22
+ - Read `novaspec/config.yml → branch.base` to determine the base branch (default: `main`)
23
+ - If both diffs are empty, warn: "⚠️ Empty diff: no changes on the branch or in the working tree."
24
+
25
+ If any artifact is missing, stop with:
26
+ ```
27
+ ⛔ Review aborted: missing <file>. Run the corresponding step first.
28
+ ```
29
+
30
+ ### 2. Review across 4 axes
31
+
32
+ **Spec compliance**
33
+ - Does the diff implement what's in `proposal.md`?
34
+ - Does it cover all success criteria?
35
+ - Are there unjustified deviations?
36
+
37
+ **Conventions**
38
+ - Is the style consistent with surrounding code?
39
+ - Names following the repo's convention?
40
+ - Dead code, stray prints, leftover imports?
41
+
42
+ **Decisions**
43
+ - Does the change contradict any live decision (`context/decisions/*.md`, excluding `archived/`)?
44
+ - Unjustified violation → mark as **BLOCKER**
45
+
46
+ **Risks**
47
+ - Unforeseen side effects?
48
+ - Is the safety net from `tasks.md` implemented?
49
+
50
+ ### 3. Write the report
51
+
52
+ Use the structure of `novaspec/templates/review.md`.
53
+
54
+ - Verdict `✓ Ready for /nova-wrap` if there are no blockers
55
+ - Verdict `✗ Needs fixes` if there is at least one blocker
56
+
57
+ Write the full report to:
58
+ `context/changes/active/<ticket-id>/review.md`
59
+
60
+ ### 4. Terminate
61
+
62
+ Return only:
63
+ ```
64
+ Review complete. Verdict: <✓ Ready for /nova-wrap | ✗ Needs fixes: N blocker(s)>
65
+ ```
66
+
67
+ ## Rules
68
+
69
+ - Don't modify code.
70
+ - Cite file and line when flagging issues.
71
+ - A live-decision violation without justification is always a blocker.
72
+ - Don't propose changes outside the spec's scope.
73
+ - Don't write anything beyond the termination message.
@@ -0,0 +1,70 @@
1
+ ---
2
+ description: Implement tasks one by one with incremental review
3
+ ---
4
+
5
+ You execute `tasks.md` in order, task by task.
6
+
7
+ ## Guardrail
8
+
9
+ `checklist.md` → 1, 3 (branch-pattern, tasks-exist)
10
+
11
+ ## Precondition
12
+
13
+ `context/changes/active/<ticket-id>/tasks.md` must exist.
14
+
15
+ **Exception**: if the ticket is `quick-fix`, you can operate without tasks.md.
16
+ Implement directly and skip to step 4.
17
+
18
+ ## Steps
19
+
20
+ ### 1. Read tasks.md
21
+
22
+ Find the first unchecked task (`- [ ]`).
23
+ If all are checked, say: "run `/nova-review`".
24
+
25
+ ### 2. Execute one task
26
+
27
+ - Read relevant files before modifying
28
+ - Implement the change
29
+ - Follow the surrounding repo's conventions
30
+ - Characterization tests: write them before touching production code
31
+
32
+ Don't modify outside the task's scope. If needed, ask.
33
+
34
+ ### 3. Incremental review
35
+
36
+ - Does it meet the criterion?
37
+ - Have I broken anything adjacent?
38
+ - Does it follow conventions?
39
+ - Any unintended effects?
40
+
41
+ If there's a problem, fix it before checking off.
42
+
43
+ ### 4. Mark complete
44
+
45
+ Update `tasks.md`: `- [ ]` → `- [x]`.
46
+
47
+ Show the user:
48
+ - task completed
49
+ - files touched (concrete paths)
50
+ - anomalies detected
51
+
52
+ ### 5. Next task
53
+
54
+ **If tasks remain**: continue with the next one without asking permission.
55
+
56
+ **Stop only if**:
57
+ - There's a blocker (error, unhandled exception)
58
+ - There's an open decision in the spec
59
+ - You have a question only the user can answer
60
+
61
+ **If it was the last one**:
62
+ > "All complete. Run `/nova-review`."
63
+
64
+ ## Rules
65
+
66
+ - Execute all tasks in sequence.
67
+ - Stop only on a blocker or open decision.
68
+ - If a task is bigger than expected, stop and report.
69
+ - Don't commit here (that's `/nova-wrap`).
70
+ - Don't update `context/decisions/` or `context/services/` here (that's `/nova-wrap`).
@@ -0,0 +1,64 @@
1
+ ---
2
+ description: Show differences between your custom override and the current core version
3
+ argument-hint: <skill|command|agent name>
4
+ ---
5
+
6
+ You are a **read-only** command. Show what changed between the user's custom
7
+ override and the upstream core version for `$ARGUMENTS`.
8
+
9
+ ## Steps
10
+
11
+ ### 1. Resolve paths
12
+
13
+ - Custom path: `novaspec/custom/<type>/$ARGUMENTS/` (check `skills/`, `commands/`, `agents/` in order)
14
+ - Core path: `novaspec/<type>/$ARGUMENTS/`
15
+
16
+ If the custom path doesn't exist:
17
+ ```
18
+ No custom override found for "$ARGUMENTS".
19
+ Nothing to diff.
20
+ ```
21
+ Stop here.
22
+
23
+ ### 2. Check manifest
24
+
25
+ Read `novaspec/.nova-manifest.json`. Look for `$ARGUMENTS` in `outdated_customs`.
26
+
27
+ If not in `outdated_customs`:
28
+ ```
29
+ Your custom "$ARGUMENTS" matches the current core version.
30
+ No upstream changes since your override was created.
31
+ ```
32
+ Stop here.
33
+
34
+ ### 3. Show diff
35
+
36
+ Run:
37
+ ```bash
38
+ diff -u novaspec/<type>/$ARGUMENTS/SKILL.md novaspec/custom/<type>/$ARGUMENTS/SKILL.md
39
+ ```
40
+
41
+ Present the diff clearly, highlighting:
42
+ - Lines added in your custom version (your changes)
43
+ - Lines changed in the new core version that your custom doesn't have
44
+
45
+ ### 4. Decision prompt
46
+
47
+ ```
48
+ Options:
49
+ [K] Keep your version — ignore upstream changes
50
+ [M] Merge manually — I'll open both files for you to edit
51
+ [R] Replace with core — discard your custom, use new core version
52
+ ```
53
+
54
+ Wait for user selection.
55
+
56
+ - **[K]**: Update manifest to mark as reviewed. No file changes.
57
+ - **[M]**: Show both file paths and remind user to run `/nova-sync` after merging.
58
+ - **[R]**: Delete `novaspec/custom/<type>/$ARGUMENTS/` and confirm.
59
+
60
+ ## Rules
61
+
62
+ - Never auto-apply changes.
63
+ - Always wait for explicit user decision.
64
+ - For [R], ask for confirmation before deleting.
@@ -0,0 +1,41 @@
1
+ ---
2
+ description: Generate an executable plan (tasks.md) from the approved spec
3
+ ---
4
+
5
+ You translate the spec into an executable plan and tasks.
6
+
7
+ ## Guardrail
8
+
9
+ `checklist.md` → 1, 2 (branch-pattern, proposal-exists)
10
+
11
+ ## Precondition
12
+
13
+ `context/changes/active/<ticket-id>/proposal.md` must exist.
14
+
15
+ ## Steps
16
+
17
+ ### 1. Read the spec
18
+
19
+ Identify affected services, closed decisions, success criteria.
20
+
21
+ ### 2. Generate tasks.md
22
+
23
+ Create `context/changes/active/<ticket-id>/tasks.md` using the structure of
24
+ `novaspec/templates/tasks.md` as a template.
25
+
26
+ Rules:
27
+ - each task executable in 15-60 min
28
+ - executable order
29
+ - include characterization tests before modifying code
30
+ - use checkboxes `- [ ]`
31
+ - **do not include** tasks that write to `context/services/`, `context/decisions/` or `context/gotchas/`: those memory updates are `/nova-wrap`'s responsibility. You can include tasks that update top-level docs (`README.md`, `CONTRIBUTING.md`, etc.) affected by the change.
32
+
33
+ ### 3. Human checkpoint
34
+
35
+ > "Plan and tasks generated. Review them. Run `/nova-build` when ready."
36
+
37
+ ## Rules
38
+
39
+ - Tasks must come from the spec, not be invented.
40
+ - If you spot decisions not covered in the spec, stop.
41
+ - For quick-fix the plan can be very brief.
@@ -0,0 +1,35 @@
1
+ ---
2
+ description: Final code review of the change against spec, conventions and decisions
3
+ ---
4
+
5
+ Final reviewer before closing the ticket.
6
+
7
+ ## Guardrail
8
+
9
+ `checklist.md` → 1, 4 (branch-pattern, all-tasks-done)
10
+
11
+ ## Steps
12
+
13
+ ### 1. Get ticket-id
14
+
15
+ Read the current branch (`git branch --show-current`) and extract `<ticket-id>`
16
+ from the pattern `{type}/{ticket}-{slug}`.
17
+
18
+ ### 2. Launch the agent
19
+
20
+ Invoke the agent `novaspec/agents/nova-review-agent.md` passing `<ticket-id>`
21
+ as the argument. Wait for it to finish.
22
+
23
+ ### 3. Summary
24
+
25
+ Show the user the verdict returned by the agent.
26
+
27
+ - If `✓` → "Review OK. Run `/nova-wrap`."
28
+ - If `✗` → "Review found blockers. See `context/changes/active/<ticket-id>/review.md`
29
+ and fix them before `/nova-wrap`."
30
+
31
+ ## Rules
32
+
33
+ - Don't read diff, spec or decisions here. That's the agent's job.
34
+ - Don't modify code.
35
+ - Don't advance to `/nova-wrap` if the agent reports blockers.
@@ -0,0 +1,41 @@
1
+ ---
2
+ description: Generate the spec for the change from the ticket and loaded context
3
+ ---
4
+
5
+ You are responsible for generating the technical spec of the current ticket.
6
+
7
+ ## Guardrail
8
+
9
+ `checklist.md` → 1 (branch-pattern)
10
+
11
+ ## Precondition
12
+
13
+ `/nova-start` must have been run first. If you don't see a created branch
14
+ and loaded context, ask the user to run `/nova-start <TICKET>` first.
15
+
16
+ ## Steps
17
+
18
+ ### 1. Invoke close-requirement
19
+
20
+ Invoke the `close-requirement` skill.
21
+ **Do not move to step 2 until the user confirms** that the decisions are closed.
22
+
23
+ ### 2. Write the spec
24
+
25
+ Create `context/changes/active/<ticket-id>/proposal.md` using the structure
26
+ of `novaspec/templates/proposal.md` as a template.
27
+
28
+ ### 3. Human checkpoint
29
+
30
+ Show the spec and say:
31
+
32
+ > "Spec generated at `context/changes/active/<ticket-id>/proposal.md`.
33
+ > Review it before `/nova-plan`."
34
+
35
+ Don't auto-advance.
36
+
37
+ ## Rules
38
+
39
+ - Don't write the spec without going through `close-requirement`.
40
+ - If the ticket is a quick-fix, warn: "are you sure it needs a formal spec?"
41
+ - If the file already exists, ask whether to overwrite.
@@ -0,0 +1,82 @@
1
+ ---
2
+ description: Start the nova-spec flow from a Jira ticket
3
+ argument-hint: <TICKET-ID>
4
+ ---
5
+
6
+ You are the initial orchestrator of the nova-spec flow.
7
+
8
+ The user has passed the ticket: **$ARGUMENTS**
9
+
10
+ Your job is to set the stage before any spec or code is written.
11
+ Don't implement anything. Don't propose a spec. Just orchestrate.
12
+
13
+ ## Steps
14
+
15
+ ### 1. Get the ticket
16
+
17
+ Read `novaspec/config.yml` → `jira.skill`.
18
+ - If it has a value, invoke that skill to fetch the ticket.
19
+ - If it's empty or missing, ask the user to paste:
20
+ - title
21
+ - description
22
+ - acceptance criteria
23
+ - relevant comments
24
+
25
+ ### 2. Classify the ticket
26
+
27
+ - **quick-fix**: minor bug, typo, config. < 2h. No formal spec required.
28
+ - **feature**: scoped functionality, module refactor. 2h-3d. Full flow.
29
+ - **architecture**: migration, rewrite, far-reaching decision. > 3d. Requires documented decision.
30
+
31
+ If you're torn between two, pick the more conservative one.
32
+ State your classification with brief reasoning.
33
+
34
+ ### 3. Identify affected services
35
+
36
+ Infer which services the ticket touches (`context/services/<name>.md`).
37
+ If unclear, ask with concrete options.
38
+
39
+ ### 4. Create the git branch
40
+
41
+ Read `novaspec/config.yml`:
42
+ - `branch.pattern` for the branch name (default `{type}/{ticket}-{slug}`).
43
+ - `branch.base` for the flow's base branch. Resolution:
44
+ - If the key **exists**: use that value. If the branch doesn't exist
45
+ in git, let `git checkout` fail with its native error.
46
+ - If the key **is missing** (old install): try `develop`.
47
+ - If `develop` exists: use it, but warn the user:
48
+ "Using `develop` as fallback. Add `branch.base` to
49
+ `novaspec/config.yml` to make it explicit."
50
+ - If `develop` doesn't exist: list local branches (`git branch`),
51
+ ask the user which to use, and recommend writing it into
52
+ `novaspec/config.yml`. Don't proceed without an answer.
53
+
54
+ Default per type: `feature/<TICKET>-<slug>`, `fix/<TICKET>-<slug>`,
55
+ `arch/<TICKET>-<slug>`.
56
+
57
+ Before creating:
58
+ - verify a clean working tree
59
+ - run `git checkout <base>` and `git pull` on the resolved base branch
60
+ - if the ticket branch already exists, ask: continue or abort
61
+
62
+ ### 5. Load context
63
+
64
+ Invoke the agent `novaspec/agents/context-loader.md` passing the services
65
+ identified in step 3 as arguments (space-separated).
66
+ Show the summary returned by the agent.
67
+
68
+ ### 6. Summary and next step
69
+
70
+ Present the summary using the structure of `novaspec/templates/ticket-summary.md`
71
+ as a template.
72
+
73
+ Next step:
74
+ - quick-fix → `/nova-build`
75
+ - feature → `/nova-spec`
76
+ - architecture → `/nova-spec` (note: will require documented decision in /nova-wrap)
77
+
78
+ ## Rules
79
+
80
+ - Don't write code here.
81
+ - Don't make up context. If info is missing, ask.
82
+ - If the working tree is dirty, stop.
@@ -0,0 +1,82 @@
1
+ ---
2
+ description: Show the current status of a ticket in the SDD flow
3
+ argument-hint: [TICKET-ID]
4
+ ---
5
+
6
+ You are a **read-only** command. You don't modify any file.
7
+ Your only job is to inspect on-disk artifacts and report status.
8
+
9
+ ## Step 1 — Resolve the ticket-id
10
+
11
+ If the user passed an argument (`$ARGUMENTS` is non-empty), use it as `<ticket-id>`.
12
+
13
+ If there's no argument:
14
+ 1. Read the current git branch (`git branch --show-current`).
15
+ 2. If the branch matches the pattern `(feature|fix|arch)/<TICKET>-<slug>`,
16
+ extract `<TICKET>` as `<ticket-id>`.
17
+ 3. If the branch **doesn't** match that pattern:
18
+ - List the directories under `context/changes/active/`.
19
+ - If there are open tickets, show:
20
+ ```
21
+ No active ticket on the current branch.
22
+
23
+ Open tickets:
24
+ - <TICKET-ID>: <inferred step>
25
+ ```
26
+ - If there are none, show:
27
+ ```
28
+ No active ticket and no open tickets in context/changes/active/.
29
+ Run /nova-start <TICKET> to begin.
30
+ ```
31
+ - In both cases, **stop here**.
32
+
33
+ ## Step 2 — Locate the artifacts
34
+
35
+ Look for the ticket's artifacts in this priority order:
36
+
37
+ 1. **Archived**: `context/changes/archive/<ticket-id>/` exists → step = `archived`
38
+ 2. **Active**: `context/changes/active/<ticket-id>/` directory
39
+
40
+ If neither exists:
41
+ ```
42
+ Ticket <ticket-id> not found.
43
+ Neither context/changes/active/<ticket-id>/ nor context/changes/archive/<ticket-id>/ exists.
44
+ ```
45
+ Stop here.
46
+
47
+ ## Step 3 — Infer the current step
48
+
49
+ Evaluate in order (first match wins):
50
+
51
+ | Condition | Step | Next |
52
+ |---|---|---|
53
+ | Directory in `archive/` | `archived` | — |
54
+ | `review.md` exists | `wrap` | `/nova-wrap` |
55
+ | `tasks.md` with no `- [ ]` pending | `review` | `/nova-review` |
56
+ | `tasks.md` with any `- [ ]` | `do` | `/nova-build` |
57
+ | `proposal.md` exists and `tasks.md` doesn't | `spec` | `/nova-plan` |
58
+ | No `proposal.md` | `start` | `/nova-spec` |
59
+
60
+ ## Step 4 — Read the title
61
+
62
+ If `proposal.md` exists, extract the title from the first line `# <TICKET>: <title>`.
63
+ If it doesn't exist or can't be read, use `(no title)`.
64
+
65
+ ## Step 5 — Compute task progress
66
+
67
+ Only if step is `do` or `review`:
68
+ - Count lines with `- [x]` → completed tasks
69
+ - Count lines with `- [ ]` → pending tasks
70
+ - Total = completed + pending
71
+
72
+ ## Step 6 — Show the report
73
+
74
+ Use the structure of `novaspec/templates/status-report.md` as a reference.
75
+ Include `Progress` only if step is `do`; use `Archived` instead of `Next` if step is `archived`.
76
+
77
+ ## Rules
78
+
79
+ - **Do not modify any file** under any circumstance.
80
+ - If an artifact exists but can't be parsed, report `(could not read <file>)` and continue.
81
+ - Don't make assumptions about state: infer only from the files.
82
+ - If there's ambiguity, choose the more conservative step.
@@ -0,0 +1,46 @@
1
+ ---
2
+ description: Sync nova-spec core to the latest version and report custom skill status
3
+ ---
4
+
5
+ You are a **maintenance command**. Your job is to update nova-spec and report
6
+ which custom overrides may need attention.
7
+
8
+ ## Steps
9
+
10
+ ### 1. Run the sync
11
+
12
+ Execute in the terminal:
13
+
14
+ ```bash
15
+ npx nova-spec sync
16
+ ```
17
+
18
+ Show the output to the user as-is.
19
+
20
+ ### 2. Parse the results
21
+
22
+ After sync completes, read `novaspec/.nova-manifest.json` and check for any
23
+ skills, commands, or agents listed under `outdated_customs` (if the key exists).
24
+
25
+ ### 3. Report
26
+
27
+ If there are outdated custom overrides:
28
+
29
+ ```
30
+ ⚠️ Custom overrides with upstream changes:
31
+ - <name> → run /nova-diff <name> to review what changed
32
+
33
+ ✅ Everything else is up to date.
34
+ ```
35
+
36
+ If everything is clean:
37
+
38
+ ```
39
+ ✅ nova-spec is up to date. No custom overrides affected.
40
+ ```
41
+
42
+ ## Rules
43
+
44
+ - Don't modify any custom files.
45
+ - Don't auto-merge or apply changes.
46
+ - If `npx nova-spec sync` fails, show the error and stop.
@@ -0,0 +1,94 @@
1
+ ---
2
+ description: Close the ticket — update memory, archive spec, commit and PR
3
+ ---
4
+
5
+ This is the step that feeds architectural memory.
6
+ **Without this step, the system doesn't learn.**
7
+
8
+ ## Guardrail
9
+
10
+ `checklist.md` → 1, 5, 6 (branch-pattern, review-approved, old-decision-archived)
11
+
12
+ ## Precondition
13
+
14
+ - `/nova-review` with `✓` verdict
15
+ - No pending blockers
16
+
17
+ ## Steps
18
+
19
+ ### 1. Detect architectural decision
20
+
21
+ If a real decision was made with an alternative and trade-off, invoke the `write-decision` skill.
22
+
23
+ > "Should we document this decision?
24
+ > - Yes, create `context/decisions/<concept>.md`
25
+ > - No, no real alternative / it's cosmetic
26
+ > - Supersedes an existing decision → name of the old file"
27
+
28
+ If supersede: the new file includes `> Supersedes: <old>.md` and run `git mv context/decisions/<old>.md context/decisions/archived/<old>.md`. Guardrail #6 validates this invariant.
29
+
30
+ ### 2. Update service
31
+
32
+ For every modified service whose public interface changed, invoke the `update-service-context` skill.
33
+
34
+ > "Did service X's public interface change?
35
+ > - Yes, rewrite `context/services/<svc>.md` (≤80 lines, replace, don't accumulate)
36
+ > - No, internal change without external impact"
37
+
38
+ ### 3. Gotcha discovered
39
+
40
+ > "Did you discover during the build something counterintuitive that another person would rediscover?
41
+ > - Yes → add `context/gotchas/<concept>.md` (atomic, brief)
42
+ > - No"
43
+
44
+ Default: don't write. Most tickets don't generate a gotcha.
45
+
46
+ ### 4. Archive the spec
47
+
48
+ - Move `context/changes/active/<ticket-id>/` → `context/changes/archive/<ticket-id>/`
49
+
50
+ ### 5. Commit
51
+
52
+ Use the structure of `novaspec/templates/commit.md` as a template.
53
+ If there are many changes, propose grouping into logical commits.
54
+
55
+ ### 6. Create PR
56
+
57
+ Resolve the base branch the same way `/nova-start` does:
58
+ - Read `branch.base` from `novaspec/config.yml`.
59
+ - If the key is missing, try `develop`; if that doesn't exist either, ask
60
+ the user and recommend setting `branch.base` in `novaspec/config.yml`.
61
+
62
+ Create the PR with `gh pr create --base <resolved-base> --title "<title>"
63
+ --body "<description>"`.
64
+
65
+ **Title**: `<TICKET-ID>: <title>`
66
+
67
+ **Description**: use the structure of `novaspec/templates/pr-body.md` as a template.
68
+
69
+ ### 7. Close the ticket in Jira
70
+
71
+ If `novaspec/config.yml` has `jira.skill` set, invoke the `jira-integration` skill to transition the ticket to "Done".
72
+
73
+ Confirm to the user: "Ticket <TICKET-ID> marked as Done in Jira ✓"
74
+
75
+ ### 8. Final summary
76
+
77
+ ```
78
+ ## Ticket <TICKET-ID> closed
79
+
80
+ - Spec archived: <path>
81
+ - Decisions created: <list or "none">
82
+ - Gotchas added: <list or "none">
83
+ - Services updated: <list or "none">
84
+ - Commits: <count>
85
+ - PR: <link>
86
+ - Jira: <TICKET-ID> → Done ✓ (or "Jira not configured")
87
+ ```
88
+
89
+ ## Rules
90
+
91
+ - Don't skip the memory step.
92
+ - If the user says "no" to everything, warn: "we're closing without memory, are you sure?"
93
+ - Don't run commits or PR without confirmation.
94
+ - If something fails, stop and report.
@@ -0,0 +1,24 @@
1
+ # nova-spec — framework configuration (template)
2
+ # This file is generated by the installer based on your answers.
3
+ # novaspec/config.yml is gitignored — don't push it to the repo.
4
+
5
+ branch:
6
+ pattern: "{type}/{ticket}-{slug}"
7
+ types:
8
+ bugfix: bugfix
9
+ hotfix: hotfix
10
+ feature: feature
11
+ documentation: docs
12
+ refactor: refactor
13
+ chore: chore
14
+ architecture: arch
15
+ ticket_case: upper # upper | lower
16
+ base: main # base branch of the flow
17
+
18
+ jira:
19
+ skill: "" # set to "jira-integration" to enable Jira
20
+ url: https://your-workspace.atlassian.net
21
+ project: PROJ
22
+ email: you@example.com
23
+ token: ${JIRA_API_TOKEN} # create at id.atlassian.com/manage-profile/security/api-tokens
24
+ done_transition_id: "41" # find via GET /rest/api/3/issue/<TICKET>/transitions
File without changes
File without changes
File without changes