meto-cli 0.1.4 → 0.4.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/README.md CHANGED
@@ -27,6 +27,7 @@ After running `meto-cli init`, your new project comes pre-loaded with everything
27
27
  - **Agent definitions** -- PM, developer, and tester agents configured to follow your methodology from day one
28
28
  - **Product context** -- your vision, tech stack, and decisions captured in structured files so every session starts with shared context
29
29
  - **Epics and workflows** -- definition of done, commit conventions, and an epic backlog to plan against
30
+ - **Agent Teams ready** -- three agents configured to work in parallel with file ownership boundaries
30
31
  - **Token optimized** -- generated files are optimized for token consumption with Claude Code, so every session gets more productive output per dollar spent
31
32
 
32
33
  No more hours of manual setup. No more "I forgot to write the CLAUDE.md." It is all there from the start.
@@ -42,10 +43,11 @@ your-project/
42
43
  │ │ ├── developer-agent.md
43
44
  │ │ ├── pm-agent.md
44
45
  │ │ └── tester-agent.md
45
- └── agent-memory/
46
- ├── meto-developer/MEMORY.md
47
- ├── meto-pm/MEMORY.md
48
- └── meto-tester/MEMORY.md
46
+ ├── agent-memory/
47
+ ├── meto-developer/MEMORY.md
48
+ ├── meto-pm/MEMORY.md
49
+ └── meto-tester/MEMORY.md
50
+ │ └── settings.json
49
51
  ├── ai/
50
52
  │ ├── backlog/
51
53
  │ │ └── epics.md
@@ -70,12 +72,33 @@ your-project/
70
72
 
71
73
  ---
72
74
 
75
+ ## Agent Teams
76
+
77
+ Agent Teams is a Claude Code feature where multiple AI agents work in parallel on the same codebase, each with a specialized role.
78
+
79
+ Meto scaffolds projects ready for Agent Teams out of the box:
80
+
81
+ - **Three pre-configured agents** -- PM for planning, developer for building, tester for validation
82
+ - **File ownership boundaries** -- each agent writes only to its designated files, preventing conflicts when running in parallel
83
+ - **Feature enabled automatically** -- `.claude/settings.json` sets the experimental flag so Agent Teams works immediately
84
+
85
+ **To activate:** start `claude` in your project, then say:
86
+
87
+ > "Create an agent team with @meto-pm for planning, @meto-developer for building, @meto-tester for validation"
88
+
89
+ **Display modes:** use Shift+Down to cycle between agents in-process, or run each agent in its own split pane (tmux/iTerm2).
90
+
91
+ This feature is experimental and enabled via `.claude/settings.json` in the scaffold.
92
+
93
+ ---
94
+
73
95
  ## Next Steps
74
96
 
75
97
  1. `cd your-project`
76
98
  2. Open the project in your editor
77
99
  3. Start a Claude Code session and call `@meto-pm` to populate your backlog
78
- 4. Pick your first task and start building
100
+ 4. Or spawn an agent team: tell Claude to create a team with @meto-pm, @meto-developer, and @meto-tester
101
+ 5. Pick your first task and start building
79
102
 
80
103
  ---
81
104
 
