@stackbilt/cli 0.9.2 → 0.11.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 (103) hide show
  1. package/LICENSE +17 -1
  2. package/README.md +57 -0
  3. package/dist/__tests__/auth-wiring.test.d.ts +2 -0
  4. package/dist/__tests__/auth-wiring.test.d.ts.map +1 -0
  5. package/dist/__tests__/auth-wiring.test.js +158 -0
  6. package/dist/__tests__/auth-wiring.test.js.map +1 -0
  7. package/dist/__tests__/bootstrap.test.d.ts +2 -0
  8. package/dist/__tests__/bootstrap.test.d.ts.map +1 -0
  9. package/dist/__tests__/bootstrap.test.js +134 -0
  10. package/dist/__tests__/bootstrap.test.js.map +1 -0
  11. package/dist/__tests__/credentials.test.d.ts +2 -0
  12. package/dist/__tests__/credentials.test.d.ts.map +1 -0
  13. package/dist/__tests__/credentials.test.js +145 -0
  14. package/dist/__tests__/credentials.test.js.map +1 -0
  15. package/dist/__tests__/integration/precommit-hook.test.js +4 -4
  16. package/dist/__tests__/login.test.d.ts +2 -0
  17. package/dist/__tests__/login.test.d.ts.map +1 -0
  18. package/dist/__tests__/login.test.js +43 -0
  19. package/dist/__tests__/login.test.js.map +1 -0
  20. package/dist/__tests__/named-scaffolds.test.d.ts +2 -0
  21. package/dist/__tests__/named-scaffolds.test.d.ts.map +1 -0
  22. package/dist/__tests__/named-scaffolds.test.js +58 -0
  23. package/dist/__tests__/named-scaffolds.test.js.map +1 -0
  24. package/dist/__tests__/score.test.d.ts +2 -0
  25. package/dist/__tests__/score.test.d.ts.map +1 -0
  26. package/dist/__tests__/score.test.js +234 -0
  27. package/dist/__tests__/score.test.js.map +1 -0
  28. package/dist/commands/adf-named-scaffolds.d.ts +45 -0
  29. package/dist/commands/adf-named-scaffolds.d.ts.map +1 -0
  30. package/dist/commands/adf-named-scaffolds.js +114 -0
  31. package/dist/commands/adf-named-scaffolds.js.map +1 -0
  32. package/dist/commands/adf-tidy.d.ts.map +1 -1
  33. package/dist/commands/adf-tidy.js +6 -3
  34. package/dist/commands/adf-tidy.js.map +1 -1
  35. package/dist/commands/adf.d.ts +1 -0
  36. package/dist/commands/adf.d.ts.map +1 -1
  37. package/dist/commands/adf.js +39 -15
  38. package/dist/commands/adf.js.map +1 -1
  39. package/dist/commands/architect.d.ts.map +1 -1
  40. package/dist/commands/architect.js +7 -3
  41. package/dist/commands/architect.js.map +1 -1
  42. package/dist/commands/audit.js +24 -7
  43. package/dist/commands/audit.js.map +1 -1
  44. package/dist/commands/blast.d.ts +13 -0
  45. package/dist/commands/blast.d.ts.map +1 -0
  46. package/dist/commands/blast.js +226 -0
  47. package/dist/commands/blast.js.map +1 -0
  48. package/dist/commands/bootstrap.d.ts.map +1 -1
  49. package/dist/commands/bootstrap.js +300 -101
  50. package/dist/commands/bootstrap.js.map +1 -1
  51. package/dist/commands/doctor.d.ts.map +1 -1
  52. package/dist/commands/doctor.js +9 -2
  53. package/dist/commands/doctor.js.map +1 -1
  54. package/dist/commands/init.d.ts.map +1 -1
  55. package/dist/commands/init.js +127 -8
  56. package/dist/commands/init.js.map +1 -1
  57. package/dist/commands/login.d.ts +4 -1
  58. package/dist/commands/login.d.ts.map +1 -1
  59. package/dist/commands/login.js +27 -6
  60. package/dist/commands/login.js.map +1 -1
  61. package/dist/commands/run.d.ts.map +1 -1
  62. package/dist/commands/run.js +8 -5
  63. package/dist/commands/run.js.map +1 -1
  64. package/dist/commands/score.d.ts +9 -0
  65. package/dist/commands/score.d.ts.map +1 -0
  66. package/dist/commands/score.js +1273 -0
  67. package/dist/commands/score.js.map +1 -0
  68. package/dist/commands/serve.d.ts.map +1 -1
  69. package/dist/commands/serve.js +44 -0
  70. package/dist/commands/serve.js.map +1 -1
  71. package/dist/commands/setup.js +2 -2
  72. package/dist/commands/setup.js.map +1 -1
  73. package/dist/commands/surface.d.ts +15 -0
  74. package/dist/commands/surface.d.ts.map +1 -0
  75. package/dist/commands/surface.js +112 -0
  76. package/dist/commands/surface.js.map +1 -0
  77. package/dist/commands/validate-ontology.d.ts +14 -0
  78. package/dist/commands/validate-ontology.d.ts.map +1 -0
  79. package/dist/commands/validate-ontology.js +328 -0
  80. package/dist/commands/validate-ontology.js.map +1 -0
  81. package/dist/commands/validate.d.ts.map +1 -1
  82. package/dist/commands/validate.js +44 -0
  83. package/dist/commands/validate.js.map +1 -1
  84. package/dist/config.d.ts +25 -0
  85. package/dist/config.d.ts.map +1 -1
  86. package/dist/config.js +1 -0
  87. package/dist/config.js.map +1 -1
  88. package/dist/credentials.d.ts +22 -1
  89. package/dist/credentials.d.ts.map +1 -1
  90. package/dist/credentials.js +35 -1
  91. package/dist/credentials.js.map +1 -1
  92. package/dist/http-client.d.ts +13 -4
  93. package/dist/http-client.d.ts.map +1 -1
  94. package/dist/http-client.js +3 -2
  95. package/dist/http-client.js.map +1 -1
  96. package/dist/index.d.ts.map +1 -1
  97. package/dist/index.js +22 -3
  98. package/dist/index.js.map +1 -1
  99. package/dist/types/scaffold-contract-types.d.ts +90 -0
  100. package/dist/types/scaffold-contract-types.d.ts.map +1 -0
  101. package/dist/types/scaffold-contract-types.js +22 -0
  102. package/dist/types/scaffold-contract-types.js.map +1 -0
  103. package/package.json +12 -9
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const login_1 = require("../commands/login");
5
+ const credentials_1 = require("../credentials");
6
+ const options = {
7
+ format: 'text',
8
+ configPath: '.charter',
9
+ ciMode: false,
10
+ yes: false,
11
+ };
12
+ (0, vitest_1.describe)('charter login — deprecation notice', () => {
13
+ const originalEnv = process.env[credentials_1.API_KEY_ENV_VAR];
14
+ (0, vitest_1.beforeEach)(() => {
15
+ delete process.env[credentials_1.API_KEY_ENV_VAR];
16
+ });
17
+ (0, vitest_1.afterEach)(() => {
18
+ if (originalEnv === undefined) {
19
+ delete process.env[credentials_1.API_KEY_ENV_VAR];
20
+ }
21
+ else {
22
+ process.env[credentials_1.API_KEY_ENV_VAR] = originalEnv;
23
+ }
24
+ vitest_1.vi.restoreAllMocks();
25
+ });
26
+ (0, vitest_1.it)('writes a deprecation notice to stderr when invoked without args', async () => {
27
+ const stderr = vitest_1.vi.spyOn(process.stderr, 'write').mockImplementation(() => true);
28
+ vitest_1.vi.spyOn(console, 'log').mockImplementation(() => { });
29
+ await (0, login_1.loginCommand)(options, []);
30
+ const stderrOutput = stderr.mock.calls.map((c) => String(c[0])).join('');
31
+ (0, vitest_1.expect)(stderrOutput).toMatch(/deprecated/i);
32
+ (0, vitest_1.expect)(stderrOutput).toContain(credentials_1.API_KEY_ENV_VAR);
33
+ });
34
+ (0, vitest_1.it)('reports env-var usage when STACKBILT_API_KEY is set and no --key flag', async () => {
35
+ process.env[credentials_1.API_KEY_ENV_VAR] = 'ea_login_test_key';
36
+ vitest_1.vi.spyOn(process.stderr, 'write').mockImplementation(() => true);
37
+ const log = vitest_1.vi.spyOn(console, 'log').mockImplementation(() => { });
38
+ await (0, login_1.loginCommand)(options, []);
39
+ const stdoutOutput = log.mock.calls.map((c) => String(c[0])).join('\n');
40
+ (0, vitest_1.expect)(stdoutOutput).toMatch(new RegExp(`Using ${credentials_1.API_KEY_ENV_VAR} from environment`));
41
+ });
42
+ });
43
+ //# sourceMappingURL=login.test.js.map
@@ -0,0 +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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=named-scaffolds.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"named-scaffolds.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/named-scaffolds.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const adf_named_scaffolds_1 = require("../commands/adf-named-scaffolds");
5
+ (0, vitest_1.describe)('NAMED_MODULE_SCAFFOLDS registry', () => {
6
+ (0, vitest_1.it)('contains typed-data-access scaffold entry', () => {
7
+ (0, vitest_1.expect)(adf_named_scaffolds_1.NAMED_MODULE_SCAFFOLDS['typed-data-access']).toBeDefined();
8
+ (0, vitest_1.expect)(adf_named_scaffolds_1.NAMED_MODULE_SCAFFOLDS['typed-data-access']).toBe(adf_named_scaffolds_1.TYPED_DATA_ACCESS_SCAFFOLD);
9
+ });
10
+ (0, vitest_1.it)('typed-data-access scaffold is valid ADF 0.1', () => {
11
+ const scaffold = adf_named_scaffolds_1.NAMED_MODULE_SCAFFOLDS['typed-data-access'];
12
+ (0, vitest_1.expect)(scaffold).toMatch(/^ADF: 0\.1/);
13
+ });
14
+ (0, vitest_1.it)('typed-data-access scaffold declares the six sensitivity tiers', () => {
15
+ const scaffold = adf_named_scaffolds_1.NAMED_MODULE_SCAFFOLDS['typed-data-access'];
16
+ (0, vitest_1.expect)(scaffold).toContain('public');
17
+ (0, vitest_1.expect)(scaffold).toContain('service_internal');
18
+ (0, vitest_1.expect)(scaffold).toContain('cross_service_rpc');
19
+ (0, vitest_1.expect)(scaffold).toContain('pii_scoped');
20
+ (0, vitest_1.expect)(scaffold).toContain('billing_critical');
21
+ (0, vitest_1.expect)(scaffold).toContain('secrets');
22
+ });
23
+ (0, vitest_1.it)('typed-data-access scaffold references the canonical registry path', () => {
24
+ const scaffold = adf_named_scaffolds_1.NAMED_MODULE_SCAFFOLDS['typed-data-access'];
25
+ (0, vitest_1.expect)(scaffold).toContain('stackbilt_llc/policies/data-registry.yaml');
26
+ });
27
+ (0, vitest_1.it)('typed-data-access scaffold includes load-bearing disambiguation constraint', () => {
28
+ const scaffold = adf_named_scaffolds_1.NAMED_MODULE_SCAFFOLDS['typed-data-access'];
29
+ (0, vitest_1.expect)(scaffold).toMatch(/CONSTRAINTS \[load-bearing\]/);
30
+ (0, vitest_1.expect)(scaffold).toContain('HALT and ask');
31
+ });
32
+ });
33
+ (0, vitest_1.describe)('NAMED_MODULE_DEFAULT_TRIGGERS registry', () => {
34
+ (0, vitest_1.it)('contains typed-data-access trigger keywords', () => {
35
+ (0, vitest_1.expect)(adf_named_scaffolds_1.NAMED_MODULE_DEFAULT_TRIGGERS['typed-data-access']).toBeDefined();
36
+ (0, vitest_1.expect)(Array.isArray(adf_named_scaffolds_1.NAMED_MODULE_DEFAULT_TRIGGERS['typed-data-access'])).toBe(true);
37
+ });
38
+ (0, vitest_1.it)('typed-data-access triggers include canonical business concept names', () => {
39
+ const triggers = adf_named_scaffolds_1.NAMED_MODULE_DEFAULT_TRIGGERS['typed-data-access'];
40
+ (0, vitest_1.expect)(triggers).toContain('tenant');
41
+ (0, vitest_1.expect)(triggers).toContain('user');
42
+ (0, vitest_1.expect)(triggers).toContain('subscription');
43
+ (0, vitest_1.expect)(triggers).toContain('quota');
44
+ });
45
+ (0, vitest_1.it)('typed-data-access triggers include sensitivity and policy keywords', () => {
46
+ const triggers = adf_named_scaffolds_1.NAMED_MODULE_DEFAULT_TRIGGERS['typed-data-access'];
47
+ (0, vitest_1.expect)(triggers).toContain('sensitivity');
48
+ (0, vitest_1.expect)(triggers).toContain('DATA_AUTHORITY');
49
+ (0, vitest_1.expect)(triggers).toContain('disambiguation');
50
+ });
51
+ (0, vitest_1.it)('every named scaffold has default triggers registered', () => {
52
+ for (const name of Object.keys(adf_named_scaffolds_1.NAMED_MODULE_SCAFFOLDS)) {
53
+ (0, vitest_1.expect)(adf_named_scaffolds_1.NAMED_MODULE_DEFAULT_TRIGGERS[name]).toBeDefined();
54
+ (0, vitest_1.expect)(adf_named_scaffolds_1.NAMED_MODULE_DEFAULT_TRIGGERS[name].length).toBeGreaterThan(0);
55
+ }
56
+ });
57
+ });
58
+ //# sourceMappingURL=named-scaffolds.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"named-scaffolds.test.js","sourceRoot":"","sources":["../../src/__tests__/named-scaffolds.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=score.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"score.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/score.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,234 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const fs = __importStar(require("node:fs"));
37
+ const os = __importStar(require("node:os"));
38
+ const path = __importStar(require("node:path"));
39
+ const vitest_1 = require("vitest");
40
+ const index_1 = require("../index");
41
+ const score_1 = require("../commands/score");
42
+ const baseOptions = {
43
+ configPath: '.charter',
44
+ format: 'json',
45
+ ciMode: false,
46
+ yes: false,
47
+ };
48
+ const originalCwd = process.cwd();
49
+ const tempDirs = [];
50
+ (0, vitest_1.afterEach)(() => {
51
+ process.chdir(originalCwd);
52
+ while (tempDirs.length > 0) {
53
+ const dir = tempDirs.pop();
54
+ if (dir) {
55
+ fs.rmSync(dir, { recursive: true, force: true });
56
+ }
57
+ }
58
+ vitest_1.vi.restoreAllMocks();
59
+ });
60
+ (0, vitest_1.describe)('scoreCommand', () => {
61
+ (0, vitest_1.it)('gives a strong score to a well-grounded Charter-style repo', async () => {
62
+ const tmp = createTempRepo();
63
+ process.chdir(tmp);
64
+ fs.mkdirSync(path.join(tmp, '.ai'), { recursive: true });
65
+ fs.mkdirSync(path.join(tmp, '.github', 'workflows'), { recursive: true });
66
+ fs.mkdirSync(path.join(tmp, '.githooks'), { recursive: true });
67
+ fs.mkdirSync(path.join(tmp, '.codex', 'skills', 'review'), { recursive: true });
68
+ fs.mkdirSync(path.join(tmp, '.claude'), { recursive: true });
69
+ fs.mkdirSync(path.join(tmp, 'src'), { recursive: true });
70
+ fs.writeFileSync(path.join(tmp, 'package.json'), JSON.stringify({
71
+ name: 'ready-repo',
72
+ version: '1.0.0',
73
+ scripts: {
74
+ test: 'vitest run',
75
+ 'test:unit': 'vitest run src/index.ts',
76
+ },
77
+ }, null, 2));
78
+ fs.writeFileSync(path.join(tmp, 'README.md'), `# Ready Repo
79
+
80
+ See \`src/index.ts\` and \`.ai/manifest.adf\`.
81
+
82
+ \`\`\`sh
83
+ npm test
84
+ npm run test:unit
85
+ \`\`\`
86
+ `);
87
+ fs.writeFileSync(path.join(tmp, 'CLAUDE.md'), `# Working Rules
88
+
89
+ Use \`src/index.ts\` as the main entrypoint.
90
+ Review \`.ai/manifest.adf\` before changing architecture.
91
+
92
+ \`\`\`sh
93
+ charter adf evidence --auto-measure
94
+ \`\`\`
95
+ `);
96
+ fs.writeFileSync(path.join(tmp, '.cursorrules'), `Keep edits small.
97
+ Check \`.ai/core.adf\` and \`.ai/state.adf\` before large changes.
98
+ `);
99
+ fs.writeFileSync(path.join(tmp, 'AGENTS.md'), `# Agents
100
+
101
+ Coordinate ownership before parallel changes.
102
+ Use \`npm test\` before handing work back.
103
+ `);
104
+ fs.writeFileSync(path.join(tmp, '.ai', 'manifest.adf'), `ADF: 0.1
105
+ ROLE: Repo context router
106
+
107
+ DEFAULT_LOAD:
108
+ - core.adf
109
+ - state.adf
110
+
111
+ ON_DEMAND:
112
+ - backend.adf (Triggers on: API, Node, DB)
113
+ `);
114
+ fs.writeFileSync(path.join(tmp, '.ai', 'core.adf'), `ADF: 0.1
115
+
116
+ CONTEXT:
117
+ - Service entrypoint: src/index.ts
118
+
119
+ CONSTRAINTS [load-bearing]:
120
+ - Run npm test before merge
121
+ - Keep API handlers pure at the edge
122
+
123
+ METRICS:
124
+ entry_loc: 12 / 200 [lines]
125
+ `);
126
+ fs.writeFileSync(path.join(tmp, '.ai', 'state.adf'), `ADF: 0.1
127
+ STATE:
128
+ CURRENT: scoring implementation is active
129
+ NEXT: keep docs synchronized
130
+ `);
131
+ fs.writeFileSync(path.join(tmp, '.ai', 'backend.adf'), `ADF: 0.1
132
+ CONTEXT:
133
+ - API routes live in src/index.ts
134
+ `);
135
+ fs.writeFileSync(path.join(tmp, 'src', 'index.ts'), 'export const ready = true;\n');
136
+ fs.writeFileSync(path.join(tmp, '.github', 'workflows', 'ci.yml'), 'name: CI\non: [push]\n');
137
+ fs.writeFileSync(path.join(tmp, '.githooks', 'pre-commit'), '#!/usr/bin/env sh\nnpm test\n');
138
+ fs.writeFileSync(path.join(tmp, '.codex', 'skills', 'review', 'SKILL.md'), '# Review Skill\n');
139
+ fs.writeFileSync(path.join(tmp, '.claude', 'settings.json'), JSON.stringify({
140
+ permissions: {
141
+ allow: ['Bash(npm test)'],
142
+ },
143
+ }, null, 2));
144
+ const { exitCode, report } = await captureJson(() => (0, score_1.scoreCommand)(baseOptions, []));
145
+ (0, vitest_1.expect)(exitCode).toBe(0);
146
+ (0, vitest_1.expect)(report.score.grade).toBe('A');
147
+ (0, vitest_1.expect)(report.score.total).toBeGreaterThanOrEqual(95);
148
+ (0, vitest_1.expect)(findCategory(report, 'agent-config')?.score).toBe(25);
149
+ (0, vitest_1.expect)(findCategory(report, 'architecture')?.score).toBe(20);
150
+ (0, vitest_1.expect)(findCategory(report, 'governance')?.score).toBe(10);
151
+ (0, vitest_1.expect)(report.recommendations).not.toContainEqual(vitest_1.expect.stringContaining('charter bootstrap --yes'));
152
+ });
153
+ (0, vitest_1.it)('is registered in the top-level CLI and scores non-Charter repos without crashing', async () => {
154
+ const tmp = createTempRepo();
155
+ process.chdir(tmp);
156
+ fs.mkdirSync(path.join(tmp, 'src'), { recursive: true });
157
+ fs.mkdirSync(path.join(tmp, '.github', 'workflows'), { recursive: true });
158
+ fs.writeFileSync(path.join(tmp, 'package.json'), JSON.stringify({
159
+ name: 'plain-repo',
160
+ version: '1.0.0',
161
+ scripts: {
162
+ test: 'node --test',
163
+ },
164
+ }, null, 2));
165
+ fs.writeFileSync(path.join(tmp, 'README.md'), `# Plain Repo
166
+
167
+ Main module: \`src/app.ts\`
168
+
169
+ \`\`\`sh
170
+ npm test
171
+ \`\`\`
172
+ `);
173
+ fs.writeFileSync(path.join(tmp, 'src', 'app.ts'), 'export const app = 1;\n');
174
+ fs.writeFileSync(path.join(tmp, '.github', 'workflows', 'ci.yml'), 'name: CI\non: [push]\n');
175
+ const { exitCode, report } = await captureJson(() => (0, index_1.run)(['score', '--format', 'json']));
176
+ (0, vitest_1.expect)(exitCode).toBe(0);
177
+ (0, vitest_1.expect)(report.score.total).toBeGreaterThan(0);
178
+ (0, vitest_1.expect)(report.recommendations.some((item) => item.includes('charter bootstrap --yes'))).toBe(true);
179
+ (0, vitest_1.expect)(report.recommendations.some((item) => item.includes('CLAUDE.md'))).toBe(true);
180
+ });
181
+ (0, vitest_1.it)('falls back to mtime freshness and flags stale config relative to code', async () => {
182
+ const tmp = createTempRepo();
183
+ process.chdir(tmp);
184
+ fs.mkdirSync(path.join(tmp, 'src'), { recursive: true });
185
+ fs.writeFileSync(path.join(tmp, 'package.json'), JSON.stringify({
186
+ name: 'stale-repo',
187
+ version: '1.0.0',
188
+ scripts: {
189
+ test: 'node --test',
190
+ },
191
+ }, null, 2));
192
+ fs.writeFileSync(path.join(tmp, 'README.md'), `# Stale Repo
193
+
194
+ \`\`\`sh
195
+ npm test
196
+ \`\`\`
197
+ `);
198
+ fs.writeFileSync(path.join(tmp, 'CLAUDE.md'), '# Repo Rules\n\nRun `npm test` before merge.\n');
199
+ fs.writeFileSync(path.join(tmp, '.cursorrules'), 'Keep changes localized.\n');
200
+ fs.writeFileSync(path.join(tmp, 'AGENTS.md'), '# Agents\n\nCoordinate work.\n');
201
+ fs.writeFileSync(path.join(tmp, 'src', 'app.ts'), 'export const stale = true;\n');
202
+ const oldDate = new Date(Date.now() - (160 * 24 * 60 * 60 * 1000));
203
+ const newDate = new Date(Date.now() - (2 * 24 * 60 * 60 * 1000));
204
+ for (const file of ['CLAUDE.md', '.cursorrules', 'AGENTS.md']) {
205
+ fs.utimesSync(path.join(tmp, file), oldDate, oldDate);
206
+ }
207
+ fs.utimesSync(path.join(tmp, 'src', 'app.ts'), newDate, newDate);
208
+ const { report } = await captureJson(() => (0, score_1.scoreCommand)(baseOptions, []));
209
+ (0, vitest_1.expect)(report.signals.freshness.strategy).toBe('mtime');
210
+ (0, vitest_1.expect)((report.signals.freshness.deltaDays || 0)).toBeGreaterThan(100);
211
+ (0, vitest_1.expect)(findCategory(report, 'freshness')?.score).toBeLessThanOrEqual(2);
212
+ (0, vitest_1.expect)(report.recommendations.some((item) => item.includes('Refresh agent config after recent code changes'))).toBe(true);
213
+ });
214
+ });
215
+ function createTempRepo() {
216
+ const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'charter-score-test-'));
217
+ tempDirs.push(tmp);
218
+ return tmp;
219
+ }
220
+ async function captureJson(runCommand) {
221
+ const logs = [];
222
+ vitest_1.vi.spyOn(console, 'log').mockImplementation((message) => {
223
+ logs.push(String(message ?? ''));
224
+ });
225
+ const exitCode = await runCommand();
226
+ return {
227
+ exitCode,
228
+ report: JSON.parse(logs[0]),
229
+ };
230
+ }
231
+ function findCategory(report, id) {
232
+ return report.categories.find((category) => category.id === id);
233
+ }
234
+ //# sourceMappingURL=score.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"score.test.js","sourceRoot":"","sources":["../../src/__tests__/score.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Named-module scaffold registry.
3
+ *
4
+ * Rich scaffolds for canonical policy modules that consumer repos can adopt
5
+ * with `charter adf create <name>`. The generic empty placeholder in
6
+ * buildModuleScaffold is the fallback; entries in NAMED_MODULE_SCAFFOLDS
7
+ * take precedence.
8
+ *
9
+ * Each named module also registers default manifest trigger keywords in
10
+ * NAMED_MODULE_DEFAULT_TRIGGERS. When `charter adf create <name>` is called
11
+ * without an explicit --triggers flag, these auto-populate the ON_DEMAND
12
+ * entry so the wiring is a one-command operation.
13
+ *
14
+ * Adding a new named module:
15
+ * 1. Add the scaffold content as an exported const
16
+ * 2. Register it in NAMED_MODULE_SCAFFOLDS
17
+ * 3. Register default triggers in NAMED_MODULE_DEFAULT_TRIGGERS
18
+ * 4. Add tests in __tests__/named-scaffolds.test.ts
19
+ */
20
+ /**
21
+ * Typed data access and ontology enforcement policy (Stackbilt-dev/charter#69).
22
+ *
23
+ * Codifies the cross-repo policy for how services reference business concepts
24
+ * (tenant, user, subscription, quota, etc.) — derived from the canonical data
25
+ * registry at Stackbilt-dev/stackbilt_llc/policies/data-registry.yaml.
26
+ *
27
+ * Declares six sensitivity tiers, the disambiguation protocol, and RPC
28
+ * boundary rules. Consumed by charter validate / codebeast DATA_AUTHORITY /
29
+ * AEGIS disambiguation firewall as the single source of truth for data
30
+ * access policy across the ecosystem.
31
+ */
32
+ export declare const TYPED_DATA_ACCESS_SCAFFOLD = "ADF: 0.1\n\n\uD83C\uDFAF TASK: Typed data access and ontology enforcement policy\n\n\uD83D\uDCCB CONTEXT:\n - Business concepts (tenant, user, subscription, quota, credit, mrr, etc.) are defined in a canonical data registry \u2014 the single source of truth for ownership, sensitivity, and access shape across the ecosystem\n - Reference registry location: Stackbilt-dev/stackbilt_llc/policies/data-registry.yaml (22+ concepts, 6 sensitivity tiers)\n - Each concept declares: owner service, D1 table, sensitivity tier, definition, aliases, rpc_method, mcp_tool\n - Consumer services derive their KNOWN_CONCEPTS and alias maps from the registry at build time (compiled-const snapshot)\n - Disambiguation protocol halts on undefined concepts rather than guessing\n - CodeBeast DATA_AUTHORITY sensitivity class escalates raw D1 access to owned tables\n\n\uD83D\uDD10 SENSITIVITY TIERS [load-bearing]:\n - public \u2014 readable from any service, no auth required (e.g., blog_post)\n - service_internal \u2014 readable/writable only by the owning service, raw D1 access is fine within the owner\n - cross_service_rpc \u2014 accessible via declared rpc_method or Service Binding, never raw D1 from a non-owning service\n - pii_scoped \u2014 accessible only via owning service + audit_log entry required at the call site\n - billing_critical \u2014 writable only by the owning service plus the Stripe webhook handler; never leaves the owning service boundary even via RPC\n - secrets \u2014 never leaves the owning service boundary under any circumstance\n\n\u26A0\uFE0F CONSTRAINTS [load-bearing]:\n - New code referencing a business concept MUST check the canonical registry first; terms not in the registry or its aliases MUST be added before the code lands\n - Non-owning services reading or writing cross_service_rpc concepts MUST use the declared rpc_method or mcp_tool \u2014 raw D1 access to another service's table is a DATA_AUTHORITY violation\n - pii_scoped access requires an audit_log entry at the call site \u2014 no silent reads\n - billing_critical and secrets tiers NEVER cross the owning service boundary, even via RPC\n - When encountering an undefined data concept in requirements, tasks, or user prompts, HALT and ask for clarification rather than guessing shape, ownership, or sensitivity\n - Registry updates MUST come before consumer code updates \u2014 the source of truth leads, consumers follow\n - When promoting a concept to a higher sensitivity tier, all existing consumers of raw D1 access must migrate to RPC in the same change set\n\n\uD83D\uDCD6 ADVISORY:\n - Check the registry before reaching for a new type definition \u2014 the concept may already exist with a canonical shape\n - Use charter surface --format json to discover what D1 tables a service currently exposes; cross-reference against registry ownership\n - Aliases (e.g., \"credits\" for \"quota\") are semantically equivalent; prefer the canonical form in new code, accept aliases in user-facing copy\n - The disambiguation protocol is load-bearing for autonomous agents \u2014 these systems cannot safely guess business term semantics\n\n\uD83D\uDCCA METRICS:\n REGISTRY_PATH: stackbilt_llc/policies/data-registry.yaml\n REGISTRY_REPO: Stackbilt-dev/stackbilt_llc\n SENSITIVITY_TIERS: 6\n DOCUMENTED_CONCEPTS: 22\n\n\uD83D\uDD17 REFERENCES:\n - Stackbilt-dev/charter#69 \u2014 typed data access policy umbrella issue\n - codebeast#9 \u2014 DATA_AUTHORITY sensitivity class (enforcement side)\n - Stackbilt-dev/aegis#344 \u2014 disambiguation firewall (runtime halt mechanism)\n";
33
+ /**
34
+ * Registry of rich named-module scaffolds. When `charter adf create <name>`
35
+ * matches a name in this map, the corresponding scaffold is written instead
36
+ * of the generic empty placeholder from buildModuleScaffold's fallback.
37
+ */
38
+ export declare const NAMED_MODULE_SCAFFOLDS: Record<string, string>;
39
+ /**
40
+ * Default manifest trigger keywords for named modules. Used when
41
+ * `charter adf create <name>` matches a known module and no explicit
42
+ * --triggers flag is provided.
43
+ */
44
+ export declare const NAMED_MODULE_DEFAULT_TRIGGERS: Record<string, string[]>;
45
+ //# sourceMappingURL=adf-named-scaffolds.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adf-named-scaffolds.d.ts","sourceRoot":"","sources":["../../src/commands/adf-named-scaffolds.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,0BAA0B,qjHA6CtC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAEzD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,6BAA6B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAmBlE,CAAC"}
@@ -0,0 +1,114 @@
1
+ "use strict";
2
+ /**
3
+ * Named-module scaffold registry.
4
+ *
5
+ * Rich scaffolds for canonical policy modules that consumer repos can adopt
6
+ * with `charter adf create <name>`. The generic empty placeholder in
7
+ * buildModuleScaffold is the fallback; entries in NAMED_MODULE_SCAFFOLDS
8
+ * take precedence.
9
+ *
10
+ * Each named module also registers default manifest trigger keywords in
11
+ * NAMED_MODULE_DEFAULT_TRIGGERS. When `charter adf create <name>` is called
12
+ * without an explicit --triggers flag, these auto-populate the ON_DEMAND
13
+ * entry so the wiring is a one-command operation.
14
+ *
15
+ * Adding a new named module:
16
+ * 1. Add the scaffold content as an exported const
17
+ * 2. Register it in NAMED_MODULE_SCAFFOLDS
18
+ * 3. Register default triggers in NAMED_MODULE_DEFAULT_TRIGGERS
19
+ * 4. Add tests in __tests__/named-scaffolds.test.ts
20
+ */
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.NAMED_MODULE_DEFAULT_TRIGGERS = exports.NAMED_MODULE_SCAFFOLDS = exports.TYPED_DATA_ACCESS_SCAFFOLD = void 0;
23
+ /**
24
+ * Typed data access and ontology enforcement policy (Stackbilt-dev/charter#69).
25
+ *
26
+ * Codifies the cross-repo policy for how services reference business concepts
27
+ * (tenant, user, subscription, quota, etc.) — derived from the canonical data
28
+ * registry at Stackbilt-dev/stackbilt_llc/policies/data-registry.yaml.
29
+ *
30
+ * Declares six sensitivity tiers, the disambiguation protocol, and RPC
31
+ * boundary rules. Consumed by charter validate / codebeast DATA_AUTHORITY /
32
+ * AEGIS disambiguation firewall as the single source of truth for data
33
+ * access policy across the ecosystem.
34
+ */
35
+ exports.TYPED_DATA_ACCESS_SCAFFOLD = `ADF: 0.1
36
+
37
+ \u{1F3AF} TASK: Typed data access and ontology enforcement policy
38
+
39
+ \u{1F4CB} CONTEXT:
40
+ - Business concepts (tenant, user, subscription, quota, credit, mrr, etc.) are defined in a canonical data registry — the single source of truth for ownership, sensitivity, and access shape across the ecosystem
41
+ - Reference registry location: Stackbilt-dev/stackbilt_llc/policies/data-registry.yaml (22+ concepts, 6 sensitivity tiers)
42
+ - Each concept declares: owner service, D1 table, sensitivity tier, definition, aliases, rpc_method, mcp_tool
43
+ - Consumer services derive their KNOWN_CONCEPTS and alias maps from the registry at build time (compiled-const snapshot)
44
+ - Disambiguation protocol halts on undefined concepts rather than guessing
45
+ - CodeBeast DATA_AUTHORITY sensitivity class escalates raw D1 access to owned tables
46
+
47
+ \u{1F510} SENSITIVITY TIERS [load-bearing]:
48
+ - public \u2014 readable from any service, no auth required (e.g., blog_post)
49
+ - service_internal \u2014 readable/writable only by the owning service, raw D1 access is fine within the owner
50
+ - cross_service_rpc \u2014 accessible via declared rpc_method or Service Binding, never raw D1 from a non-owning service
51
+ - pii_scoped \u2014 accessible only via owning service + audit_log entry required at the call site
52
+ - billing_critical \u2014 writable only by the owning service plus the Stripe webhook handler; never leaves the owning service boundary even via RPC
53
+ - secrets \u2014 never leaves the owning service boundary under any circumstance
54
+
55
+ \u26A0\uFE0F CONSTRAINTS [load-bearing]:
56
+ - New code referencing a business concept MUST check the canonical registry first; terms not in the registry or its aliases MUST be added before the code lands
57
+ - Non-owning services reading or writing cross_service_rpc concepts MUST use the declared rpc_method or mcp_tool \u2014 raw D1 access to another service's table is a DATA_AUTHORITY violation
58
+ - pii_scoped access requires an audit_log entry at the call site \u2014 no silent reads
59
+ - billing_critical and secrets tiers NEVER cross the owning service boundary, even via RPC
60
+ - When encountering an undefined data concept in requirements, tasks, or user prompts, HALT and ask for clarification rather than guessing shape, ownership, or sensitivity
61
+ - Registry updates MUST come before consumer code updates \u2014 the source of truth leads, consumers follow
62
+ - When promoting a concept to a higher sensitivity tier, all existing consumers of raw D1 access must migrate to RPC in the same change set
63
+
64
+ \u{1F4D6} ADVISORY:
65
+ - Check the registry before reaching for a new type definition \u2014 the concept may already exist with a canonical shape
66
+ - Use charter surface --format json to discover what D1 tables a service currently exposes; cross-reference against registry ownership
67
+ - Aliases (e.g., "credits" for "quota") are semantically equivalent; prefer the canonical form in new code, accept aliases in user-facing copy
68
+ - The disambiguation protocol is load-bearing for autonomous agents \u2014 these systems cannot safely guess business term semantics
69
+
70
+ \u{1F4CA} METRICS:
71
+ REGISTRY_PATH: stackbilt_llc/policies/data-registry.yaml
72
+ REGISTRY_REPO: Stackbilt-dev/stackbilt_llc
73
+ SENSITIVITY_TIERS: 6
74
+ DOCUMENTED_CONCEPTS: 22
75
+
76
+ \u{1F517} REFERENCES:
77
+ - Stackbilt-dev/charter#69 \u2014 typed data access policy umbrella issue
78
+ - codebeast#9 \u2014 DATA_AUTHORITY sensitivity class (enforcement side)
79
+ - Stackbilt-dev/aegis#344 \u2014 disambiguation firewall (runtime halt mechanism)
80
+ `;
81
+ /**
82
+ * Registry of rich named-module scaffolds. When `charter adf create <name>`
83
+ * matches a name in this map, the corresponding scaffold is written instead
84
+ * of the generic empty placeholder from buildModuleScaffold's fallback.
85
+ */
86
+ exports.NAMED_MODULE_SCAFFOLDS = {
87
+ 'typed-data-access': exports.TYPED_DATA_ACCESS_SCAFFOLD,
88
+ };
89
+ /**
90
+ * Default manifest trigger keywords for named modules. Used when
91
+ * `charter adf create <name>` matches a known module and no explicit
92
+ * --triggers flag is provided.
93
+ */
94
+ exports.NAMED_MODULE_DEFAULT_TRIGGERS = {
95
+ 'typed-data-access': [
96
+ 'tenant',
97
+ 'user',
98
+ 'subscription',
99
+ 'quota',
100
+ 'credit',
101
+ 'mrr',
102
+ 'pii',
103
+ 'sensitivity',
104
+ 'data registry',
105
+ 'ontology',
106
+ 'disambiguation',
107
+ 'DATA_AUTHORITY',
108
+ 'raw D1',
109
+ 'service boundary',
110
+ 'auth_scoped',
111
+ 'billing_critical',
112
+ ],
113
+ };
114
+ //# sourceMappingURL=adf-named-scaffolds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adf-named-scaffolds.js","sourceRoot":"","sources":["../../src/commands/adf-named-scaffolds.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;GAkBG;;;AAEH;;;;;;;;;;;GAWG;AACU,QAAA,0BAA0B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6CzC,CAAC;AAEF;;;;GAIG;AACU,QAAA,sBAAsB,GAA2B;IAC5D,mBAAmB,EAAE,kCAA0B;CAChD,CAAC;AAEF;;;;GAIG;AACU,QAAA,6BAA6B,GAA6B;IACrE,mBAAmB,EAAE;QACnB,QAAQ;QACR,MAAM;QACN,cAAc;QACd,OAAO;QACP,QAAQ;QACR,KAAK;QACL,KAAK;QACL,aAAa;QACb,eAAe;QACf,UAAU;QACV,gBAAgB;QAChB,gBAAgB;QAChB,QAAQ;QACR,kBAAkB;QAClB,aAAa;QACb,kBAAkB;KACnB;CACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"adf-tidy.d.ts","sourceRoot":"","sources":["../../src/commands/adf-tidy.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAcH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAwE3C,wBAAsB,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAwHzF"}
1
+ {"version":3,"file":"adf-tidy.d.ts","sourceRoot":"","sources":["../../src/commands/adf-tidy.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAeH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAwE3C,wBAAsB,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAwHzF"}
@@ -220,7 +220,9 @@ function extractBeyondPointer(content, fileName) {
220
220
  const template = getPointerTemplates()[baseName];
221
221
  if (!template)
222
222
  return '';
223
- const lines = content.split('\n');
223
+ // Strip charter-managed sentinel blocks before scanning for bloat.
224
+ // Without this, tidy treats the module index table as user-authored content.
225
+ const lines = (0, adf_1.stripCharterSentinels)(content).split('\n');
224
226
  const bloatLines = [];
225
227
  let inEnvironmentSection = false;
226
228
  let inPointerHeader = true; // Start true — skip the pointer preamble
@@ -254,13 +256,14 @@ function extractBeyondPointer(content, fileName) {
254
256
  }
255
257
  // Section detection
256
258
  if (trimmed.startsWith('## ')) {
257
- if (trimmed === '## Environment') {
259
+ // Environment and Module Index are charter-managed retained sections — not bloat (#71)
260
+ if (trimmed === '## Environment' || trimmed === '## Module Index') {
258
261
  inEnvironmentSection = true;
259
262
  continue;
260
263
  }
261
264
  else {
262
265
  inEnvironmentSection = false;
263
- // Non-Environment H2 section = bloat
266
+ // Non-retained H2 section = bloat
264
267
  bloatLines.push(line);
265
268
  continue;
266
269
  }