@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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stack.js","sourceRoot":"","sources":["../src/stack.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAexC,MAAM,SAAS,GAAW,CAAC,UAAU,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;AAChE,MAAM,UAAU,GAAW,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;AAErD,MAAM,UAAU,GAAc,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC;AACrF,MAAM,SAAS,GAAc,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC;AACnF,MAAM,KAAK,GAAc,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC;AAC9D,MAAM,WAAW,GAAc,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC;AAE7D,SAAS,CAAC,CAAC,EAAU,EAAE,IAAY,EAAE,KAAkB,EAAE,GAAW;IAClE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,GAAgB;IAC9B,mBAAmB;IACnB;QACE,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,SAAS;QAChB,CAAC,EAAE,CAAC,CAAC,gBAAgB,EAAE,wFAAwF,EAAE,IAAI,EACnH,uEAAuE,CAAC;KAC3E;IACD;QACE,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,SAAS;QAChB,CAAC,EAAE,CAAC,CAAC,SAAS,EAAE,wFAAwF,EAAE,IAAI,EAC5G,qFAAqF,CAAC;KACzF;IACD;QACE,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,SAAS;QAChB,CAAC,EAAE,CAAC,CAAC,cAAc,EAAE,gFAAgF,EAAE,KAAK,EAC1G,qEAAqE,CAAC;KACzE;IACD;QACE,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,UAAU;QACjB,CAAC,EAAE,CAAC,CAAC,UAAU,EAAE,qFAAqF,EAAE,KAAK,EAC3G,8DAA8D,CAAC;KAClE;IACD;QACE,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,UAAU;QACjB,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,wFAAwF,EAAE,KAAK,EAC/G,oFAAoF,CAAC;KACxF;IACD;QACE,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,UAAU;QACjB,CAAC,EAAE,CAAC,CAAC,UAAU,EAAE,iGAAiG,EAAE,KAAK,EACvH,mEAAmE,CAAC;KACvE;IAED,kBAAkB;IAClB;QACE,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,UAAU;QACjB,CAAC,EAAE,CAAC,CAAC,iBAAiB,EAAE,uFAAuF,EAAE,KAAK,EACpH,2FAA2F,CAAC;KAC/F;IACD;QACE,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,UAAU;QACjB,CAAC,EAAE,CAAC,CAAC,UAAU,EAAE,0EAA0E,EAAE,KAAK,EAChG,2EAA2E,CAAC;KAC/E;IACD;QACE,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,UAAU;QACjB,CAAC,EAAE,CAAC,CAAC,eAAe,EAAE,sFAAsF,EAAE,IAAI,EAChH,mFAAmF,CAAC;KACvF;IACD;QACE,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,UAAU;QACjB,CAAC,EAAE,CAAC,CAAC,aAAa,EAAE,0FAA0F,EAAE,KAAK,EACnH,yEAAyE,CAAC;KAC7E;IAED,qDAAqD;IACrD;QACE,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,UAAU;QACjB,CAAC,EAAE,CAAC,CAAC,cAAc,EAAE,mFAAmF,EAAE,IAAI,EAC5G,4EAA4E,CAAC;KAChF;IACD;QACE,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,UAAU;QACjB,CAAC,EAAE,CAAC,CAAC,gBAAgB,EAAE,oFAAoF,EAAE,IAAI,EAC/G,oEAAoE,CAAC;KACxE;IACD;QACE,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,UAAU;QACjB,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,uEAAuE,EAAE,KAAK,EAC9F,2DAA2D,CAAC;KAC/D;IAED,8BAA8B;IAC9B;QACE,IAAI,EAAE,WAAW;QACjB,KAAK,EAAE,UAAU;QACjB,CAAC,EAAE,CAAC,CAAC,iBAAiB,EAAE,2FAA2F,EAAE,IAAI,EACvH,8EAA8E,CAAC;KAClF;IAED,2BAA2B;IAC3B;QACE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ;QACxB,KAAK,EAAE,UAAU;QACjB,CAAC,EAAE,CAAC,CAAC,UAAU,EAAE,kGAAkG,EAAE,IAAI,EACvH,gFAAgF,CAAC;KACpF;IACD;QACE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS;QACxB,KAAK,EAAE,UAAU;QACjB,CAAC,EAAE,CAAC,CAAC,eAAe,EAAE,0FAA0F,EAAE,IAAI,EACpH,mFAAmF,CAAC;KACvF;CACF,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,SAAoB,EAAE,IAAW;IAC5D,IAAI,SAAS,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAE9C,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;SAC1D,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;SAC9C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEnB,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAExC,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;IACtF,OAAO;QACL,EAAE,EAAE,OAAO;QACX,KAAK,EAAE,oBAAoB,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE;QAC3D,KAAK,EAAE,CAAC,QAAQ,CAAC;QACjB,SAAS;KACV,CAAC;AACJ,CAAC"}
package/dist/tui.d.ts ADDED
@@ -0,0 +1,20 @@
1
+ import type { Checklist, Detection, Role, Section, SessionResult } from "./types.js";
2
+ export interface TuiOptions {
3
+ initialRole?: Role;
4
+ needRole: boolean;
5
+ detection?: Detection | undefined;
6
+ buildSections: (role?: Role) => Section[];
7
+ }
8
+ export interface TuiOutcome {
9
+ result: SessionResult;
10
+ role?: Role;
11
+ }
12
+ /**
13
+ * Run a full-screen session. Optionally asks for the role first, shows a
14
+ * welcome screen, then one question per screen, then a final screen. Always
15
+ * restores the terminal, even on quit or error.
16
+ */
17
+ export declare function runTui(checklist: Checklist, opts: TuiOptions): Promise<TuiOutcome>;
18
+ /** Whether a full-screen TUI is viable (both ends are real terminals). */
19
+ export declare function tuiAvailable(): boolean;
20
+ //# sourceMappingURL=tui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../src/tui.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAkB,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAsQrG,MAAM,WAAW,UAAU;IACzB,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAClC,aAAa,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,KAAK,OAAO,EAAE,CAAC;CAC3C;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,aAAa,CAAC;IACtB,IAAI,CAAC,EAAE,IAAI,CAAC;CACb;AAID;;;;GAIG;AACH,wBAAsB,MAAM,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CA+FxF;AAED,0EAA0E;AAC1E,wBAAgB,YAAY,IAAI,OAAO,CAEtC"}
package/dist/tui.js ADDED
@@ -0,0 +1,327 @@
1
+ import readline from "node:readline";
2
+ import { bold, cyan, dim, green, yellow } from "./colors.js";
3
+ import { kindLabel } from "./detect.js";
4
+ // A hand-rolled, zero-dependency full-screen TUI in the style of a classic
5
+ // text-mode installer: it takes over the alternate screen buffer, shows one
6
+ // boxed question at a time, and restores the original terminal on exit.
7
+ const ALT_ON = "\x1b[?1049h";
8
+ const ALT_OFF = "\x1b[?1049l";
9
+ const CURSOR_HIDE = "\x1b[?25l";
10
+ const CURSOR_SHOW = "\x1b[?25h";
11
+ const CLEAR = "\x1b[2J";
12
+ const pos = (row, col) => `\x1b[${row};${col}H`;
13
+ function size() {
14
+ return {
15
+ cols: Math.max(40, process.stdout.columns || 80),
16
+ rows: Math.max(15, process.stdout.rows || 24),
17
+ };
18
+ }
19
+ // --- text helpers (operate on plain strings; styling is applied after) ---
20
+ function wrapText(text, width) {
21
+ const words = text.split(/\s+/).filter(Boolean);
22
+ const lines = [];
23
+ let line = "";
24
+ for (const word of words) {
25
+ if (line.length === 0) {
26
+ line = word;
27
+ }
28
+ else if (line.length + 1 + word.length <= width) {
29
+ line += " " + word;
30
+ }
31
+ else {
32
+ lines.push(line);
33
+ line = word;
34
+ }
35
+ }
36
+ if (line)
37
+ lines.push(line);
38
+ return lines.length ? lines : [""];
39
+ }
40
+ /** Left-align plain text padded (or truncated) to exactly `width` columns. */
41
+ function fitL(width, s) {
42
+ if (s.length >= width)
43
+ return s.slice(0, width);
44
+ return s + " ".repeat(width - s.length);
45
+ }
46
+ /** Center plain text within exactly `width` columns. */
47
+ function fitC(width, s) {
48
+ if (s.length >= width)
49
+ return s.slice(0, width);
50
+ const lead = Math.floor((width - s.length) / 2);
51
+ return " ".repeat(lead) + s + " ".repeat(width - s.length - lead);
52
+ }
53
+ /** Pad an already-styled string (whose visible width is `visible`) to `width`. */
54
+ function padStyled(styled, visible, width) {
55
+ return visible >= width ? styled : styled + " ".repeat(width - visible);
56
+ }
57
+ // --- low-level screen + input ---
58
+ let entered = false;
59
+ const keyQueue = [];
60
+ const keyWaiters = [];
61
+ let currentRender = null;
62
+ function onKeypress(str, key) {
63
+ let norm;
64
+ if (key && key.ctrl && key.name === "c")
65
+ norm = "quit";
66
+ else if (key && key.name === "return")
67
+ norm = "enter";
68
+ else if (key && key.name === "escape")
69
+ norm = "quit";
70
+ else
71
+ norm = (str || key?.name || "").toLowerCase();
72
+ if (norm === "q")
73
+ norm = "quit"; // q always quits, consistent with the hint
74
+ if (!norm)
75
+ return;
76
+ const waiter = keyWaiters.shift();
77
+ if (waiter)
78
+ waiter(norm);
79
+ else
80
+ keyQueue.push(norm);
81
+ }
82
+ function nextKey() {
83
+ const queued = keyQueue.shift();
84
+ if (queued !== undefined)
85
+ return Promise.resolve(queued);
86
+ return new Promise((resolve) => keyWaiters.push(resolve));
87
+ }
88
+ function onResize() {
89
+ if (currentRender)
90
+ currentRender();
91
+ }
92
+ function setup() {
93
+ if (entered)
94
+ return;
95
+ entered = true;
96
+ process.stdout.write(ALT_ON + CURSOR_HIDE + CLEAR);
97
+ readline.emitKeypressEvents(process.stdin);
98
+ if (process.stdin.isTTY)
99
+ process.stdin.setRawMode(true);
100
+ process.stdin.resume();
101
+ process.stdin.on("keypress", onKeypress);
102
+ process.stdout.on("resize", onResize);
103
+ process.on("exit", restore);
104
+ process.on("SIGINT", onSigint);
105
+ process.on("SIGTERM", onSigterm);
106
+ }
107
+ function onSigint() {
108
+ restore();
109
+ process.exit(130);
110
+ }
111
+ function onSigterm() {
112
+ restore();
113
+ process.exit(143);
114
+ }
115
+ /** Idempotent teardown — safe to call from finally, exit, and signal handlers. */
116
+ function restore() {
117
+ if (!entered)
118
+ return;
119
+ entered = false;
120
+ process.stdin.removeListener("keypress", onKeypress);
121
+ process.stdout.removeListener("resize", onResize);
122
+ process.removeListener("exit", restore);
123
+ process.removeListener("SIGINT", onSigint);
124
+ process.removeListener("SIGTERM", onSigterm);
125
+ if (process.stdin.isTTY)
126
+ process.stdin.setRawMode(false);
127
+ process.stdin.pause();
128
+ process.stdout.write(CURSOR_SHOW + ALT_OFF);
129
+ currentRender = null;
130
+ }
131
+ function paint(title, buildBody, buildHint) {
132
+ currentRender = () => {
133
+ const { cols, rows } = size();
134
+ const inner = Math.max(24, Math.min(64, cols - 8));
135
+ const panelWidth = inner + 4;
136
+ const left = Math.max(1, Math.floor((cols - panelWidth) / 2));
137
+ const bar = "═".repeat(panelWidth - 2);
138
+ const body = buildBody(inner);
139
+ const panel = [];
140
+ panel.push(cyan("╔" + bar + "╗"));
141
+ panel.push(cyan("║") + bold(fitC(panelWidth - 2, title)) + cyan("║"));
142
+ panel.push(cyan("╠" + bar + "╣"));
143
+ for (const line of body)
144
+ panel.push(cyan("║") + " " + line + " " + cyan("║"));
145
+ panel.push(cyan("╚" + bar + "╝"));
146
+ const top = Math.max(0, Math.floor((rows - (panel.length + 2)) / 2));
147
+ let out = CLEAR;
148
+ panel.forEach((line, i) => {
149
+ out += pos(top + i + 1, left + 1) + line;
150
+ });
151
+ out += pos(top + panel.length + 2, left + 1) + buildHint(inner);
152
+ out += pos(rows, cols);
153
+ process.stdout.write(out);
154
+ };
155
+ currentRender();
156
+ }
157
+ const blank = (inner) => " ".repeat(inner);
158
+ function buttonsLine(inner) {
159
+ const defs = [["Yes", "y"], ["No", "n"], ["Skip", "s"]];
160
+ const plain = defs.map(([label]) => `‹ ${label} ›`).join(" ");
161
+ const lead = Math.max(0, Math.floor((inner - plain.length) / 2));
162
+ const styled = defs
163
+ .map(([label]) => "‹ " + bold(yellow(label[0])) + label.slice(1) + " ›")
164
+ .join(" ");
165
+ return padStyled(" ".repeat(lead) + styled, lead + plain.length, inner);
166
+ }
167
+ function progressHint(done, total) {
168
+ const keys = cyan("y") + dim(" yes ") + cyan("n") + dim(" no ") +
169
+ cyan("s") + dim(" skip ") + cyan("?") + dim(" why ") + cyan("q") + dim(" quit");
170
+ const width = 10;
171
+ const filled = total > 0 ? Math.round((done / total) * width) : 0;
172
+ const barbar = "█".repeat(filled) + "░".repeat(width - filled);
173
+ return keys + dim(" [" + barbar + "] " + done + "/" + total);
174
+ }
175
+ // --- screens ---
176
+ function questionScreen(checklist, section, q, index, total, showWhy) {
177
+ paint(`think-before · ${checklist.id}`, (inner) => {
178
+ const lines = [blank(inner)];
179
+ lines.push(dim(fitL(inner, `Question ${index} / ${total} · ${section.title}`)));
180
+ lines.push(blank(inner));
181
+ for (const w of wrapText(q.text, inner))
182
+ lines.push(fitL(inner, w));
183
+ if (showWhy && q.why) {
184
+ lines.push(blank(inner));
185
+ const wrapped = wrapText(q.why, inner - 2);
186
+ wrapped.forEach((w, i) => {
187
+ const prefix = i === 0 ? "↳ " : " ";
188
+ lines.push(dim(fitL(inner, prefix + w)));
189
+ });
190
+ }
191
+ lines.push(blank(inner));
192
+ lines.push(buttonsLine(inner));
193
+ lines.push(blank(inner));
194
+ return lines;
195
+ }, () => progressHint(index, total));
196
+ }
197
+ function infoScreen(title, bodyLines, hint) {
198
+ paint(title, (inner) => {
199
+ const lines = [blank(inner)];
200
+ for (const { text, style } of bodyLines) {
201
+ const fitted = fitC(inner, text);
202
+ lines.push(style ? style(fitted) : fitted);
203
+ }
204
+ lines.push(blank(inner));
205
+ return lines;
206
+ }, (inner) => fitC(inner, hint));
207
+ }
208
+ function roleScreen() {
209
+ paint("think-before · who are you?", (inner) => {
210
+ const lines = [blank(inner)];
211
+ lines.push(fitL(inner, "What's your role on this project?"));
212
+ lines.push(blank(inner));
213
+ const opts = [
214
+ ["1", "Designer"],
215
+ ["2", "Engineer / Architect"],
216
+ ["3", "Developer"],
217
+ ];
218
+ for (const [key, label] of opts) {
219
+ const plain = ` ${key} ${label}`;
220
+ const styled = " " + bold(yellow(key)) + " " + label;
221
+ lines.push(padStyled(styled, plain.length, inner));
222
+ }
223
+ lines.push(blank(inner));
224
+ lines.push(dim(fitL(inner, "Tailors the questions to you and is remembered next time.")));
225
+ lines.push(blank(inner));
226
+ return lines;
227
+ }, (inner) => fitC(inner, "1–3 to choose · q to skip"));
228
+ }
229
+ const ROLE_BY_KEY = { "1": "designer", "2": "engineer", "3": "developer" };
230
+ /**
231
+ * Run a full-screen session. Optionally asks for the role first, shows a
232
+ * welcome screen, then one question per screen, then a final screen. Always
233
+ * restores the terminal, even on quit or error.
234
+ */
235
+ export async function runTui(checklist, opts) {
236
+ const answers = [];
237
+ let aborted = false;
238
+ let role = opts.initialRole;
239
+ setup();
240
+ try {
241
+ // 1. Role (only if we don't already know it).
242
+ if (opts.needRole) {
243
+ roleScreen();
244
+ let picked = false;
245
+ while (!picked) {
246
+ const key = await nextKey();
247
+ if (key === "quit")
248
+ return finish();
249
+ if (ROLE_BY_KEY[key]) {
250
+ role = ROLE_BY_KEY[key];
251
+ picked = true;
252
+ }
253
+ }
254
+ }
255
+ // 2. Welcome.
256
+ const detectLine = opts.detection
257
+ ? `Detected: ${kindLabel(opts.detection.kind)}` +
258
+ (opts.detection.frameworks.length ? ` (${opts.detection.frameworks.join(", ")})` : "")
259
+ : "No stack scan";
260
+ infoScreen(`think-before · ${checklist.id}`, [
261
+ { text: checklist.intro ?? "A focused pre-flight check.", style: dim },
262
+ { text: "", style: dim },
263
+ { text: detectLine, style: cyan },
264
+ { text: role ? `Role: ${role}` : "Role: not set", style: dim },
265
+ ], "Press any key to begin · q to quit");
266
+ if ((await nextKey()) === "quit")
267
+ return finish();
268
+ // 3. Questions.
269
+ const sections = opts.buildSections(role);
270
+ const total = sections.reduce((n, s) => n + s.questions.length, 0);
271
+ let index = 0;
272
+ for (const section of sections) {
273
+ for (const q of section.questions) {
274
+ index++;
275
+ let showWhy = true;
276
+ questionScreen(checklist, section, q, index, total, showWhy);
277
+ let answered = false;
278
+ while (!answered) {
279
+ const key = await nextKey();
280
+ if (key === "quit") {
281
+ aborted = true;
282
+ answered = true;
283
+ }
284
+ else if (key === "y" || key === "n" || key === "s" || key === "enter") {
285
+ const value = key === "y" ? "yes" : key === "n" ? "no" : "skip";
286
+ answers.push({ question: q, section, value, flagged: value === q.risky });
287
+ answered = true;
288
+ }
289
+ else if (key === "?") {
290
+ showWhy = !showWhy;
291
+ questionScreen(checklist, section, q, index, total, showWhy);
292
+ }
293
+ }
294
+ if (aborted)
295
+ break;
296
+ }
297
+ if (aborted)
298
+ break;
299
+ }
300
+ // 4. Final screen (only if they finished).
301
+ if (!aborted) {
302
+ const flagged = answers.filter((a) => a.flagged).length;
303
+ const skipped = answers.filter((a) => a.value === "skip").length;
304
+ infoScreen("think-before · done", [
305
+ {
306
+ text: flagged > 0 ? `${flagged} answer${flagged === 1 ? "" : "s"} worth a second look` : "No flags raised — go build.",
307
+ style: flagged > 0 ? yellow : green,
308
+ },
309
+ { text: "", style: dim },
310
+ { text: `${answers.length} answered · ${skipped} skipped`, style: dim },
311
+ ], "Press any key for your report · q to quit");
312
+ await nextKey();
313
+ }
314
+ return finish();
315
+ }
316
+ finally {
317
+ restore();
318
+ }
319
+ function finish() {
320
+ return { result: { answers, aborted }, role };
321
+ }
322
+ }
323
+ /** Whether a full-screen TUI is viable (both ends are real terminals). */
324
+ export function tuiAvailable() {
325
+ return Boolean(process.stdin.isTTY && process.stdout.isTTY);
326
+ }
327
+ //# sourceMappingURL=tui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tui.js","sourceRoot":"","sources":["../src/tui.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -44,4 +44,32 @@ export interface SessionResult {
44
44
  /** True if the user quit before answering every question. */
