@musubix/policy 3.0.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/dist/index.d.ts +143 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +424 -0
- package/dist/index.js.map +1 -0
- package/package.json +47 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @musubix/policy - Executable Policy Engine
|
|
3
|
+
*
|
|
4
|
+
* TypeScript-based policy validation for MUSUBIX v3.0
|
|
5
|
+
*
|
|
6
|
+
* @packageDocumentation
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Policy category
|
|
10
|
+
*/
|
|
11
|
+
export type PolicyCategory = 'constitution' | 'naming' | 'security' | 'quality' | 'custom';
|
|
12
|
+
/**
|
|
13
|
+
* Severity level
|
|
14
|
+
*/
|
|
15
|
+
export type Severity = 'error' | 'warning' | 'info';
|
|
16
|
+
/**
|
|
17
|
+
* Source location
|
|
18
|
+
*/
|
|
19
|
+
export interface Location {
|
|
20
|
+
file?: string;
|
|
21
|
+
line?: number;
|
|
22
|
+
column?: number;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Policy violation
|
|
26
|
+
*/
|
|
27
|
+
export interface Violation {
|
|
28
|
+
policyId: string;
|
|
29
|
+
message: string;
|
|
30
|
+
location?: Location;
|
|
31
|
+
severity: Severity;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Policy validation result
|
|
35
|
+
*/
|
|
36
|
+
export interface PolicyResult {
|
|
37
|
+
passed: boolean;
|
|
38
|
+
violations: Violation[];
|
|
39
|
+
suggestions?: string[];
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Fix result
|
|
43
|
+
*/
|
|
44
|
+
export interface FixResult {
|
|
45
|
+
fixed: boolean;
|
|
46
|
+
changes: Array<{
|
|
47
|
+
file: string;
|
|
48
|
+
before: string;
|
|
49
|
+
after: string;
|
|
50
|
+
}>;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Validation context
|
|
54
|
+
*/
|
|
55
|
+
export interface ValidationContext {
|
|
56
|
+
filePath?: string;
|
|
57
|
+
content?: string;
|
|
58
|
+
projectPath?: string;
|
|
59
|
+
config?: PolicyConfig;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Policy configuration
|
|
63
|
+
*/
|
|
64
|
+
export interface PolicyConfig {
|
|
65
|
+
enabled?: string[];
|
|
66
|
+
disabled?: string[];
|
|
67
|
+
severity?: Record<string, Severity>;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Policy definition
|
|
71
|
+
*/
|
|
72
|
+
export interface Policy {
|
|
73
|
+
/** Unique identifier */
|
|
74
|
+
id: string;
|
|
75
|
+
/** Display name */
|
|
76
|
+
name: string;
|
|
77
|
+
/** Description */
|
|
78
|
+
description: string;
|
|
79
|
+
/** Severity level */
|
|
80
|
+
severity: Severity;
|
|
81
|
+
/** Category */
|
|
82
|
+
category: PolicyCategory;
|
|
83
|
+
/** Validation function */
|
|
84
|
+
validate(context: ValidationContext): Promise<PolicyResult>;
|
|
85
|
+
/** Auto-fix function (optional) */
|
|
86
|
+
fix?(context: ValidationContext): Promise<FixResult>;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Validation report
|
|
90
|
+
*/
|
|
91
|
+
export interface ValidationReport {
|
|
92
|
+
passed: boolean;
|
|
93
|
+
totalPolicies: number;
|
|
94
|
+
passedPolicies: number;
|
|
95
|
+
failedPolicies: number;
|
|
96
|
+
violations: Violation[];
|
|
97
|
+
timestamp: string;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Policy engine options
|
|
101
|
+
*/
|
|
102
|
+
export interface PolicyEngineOptions {
|
|
103
|
+
config?: PolicyConfig;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Policy engine interface
|
|
107
|
+
*/
|
|
108
|
+
export interface IPolicyEngine {
|
|
109
|
+
registerPolicy(policy: Policy): void;
|
|
110
|
+
loadPolicies(dir: string): Promise<void>;
|
|
111
|
+
getPolicy(id: string): Policy | undefined;
|
|
112
|
+
listPolicies(category?: PolicyCategory): Policy[];
|
|
113
|
+
validate(context: ValidationContext, policyIds?: string[]): Promise<ValidationReport>;
|
|
114
|
+
validateFile(filePath: string, policyIds?: string[]): Promise<ValidationReport>;
|
|
115
|
+
validateProject(projectPath: string, policyIds?: string[]): Promise<ValidationReport>;
|
|
116
|
+
fix(context: ValidationContext, policyIds?: string[]): Promise<FixResult[]>;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Create a new policy engine
|
|
120
|
+
*/
|
|
121
|
+
export declare function createPolicyEngine(options?: PolicyEngineOptions): IPolicyEngine;
|
|
122
|
+
/**
|
|
123
|
+
* Policy engine implementation
|
|
124
|
+
*/
|
|
125
|
+
export declare class PolicyEngine implements IPolicyEngine {
|
|
126
|
+
private policies;
|
|
127
|
+
private config;
|
|
128
|
+
constructor(options?: PolicyEngineOptions);
|
|
129
|
+
private registerBuiltinPolicies;
|
|
130
|
+
registerPolicy(policy: Policy): void;
|
|
131
|
+
loadPolicies(dir: string): Promise<void>;
|
|
132
|
+
getPolicy(id: string): Policy | undefined;
|
|
133
|
+
listPolicies(category?: PolicyCategory): Policy[];
|
|
134
|
+
validate(context: ValidationContext, policyIds?: string[]): Promise<ValidationReport>;
|
|
135
|
+
validateFile(filePath: string, policyIds?: string[]): Promise<ValidationReport>;
|
|
136
|
+
validateProject(projectPath: string, policyIds?: string[]): Promise<ValidationReport>;
|
|
137
|
+
fix(context: ValidationContext, policyIds?: string[]): Promise<FixResult[]>;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Constitution policies implementing the 9 Articles
|
|
141
|
+
*/
|
|
142
|
+
export declare const constitutionPolicies: Policy[];
|
|
143
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,424 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @musubix/policy - Executable Policy Engine
|
|
3
|
+
*
|
|
4
|
+
* TypeScript-based policy validation for MUSUBIX v3.0
|
|
5
|
+
*
|
|
6
|
+
* @packageDocumentation
|
|
7
|
+
*/
|
|
8
|
+
// ============================================================
|
|
9
|
+
// Factory Function
|
|
10
|
+
// ============================================================
|
|
11
|
+
/**
|
|
12
|
+
* Create a new policy engine
|
|
13
|
+
*/
|
|
14
|
+
export function createPolicyEngine(options) {
|
|
15
|
+
return new PolicyEngine(options);
|
|
16
|
+
}
|
|
17
|
+
// ============================================================
|
|
18
|
+
// Implementation
|
|
19
|
+
// ============================================================
|
|
20
|
+
import * as fs from 'node:fs/promises';
|
|
21
|
+
import * as path from 'node:path';
|
|
22
|
+
/**
|
|
23
|
+
* Policy engine implementation
|
|
24
|
+
*/
|
|
25
|
+
export class PolicyEngine {
|
|
26
|
+
policies = new Map();
|
|
27
|
+
config;
|
|
28
|
+
constructor(options) {
|
|
29
|
+
this.config = options?.config ?? {};
|
|
30
|
+
// Register built-in constitution policies
|
|
31
|
+
this.registerBuiltinPolicies();
|
|
32
|
+
}
|
|
33
|
+
registerBuiltinPolicies() {
|
|
34
|
+
for (const policy of constitutionPolicies) {
|
|
35
|
+
this.registerPolicy(policy);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
registerPolicy(policy) {
|
|
39
|
+
this.policies.set(policy.id, policy);
|
|
40
|
+
}
|
|
41
|
+
async loadPolicies(dir) {
|
|
42
|
+
try {
|
|
43
|
+
const files = await fs.readdir(dir);
|
|
44
|
+
for (const file of files) {
|
|
45
|
+
if (file.endsWith('.ts') || file.endsWith('.js')) {
|
|
46
|
+
const filePath = path.join(dir, file);
|
|
47
|
+
try {
|
|
48
|
+
const module = await import(filePath);
|
|
49
|
+
if (Array.isArray(module.default)) {
|
|
50
|
+
for (const policy of module.default) {
|
|
51
|
+
this.registerPolicy(policy);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
else if (module.policies && Array.isArray(module.policies)) {
|
|
55
|
+
for (const policy of module.policies) {
|
|
56
|
+
this.registerPolicy(policy);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
// Skip files that can't be imported
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
// Directory doesn't exist, skip
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
getPolicy(id) {
|
|
71
|
+
return this.policies.get(id);
|
|
72
|
+
}
|
|
73
|
+
listPolicies(category) {
|
|
74
|
+
const policies = Array.from(this.policies.values());
|
|
75
|
+
if (category) {
|
|
76
|
+
return policies.filter(p => p.category === category);
|
|
77
|
+
}
|
|
78
|
+
return policies;
|
|
79
|
+
}
|
|
80
|
+
async validate(context, policyIds) {
|
|
81
|
+
const policiesToRun = policyIds
|
|
82
|
+
? policyIds.map(id => this.policies.get(id)).filter((p) => p !== undefined)
|
|
83
|
+
: Array.from(this.policies.values());
|
|
84
|
+
const violations = [];
|
|
85
|
+
let passedCount = 0;
|
|
86
|
+
for (const policy of policiesToRun) {
|
|
87
|
+
// Check if disabled
|
|
88
|
+
if (this.config.disabled?.includes(policy.id))
|
|
89
|
+
continue;
|
|
90
|
+
if (this.config.enabled && !this.config.enabled.includes(policy.id))
|
|
91
|
+
continue;
|
|
92
|
+
const result = await policy.validate(context);
|
|
93
|
+
if (result.passed) {
|
|
94
|
+
passedCount++;
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
violations.push(...result.violations);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return {
|
|
101
|
+
passed: violations.length === 0,
|
|
102
|
+
totalPolicies: policiesToRun.length,
|
|
103
|
+
passedPolicies: passedCount,
|
|
104
|
+
failedPolicies: policiesToRun.length - passedCount,
|
|
105
|
+
violations,
|
|
106
|
+
timestamp: new Date().toISOString(),
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
async validateFile(filePath, policyIds) {
|
|
110
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
111
|
+
return this.validate({ filePath, content }, policyIds);
|
|
112
|
+
}
|
|
113
|
+
async validateProject(projectPath, policyIds) {
|
|
114
|
+
return this.validate({ projectPath }, policyIds);
|
|
115
|
+
}
|
|
116
|
+
async fix(context, policyIds) {
|
|
117
|
+
const policiesToRun = policyIds
|
|
118
|
+
? policyIds.map(id => this.policies.get(id)).filter((p) => p !== undefined)
|
|
119
|
+
: Array.from(this.policies.values());
|
|
120
|
+
const results = [];
|
|
121
|
+
for (const policy of policiesToRun) {
|
|
122
|
+
if (policy.fix) {
|
|
123
|
+
const result = await policy.fix(context);
|
|
124
|
+
results.push(result);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return results;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// ============================================================
|
|
131
|
+
// Built-in Constitution Policies (9 Articles)
|
|
132
|
+
// ============================================================
|
|
133
|
+
/**
|
|
134
|
+
* Constitution policies implementing the 9 Articles
|
|
135
|
+
*/
|
|
136
|
+
export const constitutionPolicies = [
|
|
137
|
+
{
|
|
138
|
+
id: 'CONST-001',
|
|
139
|
+
name: 'Library-First',
|
|
140
|
+
description: 'Article I: Features must start as independent libraries',
|
|
141
|
+
severity: 'error',
|
|
142
|
+
category: 'constitution',
|
|
143
|
+
async validate(ctx) {
|
|
144
|
+
// Check if packages/ directory exists and has proper structure
|
|
145
|
+
if (!ctx.projectPath) {
|
|
146
|
+
return { passed: true, violations: [] };
|
|
147
|
+
}
|
|
148
|
+
try {
|
|
149
|
+
const packagesDir = path.join(ctx.projectPath, 'packages');
|
|
150
|
+
await fs.access(packagesDir);
|
|
151
|
+
return { passed: true, violations: [] };
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
return {
|
|
155
|
+
passed: false,
|
|
156
|
+
violations: [{
|
|
157
|
+
policyId: 'CONST-001',
|
|
158
|
+
message: 'Project must have a packages/ directory for library-first architecture',
|
|
159
|
+
severity: 'error',
|
|
160
|
+
}],
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
},
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
id: 'CONST-002',
|
|
167
|
+
name: 'CLI Interface',
|
|
168
|
+
description: 'Article II: All libraries must expose CLI interface',
|
|
169
|
+
severity: 'error',
|
|
170
|
+
category: 'constitution',
|
|
171
|
+
async validate(ctx) {
|
|
172
|
+
// Check for bin/ directory or bin field in package.json
|
|
173
|
+
if (!ctx.projectPath) {
|
|
174
|
+
return { passed: true, violations: [] };
|
|
175
|
+
}
|
|
176
|
+
try {
|
|
177
|
+
const pkgPath = path.join(ctx.projectPath, 'package.json');
|
|
178
|
+
const pkg = JSON.parse(await fs.readFile(pkgPath, 'utf-8'));
|
|
179
|
+
if (pkg.bin) {
|
|
180
|
+
return { passed: true, violations: [] };
|
|
181
|
+
}
|
|
182
|
+
const binDir = path.join(ctx.projectPath, 'bin');
|
|
183
|
+
await fs.access(binDir);
|
|
184
|
+
return { passed: true, violations: [] };
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
187
|
+
return {
|
|
188
|
+
passed: false,
|
|
189
|
+
violations: [{
|
|
190
|
+
policyId: 'CONST-002',
|
|
191
|
+
message: 'Project must have CLI interface (bin/ directory or bin field in package.json)',
|
|
192
|
+
severity: 'error',
|
|
193
|
+
}],
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
},
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
id: 'CONST-003',
|
|
200
|
+
name: 'Test-First',
|
|
201
|
+
description: 'Article III: Red-Green-Blue test cycle required',
|
|
202
|
+
severity: 'error',
|
|
203
|
+
category: 'constitution',
|
|
204
|
+
async validate(ctx) {
|
|
205
|
+
// Check for test files
|
|
206
|
+
if (!ctx.projectPath) {
|
|
207
|
+
return { passed: true, violations: [] };
|
|
208
|
+
}
|
|
209
|
+
// Simple check: look for __tests__ or *.test.ts files
|
|
210
|
+
const hasTests = async (dir) => {
|
|
211
|
+
try {
|
|
212
|
+
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
213
|
+
for (const entry of entries) {
|
|
214
|
+
if (entry.name === '__tests__' || entry.name.includes('.test.')) {
|
|
215
|
+
return true;
|
|
216
|
+
}
|
|
217
|
+
if (entry.isDirectory() && !entry.name.startsWith('.') && entry.name !== 'node_modules') {
|
|
218
|
+
if (await hasTests(path.join(dir, entry.name))) {
|
|
219
|
+
return true;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
catch {
|
|
225
|
+
// Ignore errors
|
|
226
|
+
}
|
|
227
|
+
return false;
|
|
228
|
+
};
|
|
229
|
+
if (await hasTests(ctx.projectPath)) {
|
|
230
|
+
return { passed: true, violations: [] };
|
|
231
|
+
}
|
|
232
|
+
return {
|
|
233
|
+
passed: false,
|
|
234
|
+
violations: [{
|
|
235
|
+
policyId: 'CONST-003',
|
|
236
|
+
message: 'Project must have test files (__tests__/ or *.test.ts)',
|
|
237
|
+
severity: 'error',
|
|
238
|
+
}],
|
|
239
|
+
};
|
|
240
|
+
},
|
|
241
|
+
},
|
|
242
|
+
{
|
|
243
|
+
id: 'CONST-004',
|
|
244
|
+
name: 'EARS Format',
|
|
245
|
+
description: 'Article IV: Requirements must use EARS format',
|
|
246
|
+
severity: 'error',
|
|
247
|
+
category: 'constitution',
|
|
248
|
+
async validate(ctx) {
|
|
249
|
+
// Check if requirements files use EARS patterns
|
|
250
|
+
if (ctx.content && ctx.filePath?.includes('REQ-')) {
|
|
251
|
+
const earsPatterns = [
|
|
252
|
+
/THE\s+\w+\s+SHALL/i,
|
|
253
|
+
/WHEN\s+.+,\s+THE\s+\w+\s+SHALL/i,
|
|
254
|
+
/WHILE\s+.+,\s+THE\s+\w+\s+SHALL/i,
|
|
255
|
+
/IF\s+.+,\s+THEN\s+THE\s+\w+\s+SHALL/i,
|
|
256
|
+
];
|
|
257
|
+
const hasEars = earsPatterns.some(pattern => pattern.test(ctx.content));
|
|
258
|
+
if (hasEars) {
|
|
259
|
+
return { passed: true, violations: [] };
|
|
260
|
+
}
|
|
261
|
+
return {
|
|
262
|
+
passed: false,
|
|
263
|
+
violations: [{
|
|
264
|
+
policyId: 'CONST-004',
|
|
265
|
+
message: 'Requirements file must use EARS format (THE system SHALL...)',
|
|
266
|
+
severity: 'error',
|
|
267
|
+
location: { file: ctx.filePath },
|
|
268
|
+
}],
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
return { passed: true, violations: [] };
|
|
272
|
+
},
|
|
273
|
+
},
|
|
274
|
+
{
|
|
275
|
+
id: 'CONST-005',
|
|
276
|
+
name: 'Traceability',
|
|
277
|
+
description: 'Article V: 100% traceability from requirements to code',
|
|
278
|
+
severity: 'error',
|
|
279
|
+
category: 'constitution',
|
|
280
|
+
async validate(ctx) {
|
|
281
|
+
// Check for traceability matrix
|
|
282
|
+
if (!ctx.projectPath) {
|
|
283
|
+
return { passed: true, violations: [] };
|
|
284
|
+
}
|
|
285
|
+
try {
|
|
286
|
+
const traceDir = path.join(ctx.projectPath, 'storage', 'traceability');
|
|
287
|
+
await fs.access(traceDir);
|
|
288
|
+
return { passed: true, violations: [] };
|
|
289
|
+
}
|
|
290
|
+
catch {
|
|
291
|
+
return {
|
|
292
|
+
passed: false,
|
|
293
|
+
violations: [{
|
|
294
|
+
policyId: 'CONST-005',
|
|
295
|
+
message: 'Project must have storage/traceability/ directory for traceability tracking',
|
|
296
|
+
severity: 'error',
|
|
297
|
+
}],
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
},
|
|
301
|
+
},
|
|
302
|
+
{
|
|
303
|
+
id: 'CONST-006',
|
|
304
|
+
name: 'Project Memory',
|
|
305
|
+
description: 'Article VI: Reference steering/ before decisions',
|
|
306
|
+
severity: 'warning',
|
|
307
|
+
category: 'constitution',
|
|
308
|
+
async validate(ctx) {
|
|
309
|
+
// Check for steering/ directory
|
|
310
|
+
if (!ctx.projectPath) {
|
|
311
|
+
return { passed: true, violations: [] };
|
|
312
|
+
}
|
|
313
|
+
try {
|
|
314
|
+
const steeringDir = path.join(ctx.projectPath, 'steering');
|
|
315
|
+
await fs.access(steeringDir);
|
|
316
|
+
return { passed: true, violations: [] };
|
|
317
|
+
}
|
|
318
|
+
catch {
|
|
319
|
+
return {
|
|
320
|
+
passed: false,
|
|
321
|
+
violations: [{
|
|
322
|
+
policyId: 'CONST-006',
|
|
323
|
+
message: 'Project must have steering/ directory for project memory',
|
|
324
|
+
severity: 'warning',
|
|
325
|
+
}],
|
|
326
|
+
};
|
|
327
|
+
}
|
|
328
|
+
},
|
|
329
|
+
},
|
|
330
|
+
{
|
|
331
|
+
id: 'CONST-007',
|
|
332
|
+
name: 'Design Patterns',
|
|
333
|
+
description: 'Article VII: Document applied design patterns',
|
|
334
|
+
severity: 'warning',
|
|
335
|
+
category: 'constitution',
|
|
336
|
+
async validate(ctx) {
|
|
337
|
+
// Check for design documentation
|
|
338
|
+
if (!ctx.projectPath) {
|
|
339
|
+
return { passed: true, violations: [] };
|
|
340
|
+
}
|
|
341
|
+
try {
|
|
342
|
+
const designDir = path.join(ctx.projectPath, 'storage', 'design');
|
|
343
|
+
await fs.access(designDir);
|
|
344
|
+
return { passed: true, violations: [] };
|
|
345
|
+
}
|
|
346
|
+
catch {
|
|
347
|
+
return {
|
|
348
|
+
passed: false,
|
|
349
|
+
violations: [{
|
|
350
|
+
policyId: 'CONST-007',
|
|
351
|
+
message: 'Project should have storage/design/ directory for design documentation',
|
|
352
|
+
severity: 'warning',
|
|
353
|
+
}],
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
},
|
|
357
|
+
},
|
|
358
|
+
{
|
|
359
|
+
id: 'CONST-008',
|
|
360
|
+
name: 'Decision Records',
|
|
361
|
+
description: 'Article VIII: Record all decisions as ADRs',
|
|
362
|
+
severity: 'warning',
|
|
363
|
+
category: 'constitution',
|
|
364
|
+
async validate(ctx) {
|
|
365
|
+
// Check for ADR directory
|
|
366
|
+
if (!ctx.projectPath) {
|
|
367
|
+
return { passed: true, violations: [] };
|
|
368
|
+
}
|
|
369
|
+
try {
|
|
370
|
+
const adrDir = path.join(ctx.projectPath, 'docs', 'decisions');
|
|
371
|
+
await fs.access(adrDir);
|
|
372
|
+
return { passed: true, violations: [] };
|
|
373
|
+
}
|
|
374
|
+
catch {
|
|
375
|
+
return {
|
|
376
|
+
passed: false,
|
|
377
|
+
violations: [{
|
|
378
|
+
policyId: 'CONST-008',
|
|
379
|
+
message: 'Project should have docs/decisions/ directory for ADRs',
|
|
380
|
+
severity: 'warning',
|
|
381
|
+
}],
|
|
382
|
+
};
|
|
383
|
+
}
|
|
384
|
+
},
|
|
385
|
+
},
|
|
386
|
+
{
|
|
387
|
+
id: 'CONST-009',
|
|
388
|
+
name: 'Quality Gates',
|
|
389
|
+
description: 'Article IX: Verify quality before phase transitions',
|
|
390
|
+
severity: 'error',
|
|
391
|
+
category: 'constitution',
|
|
392
|
+
async validate(ctx) {
|
|
393
|
+
// Check for quality gate configuration or CI
|
|
394
|
+
if (!ctx.projectPath) {
|
|
395
|
+
return { passed: true, violations: [] };
|
|
396
|
+
}
|
|
397
|
+
try {
|
|
398
|
+
// Check for CI configuration
|
|
399
|
+
const ciPath = path.join(ctx.projectPath, '.github', 'workflows');
|
|
400
|
+
await fs.access(ciPath);
|
|
401
|
+
return { passed: true, violations: [] };
|
|
402
|
+
}
|
|
403
|
+
catch {
|
|
404
|
+
// Also accept vitest config as quality gate
|
|
405
|
+
try {
|
|
406
|
+
const vitestConfig = path.join(ctx.projectPath, 'vitest.config.ts');
|
|
407
|
+
await fs.access(vitestConfig);
|
|
408
|
+
return { passed: true, violations: [] };
|
|
409
|
+
}
|
|
410
|
+
catch {
|
|
411
|
+
return {
|
|
412
|
+
passed: false,
|
|
413
|
+
violations: [{
|
|
414
|
+
policyId: 'CONST-009',
|
|
415
|
+
message: 'Project must have quality gates (.github/workflows/ or vitest.config.ts)',
|
|
416
|
+
severity: 'error',
|
|
417
|
+
}],
|
|
418
|
+
};
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
},
|
|
422
|
+
},
|
|
423
|
+
];
|
|
424
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@musubix/policy",
|
|
3
|
+
"version": "3.0.0",
|
|
4
|
+
"description": "Executable Policy Engine for MUSUBIX - TypeScript-based policy validation",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"import": "./dist/index.js",
|
|
11
|
+
"types": "./dist/index.d.ts"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist"
|
|
16
|
+
],
|
|
17
|
+
"scripts": {
|
|
18
|
+
"build": "tsc",
|
|
19
|
+
"test": "vitest run",
|
|
20
|
+
"test:watch": "vitest",
|
|
21
|
+
"clean": "rm -rf dist",
|
|
22
|
+
"typecheck": "tsc --noEmit"
|
|
23
|
+
},
|
|
24
|
+
"keywords": [
|
|
25
|
+
"musubix",
|
|
26
|
+
"policy-engine",
|
|
27
|
+
"validation",
|
|
28
|
+
"constitution"
|
|
29
|
+
],
|
|
30
|
+
"author": "nahisaho",
|
|
31
|
+
"license": "MIT",
|
|
32
|
+
"repository": {
|
|
33
|
+
"type": "git",
|
|
34
|
+
"url": "git+https://github.com/nahisaho/MUSUBIX.git",
|
|
35
|
+
"directory": "packages/policy"
|
|
36
|
+
},
|
|
37
|
+
"engines": {
|
|
38
|
+
"node": ">=20.0.0"
|
|
39
|
+
},
|
|
40
|
+
"dependencies": {
|
|
41
|
+
"@musubix/knowledge": "^3.0.0"
|
|
42
|
+
},
|
|
43
|
+
"devDependencies": {
|
|
44
|
+
"typescript": "^5.3.0",
|
|
45
|
+
"vitest": "^4.0.16"
|
|
46
|
+
}
|
|
47
|
+
}
|