@trieungoctam/speckit 0.2.0 → 0.2.2
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/README.md +5 -0
- package/dist/adapters/antigravity-adapter.js +5 -5
- package/dist/adapters/claude-code-adapter.js +8 -5
- package/dist/adapters/codex-adapter.js +5 -3
- package/dist/adapters/cursor-adapter.js +6 -3
- package/dist/adapters/opencode-adapter.js +1 -0
- package/dist/cli.js +4 -0
- package/dist/commands/context.js +56 -22
- package/dist/commands/plan.js +19 -2
- package/dist/commands/quick.js +20 -2
- package/dist/commands/ready.d.ts +7 -0
- package/dist/commands/ready.js +20 -0
- package/dist/commands/run.js +15 -2
- package/dist/commands/sync.js +2 -2
- package/dist/commands/triage.js +1 -1
- package/dist/core/readiness.d.ts +13 -0
- package/dist/core/readiness.js +120 -0
- package/dist/core/scaffold.js +67 -8
- package/dist/core/story.d.ts +5 -0
- package/dist/core/story.js +34 -0
- package/docs/development-roadmap.md +4 -4
- package/docs/product-contract.md +3 -3
- package/docs/project-changelog.md +36 -0
- package/docs/release-checklist.md +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -10,6 +10,9 @@ Speckit owns the workflow contract and generates adapters for the tools you alre
|
|
|
10
10
|
npx @trieungoctam/speckit@latest init --ide all
|
|
11
11
|
npx @trieungoctam/speckit@latest init --enterprise --ide all
|
|
12
12
|
npx @trieungoctam/speckit@latest quick "Add checkout validation"
|
|
13
|
+
npx @trieungoctam/speckit@latest context .speckit/stories/<story>.md
|
|
14
|
+
npx @trieungoctam/speckit@latest sync
|
|
15
|
+
npx @trieungoctam/speckit@latest ready .speckit/stories/<story>.md
|
|
13
16
|
npx @trieungoctam/speckit@latest review
|
|
14
17
|
```
|
|
15
18
|
|
|
@@ -31,6 +34,7 @@ intent
|
|
|
31
34
|
-> context
|
|
32
35
|
-> story with acceptance criteria
|
|
33
36
|
-> sync / triage
|
|
37
|
+
-> readiness gate
|
|
34
38
|
-> red test evidence
|
|
35
39
|
-> minimal implementation
|
|
36
40
|
-> green test evidence
|
|
@@ -57,6 +61,7 @@ For implementation stories, red-green-refactor evidence is mandatory. A story is
|
|
|
57
61
|
| `speckit triage` | Summarize synced story state without interactive graph commands. |
|
|
58
62
|
| `speckit next` | Safely wraps `bv --robot-next --format json`. |
|
|
59
63
|
| `speckit sync` | Export Speckit stories as beads-compatible JSONL metadata. |
|
|
64
|
+
| `speckit ready <story>` | Validate story status, context, evidence, graph sync, and safety policy before implementation. |
|
|
60
65
|
| `speckit run <story>` | Print the TDD execution handoff for a story. |
|
|
61
66
|
| `speckit review` | Print the review checklist and current diff summary. |
|
|
62
67
|
| `speckit close <story>` | Create a closure checklist linked to the story and sync step. |
|
|
@@ -12,12 +12,12 @@ export const antigravityAdapter = {
|
|
|
12
12
|
],
|
|
13
13
|
render() {
|
|
14
14
|
return [
|
|
15
|
-
rule("agile", "Follow Speckit Agile: shape intent, create stories with ACs, preserve
|
|
16
|
-
rule("tdd", "For code changes, use TDD:
|
|
15
|
+
rule("agile", "Follow Speckit Agile: shape intent, read .speckit/context/current.md, create stories with ACs, preserve session handoff, and emit artifacts for review."),
|
|
16
|
+
rule("tdd", "For code changes, use TDD: confirm acceptance criteria, use red-green-refactor, and record evidence for each step."),
|
|
17
17
|
rule("enterprise-safety", "Require human approval for destructive commands, production changes, secrets access, and deployment."),
|
|
18
|
-
workflow("plan", "Create a Speckit plan artifact with PRD, architecture, stories, risks, and
|
|
19
|
-
workflow("tdd-run", "Run a story with TDD. Emit artifact sections: Test Intent, Red, Green, Refactor."),
|
|
20
|
-
workflow("review", "Review the produced artifacts and code diff. Flag AC gaps, TDD gaps, security issues, and
|
|
18
|
+
workflow("plan", "Create a Speckit plan artifact with PRD, architecture, stories, risks, dependencies, and graph sync notes."),
|
|
19
|
+
workflow("tdd-run", "Run a story with TDD from .speckit/context/current.md and .speckit/context/subagent-handoff.md. Require speckit ready <story> first. Emit artifact sections: Test Intent, Red, Green, Refactor. Use only robot-safe graph commands."),
|
|
20
|
+
workflow("review", "Review the produced artifacts and code diff. Flag AC gaps, TDD gaps, security issues, docs needs, and session handoff gaps."),
|
|
21
21
|
];
|
|
22
22
|
},
|
|
23
23
|
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { json, markdown } from "../core/managed-files.js";
|
|
2
|
-
const skillIntro = `Follow Speckit: Agile story flow plus mandatory TDD evidence.
|
|
2
|
+
const skillIntro = `Follow Speckit: Agile story flow plus mandatory TDD evidence. Read .speckit/context/current.md first, preserve session handoff, use red-green-refactor, and use robot-safe graph commands only.`;
|
|
3
3
|
export const claudeCodeAdapter = {
|
|
4
4
|
name: "claude-code",
|
|
5
5
|
displayName: "Claude Code",
|
|
@@ -21,7 +21,10 @@ Use Speckit for Agile + TDD work.
|
|
|
21
21
|
- Start from \`.speckit/rules/agile-policy.md\`.
|
|
22
22
|
- For implementation, follow \`.speckit/rules/tdd-policy.md\`.
|
|
23
23
|
- For safety, follow \`.speckit/rules/enterprise-safety.md\`.
|
|
24
|
-
- Prefer \`speckit
|
|
24
|
+
- Prefer \`speckit start\`, \`speckit context\`, \`speckit sync\`, \`speckit triage\`, \`speckit run\`, and \`speckit review\` over ad hoc prompts.
|
|
25
|
+
- Run \`speckit ready <story>\` before implementation; story status must be \`ready-for-dev\` and context status must be \`fresh\`.
|
|
26
|
+
- For code stories, confirm acceptance criteria and record red-green-refactor evidence before handoff.
|
|
27
|
+
- Never run bare \`bv\`; use robot flags such as \`bv --robot-next --format json\`.
|
|
25
28
|
`),
|
|
26
29
|
},
|
|
27
30
|
{
|
|
@@ -33,9 +36,9 @@ Use Speckit for Agile + TDD work.
|
|
|
33
36
|
includeCoAuthoredBy: false,
|
|
34
37
|
}),
|
|
35
38
|
},
|
|
36
|
-
skill("speckit-plan", "Create or update a Speckit Agile plan.", "Read `.speckit/workflows/shape.md`, then create PRD, architecture, and story artifacts with acceptance criteria."),
|
|
37
|
-
skill("speckit-tdd", "Execute a Speckit story with TDD.", "Read `.speckit/workflows/tdd-run.md`. Do not implement before test intent and red evidence
|
|
38
|
-
skill("speckit-review", "Review a Speckit change.", "Read `.speckit/workflows/review.md`. Prioritize
|
|
39
|
+
skill("speckit-plan", "Create or update a Speckit Agile plan.", "Read `.speckit/workflows/shape.md`, preserve the session id, then create PRD, architecture, and story artifacts with acceptance criteria."),
|
|
40
|
+
skill("speckit-tdd", "Execute a Speckit story with TDD.", "Read `.speckit/context/current.md`, `.speckit/context/subagent-handoff.md`, and `.speckit/workflows/tdd-run.md`. Do not implement before `speckit ready <story>` passes, test intent is clear, and red evidence is recorded."),
|
|
41
|
+
skill("speckit-review", "Review a Speckit change.", "Read `.speckit/workflows/review.md`. Prioritize AC coverage, TDD evidence gaps, security, docs impact, and graph sync status."),
|
|
39
42
|
];
|
|
40
43
|
},
|
|
41
44
|
};
|
|
@@ -19,6 +19,8 @@ This repository uses Speckit: Agile + TDD for agentic development.
|
|
|
19
19
|
|
|
20
20
|
Rules:
|
|
21
21
|
- Shape intent before implementation.
|
|
22
|
+
- Read \`.speckit/context/current.md\` before running code changes.
|
|
23
|
+
- Run \`speckit ready <story>\` before implementation; story status must be \`ready-for-dev\` and context status must be \`fresh\`.
|
|
22
24
|
- For code stories, write test intent and capture red/green/refactor evidence.
|
|
23
25
|
- Never call bare \`bv\`; use \`bv --robot-*\`.
|
|
24
26
|
- Do not weaken approval or sandbox settings.
|
|
@@ -37,9 +39,9 @@ web_search = true
|
|
|
37
39
|
[features]
|
|
38
40
|
child_agents_md = true`),
|
|
39
41
|
},
|
|
40
|
-
prompt("plan", "Create a Speckit plan from the user intent.
|
|
41
|
-
prompt("tdd-run", "Execute the selected Speckit story using red-green-refactor.
|
|
42
|
-
prompt("review", "Review the current diff against Speckit ACs, TDD evidence, security, and
|
|
42
|
+
prompt("plan", "Create a Speckit plan from the user intent. Preserve session context, include PRD, architecture, stories, ACs, TDD checklist, risks, and graph sync notes."),
|
|
43
|
+
prompt("tdd-run", "Execute the selected Speckit story using .speckit/context/current.md, .speckit/context/subagent-handoff.md, and red-green-refactor. Require speckit ready <story>, confirm ACs, record command evidence, and use only robot-safe graph commands."),
|
|
44
|
+
prompt("review", "Review the current diff against Speckit ACs, TDD evidence, security, docs impact, session handoff, and graph sync status."),
|
|
43
45
|
];
|
|
44
46
|
},
|
|
45
47
|
};
|
|
@@ -12,9 +12,9 @@ export const cursorAdapter = {
|
|
|
12
12
|
],
|
|
13
13
|
render() {
|
|
14
14
|
return [
|
|
15
|
-
rule("agile", "alwaysApply: true", "Use Speckit Agile flow.
|
|
16
|
-
rule("tdd", "description: Apply when implementing or modifying code", "Use red-green-refactor.
|
|
17
|
-
rule("review", "description: Apply when reviewing code or preparing a PR", "Review AC coverage, TDD evidence, security, and
|
|
15
|
+
rule("agile", "alwaysApply: true", "Use Speckit Agile flow. Read .speckit/context/current.md and .speckit/context/subagent-handoff.md, preserve session handoff, create stories with ACs, and keep work scoped."),
|
|
16
|
+
rule("tdd", "description: Apply when implementing or modifying code", "Use red-green-refactor. Run speckit ready <story>, confirm acceptance criteria, and record TDD evidence before review-ready."),
|
|
17
|
+
rule("review", "description: Apply when reviewing code or preparing a PR", "Review AC coverage, TDD evidence, security, docs impact, and graph sync status."),
|
|
18
18
|
rule("enterprise-safety", "alwaysApply: true", "Do not expose secrets. Ask before destructive commands, deployment, or production changes."),
|
|
19
19
|
{
|
|
20
20
|
path: ".cursor/mcp.json",
|
|
@@ -30,6 +30,9 @@ Use Speckit for Agile + TDD work. Cursor-specific rules live in \`.cursor/rules/
|
|
|
30
30
|
|
|
31
31
|
- Follow \`.speckit/rules/agile-policy.md\`.
|
|
32
32
|
- Follow \`.speckit/rules/tdd-policy.md\` for code stories.
|
|
33
|
+
- Read \`.speckit/context/current.md\` before implementation work.
|
|
34
|
+
- Read \`.speckit/context/subagent-handoff.md\` before implementation work.
|
|
35
|
+
- Run \`speckit ready <story>\` before code changes.
|
|
33
36
|
- Never run bare \`bv\`; use robot commands only.
|
|
34
37
|
`),
|
|
35
38
|
},
|
|
@@ -53,6 +53,7 @@ permission: ${JSON.stringify(permission)}
|
|
|
53
53
|
# speckit-${name}
|
|
54
54
|
|
|
55
55
|
Follow \`.speckit/rules/agile-policy.md\`, \`.speckit/rules/tdd-policy.md\`, and \`.speckit/rules/enterprise-safety.md\`.
|
|
56
|
+
Read \`.speckit/context/current.md\` and \`.speckit/context/subagent-handoff.md\` before implementation work, require \`speckit ready <story>\`, confirm acceptance criteria, preserve session handoff, record red-green-refactor evidence, and use only robot-safe graph commands.
|
|
56
57
|
`),
|
|
57
58
|
};
|
|
58
59
|
}
|
package/dist/cli.js
CHANGED
|
@@ -9,6 +9,7 @@ import { triageCommand } from "./commands/triage.js";
|
|
|
9
9
|
import { nextCommand } from "./commands/next.js";
|
|
10
10
|
import { syncCommand } from "./commands/sync.js";
|
|
11
11
|
import { runCommand } from "./commands/run.js";
|
|
12
|
+
import { readyCommand } from "./commands/ready.js";
|
|
12
13
|
import { reviewCommand } from "./commands/review.js";
|
|
13
14
|
import { closeCommand } from "./commands/close.js";
|
|
14
15
|
export async function main(argv = process.argv.slice(2), root = process.cwd()) {
|
|
@@ -40,6 +41,8 @@ export async function main(argv = process.argv.slice(2), root = process.cwd()) {
|
|
|
40
41
|
return nextCommand();
|
|
41
42
|
case "sync":
|
|
42
43
|
return syncCommand({ root });
|
|
44
|
+
case "ready":
|
|
45
|
+
return readyCommand({ root, target: requiredIntent(parsed), json: has(parsed, "json") });
|
|
43
46
|
case "run":
|
|
44
47
|
return runCommand({ root, target: requiredIntent(parsed) });
|
|
45
48
|
case "review":
|
|
@@ -111,6 +114,7 @@ Usage:
|
|
|
111
114
|
speckit triage [--json]
|
|
112
115
|
speckit next
|
|
113
116
|
speckit sync
|
|
117
|
+
speckit ready <story-path-or-id> [--json]
|
|
114
118
|
speckit run <story-path-or-id>
|
|
115
119
|
speckit review
|
|
116
120
|
speckit close <story-path-or-id>
|
package/dist/commands/context.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { markdown, writeManagedFiles } from "../core/managed-files.js";
|
|
2
|
-
import { resolveStory } from "../core/story.js";
|
|
2
|
+
import { extractEvidenceReference, extractSection, resolveStory } from "../core/story.js";
|
|
3
3
|
export async function contextCommand(options) {
|
|
4
4
|
const stdout = options.stdout ?? console;
|
|
5
5
|
const story = await resolveStory(options.root, options.target);
|
|
@@ -8,10 +8,19 @@ export async function contextCommand(options) {
|
|
|
8
8
|
return 1;
|
|
9
9
|
}
|
|
10
10
|
const contextPath = ".speckit/context/current.md";
|
|
11
|
+
const handoffPath = ".speckit/context/subagent-handoff.md";
|
|
12
|
+
const acceptanceCriteria = extractSection(story.content, "Acceptance Criteria") ?? "- Not defined";
|
|
13
|
+
const evidenceReference = story.evidencePath ?? extractEvidenceReference(story.content);
|
|
11
14
|
await writeManagedFiles(options.root, [
|
|
12
15
|
{
|
|
13
16
|
path: contextPath,
|
|
14
|
-
content: markdown(
|
|
17
|
+
content: markdown(`---
|
|
18
|
+
status: fresh
|
|
19
|
+
story: ${story.path}
|
|
20
|
+
evidence: ${evidenceReference ?? "missing"}
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
# Current Spec Context
|
|
15
24
|
|
|
16
25
|
## Story
|
|
17
26
|
${story.title}
|
|
@@ -19,35 +28,60 @@ ${story.title}
|
|
|
19
28
|
## Story Path
|
|
20
29
|
\`${story.path}\`
|
|
21
30
|
|
|
31
|
+
## Story Status
|
|
32
|
+
${story.status ?? "missing"}
|
|
33
|
+
|
|
22
34
|
## Acceptance Criteria
|
|
23
|
-
${
|
|
35
|
+
${acceptanceCriteria}
|
|
24
36
|
|
|
25
37
|
## TDD Evidence
|
|
26
|
-
${
|
|
38
|
+
${evidenceReference ? `\`${evidenceReference}\`` : "- Create or update matching `.speckit/evidence/*tdd-evidence.md`"}
|
|
39
|
+
|
|
40
|
+
## Spec Anti-Mistake Checklist
|
|
41
|
+
- Reuse existing project patterns before adding new files.
|
|
42
|
+
- Verify file locations before editing.
|
|
43
|
+
- Do not introduce new libraries without explicit need.
|
|
44
|
+
- Preserve existing behavior unless an acceptance criterion requires change.
|
|
45
|
+
- Check prior related stories or changelog before repeating work.
|
|
27
46
|
|
|
28
47
|
## Next Command
|
|
48
|
+
\`speckit ready ${story.id}\`
|
|
29
49
|
\`speckit run ${story.id}\`
|
|
50
|
+
`),
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
path: handoffPath,
|
|
54
|
+
content: markdown(`# Spec Subagent Handoff
|
|
55
|
+
|
|
56
|
+
## Task
|
|
57
|
+
Implement the story in \`${story.path}\`.
|
|
58
|
+
|
|
59
|
+
## Files To Read
|
|
60
|
+
- \`.speckit/context/current.md\`
|
|
61
|
+
- \`${story.path}\`
|
|
62
|
+
${evidenceReference ? `- \`${evidenceReference}\`` : "- Matching TDD evidence file"}
|
|
63
|
+
- \`.speckit/tool-policy.yaml\`
|
|
64
|
+
|
|
65
|
+
## Acceptance Criteria
|
|
66
|
+
${acceptanceCriteria}
|
|
67
|
+
|
|
68
|
+
## Constraints
|
|
69
|
+
- Confirm story status is \`ready-for-dev\` before code changes.
|
|
70
|
+
- Record red-green-refactor evidence.
|
|
71
|
+
- Use only robot-safe graph commands.
|
|
72
|
+
- Stop before destructive commands, production changes, or secret access.
|
|
73
|
+
|
|
74
|
+
## Completion Signal
|
|
75
|
+
- All acceptance criteria satisfied.
|
|
76
|
+
- TDD evidence updated.
|
|
77
|
+
- \`speckit review\` run before handoff.
|
|
78
|
+
|
|
79
|
+
## Work Context
|
|
80
|
+
${options.root}
|
|
30
81
|
`),
|
|
31
82
|
},
|
|
32
83
|
], true);
|
|
33
84
|
stdout.log(contextPath);
|
|
85
|
+
stdout.log(handoffPath);
|
|
34
86
|
return 0;
|
|
35
87
|
}
|
|
36
|
-
function extractEvidenceReference(content) {
|
|
37
|
-
const match = content.match(/`([^`]*tdd-evidence\.md)`/i);
|
|
38
|
-
return match ? `\`${match[1]}\`` : undefined;
|
|
39
|
-
}
|
|
40
|
-
function extractSection(content, heading) {
|
|
41
|
-
const lines = content.split("\n");
|
|
42
|
-
const start = lines.findIndex((line) => line.trim().toLowerCase() === `## ${heading}`.toLowerCase());
|
|
43
|
-
if (start === -1)
|
|
44
|
-
return undefined;
|
|
45
|
-
const collected = [];
|
|
46
|
-
for (const line of lines.slice(start + 1)) {
|
|
47
|
-
if (line.startsWith("## "))
|
|
48
|
-
break;
|
|
49
|
-
if (line.trim())
|
|
50
|
-
collected.push(line);
|
|
51
|
-
}
|
|
52
|
-
return collected.length > 0 ? collected.join("\n") : undefined;
|
|
53
|
-
}
|
package/dist/commands/plan.js
CHANGED
|
@@ -36,7 +36,13 @@ export async function planCommand(options) {
|
|
|
36
36
|
},
|
|
37
37
|
{
|
|
38
38
|
path: `${dir}/story.md`,
|
|
39
|
-
content: markdown(
|
|
39
|
+
content: markdown(`---
|
|
40
|
+
status: draft
|
|
41
|
+
evidence: ${dir}/tdd-evidence.md
|
|
42
|
+
context: pending
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
# Story: ${options.intent}
|
|
40
46
|
|
|
41
47
|
## Acceptance Criteria
|
|
42
48
|
- Given ...
|
|
@@ -47,11 +53,22 @@ export async function planCommand(options) {
|
|
|
47
53
|
\`${dir}/tdd-evidence.md\`
|
|
48
54
|
|
|
49
55
|
## Implementation Notes
|
|
56
|
+
|
|
57
|
+
## Spec Anti-Mistake Checklist
|
|
58
|
+
- Reuse existing project patterns before adding new files.
|
|
59
|
+
- Verify file locations before editing.
|
|
60
|
+
- Do not introduce new libraries without explicit need.
|
|
61
|
+
- Preserve existing behavior unless an acceptance criterion requires change.
|
|
50
62
|
`),
|
|
51
63
|
},
|
|
52
64
|
{
|
|
53
65
|
path: `${dir}/tdd-evidence.md`,
|
|
54
|
-
content: markdown(
|
|
66
|
+
content: markdown(`---
|
|
67
|
+
status: missing
|
|
68
|
+
story: ${dir}/story.md
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
# TDD Evidence: ${options.intent}
|
|
55
72
|
|
|
56
73
|
## Red
|
|
57
74
|
|
package/dist/commands/quick.js
CHANGED
|
@@ -11,7 +11,13 @@ export async function quickCommand(options) {
|
|
|
11
11
|
await writeManagedFiles(options.root, [
|
|
12
12
|
{
|
|
13
13
|
path: storyPath,
|
|
14
|
-
content: markdown(
|
|
14
|
+
content: markdown(`---
|
|
15
|
+
status: ready-for-dev
|
|
16
|
+
evidence: ${evidencePath}
|
|
17
|
+
context: pending
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
# Story: ${options.intent}
|
|
15
21
|
|
|
16
22
|
## Intent
|
|
17
23
|
${options.intent}
|
|
@@ -29,11 +35,23 @@ ${options.intent}
|
|
|
29
35
|
|
|
30
36
|
## Suggested Test Command
|
|
31
37
|
\`${testCommand}\`
|
|
38
|
+
|
|
39
|
+
## Spec Anti-Mistake Checklist
|
|
40
|
+
- Reuse existing project patterns before adding new files.
|
|
41
|
+
- Verify file locations before editing.
|
|
42
|
+
- Do not introduce new libraries without explicit need.
|
|
43
|
+
- Preserve existing behavior unless an acceptance criterion requires change.
|
|
44
|
+
- Update docs only when behavior or workflow changes.
|
|
32
45
|
`),
|
|
33
46
|
},
|
|
34
47
|
{
|
|
35
48
|
path: evidencePath,
|
|
36
|
-
content: markdown(
|
|
49
|
+
content: markdown(`---
|
|
50
|
+
status: missing
|
|
51
|
+
story: ${storyPath}
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
# TDD Evidence: ${options.intent}
|
|
37
55
|
|
|
38
56
|
## Test Intent
|
|
39
57
|
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { evaluateReadiness } from "../core/readiness.js";
|
|
2
|
+
export async function readyCommand(options) {
|
|
3
|
+
const stdout = options.stdout ?? console;
|
|
4
|
+
const report = await evaluateReadiness(options.root, options.target);
|
|
5
|
+
if (options.json) {
|
|
6
|
+
stdout.log(JSON.stringify(report, null, 2));
|
|
7
|
+
return report.status === "ready" ? 0 : 1;
|
|
8
|
+
}
|
|
9
|
+
stdout.log(`# Speckit Readiness: ${report.status}`);
|
|
10
|
+
if (report.story) {
|
|
11
|
+
stdout.log(`Story: ${report.story.path}`);
|
|
12
|
+
}
|
|
13
|
+
for (const check of report.checks) {
|
|
14
|
+
stdout.log(`- ${check.ok ? "ok" : "blocked"} ${check.name}: ${check.detail}`);
|
|
15
|
+
}
|
|
16
|
+
if (report.status !== "ready") {
|
|
17
|
+
stdout.error("Run the suggested setup commands before `speckit run`.");
|
|
18
|
+
}
|
|
19
|
+
return report.status === "ready" ? 0 : 1;
|
|
20
|
+
}
|
package/dist/commands/run.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { resolveStory } from "../core/story.js";
|
|
2
|
+
import { evaluateReadiness } from "../core/readiness.js";
|
|
2
3
|
export async function runCommand(options) {
|
|
3
4
|
const stdout = options.stdout ?? console;
|
|
4
5
|
const story = await resolveStory(options.root, options.target);
|
|
@@ -6,16 +7,28 @@ export async function runCommand(options) {
|
|
|
6
7
|
stdout.error(`Story not found: ${options.target}`);
|
|
7
8
|
return 1;
|
|
8
9
|
}
|
|
10
|
+
const readiness = await evaluateReadiness(options.root, options.target);
|
|
11
|
+
if (readiness.status !== "ready") {
|
|
12
|
+
stdout.error(`Story is not ready for implementation: ${story.path}`);
|
|
13
|
+
for (const check of readiness.checks.filter((item) => !item.ok)) {
|
|
14
|
+
stdout.error(`- ${check.name}: ${check.detail}`);
|
|
15
|
+
}
|
|
16
|
+
stdout.error(`Run \`speckit ready ${story.id}\` after preparing context and sync.`);
|
|
17
|
+
return 1;
|
|
18
|
+
}
|
|
9
19
|
stdout.log(`# Speckit TDD Run
|
|
10
20
|
|
|
11
21
|
Story: ${story.path}
|
|
12
22
|
|
|
13
|
-
|
|
23
|
+
Status: ready-for-dev
|
|
24
|
+
|
|
25
|
+
1. Read \`.speckit/context/current.md\`, story, acceptance criteria, and subagent handoff.
|
|
14
26
|
2. Identify the smallest executable test that should fail.
|
|
15
|
-
3. Record red evidence in the
|
|
27
|
+
3. Record red evidence in the linked TDD evidence file.
|
|
16
28
|
4. Implement the minimal behavior.
|
|
17
29
|
5. Record green evidence.
|
|
18
30
|
6. Refactor only after tests are green, then record validation.
|
|
31
|
+
7. Continue until all acceptance criteria are satisfied or a stop condition is hit.
|
|
19
32
|
|
|
20
33
|
Recommended handoff:
|
|
21
34
|
\`speckit review\` before commit or PR.
|
package/dist/commands/sync.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { readdir, readFile } from "node:fs/promises";
|
|
2
2
|
import { join } from "node:path";
|
|
3
3
|
import { markdown, writeManagedFiles } from "../core/managed-files.js";
|
|
4
|
-
import { firstHeading } from "../core/story.js";
|
|
4
|
+
import { firstHeading, frontmatterValue } from "../core/story.js";
|
|
5
5
|
export async function syncCommand(options) {
|
|
6
6
|
const stdout = options.stdout ?? console;
|
|
7
7
|
const storiesDir = join(options.root, ".speckit", "stories");
|
|
@@ -20,7 +20,7 @@ export async function syncCommand(options) {
|
|
|
20
20
|
id: entry.replace(/\.md$/, ""),
|
|
21
21
|
path: `.speckit/stories/${entry}`,
|
|
22
22
|
title: firstHeading(content) ?? entry.replace(/\.md$/, ""),
|
|
23
|
-
status: content.includes("- [ ]") ? "open" : "ready-for-review",
|
|
23
|
+
status: frontmatterValue(content, "status") ?? (content.includes("- [ ]") ? "open" : "ready-for-review"),
|
|
24
24
|
});
|
|
25
25
|
}
|
|
26
26
|
const jsonl = stories.map((story) => JSON.stringify(story)).join("\n");
|
package/dist/commands/triage.js
CHANGED
|
@@ -3,7 +3,7 @@ import { join } from "node:path";
|
|
|
3
3
|
export async function triageCommand(options) {
|
|
4
4
|
const stdout = options.stdout ?? console;
|
|
5
5
|
const stories = await readSyncedStories(options.root);
|
|
6
|
-
const open = stories.filter((story) =>
|
|
6
|
+
const open = stories.filter((story) => ["open", "ready-for-dev", "in-progress"].includes(story.status));
|
|
7
7
|
const ready = stories.filter((story) => story.status !== "open");
|
|
8
8
|
const report = {
|
|
9
9
|
source: ".speckit/sync/beads-sync.jsonl",
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { StoryResolution } from "./story.js";
|
|
2
|
+
export type ReadinessCheck = {
|
|
3
|
+
name: string;
|
|
4
|
+
ok: boolean;
|
|
5
|
+
detail: string;
|
|
6
|
+
};
|
|
7
|
+
export type ReadinessReport = {
|
|
8
|
+
story?: Pick<StoryResolution, "id" | "path" | "title" | "status" | "evidencePath">;
|
|
9
|
+
checks: ReadinessCheck[];
|
|
10
|
+
status: "ready" | "blocked";
|
|
11
|
+
};
|
|
12
|
+
export declare function evaluateReadiness(root: string, target: string): Promise<ReadinessReport>;
|
|
13
|
+
export declare function evidenceStatus(root: string, evidencePath: string | undefined): Promise<string | undefined>;
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { access, readFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { extractSection, frontmatterValue, resolveStory } from "./story.js";
|
|
4
|
+
export async function evaluateReadiness(root, target) {
|
|
5
|
+
const story = await resolveStory(root, target);
|
|
6
|
+
if (!story) {
|
|
7
|
+
return {
|
|
8
|
+
checks: [{ name: "story", ok: false, detail: `Story not found: ${target}` }],
|
|
9
|
+
status: "blocked",
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
const evidencePath = story.evidencePath;
|
|
13
|
+
const checks = [
|
|
14
|
+
{
|
|
15
|
+
name: "story-status",
|
|
16
|
+
ok: story.status === "ready-for-dev",
|
|
17
|
+
detail: story.status ? `status=${story.status}` : "status missing",
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
name: "acceptance-criteria",
|
|
21
|
+
ok: hasActionableAcceptanceCriteria(story.content),
|
|
22
|
+
detail: "story has testable acceptance criteria",
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
name: "evidence-link",
|
|
26
|
+
ok: Boolean(evidencePath),
|
|
27
|
+
detail: evidencePath ?? "missing TDD evidence reference",
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
name: "evidence-file",
|
|
31
|
+
ok: evidencePath ? await fileExists(root, evidencePath) : false,
|
|
32
|
+
detail: evidencePath ?? "missing TDD evidence reference",
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
name: "context",
|
|
36
|
+
ok: await contextIsFreshForStory(root, story.path),
|
|
37
|
+
detail: ".speckit/context/current.md links this story and is fresh",
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
name: "graph-sync",
|
|
41
|
+
ok: await graphContainsStory(root, story.path),
|
|
42
|
+
detail: ".speckit/sync/beads-sync.jsonl contains this story",
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
name: "tool-policy",
|
|
46
|
+
ok: await fileExists(root, ".speckit/tool-policy.yaml"),
|
|
47
|
+
detail: ".speckit/tool-policy.yaml",
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
name: "safety-policy",
|
|
51
|
+
ok: await fileExists(root, ".speckit/rules/enterprise-safety.md"),
|
|
52
|
+
detail: ".speckit/rules/enterprise-safety.md",
|
|
53
|
+
},
|
|
54
|
+
];
|
|
55
|
+
return {
|
|
56
|
+
story: {
|
|
57
|
+
id: story.id,
|
|
58
|
+
path: story.path,
|
|
59
|
+
title: story.title,
|
|
60
|
+
status: story.status,
|
|
61
|
+
evidencePath,
|
|
62
|
+
},
|
|
63
|
+
checks,
|
|
64
|
+
status: checks.every((check) => check.ok) ? "ready" : "blocked",
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
function hasActionableAcceptanceCriteria(content) {
|
|
68
|
+
const criteria = extractSection(content, "Acceptance Criteria");
|
|
69
|
+
if (!criteria)
|
|
70
|
+
return false;
|
|
71
|
+
return /Given .+|When .+|Then .+|\d+\./i.test(criteria) && !criteria.includes("...");
|
|
72
|
+
}
|
|
73
|
+
async function contextIsFreshForStory(root, storyPath) {
|
|
74
|
+
try {
|
|
75
|
+
const content = await readFile(join(root, ".speckit", "context", "current.md"), "utf8");
|
|
76
|
+
return content.includes("status: fresh") && content.includes(storyPath);
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
async function graphContainsStory(root, storyPath) {
|
|
83
|
+
try {
|
|
84
|
+
const content = await readFile(join(root, ".speckit", "sync", "beads-sync.jsonl"), "utf8");
|
|
85
|
+
return content
|
|
86
|
+
.split("\n")
|
|
87
|
+
.filter(Boolean)
|
|
88
|
+
.some((line) => {
|
|
89
|
+
try {
|
|
90
|
+
return JSON.parse(line).path === storyPath;
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
async function fileExists(root, path) {
|
|
102
|
+
try {
|
|
103
|
+
await access(join(root, path));
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
export async function evidenceStatus(root, evidencePath) {
|
|
111
|
+
if (!evidencePath)
|
|
112
|
+
return undefined;
|
|
113
|
+
try {
|
|
114
|
+
const content = await readFile(join(root, evidencePath), "utf8");
|
|
115
|
+
return frontmatterValue(content, "status");
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
return undefined;
|
|
119
|
+
}
|
|
120
|
+
}
|
package/dist/core/scaffold.js
CHANGED
|
@@ -27,7 +27,13 @@ adapters:
|
|
|
27
27
|
{ path: ".speckit/workflows/review.md", content: markdown(workflowReview) },
|
|
28
28
|
{
|
|
29
29
|
path: ".speckit/templates/story.md",
|
|
30
|
-
content: markdown(
|
|
30
|
+
content: markdown(`---
|
|
31
|
+
status: draft
|
|
32
|
+
evidence: .speckit/evidence/{{slug}}-tdd-evidence.md
|
|
33
|
+
context: pending
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
# Story: {{title}}
|
|
31
37
|
|
|
32
38
|
## Intent
|
|
33
39
|
{{intent}}
|
|
@@ -46,11 +52,23 @@ adapters:
|
|
|
46
52
|
## Notes
|
|
47
53
|
- Risks:
|
|
48
54
|
- Dependencies:
|
|
55
|
+
|
|
56
|
+
## Spec Anti-Mistake Checklist
|
|
57
|
+
- Reuse existing project patterns before adding new files.
|
|
58
|
+
- Verify file locations before editing.
|
|
59
|
+
- Do not introduce new libraries without explicit need.
|
|
60
|
+
- Preserve existing behavior unless an acceptance criterion requires change.
|
|
61
|
+
- Capture previous-story learnings if this continues prior work.
|
|
49
62
|
`),
|
|
50
63
|
},
|
|
51
64
|
{
|
|
52
65
|
path: ".speckit/templates/tdd-evidence.md",
|
|
53
|
-
content: markdown(
|
|
66
|
+
content: markdown(`---
|
|
67
|
+
status: missing
|
|
68
|
+
story: {{story}}
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
# TDD Evidence: {{story}}
|
|
54
72
|
|
|
55
73
|
## Test Intent
|
|
56
74
|
|
|
@@ -105,12 +123,53 @@ graph:
|
|
|
105
123
|
path: ".speckit/prompts/spec-run.md",
|
|
106
124
|
content: markdown(`# Spec Run Prompt
|
|
107
125
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
126
|
+
## Required Inputs
|
|
127
|
+
|
|
128
|
+
- Current context: \`.speckit/context/current.md\`
|
|
129
|
+
- Subagent handoff: \`.speckit/context/subagent-handoff.md\`
|
|
130
|
+
- Story with acceptance criteria
|
|
131
|
+
- Matching TDD evidence file
|
|
132
|
+
- Tool policy: \`.speckit/tool-policy.yaml\`
|
|
133
|
+
|
|
134
|
+
## Status Preconditions
|
|
135
|
+
|
|
136
|
+
- Story status is \`ready-for-dev\`.
|
|
137
|
+
- Context status is \`fresh\`.
|
|
138
|
+
- \`speckit ready <story>\` returns ready.
|
|
139
|
+
|
|
140
|
+
## Allowed Edits
|
|
141
|
+
|
|
142
|
+
- Implementation files needed for the story.
|
|
143
|
+
- Matching tests.
|
|
144
|
+
- Linked TDD evidence file.
|
|
145
|
+
- Story completion checkboxes and implementation notes.
|
|
146
|
+
|
|
147
|
+
## Execution Contract
|
|
148
|
+
|
|
149
|
+
Use the red-green-refactor loop.
|
|
150
|
+
|
|
151
|
+
1. Read the current context before touching code.
|
|
152
|
+
2. Confirm the story path, acceptance criteria, and evidence path.
|
|
153
|
+
3. Write or run the smallest failing test first.
|
|
154
|
+
4. Record red evidence before implementation.
|
|
155
|
+
5. Implement the smallest change that satisfies the failing test.
|
|
156
|
+
6. Record green evidence after tests pass.
|
|
157
|
+
7. Refactor only while tests stay green, then record validation.
|
|
158
|
+
8. Use graph commands only through robot-safe flags such as \`bv --robot-next --format json\`.
|
|
159
|
+
9. Run \`speckit review\` before handoff.
|
|
160
|
+
|
|
161
|
+
## Stop Conditions
|
|
162
|
+
|
|
163
|
+
- Stop if acceptance criteria are missing.
|
|
164
|
+
- Stop if the evidence file cannot be identified.
|
|
165
|
+
- Stop if \`speckit ready <story>\` reports blocked.
|
|
166
|
+
- Stop before destructive commands, production changes, or secret access.
|
|
167
|
+
|
|
168
|
+
## Completion Signal
|
|
169
|
+
|
|
170
|
+
- All acceptance criteria satisfied.
|
|
171
|
+
- TDD evidence status can be advanced through red, green, and refactor.
|
|
172
|
+
- Review handoff is ready.
|
|
114
173
|
`),
|
|
115
174
|
},
|
|
116
175
|
];
|
package/dist/core/story.d.ts
CHANGED
|
@@ -3,6 +3,11 @@ export type StoryResolution = {
|
|
|
3
3
|
content: string;
|
|
4
4
|
id: string;
|
|
5
5
|
title: string;
|
|
6
|
+
status?: string;
|
|
7
|
+
evidencePath?: string;
|
|
6
8
|
};
|
|
7
9
|
export declare function resolveStory(root: string, target: string): Promise<StoryResolution | undefined>;
|
|
10
|
+
export declare function frontmatterValue(content: string, key: string): string | undefined;
|
|
11
|
+
export declare function extractEvidenceReference(content: string): string | undefined;
|
|
12
|
+
export declare function extractSection(content: string, heading: string): string | undefined;
|
|
8
13
|
export declare function firstHeading(content: string): string | undefined;
|
package/dist/core/story.js
CHANGED
|
@@ -16,6 +16,8 @@ export async function resolveStory(root, target) {
|
|
|
16
16
|
content,
|
|
17
17
|
id: basename(candidate).replace(/\.md$/, ""),
|
|
18
18
|
title: firstHeading(content) ?? basename(candidate).replace(/\.md$/, ""),
|
|
19
|
+
status: frontmatterValue(content, "status"),
|
|
20
|
+
evidencePath: frontmatterValue(content, "evidence") ?? extractEvidenceReference(content),
|
|
19
21
|
};
|
|
20
22
|
}
|
|
21
23
|
catch {
|
|
@@ -24,6 +26,38 @@ export async function resolveStory(root, target) {
|
|
|
24
26
|
}
|
|
25
27
|
return undefined;
|
|
26
28
|
}
|
|
29
|
+
export function frontmatterValue(content, key) {
|
|
30
|
+
const lines = content.split("\n");
|
|
31
|
+
const start = lines.findIndex((line) => line.trim() === "---");
|
|
32
|
+
if (start === -1)
|
|
33
|
+
return undefined;
|
|
34
|
+
const end = lines.findIndex((line, index) => index > start && line.trim() === "---");
|
|
35
|
+
if (end === -1)
|
|
36
|
+
return undefined;
|
|
37
|
+
const prefix = `${key}:`;
|
|
38
|
+
const found = lines
|
|
39
|
+
.slice(start + 1, end)
|
|
40
|
+
.find((line) => line.trim().toLowerCase().startsWith(prefix.toLowerCase()));
|
|
41
|
+
return found?.slice(found.indexOf(":") + 1).trim().replace(/^["']|["']$/g, "");
|
|
42
|
+
}
|
|
43
|
+
export function extractEvidenceReference(content) {
|
|
44
|
+
const match = content.match(/`([^`]*tdd-evidence\.md)`/i);
|
|
45
|
+
return match?.[1];
|
|
46
|
+
}
|
|
47
|
+
export function extractSection(content, heading) {
|
|
48
|
+
const lines = content.split("\n");
|
|
49
|
+
const start = lines.findIndex((line) => line.trim().toLowerCase() === `## ${heading}`.toLowerCase());
|
|
50
|
+
if (start === -1)
|
|
51
|
+
return undefined;
|
|
52
|
+
const collected = [];
|
|
53
|
+
for (const line of lines.slice(start + 1)) {
|
|
54
|
+
if (line.startsWith("## "))
|
|
55
|
+
break;
|
|
56
|
+
if (line.trim())
|
|
57
|
+
collected.push(line);
|
|
58
|
+
}
|
|
59
|
+
return collected.length > 0 ? collected.join("\n") : undefined;
|
|
60
|
+
}
|
|
27
61
|
export function firstHeading(content) {
|
|
28
62
|
return content
|
|
29
63
|
.split("\n")
|
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
|
|
5
5
|
Speckit MVP is implemented and pushed to `git@github.com:trieungoctam/speckit.git` on `main`.
|
|
6
6
|
|
|
7
|
-
Current package target: `@trieungoctam/speckit@0.
|
|
7
|
+
Current package target: `@trieungoctam/speckit@0.2.2`.
|
|
8
8
|
|
|
9
|
-
The CLI is npx-ready, generates Agile + TDD rules, creates workflow artifacts, supports five IDE adapters, wraps Beads Viewer safely, includes an enterprise harness, and has automated tests plus CI.
|
|
9
|
+
The CLI is npx-ready, generates Agile + TDD rules, creates workflow artifacts, supports five IDE adapters, wraps Beads Viewer safely, includes an enterprise harness, and has automated prompt/readiness tests plus CI.
|
|
10
10
|
|
|
11
11
|
## Milestones
|
|
12
12
|
|
|
@@ -14,7 +14,7 @@ The CLI is npx-ready, generates Agile + TDD rules, creates workflow artifacts, s
|
|
|
14
14
|
| --- | --- | --- |
|
|
15
15
|
| Product contract | Complete | Contract, workflow model, and command surface documented. |
|
|
16
16
|
| CLI scaffold | Complete | `bin/speckit`, TypeScript build, command router, managed file writer. |
|
|
17
|
-
| Workflow engine | Complete | `start`, `shape`, `plan`, `context`, `quick`, `sync`, `triage`, `run`, `review`, and `close` generate linked artifacts. |
|
|
17
|
+
| Workflow engine | Complete | `start`, `shape`, `plan`, `context`, `quick`, `sync`, `triage`, `ready`, `run`, `review`, and `close` generate linked artifacts. |
|
|
18
18
|
| IDE adapters | Complete | Claude Code, Codex, Antigravity, OpenCode, Cursor. |
|
|
19
19
|
| Beads integration | MVP Complete | `next` wraps BV robot mode; `sync` exports story metadata JSONL. |
|
|
20
20
|
| Enterprise harness | MVP Complete | `init --enterprise` creates flow, tool-policy, and prompt harness files; `doctor --deep` verifies them. |
|
|
@@ -24,8 +24,8 @@ The CLI is npx-ready, generates Agile + TDD rules, creates workflow artifacts, s
|
|
|
24
24
|
|
|
25
25
|
## Next Roadmap
|
|
26
26
|
|
|
27
|
-
- Release Speckit-only vocabulary cleanup as `0.1.1` or fold it into `0.2.0`.
|
|
28
27
|
- Expand Speckit Enterprise Harness with richer profile and context-pack layers.
|
|
28
|
+
- Add `review --deep` with blind, edge-case, and acceptance audit prompts.
|
|
29
29
|
- Add graph commands: `graph-plan`, `insights`, and `drift`.
|
|
30
30
|
- Add GitHub trusted publishing for npm releases.
|
|
31
31
|
- Add snapshot tests for full adapter file contents.
|
package/docs/product-contract.md
CHANGED
|
@@ -5,7 +5,7 @@ Speckit owns the workflow contract for enterprise Agile + TDD development with a
|
|
|
5
5
|
## Speckit Owns
|
|
6
6
|
|
|
7
7
|
- The `.speckit/` source of truth: config, rules, workflows, templates, generated artifacts.
|
|
8
|
-
- The command surface: `init`, `doctor`, `start`, `shape`, `plan`, `context`, `quick`, `sync`, `triage`, `next`, `run`, `review`, `close`.
|
|
8
|
+
- The command surface: `init`, `doctor`, `start`, `shape`, `plan`, `context`, `quick`, `sync`, `triage`, `next`, `ready`, `run`, `review`, `close`.
|
|
9
9
|
- The TDD gate: code stories require red, green, and refactor evidence.
|
|
10
10
|
- The adapter compiler for Claude Code, Codex, Antigravity, OpenCode, and Cursor.
|
|
11
11
|
- The safety policy for destructive commands, secrets, production access, and review readiness.
|
|
@@ -21,7 +21,7 @@ Speckit owns the workflow contract for enterprise Agile + TDD development with a
|
|
|
21
21
|
## State Model
|
|
22
22
|
|
|
23
23
|
```text
|
|
24
|
-
intake -> session -> shaped -> planned -> context-ready -> synced -> triaged -> tests-red -> running -> tests-green -> refactor -> review-ready -> closed
|
|
24
|
+
intake -> session -> shaped -> planned -> context-ready -> synced -> triaged -> ready-for-dev -> tests-red -> running -> tests-green -> refactor -> review-ready -> closed
|
|
25
25
|
```
|
|
26
26
|
|
|
27
|
-
Implementation starts only after
|
|
27
|
+
Implementation starts only after `speckit ready <story>` passes. Review starts only after test evidence exists.
|
|
@@ -1,5 +1,37 @@
|
|
|
1
1
|
# Project Changelog
|
|
2
2
|
|
|
3
|
+
## 0.2.2 - 2026-05-10
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
|
|
7
|
+
- Added `speckit ready <story>` readiness gate.
|
|
8
|
+
- Added status frontmatter to generated stories, evidence files, and current context.
|
|
9
|
+
- Added `.speckit/context/subagent-handoff.md` generation from story context.
|
|
10
|
+
- Added anti-mistake checklist sections to story and context artifacts.
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
|
|
14
|
+
- `speckit run <story>` now refuses blocked stories until readiness checks pass.
|
|
15
|
+
- Prompt contracts now require readiness status, fresh context, and subagent handoff.
|
|
16
|
+
|
|
17
|
+
### Quality
|
|
18
|
+
|
|
19
|
+
- Added readiness and blocked-run tests.
|
|
20
|
+
- Expanded prompt quality tests for readiness and subagent handoff.
|
|
21
|
+
- `npm test` passes with 26 tests.
|
|
22
|
+
|
|
23
|
+
## 0.2.1 - 2026-05-10
|
|
24
|
+
|
|
25
|
+
### Changed
|
|
26
|
+
|
|
27
|
+
- Strengthened generated prompts across Claude Code, Codex, Antigravity, OpenCode, Cursor, and the enterprise run prompt.
|
|
28
|
+
- Made prompt contracts explicitly require current context, acceptance criteria, session handoff, red-green-refactor evidence, and robot-safe graph commands.
|
|
29
|
+
|
|
30
|
+
### Quality
|
|
31
|
+
|
|
32
|
+
- Added prompt quality tests covering enterprise prompts, IDE adapter prompts, and tracked generated prompt files.
|
|
33
|
+
- `npm test` passes with 24 tests.
|
|
34
|
+
|
|
3
35
|
## 0.2.0 - 2026-05-10
|
|
4
36
|
|
|
5
37
|
### Added
|
|
@@ -16,6 +48,10 @@
|
|
|
16
48
|
- `npm pack --dry-run` passes.
|
|
17
49
|
- Full enterprise temp flow passes: `init --enterprise -> start -> quick -> context -> sync -> triage -> close -> doctor --deep`.
|
|
18
50
|
|
|
51
|
+
### Published
|
|
52
|
+
|
|
53
|
+
- Published `@trieungoctam/speckit@0.2.0` to npm with `latest` dist-tag.
|
|
54
|
+
|
|
19
55
|
## 2026-05-10
|
|
20
56
|
|
|
21
57
|
### Changed
|
|
@@ -16,5 +16,5 @@ Before publishing Speckit:
|
|
|
16
16
|
- [x] README quickstart is accurate.
|
|
17
17
|
- [x] No secrets, local credentials, or generated private data are included.
|
|
18
18
|
- [x] Initial code pushed to `git@github.com:trieungoctam/speckit.git`.
|
|
19
|
-
- [
|
|
19
|
+
- [x] npm package published.
|
|
20
20
|
- [ ] GitHub trusted publishing configured for npm releases.
|