@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.
@@ -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
+ }