@cristiancorreau/forge 2.2.0 → 2.4.1

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.
Files changed (44) hide show
  1. package/README.md +52 -109
  2. package/assets/core/hooks/pre-bash-check.js +144 -0
  3. package/assets/core/hooks/pre-edit-check.js +166 -0
  4. package/dist/cli.js +1 -1
  5. package/dist/commands/audit.d.ts.map +1 -1
  6. package/dist/commands/audit.js +27 -7
  7. package/dist/commands/audit.js.map +1 -1
  8. package/dist/commands/doctor.d.ts.map +1 -1
  9. package/dist/commands/doctor.js +54 -19
  10. package/dist/commands/doctor.js.map +1 -1
  11. package/dist/commands/generate.d.ts.map +1 -1
  12. package/dist/commands/generate.js +88 -37
  13. package/dist/commands/generate.js.map +1 -1
  14. package/dist/commands/init.d.ts.map +1 -1
  15. package/dist/commands/init.js +43 -5
  16. package/dist/commands/init.js.map +1 -1
  17. package/dist/lib/detect.d.ts +13 -0
  18. package/dist/lib/detect.d.ts.map +1 -0
  19. package/dist/lib/detect.js +85 -0
  20. package/dist/lib/detect.js.map +1 -0
  21. package/dist/lib/generators/claude-code.d.ts.map +1 -1
  22. package/dist/lib/generators/claude-code.js +7 -1
  23. package/dist/lib/generators/claude-code.js.map +1 -1
  24. package/dist/lib/lock.d.ts +15 -0
  25. package/dist/lib/lock.d.ts.map +1 -0
  26. package/dist/lib/lock.js +48 -0
  27. package/dist/lib/lock.js.map +1 -0
  28. package/dist/lib/wizard.d.ts +3 -2
  29. package/dist/lib/wizard.d.ts.map +1 -1
  30. package/dist/lib/wizard.js +211 -142
  31. package/dist/lib/wizard.js.map +1 -1
  32. package/dist/ui/box.d.ts +2 -0
  33. package/dist/ui/box.d.ts.map +1 -0
  34. package/dist/ui/box.js +15 -0
  35. package/dist/ui/box.js.map +1 -0
  36. package/dist/ui/colors.d.ts +15 -0
  37. package/dist/ui/colors.d.ts.map +1 -0
  38. package/dist/ui/colors.js +19 -0
  39. package/dist/ui/colors.js.map +1 -0
  40. package/dist/ui/spinner.d.ts +9 -0
  41. package/dist/ui/spinner.d.ts.map +1 -0
  42. package/dist/ui/spinner.js +46 -0
  43. package/dist/ui/spinner.js.map +1 -0
  44. package/package.json +2 -1
