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.
Files changed (73) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/LICENSE +21 -0
  3. package/README.md +106 -0
  4. package/dist/cli/git.d.ts +11 -0
  5. package/dist/cli/git.d.ts.map +1 -0
  6. package/dist/cli/git.js +34 -0
  7. package/dist/cli/git.js.map +1 -0
  8. package/dist/cli/github.d.ts +35 -0
  9. package/dist/cli/github.d.ts.map +1 -0
  10. package/dist/cli/github.js +117 -0
  11. package/dist/cli/github.js.map +1 -0
  12. package/dist/cli/index.d.ts +3 -0
  13. package/dist/cli/index.d.ts.map +1 -0
  14. package/dist/cli/index.js +192 -0
  15. package/dist/cli/index.js.map +1 -0
  16. package/dist/cli/interruption.d.ts +32 -0
  17. package/dist/cli/interruption.d.ts.map +1 -0
  18. package/dist/cli/interruption.js +66 -0
  19. package/dist/cli/interruption.js.map +1 -0
  20. package/dist/cli/preflight.d.ts +44 -0
  21. package/dist/cli/preflight.d.ts.map +1 -0
  22. package/dist/cli/preflight.js +79 -0
  23. package/dist/cli/preflight.js.map +1 -0
  24. package/dist/cli/prompts.d.ts +7 -0
  25. package/dist/cli/prompts.d.ts.map +1 -0
  26. package/dist/cli/prompts.js +148 -0
  27. package/dist/cli/prompts.js.map +1 -0
  28. package/dist/cli/renderer.d.ts +45 -0
  29. package/dist/cli/renderer.d.ts.map +1 -0
  30. package/dist/cli/renderer.js +118 -0
  31. package/dist/cli/renderer.js.map +1 -0
  32. package/dist/cli/scaffold.d.ts +18 -0
  33. package/dist/cli/scaffold.d.ts.map +1 -0
  34. package/dist/cli/scaffold.js +48 -0
  35. package/dist/cli/scaffold.js.map +1 -0
  36. package/dist/cli/stacks.d.ts +40 -0
  37. package/dist/cli/stacks.d.ts.map +1 -0
  38. package/dist/cli/stacks.js +294 -0
  39. package/dist/cli/stacks.js.map +1 -0
  40. package/dist/cli/supabase.d.ts +24 -0
  41. package/dist/cli/supabase.d.ts.map +1 -0
  42. package/dist/cli/supabase.js +72 -0
  43. package/dist/cli/supabase.js.map +1 -0
  44. package/dist/cli/tree.d.ts +9 -0
  45. package/dist/cli/tree.d.ts.map +1 -0
  46. package/dist/cli/tree.js +70 -0
  47. package/dist/cli/tree.js.map +1 -0
  48. package/dist/cli/types.d.ts +33 -0
  49. package/dist/cli/types.d.ts.map +1 -0
  50. package/dist/cli/types.js +2 -0
  51. package/dist/cli/types.js.map +1 -0
  52. package/package.json +47 -0
  53. package/templates/.claude/agent-memory/lom-developer/MEMORY.md +20 -0
  54. package/templates/.claude/agent-memory/lom-pm/MEMORY.md +22 -0
  55. package/templates/.claude/agent-memory/lom-tester/MEMORY.md +18 -0
  56. package/templates/.claude/agents/developer-agent.md +56 -0
  57. package/templates/.claude/agents/pm-agent.md +72 -0
  58. package/templates/.claude/agents/tester-agent.md +62 -0
  59. package/templates/CLAUDE.md +63 -0
  60. package/templates/ai/backlog/epics.md +1 -0
  61. package/templates/ai/context/decisions.md +19 -0
  62. package/templates/ai/context/product-vision.md +19 -0
  63. package/templates/ai/context/tech-stack.md +8 -0
  64. package/templates/ai/context/test-log.md +7 -0
  65. package/templates/ai/tasks/tasks-backlog.md +1 -0
  66. package/templates/ai/tasks/tasks-done.md +1 -0
  67. package/templates/ai/tasks/tasks-in-progress.md +1 -0
  68. package/templates/ai/tasks/tasks-in-testing.md +1 -0
  69. package/templates/ai/tasks/tasks-todo.md +1 -0
  70. package/templates/ai/workflows/commit-conventions.md +10 -0
  71. package/templates/ai/workflows/definition-of-done.md +5 -0
  72. package/templates/gitignore +16 -0
  73. 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"}
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -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]