@trieungoctam/speckit 0.3.3 → 0.3.5
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/tool-checks.d.ts +2 -0
- package/dist/adapters/tool-checks.js +37 -10
- package/dist/cli.js +12 -1
- package/dist/commands/doctor.js +6 -0
- package/dist/commands/graph.js +29 -3
- package/dist/commands/next.js +2 -2
- package/dist/commands/setup.d.ts +9 -0
- package/dist/commands/setup.js +128 -0
- package/docs/adapters.md +21 -0
- package/docs/beads-viewer-setup.md +58 -0
- package/docs/development-roadmap.md +3 -3
- package/docs/project-changelog.md +25 -0
- package/docs/use-cases.md +12 -0
- package/docs/workflow-model.md +2 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -11,6 +11,7 @@ The curated skill set is intentionally small: `spec-shape`, `spec-research`, `sp
|
|
|
11
11
|
## Quickstart
|
|
12
12
|
|
|
13
13
|
```bash
|
|
14
|
+
npx @trieungoctam/speckit@latest setup
|
|
14
15
|
npx @trieungoctam/speckit@latest init --ide cursor
|
|
15
16
|
npx @trieungoctam/speckit@latest init --ide all
|
|
16
17
|
npx @trieungoctam/speckit@latest init --enterprise --ide all
|
|
@@ -19,6 +20,7 @@ npx @trieungoctam/speckit@latest session start "Add checkout validation"
|
|
|
19
20
|
npx @trieungoctam/speckit@latest quick "Add checkout validation"
|
|
20
21
|
npx @trieungoctam/speckit@latest context .speckit/stories/<story>.md
|
|
21
22
|
npx @trieungoctam/speckit@latest sync
|
|
23
|
+
npx @trieungoctam/speckit@latest graph setup
|
|
22
24
|
npx @trieungoctam/speckit@latest sprint plan
|
|
23
25
|
npx @trieungoctam/speckit@latest graph triage --json
|
|
24
26
|
npx @trieungoctam/speckit@latest validate --json
|
|
@@ -66,6 +68,7 @@ For implementation stories, red-green-refactor evidence is mandatory. A story is
|
|
|
66
68
|
|
|
67
69
|
| Command | Purpose |
|
|
68
70
|
| --- | --- |
|
|
71
|
+
| `speckit setup` | Open an interactive setup wizard for mode, IDE adapter, overwrite policy, and Beads Viewer setup. |
|
|
69
72
|
| `speckit init` | Create `.speckit/` core runtime, super-agent, skill catalog, and all IDE adapters. |
|
|
70
73
|
| `speckit init --enterprise` | Add flow, tool policy, and prompt harness files on top of the shared runtime. |
|
|
71
74
|
| `speckit init --ide <name>` | Generate shared Speckit runtime plus one adapter: `claude-code`, `codex`, `antigravity`, `opencode`, or `cursor`. |
|
|
@@ -88,6 +91,7 @@ For implementation stories, red-green-refactor evidence is mandatory. A story is
|
|
|
88
91
|
| `speckit next` | Safely wraps `bv --robot-next --format json`. |
|
|
89
92
|
| `speckit sprint plan` | Build a sprint plan and status file from synced stories. |
|
|
90
93
|
| `speckit sprint next` | Pick the next selectable story from sprint state. |
|
|
94
|
+
| `speckit graph setup` | Print Beads Viewer install commands, check `br`/`bd`/`bv`, and prepare `.beads/beads.jsonl`. |
|
|
91
95
|
| `speckit graph triage` | Run Beads Viewer robot triage, or local JSON fallback if `bv` is missing. |
|
|
92
96
|
| `speckit graph plan` | Run Beads Viewer robot plan, or local JSON fallback if `bv` is missing. |
|
|
93
97
|
| `speckit graph insights` | Run Beads Viewer robot insights, or local JSON fallback if `bv` is missing. |
|
|
@@ -112,6 +116,7 @@ See `docs/adapters.md` for exact output paths.
|
|
|
112
116
|
## Guides
|
|
113
117
|
|
|
114
118
|
- `docs/use-cases.md` covers setup, migration, quick changes, full planning, long sessions, TDD, graph automation, review, CI, and troubleshooting.
|
|
119
|
+
- `docs/beads-viewer-setup.md` covers Beads Viewer installation, `bv` verification, and robot-safe graph usage.
|
|
115
120
|
- `docs/workflow-model.md` describes the quick and full workflow lanes.
|
|
116
121
|
- `docs/prompt-architecture.md` describes the prompt contract used by the super-agent, skills, workflows, run prompt, and IDE adapters.
|
|
117
122
|
- `docs/spec-quality-gates.md` describes validation gates for release readiness.
|
|
@@ -3,6 +3,8 @@ export type ToolCheck = {
|
|
|
3
3
|
required: boolean;
|
|
4
4
|
available: boolean;
|
|
5
5
|
hint: string;
|
|
6
|
+
install?: string[];
|
|
6
7
|
};
|
|
7
8
|
export declare function checkTools(): ToolCheck[];
|
|
9
|
+
export declare function beadsViewerInstallGuide(): string;
|
|
8
10
|
export declare function commandExists(command: string): boolean;
|
|
@@ -1,23 +1,50 @@
|
|
|
1
1
|
import { spawnSync } from "node:child_process";
|
|
2
2
|
const tools = [
|
|
3
|
-
["git", true, "Install Git and run Speckit inside a repository."],
|
|
4
|
-
["node", true, "Install Node.js 20 or newer."],
|
|
5
|
-
["br", false, "Recommended beads CLI. Use bd only for older projects."],
|
|
6
|
-
["bd", false, "Legacy beads CLI fallback."],
|
|
7
|
-
[
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
3
|
+
["git", true, "Install Git and run Speckit inside a repository.", ["https://git-scm.com/downloads"]],
|
|
4
|
+
["node", true, "Install Node.js 20 or newer.", ["https://nodejs.org/"]],
|
|
5
|
+
["br", false, "Recommended beads CLI. Use bd only for older projects.", ["Install beads_rust/br from your team's preferred channel."]],
|
|
6
|
+
["bd", false, "Legacy beads CLI fallback.", ["brew install beads", "go install github.com/steveyegge/beads/cmd/bd@latest"]],
|
|
7
|
+
[
|
|
8
|
+
"bv",
|
|
9
|
+
false,
|
|
10
|
+
"Recommended for Beads Viewer robot commands.",
|
|
11
|
+
[
|
|
12
|
+
"brew install dicklesworthstone/tap/bv",
|
|
13
|
+
"go install github.com/Dicklesworthstone/beads_viewer/cmd/bv@latest",
|
|
14
|
+
"nix run github:Dicklesworthstone/beads_viewer -- --help",
|
|
15
|
+
],
|
|
16
|
+
],
|
|
17
|
+
["claude", false, "Claude Code adapter runtime.", ["https://docs.anthropic.com/en/docs/claude-code"]],
|
|
18
|
+
["codex", false, "Codex adapter runtime.", ["https://developers.openai.com/codex"]],
|
|
19
|
+
["opencode", false, "OpenCode adapter runtime.", ["https://opencode.ai/"]],
|
|
20
|
+
["cursor", false, "Cursor adapter runtime.", ["https://cursor.com/"]],
|
|
12
21
|
];
|
|
13
22
|
export function checkTools() {
|
|
14
|
-
return tools.map(([name, required, hint]) => ({
|
|
23
|
+
return tools.map(([name, required, hint, install]) => ({
|
|
15
24
|
name,
|
|
16
25
|
required,
|
|
17
26
|
available: commandExists(name),
|
|
18
27
|
hint,
|
|
28
|
+
install: [...install],
|
|
19
29
|
}));
|
|
20
30
|
}
|
|
31
|
+
export function beadsViewerInstallGuide() {
|
|
32
|
+
return `Beads Viewer setup
|
|
33
|
+
|
|
34
|
+
Install bv with one of:
|
|
35
|
+
brew install dicklesworthstone/tap/bv
|
|
36
|
+
go install github.com/Dicklesworthstone/beads_viewer/cmd/bv@latest
|
|
37
|
+
nix run github:Dicklesworthstone/beads_viewer -- --help
|
|
38
|
+
|
|
39
|
+
Verify:
|
|
40
|
+
bv --version
|
|
41
|
+
speckit sync
|
|
42
|
+
speckit graph triage --json
|
|
43
|
+
|
|
44
|
+
Rules:
|
|
45
|
+
Never run bare bv from agents. Use Speckit wrappers or bv --robot-* flags.
|
|
46
|
+
Speckit writes .beads/beads.jsonl from .speckit stories before graph commands.`;
|
|
47
|
+
}
|
|
21
48
|
export function commandExists(command) {
|
|
22
49
|
const result = spawnSync(command, ["--version"], {
|
|
23
50
|
encoding: "utf8",
|
package/dist/cli.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { initCommand } from "./commands/init.js";
|
|
2
|
+
import { setupCommand } from "./commands/setup.js";
|
|
2
3
|
import { doctorCommand } from "./commands/doctor.js";
|
|
3
4
|
import { startCommand } from "./commands/start.js";
|
|
4
5
|
import { shapeCommand } from "./commands/shape.js";
|
|
@@ -21,7 +22,13 @@ import { closeCommand } from "./commands/close.js";
|
|
|
21
22
|
export async function main(argv = process.argv.slice(2), root = process.cwd()) {
|
|
22
23
|
const parsed = parseArgs(argv);
|
|
23
24
|
try {
|
|
25
|
+
if (isHelp(parsed)) {
|
|
26
|
+
printHelp();
|
|
27
|
+
return 0;
|
|
28
|
+
}
|
|
24
29
|
switch (parsed.command) {
|
|
30
|
+
case "setup":
|
|
31
|
+
return setupCommand({ root });
|
|
25
32
|
case "init":
|
|
26
33
|
return initCommand({
|
|
27
34
|
root,
|
|
@@ -134,10 +141,14 @@ function value(parsed, name) {
|
|
|
134
141
|
function has(parsed, name) {
|
|
135
142
|
return parsed.flags.has(name);
|
|
136
143
|
}
|
|
144
|
+
function isHelp(parsed) {
|
|
145
|
+
return parsed.command === "help" || parsed.command === "--help" || parsed.command === "-h" || has(parsed, "help");
|
|
146
|
+
}
|
|
137
147
|
function printHelp() {
|
|
138
148
|
console.log(`Speckit - Agile + TDD workflow compiler for agentic IDEs
|
|
139
149
|
|
|
140
150
|
Usage:
|
|
151
|
+
speckit setup
|
|
141
152
|
speckit init [--ide all|claude-code|codex|antigravity|opencode|cursor] [--force]
|
|
142
153
|
speckit init --enterprise [--ide all] [--force]
|
|
143
154
|
speckit doctor [--json] [--deep]
|
|
@@ -150,7 +161,7 @@ Usage:
|
|
|
150
161
|
speckit permissions audit [--path <path>] [--command <command>] [--json]
|
|
151
162
|
speckit session start|checkpoint|compact|resume|status [target] [--note "..."] [--json]
|
|
152
163
|
speckit sprint plan|next [--json]
|
|
153
|
-
speckit graph triage|plan|insights [--json]
|
|
164
|
+
speckit graph setup|triage|plan|insights [--json]
|
|
154
165
|
speckit validate [--json]
|
|
155
166
|
speckit triage [--json]
|
|
156
167
|
speckit next
|
package/dist/commands/doctor.js
CHANGED
|
@@ -32,6 +32,12 @@ export async function doctorCommand(options) {
|
|
|
32
32
|
stdout.log(`Speckit doctor: ${report.status}`);
|
|
33
33
|
stdout.log(`Node: ${report.node}`);
|
|
34
34
|
stdout.log(`Tools: ${tools.map((tool) => `${tool.name}=${tool.available ? "ok" : "missing"}`).join(", ")}`);
|
|
35
|
+
for (const tool of tools.filter((tool) => !tool.available)) {
|
|
36
|
+
stdout.log(`Tool hint ${tool.name}: ${tool.hint}`);
|
|
37
|
+
if (tool.install?.length) {
|
|
38
|
+
stdout.log(`Install ${tool.name}: ${tool.install.join(" OR ")}`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
35
41
|
stdout.log(`Tests: ${tests[0]?.command ?? "not detected"}`);
|
|
36
42
|
for (const check of deepChecks) {
|
|
37
43
|
stdout.log(`Deep ${check.name}: ${check.ok ? "ok" : "missing"}`);
|
package/dist/commands/graph.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { spawnSync } from "node:child_process";
|
|
2
|
-
import { commandExists } from "../adapters/tool-checks.js";
|
|
2
|
+
import { beadsViewerInstallGuide, checkTools, commandExists } from "../adapters/tool-checks.js";
|
|
3
3
|
import { prepareBeadsMirror } from "../core/beads-mirror.js";
|
|
4
4
|
import { readSyncedStories, selectableStories } from "../core/synced-stories.js";
|
|
5
5
|
const robotActions = new Map([
|
|
@@ -9,9 +9,12 @@ const robotActions = new Map([
|
|
|
9
9
|
]);
|
|
10
10
|
export async function graphCommand(options) {
|
|
11
11
|
const stdout = options.stdout ?? console;
|
|
12
|
+
if (options.action === "setup") {
|
|
13
|
+
return graphSetup(options);
|
|
14
|
+
}
|
|
12
15
|
const robotFlag = robotActions.get(options.action);
|
|
13
16
|
if (!robotFlag) {
|
|
14
|
-
stdout.error("Usage: speckit graph triage|plan|insights [--json]");
|
|
17
|
+
stdout.error("Usage: speckit graph setup|triage|plan|insights [--json]");
|
|
15
18
|
return 1;
|
|
16
19
|
}
|
|
17
20
|
if (commandExists("bv")) {
|
|
@@ -32,6 +35,29 @@ export async function graphCommand(options) {
|
|
|
32
35
|
stdout.log(JSON.stringify(fallback, null, 2));
|
|
33
36
|
return 0;
|
|
34
37
|
}
|
|
38
|
+
async function graphSetup(options) {
|
|
39
|
+
const stdout = options.stdout ?? console;
|
|
40
|
+
const tools = checkTools().filter((tool) => ["br", "bd", "bv"].includes(tool.name));
|
|
41
|
+
const mirrorPath = await prepareBeadsMirror(options.root);
|
|
42
|
+
const report = {
|
|
43
|
+
status: tools.find((tool) => tool.name === "bv")?.available ? "ready" : "needs-bv",
|
|
44
|
+
mirror: mirrorPath,
|
|
45
|
+
tools,
|
|
46
|
+
install: beadsViewerInstallGuide(),
|
|
47
|
+
};
|
|
48
|
+
if (options.json) {
|
|
49
|
+
stdout.log(JSON.stringify(report, null, 2));
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
stdout.log(beadsViewerInstallGuide());
|
|
53
|
+
stdout.log("");
|
|
54
|
+
stdout.log(`Mirror: ${mirrorPath}`);
|
|
55
|
+
for (const tool of tools) {
|
|
56
|
+
stdout.log(`${tool.name}: ${tool.available ? "ok" : "missing"} - ${tool.hint}`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return 0;
|
|
60
|
+
}
|
|
35
61
|
async function localGraphFallback(root, action) {
|
|
36
62
|
const stories = await readSyncedStories(root);
|
|
37
63
|
const selectable = selectableStories(stories);
|
|
@@ -46,6 +72,6 @@ async function localGraphFallback(root, action) {
|
|
|
46
72
|
top_pick: selectable[0] ?? null,
|
|
47
73
|
},
|
|
48
74
|
recommendations: selectable.slice(0, 3),
|
|
49
|
-
command: "Install Beads Viewer for graph metrics:
|
|
75
|
+
command: "Install Beads Viewer for graph metrics: brew install dicklesworthstone/tap/bv",
|
|
50
76
|
};
|
|
51
77
|
}
|
package/dist/commands/next.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { spawnSync } from "node:child_process";
|
|
2
|
-
import { commandExists } from "../adapters/tool-checks.js";
|
|
2
|
+
import { beadsViewerInstallGuide, commandExists } from "../adapters/tool-checks.js";
|
|
3
3
|
export async function nextCommand(options = {}) {
|
|
4
4
|
const stdout = options.stdout ?? console;
|
|
5
5
|
if (!commandExists("bv")) {
|
|
6
|
-
stdout.error(
|
|
6
|
+
stdout.error(`bv is not installed.\n\n${beadsViewerInstallGuide()}`);
|
|
7
7
|
return 1;
|
|
8
8
|
}
|
|
9
9
|
const result = spawnSync("bv", ["--robot-next", "--format", "json"], {
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Readable, Writable } from "node:stream";
|
|
2
|
+
export type SetupOptions = {
|
|
3
|
+
root: string;
|
|
4
|
+
answers?: string[];
|
|
5
|
+
stdin?: Readable;
|
|
6
|
+
output?: Writable;
|
|
7
|
+
stdout?: Pick<typeof console, "log" | "error">;
|
|
8
|
+
};
|
|
9
|
+
export declare function setupCommand(options: SetupOptions): Promise<number>;
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { createInterface } from "node:readline/promises";
|
|
2
|
+
import { adapters } from "../config/adapter-registry.js";
|
|
3
|
+
import { graphCommand } from "./graph.js";
|
|
4
|
+
import { initCommand } from "./init.js";
|
|
5
|
+
const modeChoices = [
|
|
6
|
+
{ label: "Enterprise Agile + TDD harness", value: "enterprise" },
|
|
7
|
+
{ label: "Standard Agile + TDD runtime", value: "standard" },
|
|
8
|
+
];
|
|
9
|
+
const ideChoices = [
|
|
10
|
+
{ label: "All supported IDEs", value: "all" },
|
|
11
|
+
...adapters.map((adapter) => ({
|
|
12
|
+
label: adapter.displayName,
|
|
13
|
+
value: adapter.name,
|
|
14
|
+
})),
|
|
15
|
+
];
|
|
16
|
+
export async function setupCommand(options) {
|
|
17
|
+
const stdin = options.stdin ?? process.stdin;
|
|
18
|
+
const output = options.output ?? process.stdout;
|
|
19
|
+
const stdout = options.stdout ?? console;
|
|
20
|
+
if (options.answers) {
|
|
21
|
+
return setupFromAnswers(options, stdout, options.answers);
|
|
22
|
+
}
|
|
23
|
+
if (!stdin.isTTY || !output.isTTY) {
|
|
24
|
+
stdout.error("Interactive setup requires a TTY. Use `speckit init --enterprise --ide all` for non-interactive setup.");
|
|
25
|
+
return 1;
|
|
26
|
+
}
|
|
27
|
+
const rl = createInterface({ input: stdin, output });
|
|
28
|
+
try {
|
|
29
|
+
stdout.log("Speckit setup");
|
|
30
|
+
stdout.log("");
|
|
31
|
+
const mode = await select(rl, stdout, modeChoices, "Choose setup mode", "1");
|
|
32
|
+
const ide = await select(rl, stdout, ideChoices, "Choose IDE adapter", "1");
|
|
33
|
+
const force = await confirm(rl, stdout, "Overwrite unmanaged files if needed?", false);
|
|
34
|
+
const configureGraph = await confirm(rl, stdout, "Run Beads Viewer setup after init?", true);
|
|
35
|
+
stdout.log("");
|
|
36
|
+
stdout.log(`Selected: ${mode}, ide=${ide}, force=${force ? "yes" : "no"}, graph=${configureGraph ? "yes" : "no"}`);
|
|
37
|
+
stdout.log("");
|
|
38
|
+
const initExit = await initCommand({
|
|
39
|
+
root: options.root,
|
|
40
|
+
ide,
|
|
41
|
+
enterprise: mode === "enterprise",
|
|
42
|
+
force,
|
|
43
|
+
stdout,
|
|
44
|
+
});
|
|
45
|
+
if (configureGraph) {
|
|
46
|
+
stdout.log("");
|
|
47
|
+
await graphCommand({ root: options.root, action: "setup", stdout });
|
|
48
|
+
}
|
|
49
|
+
return initExit;
|
|
50
|
+
}
|
|
51
|
+
finally {
|
|
52
|
+
rl.close();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
async function setupFromAnswers(options, stdout, answers) {
|
|
56
|
+
stdout.log("Speckit setup");
|
|
57
|
+
stdout.log("");
|
|
58
|
+
const mode = selectAnswer(stdout, modeChoices, "Choose setup mode", "1", answers.shift());
|
|
59
|
+
const ide = selectAnswer(stdout, ideChoices, "Choose IDE adapter", "1", answers.shift());
|
|
60
|
+
const force = confirmAnswer("Overwrite unmanaged files if needed?", false, answers.shift());
|
|
61
|
+
const configureGraph = confirmAnswer("Run Beads Viewer setup after init?", true, answers.shift());
|
|
62
|
+
stdout.log("");
|
|
63
|
+
stdout.log(`Selected: ${mode}, ide=${ide}, force=${force ? "yes" : "no"}, graph=${configureGraph ? "yes" : "no"}`);
|
|
64
|
+
stdout.log("");
|
|
65
|
+
const initExit = await initCommand({
|
|
66
|
+
root: options.root,
|
|
67
|
+
ide,
|
|
68
|
+
enterprise: mode === "enterprise",
|
|
69
|
+
force,
|
|
70
|
+
stdout,
|
|
71
|
+
});
|
|
72
|
+
if (configureGraph) {
|
|
73
|
+
stdout.log("");
|
|
74
|
+
await graphCommand({ root: options.root, action: "setup", stdout });
|
|
75
|
+
}
|
|
76
|
+
return initExit;
|
|
77
|
+
}
|
|
78
|
+
function selectAnswer(stdout, choices, prompt, defaultValue, answer) {
|
|
79
|
+
stdout.log(prompt);
|
|
80
|
+
choices.forEach((choice, index) => stdout.log(` ${index + 1}. ${choice.label}`));
|
|
81
|
+
const selected = (answer?.trim() || defaultValue);
|
|
82
|
+
const index = Number.parseInt(selected, 10) - 1;
|
|
83
|
+
if (!Number.isInteger(index) || !choices[index]) {
|
|
84
|
+
throw new Error(`Invalid selection: ${selected}`);
|
|
85
|
+
}
|
|
86
|
+
stdout.log("");
|
|
87
|
+
return choices[index].value;
|
|
88
|
+
}
|
|
89
|
+
function confirmAnswer(prompt, defaultValue, answer) {
|
|
90
|
+
const selected = answer?.trim().toLowerCase();
|
|
91
|
+
if (!selected)
|
|
92
|
+
return defaultValue;
|
|
93
|
+
if (["y", "yes"].includes(selected))
|
|
94
|
+
return true;
|
|
95
|
+
if (["n", "no"].includes(selected))
|
|
96
|
+
return false;
|
|
97
|
+
throw new Error(`Invalid yes/no answer for "${prompt}": ${answer}`);
|
|
98
|
+
}
|
|
99
|
+
async function select(rl, stdout, choices, prompt, defaultValue) {
|
|
100
|
+
for (;;) {
|
|
101
|
+
stdout.log(prompt);
|
|
102
|
+
choices.forEach((choice, index) => {
|
|
103
|
+
const number = String(index + 1);
|
|
104
|
+
stdout.log(` ${number}. ${choice.label}`);
|
|
105
|
+
});
|
|
106
|
+
const answer = (await rl.question(`Select [${defaultValue}]: `)).trim() || defaultValue;
|
|
107
|
+
const index = Number.parseInt(answer, 10) - 1;
|
|
108
|
+
if (Number.isInteger(index) && choices[index]) {
|
|
109
|
+
stdout.log("");
|
|
110
|
+
return choices[index].value;
|
|
111
|
+
}
|
|
112
|
+
stdout.log(`Invalid selection: ${answer}`);
|
|
113
|
+
stdout.log("");
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
async function confirm(rl, stdout, prompt, defaultValue) {
|
|
117
|
+
const suffix = defaultValue ? "Y/n" : "y/N";
|
|
118
|
+
for (;;) {
|
|
119
|
+
const answer = (await rl.question(`${prompt} [${suffix}]: `)).trim().toLowerCase();
|
|
120
|
+
if (!answer)
|
|
121
|
+
return defaultValue;
|
|
122
|
+
if (["y", "yes"].includes(answer))
|
|
123
|
+
return true;
|
|
124
|
+
if (["n", "no"].includes(answer))
|
|
125
|
+
return false;
|
|
126
|
+
stdout.log("Please answer y or n.");
|
|
127
|
+
}
|
|
128
|
+
}
|
package/docs/adapters.md
CHANGED
|
@@ -25,3 +25,24 @@ Speckit never invokes bare `bv`. The `next` command calls:
|
|
|
25
25
|
```bash
|
|
26
26
|
bv --robot-next --format json
|
|
27
27
|
```
|
|
28
|
+
|
|
29
|
+
Run this once on a new machine to see install commands and prepare the graph mirror:
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
speckit graph setup
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Common `bv` installs:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
brew install dicklesworthstone/tap/bv
|
|
39
|
+
go install github.com/Dicklesworthstone/beads_viewer/cmd/bv@latest
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Graph wrappers use robot mode:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
speckit graph triage --json
|
|
46
|
+
speckit graph plan --json
|
|
47
|
+
speckit graph insights --json
|
|
48
|
+
```
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
<!-- speckit:managed -->
|
|
2
|
+
# Beads Viewer Setup
|
|
3
|
+
|
|
4
|
+
Speckit works without Beads Viewer by falling back to local JSON. Install `bv` when you want graph-aware prioritization, bottleneck detection, critical path analysis, and robot-mode planning.
|
|
5
|
+
|
|
6
|
+
## Install `bv`
|
|
7
|
+
|
|
8
|
+
Recommended on macOS/Linux:
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
brew install dicklesworthstone/tap/bv
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
Go install:
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
go install github.com/Dicklesworthstone/beads_viewer/cmd/bv@latest
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Nix:
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
nix run github:Dicklesworthstone/beads_viewer -- --help
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Verify With Speckit
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
speckit graph setup
|
|
30
|
+
speckit sync
|
|
31
|
+
speckit graph triage --json
|
|
32
|
+
speckit next
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
`speckit graph setup` prepares `.beads/beads.jsonl` from Speckit stories and reports whether `bv` is available.
|
|
36
|
+
|
|
37
|
+
## Agent Safety Rule
|
|
38
|
+
|
|
39
|
+
Do not run bare `bv` from an agent session. Bare `bv` opens the interactive TUI. Use:
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
speckit graph triage --json
|
|
43
|
+
speckit graph plan --json
|
|
44
|
+
speckit graph insights --json
|
|
45
|
+
bv --robot-triage --format json
|
|
46
|
+
bv --robot-next --format json
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Data Flow
|
|
50
|
+
|
|
51
|
+
```text
|
|
52
|
+
.speckit/stories/*.md
|
|
53
|
+
-> speckit sync
|
|
54
|
+
-> .speckit/sync/beads-sync.jsonl
|
|
55
|
+
-> .beads/beads.jsonl
|
|
56
|
+
-> bv --robot-* or Speckit graph wrappers
|
|
57
|
+
```
|
|
58
|
+
|
|
@@ -4,7 +4,7 @@
|
|
|
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.3.
|
|
7
|
+
Current package target: `@trieungoctam/speckit@0.3.5`.
|
|
8
8
|
|
|
9
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/session tests plus CI.
|
|
10
10
|
|
|
@@ -13,11 +13,11 @@ The CLI is npx-ready, generates Agile + TDD rules, creates workflow artifacts, s
|
|
|
13
13
|
| Milestone | Status | Notes |
|
|
14
14
|
| --- | --- | --- |
|
|
15
15
|
| Product contract | Complete | Contract, workflow model, and command surface documented. |
|
|
16
|
-
| CLI scaffold | Complete | `bin/speckit`, TypeScript build, command router, managed file writer. |
|
|
16
|
+
| CLI scaffold | Complete | `bin/speckit`, TypeScript build, command router, interactive setup wizard, managed file writer. |
|
|
17
17
|
| Workflow engine | Complete | `start`, `shape`, `plan`, `context`, `quick`, `sync`, `triage`, `ready`, `run`, `review`, and `close` generate linked artifacts. |
|
|
18
18
|
| Long session manager | Complete | `memory refresh` plus `session start/checkpoint/compact/resume/status` preserve agent continuity outside chat history. |
|
|
19
19
|
| IDE adapters | Complete | Claude Code, Codex, Antigravity, OpenCode, Cursor. |
|
|
20
|
-
| Beads integration | MVP Complete | `next` and `graph triage/plan/insights` wrap BV robot mode; `sync` exports story metadata JSONL. |
|
|
20
|
+
| Beads integration | MVP Complete | `graph setup` prints install commands and prepares `.beads/beads.jsonl`; `next` and `graph triage/plan/insights` wrap BV robot mode; `sync` exports story metadata JSONL. |
|
|
21
21
|
| Sprint automation | MVP Complete | `sprint plan` and `sprint next` select work from synced stories. |
|
|
22
22
|
| Enterprise harness | MVP Complete | `init --enterprise` creates flow, tool-policy, and prompt harness files; `doctor --deep` verifies them. |
|
|
23
23
|
| Curated skill catalog | Complete | Speckit now generates focused phase skills, a schema, delegation statuses, and task hydration/sync-back guidance. |
|
|
@@ -1,5 +1,30 @@
|
|
|
1
1
|
# Project Changelog
|
|
2
2
|
|
|
3
|
+
## 0.3.5 - 2026-05-11
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
|
|
7
|
+
- Added `speckit setup`, an interactive TUI wizard for setup mode, IDE adapter, overwrite policy, and optional Beads Viewer setup.
|
|
8
|
+
- Added `speckit graph setup` to print Beads Viewer install commands, check `br`/`bd`/`bv`, and prepare `.beads/beads.jsonl`.
|
|
9
|
+
- Added `docs/beads-viewer-setup.md` with Homebrew, Go, and Nix setup paths plus robot-safe verification commands.
|
|
10
|
+
|
|
11
|
+
### Changed
|
|
12
|
+
|
|
13
|
+
- `speckit doctor` now prints install hints for missing tools.
|
|
14
|
+
- `speckit next` now prints concrete Beads Viewer setup guidance when `bv` is missing.
|
|
15
|
+
- README and workflow docs now include the graph setup step.
|
|
16
|
+
|
|
17
|
+
## 0.3.4 - 2026-05-11
|
|
18
|
+
|
|
19
|
+
### Fixed
|
|
20
|
+
|
|
21
|
+
- Fixed global CLI help handling so `speckit --help`, `speckit -h`, `speckit help`, and command-level `--help` print usage without an unknown-command warning.
|
|
22
|
+
|
|
23
|
+
### Quality
|
|
24
|
+
|
|
25
|
+
- Added CLI help regression coverage.
|
|
26
|
+
- `npm test` passes with 44 tests.
|
|
27
|
+
|
|
3
28
|
## 0.3.3 - 2026-05-11
|
|
4
29
|
|
|
5
30
|
### Added
|
package/docs/use-cases.md
CHANGED
|
@@ -6,6 +6,16 @@ This guide shows how to use Speckit for common product and engineering workflows
|
|
|
6
6
|
|
|
7
7
|
Use when a repository does not have Speckit runtime files yet.
|
|
8
8
|
|
|
9
|
+
Interactive:
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npx @trieungoctam/speckit@latest setup
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
The wizard asks for setup mode, IDE adapter, overwrite policy, and whether to run Beads Viewer setup.
|
|
16
|
+
|
|
17
|
+
Scripted:
|
|
18
|
+
|
|
9
19
|
```bash
|
|
10
20
|
npx @trieungoctam/speckit@latest init --enterprise --ide cursor
|
|
11
21
|
npx @trieungoctam/speckit@latest doctor --deep
|
|
@@ -131,6 +141,7 @@ Use when multiple stories exist and the next task is not obvious.
|
|
|
131
141
|
|
|
132
142
|
```bash
|
|
133
143
|
speckit sync
|
|
144
|
+
speckit graph setup
|
|
134
145
|
speckit sprint plan
|
|
135
146
|
speckit sprint next --json
|
|
136
147
|
speckit graph triage --json
|
|
@@ -141,6 +152,7 @@ speckit graph insights --json
|
|
|
141
152
|
Best practices:
|
|
142
153
|
|
|
143
154
|
- Run `sync` before any graph command.
|
|
155
|
+
- Run `graph setup` on new machines to print Beads Viewer install commands, check `bv`, and prepare `.beads/beads.jsonl`.
|
|
144
156
|
- Keep graph commands robot-safe. Use Speckit wrappers instead of interactive graph commands.
|
|
145
157
|
- Treat graph output as prioritization input, not automatic permission to implement.
|
|
146
158
|
- Re-run `sprint plan` when story status or dependencies change.
|
package/docs/workflow-model.md
CHANGED
|
@@ -70,3 +70,5 @@ Long-running agent work must keep durable state outside chat history:
|
|
|
70
70
|
## Beads Viewer Automation
|
|
71
71
|
|
|
72
72
|
`speckit sync` prepares both Speckit sync metadata and a Beads Viewer-compatible `.beads/beads.jsonl` mirror. `speckit graph triage|plan|insights` refreshes that mirror before invoking `bv --robot-*` from the project root, then falls back to local JSON if Beads Viewer is unavailable or still fails.
|
|
73
|
+
|
|
74
|
+
Run `speckit graph setup` on a new machine to print Beads Viewer install commands, check `br`/`bd`/`bv`, and prepare `.beads/beads.jsonl`.
|