package/dist/ui/box.js ADDED
@@ -0,0 +1,15 @@
1
+ import { bold, dim } from './colors.js';
2
+ export function box(title, lines) {
3
+ const width = Math.max(title.length, ...lines.map(l => l.length)) + 4;
4
+ const top = '┌' + '─'.repeat(width) + '┐';
5
+ const bottom = '└' + '─'.repeat(width) + '┘';
6
+ const pad = (s) => '│ ' + s.padEnd(width - 2) + ' │';
7
+ return [
8
+ top,
9
+ pad(bold(title)),
10
+ pad(dim('─'.repeat(title.length))),
11
+ ...lines.map(pad),
12
+ bottom,
13
+ ].join('\n');
14
+ }
15
+ //# sourceMappingURL=box.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"box.js","sourceRoot":"","sources":["../../src/ui/box.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAExC,MAAM,UAAU,GAAG,CAAC,KAAa,EAAE,KAAe;IAChD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;IACtE,MAAM,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC;IAC1C,MAAM,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC;IAC7C,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;IAC7D,OAAO;QACL,GAAG;QACH,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChB,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QAClC,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;QACjB,MAAM;KACP,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
@@ -0,0 +1,15 @@
1
+ export declare const bold: (s: string) => string;
2
+ export declare const dim: (s: string) => string;
3
+ export declare const green: (s: string) => string;
4
+ export declare const red: (s: string) => string;
5
+ export declare const yellow: (s: string) => string;
6
+ export declare const cyan: (s: string) => string;
7
+ export declare const gray: (s: string) => string;
8
+ export declare const icons: {
9
+ ok: string;
10
+ warn: string;
11
+ error: string;
12
+ info: string;
13
+ skip: string;
14
+ };
15
+ //# sourceMappingURL=colors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["../../src/ui/colors.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,IAAI,MAHJ,MAAM,WAGc,CAAC;AAClC,eAAO,MAAM,GAAG,MAJH,MAAM,WAIc,CAAC;AAClC,eAAO,MAAM,KAAK,MALL,MAAM,WAKe,CAAC;AACnC,eAAO,MAAM,GAAG,MANH,MAAM,WAMe,CAAC;AACnC,eAAO,MAAM,MAAM,MAPN,MAAM,WAOe,CAAC;AACnC,eAAO,MAAM,IAAI,MARJ,MAAM,WAQe,CAAC;AACnC,eAAO,MAAM,IAAI,MATJ,MAAM,WASe,CAAC;AAEnC,eAAO,MAAM,KAAK;;;;;;CAMjB,CAAC"}
@@ -0,0 +1,19 @@
1
+ const NO_COLOR = process.env['NO_COLOR'] !== undefined || !process.stdout.isTTY;
2
+ function wrap(code, reset) {
3
+ return (s) => NO_COLOR ? s : `\x1b[${code}m${s}\x1b[${reset}m`;
4
+ }
5
+ export const bold = wrap(1, 22);
6
+ export const dim = wrap(2, 22);
7
+ export const green = wrap(32, 39);
8
+ export const red = wrap(31, 39);
9
+ export const yellow = wrap(33, 39);
10
+ export const cyan = wrap(36, 39);
11
+ export const gray = wrap(90, 39);
12
+ export const icons = {
13
+ ok: green('✓'),
14
+ warn: yellow('!'),
15
+ error: red('✗'),
16
+ info: cyan('i'),
17
+ skip: yellow('~'),
18
+ };
19
+ //# sourceMappingURL=colors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colors.js","sourceRoot":"","sources":["../../src/ui/colors.ts"],"names":[],"mappings":"AAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;AAEhF,SAAS,IAAI,CAAC,IAAY,EAAE,KAAa;IACvC,OAAO,CAAC,CAAS,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,GAAG,CAAC;AACzE,CAAC;AAED,MAAM,CAAC,MAAM,IAAI,GAAK,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAClC,MAAM,CAAC,MAAM,GAAG,GAAM,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAClC,MAAM,CAAC,MAAM,KAAK,GAAI,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AACnC,MAAM,CAAC,MAAM,GAAG,GAAM,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AACnC,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AACnC,MAAM,CAAC,MAAM,IAAI,GAAK,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AACnC,MAAM,CAAC,MAAM,IAAI,GAAK,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AAEnC,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,EAAE,EAAK,KAAK,CAAC,GAAG,CAAC;IACjB,IAAI,EAAG,MAAM,CAAC,GAAG,CAAC;IAClB,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC;IACf,IAAI,EAAG,IAAI,CAAC,GAAG,CAAC;IAChB,IAAI,EAAG,MAAM,CAAC,GAAG,CAAC;CACnB,CAAC"}
@@ -0,0 +1,9 @@
1
+ export declare function createSpinner(items: Array<{
2
+ runtime: string;
3
+ file: string;
4
+ }>): {
5
+ start(): void;
6
+ update(runtime: string, status: "running" | "done" | "error" | "skip", file?: string): void;
7
+ stop(): void;
8
+ };
9
+ //# sourceMappingURL=spinner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner.d.ts","sourceRoot":"","sources":["../../src/ui/spinner.ts"],"names":[],"mappings":"AAyBA,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;;oBAmBzD,MAAM,UAAU,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,SAAS,MAAM;;EAWvF"}
@@ -0,0 +1,46 @@
1
+ import { green, red, yellow, dim, gray } from './colors.js';
2
+ const ICON = {
3
+ pending: ' ',
4
+ running: dim('…'),
5
+ done: green('✓'),
6
+ error: red('✗'),
7
+ skip: yellow('~'),
8
+ };
9
+ function renderLine(item) {
10
+ const icon = ICON[item.status];
11
+ const rt = item.runtime.padEnd(12);
12
+ const f = item.status === 'pending' ? gray(item.file) : item.file;
13
+ return ` ${icon} ${rt} ${f}`;
14
+ }
15
+ export function createSpinner(items) {
16
+ const state = items.map(i => ({ ...i, status: 'pending' }));
17
+ let printed = false;
18
+ function render() {
19
+ if (printed) {
20
+ // Move cursor up N lines to overwrite
21
+ process.stdout.write(`\x1b[${state.length}A`);
22
+ }
23
+ for (const item of state) {
24
+ process.stdout.write('\r\x1b[K' + renderLine(item) + '\n');
25
+ }
26
+ printed = true;
27
+ }
28
+ return {
29
+ start() {
30
+ render();
31
+ },
32
+ update(runtime, status, file) {
33
+ const item = state.find(i => i.runtime === runtime);
34
+ if (!item)
35
+ return;
36
+ item.status = status;
37
+ if (file)
38
+ item.file = file;
39
+ render();
40
+ },
41
+ stop() {
42
+ // Cursor already at end after last render
43
+ },
44
+ };
45
+ }
46
+ //# sourceMappingURL=spinner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner.js","sourceRoot":"","sources":["../../src/ui/spinner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAU5D,MAAM,IAAI,GAA+B;IACvC,OAAO,EAAE,IAAI;IACb,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC;IACjB,IAAI,EAAK,KAAK,CAAC,GAAG,CAAC;IACnB,KAAK,EAAI,GAAG,CAAC,GAAG,CAAC;IACjB,IAAI,EAAK,MAAM,CAAC,GAAG,CAAC;CACrB,CAAC;AAEF,SAAS,UAAU,CAAC,IAAiB;IACnC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC/B,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACnC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IAClE,OAAO,KAAK,IAAI,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAA+C;IAC3E,MAAM,KAAK,GAAkB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,SAAuB,EAAE,CAAC,CAAC,CAAC;IACzF,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,SAAS,MAAM;QACb,IAAI,OAAO,EAAE,CAAC;YACZ,sCAAsC;YACtC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QAChD,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QAC7D,CAAC;QACD,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;IAED,OAAO;QACL,KAAK;YACH,MAAM,EAAE,CAAC;QACX,CAAC;QACD,MAAM,CAAC,OAAe,EAAE,MAA6C,EAAE,IAAa;YAClF,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;YACpD,IAAI,CAAC,IAAI;gBAAE,OAAO;YAClB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;YACrB,IAAI,IAAI;gBAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;YAC3B,MAAM,EAAE,CAAC;QACX,CAAC;QACD,IAAI;YACF,0CAA0C;QAC5C,CAAC;KACF,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cristiancorreau/forge",
3
- "version": "2.2.0",
3
+ "version": "2.4.1",
4
4
  "description": "Agentic development framework — multi-runtime support for Claude Code, OpenCode, Codex and Kiro",
5
5
  "author": "Cristian Correa <cristian@socialweb.cl>",
6
6
  "license": "Apache-2.0",
@@ -45,6 +45,7 @@
45
45
  "node": ">=18.0.0"
46
46
  },
47
47
  "dependencies": {
48
+ "@clack/prompts": "^0.9.1",
48
49
  "ajv": "^8.20.0",
49
50
  "ajv-formats": "^3.0.1",
50
51
  "js-yaml": "^4.2.0"