@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 +77 -3
- package/dist/cli.js +159 -12
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +14 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +47 -0
- package/dist/config.js.map +1 -0
- package/dist/detect.d.ts +12 -0
- package/dist/detect.d.ts.map +1 -0
- package/dist/detect.js +371 -0
- package/dist/detect.js.map +1 -0
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -3
- package/dist/index.js.map +1 -1
- package/dist/prompt.d.ts +6 -0
- package/dist/prompt.d.ts.map +1 -1
- package/dist/prompt.js +47 -0
- package/dist/prompt.js.map +1 -1
- package/dist/stack.d.ts +8 -0
- package/dist/stack.d.ts.map +1 -0
- package/dist/stack.js +119 -0
- package/dist/stack.js.map +1 -0
- package/dist/tui.d.ts +20 -0
- package/dist/tui.d.ts.map +1 -0
- package/dist/tui.js +327 -0
- package/dist/tui.js.map +1 -0
- package/dist/types.d.ts +28 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -2
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>
|
|
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 {
|
|
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>
|
|
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 = {
|
|
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 "
|
|
214
|
+
fail(`Unknown mode: ${opts.mode}. Try "quick", "full", or "config".`);
|
|
114
215
|
}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
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
|
-
|
|
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
|
|
125
|
-
|
|
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":";AACA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACpG,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACnF,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGvE,MAAM,WAAW,GAAW,CAAC,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;AAe5E,SAAS,WAAW;IAClB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QAC7F,OAAO,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;IACjE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAED,SAAS,SAAS;IAChB,MAAM,CAAC,GAAG,IAAI,CAAC;IACf,OAAO,CAAC,GAAG,CAAC;EACZ,CAAC,CAAC,cAAc,CAAC;;EAEjB,CAAC,CAAC,OAAO,CAAC;;;EAGV,CAAC,CAAC,OAAO,CAAC;2DAC+C,GAAG,CAAC,WAAW,CAAC;;;;EAIzE,CAAC,CAAC,SAAS,CAAC;;;;;;;;;;;;;EAaZ,CAAC,CAAC,iBAAiB,CAAC;;;;IAIlB,GAAG,CAAC,UAAU,EAAE,CAAC;;;EAGnB,CAAC,CAAC,uBAAuB,CAAC;IACxB,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,GAAG,CAAC,uBAAuB,IAAI,CAAC,GAAG,CAAC;;EAEpG,CAAC,CAAC,UAAU,CAAC;;;;;;CAMd,CAAC,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,IAAc;IAC/B,MAAM,IAAI,GAAY;QACpB,IAAI,EAAE,OAAO;QACb,QAAQ,EAAE,QAAQ;QAClB,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,IAAI;QACZ,SAAS,EAAE,KAAK;KACjB,CAAC;IAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,QAAQ,GAAG,EAAE,CAAC;YACZ,KAAK,IAAI,CAAC;YACV,KAAK,QAAQ;gBACX,SAAS,EAAE,CAAC;gBACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAChB,MAAM;YACR,KAAK,IAAI,CAAC;YACV,KAAK,WAAW;gBACd,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;gBAC3B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAChB,MAAM;YACR,KAAK,QAAQ;gBACX,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;gBACjB,MAAM;YACR,KAAK,YAAY;gBACf,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;gBACnB,MAAM;YACR,KAAK,aAAa;gBAChB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;gBACpB,MAAM;YACR,KAAK,cAAc;gBACjB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;gBACtB,MAAM;YACR,KAAK,OAAO;gBACV,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;gBAChB,MAAM;YACR,KAAK,UAAU;gBACb,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC;gBACjB,MAAM;YACR,KAAK,WAAW;gBACd,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;gBACtB,MAAM;YACR,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC;gBACvB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBACzB,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBAClC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;oBACrB,CAAC,EAAE,CAAC;gBACN,CAAC;gBACD,MAAM;YACR,CAAC;YACD,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBACzB,IAAI,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAY,CAAC,EAAE,CAAC;oBACjD,IAAI,CAAC,0BAA0B,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACzF,CAAC;gBACD,IAAI,CAAC,IAAI,GAAG,IAAY,CAAC;gBACzB,CAAC,EAAE,CAAC;gBACJ,MAAM;YACR,CAAC;YACD;gBACE,IAAI,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC/B,IAAI,CAAC,mBAAmB,GAAG,EAAE,CAAC,CAAC;gBACjC,CAAC;qBAAM,IAAI,GAAG,EAAE,CAAC;oBACf,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;gBAClB,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,IAAI,CAAC,OAAe;IAC3B,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC,CAAC;IAClD,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC,CAAC;IAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,YAAY,GAAuD;IACvE,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE;IAClD,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,sBAAsB,EAAE,KAAK,EAAE,UAAU,EAAE;IAC9D,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE;CACrD,CAAC;AAEF,KAAK,UAAU,OAAO;IACpB,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CACT,IAAI;QACF,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CACxE,CAAC;IACF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,CAAC;IACtD,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3B,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,KAAK,CAAC;AACxD,CAAC;AAED,SAAS,cAAc,CAAC,SAAoB,EAAE,IAAW;IACvD,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChD,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClF,IAAI,IAAI,GAAG,GAAG,CAAC,WAAW,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IACrD,IAAI,IAAI;QAAE,IAAI,IAAI,GAAG,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACpB,CAAC;AAED,SAAS,WAAW,CAAC,GAAW;IAC9B,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC9B,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAElC,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,mBAAmB,CAAC,GAAG,UAAU,EAAE,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACtE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,oBAAoB,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC;IAE1E,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC;IACpD,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,EAAE,GAAG,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACtF,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,GAAG,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACnF,OAAO,CAAC,GAAG,CACT,GAAG,CAAC,gBAAgB,CAAC;YACnB,aAAa,SAAS,CAAC,WAAW,YAAY,SAAS,CAAC,QAAQ,aAAa,SAAS,CAAC,SAAS,eAAe,SAAS,CAAC,UAAU,EAAE,CACxI,CAAC;IACJ,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC;AAED,SAAS,OAAO,CAAC,GAAW,EAAE,GAAW,EAAE,IAAsB,EAAE,SAAgC;IACjG,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE;QACzB,IAAI;QACJ,IAAI,EAAE,SAAS,EAAE,IAAI;QACrB,UAAU,EAAE,SAAS,EAAE,UAAU;QACjC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC,CAAC;IACH,IAAI,CAAC;QACH,UAAU,CAAC,GAAG,CAAC,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,kDAAkD;IACpD,CAAC;AACH,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,IAAI,CAAC,IAAI,CAAC,KAAK;QAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEjC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAE1B,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3B,WAAW,CAAC,GAAG,CAAC,CAAC;QACjB,OAAO;IACT,CAAC;IAED,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,IAAI,CAAC,iBAAiB,IAAI,CAAC,IAAI,qCAAqC,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAE5D,8EAA8E;IAC9E,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACrB,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS;QAAE,IAAI,GAAG,KAAK,EAAE,IAAI,IAAI,GAAG,CAAC,WAAW,CAAC;IAEpE,MAAM,aAAa,GAAG,CAAC,CAAQ,EAAa,EAAE;QAC5C,IAAI,QAAQ,GAAG,cAAc,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QAC5C,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,KAAK,GAAG,YAAY,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;YACzC,IAAI,KAAK;gBAAE,QAAQ,GAAG,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC7C,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC;IAEF,mDAAmD;IACnD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;QACnC,IAAI,SAAS;YAAE,cAAc,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAC/C,SAAS,CAAC,SAAS,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1C,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,SAAS,IAAI,YAAY,EAAE,CAAC,CAAC;IAE/E,IAAI,MAAqB,CAAC;IAE1B,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE;YACtC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI;YAC9C,QAAQ,EAAE,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS;YACjC,SAAS;YACT,aAAa;SACd,CAAC,CAAC;QACH,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACpB,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QACxB,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;QACnC,wDAAwD;QACxD,IAAI,SAAS;YAAE,cAAc,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAC/C,YAAY,CAAC,MAAM,CAAC,CAAC;IACvB,CAAC;SAAM,CAAC;QACN,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACjD,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,IAAI,CAAC,CAAC,IAAI,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,WAAW,CAAC,EAAE,CAAC;YAC9D,IAAI,GAAG,MAAM,OAAO,EAAE,CAAC;YACvB,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;QACnC,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,GAAG,UAAU,EAAE,GAAG,oCAAoC,CAAC,CAAC,CAAC;QACtF,CAAC;QACD,IAAI,SAAS;YAAE,cAAc,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAC/C,MAAM,GAAG,MAAM,UAAU,CAAC,SAAS,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1D,YAAY,CAAC,MAAM,CAAC,CAAC;IACvB,CAAC;IAED,8DAA8D;IAC9D,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAExC,MAAM,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IAEzC,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,IAAa,EAAE,SAAoB,EAAE,MAAqB;IACjF,IAAI,IAAI,CAAC,QAAQ,KAAK,KAAK;QAAE,OAAO;IAEpC,IAAI,UAAU,GAAG,IAAI,CAAC,QAAQ,KAAK,MAAM,CAAC;IAC1C,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,0BAA0B,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;QACtE,MAAM,GAAG,GAAG,MAAM,QAAQ,EAAE,CAAC;QAC7B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3B,UAAU,GAAG,GAAG,KAAK,KAAK,CAAC;IAC7B,CAAC;IACD,IAAI,CAAC,UAAU;QAAE,OAAO;IAExB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,iBAAiB,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IACpE,MAAM,EAAE,GAAG,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;IACjD,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,KAAK,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,yBAAyB,CAAC,GAAI,GAAa,CAAC,OAAO,CAAC,CAAC;IAC5E,CAAC;AACH,CAAC;AAED,IAAI,EAAE;KACH,IAAI,CAAC,GAAG,EAAE,CAAC,UAAU,EAAE,CAAC;KACxB,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACb,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/config.d.ts
ADDED
|
@@ -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"}
|
package/dist/detect.d.ts
ADDED
|
@@ -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"}
|