@geekyants/think-before 0.2.0 → 0.4.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 +40 -10
- package/dist/checklists.d.ts +24 -7
- package/dist/checklists.d.ts.map +1 -1
- package/dist/checklists.js +173 -91
- package/dist/checklists.js.map +1 -1
- package/dist/cli.js +74 -36
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/session.d.ts +10 -0
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +47 -0
- package/dist/session.js.map +1 -1
- package/dist/stack.js +18 -18
- package/dist/stack.js.map +1 -1
- 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 +10 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
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
|
package/dist/tui.js.map
ADDED
|
@@ -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
|
@@ -10,6 +10,16 @@ export interface Question {
|
|
|
10
10
|
risky: RiskyAnswer;
|
|
11
11
|
/** Why this matters — shown on `?` during a session and next to flags in the report. */
|
|
12
12
|
why?: string;
|
|
13
|
+
/**
|
|
14
|
+
* Roles this question is relevant to. Omit (or leave empty) for questions
|
|
15
|
+
* that apply to everyone. Used to tailor the question set to the user's role.
|
|
16
|
+
*/
|
|
17
|
+
roles?: Role[];
|
|
18
|
+
/**
|
|
19
|
+
* Relative importance, higher = asked first. When more questions are eligible
|
|
20
|
+
* than the per-session cap, the highest-priority ones win. Defaults to 50.
|
|
21
|
+
*/
|
|
22
|
+
priority?: number;
|
|
13
23
|
}
|
|
14
24
|
/** Roles a section applies to. `shared` sections are always shown. */
|
|
15
25
|
export type Role = "shared" | "designer" | "engineer" | "developer";
|
package/dist/types.d.ts.map
CHANGED
|
@@ -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;
|
|
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;IACb;;;OAGG;IACH,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;IACf;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;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,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@geekyants/think-before",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
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": {
|