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.
- package/AGENTS.md +61 -0
- package/LICENSE +21 -0
- package/README.md +116 -0
- package/bin/nova-spec.js +8 -0
- package/lib/cli.js +24 -0
- package/lib/installer.js +243 -0
- package/lib/sync.js +147 -0
- package/novaspec/agents/context-loader.md +65 -0
- package/novaspec/agents/nova-review-agent.md +73 -0
- package/novaspec/commands/nova-build.md +70 -0
- package/novaspec/commands/nova-diff.md +64 -0
- package/novaspec/commands/nova-plan.md +41 -0
- package/novaspec/commands/nova-review.md +35 -0
- package/novaspec/commands/nova-spec.md +41 -0
- package/novaspec/commands/nova-start.md +82 -0
- package/novaspec/commands/nova-status.md +82 -0
- package/novaspec/commands/nova-sync.md +46 -0
- package/novaspec/commands/nova-wrap.md +94 -0
- package/novaspec/config.example.yml +24 -0
- package/novaspec/custom/agents/.gitkeep +0 -0
- package/novaspec/custom/commands/.gitkeep +0 -0
- package/novaspec/custom/skills/.gitkeep +0 -0
- package/novaspec/guardrails/checklist.md +34 -0
- package/novaspec/skills/close-requirement/SKILL.md +56 -0
- package/novaspec/skills/jira-integration/SKILL.md +96 -0
- package/novaspec/skills/update-service-context/SKILL.md +60 -0
- package/novaspec/skills/write-decision/SKILL.md +69 -0
- package/novaspec/templates/commit.md +6 -0
- package/novaspec/templates/pr-body.md +20 -0
- package/novaspec/templates/proposal.md +49 -0
- package/novaspec/templates/review.md +22 -0
- package/novaspec/templates/status-report.md +8 -0
- package/novaspec/templates/tasks.md +24 -0
- 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
|