@stackbilt/cli 0.12.0 → 0.15.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.
Files changed (64) hide show
  1. package/LICENSE +206 -0
  2. package/dist/__tests__/bootstrap.test.js +95 -0
  3. package/dist/__tests__/bootstrap.test.js.map +1 -1
  4. package/dist/__tests__/context.test.d.ts +2 -0
  5. package/dist/__tests__/context.test.d.ts.map +1 -0
  6. package/dist/__tests__/context.test.js +137 -0
  7. package/dist/__tests__/context.test.js.map +1 -0
  8. package/dist/__tests__/deprecated-commands.test.d.ts +2 -0
  9. package/dist/__tests__/deprecated-commands.test.d.ts.map +1 -0
  10. package/dist/__tests__/deprecated-commands.test.js +59 -0
  11. package/dist/__tests__/deprecated-commands.test.js.map +1 -0
  12. package/dist/__tests__/login.test.js +24 -1
  13. package/dist/__tests__/login.test.js.map +1 -1
  14. package/dist/__tests__/stamp-policies.test.d.ts +2 -0
  15. package/dist/__tests__/stamp-policies.test.d.ts.map +1 -0
  16. package/dist/__tests__/stamp-policies.test.js +97 -0
  17. package/dist/__tests__/stamp-policies.test.js.map +1 -0
  18. package/dist/bin.js +0 -0
  19. package/dist/commands/architect.d.ts.map +1 -1
  20. package/dist/commands/architect.js +2 -0
  21. package/dist/commands/architect.js.map +1 -1
  22. package/dist/commands/bootstrap.d.ts.map +1 -1
  23. package/dist/commands/bootstrap.js +157 -7
  24. package/dist/commands/bootstrap.js.map +1 -1
  25. package/dist/commands/context.d.ts +27 -0
  26. package/dist/commands/context.d.ts.map +1 -0
  27. package/dist/commands/context.js +650 -0
  28. package/dist/commands/context.js.map +1 -0
  29. package/dist/commands/deprecation-warning.d.ts +4 -0
  30. package/dist/commands/deprecation-warning.d.ts.map +1 -0
  31. package/dist/commands/deprecation-warning.js +20 -0
  32. package/dist/commands/deprecation-warning.js.map +1 -0
  33. package/dist/commands/doctor.d.ts.map +1 -1
  34. package/dist/commands/doctor.js +45 -0
  35. package/dist/commands/doctor.js.map +1 -1
  36. package/dist/commands/drift.d.ts.map +1 -1
  37. package/dist/commands/drift.js +59 -6
  38. package/dist/commands/drift.js.map +1 -1
  39. package/dist/commands/init.d.ts +1 -0
  40. package/dist/commands/init.d.ts.map +1 -1
  41. package/dist/commands/init.js +75 -1
  42. package/dist/commands/init.js.map +1 -1
  43. package/dist/commands/login.d.ts.map +1 -1
  44. package/dist/commands/login.js +2 -7
  45. package/dist/commands/login.js.map +1 -1
  46. package/dist/commands/run.d.ts.map +1 -1
  47. package/dist/commands/run.js +2 -0
  48. package/dist/commands/run.js.map +1 -1
  49. package/dist/commands/scaffold.d.ts.map +1 -1
  50. package/dist/commands/scaffold.js +2 -0
  51. package/dist/commands/scaffold.js.map +1 -1
  52. package/dist/commands/serve.d.ts.map +1 -1
  53. package/dist/commands/serve.js +20 -0
  54. package/dist/commands/serve.js.map +1 -1
  55. package/dist/commands/stamp-policies.d.ts +15 -0
  56. package/dist/commands/stamp-policies.d.ts.map +1 -0
  57. package/dist/commands/stamp-policies.js +108 -0
  58. package/dist/commands/stamp-policies.js.map +1 -0
  59. package/dist/config.js +1 -1
  60. package/dist/config.js.map +1 -1
  61. package/dist/index.d.ts.map +1 -1
  62. package/dist/index.js +19 -0
  63. package/dist/index.js.map +1 -1
  64. package/package.json +16 -15
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const vitest_1 = require("vitest");
4
4
  const login_1 = require("../commands/login");
