meto-cli 0.1.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/CHANGELOG.md +24 -0
- package/LICENSE +21 -0
- package/README.md +106 -0
- package/dist/cli/git.d.ts +11 -0
- package/dist/cli/git.d.ts.map +1 -0
- package/dist/cli/git.js +34 -0
- package/dist/cli/git.js.map +1 -0
- package/dist/cli/github.d.ts +35 -0
- package/dist/cli/github.d.ts.map +1 -0
- package/dist/cli/github.js +117 -0
- package/dist/cli/github.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +192 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/interruption.d.ts +32 -0
- package/dist/cli/interruption.d.ts.map +1 -0
- package/dist/cli/interruption.js +66 -0
- package/dist/cli/interruption.js.map +1 -0
- package/dist/cli/preflight.d.ts +44 -0
- package/dist/cli/preflight.d.ts.map +1 -0
- package/dist/cli/preflight.js +79 -0
- package/dist/cli/preflight.js.map +1 -0
- package/dist/cli/prompts.d.ts +7 -0
- package/dist/cli/prompts.d.ts.map +1 -0
- package/dist/cli/prompts.js +148 -0
- package/dist/cli/prompts.js.map +1 -0
- package/dist/cli/renderer.d.ts +45 -0
- package/dist/cli/renderer.d.ts.map +1 -0
- package/dist/cli/renderer.js +118 -0
- package/dist/cli/renderer.js.map +1 -0
- package/dist/cli/scaffold.d.ts +18 -0
- package/dist/cli/scaffold.d.ts.map +1 -0
- package/dist/cli/scaffold.js +48 -0
- package/dist/cli/scaffold.js.map +1 -0
- package/dist/cli/stacks.d.ts +40 -0
- package/dist/cli/stacks.d.ts.map +1 -0
- package/dist/cli/stacks.js +294 -0
- package/dist/cli/stacks.js.map +1 -0
- package/dist/cli/supabase.d.ts +24 -0
- package/dist/cli/supabase.d.ts.map +1 -0
- package/dist/cli/supabase.js +72 -0
- package/dist/cli/supabase.js.map +1 -0
- package/dist/cli/tree.d.ts +9 -0
- package/dist/cli/tree.d.ts.map +1 -0
- package/dist/cli/tree.js +70 -0
- package/dist/cli/tree.js.map +1 -0
- package/dist/cli/types.d.ts +33 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +2 -0
- package/dist/cli/types.js.map +1 -0
- package/package.json +47 -0
- package/templates/.claude/agent-memory/lom-developer/MEMORY.md +20 -0
- package/templates/.claude/agent-memory/lom-pm/MEMORY.md +22 -0
- package/templates/.claude/agent-memory/lom-tester/MEMORY.md +18 -0
- package/templates/.claude/agents/developer-agent.md +56 -0
- package/templates/.claude/agents/pm-agent.md +72 -0
- package/templates/.claude/agents/tester-agent.md +62 -0
- package/templates/CLAUDE.md +63 -0
- package/templates/ai/backlog/epics.md +1 -0
- package/templates/ai/context/decisions.md +19 -0
- package/templates/ai/context/product-vision.md +19 -0
- package/templates/ai/context/tech-stack.md +8 -0
- package/templates/ai/context/test-log.md +7 -0
- package/templates/ai/tasks/tasks-backlog.md +1 -0
- package/templates/ai/tasks/tasks-done.md +1 -0
- package/templates/ai/tasks/tasks-in-progress.md +1 -0
- package/templates/ai/tasks/tasks-in-testing.md +1 -0
- package/templates/ai/tasks/tasks-todo.md +1 -0
- package/templates/ai/workflows/commit-conventions.md +10 -0
- package/templates/ai/workflows/definition-of-done.md +5 -0
- package/templates/gitignore +16 -0
- package/templates/src/.gitkeep +0 -0
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { TechStack } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Returns a structured markdown description for the selected tech stack.
|
|
4
|
+
*
|
|
5
|
+
* For preset stacks, returns a detailed table-formatted description with
|
|
6
|
+
* layers, choices, and reasons. For custom stacks, returns the user's
|
|
7
|
+
* free-text input under a "Custom Stack" heading.
|
|
8
|
+
*
|
|
9
|
+
* @param stack - The selected tech stack preset
|
|
10
|
+
* @param customStack - The user's free-text stack description (when stack is "custom")
|
|
11
|
+
* @returns Formatted markdown string describing the stack
|
|
12
|
+
*/
|
|
13
|
+
export declare function getStackDescription(stack: TechStack, customStack?: string): string;
|
|
14
|
+
/**
|
|
15
|
+
* Returns the Definition of Done criteria for the selected tech stack.
|
|
16
|
+
*
|
|
17
|
+
* For preset stacks, returns stack-specific criteria including universal
|
|
18
|
+
* checks and technology-specific quality gates. For custom stacks,
|
|
19
|
+
* returns universal checks with a placeholder for stack-specific items.
|
|
20
|
+
*
|
|
21
|
+
* @param stack - The selected tech stack preset
|
|
22
|
+
* @param customStack - The user's free-text stack description (when stack is "custom")
|
|
23
|
+
* @returns Formatted markdown string with Definition of Done checklist
|
|
24
|
+
*/
|
|
25
|
+
export declare function getDefinitionOfDone(stack: TechStack, customStack?: string): string;
|
|
26
|
+
/**
|
|
27
|
+
* Returns starter epics for the selected tech stack.
|
|
28
|
+
*
|
|
29
|
+
* For preset stacks, returns stack-specific epics with realistic goals.
|
|
30
|
+
* For custom stacks, returns generic but useful epics. Each epic includes
|
|
31
|
+
* a goal, status (not started), and a note that tasks should be sliced
|
|
32
|
+
* by the PM agent.
|
|
33
|
+
*
|
|
34
|
+
* @param stack - The selected tech stack preset
|
|
35
|
+
* @param projectName - The project name (used in the heading)
|
|
36
|
+
* @param customStack - The user's free-text stack description (when stack is "custom")
|
|
37
|
+
* @returns Formatted markdown string with starter epics
|
|
38
|
+
*/
|
|
39
|
+
export declare function getStarterEpics(stack: TechStack, projectName: string, customStack?: string): string;
|
|
40
|
+
//# sourceMappingURL=stacks.d.ts.map
|
|
@@ -0,0 +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;AAyP5C;;;;;;;;;;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"}
|
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structured description for the Next.js + Supabase stack.
|
|
3
|
+
*/
|
|
4
|
+
const NEXTJS_SUPABASE_DESCRIPTION = `## Stack Overview
|
|
5
|
+
|
|
6
|
+
| Layer | Choice | Reason |
|
|
7
|
+
|---|---|---|
|
|
8
|
+
| UI | Next.js (React) | Server-side rendering, file-based routing, API routes built-in |
|
|
9
|
+
| API | Next.js API Routes | Co-located with frontend, serverless-ready |
|
|
10
|
+
| Database | Supabase (PostgreSQL) | Managed Postgres with real-time subscriptions and auto-generated APIs |
|
|
11
|
+
| Auth | Supabase Auth | Built-in email/password, OAuth providers, row-level security |
|
|
12
|
+
| Hosting | Vercel | Zero-config Next.js deploys, edge functions, preview deployments |
|
|
13
|
+
|
|
14
|
+
## Key Libraries
|
|
15
|
+
- **Tailwind CSS** -- utility-first styling
|
|
16
|
+
- **TypeScript** -- strict mode throughout`;
|
|
17
|
+
/**
|
|
18
|
+
* Structured description for the React Native stack.
|
|
19
|
+
*/
|
|
20
|
+
const REACT_NATIVE_DESCRIPTION = `## Stack Overview
|
|
21
|
+
|
|
22
|
+
| Layer | Choice | Reason |
|
|
23
|
+
|---|---|---|
|
|
24
|
+
| UI | React Native | Cross-platform iOS and Android from a single codebase |
|
|
25
|
+
| Navigation | React Navigation | Industry-standard navigation library with native feel |
|
|
26
|
+
| State | Zustand or Redux Toolkit | Lightweight state management with TypeScript support |
|
|
27
|
+
| Backend | Supabase or custom API | Flexible backend choice depending on project needs |
|
|
28
|
+
|
|
29
|
+
## Key Libraries
|
|
30
|
+
- **Expo** -- managed workflow for faster development
|
|
31
|
+
- **TypeScript** -- strict mode throughout`;
|
|
32
|
+
/**
|
|
33
|
+
* Structured description for the Node.js CLI stack.
|
|
34
|
+
*/
|
|
35
|
+
const NODEJS_CLI_DESCRIPTION = `## Stack Overview
|
|
36
|
+
|
|
37
|
+
| Layer | Choice | Reason |
|
|
38
|
+
|---|---|---|
|
|
39
|
+
| Runtime | Node.js | Ubiquitous JavaScript runtime with rich ecosystem |
|
|
40
|
+
| Language | TypeScript | Type safety and better developer experience |
|
|
41
|
+
| Distribution | npm | Standard package distribution, supports npx for zero-install usage |
|
|
42
|
+
| Prompts | @clack/prompts | Beautiful terminal UI with spinners, selects, and validation |
|
|
43
|
+
|
|
44
|
+
## Key Libraries
|
|
45
|
+
- **commander or yargs** -- argument parsing (if needed)
|
|
46
|
+
- **vitest** -- fast TypeScript-native testing`;
|
|
47
|
+
const STACK_DESCRIPTIONS = {
|
|
48
|
+
"nextjs-supabase": NEXTJS_SUPABASE_DESCRIPTION,
|
|
49
|
+
"react-native": REACT_NATIVE_DESCRIPTION,
|
|
50
|
+
"nodejs-cli": NODEJS_CLI_DESCRIPTION,
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Definition of Done criteria for the Next.js + Supabase stack.
|
|
54
|
+
*/
|
|
55
|
+
const NEXTJS_SUPABASE_DOD = `## Universal Checks
|
|
56
|
+
- [ ] TypeScript compiles with no errors (\`npx tsc --noEmit\`)
|
|
57
|
+
- [ ] No \`any\` types in changed files
|
|
58
|
+
- [ ] No \`console.log\` in committed code
|
|
59
|
+
- [ ] No commented-out code in committed files
|
|
60
|
+
- [ ] Error states handled (loading, empty, error UI)
|
|
61
|
+
|
|
62
|
+
## Stack-Specific Checks
|
|
63
|
+
- [ ] Supabase migrations applied and tested locally
|
|
64
|
+
- [ ] Environment variables documented in \`.env.example\`
|
|
65
|
+
- [ ] Responsive on mobile (tested at 375px width minimum)
|
|
66
|
+
- [ ] API routes return proper HTTP status codes
|
|
67
|
+
- [ ] Row-level security policies reviewed for new tables`;
|
|
68
|
+
/**
|
|
69
|
+
* Definition of Done criteria for the React Native stack.
|
|
70
|
+
*/
|
|
71
|
+
const REACT_NATIVE_DOD = `## Universal Checks
|
|
72
|
+
- [ ] TypeScript compiles with no errors (\`npx tsc --noEmit\`)
|
|
73
|
+
- [ ] No \`any\` types in changed files
|
|
74
|
+
- [ ] No \`console.log\` in committed code
|
|
75
|
+
- [ ] No commented-out code in committed files
|
|
76
|
+
- [ ] Error states handled (loading, empty, error UI)
|
|
77
|
+
|
|
78
|
+
## Stack-Specific Checks
|
|
79
|
+
- [ ] Runs on iOS simulator without crash
|
|
80
|
+
- [ ] Runs on Android emulator without crash
|
|
81
|
+
- [ ] Navigation works (forward, back, deep links if applicable)
|
|
82
|
+
- [ ] No hardcoded dimensions (use responsive units)
|
|
83
|
+
- [ ] Keyboard does not obscure input fields`;
|
|
84
|
+
/**
|
|
85
|
+
* Definition of Done criteria for the Node.js CLI stack.
|
|
86
|
+
*/
|
|
87
|
+
const NODEJS_CLI_DOD = `## Universal Checks
|
|
88
|
+
- [ ] TypeScript compiles with no errors (\`npx tsc --noEmit\`)
|
|
89
|
+
- [ ] No \`any\` types in changed files
|
|
90
|
+
- [ ] No \`console.log\` in committed code
|
|
91
|
+
- [ ] No commented-out code in committed files
|
|
92
|
+
- [ ] Error states handled (graceful error messages, no stack traces for users)
|
|
93
|
+
|
|
94
|
+
## Stack-Specific Checks
|
|
95
|
+
- [ ] Help text present and accurate (\`--help\`)
|
|
96
|
+
- [ ] Exit codes correct (0 for success, 1 for errors)
|
|
97
|
+
- [ ] Unit tests pass (\`npm test\`)
|
|
98
|
+
- [ ] CLI runs without crash on a clean install (\`npx\`)
|
|
99
|
+
- [ ] No hardcoded file paths (use platform-agnostic path resolution)`;
|
|
100
|
+
/**
|
|
101
|
+
* Definition of Done criteria for a custom stack.
|
|
102
|
+
*/
|
|
103
|
+
const CUSTOM_STACK_DOD = `## Universal Checks
|
|
104
|
+
- [ ] TypeScript compiles with no errors (\`npx tsc --noEmit\`)
|
|
105
|
+
- [ ] No \`any\` types in changed files
|
|
106
|
+
- [ ] No \`console.log\` in committed code
|
|
107
|
+
- [ ] No commented-out code in committed files
|
|
108
|
+
- [ ] Error states handled
|
|
109
|
+
|
|
110
|
+
## Stack-Specific Checks
|
|
111
|
+
*Add stack-specific checks here based on your chosen technology.*`;
|
|
112
|
+
const STACK_DODS = {
|
|
113
|
+
"nextjs-supabase": NEXTJS_SUPABASE_DOD,
|
|
114
|
+
"react-native": REACT_NATIVE_DOD,
|
|
115
|
+
"nodejs-cli": NODEJS_CLI_DOD,
|
|
116
|
+
};
|
|
117
|
+
/**
|
|
118
|
+
* Starter epics for the Next.js + Supabase stack.
|
|
119
|
+
*/
|
|
120
|
+
const NEXTJS_SUPABASE_EPICS = `## E1 -- Project Setup
|
|
121
|
+
**Goal:** Initialize the Next.js app with Tailwind CSS, configure Supabase client, and establish the development environment.
|
|
122
|
+
**Status:** Not started
|
|
123
|
+
**Tasks:** To be sliced by @meto-pm
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## E2 -- Auth
|
|
128
|
+
**Goal:** Implement sign up, sign in, and sign out using Supabase Auth with row-level security.
|
|
129
|
+
**Status:** Not started
|
|
130
|
+
**Tasks:** To be sliced by @meto-pm
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## E3 -- Core Feature
|
|
135
|
+
**Goal:** Build the primary feature of the application. To be defined by @meto-pm based on the product vision.
|
|
136
|
+
**Status:** Not started
|
|
137
|
+
**Tasks:** To be sliced by @meto-pm
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## E4 -- Deploy
|
|
142
|
+
**Goal:** Deploy to Vercel, configure custom domain, and set up environment variables for production.
|
|
143
|
+
**Status:** Not started
|
|
144
|
+
**Tasks:** To be sliced by @meto-pm`;
|
|
145
|
+
/**
|
|
146
|
+
* Starter epics for the React Native stack.
|
|
147
|
+
*/
|
|
148
|
+
const REACT_NATIVE_EPICS = `## E1 -- Project Setup
|
|
149
|
+
**Goal:** Initialize the Expo project with React Navigation and configure the development environment.
|
|
150
|
+
**Status:** Not started
|
|
151
|
+
**Tasks:** To be sliced by @meto-pm
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## E2 -- Auth
|
|
156
|
+
**Goal:** Implement authentication (sign up, sign in, sign out) with secure token storage.
|
|
157
|
+
**Status:** Not started
|
|
158
|
+
**Tasks:** To be sliced by @meto-pm
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## E3 -- Core Feature
|
|
163
|
+
**Goal:** Build the primary feature of the application. To be defined by @meto-pm based on the product vision.
|
|
164
|
+
**Status:** Not started
|
|
165
|
+
**Tasks:** To be sliced by @meto-pm
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## E4 -- App Store Prep
|
|
170
|
+
**Goal:** Prepare the app for App Store and Play Store submission including icons, splash screen, and metadata.
|
|
171
|
+
**Status:** Not started
|
|
172
|
+
**Tasks:** To be sliced by @meto-pm`;
|
|
173
|
+
/**
|
|
174
|
+
* Starter epics for the Node.js CLI stack.
|
|
175
|
+
*/
|
|
176
|
+
const NODEJS_CLI_EPICS = `## E1 -- CLI Scaffold
|
|
177
|
+
**Goal:** Set up the CLI entry point with help text, version flag, and argument parsing.
|
|
178
|
+
**Status:** Not started
|
|
179
|
+
**Tasks:** To be sliced by @meto-pm
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
## E2 -- Core Command
|
|
184
|
+
**Goal:** Implement the primary command that delivers the core value of the CLI tool.
|
|
185
|
+
**Status:** Not started
|
|
186
|
+
**Tasks:** To be sliced by @meto-pm
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
## E3 -- Testing + CI
|
|
191
|
+
**Goal:** Add unit tests, integration tests, and configure continuous integration.
|
|
192
|
+
**Status:** Not started
|
|
193
|
+
**Tasks:** To be sliced by @meto-pm
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
## E4 -- npm Publish
|
|
198
|
+
**Goal:** Prepare for npm publication including package.json metadata, README, and publish workflow.
|
|
199
|
+
**Status:** Not started
|
|
200
|
+
**Tasks:** To be sliced by @meto-pm`;
|
|
201
|
+
/**
|
|
202
|
+
* Starter epics for a custom stack.
|
|
203
|
+
*/
|
|
204
|
+
const CUSTOM_STACK_EPICS = `## E1 -- Project Setup
|
|
205
|
+
**Goal:** Initialize the project structure, install dependencies, and configure the development environment.
|
|
206
|
+
**Status:** Not started
|
|
207
|
+
**Tasks:** To be sliced by @meto-pm
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
## E2 -- Core Feature
|
|
212
|
+
**Goal:** Build the primary feature of the application. To be defined by @meto-pm based on the product vision.
|
|
213
|
+
**Status:** Not started
|
|
214
|
+
**Tasks:** To be sliced by @meto-pm
|
|
215
|
+
|
|
216
|
+
---
|
|
217
|
+
|
|
218
|
+
## E3 -- Testing
|
|
219
|
+
**Goal:** Add unit tests and integration tests to ensure quality and enable confident refactoring.
|
|
220
|
+
**Status:** Not started
|
|
221
|
+
**Tasks:** To be sliced by @meto-pm
|
|
222
|
+
|
|
223
|
+
---
|
|
224
|
+
|
|
225
|
+
## E4 -- Deploy
|
|
226
|
+
**Goal:** Set up deployment pipeline and ship the first version to production.
|
|
227
|
+
**Status:** Not started
|
|
228
|
+
**Tasks:** To be sliced by @meto-pm`;
|
|
229
|
+
const STACK_EPICS = {
|
|
230
|
+
"nextjs-supabase": NEXTJS_SUPABASE_EPICS,
|
|
231
|
+
"react-native": REACT_NATIVE_EPICS,
|
|
232
|
+
"nodejs-cli": NODEJS_CLI_EPICS,
|
|
233
|
+
};
|
|
234
|
+
/**
|
|
235
|
+
* Returns a structured markdown description for the selected tech stack.
|
|
236
|
+
*
|
|
237
|
+
* For preset stacks, returns a detailed table-formatted description with
|
|
238
|
+
* layers, choices, and reasons. For custom stacks, returns the user's
|
|
239
|
+
* free-text input under a "Custom Stack" heading.
|
|
240
|
+
*
|
|
241
|
+
* @param stack - The selected tech stack preset
|
|
242
|
+
* @param customStack - The user's free-text stack description (when stack is "custom")
|
|
243
|
+
* @returns Formatted markdown string describing the stack
|
|
244
|
+
*/
|
|
245
|
+
export function getStackDescription(stack, customStack) {
|
|
246
|
+
if (stack === "custom") {
|
|
247
|
+
const description = customStack ?? "Custom stack -- details to be defined";
|
|
248
|
+
return `## Custom Stack\n\n${description}`;
|
|
249
|
+
}
|
|
250
|
+
return STACK_DESCRIPTIONS[stack];
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Returns the Definition of Done criteria for the selected tech stack.
|
|
254
|
+
*
|
|
255
|
+
* For preset stacks, returns stack-specific criteria including universal
|
|
256
|
+
* checks and technology-specific quality gates. For custom stacks,
|
|
257
|
+
* returns universal checks with a placeholder for stack-specific items.
|
|
258
|
+
*
|
|
259
|
+
* @param stack - The selected tech stack preset
|
|
260
|
+
* @param customStack - The user's free-text stack description (when stack is "custom")
|
|
261
|
+
* @returns Formatted markdown string with Definition of Done checklist
|
|
262
|
+
*/
|
|
263
|
+
export function getDefinitionOfDone(stack, customStack) {
|
|
264
|
+
if (stack === "custom") {
|
|
265
|
+
return customStack !== undefined
|
|
266
|
+
? `${CUSTOM_STACK_DOD}\n\n> Custom stack: ${customStack}`
|
|
267
|
+
: CUSTOM_STACK_DOD;
|
|
268
|
+
}
|
|
269
|
+
return STACK_DODS[stack];
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Returns starter epics for the selected tech stack.
|
|
273
|
+
*
|
|
274
|
+
* For preset stacks, returns stack-specific epics with realistic goals.
|
|
275
|
+
* For custom stacks, returns generic but useful epics. Each epic includes
|
|
276
|
+
* a goal, status (not started), and a note that tasks should be sliced
|
|
277
|
+
* by the PM agent.
|
|
278
|
+
*
|
|
279
|
+
* @param stack - The selected tech stack preset
|
|
280
|
+
* @param projectName - The project name (used in the heading)
|
|
281
|
+
* @param customStack - The user's free-text stack description (when stack is "custom")
|
|
282
|
+
* @returns Formatted markdown string with starter epics
|
|
283
|
+
*/
|
|
284
|
+
export function getStarterEpics(stack, projectName, customStack) {
|
|
285
|
+
const heading = `# Epics -- ${projectName}\n\nHigh-level orientation. Full task definitions live in \`tasks-backlog.md\`.\nGenerated by Meto based on stack selection. Refine with @meto-pm.\n\n---\n\n`;
|
|
286
|
+
if (stack === "custom") {
|
|
287
|
+
const note = customStack !== undefined
|
|
288
|
+
? `\n\n---\n\n> Custom stack: ${customStack}. Adjust epics to match your technology choices.`
|
|
289
|
+
: "";
|
|
290
|
+
return heading + CUSTOM_STACK_EPICS + note;
|
|
291
|
+
}
|
|
292
|
+
return heading + STACK_EPICS[stack];
|
|
293
|
+
}
|
|
294
|
+
//# sourceMappingURL=stacks.js.map
|
|
@@ -0,0 +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;CACrC,CAAC;AAEF;;GAEG;AACH,MAAM,mBAAmB,GAAG;;;;;;;;;;;;0DAY8B,CAAC;AAE3D;;GAEG;AACH,MAAM,gBAAgB,GAAG;;;;;;;;;;;;6CAYoB,CAAC;AAE9C;;GAEG;AACH,MAAM,cAAc,GAAG;;;;;;;;;;;;sEAY+C,CAAC;AAEvE;;GAEG;AACH,MAAM,gBAAgB,GAAG;;;;;;;;kEAQyC,CAAC;AAEnE,MAAM,UAAU,GAAiD;IAC/D,iBAAiB,EAAE,mBAAmB;IACtC,cAAc,EAAE,gBAAgB;IAChC,YAAY,EAAE,cAAc;CAC7B,CAAC;AAEF;;GAEG;AACH,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;oCAwBM,CAAC;AAErC;;GAEG;AACH,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;oCAwBS,CAAC;AAErC;;GAEG;AACH,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;oCAwBW,CAAC;AAErC;;GAEG;AACH,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;oCAwBS,CAAC;AAErC,MAAM,WAAW,GAAiD;IAChE,iBAAiB,EAAE,qBAAqB;IACxC,cAAc,EAAE,kBAAkB;IAClC,YAAY,EAAE,gBAAgB;CAC/B,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAM,UAAU,mBAAmB,CACjC,KAAgB,EAChB,WAAoB;IAEpB,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvB,MAAM,WAAW,GAAG,WAAW,IAAI,uCAAuC,CAAC;QAC3E,OAAO,sBAAsB,WAAW,EAAE,CAAC;IAC7C,CAAC;IAED,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC;AACnC,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,mBAAmB,CACjC,KAAgB,EAChB,WAAoB;IAEpB,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvB,OAAO,WAAW,KAAK,SAAS;YAC9B,CAAC,CAAC,GAAG,gBAAgB,uBAAuB,WAAW,EAAE;YACzD,CAAC,CAAC,gBAAgB,CAAC;IACvB,CAAC;IAED,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,eAAe,CAC7B,KAAgB,EAChB,WAAmB,EACnB,WAAoB;IAEpB,MAAM,OAAO,GAAG,cAAc,WAAW,+JAA+J,CAAC;IAEzM,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvB,MAAM,IAAI,GACR,WAAW,KAAK,SAAS;YACvB,CAAC,CAAC,8BAA8B,WAAW,kDAAkD;YAC7F,CAAC,CAAC,EAAE,CAAC;QACT,OAAO,OAAO,GAAG,kBAAkB,GAAG,IAAI,CAAC;IAC7C,CAAC;IAED,OAAO,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { TechStack } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Result of the Supabase post-scaffold flow.
|
|
4
|
+
*/
|
|
5
|
+
export interface SupabaseResult {
|
|
6
|
+
/** Whether Supabase was initialized in the project. */
|
|
7
|
+
initialized: boolean;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Checks whether the Supabase CLI is installed by running `supabase --version`.
|
|
11
|
+
* Resolves to true if `supabase` is found, false otherwise.
|
|
12
|
+
*/
|
|
13
|
+
export declare function checkSupabaseInstalled(): Promise<boolean>;
|
|
14
|
+
/**
|
|
15
|
+
* Runs the post-scaffold Supabase setup flow.
|
|
16
|
+
*
|
|
17
|
+
* Only runs when the selected stack is "nextjs-supabase". Checks for the
|
|
18
|
+
* Supabase CLI, and if found, offers to run `supabase init` in the project.
|
|
19
|
+
*
|
|
20
|
+
* @param techStack - The user's selected tech stack
|
|
21
|
+
* @param outputDir - The scaffolded project directory
|
|
22
|
+
*/
|
|
23
|
+
export declare function runSupabaseFlow(techStack: TechStack, outputDir: string): Promise<SupabaseResult>;
|
|
24
|
+
//# sourceMappingURL=supabase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supabase.d.ts","sourceRoot":"","sources":["../../src/cli/supabase.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,uDAAuD;IACvD,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAAC,OAAO,CAAC,CAMzD;AA0BD;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CACnC,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,cAAc,CAAC,CAyCzB"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import * as p from "@clack/prompts";
|
|
4
|
+
/**
|
|
5
|
+
* Checks whether the Supabase CLI is installed by running `supabase --version`.
|
|
6
|
+
* Resolves to true if `supabase` is found, false otherwise.
|
|
7
|
+
*/
|
|
8
|
+
export function checkSupabaseInstalled() {
|
|
9
|
+
return new Promise((promiseResolve) => {
|
|
10
|
+
execFile("supabase", ["--version"], (error) => {
|
|
11
|
+
promiseResolve(error === null);
|
|
12
|
+
});
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Runs `supabase init` in the specified directory.
|
|
17
|
+
* Returns a promise that resolves on success or rejects with an error.
|
|
18
|
+
*/
|
|
19
|
+
function runSupabaseInit(cwd) {
|
|
20
|
+
const absoluteCwd = resolve(cwd);
|
|
21
|
+
return new Promise((promiseResolve, promiseReject) => {
|
|
22
|
+
execFile("supabase", ["init"], { cwd: absoluteCwd }, (error, stdout, stderr) => {
|
|
23
|
+
if (error) {
|
|
24
|
+
const message = stderr.trim() || error.message;
|
|
25
|
+
promiseReject(new Error(message));
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
promiseResolve(stdout.trim());
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Runs the post-scaffold Supabase setup flow.
|
|
34
|
+
*
|
|
35
|
+
* Only runs when the selected stack is "nextjs-supabase". Checks for the
|
|
36
|
+
* Supabase CLI, and if found, offers to run `supabase init` in the project.
|
|
37
|
+
*
|
|
38
|
+
* @param techStack - The user's selected tech stack
|
|
39
|
+
* @param outputDir - The scaffolded project directory
|
|
40
|
+
*/
|
|
41
|
+
export async function runSupabaseFlow(techStack, outputDir) {
|
|
42
|
+
const noResult = { initialized: false };
|
|
43
|
+
if (techStack !== "nextjs-supabase") {
|
|
44
|
+
return noResult;
|
|
45
|
+
}
|
|
46
|
+
const installed = await checkSupabaseInstalled();
|
|
47
|
+
if (!installed) {
|
|
48
|
+
p.log.info("Supabase CLI not found. Install it to manage your database locally: https://supabase.com/docs/guides/cli/getting-started");
|
|
49
|
+
return noResult;
|
|
50
|
+
}
|
|
51
|
+
const shouldInit = await p.confirm({
|
|
52
|
+
message: "Initialize Supabase in this project?",
|
|
53
|
+
initialValue: true,
|
|
54
|
+
});
|
|
55
|
+
if (p.isCancel(shouldInit) || !shouldInit) {
|
|
56
|
+
return noResult;
|
|
57
|
+
}
|
|
58
|
+
const supabaseSpinner = p.spinner();
|
|
59
|
+
supabaseSpinner.start("Initializing Supabase...");
|
|
60
|
+
try {
|
|
61
|
+
await runSupabaseInit(outputDir);
|
|
62
|
+
supabaseSpinner.stop("Supabase initialized. Run `supabase start` to launch the local development stack.");
|
|
63
|
+
return { initialized: true };
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
const message = error instanceof Error ? error.message : "Unknown error";
|
|
67
|
+
supabaseSpinner.stop(`Supabase initialization failed: ${message}`);
|
|
68
|
+
p.log.warning("The project was scaffolded successfully. You can run `supabase init` manually later.");
|
|
69
|
+
return noResult;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=supabase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supabase.js","sourceRoot":"","sources":["../../src/cli/supabase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AAWpC;;;GAGG;AACH,MAAM,UAAU,sBAAsB;IACpC,OAAO,IAAI,OAAO,CAAC,CAAC,cAAc,EAAE,EAAE;QACpC,QAAQ,CAAC,UAAU,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE;YAC5C,cAAc,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,SAAS,eAAe,CAAC,GAAW;IAClC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAEjC,OAAO,IAAI,OAAO,CAAC,CAAC,cAAc,EAAE,aAAa,EAAE,EAAE;QACnD,QAAQ,CACN,UAAU,EACV,CAAC,MAAM,CAAC,EACR,EAAE,GAAG,EAAE,WAAW,EAAE,EACpB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;YACxB,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,IAAI,KAAK,CAAC,OAAO,CAAC;gBAC/C,aAAa,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;gBAClC,OAAO;YACT,CAAC;YACD,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAChC,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,SAAoB,EACpB,SAAiB;IAEjB,MAAM,QAAQ,GAAmB,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;IAExD,IAAI,SAAS,KAAK,iBAAiB,EAAE,CAAC;QACpC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,sBAAsB,EAAE,CAAC;IACjD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,CAAC,CAAC,GAAG,CAAC,IAAI,CACR,0HAA0H,CAC3H,CAAC;QACF,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,OAAO,CAAC;QACjC,OAAO,EAAE,sCAAsC;QAC/C,YAAY,EAAE,IAAI;KACnB,CAAC,CAAC;IAEH,IAAI,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QAC1C,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,eAAe,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;IACpC,eAAe,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAElD,IAAI,CAAC;QACH,MAAM,eAAe,CAAC,SAAS,CAAC,CAAC;QACjC,eAAe,CAAC,IAAI,CAClB,mFAAmF,CACpF,CAAC;QACF,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IAC/B,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;QACzE,eAAe,CAAC,IAAI,CAAC,mCAAmC,OAAO,EAAE,CAAC,CAAC;QACnE,CAAC,CAAC,GAAG,CAAC,OAAO,CACX,sFAAsF,CACvF,CAAC;QACF,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Formats a list of relative file paths into a tree-view string.
|
|
3
|
+
* The output uses box-drawing characters to show hierarchy.
|
|
4
|
+
*
|
|
5
|
+
* @param paths - Array of relative file paths (using "/" as separator)
|
|
6
|
+
* @returns Formatted tree string
|
|
7
|
+
*/
|
|
8
|
+
export declare function formatFileTree(paths: string[]): string;
|
|
9
|
+
//# sourceMappingURL=tree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tree.d.ts","sourceRoot":"","sources":["../../src/cli/tree.ts"],"names":[],"mappings":"AAgEA;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAmBtD"}
|
package/dist/cli/tree.js
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Builds a tree structure from a list of file paths.
|
|
3
|
+
* Paths are split on "/" to create nested directory nodes.
|
|
4
|
+
*/
|
|
5
|
+
function buildTree(paths) {
|
|
6
|
+
const root = { name: "", children: new Map() };
|
|
7
|
+
for (const filePath of paths) {
|
|
8
|
+
const parts = filePath.split("/");
|
|
9
|
+
let current = root;
|
|
10
|
+
for (const part of parts) {
|
|
11
|
+
if (!current.children.has(part)) {
|
|
12
|
+
current.children.set(part, { name: part, children: new Map() });
|
|
13
|
+
}
|
|
14
|
+
current = current.children.get(part);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return root;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Recursively formats a tree node into indented text lines.
|
|
21
|
+
* Uses box-drawing characters for visual structure.
|
|
22
|
+
*/
|
|
23
|
+
function formatNode(node, prefix, isLast, lines) {
|
|
24
|
+
const connector = isLast ? "└── " : "├── ";
|
|
25
|
+
const extension = isLast ? " " : "│ ";
|
|
26
|
+
if (node.name !== "") {
|
|
27
|
+
lines.push(`${prefix}${connector}${node.name}`);
|
|
28
|
+
}
|
|
29
|
+
const children = Array.from(node.children.values()).sort((a, b) => {
|
|
30
|
+
const aIsDir = a.children.size > 0;
|
|
31
|
+
const bIsDir = b.children.size > 0;
|
|
32
|
+
if (aIsDir && !bIsDir)
|
|
33
|
+
return -1;
|
|
34
|
+
if (!aIsDir && bIsDir)
|
|
35
|
+
return 1;
|
|
36
|
+
return a.name.localeCompare(b.name);
|
|
37
|
+
});
|
|
38
|
+
const childPrefix = node.name === "" ? "" : prefix + extension;
|
|
39
|
+
for (let i = 0; i < children.length; i++) {
|
|
40
|
+
const isChildLast = i === children.length - 1;
|
|
41
|
+
formatNode(children[i], childPrefix, isChildLast, lines);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Formats a list of relative file paths into a tree-view string.
|
|
46
|
+
* The output uses box-drawing characters to show hierarchy.
|
|
47
|
+
*
|
|
48
|
+
* @param paths - Array of relative file paths (using "/" as separator)
|
|
49
|
+
* @returns Formatted tree string
|
|
50
|
+
*/
|
|
51
|
+
export function formatFileTree(paths) {
|
|
52
|
+
const normalizedPaths = paths.map((p) => p.replace(/\\/g, "/"));
|
|
53
|
+
const root = buildTree(normalizedPaths);
|
|
54
|
+
const lines = [];
|
|
55
|
+
const children = Array.from(root.children.values()).sort((a, b) => {
|
|
56
|
+
const aIsDir = a.children.size > 0;
|
|
57
|
+
const bIsDir = b.children.size > 0;
|
|
58
|
+
if (aIsDir && !bIsDir)
|
|
59
|
+
return -1;
|
|
60
|
+
if (!aIsDir && bIsDir)
|
|
61
|
+
return 1;
|
|
62
|
+
return a.name.localeCompare(b.name);
|
|
63
|
+
});
|
|
64
|
+
for (let i = 0; i < children.length; i++) {
|
|
65
|
+
const isLast = i === children.length - 1;
|
|
66
|
+
formatNode(children[i], "", isLast, lines);
|
|
67
|
+
}
|
|
68
|
+
return lines.join("\n");
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=tree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tree.js","sourceRoot":"","sources":["../../src/cli/tree.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tech stack presets available during project scaffolding.
|
|
3
|
+
*/
|
|
4
|
+
export type TechStack = "nextjs-supabase" | "react-native" | "nodejs-cli" | "custom";
|
|
5
|
+
/**
|
|
6
|
+
* The brief collected from the user during `meto-cli init`.
|
|
7
|
+
* Contains everything needed to render templates and scaffold a project.
|
|
8
|
+
*/
|
|
9
|
+
export interface ProjectBrief {
|
|
10
|
+
/** Kebab-case project name, used as directory name and package name */
|
|
11
|
+
projectName: string;
|
|
12
|
+
/** One-line description of what the project does */
|
|
13
|
+
description: string;
|
|
14
|
+
/** Who the project is for */
|
|
15
|
+
targetUsers: string;
|
|
16
|
+
/** Selected tech stack preset or "custom" */
|
|
17
|
+
techStack: TechStack;
|
|
18
|
+
/** Free-text stack description when techStack is "custom" */
|
|
19
|
+
customStack: string | undefined;
|
|
20
|
+
/** What problem this project solves */
|
|
21
|
+
problemStatement: string;
|
|
22
|
+
/** How success is measured */
|
|
23
|
+
successCriteria: string;
|
|
24
|
+
/** Core value proposition in one line */
|
|
25
|
+
valueProposition: string;
|
|
26
|
+
/** What is explicitly out of scope for v1 */
|
|
27
|
+
outOfScope: string;
|
|
28
|
+
/** Project-specific code conventions and standards */
|
|
29
|
+
codeConventions: string;
|
|
30
|
+
/** Absolute or relative path where the scaffold will be written */
|
|
31
|
+
outputDirectory: string;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/cli/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,SAAS,GACjB,iBAAiB,GACjB,cAAc,GACd,YAAY,GACZ,QAAQ,CAAC;AAEb;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,uEAAuE;IACvE,WAAW,EAAE,MAAM,CAAC;IACpB,oDAAoD;IACpD,WAAW,EAAE,MAAM,CAAC;IACpB,6BAA6B;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,6CAA6C;IAC7C,SAAS,EAAE,SAAS,CAAC;IACrB,6DAA6D;IAC7D,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,uCAAuC;IACvC,gBAAgB,EAAE,MAAM,CAAC;IACzB,8BAA8B;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,yCAAyC;IACzC,gBAAgB,EAAE,MAAM,CAAC;IACzB,6CAA6C;IAC7C,UAAU,EAAE,MAAM,CAAC;IACnB,sDAAsD;IACtD,eAAe,EAAE,MAAM,CAAC;IACxB,mEAAmE;IACnE,eAAe,EAAE,MAAM,CAAC;CACzB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/cli/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "meto-cli",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Scaffold structured software projects with built-in methodology",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"meto-cli": "./dist/cli/index.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist/",
|
|
11
|
+
"templates/",
|
|
12
|
+
"README.md",
|
|
13
|
+
"LICENSE",
|
|
14
|
+
"CHANGELOG.md"
|
|
15
|
+
],
|
|
16
|
+
"scripts": {
|
|
17
|
+
"build": "tsc",
|
|
18
|
+
"dev": "tsc --watch",
|
|
19
|
+
"typecheck": "tsc --noEmit",
|
|
20
|
+
"test": "vitest run",
|
|
21
|
+
"prepublishOnly": "npm run build"
|
|
22
|
+
},
|
|
23
|
+
"keywords": [
|
|
24
|
+
"scaffold",
|
|
25
|
+
"cli",
|
|
26
|
+
"methodology",
|
|
27
|
+
"agile",
|
|
28
|
+
"project-generator"
|
|
29
|
+
],
|
|
30
|
+
"author": "iLomer",
|
|
31
|
+
"license": "MIT",
|
|
32
|
+
"repository": {
|
|
33
|
+
"type": "git",
|
|
34
|
+
"url": "https://github.com/iLomer/Metho_agentic.git"
|
|
35
|
+
},
|
|
36
|
+
"engines": {
|
|
37
|
+
"node": ">=18.0.0"
|
|
38
|
+
},
|
|
39
|
+
"dependencies": {
|
|
40
|
+
"@clack/prompts": "^0.9.1"
|
|
41
|
+
},
|
|
42
|
+
"devDependencies": {
|
|
43
|
+
"@types/node": "^22.13.0",
|
|
44
|
+
"typescript": "^5.7.0",
|
|
45
|
+
"vitest": "^4.0.18"
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Developer Agent Memory — {{PROJECT_NAME}}
|
|
2
|
+
|
|
3
|
+
*Read at session start. Update at session end. Keep it concise.*
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Codebase Map
|
|
8
|
+
[Key files, components, and where things live — built up over time]
|
|
9
|
+
|
|
10
|
+
## Patterns Established
|
|
11
|
+
[Naming conventions, component patterns, API patterns in this codebase]
|
|
12
|
+
|
|
13
|
+
## Known Issues
|
|
14
|
+
[Bugs or tech debt flagged but not yet sliced — don't fix inline, note here]
|
|
15
|
+
|
|
16
|
+
## Watch Out For
|
|
17
|
+
[Things that caused bugs, gotchas in this codebase]
|
|
18
|
+
|
|
19
|
+
## Last Session
|
|
20
|
+
[What was built, what state was left in, anything in-flight]
|