@@ -0,0 +1,57 @@
1
+ import type { TechStack } from "./types.js";
2
+ /**
3
+ * Minimal context the user provides before AI takes over generation.
4
+ */
5
+ export interface AIGenerationContext {
6
+ projectName: string;
7
+ description: string;
8
+ targetUsers: string;
9
+ techStack: TechStack;
10
+ customStack: string | undefined;
11
+ }
12
+ /**
13
+ * Result of a successful AI generation subprocess call.
14
+ */
15
+ export interface AIGenerationResult {
16
+ /** Raw stdout output from the Claude Code subprocess. */
17
+ raw: string;
18
+ }
19
+ /**
20
+ * Error thrown when the Claude Code subprocess exits with a non-zero code.
21
+ */
22
+ export declare class AIGenerationError extends Error {
23
+ /** The stderr output from the failed subprocess. */
24
+ readonly stderr: string;
25
+ /** The exit code from the subprocess (null if terminated by signal). */
26
+ readonly exitCode: number | null;
27
+ constructor(stderr: string, exitCode: number | null);
28
+ }
29
+ /**
30
+ * Error thrown when the Claude Code subprocess exceeds the timeout.
31
+ */
32
+ export declare class AIGenerationTimeoutError extends Error {
33
+ /** The timeout duration in milliseconds. */
34
+ readonly timeoutMs: number;
35
+ constructor(timeoutMs: number);
36
+ }
37
+ /**
38
+ * Builds the structured prompt that instructs Claude Code to generate project content.
39
+ *
40
+ * The prompt specifies section markers so the output can be deterministically parsed.
41
+ * Each section is delimited by `---SECTION:<NAME>---` and `---END:<NAME>---` markers.
42
+ */
43
+ export declare function buildAIPrompt(context: AIGenerationContext): string;
44
+ /**
45
+ * Invokes Claude Code as a subprocess with a structured prompt and returns the raw output.
46
+ *
47
+ * The function spawns `claude` with the `-p` flag, passing the generation prompt.
48
+ * It captures stdout and returns it as a raw string for downstream parsing.
49
+ *
50
+ * @param context - The minimal project context collected from the user
51
+ * @param timeoutMs - Maximum time to wait for the subprocess (default 90 seconds)
52
+ * @returns The raw stdout output from Claude Code
53
+ * @throws {AIGenerationTimeoutError} If the subprocess exceeds the timeout
54
+ * @throws {AIGenerationError} If the subprocess exits with a non-zero code
55
+ */
56
+ export declare function generateWithAI(context: AIGenerationContext, timeoutMs?: number): Promise<AIGenerationResult>;
57
+ //# sourceMappingURL=ai-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-generator.d.ts","sourceRoot":"","sources":["../../src/cli/ai-generator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAG5C;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,SAAS,CAAC;IACrB,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,yDAAyD;IACzD,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,oDAAoD;IACpD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,wEAAwE;IACxE,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;gBAErB,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;CAOpD;AAED;;GAEG;AACH,qBAAa,wBAAyB,SAAQ,KAAK;IACjD,4CAA4C;IAC5C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;gBAEf,SAAS,EAAE,MAAM;CAM9B;AAOD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,CAuFlE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,mBAAmB,EAC5B,SAAS,GAAE,MAA2B,GACrC,OAAO,CAAC,kBAAkB,CAAC,CAwC7B"}
@@ -0,0 +1,172 @@
1
+ import { spawn } from "node:child_process";
2
+ import { getStackDescription } from "./stacks.js";
3
+ /**
4
+ * Error thrown when the Claude Code subprocess exits with a non-zero code.
5
+ */
6
+ export class AIGenerationError extends Error {
7
+ /** The stderr output from the failed subprocess. */
8
+ stderr;
9
+ /** The exit code from the subprocess (null if terminated by signal). */
10
+ exitCode;
11
+ constructor(stderr, exitCode) {
12
+ const codeInfo = exitCode !== null ? ` (exit code ${exitCode})` : "";
13
+ super(`AI generation failed${codeInfo}: ${stderr}`);
14
+ this.name = "AIGenerationError";
15
+ this.stderr = stderr;
16
+ this.exitCode = exitCode;
17
+ }
18
+ }
19
+ /**
20
+ * Error thrown when the Claude Code subprocess exceeds the timeout.
21
+ */
22
+ export class AIGenerationTimeoutError extends Error {
23
+ /** The timeout duration in milliseconds. */
24
+ timeoutMs;
25
+ constructor(timeoutMs) {
26
+ const seconds = Math.round(timeoutMs / 1000);
27
+ super(`AI generation timed out after ${seconds} seconds`);
28
+ this.name = "AIGenerationTimeoutError";
29
+ this.timeoutMs = timeoutMs;
30
+ }
31
+ }
32
+ /**
33
+ * Default timeout for the AI generation subprocess (90 seconds).
34
+ */
35
+ const DEFAULT_TIMEOUT_MS = 90_000;
36
+ /**
37
+ * Builds the structured prompt that instructs Claude Code to generate project content.
38
+ *
39
+ * The prompt specifies section markers so the output can be deterministically parsed.
40
+ * Each section is delimited by `---SECTION:<NAME>---` and `---END:<NAME>---` markers.
41
+ */
42
+ export function buildAIPrompt(context) {
43
+ const stackDescription = context.techStack === "custom"
44
+ ? context.customStack ?? "Custom stack"
45
+ : getStackDescription(context.techStack);
46
+ return `You are a senior product manager and technical architect. Based on the project brief below, generate structured project content for a software project scaffold.
47
+
48
+ PROJECT BRIEF:
49
+ - Name: ${context.projectName}
50
+ - Description: ${context.description}
51
+ - Target Users: ${context.targetUsers}
52
+ - Tech Stack: ${stackDescription}
53
+
54
+ Generate the following sections. Each section MUST be wrapped in markers exactly as shown. Do not include the markers inside the content itself.
55
+
56
+ ---SECTION:PRODUCT_VISION---
57
+ Write an expanded product vision (3-5 paragraphs). Cover what the product does, why it matters, who it serves, and what differentiates it. Be specific and actionable, not generic.
58
+ ---END:PRODUCT_VISION---
59
+
60
+ ---SECTION:PROBLEM_STATEMENT---
61
+ Write a clear problem statement (2-3 paragraphs). Describe the pain point, who experiences it, and why existing solutions fall short.
62
+ ---END:PROBLEM_STATEMENT---
63
+
64
+ ---SECTION:SUCCESS_CRITERIA---
65
+ Write 5-8 measurable success criteria as a markdown bullet list. Each criterion should be specific and verifiable (e.g., "New user can complete onboarding in under 2 minutes").
66
+ ---END:SUCCESS_CRITERIA---
67
+
68
+ ---SECTION:VALUE_PROPOSITION---
69
+ Write a one-line value proposition that captures the core benefit. Follow it with 2-3 supporting sentences.
70
+ ---END:VALUE_PROPOSITION---
71
+
72
+ ---SECTION:OUT_OF_SCOPE---
73
+ Write 5-8 items that are explicitly out of scope for v1 as a markdown bullet list. Be specific about what will NOT be built.
74
+ ---END:OUT_OF_SCOPE---
75
+
76
+ ---SECTION:EPICS---
77
+ Generate 4-6 epics. Each epic must follow this exact format:
78
+
79
+ ## E1 -- [Epic Title]
80
+ **Goal:** [One sentence describing the outcome]
81
+ **Status:** Not started
82
+ **Tasks:** To be sliced by @meto-pm
83
+
84
+ ---
85
+
86
+ ## E2 -- [Epic Title]
87
+ **Goal:** [One sentence describing the outcome]
88
+ **Status:** Not started
89
+ **Tasks:** To be sliced by @meto-pm
90
+
91
+ Continue for E3, E4, etc. Epics should progress logically from setup through core features to deployment.
92
+ ---END:EPICS---
93
+
94
+ ---SECTION:STARTER_TASKS---
95
+ Slice the FIRST epic (E1) into 3-5 task slices. Each task must follow this exact format:
96
+
97
+ ## [slice-001] -- [Task Title]
98
+ **Epic:** E1 | **Size:** S | **Depends on:** none
99
+
100
+ **User Story**
101
+ As a [role], I want [capability] so that [benefit].
102
+
103
+ **Acceptance Criteria**
104
+ - [ ] [Specific, testable criterion]
105
+ - [ ] [Another criterion]
106
+ - [ ] [At least 3 criteria per task]
107
+
108
+ **Out of Scope**
109
+ [What this task does NOT include]
110
+
111
+ ---
112
+
113
+ Continue with [slice-002], [slice-003], etc. Tasks should be small enough to complete in one session.
114
+ ---END:STARTER_TASKS---
115
+
116
+ ---SECTION:DEFINITION_OF_DONE---
117
+ Write a Definition of Done checklist with two sections:
118
+
119
+ ## Universal Checks
120
+ - [ ] [5-6 universal quality checks appropriate for the tech stack]
121
+
122
+ ## Stack-Specific Checks
123
+ - [ ] [4-5 checks specific to the chosen technology]
124
+ ---END:DEFINITION_OF_DONE---
125
+
126
+ IMPORTANT: Output ONLY the sections above with their markers. No introduction, no conclusion, no commentary outside the markers.`;
127
+ }
128
+ /**
129
+ * Invokes Claude Code as a subprocess with a structured prompt and returns the raw output.
130
+ *
131
+ * The function spawns `claude` with the `-p` flag, passing the generation prompt.
132
+ * It captures stdout and returns it as a raw string for downstream parsing.
133
+ *
134
+ * @param context - The minimal project context collected from the user
135
+ * @param timeoutMs - Maximum time to wait for the subprocess (default 90 seconds)
136
+ * @returns The raw stdout output from Claude Code
137
+ * @throws {AIGenerationTimeoutError} If the subprocess exceeds the timeout
138
+ * @throws {AIGenerationError} If the subprocess exits with a non-zero code
139
+ */
140
+ export function generateWithAI(context, timeoutMs = DEFAULT_TIMEOUT_MS) {
141
+ const prompt = buildAIPrompt(context);
142
+ return new Promise((resolve, reject) => {
143
+ const child = spawn("claude", ["-p", prompt], {
144
+ stdio: ["ignore", "pipe", "pipe"],
145
+ });
146
+ let stdout = "";
147
+ let stderr = "";
148
+ child.stdout.on("data", (chunk) => {
149
+ stdout += chunk.toString();
150
+ });
151
+ child.stderr.on("data", (chunk) => {
152
+ stderr += chunk.toString();
153
+ });
154
+ const timer = setTimeout(() => {
155
+ child.kill("SIGTERM");
156
+ reject(new AIGenerationTimeoutError(timeoutMs));
157
+ }, timeoutMs);
158
+ child.on("close", (code) => {
159
+ clearTimeout(timer);
160
+ if (code !== 0) {
161
+ reject(new AIGenerationError(stderr, code));
162
+ return;
163
+ }
164
+ resolve({ raw: stdout });
165
+ });
166
+ child.on("error", (err) => {
167
+ clearTimeout(timer);
168
+ reject(new AIGenerationError(err.message, null));
169
+ });
170
+ });
171
+ }
172
+ //# sourceMappingURL=ai-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-generator.js","sourceRoot":"","sources":["../../src/cli/ai-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Structured content generated by AI, mapped to scaffold template tokens.
3
+ */
4
+ export interface AIGeneratedContent {
5
+ productVision: string;
6
+ problemStatement: string;
7
+ successCriteria: string;
8
+ valueProposition: string;
9
+ outOfScope: string;
10
+ /** Formatted markdown with epic definitions. */
11
+ epics: string;
12
+ /** Formatted markdown with task slice definitions. */
13
+ starterTasks: string;
14
+ /** Definition of Done checklist. */
15
+ definitionOfDone: string;
16
+ }
17
+ /**
18
+ * Result of validating AI-generated content.
19
+ */
20
+ export interface ValidationResult {
21
+ valid: boolean;
22
+ warnings: string[];
23
+ }
24
+ /**
25
+ * Error thrown when the AI output cannot be parsed at all.
26
+ */
27
+ export declare class AIParseError extends Error {
28
+ /** The raw unparseable output for debugging. */
29
+ readonly rawOutput: string;
30
+ constructor(rawOutput: string);
31
+ }
32
+ /**
33
+ * Parses raw AI output into structured AIGeneratedContent.
34
+ *
35
+ * Extracts content between section markers (`---SECTION:<NAME>---` / `---END:<NAME>---`).
36
+ * Missing sections receive a fallback value. If no markers are found at all,
37
+ * throws an AIParseError.
38
+ *
39
+ * @param raw - The raw stdout string from the Claude Code subprocess
40
+ * @returns Parsed and structured content ready for template token mapping
41
+ * @throws {AIParseError} If the output contains no recognizable section markers
42
+ */
43
+ export declare function parseAIOutput(raw: string): AIGeneratedContent;
44
+ /**
45
+ * Validates parsed AI-generated content for structural quality.
46
+ *
47
+ * Checks:
48
+ * - No section is empty or still using the fallback value
49
+ * - Epics section contains at least `## E1`
50
+ * - Starter tasks section contains at least `## [slice-001]`
51
+ * - Each task has "Acceptance Criteria" and "Out of Scope" headings
52
+ *
53
+ * @param content - The parsed AIGeneratedContent to validate
54
+ * @returns A ValidationResult indicating whether the content is valid, with warnings
55
+ */
56
+ export declare function validateAIContent(content: AIGeneratedContent): ValidationResult;
57
+ //# sourceMappingURL=ai-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-parser.d.ts","sourceRoot":"","sources":["../../src/cli/ai-parser.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,sDAAsD;IACtD,YAAY,EAAE,MAAM,CAAC;IACrB,oCAAoC;IACpC,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;GAEG;AACH,qBAAa,YAAa,SAAQ,KAAK;IACrC,gDAAgD;IAChD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;gBAEf,SAAS,EAAE,MAAM;CAK9B;AA2DD;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB,CA4B7D;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,gBAAgB,CA0C/E"}
@@ -0,0 +1,146 @@
1
+ /**
2
+ * Error thrown when the AI output cannot be parsed at all.
3
+ */
4
+ export class AIParseError extends Error {
5
+ /** The raw unparseable output for debugging. */
6
+ rawOutput;
7
+ constructor(rawOutput) {
8
+ super("AI output is unparseable -- no section markers found");
9
+ this.name = "AIParseError";
10
+ this.rawOutput = rawOutput;
11
+ }
12
+ }
13
+ /**
14
+ * Section names used as delimiters in the AI output.
15
+ */
16
+ const SECTION_NAMES = [
17
+ "PRODUCT_VISION",
18
+ "PROBLEM_STATEMENT",
19
+ "SUCCESS_CRITERIA",
20
+ "VALUE_PROPOSITION",
21
+ "OUT_OF_SCOPE",
22
+ "EPICS",
23
+ "STARTER_TASKS",
24
+ "DEFINITION_OF_DONE",
25
+ ];
26
+ /**
27
+ * Default fallback value used when a section is missing from the AI output.
28
+ */
29
+ const FALLBACK_VALUE = "To be defined by @meto-pm";
30
+ /**
31
+ * Maps section names to AIGeneratedContent field keys.
32
+ */
33
+ const SECTION_TO_FIELD = {
34
+ PRODUCT_VISION: "productVision",
35
+ PROBLEM_STATEMENT: "problemStatement",
36
+ SUCCESS_CRITERIA: "successCriteria",
37
+ VALUE_PROPOSITION: "valueProposition",
38
+ OUT_OF_SCOPE: "outOfScope",
39
+ EPICS: "epics",
40
+ STARTER_TASKS: "starterTasks",
41
+ DEFINITION_OF_DONE: "definitionOfDone",
42
+ };
43
+ /**
44
+ * Extracts the content between section markers for a given section name.
45
+ * Returns undefined if the section is not found.
46
+ */
47
+ function extractSection(raw, sectionName) {
48
+ const startMarker = `---SECTION:${sectionName}---`;
49
+ const endMarker = `---END:${sectionName}---`;
50
+ const startIndex = raw.indexOf(startMarker);
51
+ if (startIndex === -1) {
52
+ return undefined;
53
+ }
54
+ const contentStart = startIndex + startMarker.length;
55
+ const endIndex = raw.indexOf(endMarker, contentStart);
56
+ if (endIndex === -1) {
57
+ return undefined;
58
+ }
59
+ return raw.slice(contentStart, endIndex).trim();
60
+ }
61
+ /**
62
+ * Parses raw AI output into structured AIGeneratedContent.
63
+ *
64
+ * Extracts content between section markers (`---SECTION:<NAME>---` / `---END:<NAME>---`).
65
+ * Missing sections receive a fallback value. If no markers are found at all,
66
+ * throws an AIParseError.
67
+ *
68
+ * @param raw - The raw stdout string from the Claude Code subprocess
69
+ * @returns Parsed and structured content ready for template token mapping
70
+ * @throws {AIParseError} If the output contains no recognizable section markers
71
+ */
72
+ export function parseAIOutput(raw) {
73
+ let foundSections = 0;
74
+ const result = {
75
+ productVision: FALLBACK_VALUE,
76
+ problemStatement: FALLBACK_VALUE,
77
+ successCriteria: FALLBACK_VALUE,
78
+ valueProposition: FALLBACK_VALUE,
79
+ outOfScope: FALLBACK_VALUE,
80
+ epics: FALLBACK_VALUE,
81
+ starterTasks: FALLBACK_VALUE,
82
+ definitionOfDone: FALLBACK_VALUE,
83
+ };
84
+ for (const sectionName of SECTION_NAMES) {
85
+ const content = extractSection(raw, sectionName);
86
+ if (content !== undefined) {
87
+ foundSections++;
88
+ const fieldKey = SECTION_TO_FIELD[sectionName];
89
+ result[fieldKey] = content.length > 0 ? content : FALLBACK_VALUE;
90
+ }
91
+ }
92
+ if (foundSections === 0) {
93
+ throw new AIParseError(raw);
94
+ }
95
+ return result;
96
+ }
97
+ /**
98
+ * Validates parsed AI-generated content for structural quality.
99
+ *
100
+ * Checks:
101
+ * - No section is empty or still using the fallback value
102
+ * - Epics section contains at least `## E1`
103
+ * - Starter tasks section contains at least `## [slice-001]`
104
+ * - Each task has "Acceptance Criteria" and "Out of Scope" headings
105
+ *
106
+ * @param content - The parsed AIGeneratedContent to validate
107
+ * @returns A ValidationResult indicating whether the content is valid, with warnings
108
+ */
109
+ export function validateAIContent(content) {
110
+ const warnings = [];
111
+ const fieldLabels = {
112
+ productVision: "Product Vision",
113
+ problemStatement: "Problem Statement",
114
+ successCriteria: "Success Criteria",
115
+ valueProposition: "Value Proposition",
116
+ outOfScope: "Out of Scope",
117
+ epics: "Epics",
118
+ starterTasks: "Starter Tasks",
119
+ definitionOfDone: "Definition of Done",
120
+ };
121
+ for (const [key, label] of Object.entries(fieldLabels)) {
122
+ const value = content[key];
123
+ if (value.length === 0 || value === FALLBACK_VALUE) {
124
+ warnings.push(`${label} section is missing or uses fallback value`);
125
+ }
126
+ }
127
+ if (!content.epics.includes("## E1")) {
128
+ warnings.push("Epics section does not contain at least ## E1");
129
+ }
130
+ if (!content.starterTasks.includes("## [slice-001]")) {
131
+ warnings.push("Starter Tasks section does not contain at least ## [slice-001]");
132
+ }
133
+ if (content.starterTasks !== FALLBACK_VALUE) {
134
+ if (!content.starterTasks.includes("Acceptance Criteria")) {
135
+ warnings.push("Starter Tasks are missing Acceptance Criteria headings");
136
+ }
137
+ if (!content.starterTasks.includes("Out of Scope")) {
138
+ warnings.push("Starter Tasks are missing Out of Scope headings");
139
+ }
140
+ }
141
+ return {
142
+ valid: warnings.length === 0,
143
+ warnings,
144
+ };
145
+ }
146
+ //# sourceMappingURL=ai-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-parser.js","sourceRoot":"","sources":["../../src/cli/ai-parser.ts"],"names":[],"mappings":"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"}
package/dist/cli/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
  import { readFile } from "node:fs/promises";
