@geekyants/think-before 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -49,6 +49,68 @@ think-before full --role engineer
49
49
  think-before full --role developer
50
50
  ```
51
51
 
52
+ ## Smart, stack-aware questions
53
+
54
+ Before each run, `think-before` does a quick **read-only scan of your working directory** and figures out whether it's **frontend**, **backend**, or **full-stack** — by recognizing common frameworks and tooling:
55
+
56
+ - **Frontend:** React, Vue, Angular, Svelte, SolidJS, Preact, React Native, Expo, Vite, Tailwind …
57
+ - **Backend:** Express, NestJS, Fastify, Koa, Django, Flask, FastAPI, Laravel, Symfony, Rails, Spring Boot, Go (Gin/Echo/Fiber), Actix/Axum, .NET …
58
+ - **Full-stack meta-frameworks:** Next.js, Nuxt, Remix, SvelteKit, Astro
59
+ - It also notices a **database/ORM** (Prisma, TypeORM, Sequelize, Mongoose, `pg`/`mysql`/`mongodb`, migrations), **Docker**, **monorepos**, and whether **tests** exist.
60
+
61
+ Based on what it finds, it appends a **Stack-specific** section with the questions that actually apply — API-contract and migration-safety questions for a backend, breakpoint/accessibility/shared-component questions for a frontend, deploy-ordering for full-stack, and so on.
62
+
63
+ ```
64
+ Detected full-stack · Next.js, React · role: engineer
65
+
66
+ Stack-specific — full-stack (Next.js, React)
67
+ 22/31 Does this change a request/response shape, field, or status code a client depends on? [y/n] …
68
+ 26/31 Is the schema/migration reversible and backward-compatible with the running code? [y/n] …
69
+ ```
70
+
71
+ Skip the scan anytime with `--no-detect`.
72
+
73
+ ## Your role & saved config
74
+
75
+ The first time you run it in a project, it asks **what your role is** (designer / engineer / developer) and tailors the stack questions to you. Your answer — plus the detected stack — is remembered per project in:
76
+
77
+ ```
78
+ ~/.config/think-before/config.json # honors $XDG_CONFIG_HOME
79
+ ```
80
+
81
+ So next time it doesn't ask again. To change it: `--role <r>` to set explicitly, or `--reset-role` to be asked again. See everything that's stored with:
82
+
83
+ ```bash
84
+ think-before config
85
+ ```
86
+
87
+ ## Full-screen mode
88
+
89
+ By default, in an interactive terminal `think-before` takes over the screen like a classic text-mode installer — one boxed question at a time, no scrollback noise, so you can actually *think* about each one:
90
+
91
+ ```
92
+ ╔══════════════════════════════════════════════════╗
93
+ ║ think-before · quick ║
94
+ ╠══════════════════════════════════════════════════╣
95
+ ║ ║
96
+ ║ Question 5 / 15 · Blast radius ║
97
+ ║ ║
98
+ ║ Could this change behavior in flows you are NOT ║
99
+ ║ going to manually test? ║
100
+ ║ ║
101
+ ║ ↳ The side-effects you don't test for are exactly ║
102
+ ║ the ones that reach production. ║
103
+ ║ ║
104
+ ║ ‹ Yes › ‹ No › ‹ Skip › ║
105
+ ║ ║
106
+ ╚══════════════════════════════════════════════════╝
107
+ y yes n no s skip ? why q quit [███░░░░░░░] 5/15
108
+ ```
109
+
110
+ It uses the terminal's alternate screen buffer (like `vim` or `less`), so when you're done — or quit with `q`/`Ctrl-C` — your terminal is restored exactly as it was, and the summary + report prompt print into your normal scrollback.
111
+
112
+ When input is piped or it's not a real terminal (CI, `| node …`), it automatically falls back to the classic scrolling line mode — so scripting and pipelines still work. Force either mode with `--no-tui` / `--tui`.
113
+
52
114
  ## How to answer
53
115
 
54
116
  Single keypress, no Enter needed:
@@ -68,7 +130,11 @@ Answers that point at risk get **flagged** with a one-line reason. At the end yo
68
130
  ## Options
69
131
 
70
132
  ```
