@stackbilt/cli 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/__tests__/classify.test.d.ts +2 -0
  2. package/dist/__tests__/classify.test.d.ts.map +1 -0
  3. package/dist/__tests__/classify.test.js +41 -0
  4. package/dist/__tests__/classify.test.js.map +1 -0
  5. package/dist/bin.d.ts +6 -0
  6. package/dist/bin.d.ts.map +1 -0
  7. package/dist/bin.js +22 -0
  8. package/dist/bin.js.map +1 -0
  9. package/dist/commands/audit.d.ts +9 -0
  10. package/dist/commands/audit.d.ts.map +1 -0
  11. package/dist/commands/audit.js +192 -0
  12. package/dist/commands/audit.js.map +1 -0
  13. package/dist/commands/classify.d.ts +9 -0
  14. package/dist/commands/classify.d.ts.map +1 -0
  15. package/dist/commands/classify.js +45 -0
  16. package/dist/commands/classify.js.map +1 -0
  17. package/dist/commands/doctor.d.ts +8 -0
  18. package/dist/commands/doctor.d.ts.map +1 -0
  19. package/dist/commands/doctor.js +130 -0
  20. package/dist/commands/doctor.js.map +1 -0
  21. package/dist/commands/drift.d.ts +9 -0
  22. package/dist/commands/drift.d.ts.map +1 -0
  23. package/dist/commands/drift.js +178 -0
  24. package/dist/commands/drift.js.map +1 -0
  25. package/dist/commands/init.d.ts +15 -0
  26. package/dist/commands/init.d.ts.map +1 -0
  27. package/dist/commands/init.js +141 -0
  28. package/dist/commands/init.js.map +1 -0
  29. package/dist/commands/setup.d.ts +8 -0
  30. package/dist/commands/setup.d.ts.map +1 -0
  31. package/dist/commands/setup.js +140 -0
  32. package/dist/commands/setup.js.map +1 -0
  33. package/dist/commands/validate.d.ts +9 -0
  34. package/dist/commands/validate.d.ts.map +1 -0
  35. package/dist/commands/validate.js +170 -0
  36. package/dist/commands/validate.js.map +1 -0
  37. package/dist/config.d.ts +60 -0
  38. package/dist/config.d.ts.map +1 -0
  39. package/dist/config.js +145 -0
  40. package/dist/config.js.map +1 -0
  41. package/dist/index.d.ts +23 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +99 -0
  44. package/dist/index.js.map +1 -0
  45. package/package.json +48 -0