3
3
  import { join } from "node:path";
4
4
  import * as p from "@clack/prompts";
5
- import { collectProjectBrief } from "./prompts.js";
5
+ import { collectDeepContent, collectProjectBrief } from "./prompts.js";
6
6
  import { InterruptionHandler } from "./interruption.js";
7
7
  import { buildTokenMap, renderTemplates, resolveTemplatesDir, } from "./renderer.js";
8
8
  import { runGitHubFlow } from "./github.js";
@@ -11,6 +11,8 @@ import { runSupabaseFlow } from "./supabase.js";
11
11
  import { checkWritePermission, PreflightError, runPreflightChecks, } from "./preflight.js";
12
12
  import { DirectoryNotEmptyError, writeScaffold } from "./scaffold.js";
13
13
  import { formatFileTree } from "./tree.js";
14
+ import { generateWithAI, AIGenerationTimeoutError } from "./ai-generator.js";
15
+ import { parseAIOutput, validateAIContent } from "./ai-parser.js";
14
16
  /**
15
17
  * Resolves the absolute path to the package root directory.
16
18
  * At runtime: dist/cli/index.js -> package root is ../../
@@ -46,6 +48,7 @@ function printHelp() {
46
48
  "Commands:",
47
49
  " init Scaffold a new structured project",
48
50
  " init --dry-run Preview files without writing to disk",
51
+ " init --no-ai Skip AI generation, use standard prompts",
49
52
  "",
50
53
  "Options:",
51
54
  " --help, -h Show this help message",
@@ -90,7 +93,31 @@ async function main() {
90
93
  if (!preflight.gitAvailable) {
91
94
  p.log.warning("git not found -- the scaffolded project will not be initialized as a git repository.");
92
95
  }
93
- const brief = await collectProjectBrief();
96
+ const noAIFlag = process.argv.includes("--no-ai");
97
+ let useAI = preflight.claudeCodeAvailable && !noAIFlag;
98
+ if (noAIFlag) {
99
+ p.log.info("AI generation disabled via --no-ai flag");
100
+ }
101
+ else if (preflight.claudeCodeAvailable) {
102
+ p.log.info("Claude Code detected -- AI-powered generation available");
103
+ const confirmAI = await p.confirm({
104
+ message: "Use AI to generate your project content?",
105
+ initialValue: true,
106
+ });
107
+ if (p.isCancel(confirmAI)) {
108
+ p.cancel("Project setup cancelled.");
109
+ interruption.uninstall();
110
+ process.exit(0);
111
+ }
112
+ useAI = confirmAI;
113
+ if (!useAI) {
114
+ p.log.info("Using standard prompts instead.");
115
+ }
116
+ }
117
+ else {
118
+ p.log.info("Claude Code not found -- using standard prompts");
119
+ }
120
+ const brief = await collectProjectBrief({ useAI });
94
121
  const writeError = await checkWritePermission(brief.outputDirectory);
95
122
  if (writeError !== undefined) {
96
123
  p.log.error(writeError);
@@ -107,11 +134,73 @@ async function main() {
107
134
  `Stack: ${stackLabel}`,
108
135
  `Output: ${brief.outputDirectory}`,
109
136
  ].join("\n"), "Project Brief");
137
+ let aiContent;
138
+ if (useAI) {
139
+ const aiSpinner = p.spinner();
140
+ aiSpinner.start("Generating project content with Claude Code...");
141
+ const startTime = Date.now();
142
+ let elapsedSeconds = 0;
143
+ const progressTimer = setInterval(() => {
144
+ elapsedSeconds += 10;
145
+ aiSpinner.message(`Generating project content with Claude Code... (${elapsedSeconds}s)`);
146
+ }, 10_000);
147
+ try {
148
+ const aiResult = await generateWithAI({
149
+ projectName: brief.projectName,
150
+ description: brief.description,
151
+ targetUsers: brief.targetUsers,
152
+ techStack: brief.techStack,
153
+ customStack: brief.customStack,
154
+ });
155
+ clearInterval(progressTimer);
156
+ const totalSeconds = Math.round((Date.now() - startTime) / 1000);
157
+ aiContent = parseAIOutput(aiResult.raw);
158
+ aiSpinner.stop(`Project content generated (${totalSeconds}s)`);
159
+ const validation = validateAIContent(aiContent);
160
+ if (validation.warnings.length > 0) {
161
+ for (const warning of validation.warnings) {
162
+ p.log.warning(warning);
163
+ }
164
+ }
165
+ const epicCount = (aiContent.epics.match(/## E\d+/g) ?? []).length;
166
+ const taskCount = (aiContent.starterTasks.match(/## \[slice-\d+\]/g) ?? []).length;
167
+ const dodCustomized = aiContent.definitionOfDone !== "To be defined by @meto-pm";
168
+ const visionFirstLine = aiContent.productVision.split("\n")[0].trim();
169
+ const visionPreview = visionFirstLine.length > 80
170
+ ? visionFirstLine.slice(0, 77) + "..."
171
+ : visionFirstLine;
172
+ const summaryLines = [
173
+ `Vision: ${visionPreview}`,
174
+ `Epics: ${epicCount}`,
175
+ `Tasks: ${taskCount}`,
176
+ `DoD: ${dodCustomized ? "Customized for stack" : "Default"}`,
177
+ ];
178
+ p.note(summaryLines.join("\n"), "AI Generation Summary");
179
+ }
180
+ catch (aiError) {
181
+ clearInterval(progressTimer);
182
+ if (aiError instanceof AIGenerationTimeoutError) {
183
+ aiSpinner.stop("AI generation failed -- falling back to standard prompts");
184
+ p.log.warning(`Timed out after ${Math.round(aiError.timeoutMs / 1000)} seconds. Falling back to standard prompts.`);
185
+ }
186
+ else {
187
+ const reason = aiError instanceof Error ? aiError.message : "Unknown error";
188
+ aiSpinner.stop("AI generation failed -- falling back to standard prompts");
189
+ p.log.warning(`AI generation failed: ${reason}. Falling back to standard prompts.`);
190
+ }
191
+ const deep = await collectDeepContent();
192
+ brief.problemStatement = deep.problemStatement;
193
+ brief.successCriteria = deep.successCriteria;
194
+ brief.valueProposition = deep.valueProposition;
195
+ brief.outOfScope = deep.outOfScope;
196
+ brief.codeConventions = deep.codeConventions;
197
+ }
198
+ }
110
199
  const s = p.spinner();
111
200
  s.start("Rendering templates...");
112
201
  try {
113
202
  const templatesDir = resolveTemplatesDir();
114
- const tokens = buildTokenMap(brief);
203
+ const tokens = buildTokenMap(brief, aiContent);
115
204
  const renderedFiles = await renderTemplates(templatesDir, tokens);
116
205
  if (dryRun) {
117
206
  s.stop("Templates rendered (dry run).");
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,8 @@
4
4
  export interface PreflightResult {
5
5
  /** Whether git is available on the system PATH. */
