meto-cli 0.1.5 → 0.6.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/dist/cli/ai-generator.d.ts +57 -0
- package/dist/cli/ai-generator.d.ts.map +1 -0
- package/dist/cli/ai-generator.js +172 -0
- package/dist/cli/ai-generator.js.map +1 -0
- package/dist/cli/ai-parser.d.ts +57 -0
- package/dist/cli/ai-parser.d.ts.map +1 -0
- package/dist/cli/ai-parser.js +146 -0
- package/dist/cli/ai-parser.js.map +1 -0
- package/dist/cli/index.js +92 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/preflight.d.ts +7 -0
- package/dist/cli/preflight.d.ts.map +1 -1
- package/dist/cli/preflight.js +16 -2
- package/dist/cli/preflight.js.map +1 -1
- package/dist/cli/prompts.d.ts +27 -1
- package/dist/cli/prompts.d.ts.map +1 -1
- package/dist/cli/prompts.js +88 -38
- package/dist/cli/prompts.js.map +1 -1
- package/dist/cli/renderer.d.ts +6 -4
- package/dist/cli/renderer.d.ts.map +1 -1
- package/dist/cli/renderer.js +22 -4
- package/dist/cli/renderer.js.map +1 -1
- package/dist/cli/stacks.d.ts.map +1 -1
- package/dist/cli/stacks.js +248 -0
- package/dist/cli/stacks.js.map +1 -1
- package/dist/cli/types.d.ts +1 -1
- package/dist/cli/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/templates/ai/tasks/tasks-backlog.md +2 -0
package/dist/cli/preflight.js
CHANGED
|
@@ -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
|
|
68
|
-
|
|
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;
|
|
1
|
+
{"version":3,"file":"preflight.js","sourceRoot":"","sources":["../../src/cli/preflight.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/prompts.d.ts
CHANGED
|
@@ -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
|
|
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,CAuHvB"}
|
package/dist/cli/prompts.js
CHANGED
|
@@ -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",
|
|
@@ -71,6 +120,26 @@ export async function collectProjectBrief() {
|
|
|
71
120
|
label: "Node.js CLI",
|
|
72
121
|
hint: "Command-line tool distributed via npm",
|
|
73
122
|
},
|
|
123
|
+
{
|
|
124
|
+
value: "python-fastapi",
|
|
125
|
+
label: "Python (FastAPI)",
|
|
126
|
+
hint: "REST API with async support, auto-generated docs",
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
value: "go",
|
|
130
|
+
label: "Go",
|
|
131
|
+
hint: "Compiled backend service or CLI tool",
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
value: "vite-react",
|
|
135
|
+
label: "Vite + React",
|
|
136
|
+
hint: "Client-side SPA with fast dev server",
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
value: "flutter",
|
|
140
|
+
label: "Flutter",
|
|
141
|
+
hint: "Cross-platform mobile and web app with Dart",
|
|
142
|
+
},
|
|
74
143
|
{
|
|
75
144
|
value: "custom",
|
|
76
145
|
label: "Custom",
|
|
@@ -92,38 +161,19 @@ export async function collectProjectBrief() {
|
|
|
92
161
|
handleCancel(customStackInput);
|
|
93
162
|
customStack = customStackInput.trim();
|
|
94
163
|
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
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);
|
|
164
|
+
let problemStatement = DEFAULT_DEFERRED;
|
|
165
|
+
let successCriteria = DEFAULT_DEFERRED;
|
|
166
|
+
let valueProposition = DEFAULT_DEFERRED;
|
|
167
|
+
let outOfScope = DEFAULT_DEFERRED;
|
|
168
|
+
let codeConventions = DEFAULT_CONVENTIONS;
|
|
169
|
+
if (!options.useAI) {
|
|
170
|
+
const deep = await collectDeepContent();
|
|
171
|
+
problemStatement = deep.problemStatement;
|
|
172
|
+
successCriteria = deep.successCriteria;
|
|
173
|
+
valueProposition = deep.valueProposition;
|
|
174
|
+
outOfScope = deep.outOfScope;
|
|
175
|
+
codeConventions = deep.codeConventions;
|
|
176
|
+
}
|
|
127
177
|
const outputDirectory = await p.text({
|
|
128
178
|
message: "Output directory?",
|
|
129
179
|
defaultValue: `./${projectName}`,
|
|
@@ -137,11 +187,11 @@ export async function collectProjectBrief() {
|
|
|
137
187
|
targetUsers: targetUsers.trim(),
|
|
138
188
|
techStack,
|
|
139
189
|
customStack,
|
|
140
|
-
problemStatement
|
|
141
|
-
successCriteria
|
|
142
|
-
valueProposition
|
|
143
|
-
outOfScope
|
|
144
|
-
codeConventions
|
|
190
|
+
problemStatement,
|
|
191
|
+
successCriteria,
|
|
192
|
+
valueProposition,
|
|
193
|
+
outOfScope,
|
|
194
|
+
codeConventions,
|
|
145
195
|
outputDirectory: outputDirectory.trim(),
|
|
146
196
|
};
|
|
147
197
|
}
|
package/dist/cli/prompts.js.map
CHANGED
|
@@ -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
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/cli/prompts.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/renderer.d.ts
CHANGED
|
@@ -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
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
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;
|
|
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"}
|
package/dist/cli/renderer.js
CHANGED
|
@@ -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
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
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
|
/**
|
package/dist/cli/renderer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../src/cli/renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC9D,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,eAAe,GAChB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../src/cli/renderer.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/stacks.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stacks.d.ts","sourceRoot":"","sources":["../../src/cli/stacks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"stacks.d.ts","sourceRoot":"","sources":["../../src/cli/stacks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AA6f5C;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,SAAS,EAChB,WAAW,CAAC,EAAE,MAAM,GACnB,MAAM,CAOR;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,SAAS,EAChB,WAAW,CAAC,EAAE,MAAM,GACnB,MAAM,CAQR;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,SAAS,EAChB,WAAW,EAAE,MAAM,EACnB,WAAW,CAAC,EAAE,MAAM,GACnB,MAAM,CAYR"}
|
package/dist/cli/stacks.js
CHANGED
|
@@ -44,10 +44,77 @@ const NODEJS_CLI_DESCRIPTION = `## Stack Overview
|
|
|
44
44
|
## Key Libraries
|
|
45
45
|
- **commander or yargs** -- argument parsing (if needed)
|
|
46
46
|
- **vitest** -- fast TypeScript-native testing`;
|
|
47
|
+
/**
|
|
48
|
+
* Structured description for the Python (FastAPI) stack.
|
|
49
|
+
*/
|
|
50
|
+
const PYTHON_FASTAPI_DESCRIPTION = `## Stack Overview
|
|
51
|
+
|
|
52
|
+
| Layer | Choice | Reason |
|
|
53
|
+
|---|---|---|
|
|
54
|
+
| Runtime | Python 3.11+ | Modern async support, type hints, broad ecosystem |
|
|
55
|
+
| Framework | FastAPI | High-performance async framework with auto-generated docs |
|
|
56
|
+
| Database | PostgreSQL or SQLite | Robust relational database with strong Python driver support |
|
|
57
|
+
| ORM | SQLAlchemy or Tortoise | Mature ORM with migration support and async capabilities |
|
|
58
|
+
| Docs | Auto-generated OpenAPI/Swagger | Interactive API docs available at /docs out of the box |
|
|
59
|
+
|
|
60
|
+
## Key Libraries
|
|
61
|
+
- **Pydantic** -- data validation and serialization
|
|
62
|
+
- **Alembic** -- database migration management`;
|
|
63
|
+
/**
|
|
64
|
+
* Structured description for the Go stack.
|
|
65
|
+
*/
|
|
66
|
+
const GO_DESCRIPTION = `## Stack Overview
|
|
67
|
+
|
|
68
|
+
| Layer | Choice | Reason |
|
|
69
|
+
|---|---|---|
|
|
70
|
+
| Language | Go 1.22+ | Fast compilation, built-in concurrency, single binary output |
|
|
71
|
+
| HTTP | net/http or Chi/Gin | Standard library or lightweight router depending on complexity |
|
|
72
|
+
| Database | PostgreSQL via pgx or GORM | High-performance driver or full ORM for rapid development |
|
|
73
|
+
| Testing | Built-in testing package | No external framework needed, benchmarks included |
|
|
74
|
+
|
|
75
|
+
## Key Libraries
|
|
76
|
+
- **slog** -- structured logging (stdlib)
|
|
77
|
+
- **cobra** -- CLI argument parsing (if building a CLI)`;
|
|
78
|
+
/**
|
|
79
|
+
* Structured description for the Vite + React stack.
|
|
80
|
+
*/
|
|
81
|
+
const VITE_REACT_DESCRIPTION = `## Stack Overview
|
|
82
|
+
|
|
83
|
+
| Layer | Choice | Reason |
|
|
84
|
+
|---|---|---|
|
|
85
|
+
| Build | Vite | Lightning-fast HMR and optimized production builds |
|
|
86
|
+
| UI | React 18+ | Component-based UI with concurrent rendering support |
|
|
87
|
+
| Styling | Tailwind CSS or CSS Modules | Utility-first styling or scoped CSS depending on preference |
|
|
88
|
+
| Routing | React Router | Declarative routing with nested layouts and data loading |
|
|
89
|
+
| State | Zustand or Redux Toolkit | Lightweight or full-featured state management |
|
|
90
|
+
|
|
91
|
+
## Key Libraries
|
|
92
|
+
- **TypeScript** -- strict mode throughout
|
|
93
|
+
- **Vitest** -- fast Vite-native testing`;
|
|
94
|
+
/**
|
|
95
|
+
* Structured description for the Flutter stack.
|
|
96
|
+
*/
|
|
97
|
+
const FLUTTER_DESCRIPTION = `## Stack Overview
|
|
98
|
+
|
|
99
|
+
| Layer | Choice | Reason |
|
|
100
|
+
|---|---|---|
|
|
101
|
+
| Language | Dart | Optimized for UI development with hot reload |
|
|
102
|
+
| UI | Flutter widgets | Rich widget library for iOS, Android, and web |
|
|
103
|
+
| State | Riverpod or Bloc | Reactive state management with compile-time safety |
|
|
104
|
+
| Backend | Firebase or custom API | Serverless backend or connect to any REST/GraphQL API |
|
|
105
|
+
| Testing | Flutter test framework | Widget tests, unit tests, and integration tests built-in |
|
|
106
|
+
|
|
107
|
+
## Key Libraries
|
|
108
|
+
- **GoRouter** -- declarative routing with deep link support
|
|
109
|
+
- **freezed** -- immutable data classes with union types`;
|
|
47
110
|
const STACK_DESCRIPTIONS = {
|
|
48
111
|
"nextjs-supabase": NEXTJS_SUPABASE_DESCRIPTION,
|
|
49
112
|
"react-native": REACT_NATIVE_DESCRIPTION,
|
|
50
113
|
"nodejs-cli": NODEJS_CLI_DESCRIPTION,
|
|
114
|
+
"python-fastapi": PYTHON_FASTAPI_DESCRIPTION,
|
|
115
|
+
"go": GO_DESCRIPTION,
|
|
116
|
+
"vite-react": VITE_REACT_DESCRIPTION,
|
|
117
|
+
"flutter": FLUTTER_DESCRIPTION,
|
|
51
118
|
};
|
|
52
119
|
/**
|
|
53
120
|
* Definition of Done criteria for the Next.js + Supabase stack.
|
|
@@ -109,10 +176,75 @@ const CUSTOM_STACK_DOD = `## Universal Checks
|
|
|
109
176
|
|
|
110
177
|
## Stack-Specific Checks
|
|
111
178
|
*Add stack-specific checks here based on your chosen technology.*`;
|
|
179
|
+
/**
|
|
180
|
+
* Definition of Done criteria for the Python (FastAPI) stack.
|
|
181
|
+
*/
|
|
182
|
+
const PYTHON_FASTAPI_DOD = `## Universal Checks
|
|
183
|
+
- [ ] mypy type checking passes with no errors
|
|
184
|
+
- [ ] No \`print()\` statements in committed code
|
|
185
|
+
- [ ] No commented-out code in committed files
|
|
186
|
+
- [ ] Error states handled (proper HTTP error responses)
|
|
187
|
+
|
|
188
|
+
## Stack-Specific Checks
|
|
189
|
+
- [ ] All endpoints return proper HTTP status codes
|
|
190
|
+
- [ ] Pydantic models used for request/response validation
|
|
191
|
+
- [ ] Database migrations applied and tested locally
|
|
192
|
+
- [ ] API docs accessible at \`/docs\`
|
|
193
|
+
- [ ] Tests pass with \`pytest\``;
|
|
194
|
+
/**
|
|
195
|
+
* Definition of Done criteria for the Go stack.
|
|
196
|
+
*/
|
|
197
|
+
const GO_DOD = `## Universal Checks
|
|
198
|
+
- [ ] Code compiles with \`go build\`
|
|
199
|
+
- [ ] \`go vet\` passes with no warnings
|
|
200
|
+
- [ ] No \`fmt.Println\` in committed code
|
|
201
|
+
- [ ] No commented-out code in committed files
|
|
202
|
+
- [ ] Error states handled (no ignored error returns)
|
|
203
|
+
|
|
204
|
+
## Stack-Specific Checks
|
|
205
|
+
- [ ] \`golangci-lint\` passes
|
|
206
|
+
- [ ] Error values always checked
|
|
207
|
+
- [ ] Context propagated through handlers
|
|
208
|
+
- [ ] Tests pass with \`go test ./...\``;
|
|
209
|
+
/**
|
|
210
|
+
* Definition of Done criteria for the Vite + React stack.
|
|
211
|
+
*/
|
|
212
|
+
const VITE_REACT_DOD = `## Universal Checks
|
|
213
|
+
- [ ] TypeScript compiles with no errors (\`npx tsc --noEmit\`)
|
|
214
|
+
- [ ] No \`any\` types in changed files
|
|
215
|
+
- [ ] No \`console.log\` in committed code
|
|
216
|
+
- [ ] No commented-out code in committed files
|
|
217
|
+
- [ ] Error states handled (loading, empty, error UI)
|
|
218
|
+
|
|
219
|
+
## Stack-Specific Checks
|
|
220
|
+
- [ ] No layout shifts on load
|
|
221
|
+
- [ ] Responsive at 375px minimum
|
|
222
|
+
- [ ] Route transitions work
|
|
223
|
+
- [ ] Build succeeds with \`npm run build\`
|
|
224
|
+
- [ ] No runtime errors in browser console`;
|
|
225
|
+
/**
|
|
226
|
+
* Definition of Done criteria for the Flutter stack.
|
|
227
|
+
*/
|
|
228
|
+
const FLUTTER_DOD = `## Universal Checks
|
|
229
|
+
- [ ] \`dart analyze\` passes with no errors
|
|
230
|
+
- [ ] No \`print()\` in committed code
|
|
231
|
+
- [ ] No commented-out code in committed files
|
|
232
|
+
- [ ] Error states handled (loading, empty, error UI)
|
|
233
|
+
|
|
234
|
+
## Stack-Specific Checks
|
|
235
|
+
- [ ] Runs on iOS simulator without crash
|
|
236
|
+
- [ ] Runs on Android emulator without crash
|
|
237
|
+
- [ ] No hardcoded dimensions (use responsive sizing)
|
|
238
|
+
- [ ] Widget tests pass with \`flutter test\`
|
|
239
|
+
- [ ] Responsive across screen sizes`;
|
|
112
240
|
const STACK_DODS = {
|
|
113
241
|
"nextjs-supabase": NEXTJS_SUPABASE_DOD,
|
|
114
242
|
"react-native": REACT_NATIVE_DOD,
|
|
115
243
|
"nodejs-cli": NODEJS_CLI_DOD,
|
|
244
|
+
"python-fastapi": PYTHON_FASTAPI_DOD,
|
|
245
|
+
"go": GO_DOD,
|
|
246
|
+
"vite-react": VITE_REACT_DOD,
|
|
247
|
+
"flutter": FLUTTER_DOD,
|
|
116
248
|
};
|
|
117
249
|
/**
|
|
118
250
|
* Starter epics for the Next.js + Supabase stack.
|
|
@@ -226,10 +358,126 @@ const CUSTOM_STACK_EPICS = `## E1 -- Project Setup
|
|
|
226
358
|
**Goal:** Set up deployment pipeline and ship the first version to production.
|
|
227
359
|
**Status:** Not started
|
|
228
360
|
**Tasks:** To be sliced by @meto-pm`;
|
|
361
|
+
/**
|
|
362
|
+
* Starter epics for the Python (FastAPI) stack.
|
|
363
|
+
*/
|
|
364
|
+
const PYTHON_FASTAPI_EPICS = `## E1 -- Project Setup
|
|
365
|
+
**Goal:** Initialize the FastAPI project with virtual environment, install dependencies, and configure development tooling (mypy, pytest, linter).
|
|
366
|
+
**Status:** Not started
|
|
367
|
+
**Tasks:** To be sliced by @meto-pm
|
|
368
|
+
|
|
369
|
+
---
|
|
370
|
+
|
|
371
|
+
## E2 -- Database + Models
|
|
372
|
+
**Goal:** Set up SQLAlchemy with PostgreSQL or SQLite, define initial models, configure Alembic migrations, and create seed data.
|
|
373
|
+
**Status:** Not started
|
|
374
|
+
**Tasks:** To be sliced by @meto-pm
|
|
375
|
+
|
|
376
|
+
---
|
|
377
|
+
|
|
378
|
+
## E3 -- Core API Endpoints
|
|
379
|
+
**Goal:** Build the primary API endpoints for the application. To be defined by @meto-pm based on the product vision.
|
|
380
|
+
**Status:** Not started
|
|
381
|
+
**Tasks:** To be sliced by @meto-pm
|
|
382
|
+
|
|
383
|
+
---
|
|
384
|
+
|
|
385
|
+
## E4 -- Deploy
|
|
386
|
+
**Goal:** Containerize with Docker, configure cloud hosting, and manage environment variables for production.
|
|
387
|
+
**Status:** Not started
|
|
388
|
+
**Tasks:** To be sliced by @meto-pm`;
|
|
389
|
+
/**
|
|
390
|
+
* Starter epics for the Go stack.
|
|
391
|
+
*/
|
|
392
|
+
const GO_EPICS = `## E1 -- Project Setup
|
|
393
|
+
**Goal:** Initialize the Go module, establish directory structure, and create a Makefile with build, test, and lint targets.
|
|
394
|
+
**Status:** Not started
|
|
395
|
+
**Tasks:** To be sliced by @meto-pm
|
|
396
|
+
|
|
397
|
+
---
|
|
398
|
+
|
|
399
|
+
## E2 -- Core Service
|
|
400
|
+
**Goal:** Implement the main HTTP handler or CLI command that delivers the core value of the service.
|
|
401
|
+
**Status:** Not started
|
|
402
|
+
**Tasks:** To be sliced by @meto-pm
|
|
403
|
+
|
|
404
|
+
---
|
|
405
|
+
|
|
406
|
+
## E3 -- Testing + CI
|
|
407
|
+
**Goal:** Add unit tests, configure golangci-lint, and set up continuous integration.
|
|
408
|
+
**Status:** Not started
|
|
409
|
+
**Tasks:** To be sliced by @meto-pm
|
|
410
|
+
|
|
411
|
+
---
|
|
412
|
+
|
|
413
|
+
## E4 -- Deploy
|
|
414
|
+
**Goal:** Containerize with Docker, configure binary distribution, and set up production deployment.
|
|
415
|
+
**Status:** Not started
|
|
416
|
+
**Tasks:** To be sliced by @meto-pm`;
|
|
417
|
+
/**
|
|
418
|
+
* Starter epics for the Vite + React stack.
|
|
419
|
+
*/
|
|
420
|
+
const VITE_REACT_EPICS = `## E1 -- Project Setup
|
|
421
|
+
**Goal:** Initialize the Vite project with React, configure Tailwind CSS, set up React Router, and establish the development environment.
|
|
422
|
+
**Status:** Not started
|
|
423
|
+
**Tasks:** To be sliced by @meto-pm
|
|
424
|
+
|
|
425
|
+
---
|
|
426
|
+
|
|
427
|
+
## E2 -- Core Feature
|
|
428
|
+
**Goal:** Build the primary feature of the application. To be defined by @meto-pm based on the product vision.
|
|
429
|
+
**Status:** Not started
|
|
430
|
+
**Tasks:** To be sliced by @meto-pm
|
|
431
|
+
|
|
432
|
+
---
|
|
433
|
+
|
|
434
|
+
## E3 -- Testing
|
|
435
|
+
**Goal:** Add Vitest with React Testing Library for component and integration tests.
|
|
436
|
+
**Status:** Not started
|
|
437
|
+
**Tasks:** To be sliced by @meto-pm
|
|
438
|
+
|
|
439
|
+
---
|
|
440
|
+
|
|
441
|
+
## E4 -- Deploy
|
|
442
|
+
**Goal:** Configure static hosting, set up CI/CD pipeline, and optimize production build.
|
|
443
|
+
**Status:** Not started
|
|
444
|
+
**Tasks:** To be sliced by @meto-pm`;
|
|
445
|
+
/**
|
|
446
|
+
* Starter epics for the Flutter stack.
|
|
447
|
+
*/
|
|
448
|
+
const FLUTTER_EPICS = `## E1 -- Project Setup
|
|
449
|
+
**Goal:** Initialize the Flutter project, configure project structure, and set up the app theme and design system.
|
|
450
|
+
**Status:** Not started
|
|
451
|
+
**Tasks:** To be sliced by @meto-pm
|
|
452
|
+
|
|
453
|
+
---
|
|
454
|
+
|
|
455
|
+
## E2 -- Navigation + Routing
|
|
456
|
+
**Goal:** Implement navigation with GoRouter or Navigator 2.0, including deep link support.
|
|
457
|
+
**Status:** Not started
|
|
458
|
+
**Tasks:** To be sliced by @meto-pm
|
|
459
|
+
|
|
460
|
+
---
|
|
461
|
+
|
|
462
|
+
## E3 -- Core Feature
|
|
463
|
+
**Goal:** Build the primary feature of the application. To be defined by @meto-pm based on the product vision.
|
|
464
|
+
**Status:** Not started
|
|
465
|
+
**Tasks:** To be sliced by @meto-pm
|
|
466
|
+
|
|
467
|
+
---
|
|
468
|
+
|
|
469
|
+
## E4 -- App Store Prep
|
|
470
|
+
**Goal:** Prepare app icons, splash screen, metadata, and production builds for App Store and Play Store submission.
|
|
471
|
+
**Status:** Not started
|
|
472
|
+
**Tasks:** To be sliced by @meto-pm`;
|
|
229
473
|
const STACK_EPICS = {
|
|
230
474
|
"nextjs-supabase": NEXTJS_SUPABASE_EPICS,
|
|
231
475
|
"react-native": REACT_NATIVE_EPICS,
|
|
232
476
|
"nodejs-cli": NODEJS_CLI_EPICS,
|
|
477
|
+
"python-fastapi": PYTHON_FASTAPI_EPICS,
|
|
478
|
+
"go": GO_EPICS,
|
|
479
|
+
"vite-react": VITE_REACT_EPICS,
|
|
480
|
+
"flutter": FLUTTER_EPICS,
|
|
233
481
|
};
|
|
234
482
|
/**
|
|
235
483
|
* Returns a structured markdown description for the selected tech stack.
|
package/dist/cli/stacks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stacks.js","sourceRoot":"","sources":["../../src/cli/stacks.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,2BAA2B,GAAG;;;;;;;;;;;;2CAYO,CAAC;AAE5C;;GAEG;AACH,MAAM,wBAAwB,GAAG;;;;;;;;;;;2CAWU,CAAC;AAE5C;;GAEG;AACH,MAAM,sBAAsB,GAAG;;;;;;;;;;;+CAWgB,CAAC;AAEhD,MAAM,kBAAkB,GAAiD;IACvE,iBAAiB,EAAE,2BAA2B;IAC9C,cAAc,EAAE,wBAAwB;IACxC,YAAY,EAAE,sBAAsB;
|
|
1
|
+
{"version":3,"file":"stacks.js","sourceRoot":"","sources":["../../src/cli/stacks.ts"],"names":[],"mappings":"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"}
|