@slowcook-ai/cli 0.6.6 → 0.6.8

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.
@@ -0,0 +1,368 @@
1
+ /**
2
+ * ts-morph scanner. Walks a consumer's `src/` tree and produces a structured
3
+ * CodeMap. Covers five entity kinds the brewing agent benefits from seeing
4
+ * without having to open every file:
5
+ *
6
+ * 1. API routes — Next.js App Router (`src/app/**\/route.ts(x)`)
7
+ * 2. Pages — Next.js App Router (`src/app/**\/page.tsx`)
8
+ * 3. Components — `src/components/**\/*.tsx` (exported React components)
9
+ * 4. Helpers — `src/lib/**\/*.ts`, `src/utils/**\/*.ts` (exported fns/consts/classes)
10
+ * 5. Types — `src/types/**\/*.ts` (exported types/interfaces/enums)
11
+ *
12
+ * Scope is deliberately Next.js + TypeScript-centric for v1 — the engine is
13
+ * general enough to extend (different frameworks would register their own
14
+ * route-URL derivation), but today we only ship Next.js App Router detection.
15
+ *
16
+ * Output is a plain object — the CLI entry serialises to JSON + renders
17
+ * Markdown. No I/O here beyond reading source files via ts-morph.
18
+ */
19
+ import { existsSync } from "node:fs";
20
+ import { relative as pathRelative, join, sep } from "node:path";
21
+ import { Project, Node, SyntaxKind } from "ts-morph";
22
+ export function generateMap(opts) {
23
+ const { repoRoot, slowcookVersion, now } = opts;
24
+ const map = {
25
+ schema_version: 1,
26
+ slowcook_version: slowcookVersion,
27
+ generated_at: (now ?? new Date()).toISOString(),
28
+ repo_root: ".",
29
+ api_routes: [],
30
+ pages: [],
31
+ components: [],
32
+ helpers: [],
33
+ types: [],
34
+ };
35
+ // Bail out cleanly if the consumer has no src/ at all.
36
+ if (!existsSync(join(repoRoot, "src")))
37
+ return map;
38
+ const project = new Project({
39
+ useInMemoryFileSystem: false,
40
+ // No type-checking needed — we only read syntactic structure.
41
+ skipAddingFilesFromTsConfig: true,
42
+ skipFileDependencyResolution: true,
43
+ });
44
+ const globPatterns = [
45
+ "src/app/**/route.ts",
46
+ "src/app/**/route.tsx",
47
+ "src/app/**/page.tsx",
48
+ "src/app/**/page.ts",
49
+ "src/components/**/*.tsx",
50
+ "src/lib/**/*.ts",
51
+ "src/utils/**/*.ts",
52
+ "src/types/**/*.ts",
53
+ ].map((g) => join(repoRoot, g));
54
+ project.addSourceFilesAtPaths(globPatterns);
55
+ for (const sf of project.getSourceFiles()) {
56
+ const rel = pathRelative(repoRoot, sf.getFilePath()).split(sep).join("/");
57
+ if (/^src\/app\/.*\/route\.tsx?$/.test(rel)) {
58
+ scanApiRouteFile(sf, rel, map);
59
+ continue;
60
+ }
61
+ if (/^src\/app\/.*\/page\.tsx?$/.test(rel)) {
62
+ scanPageFile(sf, rel, map);
63
+ continue;
64
+ }
65
+ if (/^src\/components\//.test(rel)) {
66
+ scanComponentFile(sf, rel, map);
67
+ continue;
68
+ }
69
+ if (/^src\/(lib|utils)\//.test(rel)) {
70
+ scanHelperFile(sf, rel, map);
71
+ continue;
72
+ }
73
+ if (/^src\/types\//.test(rel)) {
74
+ scanTypesFile(sf, rel, map);
75
+ continue;
76
+ }
77
+ }
78
+ // Stable ordering so the JSON diffs cleanly across regenerations.
79
+ sortMap(map);
80
+ return map;
81
+ }
82
+ function sortMap(map) {
83
+ map.api_routes.sort((a, b) => a.path.localeCompare(b.path) || a.method.localeCompare(b.method));
84
+ map.pages.sort((a, b) => a.path.localeCompare(b.path));
85
+ map.components.sort((a, b) => a.file.localeCompare(b.file) || a.name.localeCompare(b.name));
86
+ map.helpers.sort((a, b) => a.file.localeCompare(b.file) || a.name.localeCompare(b.name));
87
+ map.types.sort((a, b) => a.file.localeCompare(b.file) || a.name.localeCompare(b.name));
88
+ }
89
+ // -------------------------------------------------------------------------
90
+ // Per-kind scanners
91
+ // -------------------------------------------------------------------------
92
+ function scanApiRouteFile(sf, rel, map) {
93
+ const urlPath = appRouterUrlPath(rel);
94
+ const imports = collectImports(sf);
95
+ const httpMethods = new Set(["GET", "POST", "PUT", "PATCH", "DELETE", "HEAD", "OPTIONS"]);
96
+ for (const fn of sf.getFunctions()) {
97
+ if (!fn.isExported())
98
+ continue;
99
+ const name = fn.getName();
100
+ if (!name || !httpMethods.has(name.toUpperCase()))
101
+ continue;
102
+ map.api_routes.push({
103
+ method: name.toUpperCase(),
104
+ path: urlPath,
105
+ file: rel,
106
+ function: name,
107
+ jsdoc: getJsDoc(fn),
108
+ imports,
109
+ });
110
+ }
111
+ // Also accept `export const POST = async (req) => {...}` style.
112
+ for (const vs of sf.getVariableStatements()) {
113
+ if (!vs.isExported())
114
+ continue;
115
+ for (const decl of vs.getDeclarations()) {
116
+ const name = decl.getName();
117
+ if (!httpMethods.has(name.toUpperCase()))
118
+ continue;
119
+ map.api_routes.push({
120
+ method: name.toUpperCase(),
121
+ path: urlPath,
122
+ file: rel,
123
+ function: name,
124
+ jsdoc: getJsDoc(vs),
125
+ imports,
126
+ });
127
+ }
128
+ }
129
+ }
130
+ function scanPageFile(sf, rel, map) {
131
+ const urlPath = appRouterUrlPath(rel);
132
+ const componentName = findDefaultExportName(sf);
133
+ const jsdoc = getJsDocOnDefaultExport(sf) ??
134
+ getJsDocOnFirstExportedFunction(sf);
135
+ map.pages.push({ path: urlPath, file: rel, component: componentName, jsdoc });
136
+ }
137
+ function scanComponentFile(sf, rel, map) {
138
+ // Default export component
139
+ const def = findDefaultExportName(sf);
140
+ if (def && /^[A-Z]/.test(def)) {
141
+ map.components.push({
142
+ name: def,
143
+ file: rel,
144
+ exportKind: "default",
145
+ props_type: extractPropsType(sf, def),
146
+ jsdoc: getJsDocOnDefaultExport(sf),
147
+ });
148
+ }
149
+ // Named exports that look like components (PascalCase function/const)
150
+ for (const fn of sf.getFunctions()) {
151
+ if (!fn.isExported() || fn.isDefaultExport())
152
+ continue;
153
+ const name = fn.getName();
154
+ if (!name || !/^[A-Z]/.test(name))
155
+ continue;
156
+ map.components.push({
157
+ name,
158
+ file: rel,
159
+ exportKind: "named",
160
+ props_type: extractPropsType(sf, name),
161
+ jsdoc: getJsDoc(fn),
162
+ });
163
+ }
164
+ for (const vs of sf.getVariableStatements()) {
165
+ if (!vs.isExported())
166
+ continue;
167
+ for (const decl of vs.getDeclarations()) {
168
+ const name = decl.getName();
169
+ if (!/^[A-Z]/.test(name))
170
+ continue;
171
+ map.components.push({
172
+ name,
173
+ file: rel,
174
+ exportKind: "named",
175
+ props_type: extractPropsType(sf, name),
176
+ jsdoc: getJsDoc(vs),
177
+ });
178
+ }
179
+ }
180
+ }
181
+ function scanHelperFile(sf, rel, map) {
182
+ for (const fn of sf.getFunctions()) {
183
+ if (!fn.isExported())
184
+ continue;
185
+ const name = fn.getName();
186
+ if (!name)
187
+ continue;
188
+ map.helpers.push({
189
+ name,
190
+ kind: "function",
191
+ file: rel,
192
+ signature: functionSignature(fn),
193
+ jsdoc: getJsDoc(fn),
194
+ });
195
+ }
196
+ for (const cls of sf.getClasses()) {
197
+ if (!cls.isExported())
198
+ continue;
199
+ const name = cls.getName();
200
+ if (!name)
201
+ continue;
202
+ map.helpers.push({
203
+ name,
204
+ kind: "class",
205
+ file: rel,
206
+ signature: `class ${name}`,
207
+ jsdoc: getJsDoc(cls),
208
+ });
209
+ }
210
+ for (const vs of sf.getVariableStatements()) {
211
+ if (!vs.isExported())
212
+ continue;
213
+ for (const decl of vs.getDeclarations()) {
214
+ const name = decl.getName();
215
+ // Skip obvious non-helpers (PascalCase is probably a component or type)
216
+ // but keep PascalCase constants (ALL_CAPS) and regular camelCase consts.
217
+ if (/^[A-Z][a-z]/.test(name))
218
+ continue;
219
+ map.helpers.push({
220
+ name,
221
+ kind: "const",
222
+ file: rel,
223
+ signature: constSignature(decl.getName(), decl.getTypeNode()?.getText()),
224
+ jsdoc: getJsDoc(vs),
225
+ });
226
+ }
227
+ }
228
+ }
229
+ function scanTypesFile(sf, rel, map) {
230
+ for (const iface of sf.getInterfaces()) {
231
+ if (!iface.isExported())
232
+ continue;
233
+ map.types.push({
234
+ name: iface.getName(),
235
+ kind: "interface",
236
+ file: rel,
237
+ declaration: iface.getText().split("\n").slice(0, 6).join("\n"),
238
+ jsdoc: getJsDoc(iface),
239
+ });
240
+ }
241
+ for (const alias of sf.getTypeAliases()) {
242
+ if (!alias.isExported())
243
+ continue;
244
+ map.types.push({
245
+ name: alias.getName(),
246
+ kind: "type",
247
+ file: rel,
248
+ declaration: alias.getText(),
249
+ jsdoc: getJsDoc(alias),
250
+ });
251
+ }
252
+ for (const en of sf.getEnums()) {
253
+ if (!en.isExported())
254
+ continue;
255
+ map.types.push({
256
+ name: en.getName(),
257
+ kind: "enum",
258
+ file: rel,
259
+ declaration: en.getText().split("\n").slice(0, 12).join("\n"),
260
+ jsdoc: getJsDoc(en),
261
+ });
262
+ }
263
+ }
264
+ // -------------------------------------------------------------------------
265
+ // Small helpers
266
+ // -------------------------------------------------------------------------
267
+ /**
268
+ * Derive the Next.js App Router URL path from a file path under src/app.
269
+ * Strips the leading `src/app`, drops the trailing `/route.ts(x)` or
270
+ * `/page.tsx`, converts `[param]` → `:param` for readability, collapses
271
+ * route groups `(auth)` which are path-invisible.
272
+ */
273
+ function appRouterUrlPath(rel) {
274
+ let p = rel.replace(/^src\/app/, "").replace(/\/(route|page)\.tsx?$/, "");
275
+ if (p === "")
276
+ p = "/";
277
+ // Drop route groups like /(auth)/
278
+ p = p.replace(/\/\([^)]+\)/g, "");
279
+ // Params: [id] → :id, [[...slug]] → :slug? (we simplify)
280
+ p = p.replace(/\[\[\.\.\.(\w+)\]\]/g, ":$1*");
281
+ p = p.replace(/\[\.\.\.(\w+)\]/g, ":$1*");
282
+ p = p.replace(/\[(\w+)\]/g, ":$1");
283
+ return p || "/";
284
+ }
285
+ function collectImports(sf) {
286
+ return sf
287
+ .getImportDeclarations()
288
+ .map((d) => d.getModuleSpecifierValue())
289
+ .filter((s) => typeof s === "string");
290
+ }
291
+ function getJsDoc(node) {
292
+ const docs = node.getJsDocs?.();
293
+ if (!docs || docs.length === 0)
294
+ return undefined;
295
+ const raw = docs[docs.length - 1]?.getDescription() ?? "";
296
+ const trimmed = raw.trim();
297
+ return trimmed.length > 0 ? trimmed : undefined;
298
+ }
299
+ function findDefaultExportName(sf) {
300
+ // Case 1: `export default function Name() {}` or `export default async function Name()`
301
+ for (const fn of sf.getFunctions()) {
302
+ if (fn.isDefaultExport())
303
+ return fn.getName() ?? "(anonymous)";
304
+ }
305
+ // Case 2: `export default Name` where Name is a local declaration
306
+ const exportAssign = sf
307
+ .getExportAssignments()
308
+ .find((e) => !e.isExportEquals());
309
+ if (exportAssign) {
310
+ const expr = exportAssign.getExpression();
311
+ if (Node.isIdentifier(expr))
312
+ return expr.getText();
313
+ }
314
+ return undefined;
315
+ }
316
+ function getJsDocOnDefaultExport(sf) {
317
+ for (const fn of sf.getFunctions()) {
318
+ if (fn.isDefaultExport())
319
+ return getJsDoc(fn);
320
+ }
321
+ const exportAssign = sf
322
+ .getExportAssignments()
323
+ .find((e) => !e.isExportEquals());
324
+ if (exportAssign)
325
+ return getJsDoc(exportAssign);
326
+ return undefined;
327
+ }
328
+ function getJsDocOnFirstExportedFunction(sf) {
329
+ for (const fn of sf.getFunctions()) {
330
+ if (fn.isExported())
331
+ return getJsDoc(fn);
332
+ }
333
+ return undefined;
334
+ }
335
+ function extractPropsType(sf, componentName) {
336
+ // Heuristic: if there's a local `interface <Component>Props` or
337
+ // `type <Component>Props`, surface it.
338
+ const wanted = `${componentName}Props`;
339
+ const iface = sf.getInterface(wanted);
340
+ if (iface)
341
+ return wanted;
342
+ const alias = sf.getTypeAlias(wanted);
343
+ if (alias)
344
+ return wanted;
345
+ return undefined;
346
+ }
347
+ function functionSignature(fn) {
348
+ const asyncKw = fn.isAsync() ? "async " : "";
349
+ const name = fn.getName() ?? "(anonymous)";
350
+ const params = fn
351
+ .getParameters()
352
+ .map((p) => {
353
+ const n = p.getName();
354
+ const t = p.getTypeNode()?.getText();
355
+ const opt = p.isOptional() ? "?" : "";
356
+ return t ? `${n}${opt}: ${t}` : `${n}${opt}`;
357
+ })
358
+ .join(", ");
359
+ const ret = fn.getReturnTypeNode()?.getText();
360
+ return `${asyncKw}function ${name}(${params})${ret ? `: ${ret}` : ""}`;
361
+ }
362
+ function constSignature(name, typeText) {
363
+ return typeText ? `const ${name}: ${typeText}` : `const ${name}`;
364
+ }
365
+ // SyntaxKind is imported but only to satisfy a future check; reference here
366
+ // keeps ts-check happy if tree-shaking removes the direct usage.
367
+ void SyntaxKind;
368
+ //# sourceMappingURL=scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../../src/commands/map/scan.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@slowcook-ai/cli",
3
- "version": "0.6.6",
3
+ "version": "0.6.8",
4
4
  "description": "CLI for the slowcook brewing harness",
5
5
  "license": "MIT",
6
6
  "author": "aminazar",
@@ -35,11 +35,12 @@
35
35
  "dependencies": {
36
36
  "@anthropic-ai/sdk": "^0.32.1",
37
37
  "@octokit/rest": "^21.0.2",
38
+ "ts-morph": "^24.0.0",
38
39
  "yaml": "^2.6.0",
39
40
  "zod": "^3.23.8",
41
+ "@slowcook-ai/core": "^0.5.0",
40
42
  "@slowcook-ai/stack-ts": "^0.6.2",
41
- "@slowcook-ai/forge-github": "^0.5.0",
42
- "@slowcook-ai/core": "^0.5.0"
43
+ "@slowcook-ai/forge-github": "^0.5.0"
43
44
  },
44
45
  "publishConfig": {
45
46
  "access": "public"