@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.
- package/dist/__tests__/classify.test.d.ts +2 -0
- package/dist/__tests__/classify.test.d.ts.map +1 -0
- package/dist/__tests__/classify.test.js +41 -0
- package/dist/__tests__/classify.test.js.map +1 -0
- package/dist/bin.d.ts +6 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +22 -0
- package/dist/bin.js.map +1 -0
- package/dist/commands/audit.d.ts +9 -0
- package/dist/commands/audit.d.ts.map +1 -0
- package/dist/commands/audit.js +192 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/classify.d.ts +9 -0
- package/dist/commands/classify.d.ts.map +1 -0
- package/dist/commands/classify.js +45 -0
- package/dist/commands/classify.js.map +1 -0
- package/dist/commands/doctor.d.ts +8 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +130 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/drift.d.ts +9 -0
- package/dist/commands/drift.d.ts.map +1 -0
- package/dist/commands/drift.js +178 -0
- package/dist/commands/drift.js.map +1 -0
- package/dist/commands/init.d.ts +15 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +141 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/setup.d.ts +8 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +140 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/validate.d.ts +9 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +170 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/config.d.ts +60 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +145 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +99 -0
- package/dist/index.js.map +1 -0
- 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":"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"}
|
|
@@ -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":"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"}
|
|
@@ -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"}
|