71
- --role <r> In full mode, show shared + one role: designer | engineer | developer
133
+ --role <r> Set your role: designer | engineer | developer (remembered per project)
134
+ --reset-role Forget the saved role and ask again
135
+ --no-detect Skip the project scan and stack-specific questions
136
+ --no-tui Use the classic scrolling line mode instead of full-screen
137
+ --tui Force full-screen mode
72
138
  --save [file] Save a Markdown report (optionally to <file>) without asking
73
139
  --no-save Don't save and don't ask
74
140
  --list Print the checklist and exit (no prompts)
@@ -77,14 +143,22 @@ Answers that point at risk get **flagged** with a one-line reason. At the end yo
77
143
  -h, --help Show this help
78
144
  ```
79
145
 
146
+ There's also a `config` mode (`think-before config`) that prints where your config lives, your saved role, and what was detected in the current directory.
147
+
80
148
  The report is plain Markdown — drop it into a PR description, a ticket, or your design doc.
81
149
 
82
150
  ## Use as a library
83
151
 
84
152
  ```ts
85
- import { quick, full, filterSections, runSession, buildMarkdown } from "@geekyants/think-before";
153
+ import {
154
+ quick, full, filterSections, runSession, buildMarkdown,
155
+ detectProject, stackSection,
156
+ } from "@geekyants/think-before";
157
+
158
+ const detection = detectProject(process.cwd()); // { kind: "fullstack", frameworks: [...] }
159
+ const extra = stackSection(detection, "engineer");
86
160
 
87
- const sections = filterSections(full, "engineer");
161
+ const sections = [...filterSections(full, "engineer"), ...(extra ? [extra] : [])];
88
162
  const result = await runSession(full, sections);
89
163
  const markdown = buildMarkdown(full, result, new Date());
90
164
  ```
package/dist/cli.js CHANGED
@@ -3,7 +3,11 @@ import fs from "node:fs";
3
3
  import { checklists } from "./checklists.js";
4
4
  import { filterSections, runSession } from "./session.js";
5
5
  import { buildMarkdown, defaultReportName, printList, printSummary, saveReport } from "./report.js";
6
- import { askYesNo, closeInput } from "./prompt.js";
6
+ import { askChoice, askYesNo, closeInput } from "./prompt.js";
7
+ import { kindLabel, safeDetect } from "./detect.js";
8
+ import { configPath, loadConfig, saveConfig, setProjectRecord } from "./config.js";
9
+ import { stackSection } from "./stack.js";
10
+ import { runTui, tuiAvailable } from "./tui.js";
7
11
  import { bold, cyan, dim, green, setColor, yellow } from "./colors.js";
8
12
  const VALID_ROLES = ["designer", "engineer", "developer", "shared"];
9
13
  function readVersion() {
@@ -26,9 +30,14 @@ ${b("Usage")}
26
30
  ${b("Modes")}
27
31
  quick Blast-radius check for a small change ${dim("(default)")}
28
32
  full Full pre-development discovery checklist
33
+ config Show stored config + what was detected here
29
34
 
30
35
  ${b("Options")}
31
- --role <r> In full mode, show shared + one role: designer | engineer | developer
36
+ --role <r> Set your role: designer | engineer | developer (remembered per project)
37
+ --reset-role Forget the saved role and ask again
38
+ --no-detect Skip the project scan and stack-specific questions
39
+ --no-tui Use the classic scrolling line mode instead of full-screen
40
+ --tui Force full-screen mode
32
41
  --save [file] Save a Markdown report (optionally to <file>) without asking
33
42
  --no-save Don't save and don't ask
34
43
  --list Print the checklist and exit (no prompts)
@@ -36,6 +45,13 @@ ${b("Options")}
36
45
  -v, --version Print version
37
46
  -h, --help Show this help
38
47
 
48
+ ${b("Smart questions")}
49
+ think-before scans the working directory, detects whether it's frontend,
50
+ backend, or full-stack (React, Next, Express, Django, Rails, …), and adds
51
+ stack-relevant questions. Your role + the detection are saved to
52
+ ${dim(configPath())}
53
+ so you're not asked again next time.
54
+
39
55
  ${b("Keys during a session")}
40
56
  ${cyan("y")} yes · ${cyan("n")} no · ${cyan("s")} skip · ${cyan("?")} why this matters · ${cyan("q")} quit
41
57
 
@@ -44,10 +60,18 @@ ${b("Examples")}
44
60
  npx @geekyants/think-before full
45
61
  npx @geekyants/think-before full --role engineer
46
62
  npx @geekyants/think-before quick --save
63
+ npx @geekyants/think-before config
47
64
  `);