6
6
  gitAvailable: boolean;
7
+ /** Whether Claude Code CLI is available on the system PATH. */
8
+ claudeCodeAvailable: boolean;
7
9
  }
8
10
  /**
9
11
  * Parses the major version number from a Node.js version string.
@@ -21,6 +23,11 @@ export declare function checkNodeVersion(versionString: string, minimumMajor: nu
21
23
  * Resolves to true if git is found, false otherwise.
22
24
  */
23
25
  export declare function checkGitAvailable(): Promise<boolean>;
26
+ /**
27
+ * Checks whether Claude Code CLI is available by running `claude --version`.
28
+ * Resolves to true if Claude Code is found, false otherwise.
29
+ */
30
+ export declare function checkClaudeCodeAvailable(): Promise<boolean>;
24
31
  /**
25
32
  * Checks whether the parent directory of the given output path exists and is writable.
26
33
  * Returns an error message string if the check fails, or undefined if OK.
@@ -1 +1 @@
1
- {"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../../src/cli/preflight.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,mDAAmD;IACnD,YAAY,EAAE,OAAO,CAAC;CACvB;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAMnE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,GACnB,MAAM,GAAG,SAAS,CAMpB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC,CAMpD;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAY7B;AAED;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,eAAe,CAAC,CASnE;AAED;;GAEG;AACH,qBAAa,cAAe,SAAQ,KAAK;gBAC3B,OAAO,EAAE,MAAM;CAI5B"}
1
+ {"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../../src/cli/preflight.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,mDAAmD;IACnD,YAAY,EAAE,OAAO,CAAC;IACtB,+DAA+D;IAC/D,mBAAmB,EAAE,OAAO,CAAC;CAC9B;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAMnE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,GACnB,MAAM,GAAG,SAAS,CAMpB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC,CAMpD;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,IAAI,OAAO,CAAC,OAAO,CAAC,CAM3D;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAY7B;AAED;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,eAAe,CAAC,CAYnE;AAED;;GAEG;AACH,qBAAa,cAAe,SAAQ,KAAK;gBAC3B,OAAO,EAAE,MAAM;CAI5B"}
@@ -35,6 +35,17 @@ export function checkGitAvailable() {
35
35
  });
36
36
  });
37
37
  }
38
+ /**
39
+ * Checks whether Claude Code CLI is available by running `claude --version`.
40
+ * Resolves to true if Claude Code is found, false otherwise.
41
+ */
42
+ export function checkClaudeCodeAvailable() {
43
+ return new Promise((promiseResolve) => {
44
+ execFile("claude", ["--version"], (error) => {
45
+ promiseResolve(error === null);
46
+ });
47
+ });
48
+ }
38
49
  /**
39
50
  * Checks whether the parent directory of the given output path exists and is writable.
40
51
  * Returns an error message string if the check fails, or undefined if OK.
@@ -64,8 +75,11 @@ export async function runPreflightChecks() {
64
75
  if (nodeError !== undefined) {
65
76
  throw new PreflightError(nodeError);
66
77
  }
67
- const gitAvailable = await checkGitAvailable();
68
- return { gitAvailable };
78
+ const [gitAvailable, claudeCodeAvailable] = await Promise.all([
79
+ checkGitAvailable(),
80
+ checkClaudeCodeAvailable(),
81
+ ]);
82
+ return { gitAvailable, claudeCodeAvailable };
69
83
  }
70
84
  /**
71
85
  * Error thrown when a blocking pre-flight check fails.
@@ -1 +1 @@
1
- {"version":3,"file":"preflight.js","sourceRoot":"","sources":["../../src/cli/preflight.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAU7C;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,aAAqB;IACzD,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC5C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,GAAG,CAAC;IACb,CAAC;IACD,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAChC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAC9B,aAAqB,EACrB,YAAoB;IAEpB,MAAM,KAAK,GAAG,qBAAqB,CAAC,aAAa,CAAC,CAAC;IACnD,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,YAAY,EAAE,CAAC;QAChD,OAAO,yBAAyB,YAAY,8BAA8B,aAAa,GAAG,CAAC;IAC7F,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,IAAI,OAAO,CAAC,CAAC,cAAc,EAAE,EAAE;QACpC,QAAQ,CAAC,KAAK,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE;YACvC,cAAc,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,UAAkB;IAElB,MAAM,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAExC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QACxC,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,MAAM,GACV,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC;QAC3D,OAAO,mBAAmB,YAAY,KAAK,MAAM,EAAE,CAAC;IACtD,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,MAAM,SAAS,GAAG,gBAAgB,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACxD,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,MAAM,IAAI,cAAc,CAAC,SAAS,CAAC,CAAC;IACtC,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,iBAAiB,EAAE,CAAC;IAE/C,OAAO,EAAE,YAAY,EAAE,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,cAAe,SAAQ,KAAK;IACvC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF"}
1
+ {"version":3,"file":"preflight.js","sourceRoot":"","sources":["../../src/cli/preflight.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,33 @@
1
1
  import type { ProjectBrief } from "./types.js";
2
+ /**
3
+ * Options for controlling the prompt flow.
4
+ */
5
+ export interface CollectBriefOptions {
6
+ /** When true, skips deep content prompts (AI will generate those). */
7
+ useAI?: boolean;
8
+ }
9
+ /**
10
+ * Deep content fields collected from the user when AI is not used.
11
+ */
12
+ export interface DeepContentFields {
13
+ problemStatement: string;
14
+ successCriteria: string;
15
+ valueProposition: string;
16
+ outOfScope: string;
17
+ codeConventions: string;
18
+ }
19
+ /**
20
+ * Collects the deep content prompts (problem statement, success criteria,
21
+ * value proposition, out of scope, code conventions).
22
+ * Called during the normal static flow, or as a fallback when AI generation fails.
23
+ */
24
+ export declare function collectDeepContent(): Promise<DeepContentFields>;
2
25
  /**
3
26
  * Collects the project brief from the user via interactive prompts.
27
+ * When `options.useAI` is true, skips the deep content prompts (problem statement,
28
+ * success criteria, value proposition, out of scope, code conventions) because
29
+ * the AI generator will produce those.
4
30
  * Returns the completed brief. Exits the process if the user cancels.
5
31
  */