45
45
  aborted: boolean;
46
46
  }
47
+ /** What kind of project the working directory looks like. */
48
+ export type ProjectKind = "frontend" | "backend" | "fullstack" | "unknown";
49
+ /** The result of scanning the working directory for stack signals. */
50
+ export interface Detection {
51
+ kind: ProjectKind;
52
+ /** Human-readable frameworks/tools found, e.g. ["React", "Express"]. */
53
+ frameworks: string[];
54
+ hasDatabase: boolean;
55
+ hasTests: boolean;
56
+ hasDocker: boolean;
57
+ isMonorepo: boolean;
58
+ /** The marker files/folders that drove the detection (for transparency). */
59
+ signals: string[];
60
+ }
61
+ /** What we remember about one project between runs. */
62
+ export interface ProjectRecord {
63
+ role?: Role;
64
+ kind?: ProjectKind;
65
+ frameworks?: string[];
66
+ updatedAt?: string;
67
+ }
68
+ /** The user-level config persisted under ~/.config/think-before. */
69
+ export interface Config {
70
+ version: number;
71
+ defaultRole?: Role;
72
+ /** Keyed by absolute project path. */
73
+ projects: Record<string, ProjectRecord>;
74
+ }
47
75
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,IAAI,CAAC;AAEvC,yCAAyC;AACzC,MAAM,WAAW,QAAQ;IACvB,uDAAuD;IACvD,EAAE,EAAE,MAAM,CAAC;IACX,yEAAyE;IACzE,IAAI,EAAE,MAAM,CAAC;IACb,kEAAkE;IAClE,KAAK,EAAE,WAAW,CAAC;IACnB,wFAAwF;IACxF,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,sEAAsE;AACtE,MAAM,MAAM,IAAI,GAAG,QAAQ,GAAG,UAAU,GAAG,UAAU,GAAG,WAAW,CAAC;AAEpE,2CAA2C;AAC3C,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,+EAA+E;IAC/E,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,SAAS,EAAE,QAAQ,EAAE,CAAC;CACvB;AAED,yCAAyC;AACzC,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB;AAED,uCAAuC;AACvC,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,IAAI,GAAG,MAAM,CAAC;AAEhD,iEAAiE;AACjE,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,WAAW,CAAC;IACnB,+DAA+D;IAC/D,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wCAAwC;AACxC,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,6DAA6D;IAC7D,OAAO,EAAE,OAAO,CAAC;CAClB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,IAAI,CAAC;AAEvC,yCAAyC;AACzC,MAAM,WAAW,QAAQ;IACvB,uDAAuD;IACvD,EAAE,EAAE,MAAM,CAAC;IACX,yEAAyE;IACzE,IAAI,EAAE,MAAM,CAAC;IACb,kEAAkE;IAClE,KAAK,EAAE,WAAW,CAAC;IACnB,wFAAwF;IACxF,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,sEAAsE;AACtE,MAAM,MAAM,IAAI,GAAG,QAAQ,GAAG,UAAU,GAAG,UAAU,GAAG,WAAW,CAAC;AAEpE,2CAA2C;AAC3C,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,+EAA+E;IAC/E,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,SAAS,EAAE,QAAQ,EAAE,CAAC;CACvB;AAED,yCAAyC;AACzC,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB;AAED,uCAAuC;AACvC,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,IAAI,GAAG,MAAM,CAAC;AAEhD,iEAAiE;AACjE,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,WAAW,CAAC;IACnB,+DAA+D;IAC/D,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wCAAwC;AACxC,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,6DAA6D;IAC7D,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,6DAA6D;AAC7D,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,CAAC;AAE3E,sEAAsE;AACtE,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,WAAW,CAAC;IAClB,wEAAwE;IACxE,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,4EAA4E;IAC5E,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,uDAAuD;AACvD,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,oEAAoE;AACpE,MAAM,WAAW,MAAM;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,sCAAsC;IACtC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;CACzC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@geekyants/think-before",
3
- "version": "0.1.0",
4
- "description": "A fast yes/no reflection CLI to surface the side-effects of a change before you make it. Think before you touch the big app.",
3
+ "version": "0.3.0",
4
+ "description": "A fast yes/no reflection CLI to surface the side-effects of a change before you make it. Scans your project (frontend/backend/full-stack) and asks stack-relevant questions. Think before you touch the big app.",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "think-before": "dist/cli.js"