@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.
- package/LICENSE +17 -1
- package/README.md +57 -0
- package/dist/__tests__/auth-wiring.test.d.ts +2 -0
- package/dist/__tests__/auth-wiring.test.d.ts.map +1 -0
- package/dist/__tests__/auth-wiring.test.js +158 -0
- package/dist/__tests__/auth-wiring.test.js.map +1 -0
- package/dist/__tests__/bootstrap.test.d.ts +2 -0
- package/dist/__tests__/bootstrap.test.d.ts.map +1 -0
- package/dist/__tests__/bootstrap.test.js +134 -0
- package/dist/__tests__/bootstrap.test.js.map +1 -0
- package/dist/__tests__/credentials.test.d.ts +2 -0
- package/dist/__tests__/credentials.test.d.ts.map +1 -0
- package/dist/__tests__/credentials.test.js +145 -0
- package/dist/__tests__/credentials.test.js.map +1 -0
- package/dist/__tests__/integration/precommit-hook.test.js +4 -4
- package/dist/__tests__/login.test.d.ts +2 -0
- package/dist/__tests__/login.test.d.ts.map +1 -0
- package/dist/__tests__/login.test.js +43 -0
- package/dist/__tests__/login.test.js.map +1 -0
- package/dist/__tests__/named-scaffolds.test.d.ts +2 -0
- package/dist/__tests__/named-scaffolds.test.d.ts.map +1 -0
- package/dist/__tests__/named-scaffolds.test.js +58 -0
- package/dist/__tests__/named-scaffolds.test.js.map +1 -0
- package/dist/__tests__/score.test.d.ts +2 -0
- package/dist/__tests__/score.test.d.ts.map +1 -0
- package/dist/__tests__/score.test.js +234 -0
- package/dist/__tests__/score.test.js.map +1 -0
- package/dist/commands/adf-named-scaffolds.d.ts +45 -0
- package/dist/commands/adf-named-scaffolds.d.ts.map +1 -0
- package/dist/commands/adf-named-scaffolds.js +114 -0
- package/dist/commands/adf-named-scaffolds.js.map +1 -0
- package/dist/commands/adf-tidy.d.ts.map +1 -1
- package/dist/commands/adf-tidy.js +6 -3
- package/dist/commands/adf-tidy.js.map +1 -1
- package/dist/commands/adf.d.ts +1 -0
- package/dist/commands/adf.d.ts.map +1 -1
- package/dist/commands/adf.js +39 -15
- package/dist/commands/adf.js.map +1 -1
- package/dist/commands/architect.d.ts.map +1 -1
- package/dist/commands/architect.js +7 -3
- package/dist/commands/architect.js.map +1 -1
- package/dist/commands/audit.js +24 -7
- package/dist/commands/audit.js.map +1 -1
- package/dist/commands/blast.d.ts +13 -0
- package/dist/commands/blast.d.ts.map +1 -0
- package/dist/commands/blast.js +226 -0
- package/dist/commands/blast.js.map +1 -0
- package/dist/commands/bootstrap.d.ts.map +1 -1
- package/dist/commands/bootstrap.js +300 -101
- package/dist/commands/bootstrap.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +9 -2
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +127 -8
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/login.d.ts +4 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +27 -6
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +8 -5
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/score.d.ts +9 -0
- package/dist/commands/score.d.ts.map +1 -0
- package/dist/commands/score.js +1273 -0
- package/dist/commands/score.js.map +1 -0
- package/dist/commands/serve.d.ts.map +1 -1
- package/dist/commands/serve.js +44 -0
- package/dist/commands/serve.js.map +1 -1
- package/dist/commands/setup.js +2 -2
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/surface.d.ts +15 -0
- package/dist/commands/surface.d.ts.map +1 -0
- package/dist/commands/surface.js +112 -0
- package/dist/commands/surface.js.map +1 -0
- package/dist/commands/validate-ontology.d.ts +14 -0
- package/dist/commands/validate-ontology.d.ts.map +1 -0
- package/dist/commands/validate-ontology.js +328 -0
- package/dist/commands/validate-ontology.js.map +1 -0
- package/dist/commands/validate.d.ts.map +1 -1
- package/dist/commands/validate.js +44 -0
- package/dist/commands/validate.js.map +1 -1
- package/dist/config.d.ts +25 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +1 -0
- package/dist/config.js.map +1 -1
- package/dist/credentials.d.ts +22 -1
- package/dist/credentials.d.ts.map +1 -1
- package/dist/credentials.js +35 -1
- package/dist/credentials.js.map +1 -1
- package/dist/http-client.d.ts +13 -4
- package/dist/http-client.d.ts.map +1 -1
- package/dist/http-client.js +3 -2
- package/dist/http-client.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -3
- package/dist/index.js.map +1 -1
- package/dist/types/scaffold-contract-types.d.ts +90 -0
- package/dist/types/scaffold-contract-types.d.ts.map +1 -0
- package/dist/types/scaffold-contract-types.js +22 -0
- package/dist/types/scaffold-contract-types.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,4CAA8B;AAC9B,4CAA8B;AAC9B,gDAAkC;AAClC,mCAA6D;AAE7D,oCAA+B;AAC/B,6CAAiD;AAEjD,MAAM,WAAW,GAAe;IAC9B,UAAU,EAAE,UAAU;IACtB,MAAM,EAAE,MAAM;IACd,MAAM,EAAE,KAAK;IACb,GAAG,EAAE,KAAK;CACX,CAAC;AAEF,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;AAClC,MAAM,QAAQ,GAAa,EAAE,CAAC;AAE9B,IAAA,kBAAS,EAAC,GAAG,EAAE;IACb,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAC3B,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC;QAC3B,IAAI,GAAG,EAAE,CAAC;YACR,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IACD,WAAE,CAAC,eAAe,EAAE,CAAC;AACvB,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,IAAA,WAAE,EAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QAC1E,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;QAC7B,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAEnB,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1E,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/D,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAChF,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7D,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEzD,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC;YAC9D,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE,OAAO;YAChB,OAAO,EAAE;gBACP,IAAI,EAAE,YAAY;gBAClB,WAAW,EAAE,yBAAyB;aACvC;SACF,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAEb,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE;;;;;;;;CAQjD,CAAC,CAAC;QAEC,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE;;;;;;;;CAQjD,CAAC,CAAC;QAEC,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE;;CAEpD,CAAC,CAAC;QAEC,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE;;;;CAIjD,CAAC,CAAC;QAEC,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,cAAc,CAAC,EAAE;;;;;;;;;CAS3D,CAAC,CAAC;QAEC,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,UAAU,CAAC,EAAE;;;;;;;;;;;CAWvD,CAAC,CAAC;QAEC,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,WAAW,CAAC,EAAE;;;;CAIxD,CAAC,CAAC;QAEC,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,aAAa,CAAC,EAAE;;;CAG1D,CAAC,CAAC;QAEC,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,UAAU,CAAC,EAAE,8BAA8B,CAAC,CAAC;QACpF,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,wBAAwB,CAAC,CAAC;QAC7F,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,YAAY,CAAC,EAAE,+BAA+B,CAAC,CAAC;QAC7F,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,kBAAkB,CAAC,CAAC;QAC/F,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,eAAe,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC;YAC1E,WAAW,EAAE;gBACX,KAAK,EAAE,CAAC,gBAAgB,CAAC;aAC1B;SACF,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAEb,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,CAAC,IAAA,oBAAY,EAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC;QAEpF,IAAA,eAAM,EAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzB,IAAA,eAAM,EAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrC,IAAA,eAAM,EAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;QACtD,IAAA,eAAM,EAAC,YAAY,CAAC,MAAM,EAAE,cAAc,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7D,IAAA,eAAM,EAAC,YAAY,CAAC,MAAM,EAAE,cAAc,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7D,IAAA,eAAM,EAAC,YAAY,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC3D,IAAA,eAAM,EAAC,MAAM,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,eAAM,CAAC,gBAAgB,CAAC,yBAAyB,CAAC,CAAC,CAAC;IACxG,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,kFAAkF,EAAE,KAAK,IAAI,EAAE;QAChG,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;QAC7B,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAEnB,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE1E,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC;YAC9D,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE,OAAO;YAChB,OAAO,EAAE;gBACP,IAAI,EAAE,aAAa;aACpB;SACF,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAEb,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE;;;;;;;CAOjD,CAAC,CAAC;QAEC,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAE,yBAAyB,CAAC,CAAC;QAC7E,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,wBAAwB,CAAC,CAAC;QAE7F,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,CAAC,IAAA,WAAG,EAAC,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;QAEzF,IAAA,eAAM,EAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzB,IAAA,eAAM,EAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC9C,IAAA,eAAM,EAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,yBAAyB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3G,IAAA,eAAM,EAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/F,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;QACrF,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;QAC7B,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAEnB,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEzD,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC;YAC9D,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE,OAAO;YAChB,OAAO,EAAE;gBACP,IAAI,EAAE,aAAa;aACpB;SACF,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAEb,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE;;;;;CAKjD,CAAC,CAAC;QACC,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,gDAAgD,CAAC,CAAC;QAChG,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE,2BAA2B,CAAC,CAAC;QAC9E,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,gCAAgC,CAAC,CAAC;QAChF,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAE,8BAA8B,CAAC,CAAC;QAElF,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;QACnE,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;QAEjE,KAAK,MAAM,IAAI,IAAI,CAAC,WAAW,EAAE,cAAc,EAAE,WAAW,CAAC,EAAE,CAAC;YAC9D,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACxD,CAAC;QACD,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAEjE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,CAAC,IAAA,oBAAY,EAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC;QAE1E,IAAA,eAAM,EAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxD,IAAA,eAAM,EAAC,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QACvE,IAAA,eAAM,EAAC,YAAY,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,KAAK,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;QACxE,IAAA,eAAM,EAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,gDAAgD,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpI,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,SAAS,cAAc;IACrB,MAAM,GAAG,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,qBAAqB,CAAC,CAAC,CAAC;IAC1E,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnB,OAAO,GAAG,CAAC;AACb,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,UAAiC;IAC1D,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,WAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,CAAC,OAAiB,EAAE,EAAE;QAChE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,MAAM,UAAU,EAAE,CAAC;IACpC,OAAO;QACL,QAAQ;QACR,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;KAC5B,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,MAA4D,EAAE,EAAU;IAC5F,OAAO,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AAClE,CAAC"}
|
|
@@ -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;
|
|
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
|
-
|
|
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
|
-
|
|
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-
|
|
266
|
+
// Non-retained H2 section = bloat
|
|
264
267
|
bloatLines.push(line);
|
|
265
268
|
continue;
|
|
266
269
|
}
|