6
- export declare function collectProjectBrief(): Promise<ProjectBrief>;
32
+ export declare function collectProjectBrief(options?: CollectBriefOptions): Promise<ProjectBrief>;
7
33
  //# sourceMappingURL=prompts.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/cli/prompts.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAa,MAAM,YAAY,CAAC;AAoC1D;;;GAGG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,YAAY,CAAC,CA4HjE"}
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/cli/prompts.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAa,MAAM,YAAY,CAAC;AAoC1D;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,sEAAsE;IACtE,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;CACzB;AAMD;;;;GAIG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,iBAAiB,CAAC,CA2CrE;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,YAAY,CAAC,CAmGvB"}
@@ -30,11 +30,60 @@ function handleCancel(value) {
30
30
  process.exit(0);
31
31
  }
32
32
  }
33
+ const DEFAULT_DEFERRED = "To be defined by @meto-pm";
34
+ const DEFAULT_CONVENTIONS = "TypeScript strict mode, no any types, no console.log in production code";
35
+ /**
36
+ * Collects the deep content prompts (problem statement, success criteria,
37
+ * value proposition, out of scope, code conventions).
38
+ * Called during the normal static flow, or as a fallback when AI generation fails.
39
+ */
40
+ export async function collectDeepContent() {
41
+ const problemInput = await p.text({
42
+ message: "What problem does this project solve?",
43
+ placeholder: "Users struggle with X because Y, leading to Z",
44
+ defaultValue: DEFAULT_DEFERRED,
45
+ });
46
+ handleCancel(problemInput);
47
+ const criteriaInput = await p.text({
48
+ message: "How will you measure success?",
49
+ placeholder: "User can do X in under Y minutes, Z% adoption in first month",
50
+ defaultValue: DEFAULT_DEFERRED,
51
+ });
52
+ handleCancel(criteriaInput);
53
+ const valueInput = await p.text({
54
+ message: "What is the core value proposition? (one line)",
55
+ placeholder: "The fastest way to do X without compromising on Y",
56
+ defaultValue: DEFAULT_DEFERRED,
57
+ });
58
+ handleCancel(valueInput);
59
+ const scopeInput = await p.text({
60
+ message: "What is out of scope for v1?",
61
+ placeholder: "Multi-tenancy, mobile app, internationalization",
62
+ defaultValue: DEFAULT_DEFERRED,
63
+ });
64
+ handleCancel(scopeInput);
65
+ const conventionsInput = await p.text({
66
+ message: "Any code conventions or standards?",
67
+ placeholder: "TypeScript strict, ESLint, Prettier, conventional commits",
68
+ defaultValue: DEFAULT_CONVENTIONS,
69
+ });
70
+ handleCancel(conventionsInput);
71
+ return {
72
+ problemStatement: problemInput.trim(),
73
+ successCriteria: criteriaInput.trim(),
74
+ valueProposition: valueInput.trim(),
75
+ outOfScope: scopeInput.trim(),
76
+ codeConventions: conventionsInput.trim(),
77
+ };
78
+ }
33
79
  /**
34
80
  * Collects the project brief from the user via interactive prompts.
81
+ * When `options.useAI` is true, skips the deep content prompts (problem statement,
82
+ * success criteria, value proposition, out of scope, code conventions) because
83
+ * the AI generator will produce those.
35
84
  * Returns the completed brief. Exits the process if the user cancels.
36
85
  */