5
5
  const credentials_1 = require("../credentials");
6
+ const deprecation_warning_1 = require("../commands/deprecation-warning");
6
7
  const options = {
7
8
  format: 'text',
8
9
  configPath: '.charter',
@@ -11,6 +12,7 @@ const options = {
11
12
  };
12
13
  (0, vitest_1.describe)('charter login — deprecation notice', () => {
13
14
  const originalEnv = process.env[credentials_1.API_KEY_ENV_VAR];
15
+ const originalSuppress = process.env[deprecation_warning_1.DEPRECATION_WARNING_ENV_VAR];
14
16
  (0, vitest_1.beforeEach)(() => {
15
17
  delete process.env[credentials_1.API_KEY_ENV_VAR];
16
18
  });
@@ -21,6 +23,12 @@ const options = {
21
23
  else {
22
24
  process.env[credentials_1.API_KEY_ENV_VAR] = originalEnv;
23
25
  }
26
+ if (originalSuppress === undefined) {
27
+ delete process.env[deprecation_warning_1.DEPRECATION_WARNING_ENV_VAR];
28
+ }
29
+ else {
30
+ process.env[deprecation_warning_1.DEPRECATION_WARNING_ENV_VAR] = originalSuppress;
31
+ }
24
32
  vitest_1.vi.restoreAllMocks();
25
33
  });
26
34
  (0, vitest_1.it)('writes a deprecation notice to stderr when invoked without args', async () => {
@@ -29,7 +37,7 @@ const options = {
29
37
  await (0, login_1.loginCommand)(options, []);
30
38
  const stderrOutput = stderr.mock.calls.map((c) => String(c[0])).join('');
31
39
  (0, vitest_1.expect)(stderrOutput).toMatch(/deprecated/i);
32
- (0, vitest_1.expect)(stderrOutput).toContain(credentials_1.API_KEY_ENV_VAR);
40
+ (0, vitest_1.expect)(stderrOutput).toContain('@stackbilt/build');
33
41
  });
34
42
  (0, vitest_1.it)('reports env-var usage when STACKBILT_API_KEY is set and no --key flag', async () => {
35
43
  process.env[credentials_1.API_KEY_ENV_VAR] = 'ea_login_test_key';
@@ -39,5 +47,20 @@ const options = {
39
47
  const stdoutOutput = log.mock.calls.map((c) => String(c[0])).join('\n');
40
48
  (0, vitest_1.expect)(stdoutOutput).toMatch(new RegExp(`Using ${credentials_1.API_KEY_ENV_VAR} from environment`));
41
49
  });
50
+ (0, vitest_1.it)('suppresses warning when CHARTER_NO_DEPRECATION_WARNING=1', async () => {
51
+ process.env[deprecation_warning_1.DEPRECATION_WARNING_ENV_VAR] = '1';
52
+ const stderr = vitest_1.vi.spyOn(process.stderr, 'write').mockImplementation(() => true);
53
+ vitest_1.vi.spyOn(console, 'log').mockImplementation(() => { });
54
+ await (0, login_1.loginCommand)(options, []);
55
+ const stderrOutput = stderr.mock.calls.map((c) => String(c[0])).join('');
56
+ (0, vitest_1.expect)(stderrOutput).toBe('');
57
+ });
58
+ (0, vitest_1.it)('suppresses warning when --no-deprecation-warning is passed', async () => {
59
+ const stderr = vitest_1.vi.spyOn(process.stderr, 'write').mockImplementation(() => true);
60
+ vitest_1.vi.spyOn(console, 'log').mockImplementation(() => { });
61
+ await (0, login_1.loginCommand)(options, ['--no-deprecation-warning']);
62
+ const stderrOutput = stderr.mock.calls.map((c) => String(c[0])).join('');
63
+ (0, vitest_1.expect)(stderrOutput).toBe('');
64
+ });
42
65
  });
43
66
  //# sourceMappingURL=login.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"login.test.js","sourceRoot":"","sources":["../../src/__tests__/login.test.ts"],"names":[],"mappings":";;AAAA,mCAAyE;AACzE,6CAAiD;AAEjD,gDAAiD;AAEjD,MAAM,OAAO,GAAe;IAC1B,MAAM,EAAE,MAAM;IACd,UAAU,EAAE,UAAU;IACtB,MAAM,EAAE,KAAK;IACb,GAAG,EAAE,KAAK;CACX,CAAC;AAEF,IAAA,iBAAQ,EAAC,oCAAoC,EAAE,GAAG,EAAE;IAClD,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,6BAAe,CAAC,CAAC;IAEjD,IAAA,mBAAU,EAAC,GAAG,EAAE;QACd,OAAO,OAAO,CAAC,GAAG,CAAC,6BAAe,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,IAAA,kBAAS,EAAC,GAAG,EAAE;QACb,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9B,OAAO,OAAO,CAAC,GAAG,CAAC,6BAAe,CAAC,CAAC;QACtC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,6BAAe,CAAC,GAAG,WAAW,CAAC;QAC7C,CAAC;QACD,WAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;QAC/E,MAAM,MAAM,GAAG,WAAE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAChF,WAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAEtD,MAAM,IAAA,oBAAY,EAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAEhC,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzE,IAAA,eAAM,EAAC,YAAY,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAC5C,IAAA,eAAM,EAAC,YAAY,CAAC,CAAC,SAAS,CAAC,6BAAe,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;QACrF,OAAO,CAAC,GAAG,CAAC,6BAAe,CAAC,GAAG,mBAAmB,CAAC;QACnD,WAAE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QACjE,MAAM,GAAG,GAAG,WAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAElE,MAAM,IAAA,oBAAY,EAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAEhC,MAAM,YAAY,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxE,IAAA,eAAM,EAAC,YAAY,CAAC,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,SAAS,6BAAe,mBAAmB,CAAC,CAAC,CAAC;IACxF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"login.test.js","sourceRoot":"","sources":["../../src/__tests__/login.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=stamp-policies.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stamp-policies.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/stamp-policies.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const stamp_policies_1 = require("../commands/stamp-policies");
5
+ // Mock @stackbilt/policies so no real fs writes or network calls happen
6
+ vitest_1.vi.mock('@stackbilt/policies', () => ({
7
+ applyPolicies: vitest_1.vi.fn(),
8
+ }));
9
+ // Mock child_process for resolveStackbiltLlcRef
10
+ vitest_1.vi.mock('node:child_process', () => ({
11
+ exec: vitest_1.vi.fn(),
12
+ }));
13
+ const policies_1 = require("@stackbilt/policies");
14
+ const node_child_process_1 = require("node:child_process");
15
+ const mockApply = vitest_1.vi.mocked(policies_1.applyPolicies);
16
+ const mockExec = vitest_1.vi.mocked(node_child_process_1.exec);
17
+ function makeOptions(overrides = {}) {
18
+ return { configPath: '.charter', format: 'text', ciMode: false, yes: false, ...overrides };
19
+ }
20
+ const FAKE_REF = 'a'.repeat(40);
21
+ const fakeConfig = { packageManager: 'npm', nodeVersion: '20', existingWorkflows: [], floatingPins: [], hasSupplyChainWorkflow: false };
22
+ (0, vitest_1.beforeEach)(() => {
23
+ vitest_1.vi.clearAllMocks();
24
+ // Default: exec succeeds with fake SHA
25
+ mockExec.mockImplementation((_cmd, _opts, cb) => {
26
+ cb(null, `${FAKE_REF}\tHEAD\n`);
27
+ return {};
28
+ });
29
+ // Default: apply returns updated
30
+ mockApply.mockResolvedValue({
31
+ config: fakeConfig,
32
+ pinsPatched: 2,
33
+ workflowsPatched: ['.github/workflows/ci.yml'],
34
+ supplyChainWorkflowAdded: true,
35
+ charterConfigUpdated: true,
36
+ alreadyCompliant: false,
37
+ });
38
+ });
39
+ (0, vitest_1.describe)('stampPoliciesCommand', () => {
40
+ (0, vitest_1.it)('uses --policy-repo-ref directly without calling git ls-remote', async () => {
41
+ const code = await (0, stamp_policies_1.stampPoliciesCommand)(makeOptions(), ['--policy-repo-ref', FAKE_REF, '--path', '/tmp']);
42
+ (0, vitest_1.expect)(mockExec).not.toHaveBeenCalled();
43
+ (0, vitest_1.expect)(mockApply).toHaveBeenCalledWith('/tmp', vitest_1.expect.objectContaining({ policyRepoRef: FAKE_REF }));
44
+ (0, vitest_1.expect)(code).toBe(0);
45
+ });
46
+ (0, vitest_1.it)('calls git ls-remote when --policy-repo-ref is absent', async () => {
47
+ await (0, stamp_policies_1.stampPoliciesCommand)(makeOptions(), ['--policy-repo-ref', FAKE_REF]);
48
+ // Verify applyPolicies received the ref
49
+ (0, vitest_1.expect)(mockApply).toHaveBeenCalledWith('.', vitest_1.expect.objectContaining({ policyRepoRef: FAKE_REF }));
50
+ });
51
+ (0, vitest_1.it)('returns RUNTIME_ERROR when git ls-remote fails and no explicit ref', async () => {
52
+ mockExec.mockImplementation((_cmd, _opts, cb) => {
53
+ cb(new Error('network'), '');
54
+ return {};
55
+ });
56
+ const code = await (0, stamp_policies_1.stampPoliciesCommand)(makeOptions(), []);
57
+ (0, vitest_1.expect)(code).toBe(2);
58
+ (0, vitest_1.expect)(mockApply).not.toHaveBeenCalled();
59
+ });
60
+ (0, vitest_1.it)('passes --dry-run through to applyPolicies', async () => {
61
+ await (0, stamp_policies_1.stampPoliciesCommand)(makeOptions(), ['--policy-repo-ref', FAKE_REF, '--dry-run']);
62
+ (0, vitest_1.expect)(mockApply).toHaveBeenCalledWith('.', vitest_1.expect.objectContaining({ dryRun: true }));
63
+ });
64
+ (0, vitest_1.it)('passes --no-fix-pins as fixPins: false', async () => {
65
+ await (0, stamp_policies_1.stampPoliciesCommand)(makeOptions(), ['--policy-repo-ref', FAKE_REF, '--no-fix-pins']);
66
+ (0, vitest_1.expect)(mockApply).toHaveBeenCalledWith('.', vitest_1.expect.objectContaining({ fixPins: false }));
67
+ });
68
+ (0, vitest_1.it)('returns exit 0 when already compliant', async () => {
69
+ mockApply.mockResolvedValue({
70
+ config: fakeConfig,
71
+ pinsPatched: 0,
72
+ workflowsPatched: [],
73
+ supplyChainWorkflowAdded: false,
74
+ charterConfigUpdated: false,
75
+ alreadyCompliant: true,
76
+ });
77
+ const code = await (0, stamp_policies_1.stampPoliciesCommand)(makeOptions(), ['--policy-repo-ref', FAKE_REF]);
78
+ (0, vitest_1.expect)(code).toBe(0);
79
+ });
80
+ (0, vitest_1.it)('emits JSON output when format is json', async () => {
81
+ const logs = [];
82
+ vitest_1.vi.spyOn(console, 'log').mockImplementation((msg) => { logs.push(msg); });
83
+ const code = await (0, stamp_policies_1.stampPoliciesCommand)(makeOptions({ format: 'json' }), ['--policy-repo-ref', FAKE_REF]);
84
+ (0, vitest_1.expect)(code).toBe(0);
85
+ const parsed = JSON.parse(logs.find((l) => l.startsWith('{')) ?? '{}');
86
+ (0, vitest_1.expect)(parsed.status).toBe('UPDATED');
87
+ (0, vitest_1.expect)(parsed.pinsPatched).toBe(2);
88
+ (0, vitest_1.expect)(parsed.policyRepoRef).toBe(FAKE_REF);
89
+ vitest_1.vi.restoreAllMocks();
90
+ });
91
+ (0, vitest_1.it)('returns RUNTIME_ERROR when applyPolicies throws', async () => {
92
+ mockApply.mockRejectedValue(new Error('disk full'));
93
+ const code = await (0, stamp_policies_1.stampPoliciesCommand)(makeOptions(), ['--policy-repo-ref', FAKE_REF]);
94
+ (0, vitest_1.expect)(code).toBe(2);
95
+ });
96
+ });
97
+ //# sourceMappingURL=stamp-policies.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stamp-policies.test.js","sourceRoot":"","sources":["../../src/__tests__/stamp-policies.test.ts"],"names":[],"mappings":"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"}
package/dist/bin.js CHANGED
File without changes
@@ -1 +1 @@
1
- {"version":3,"file":"architect.d.ts","sourceRoot":"","sources":["../../src/commands/architect.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAM3C,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAoE3F"}
1
+ {"version":3,"file":"architect.d.ts","sourceRoot":"","sources":["../../src/commands/architect.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAO3C,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAsE3F"}
@@ -49,7 +49,9 @@ const index_1 = require("../index");
49
49
  const flags_1 = require("../flags");
50
50
  const credentials_1 = require("../credentials");
51
51
  const http_client_1 = require("../http-client");
52
+ const deprecation_warning_1 = require("./deprecation-warning");
52
53
  async function architectCommand(options, args) {
54
+ (0, deprecation_warning_1.printBuildCommandDeprecationWarning)('architect', args);
53
55
  // Parse description from positional arg or --file
54
56
  const filePath = (0, flags_1.getFlag)(args, '--file');
55
57
  const positional = args.filter(a => !a.startsWith('-') && a !== filePath);
@@ -1 +1 @@
1
- {"version":3,"file":"architect.js","sourceRoot":"","sources":["../../src/commands/architect.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"architect.js","sourceRoot":"","sources":["../../src/commands/architect.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/commands/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AA+D3C,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAyS3F"}
1
+ {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/commands/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AA+D3C,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA4Y3F"}
@@ -64,6 +64,7 @@ async function bootstrapCommand(options, args) {
64
64
  const skipInstall = args.includes('--skip-install');
65
65
  const skipDoctor = args.includes('--skip-doctor');
66
66
  const force = args.includes('--force');
67
+ const securitySensitive = args.includes('--security-sensitive');
67
68
  const nonInteractive = options.yes;
68
69
  const setupOverwrite = options.yes || force;
69
70
  if (ciTarget && ciTarget !== 'github') {
@@ -88,6 +89,12 @@ async function bootstrapCommand(options, args) {
88
89
  const detection = detectResult.detection;
89
90
  const contexts = detectResult.contexts;
90
91
  const packageManager = detectResult.packageManager;
92
+ // Check git repo status once — used for preflight warning and gating hook next-steps
93
+ const inGitRepo = (0, git_helpers_1.isGitRepo)();
94
+ if (!inGitRepo) {
95
+ detectResult.step.warnings.push("Not inside a git repository. Run 'git init && git add -A && git commit -m \"initial commit\"' before installing hooks. Continuing — governance files will be written but hooks cannot be installed yet.");
96
+ warnings++;
97
+ }
91
98
  if (options.format === 'text') {
92
99
  console.log('[1/7] Detecting stack...');
93
100
  console.log(` Stack: ${selectedPreset} (${detection.confidence} confidence)`);
@@ -97,12 +104,17 @@ async function bootstrapCommand(options, args) {
97
104
  console.log(` Warning: ${w}`);
98
105
  }
99
106
  }
107
+ if (!inGitRepo) {
108
+ console.log(` Warning: Not inside a git repository.`);
109
+ console.log(` Run 'git init && git add -A && git commit -m "initial commit"' before installing hooks.`);
110
+ console.log(` Continuing — governance files will be written but hooks cannot be installed yet.`);
111
+ }
100
112
  console.log('');
101
113
  }
102
114
  // ========================================================================
103
115
  // Phase 2: Setup
104
116
  // ========================================================================
105
- const setupResult = runSetupPhase(options, selectedPreset, detection, contexts, ciTarget, packageManager, setupOverwrite);
117
+ const setupResult = runSetupPhase(options, selectedPreset, detection, contexts, ciTarget, packageManager, setupOverwrite, securitySensitive);
106
118
  result.steps.push(setupResult.step);
107
119
  warnings += setupResult.step.warnings.length;
108
120
  if (options.format === 'text') {
@@ -149,14 +161,44 @@ async function bootstrapCommand(options, args) {
149
161
  shouldRegister = await promptYesNo(' Register these modules now? (y/N) ');
150
162
  }
151
163
  if (shouldRegister) {
152
- registerOrphansInManifest(path.join('.ai', 'manifest.adf'), orphans);
164
+ const manifestFilePath = path.join('.ai', 'manifest.adf');
165
+ // Split orphans: core.adf and state.adf belong in DEFAULT_LOAD, everything else in ON_DEMAND
166
+ const defaultLoadOrphans = orphans.filter(m => DEFAULT_LOAD_MODULES.has(m));
167
+ const onDemandOrphans = orphans.filter(m => !DEFAULT_LOAD_MODULES.has(m));
168
+ if (defaultLoadOrphans.length > 0) {
169
+ registerModulesInDefaultLoad(manifestFilePath, defaultLoadOrphans);
170
+ if (options.format === 'text') {
171
+ console.log(` Registered ${defaultLoadOrphans.length} module(s) as DEFAULT_LOAD in manifest.adf`);
172
+ }
173
+ }
174
+ if (onDemandOrphans.length > 0) {
175
+ registerOrphansInManifest(manifestFilePath, onDemandOrphans);
176
+ if (options.format === 'text') {
177
+ console.log(` Registered ${onDemandOrphans.length} module(s) as ON_DEMAND in manifest.adf`);
178
+ }
179
+ }
153
180
  (0, adf_migrate_1.updateModuleIndex)('CLAUDE.md', '.ai');
154
181
  if (options.format === 'text') {
155
- console.log(` Registered ${orphans.length} module(s) as ON_DEMAND in manifest.adf`);
156
182
  console.log('');
157
183
  }
158
184
  }
159
185
  }
186
+ // Post-write manifest self-check: warn if DEFAULT_LOAD is empty but core.adf exists
187
+ if (fs.existsSync(path.join('.ai', 'core.adf'))) {
188
+ const manifestCheckPath = path.join('.ai', 'manifest.adf');
189
+ if (fs.existsSync(manifestCheckPath)) {
190
+ try {
191
+ const manifestDoc = (0, adf_3.parseAdf)(fs.readFileSync(manifestCheckPath, 'utf-8'));
192
+ const manifestParsed = (0, adf_3.parseManifest)(manifestDoc);
193
+ if (manifestParsed.defaultLoad.length === 0 && options.format === 'text') {
194
+ console.log(" Warning: manifest.adf parsed with 0 DEFAULT_LOAD entries — run 'charter adf register core.adf --load default' to repair.");
195
+ }
196
+ }
197
+ catch {
198
+ // Parse failure already flagged elsewhere
199
+ }
200
+ }
201
+ }
160
202
  // ========================================================================
161
203
  // Phase 4: Migrate Agent Configs
162
204
  // ========================================================================
@@ -267,6 +309,24 @@ async function bootstrapCommand(options, args) {
267
309
  required: false,
268
310
  reason: 'Commit governance baseline',
269
311
  });
312
+ // Gate hook next-steps on being inside a git repo
313
+ if (inGitRepo) {
314
+ result.nextSteps.push({
315
+ cmd: 'charter hook install --pre-commit',
316
+ required: false,
317
+ reason: 'Install pre-commit hook for ADF evidence gate',
318
+ });
319
+ result.nextSteps.push({
320
+ cmd: 'charter hook install --commit-msg',
321
+ required: false,
322
+ reason: 'Install commit-msg hook for trailer enforcement',
323
+ });
324
+ result.nextSteps.push({
325
+ cmd: 'echo \'charter context --write\' >> .git/hooks/post-commit && chmod +x .git/hooks/post-commit',
326
+ required: false,
327
+ reason: 'Keep .charter/context.md fresh after each commit (charter brief auto-refresh)',
328
+ });
329
+ }
270
330
  // ========================================================================
271
331
  // Governance Gaps — surface what's configured but not enforced
272
332
  // ========================================================================
@@ -332,6 +392,40 @@ async function bootstrapCommand(options, args) {
332
392
  result.nextSteps.forEach((step, i) => {
333
393
  console.log(` ${i + 1}. ${step.cmd}`);
334
394
  });
395
+ // Partial/failure summary banner
396
+ if (result.status === 'partial' || result.status === 'failure') {
397
+ const failedSteps = result.steps.filter(s => s.status === 'fail');
398
+ console.log('');
399
+ console.log(`⚠ Bootstrap partially complete — ${failedSteps.length} step${failedSteps.length === 1 ? '' : 's'} failed:`);
400
+ for (const s of failedSteps) {
401
+ const rawErr = s.details.error ? String(s.details.error).split('\n')[0].slice(0, 120) : '';
402
+ const errDetail = rawErr ? ` (${rawErr})` : '';
403
+ const hintLine = s.warnings.find(w => w.startsWith('Hint:'));
404
+ const hint = hintLine ? ` — ${hintLine}` : '';
405
+ console.log(` • ${s.name}${errDetail}${hint}`);
406
+ }
407
+ console.log('');
408
+ console.log('Next steps to complete setup:');
409
+ let n = 1;
410
+ const installFailed = failedSteps.some(s => s.name === 'install');
411
+ if (installFailed) {
412
+ const installStep = failedSteps.find(s => s.name === 'install');
413
+ const frozenHint = installStep?.warnings.find(w => w.includes('--no-frozen-lockfile'));
414
+ if (frozenHint) {
415
+ console.log(` ${n++}. pnpm install --no-frozen-lockfile (or see hint above)`);
416
+ }
417
+ else {
418
+ console.log(` ${n++}. ${installStep?.details.command ?? 'npm install'} (see hint above)`);
419
+ }
420
+ console.log(` ${n++}. charter doctor`);
421
+ if (inGitRepo) {
422
+ console.log(` ${n++}. charter hook install --pre-commit`);
423
+ }
424
+ }
425
+ else {
426
+ console.log(` ${n++}. charter doctor`);
427
+ }
428
+ }
335
429
  }
336
430
  return index_1.EXIT_CODE.SUCCESS;
337
431
  }
@@ -415,7 +509,7 @@ function loadPackageContextsSafe() {
415
509
  // ============================================================================
416
510
  // Phase 2: Setup
417
511
  // ============================================================================
418
- function runSetupPhase(options, selectedPreset, detection, contexts, ciTarget, packageManager, force) {
512
+ function runSetupPhase(options, selectedPreset, detection, contexts, ciTarget, packageManager, force, securitySensitive) {
419
513
  const warnings = [];
420
514
  const created = [];
421
515
  const updated = [];
@@ -430,6 +524,7 @@ function runSetupPhase(options, selectedPreset, detection, contexts, ciTarget, p
430
524
  react: detection.signals.hasReact,
431
525
  vite: detection.signals.hasVite,
432
526
  },
527
+ securitySensitive,
433
528
  });
434
529
  if (initResult.created) {
435
530
  for (const f of initResult.files) {
@@ -748,10 +843,10 @@ function runInstallPhase(_options, skipInstall) {
748
843
  }
749
844
  catch (err) {
750
845
  const msg = err instanceof Error ? err.message : String(err);
751
- const isPermError = msg.includes('EPERM') || msg.includes('EACCES') || msg.includes('permission denied');
752
846
  warnings.push(`Install failed: ${msg}`);
753
- if (isPermError) {
754
- warnings.push(`Hint: permission error detected. Retry outside the sandbox or with elevated privileges: ${command}`);
847
+ const hint = classifyInstallError(msg, pm);
848
+ if (hint) {
849
+ warnings.push(`Hint: ${hint}`);
755
850
  }
756
851
  warnings.push(`Retry manually: ${command}`);
757
852
  return {
@@ -764,6 +859,15 @@ function runInstallPhase(_options, skipInstall) {
764
859
  };
765
860
  }
766
861
  }
862
+ function classifyInstallError(msg, pm) {
863
+ if (/ERR_PNPM_FROZEN_LOCKFILE|frozen[-. ]lockfile|--frozen-lockfile/i.test(msg))
864
+ return 'Lockfile is out of date. Retry with: pnpm install --no-frozen-lockfile';
865
+ if (/EPERM|EACCES|permission denied/i.test(msg))
866
+ return 'Permission error. On WSL/NTFS try: pnpm install --force (or move project to ~/projects/)';
867
+ if (/ENOTFOUND|ETIMEDOUT|fetch failed|503|network/i.test(msg))
868
+ return `Network error. Check connectivity and retry: ${pm} install`;
869
+ return '';
870
+ }
767
871
  function detectPackageManagerFromLockfiles() {
768
872
  if (fs.existsSync(path.resolve('pnpm-lock.yaml')))
769
873
  return 'pnpm';
@@ -919,6 +1023,11 @@ function runDoctorPhase(options, skipDoctor) {
919
1023
  // ============================================================================
920
1024
  // Helpers
921
1025
  // ============================================================================
1026
+ /**
1027
+ * Modules that must always appear in DEFAULT_LOAD rather than ON_DEMAND.
1028
+ * core.adf and state.adf are always loaded — they are not optional.
1029
+ */
1030
+ const DEFAULT_LOAD_MODULES = new Set(['core.adf', 'state.adf']);
922
1031
  function isValidPreset(value) {
923
1032
  return value === 'worker' || value === 'frontend' || value === 'backend' || value === 'fullstack' || value === 'docs';
924
1033
  }
@@ -981,4 +1090,45 @@ function registerOrphansInManifest(manifestPath, orphans) {
981
1090
  lines.splice(insertIdx, 0, ...newEntries);
982
1091
  fs.writeFileSync(manifestPath, lines.join('\n'));
983
1092
  }
1093
+ /**
1094
+ * Register modules in the DEFAULT_LOAD section of manifest.adf.
1095
+ * Uses the structured parseAdf/formatAdf round-trip so the result is canonical.
1096
+ * DEFAULT_LOAD entries are plain filenames with no "(Triggers on: ...)" suffix.
1097
+ */
1098
+ function registerModulesInDefaultLoad(manifestPath, modules) {
1099
+ const manifestDoc = (0, adf_3.parseAdf)(fs.readFileSync(manifestPath, 'utf-8'));
1100
+ const sectionKey = 'DEFAULT_LOAD';
1101
+ let section = manifestDoc.sections.find(s => s.key === sectionKey);
1102
+ if (!section) {
1103
+ section = {
1104
+ key: sectionKey,
1105
+ decoration: '📦',
1106
+ content: { type: 'list', items: [] },
1107
+ };
1108
+ // Prepend DEFAULT_LOAD before any ON_DEMAND section
1109
+ const onDemandIdx = manifestDoc.sections.findIndex(s => s.key === 'ON_DEMAND');
1110
+ if (onDemandIdx !== -1) {
1111
+ manifestDoc.sections.splice(onDemandIdx, 0, section);
1112
+ }
1113
+ else {
1114
+ manifestDoc.sections.push(section);
1115
+ }
1116
+ }
1117
+ if (section.content.type !== 'list') {
1118
+ // Fallback: append raw text rather than throwing — bootstrap should not crash
1119
+ const raw = '\n\n📦 DEFAULT_LOAD:\n' + modules.map(m => ` - ${m}`).join('\n') + '\n';
1120
+ fs.writeFileSync(manifestPath, fs.readFileSync(manifestPath, 'utf-8').trimEnd() + raw);
1121
+ return;
1122
+ }
1123
+ let updated = false;
1124
+ for (const mod of modules) {
1125
+ if (!section.content.items.includes(mod)) {
1126
+ section.content.items.push(mod);
1127
+ updated = true;
1128
+ }
1129
+ }
1130
+ if (updated) {
1131
+ fs.writeFileSync(manifestPath, (0, adf_3.formatAdf)(manifestDoc));
1132
+ }
1133
+ }
984
1134
  //# sourceMappingURL=bootstrap.js.map