@@ -0,0 +1,178 @@
1
+ "use strict";
2
+ /**
3
+ * charter drift
4
+ *
5
+ * Scans files for governance drift - codebase patterns that violate
6
+ * the blessed stack defined in .charter/patterns/.
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.driftCommand = driftCommand;
43
+ const fs = __importStar(require("node:fs"));
44
+ const path = __importStar(require("node:path"));
45
+ const index_1 = require("../index");
46
+ const config_1 = require("../config");
47
+ const drift_1 = require("@stackbilt/drift");
48
+ async function driftCommand(options, args) {
49
+ const config = (0, config_1.loadConfig)(options.configPath);
50
+ if (!config.drift.enabled) {
51
+ console.log(' Drift scanning is disabled in config.');
52
+ return index_1.EXIT_CODE.SUCCESS;
53
+ }
54
+ const patterns = (0, config_1.loadPatterns)(options.configPath);
55
+ if (patterns.length === 0) {
56
+ if (options.format === 'json') {
57
+ console.log(JSON.stringify({ status: 'WARN', summary: 'No patterns defined.' }, null, 2));
58
+ }
59
+ else {
60
+ console.log(' No patterns defined in .charter/patterns/');
61
+ console.log(' Run: charter init to create example patterns.');
62
+ }
63
+ return options.ciMode ? index_1.EXIT_CODE.POLICY_VIOLATION : index_1.EXIT_CODE.SUCCESS;
64
+ }
65
+ const scanPath = getFlag(args, '--path') || '.';
66
+ const files = collectFiles(scanPath, config.drift.include, config.drift.exclude);
67
+ if (Object.keys(files).length === 0) {
68
+ if (options.format === 'json') {
69
+ console.log(JSON.stringify({ status: 'WARN', summary: 'No files matched the scan criteria.' }, null, 2));
70
+ }
71
+ else {
72
+ console.log(' No files matched the scan criteria.');
73
+ }
74
+ return options.ciMode ? index_1.EXIT_CODE.POLICY_VIOLATION : index_1.EXIT_CODE.SUCCESS;
75
+ }
76
+ const report = (0, drift_1.scanForDrift)(files, patterns);
77
+ if (options.format === 'json') {
78
+ console.log(JSON.stringify(report, null, 2));
79
+ }
80
+ else {
81
+ printReport(report, config.drift.minScore);
82
+ }
83
+ if (options.ciMode && report.score < config.drift.minScore) {
84
+ return index_1.EXIT_CODE.POLICY_VIOLATION;
85
+ }
86
+ return index_1.EXIT_CODE.SUCCESS;
87
+ }
88
+ function printReport(report, minScore) {
89
+ const icon = report.score >= minScore ? '[ok]' : '[fail]';
90
+ const pct = Math.round(report.score * 100);
91
+ console.log(`\n ${icon} Drift Score: ${pct}% (threshold: ${Math.round(minScore * 100)}%)`);
92
+ console.log(` Scanned: ${report.scannedFiles} files against ${report.scannedPatterns} patterns`);
93
+ if (report.violations.length > 0) {
94
+ console.log(`\n Violations (${report.violations.length}):`);
95
+ const grouped = new Map();
96
+ for (const v of report.violations) {
97
+ const existing = grouped.get(v.patternName) || [];
98
+ existing.push(v);
99
+ grouped.set(v.patternName, existing);
100
+ }
101
+ for (const [pattern, violations] of grouped) {
102
+ console.log(`\n Pattern: ${pattern}`);
103
+ for (const v of violations.slice(0, 5)) {
104
+ console.log(` ${v.file}:${v.line} - ${v.snippet}`);
105
+ }
106
+ if (violations.length > 5) {
107
+ console.log(` ... and ${violations.length - 5} more`);
108
+ }
109
+ }
110
+ }
111
+ else {
112
+ console.log(' No violations found.');
113
+ }
114
+ console.log('');
115
+ }
116
+ function collectFiles(rootPath, include, exclude) {
117
+ const files = {};
118
+ const extensions = extractExtensions(include);
119
+ const excludeDirs = extractDirNames(exclude);
120
+ function walk(dir, relativeTo) {
121
+ let entries;
122
+ try {
123
+ entries = fs.readdirSync(dir, { withFileTypes: true });
124
+ }
125
+ catch {
126
+ return;
127
+ }
128
+ for (const entry of entries) {
129
+ const fullPath = path.join(dir, entry.name);
130
+ const relPath = path.relative(relativeTo, fullPath);
131
+ if (entry.isDirectory()) {
132
+ if (!excludeDirs.includes(entry.name)) {
133
+ walk(fullPath, relativeTo);
134
+ }
135
+ }
136
+ else if (entry.isFile()) {
137
+ const ext = path.extname(entry.name);
138
+ if (extensions.length === 0 || extensions.includes(ext)) {
139
+ try {
140
+ const content = fs.readFileSync(fullPath, 'utf-8');
141
+ files[relPath] = content;
142
+ }
143
+ catch {
144
+ // Skip unreadable files.
145
+ }
146
+ }
147
+ }
148
+ }
149
+ }
150
+ walk(path.resolve(rootPath), path.resolve(rootPath));
151
+ return files;
152
+ }
153
+ function extractExtensions(patterns) {
154
+ const exts = [];
155
+ for (const p of patterns) {
156
+ const match = p.match(/\*\.(\w+)$/);
157
+ if (match)
158
+ exts.push(`.${match[1]}`);
159
+ }
160
+ return exts;
161
+ }
162
+ function extractDirNames(patterns) {
163
+ const dirs = [];
164
+ for (const p of patterns) {
165
+ const match = p.match(/^([^*]+)\//);
166
+ if (match)
167
+ dirs.push(match[1]);
168
+ }
169
+ return dirs;
170
+ }
171
+ function getFlag(args, flag) {
172
+ const idx = args.indexOf(flag);
173
+ if (idx !== -1 && idx + 1 < args.length) {
174
+ return args[idx + 1];
175
+ }
176
+ return undefined;
177
+ }
178
+ //# sourceMappingURL=drift.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drift.js","sourceRoot":"","sources":["../../src/commands/drift.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * charter init
3
+ *
4
+ * Scaffolds the .charter/ directory with default config and example patterns.
5
+ */
6
+ import type { CLIOptions } from '../index';
7
+ interface InitResult {
8
+ created: boolean;
9
+ configPath: string;
10
+ files: string[];
11
+ }
12
+ export declare function initCommand(options: CLIOptions, args?: string[]): Promise<number>;
13
+ export declare function initializeCharter(configDir: string, force: boolean): InitResult;
14
+ export {};
15
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AA2B3C,UAAU,UAAU;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CA4B3F;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,UAAU,CA4D/E"}
@@ -0,0 +1,141 @@
1
+ "use strict";
2
+ /**
3
+ * charter init
4
+ *
5
+ * Scaffolds the .charter/ directory with default config and example patterns.
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ Object.defineProperty(exports, "__esModule", { value: true });
41
+ exports.initCommand = initCommand;
42
+ exports.initializeCharter = initializeCharter;
43
+ const fs = __importStar(require("node:fs"));
44
+ const path = __importStar(require("node:path"));
45
+ const index_1 = require("../index");
46
+ const config_1 = require("../config");
47
+ const EXAMPLE_PATTERNS = [
48
+ {
49
+ name: 'Cloudflare Workers',
50
+ category: 'COMPUTE',
51
+ blessed_solution: 'Cloudflare Workers for serverless compute',
52
+ rationale: 'Edge-first architecture for global low-latency',
53
+ anti_patterns: 'Avoid express/fastify for new services - use Workers native fetch handler',
54
+ status: 'ACTIVE',
55
+ },
56
+ {
57
+ name: 'D1 Database',
58
+ category: 'DATA',
59
+ blessed_solution: 'Cloudflare D1 (SQLite at the edge)',
60
+ rationale: 'Co-located with Workers, zero network hop for reads',
61
+ anti_patterns: 'Avoid pg/mysql2/mongoose - use D1 bindings',
62
+ status: 'ACTIVE',
63
+ },
64
+ ];
65
+ const GITIGNORE_CONTENT = `# Charter local state
66
+ .cache/
67
+ `;
68
+ async function initCommand(options, args = []) {
69
+ const force = options.yes || args.includes('--force');
70
+ const result = initializeCharter(options.configPath, force);
71
+ if (options.format === 'json') {
72
+ console.log(JSON.stringify(result, null, 2));
73
+ return index_1.EXIT_CODE.SUCCESS;
74
+ }
75
+ if (!result.created) {
76
+ console.log(` .charter/ already exists at ${result.configPath}`);
77
+ console.log(' Use --config <path> for a different location, or --force to overwrite templates.');
78
+ return index_1.EXIT_CODE.SUCCESS;
79
+ }
80
+ console.log(` Initialized .charter/ at ${result.configPath}/`);
81
+ console.log('');
82
+ console.log(' Created:');
83
+ for (const file of result.files) {
84
+ console.log(` ${file}`);
85
+ }
86
+ console.log('');
87
+ console.log(' Next steps:');
88
+ console.log(' 1. Edit config.json with your project name and thresholds');
89
+ console.log(' 2. Define your blessed stack in patterns/*.json');
90
+ console.log(' 3. Run: charter validate');
91
+ return index_1.EXIT_CODE.SUCCESS;
92
+ }
93
+ function initializeCharter(configDir, force) {
94
+ const configFile = path.join(configDir, 'config.json');
95
+ const exists = fs.existsSync(configFile);
96
+ if (exists && !force) {
97
+ return {
98
+ created: false,
99
+ configPath: configDir,
100
+ files: [],
101
+ };
102
+ }
103
+ const dirs = [configDir, path.join(configDir, 'patterns'), path.join(configDir, 'policies')];
104
+ for (const dir of dirs) {
105
+ fs.mkdirSync(dir, { recursive: true });
106
+ }
107
+ fs.writeFileSync(configFile, (0, config_1.getDefaultConfigJSON)() + '\n');
108
+ fs.writeFileSync(path.join(configDir, 'patterns', 'blessed-stack.json'), JSON.stringify(EXAMPLE_PATTERNS, null, 2) + '\n');
109
+ fs.writeFileSync(path.join(configDir, 'policies', 'governance.md'), `# Governance Policy
110
+
111
+ ## Commit Trailers
112
+
113
+ High-risk commits (migrations, handlers, services) should include:
114
+
115
+ \`\`\`
116
+ Governed-By: <ADR-ID or ledger entry reference>
117
+ Resolves-Request: <governance request ID>
118
+ \`\`\`
119
+
120
+ ## Change Classification
121
+
122
+ Changes are classified as:
123
+ - **SURFACE**: Docs, comments, naming - no code logic
124
+ - **LOCAL**: Single service, contained impact
125
+ - **CROSS_CUTTING**: Multiple services, data model, API contracts
126
+
127
+ Cross-cutting changes require architectural review before merge.
128
+ `);
129
+ fs.writeFileSync(path.join(configDir, '.gitignore'), GITIGNORE_CONTENT);
130
+ return {
131
+ created: true,
132
+ configPath: configDir,
133
+ files: [
134
+ 'config.json',
135
+ 'patterns/blessed-stack.json',
136
+ 'policies/governance.md',
137
+ '.gitignore',
138
+ ],
139
+ };
140
+ }
141
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCH,kCA4BC;AAED,8CA4DC;AA7HD,4CAA8B;AAC9B,gDAAkC;AAElC,oCAAqC;AACrC,sCAAiD;AAEjD,MAAM,gBAAgB,GAAG;IACvB;QACE,IAAI,EAAE,oBAAoB;QAC1B,QAAQ,EAAE,SAAS;QACnB,gBAAgB,EAAE,2CAA2C;QAC7D,SAAS,EAAE,gDAAgD;QAC3D,aAAa,EAAE,2EAA2E;QAC1F,MAAM,EAAE,QAAQ;KACjB;IACD;QACE,IAAI,EAAE,aAAa;QACnB,QAAQ,EAAE,MAAM;QAChB,gBAAgB,EAAE,oCAAoC;QACtD,SAAS,EAAE,qDAAqD;QAChE,aAAa,EAAE,4CAA4C;QAC3D,MAAM,EAAE,QAAQ;KACjB;CACF,CAAC;AAEF,MAAM,iBAAiB,GAAG;;CAEzB,CAAC;AAQK,KAAK,UAAU,WAAW,CAAC,OAAmB,EAAE,OAAiB,EAAE;IACxE,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAE5D,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO,iBAAS,CAAC,OAAO,CAAC;IAC3B,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,iCAAiC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;QAClE,OAAO,CAAC,GAAG,CAAC,oFAAoF,CAAC,CAAC;QAClG,OAAO,iBAAS,CAAC,OAAO,CAAC;IAC3B,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,8BAA8B,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC1B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC7B,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;IAC7E,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;IAE5C,OAAO,iBAAS,CAAC,OAAO,CAAC;AAC3B,CAAC;AAED,SAAgB,iBAAiB,CAAC,SAAiB,EAAE,KAAc;IACjE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAEzC,IAAI,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACrB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,SAAS;YACrB,KAAK,EAAE,EAAE;SACV,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;IAC7F,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAA,6BAAoB,GAAE,GAAG,IAAI,CAAC,CAAC;IAE5D,EAAE,CAAC,aAAa,CACd,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,oBAAoB,CAAC,EACtD,IAAI,CAAC,SAAS,CAAC,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CACjD,CAAC;IAEF,EAAE,CAAC,aAAa,CACd,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,eAAe,CAAC,EACjD;;;;;;;;;;;;;;;;;;;CAmBH,CACE,CAAC;IAEF,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,iBAAiB,CAAC,CAAC;IAExE,OAAO;QACL,OAAO,EAAE,IAAI;QACb,UAAU,EAAE,SAAS;QACrB,KAAK,EAAE;YACL,aAAa;YACb,6BAA6B;YAC7B,wBAAwB;YACxB,YAAY;SACb;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * charter setup
3
+ *
4
+ * One-command bootstrap for local governance checks.
5
+ */
6
+ import type { CLIOptions } from '../index';
7
+ export declare function setupCommand(options: CLIOptions, args: string[]): Promise<number>;
8
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAqD3C,wBAAsB,YAAY,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA+CvF"}
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+ /**
3
+ * charter setup
4
+ *
5
+ * One-command bootstrap for local governance checks.
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ Object.defineProperty(exports, "__esModule", { value: true });
41
+ exports.setupCommand = setupCommand;
42
+ const fs = __importStar(require("node:fs"));
43
+ const path = __importStar(require("node:path"));
44
+ const index_1 = require("../index");
45
+ const index_2 = require("../index");
46
+ const init_1 = require("./init");
47
+ const GITHUB_WORKFLOW = `name: Governance Check
48
+
49
+ on:
50
+ pull_request:
51
+ branches: [main, master]
52
+
53
+ permissions:
54
+ contents: read
55
+ pull-requests: write
56
+
57
+ jobs:
58
+ governance:
59
+ name: Charter
60
+ runs-on: ubuntu-latest
61
+
62
+ steps:
63
+ - uses: actions/checkout@v4
64
+ with:
65
+ fetch-depth: 0
66
+
67
+ - uses: actions/setup-node@v4
68
+ with:
69
+ node-version: '20'
70
+
71
+ - name: Install Charter CLI
72
+ run: npm install -g @stackbilt/cli
73
+
74
+ - name: Validate Commits
75
+ run: charter validate --ci --format text
76
+
77
+ - name: Drift Scan
78
+ run: charter drift --ci --format text
79
+
80
+ - name: Audit Report
81
+ run: charter audit --format json > /tmp/audit.json
82
+ if: always()
83
+ `;
84
+ async function setupCommand(options, args) {
85
+ const ciMode = getFlag(args, '--ci');
86
+ if (ciMode && ciMode !== 'github') {
87
+ throw new index_1.CLIError(`Unsupported CI target: ${ciMode}. Supported: github`);
88
+ }
89
+ const initResult = (0, init_1.initializeCharter)(options.configPath, options.yes || args.includes('--force'));
90
+ const result = {
91
+ configPath: options.configPath,
92
+ initialized: initResult.created,
93
+ workflow: {
94
+ mode: ciMode === 'github' ? 'github' : 'none',
95
+ },
96
+ };
97
+ if (ciMode === 'github') {
98
+ const workflowPath = path.join('.github', 'workflows', 'charter-governance.yml');
99
+ const created = writeFileIfMissing(workflowPath, GITHUB_WORKFLOW, options.yes || args.includes('--force'));
100
+ result.workflow = {
101
+ mode: 'github',
102
+ path: workflowPath,
103
+ created,
104
+ };
105
+ }
106
+ if (options.format === 'json') {
107
+ console.log(JSON.stringify(result, null, 2));
108
+ return index_2.EXIT_CODE.SUCCESS;
109
+ }
110
+ console.log(' Charter setup complete.');
111
+ console.log(` Config path: ${result.configPath}`);
112
+ console.log(` .charter initialized: ${result.initialized ? 'yes' : 'already present'}`);
113
+ if (result.workflow.mode === 'github') {
114
+ console.log(` GitHub workflow: ${result.workflow.created ? 'created' : 'already present'} (${result.workflow.path})`);
115
+ }
116
+ console.log('');
117
+ console.log(' Next steps:');
118
+ console.log(' 1. Run: charter validate --format text');
119
+ console.log(' 2. Run: charter drift --format text');
120
+ console.log(' 3. Tune .charter/config.json and patterns/*.json');
121
+ return index_2.EXIT_CODE.SUCCESS;
122
+ }
123
+ function writeFileIfMissing(targetPath, content, force) {
124
+ const absolute = path.resolve(targetPath);
125
+ const exists = fs.existsSync(absolute);
126
+ if (exists && !force) {
127
+ return false;
128
+ }
129
+ fs.mkdirSync(path.dirname(absolute), { recursive: true });
130
+ fs.writeFileSync(absolute, content);
131
+ return true;
132
+ }
133
+ function getFlag(args, flag) {
134
+ const idx = args.indexOf(flag);
135
+ if (idx !== -1 && idx + 1 < args.length) {
136
+ return args[idx + 1];
137
+ }
138
+ return undefined;
139
+ }
140
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyDH,oCA+CC;AAtGD,4CAA8B;AAC9B,gDAAkC;AAElC,oCAAoC;AACpC,oCAAqC;AACrC,iCAA2C;AAE3C,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoCvB,CAAC;AAYK,KAAK,UAAU,YAAY,CAAC,OAAmB,EAAE,IAAc;IACpE,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAErC,IAAI,MAAM,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QAClC,MAAM,IAAI,gBAAQ,CAAC,0BAA0B,MAAM,qBAAqB,CAAC,CAAC;IAC5E,CAAC;IAED,MAAM,UAAU,GAAG,IAAA,wBAAiB,EAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IAClG,MAAM,MAAM,GAAgB;QAC1B,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,WAAW,EAAE,UAAU,CAAC,OAAO;QAC/B,QAAQ,EAAE;YACR,IAAI,EAAE,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM;SAC9C;KACF,CAAC;IAEF,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,wBAAwB,CAAC,CAAC;QACjF,MAAM,OAAO,GAAG,kBAAkB,CAAC,YAAY,EAAE,eAAe,EAAE,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;QAE3G,MAAM,CAAC,QAAQ,GAAG;YAChB,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,YAAY;YAClB,OAAO;SACR,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO,iBAAS,CAAC,OAAO,CAAC;IAC3B,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,kBAAkB,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,2BAA2B,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAEzF,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,sBAAsB,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,iBAAiB,KAAK,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC;IACzH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC7B,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;IAEpE,OAAO,iBAAS,CAAC,OAAO,CAAC;AAC3B,CAAC;AAED,SAAS,kBAAkB,CAAC,UAAkB,EAAE,OAAe,EAAE,KAAc;IAC7E,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAEvC,IAAI,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACrB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACpC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,OAAO,CAAC,IAAc,EAAE,IAAY;IAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACxC,OAAO,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * charter validate
3
+ *
4
+ * Validates recent git commits for governance trailers.
5
+ * Checks that high-risk commits reference ADRs or governance requests.
6
+ */
7
+ import type { CLIOptions } from '../index';
8
+ export declare function validateCommand(options: CLIOptions, args: string[]): Promise<number>;
9
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAgB3C,wBAAsB,eAAe,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA4B1F"}