37
- export async function collectProjectBrief() {
86
+ export async function collectProjectBrief(options = {}) {
38
87
  const projectName = await p.text({
39
88
  message: "What is your project name?",
40
89
  placeholder: "my-awesome-project",
@@ -92,38 +141,19 @@ export async function collectProjectBrief() {
92
141
  handleCancel(customStackInput);
93
142
  customStack = customStackInput.trim();
94
143
  }
95
- const defaultDeferred = "To be defined by @meto-pm";
96
- const problemStatement = await p.text({
97
- message: "What problem does this project solve?",
98
- placeholder: "Users struggle with X because Y, leading to Z",
99
- defaultValue: defaultDeferred,
100
- });
101
- handleCancel(problemStatement);
102
- const successCriteria = await p.text({
103
- message: "How will you measure success?",
104
- placeholder: "User can do X in under Y minutes, Z% adoption in first month",
105
- defaultValue: defaultDeferred,
106
- });
107
- handleCancel(successCriteria);
108
- const valueProposition = await p.text({
109
- message: "What is the core value proposition? (one line)",
110
- placeholder: "The fastest way to do X without compromising on Y",
111
- defaultValue: defaultDeferred,
112
- });
113
- handleCancel(valueProposition);
114
- const outOfScope = await p.text({
115
- message: "What is out of scope for v1?",
116
- placeholder: "Multi-tenancy, mobile app, internationalization",
117
- defaultValue: defaultDeferred,
118
- });
119
- handleCancel(outOfScope);
120
- const defaultConventions = "TypeScript strict mode, no any types, no console.log in production code";
121
- const codeConventions = await p.text({
122
- message: "Any code conventions or standards?",
123
- placeholder: "TypeScript strict, ESLint, Prettier, conventional commits",
124
- defaultValue: defaultConventions,
125
- });
126
- handleCancel(codeConventions);
144
+ let problemStatement = DEFAULT_DEFERRED;
145
+ let successCriteria = DEFAULT_DEFERRED;
146
+ let valueProposition = DEFAULT_DEFERRED;
147
+ let outOfScope = DEFAULT_DEFERRED;
148
+ let codeConventions = DEFAULT_CONVENTIONS;
149
+ if (!options.useAI) {
150
+ const deep = await collectDeepContent();
151
+ problemStatement = deep.problemStatement;
152
+ successCriteria = deep.successCriteria;
153
+ valueProposition = deep.valueProposition;
154
+ outOfScope = deep.outOfScope;
155
+ codeConventions = deep.codeConventions;
156
+ }
127
157
  const outputDirectory = await p.text({
128
158
  message: "Output directory?",
129
159
  defaultValue: `./${projectName}`,
@@ -137,11 +167,11 @@ export async function collectProjectBrief() {
137
167
  targetUsers: targetUsers.trim(),
138
168
  techStack,
139
169
  customStack,
140
- problemStatement: problemStatement.trim(),
141
- successCriteria: successCriteria.trim(),
142
- valueProposition: valueProposition.trim(),
143
- outOfScope: outOfScope.trim(),
144
- codeConventions: codeConventions.trim(),
170
+ problemStatement,
171
+ successCriteria,
172
+ valueProposition,
173
+ outOfScope,
174
+ codeConventions,
145
175
  outputDirectory: outputDirectory.trim(),
146
176
  };
147
177
  }
@@ -1 +1 @@
1
- {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/cli/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AAGpC;;GAEG;AACH,SAAS,eAAe,CAAC,KAAa;IACpC,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,yBAAyB,CAAC;IACnC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,KAAa;IACxC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,2BAA2B,CAAC;IACrC,CAAC;IACD,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1C,OAAO,qEAAqE,CAAC;IAC/E,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACtB,CAAC,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAC;QACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC;QAC/B,OAAO,EAAE,4BAA4B;QACrC,WAAW,EAAE,oBAAoB;QACjC,QAAQ,EAAE,mBAAmB;KAC9B,CAAC,CAAC;IACH,YAAY,CAAC,WAAW,CAAC,CAAC;IAE1B,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC;QAC/B,OAAO,EAAE,oCAAoC;QAC7C,WAAW,EAAE,wCAAwC;QACrD,QAAQ,EAAE,eAAe;KAC1B,CAAC,CAAC;IACH,YAAY,CAAC,WAAW,CAAC,CAAC;IAE1B,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC;QAC/B,OAAO,EAAE,2BAA2B;QACpC,WAAW,EAAE,sCAAsC;QACnD,QAAQ,EAAE,eAAe;KAC1B,CAAC,CAAC;IACH,YAAY,CAAC,WAAW,CAAC,CAAC;IAE1B,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,MAAM,CAAY;QAC1C,OAAO,EAAE,sBAAsB;QAC/B,OAAO,EAAE;YACP;gBACE,KAAK,EAAE,iBAAiB;gBACxB,KAAK,EAAE,oBAAoB;gBAC3B,IAAI,EAAE,4DAA4D;aACnE;YACD;gBACE,KAAK,EAAE,cAAc;gBACrB,KAAK,EAAE,cAAc;gBACrB,IAAI,EAAE,2BAA2B;aAClC;YACD;gBACE,KAAK,EAAE,YAAY;gBACnB,KAAK,EAAE,aAAa;gBACpB,IAAI,EAAE,uCAAuC;aAC9C;YACD;gBACE,KAAK,EAAE,QAAQ;gBACf,KAAK,EAAE,QAAQ;gBACf,IAAI,EAAE,yBAAyB;aAChC;SACF;KACF,CAAC,CAAC;IACH,IAAI,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1B,CAAC,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAC;QACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,WAA+B,CAAC;IACpC,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;QAC3B,MAAM,gBAAgB,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC;YACpC,OAAO,EAAE,2BAA2B;YACpC,WAAW,EAAE,sCAAsC;YACnD,QAAQ,EAAE,eAAe;SAC1B,CAAC,CAAC;QACH,YAAY,CAAC,gBAAgB,CAAC,CAAC;QAC/B,WAAW,GAAG,gBAAgB,CAAC,IAAI,EAAE,CAAC;IACxC,CAAC;IAED,MAAM,eAAe,GAAG,2BAA2B,CAAC;IAEpD,MAAM,gBAAgB,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC;QACpC,OAAO,EAAE,uCAAuC;QAChD,WAAW,EAAE,+CAA+C;QAC5D,YAAY,EAAE,eAAe;KAC9B,CAAC,CAAC;IACH,YAAY,CAAC,gBAAgB,CAAC,CAAC;IAE/B,MAAM,eAAe,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC;QACnC,OAAO,EAAE,+BAA+B;QACxC,WAAW,EAAE,8DAA8D;QAC3E,YAAY,EAAE,eAAe;KAC9B,CAAC,CAAC;IACH,YAAY,CAAC,eAAe,CAAC,CAAC;IAE9B,MAAM,gBAAgB,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC;QACpC,OAAO,EAAE,gDAAgD;QACzD,WAAW,EAAE,mDAAmD;QAChE,YAAY,EAAE,eAAe;KAC9B,CAAC,CAAC;IACH,YAAY,CAAC,gBAAgB,CAAC,CAAC;IAE/B,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC;QAC9B,OAAO,EAAE,8BAA8B;QACvC,WAAW,EAAE,iDAAiD;QAC9D,YAAY,EAAE,eAAe;KAC9B,CAAC,CAAC;IACH,YAAY,CAAC,UAAU,CAAC,CAAC;IAEzB,MAAM,kBAAkB,GACtB,yEAAyE,CAAC;IAE5E,MAAM,eAAe,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC;QACnC,OAAO,EAAE,oCAAoC;QAC7C,WAAW,EAAE,2DAA2D;QACxE,YAAY,EAAE,kBAAkB;KACjC,CAAC,CAAC;IACH,YAAY,CAAC,eAAe,CAAC,CAAC;IAE9B,MAAM,eAAe,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC;QACnC,OAAO,EAAE,mBAAmB;QAC5B,YAAY,EAAE,KAAK,WAAW,EAAE;QAChC,WAAW,EAAE,KAAK,WAAW,EAAE;QAC/B,QAAQ,EAAE,eAAe;KAC1B,CAAC,CAAC;IACH,YAAY,CAAC,eAAe,CAAC,CAAC;IAE9B,OAAO;QACL,WAAW,EAAE,WAAW,CAAC,IAAI,EAAE;QAC/B,WAAW,EAAE,WAAW,CAAC,IAAI,EAAE;QAC/B,WAAW,EAAE,WAAW,CAAC,IAAI,EAAE;QAC/B,SAAS;QACT,WAAW;QACX,gBAAgB,EAAE,gBAAgB,CAAC,IAAI,EAAE;QACzC,eAAe,EAAE,eAAe,CAAC,IAAI,EAAE;QACvC,gBAAgB,EAAE,gBAAgB,CAAC,IAAI,EAAE;QACzC,UAAU,EAAE,UAAU,CAAC,IAAI,EAAE;QAC7B,eAAe,EAAE,eAAe,CAAC,IAAI,EAAE;QACvC,eAAe,EAAE,eAAe,CAAC,IAAI,EAAE;KACxC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/cli/prompts.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import type { ProjectBrief } from "./types.js";
2
+ import type { AIGeneratedContent } from "./ai-parser.js";
2
3
  /**
3
4
  * Map of template tokens to their replacement values.
4
5
  * Tokens in templates look like {{TOKEN_NAME}}.
@@ -15,11 +16,12 @@ export interface RenderedFile {
15
16
  }
16
17
  /**
17
18
  * Builds a token replacement map from the project brief.
18
- * Only tokens that the brief can fill are included.
19
- * Remaining tokens (e.g. {{PROBLEM_STATEMENT}}) are left as-is
20
- * for the PM agent to populate later.
19
+ * When AI-generated content is provided, it overrides the brief's static fields
20
+ * for PRODUCT_VISION, PROBLEM_STATEMENT, SUCCESS_CRITERIA, VALUE_PROPOSITION,
21
+ * OUT_OF_SCOPE, DEFINITION_OF_DONE, STARTER_EPICS, and STARTER_TASKS.
22
+ * PROJECT_NAME, TARGET_USERS, TECH_STACK, and CODE_CONVENTIONS always come from the brief.
21
23
  */
22
- export declare function buildTokenMap(brief: ProjectBrief): TokenMap;
24
+ export declare function buildTokenMap(brief: ProjectBrief, aiContent?: AIGeneratedContent): TokenMap;
23
25
  /**
24
26
  * Replaces all `{{TOKEN}}` occurrences in content using the provided map.
25
27
  * Tokens not present in the map are left untouched.
@@ -1 +1 @@
1
- {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/cli/renderer.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE9C;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,sEAAsE;IACtE,YAAY,EAAE,MAAM,CAAC;IACrB,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,YAAY,GAAG,QAAQ,CAkB3D;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,MAAM,CAOvE;AAqDD;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAK5C;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CACnC,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,QAAQ,GACf,OAAO,CAAC,YAAY,EAAE,CAAC,CAgBzB"}
1
+ {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/cli/renderer.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEzD;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE9C;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,sEAAsE;IACtE,YAAY,EAAE,MAAM,CAAC;IACrB,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,YAAY,EACnB,SAAS,CAAC,EAAE,kBAAkB,GAC7B,QAAQ,CAoCV;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,MAAM,CAOvE;AAqDD;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAK5C;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CACnC,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,QAAQ,GACf,OAAO,CAAC,YAAY,EAAE,CAAC,CAgBzB"}
@@ -3,11 +3,28 @@ import { basename, dirname, join, relative } from "node:path";
3
3
  import { getDefinitionOfDone, getStackDescription, getStarterEpics, } from "./stacks.js";
4
4
  /**
5
5
  * Builds a token replacement map from the project brief.
6
- * Only tokens that the brief can fill are included.
7
- * Remaining tokens (e.g. {{PROBLEM_STATEMENT}}) are left as-is
8
- * for the PM agent to populate later.
6
+ * When AI-generated content is provided, it overrides the brief's static fields
7
+ * for PRODUCT_VISION, PROBLEM_STATEMENT, SUCCESS_CRITERIA, VALUE_PROPOSITION,
8
+ * OUT_OF_SCOPE, DEFINITION_OF_DONE, STARTER_EPICS, and STARTER_TASKS.
9
+ * PROJECT_NAME, TARGET_USERS, TECH_STACK, and CODE_CONVENTIONS always come from the brief.
9
10
  */
10
- export function buildTokenMap(brief) {
11
+ export function buildTokenMap(brief, aiContent) {
12
+ if (aiContent !== undefined) {
13
+ return {
14
+ PROJECT_NAME: brief.projectName,
15
+ PRODUCT_VISION: aiContent.productVision,
16
+ TECH_STACK: getStackDescription(brief.techStack, brief.customStack),
17
+ TARGET_USERS: brief.targetUsers,
18
+ PROBLEM_STATEMENT: aiContent.problemStatement,
19
+ SUCCESS_CRITERIA: aiContent.successCriteria,
20
+ VALUE_PROPOSITION: aiContent.valueProposition,
21
+ OUT_OF_SCOPE: aiContent.outOfScope,
22
+ CODE_CONVENTIONS: brief.codeConventions,
23
+ DEFINITION_OF_DONE: aiContent.definitionOfDone,
24
+ STARTER_EPICS: aiContent.epics,
25
+ STARTER_TASKS: aiContent.starterTasks,
26
+ };
27
+ }
11
28
  return {
12
29
  PROJECT_NAME: brief.projectName,
13
30
  PRODUCT_VISION: brief.description,
@@ -20,6 +37,7 @@ export function buildTokenMap(brief) {
20
37
  CODE_CONVENTIONS: brief.codeConventions,
21
38
  DEFINITION_OF_DONE: getDefinitionOfDone(brief.techStack, brief.customStack),
22
39
  STARTER_EPICS: getStarterEpics(brief.techStack, brief.projectName, brief.customStack),
40
+ STARTER_TASKS: "",
23
41
  };
24
42
  }
25
43
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../src/cli/renderer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../src/cli/renderer.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "meto-cli",
3
- "version": "0.1.4",
3
+ "version": "0.4.0",
4
4
  "description": "Scaffold structured software projects with built-in methodology",
5
5
  "type": "module",
6
6
  "bin": {
@@ -29,6 +29,12 @@ Update `.claude/agent-memory/meto-developer/MEMORY.md` with anything worth remem
29
29
  - Add features not in the acceptance criteria
30
30
  - Commit with `console.log`, `any` types, or commented-out code
31
31
 
32
+ ## Parallel Operation
33
+ When running as a teammate: you read CLAUDE.md and this file fresh -- you do NOT have the lead's conversation history.
34
+ Only write files listed under "What I Own".
35
+ When a task is ready for testing, message @meto-tester directly (e.g., "tell @meto-tester slice-X is in testing").
36
+ Never write to `/ai/backlog/`, `/ai/context/`, `tasks-backlog.md`, `tasks-todo.md`, or `tasks-done.md`.
37
+
32
38
  ## Task Pickup Protocol
33
39
  1. Read `tasks-todo.md` — take TOP item
34
40
  2. Copy full task block to `tasks-in-progress.md`, add `Started: [date]`
@@ -38,6 +38,12 @@ If `/ai/backlog/epics.md` has no real epics yet:
38
38
  - Make technical architecture decisions
39
39
  - Run bash commands
40
40
 
41
+ ## Parallel Operation
42
+ When running as a teammate: you read CLAUDE.md and this file fresh -- you do NOT have the lead's conversation history.
43
+ Only write files listed under "What I Own".
44
+ If you need developer or tester action, message them directly (e.g., "tell @meto-developer the backlog is ready").
45
+ Never write to `/src/`, `tasks-in-progress.md`, `tasks-in-testing.md`, or `tasks-done.md`.
46
+
41
47
  ## Task Definition Format
42
48
 
43
49
  ```markdown
@@ -28,6 +28,13 @@ Update `.claude/agent-memory/meto-tester/MEMORY.md` with patterns worth remember
28
28
  - Process items in parallel — always sequential
29
29
  - Skip any validation check
30
30
 
31
+ ## Parallel Operation
32
+ When running as a teammate: you read CLAUDE.md and this file fresh -- you do NOT have the lead's conversation history.
33
+ Only write files listed under "What I Own".
34
+ When validation is complete, message the lead or @meto-developer directly with the result.
35
+ Never write to `/src/`, `/ai/backlog/`, `/ai/context/`, `tasks-backlog.md`, or `tasks-in-progress.md`.
36
+ Process items sequentially even when other agents run in parallel.
37
+
31
38
  ## Validation Protocol
32
39
  ONE item at a time — parallel writes corrupt the board. Always sequential.
33
40
 
@@ -0,0 +1,5 @@
1
+ {
2
+ "env": {
3
+ "CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS": "1"
4
+ }
5
+ }
@@ -44,6 +44,26 @@ See `/ai/workflows/definition-of-done.md` for done criteria.
44
44
 
45
45
  ---
46
46
 
47
+ ## Agent Teams
48
+
49
+ This project supports Agent Teams. The lead agent can spawn teammates using `@meto-pm`, `@meto-developer`, `@meto-tester`.
50
+
51
+ **Coordination model:** Agent Teams has its own task system, but this project uses the kanban board (`tasks-backlog` through `tasks-done`) as the single source of truth for task state. Teammates must read and update the board files, not rely on Agent Teams' internal task tracking.
52
+
53
+ **File ownership is exclusive -- two teammates editing the same file causes overwrites.**
54
+
55
+ | Agent | Writes |
56
+ |---|---|
57
+ | `@meto-pm` | `/ai/` files, `tasks-backlog.md`, `tasks-todo.md` |
58
+ | `@meto-developer` | `/src/`, config files, `tasks-in-progress.md`, `tasks-in-testing.md` |
59
+ | `@meto-tester` | `tasks-in-testing.md`, `tasks-done.md`, `tasks-todo.md` (failed items) |
60
+
61
+ Each agent writes only its own memory file in `.claude/agent-memory/` -- never another agent's.
62
+
63
+ Teammates do NOT inherit the lead's conversation history. Each teammate reads CLAUDE.md and its agent definition fresh.
64
+
65
+ ---
66
+
47
67
  ## Commit Format
48
68
 
49
69
  ```
@@ -1 +1,3 @@
1
1
  # Tasks Backlog
2
+
3
+ {{STARTER_TASKS}}