48
65
  }
49
66
  function parseArgs(argv) {
50
- const opts = { mode: "quick", saveMode: "prompt", list: false, color: true };
67
+ const opts = {
68
+ mode: "quick",
69
+ saveMode: "prompt",
70
+ list: false,
71
+ color: true,
72
+ detect: true,
73
+ resetRole: false,
74
+ };
51
75
  for (let i = 0; i < argv.length; i++) {
52
76
  const arg = argv[i];
53
77
  switch (arg) {
@@ -67,6 +91,18 @@ function parseArgs(argv) {
67
91
  case "--no-color":
68
92
  opts.color = false;
69
93
  break;
94
+ case "--no-detect":
95
+ opts.detect = false;
96
+ break;
97
+ case "--reset-role":
98
+ opts.resetRole = true;
99
+ break;
100
+ case "--tui":
101
+ opts.tui = true;
102
+ break;
103
+ case "--no-tui":
104
+ opts.tui = false;
105
+ break;
70
106
  case "--no-save":
71
107
  opts.saveMode = "off";
72
108
  break;
@@ -104,25 +140,136 @@ function fail(message) {
104
140
  console.error(dim("Run `think-before --help` for usage."));
105
141
  process.exit(1);
106
142
  }
143
+ const ROLE_CHOICES = [
144
+ { key: "1", label: "Designer", value: "designer" },
145
+ { key: "2", label: "Engineer / Architect", value: "engineer" },
146
+ { key: "3", label: "Developer", value: "developer" },
147
+ ];
148
+ async function askRole() {
149
+ console.log();
150
+ console.log(bold("What's your role on this project?"));
151
+ console.log(" " +
152
+ ROLE_CHOICES.map((c) => cyan(c.key) + dim(" " + c.label)).join(" "));
153
+ process.stdout.write(dim("Pick 1–3 (or q to skip) "));
154
+ const key = await askChoice(ROLE_CHOICES.map((c) => c.key));
155
+ process.stdout.write("\n");
156
+ return ROLE_CHOICES.find((c) => c.key === key)?.value;
157
+ }
158
+ function printDetection(detection, role) {
159
+ const parts = [cyan(kindLabel(detection.kind))];
160
+ if (detection.frameworks.length)
161
+ parts.push(dim(detection.frameworks.join(", ")));
162
+ let line = dim("Detected ") + parts.join(dim(" · "));
163
+ if (role)
164
+ line += dim(" · role: ") + cyan(role);
165
+ console.log();
166
+ console.log(line);
167
+ }
168
+ function printConfig(cwd) {
169
+ const cfg = loadConfig();
170
+ const rec = cfg.projects[cwd];
171
+ const detection = safeDetect(cwd);
172
+ console.log();
173
+ console.log(bold("think-before config"));
174
+ console.log(dim(" file: ") + configPath());
175
+ console.log(dim(" default role: ") + (cfg.defaultRole ?? dim("—")));
176
+ console.log(dim(" projects saved: ") + Object.keys(cfg.projects).length);
177
+ console.log();
178
+ console.log(bold("This project") + dim(" " + cwd));
179
+ if (detection) {
180
+ const fw = detection.frameworks.length ? ` (${detection.frameworks.join(", ")})` : "";
181
+ console.log(dim(" detected: ") + kindLabel(detection.kind) + fw);
182
+ console.log(dim(" signals: ") + (detection.signals.join(", ") || dim("none")));
183
+ console.log(dim(" flags: ") +
184
+ `database: ${detection.hasDatabase}, tests: ${detection.hasTests}, docker: ${detection.hasDocker}, monorepo: ${detection.isMonorepo}`);
185
+ }
186
+ console.log(dim(" saved role: ") + (rec?.role ?? dim("—")));
187
+ console.log();
188
+ }
189
+ function persist(cfg, cwd, role, detection) {
190
+ setProjectRecord(cfg, cwd, {
191
+ role,
192
+ kind: detection?.kind,
193
+ frameworks: detection?.frameworks,
194
+ updatedAt: new Date().toISOString(),
195
+ });
196
+ try {
197
+ saveConfig(cfg);
198
+ }
199
+ catch {
200
+ /* read-only home; carry on without persistence */
201
+ }
202
+ }
107
203
  async function main() {
108
204
  const opts = parseArgs(process.argv.slice(2));
109
205
  if (!opts.color)
110
206
  setColor(false);
207
+ const cwd = process.cwd();
208
+ if (opts.mode === "config") {
209
+ printConfig(cwd);
210
+ return;
211
+ }
111
212
  const checklist = checklists[opts.mode];
112
213
  if (!checklist) {
113
- fail(`Unknown mode: ${opts.mode}. Try "quick" or "full".`);
214
+ fail(`Unknown mode: ${opts.mode}. Try "quick", "full", or "config".`);
114
215
  }
115
- if (opts.role && opts.mode !== "full") {
116
- console.error(dim("note: --role only affects full mode; ignoring it for quick mode.\n"));
117
- opts.role = undefined;
118
- }
119
- const sections = filterSections(checklist, opts.role);
216
+ const detection = opts.detect ? safeDetect(cwd) : undefined;
217
+ // Resolve role: explicit flag > saved (unless resetting). May still be unset.
218
+ const cfg = loadConfig();
219
+ const saved = cfg.projects[cwd];
220
+ let role = opts.role;
221
+ if (!role && !opts.resetRole)
222
+ role = saved?.role ?? cfg.defaultRole;
223
+ const buildSections = (r) => {
224
+ let sections = filterSections(checklist, r);
225
+ if (detection) {
226
+ const extra = stackSection(detection, r);
227
+ if (extra)
228
+ sections = [...sections, extra];
229
+ }
230
+ return sections;
231
+ };
232
+ // --list never prompts and never goes full-screen.
120
233
  if (opts.list) {
121
- printList(checklist, sections);
234
+ persist(cfg, cwd, role, detection);
235
+ if (detection)
236
+ printDetection(detection, role);
237
+ printList(checklist, buildSections(role));
122
238
  return;
123
239
  }
124
- const result = await runSession(checklist, sections);
125
- printSummary(result);
240
+ const useTui = opts.tui === true || (opts.tui === undefined && tuiAvailable());
241
+ let result;
242
+ if (useTui) {
243
+ const outcome = await runTui(checklist, {
244
+ initialRole: opts.resetRole ? undefined : role,
245
+ needRole: !role || opts.resetRole,
246
+ detection,
247
+ buildSections,
248
+ });
249
+ role = outcome.role;
250
+ result = outcome.result;
251
+ persist(cfg, cwd, role, detection);
252
+ // Print a persistent record into the restored terminal.
253
+ if (detection)
254
+ printDetection(detection, role);
255
+ printSummary(result);
256
+ }
257
+ else {
258
+ const interactive = Boolean(process.stdin.isTTY);
259
+ let askedRole = false;
260
+ if ((!role && interactive) || (opts.resetRole && interactive)) {
261
+ role = await askRole();
262
+ askedRole = true;
263
+ }
264
+ persist(cfg, cwd, role, detection);
265
+ if (askedRole && role) {
266
+ console.log(dim("Saved to " + configPath() + " — change later with --reset-role."));
267
+ }
268
+ if (detection)
269
+ printDetection(detection, role);
270
+ result = await runSession(checklist, buildSections(role));
271
+ printSummary(result);
272
+ }
126
273
  // Nothing to save if the user quit before answering anything.
127
274
  if (result.answers.length === 0)
128
275
  return;
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { Config, ProjectRecord } from "./types.js";
2
+ /** The directory we store user-level config in. Honors $XDG_CONFIG_HOME. */
3
+ export declare function configDir(): string;
4
+ /** The path to the config file itself. */
5
+ export declare function configPath(): string;
6
+ /** Load the user config, returning a fresh empty one if missing/corrupt. */
7
+ export declare function loadConfig(): Config;
8
+ /** Persist the config. Throws only if the directory can't be created/written. */
9
+ export declare function saveConfig(config: Config): void;
10
+ /** Look up what we remember about a project by absolute path. */
11
+ export declare function getProjectRecord(config: Config, projectPath: string): ProjectRecord | undefined;
12
+ /** Merge new facts about a project into the config (does not save). */
13
+ export declare function setProjectRecord(config: Config, projectPath: string, record: ProjectRecord): void;
14
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAIxD,4EAA4E;AAC5E,wBAAgB,SAAS,IAAI,MAAM,CAIlC;AAED,0CAA0C;AAC1C,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAMD,4EAA4E;AAC5E,wBAAgB,UAAU,IAAI,MAAM,CAWnC;AAED,iFAAiF;AACjF,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAG/C;AAED,iEAAiE;AACjE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAE/F;AAED,uEAAuE;AACvE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CAGjG"}
package/dist/config.js ADDED
@@ -0,0 +1,47 @@
1
+ import fs from "node:fs";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ const CONFIG_VERSION = 1;
5
+ /** The directory we store user-level config in. Honors $XDG_CONFIG_HOME. */
6
+ export function configDir() {
7
+ const xdg = process.env["XDG_CONFIG_HOME"];
8
+ const base = xdg && xdg.trim() ? xdg : path.join(os.homedir(), ".config");
9
+ return path.join(base, "think-before");
10
+ }
11
+ /** The path to the config file itself. */
12
+ export function configPath() {
13
+ return path.join(configDir(), "config.json");
14
+ }
15
+ function emptyConfig() {
16
+ return { version: CONFIG_VERSION, projects: {} };
17
+ }
18
+ /** Load the user config, returning a fresh empty one if missing/corrupt. */
19
+ export function loadConfig() {
20
+ try {
21
+ const raw = JSON.parse(fs.readFileSync(configPath(), "utf8"));
22
+ return {
23
+ version: typeof raw.version === "number" ? raw.version : CONFIG_VERSION,
24
+ defaultRole: raw.defaultRole,
25
+ projects: raw.projects ?? {},
26
+ };
27
+ }
28
+ catch {
29
+ return emptyConfig();
30
+ }
31
+ }
32
+ /** Persist the config. Throws only if the directory can't be created/written. */
33
+ export function saveConfig(config) {
34
+ fs.mkdirSync(configDir(), { recursive: true });
35
+ fs.writeFileSync(configPath(), JSON.stringify(config, null, 2) + "\n", "utf8");
36
+ }
37
+ /** Look up what we remember about a project by absolute path. */
38
+ export function getProjectRecord(config, projectPath) {
39
+ return config.projects[projectPath];
40
+ }
41
+ /** Merge new facts about a project into the config (does not save). */
42
+ export function setProjectRecord(config, projectPath, record) {
43
+ config.projects[projectPath] = { ...config.projects[projectPath], ...record };
44
+ if (record.role)
45
+ config.defaultRole = record.role;
46
+ }
47
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,MAAM,cAAc,GAAG,CAAC,CAAC;AAEzB,4EAA4E;AAC5E,MAAM,UAAU,SAAS;IACvB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;IAC1E,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;AACzC,CAAC;AAED,0CAA0C;AAC1C,MAAM,UAAU,UAAU;IACxB,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,aAAa,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,WAAW;IAClB,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;AACnD,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,EAAE,MAAM,CAAC,CAAoB,CAAC;QACjF,OAAO;YACL,OAAO,EAAE,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc;YACvE,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,EAAE;SAC7B,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,WAAW,EAAE,CAAC;IACvB,CAAC;AACH,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,UAAU,CAAC,MAAc;IACvC,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;AACjF,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,gBAAgB,CAAC,MAAc,EAAE,WAAmB;IAClE,OAAO,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AACtC,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,gBAAgB,CAAC,MAAc,EAAE,WAAmB,EAAE,MAAqB;IACzF,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC;IAC9E,IAAI,MAAM,CAAC,IAAI;QAAE,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC;AACpD,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { Detection, ProjectKind } from "./types.js";
2
+ /** A friendly label for a project kind. */
3
+ export declare function kindLabel(kind: ProjectKind): string;
4
+ /**
5
+ * Scan a directory for common framework/tooling signals and classify it as
6
+ * frontend, backend, full-stack, or unknown. Read-only and quick: it reads a
7
+ * handful of manifest files and checks for a few marker folders. Never throws.
8
+ */
9
+ export declare function detectProject(root?: string): Detection;
10
+ /** detectProject wrapped so detection failures never break a run. */
11
+ export declare function safeDetect(root?: string): Detection | undefined;
12
+ //# sourceMappingURL=detect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../src/detect.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAkFzD,2CAA2C;AAC3C,wBAAgB,SAAS,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAWnD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,GAAE,MAAsB,GAAG,SAAS,CA8OrE;AAED,qEAAqE;AACrE,wBAAgB,UAAU,CAAC,IAAI,GAAE,MAAsB,GAAG,SAAS,GAAG,SAAS,CAM9E"}