@hongmaple0820/scale-engine 0.29.0 → 0.33.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/README.en.md +2 -0
- package/README.md +2 -0
- package/dist/api/cli.js +4 -0
- package/dist/api/cli.js.map +1 -1
- package/dist/evolution/SessionLearnings.d.ts +70 -0
- package/dist/evolution/SessionLearnings.js +217 -0
- package/dist/evolution/SessionLearnings.js.map +1 -0
- package/dist/runtime/AiOsRuntime.d.ts +99 -1
- package/dist/runtime/AiOsRuntime.js +462 -14
- package/dist/runtime/AiOsRuntime.js.map +1 -1
- package/dist/skills/RoleSkills.d.ts +20 -0
- package/dist/skills/RoleSkills.js +154 -0
- package/dist/skills/RoleSkills.js.map +1 -0
- package/dist/skills/SkillDiscovery.d.ts +5 -0
- package/dist/skills/SkillDiscovery.js +15 -0
- package/dist/skills/SkillDiscovery.js.map +1 -1
- package/dist/skills/SkillFrontmatter.d.ts +28 -0
- package/dist/skills/SkillFrontmatter.js +152 -0
- package/dist/skills/SkillFrontmatter.js.map +1 -0
- package/dist/skills/SkillRegistry.d.ts +11 -0
- package/dist/skills/SkillRegistry.js +12 -0
- package/dist/skills/SkillRegistry.js.map +1 -1
- package/dist/skills/index.d.ts +1 -0
- package/dist/skills/index.js +1 -0
- package/dist/skills/index.js.map +1 -1
- package/dist/testing/DiffTestSelector.d.ts +22 -0
- package/dist/testing/DiffTestSelector.js +114 -0
- package/dist/testing/DiffTestSelector.js.map +1 -0
- package/dist/testing/index.d.ts +1 -0
- package/dist/testing/index.js +3 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/workflow/AdaptiveWorkflowRouter.d.ts +37 -0
- package/dist/workflow/AdaptiveWorkflowRouter.js +211 -0
- package/dist/workflow/AdaptiveWorkflowRouter.js.map +1 -0
- package/dist/workflow/EvolutionShadowPromoter.d.ts +46 -0
- package/dist/workflow/EvolutionShadowPromoter.js +73 -0
- package/dist/workflow/EvolutionShadowPromoter.js.map +1 -0
- package/dist/workflow/ReviewAnalyzer.d.ts +15 -0
- package/dist/workflow/ReviewAnalyzer.js +82 -0
- package/dist/workflow/ReviewAnalyzer.js.map +1 -1
- package/dist/workflow/SecurityAudit.d.ts +27 -0
- package/dist/workflow/SecurityAudit.js +294 -0
- package/dist/workflow/SecurityAudit.js.map +1 -0
- package/dist/workflow/SessionPreamble.d.ts +19 -0
- package/dist/workflow/SessionPreamble.js +125 -0
- package/dist/workflow/SessionPreamble.js.map +1 -0
- package/dist/workflow/ShipPipeline.d.ts +30 -0
- package/dist/workflow/ShipPipeline.js +366 -0
- package/dist/workflow/ShipPipeline.js.map +1 -0
- package/dist/workflow/WorkflowGuidance.d.ts +5 -1
- package/dist/workflow/WorkflowGuidance.js +31 -0
- package/dist/workflow/WorkflowGuidance.js.map +1 -1
- package/dist/workflow/index.d.ts +5 -0
- package/dist/workflow/index.js +5 -0
- package/dist/workflow/index.js.map +1 -1
- package/docs/AI_ENGINEERING_OS_POSITIONING.md +9 -0
- package/docs/CONTEXT_BUDGET.md +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { SkillDomain, SkillDefinition } from './SkillRegistry.js';
|
|
2
|
+
export interface SkillFrontmatter {
|
|
3
|
+
name: string;
|
|
4
|
+
'preamble-tier'?: number;
|
|
5
|
+
description: string;
|
|
6
|
+
'allowed-tools'?: string[];
|
|
7
|
+
triggers?: string[];
|
|
8
|
+
domain?: SkillDomain;
|
|
9
|
+
priority?: number;
|
|
10
|
+
}
|
|
11
|
+
export interface FrontmatterParseResult {
|
|
12
|
+
frontmatter: SkillFrontmatter | null;
|
|
13
|
+
body: string;
|
|
14
|
+
errors: string[];
|
|
15
|
+
}
|
|
16
|
+
export interface FrontmatterValidationResult {
|
|
17
|
+
valid: boolean;
|
|
18
|
+
errors: string[];
|
|
19
|
+
}
|
|
20
|
+
export declare function parseSkillFrontmatter(content: string): FrontmatterParseResult;
|
|
21
|
+
export declare function validateFrontmatter(fm: SkillFrontmatter): FrontmatterValidationResult;
|
|
22
|
+
export declare function frontmatterToSkillDefinition(fm: SkillFrontmatter, filePath: string): SkillDefinition;
|
|
23
|
+
export interface ScannedSkill {
|
|
24
|
+
filePath: string;
|
|
25
|
+
frontmatter: SkillFrontmatter;
|
|
26
|
+
definition: SkillDefinition;
|
|
27
|
+
}
|
|
28
|
+
export declare function scanFrontmatterSkills(dir: string): ScannedSkill[];
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
// SCALE Engine — Skill Frontmatter Parser (v0.31.0)
|
|
2
|
+
// Standardized SKILL.md frontmatter format inspired by gstack.
|
|
3
|
+
// Enables declarative skill definitions alongside code-based registration.
|
|
4
|
+
import { existsSync, readdirSync, readFileSync } from 'node:fs';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import yaml from 'js-yaml';
|
|
7
|
+
// ============================================================================
|
|
8
|
+
// Parser
|
|
9
|
+
// ============================================================================
|
|
10
|
+
const FRONTMATTER_DELIMITER = '---';
|
|
11
|
+
export function parseSkillFrontmatter(content) {
|
|
12
|
+
const trimmed = content.trim();
|
|
13
|
+
if (!trimmed.startsWith(FRONTMATTER_DELIMITER)) {
|
|
14
|
+
return { frontmatter: null, body: trimmed, errors: ['Missing opening frontmatter delimiter (---)'] };
|
|
15
|
+
}
|
|
16
|
+
const afterFirst = trimmed.slice(FRONTMATTER_DELIMITER.length);
|
|
17
|
+
const endIndex = afterFirst.indexOf(`\n${FRONTMATTER_DELIMITER}`);
|
|
18
|
+
if (endIndex === -1) {
|
|
19
|
+
return { frontmatter: null, body: trimmed, errors: ['Missing closing frontmatter delimiter (---)'] };
|
|
20
|
+
}
|
|
21
|
+
const yamlContent = afterFirst.slice(0, endIndex).trim();
|
|
22
|
+
const body = afterFirst.slice(endIndex + FRONTMATTER_DELIMITER.length + 1).trim();
|
|
23
|
+
try {
|
|
24
|
+
const parsed = yaml.load(yamlContent);
|
|
25
|
+
if (!parsed || typeof parsed !== 'object') {
|
|
26
|
+
return { frontmatter: null, body, errors: ['Frontmatter is not a valid YAML object'] };
|
|
27
|
+
}
|
|
28
|
+
const fm = {
|
|
29
|
+
name: String(parsed.name ?? ''),
|
|
30
|
+
description: String(parsed.description ?? ''),
|
|
31
|
+
};
|
|
32
|
+
if (parsed['preamble-tier'] !== undefined) {
|
|
33
|
+
fm['preamble-tier'] = Number(parsed['preamble-tier']);
|
|
34
|
+
}
|
|
35
|
+
if (Array.isArray(parsed['allowed-tools'])) {
|
|
36
|
+
fm['allowed-tools'] = parsed['allowed-tools'].map(String);
|
|
37
|
+
}
|
|
38
|
+
if (Array.isArray(parsed.triggers)) {
|
|
39
|
+
fm.triggers = parsed.triggers.map(String);
|
|
40
|
+
}
|
|
41
|
+
if (typeof parsed.domain === 'string') {
|
|
42
|
+
fm.domain = parsed.domain;
|
|
43
|
+
}
|
|
44
|
+
if (typeof parsed.priority === 'number') {
|
|
45
|
+
fm.priority = parsed.priority;
|
|
46
|
+
}
|
|
47
|
+
const validation = validateFrontmatter(fm);
|
|
48
|
+
return { frontmatter: validation.valid ? fm : null, body, errors: validation.errors };
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
return { frontmatter: null, body, errors: [`YAML parse error: ${err instanceof Error ? err.message : String(err)}`] };
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// ============================================================================
|
|
55
|
+
// Validator
|
|
56
|
+
// ============================================================================
|
|
57
|
+
const VALID_DOMAINS = ['context', 'planning', 'execution', 'verification', 'evolution', 'deployment'];
|
|
58
|
+
export function validateFrontmatter(fm) {
|
|
59
|
+
const errors = [];
|
|
60
|
+
if (!fm.name || fm.name.trim().length === 0) {
|
|
61
|
+
errors.push('Missing required field: name');
|
|
62
|
+
}
|
|
63
|
+
if (!fm.description || fm.description.trim().length === 0) {
|
|
64
|
+
errors.push('Missing required field: description');
|
|
65
|
+
}
|
|
66
|
+
if (fm.domain && !VALID_DOMAINS.includes(fm.domain)) {
|
|
67
|
+
errors.push(`Invalid domain: ${fm.domain}. Must be one of: ${VALID_DOMAINS.join(', ')}`);
|
|
68
|
+
}
|
|
69
|
+
if (fm['preamble-tier'] !== undefined && (fm['preamble-tier'] < 1 || fm['preamble-tier'] > 10)) {
|
|
70
|
+
errors.push('preamble-tier must be between 1 and 10');
|
|
71
|
+
}
|
|
72
|
+
if (fm.priority !== undefined && (fm.priority < 0 || fm.priority > 100)) {
|
|
73
|
+
errors.push('priority must be between 0 and 100');
|
|
74
|
+
}
|
|
75
|
+
return { valid: errors.length === 0, errors };
|
|
76
|
+
}
|
|
77
|
+
// ============================================================================
|
|
78
|
+
// Converter: Frontmatter → SkillDefinition
|
|
79
|
+
// ============================================================================
|
|
80
|
+
const TRIGGER_TYPE_MAP = {
|
|
81
|
+
'taskType': 'taskType',
|
|
82
|
+
'phase': 'phase',
|
|
83
|
+
'keyword': 'keyword',
|
|
84
|
+
'manual': 'manual',
|
|
85
|
+
};
|
|
86
|
+
export function frontmatterToSkillDefinition(fm, filePath) {
|
|
87
|
+
const triggers = (fm.triggers ?? []).map(keyword => ({
|
|
88
|
+
type: 'keyword',
|
|
89
|
+
value: keyword,
|
|
90
|
+
weight: 1.0,
|
|
91
|
+
}));
|
|
92
|
+
const execution = {
|
|
93
|
+
type: 'skill-file',
|
|
94
|
+
config: {
|
|
95
|
+
skillPath: filePath,
|
|
96
|
+
parameters: {
|
|
97
|
+
'allowed-tools': fm['allowed-tools'] ?? [],
|
|
98
|
+
'preamble-tier': fm['preamble-tier'] ?? 1,
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
return {
|
|
103
|
+
id: fm.name,
|
|
104
|
+
name: fm.name,
|
|
105
|
+
description: fm.description,
|
|
106
|
+
domain: fm.domain ?? 'execution',
|
|
107
|
+
triggers,
|
|
108
|
+
execution,
|
|
109
|
+
priority: fm.priority ?? 50,
|
|
110
|
+
installed: true,
|
|
111
|
+
installedAt: Date.now(),
|
|
112
|
+
source: filePath,
|
|
113
|
+
frontmatter: fm,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
export function scanFrontmatterSkills(dir) {
|
|
117
|
+
if (!existsSync(dir))
|
|
118
|
+
return [];
|
|
119
|
+
const results = [];
|
|
120
|
+
const entries = readdirSync(dir, { withFileTypes: true });
|
|
121
|
+
for (const entry of entries) {
|
|
122
|
+
const fullPath = join(dir, entry.name);
|
|
123
|
+
if (entry.isFile() && entry.name.endsWith('.md')) {
|
|
124
|
+
const content = readFileSync(fullPath, 'utf-8');
|
|
125
|
+
const parsed = parseSkillFrontmatter(content);
|
|
126
|
+
if (parsed.frontmatter) {
|
|
127
|
+
results.push({
|
|
128
|
+
filePath: fullPath,
|
|
129
|
+
frontmatter: parsed.frontmatter,
|
|
130
|
+
definition: frontmatterToSkillDefinition(parsed.frontmatter, fullPath),
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
else if (entry.isDirectory()) {
|
|
135
|
+
// Check for SKILL.md in subdirectory
|
|
136
|
+
const skillFile = join(fullPath, 'SKILL.md');
|
|
137
|
+
if (existsSync(skillFile)) {
|
|
138
|
+
const content = readFileSync(skillFile, 'utf-8');
|
|
139
|
+
const parsed = parseSkillFrontmatter(content);
|
|
140
|
+
if (parsed.frontmatter) {
|
|
141
|
+
results.push({
|
|
142
|
+
filePath: skillFile,
|
|
143
|
+
frontmatter: parsed.frontmatter,
|
|
144
|
+
definition: frontmatterToSkillDefinition(parsed.frontmatter, skillFile),
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return results;
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=SkillFrontmatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SkillFrontmatter.js","sourceRoot":"","sources":["../../src/skills/SkillFrontmatter.ts"],"names":[],"mappings":"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"}
|
|
@@ -36,6 +36,16 @@ export interface SkillDefinition {
|
|
|
36
36
|
installed: boolean;
|
|
37
37
|
installedAt?: number;
|
|
38
38
|
source?: string;
|
|
39
|
+
frontmatter?: SkillFrontmatterMeta;
|
|
40
|
+
}
|
|
41
|
+
export interface SkillFrontmatterMeta {
|
|
42
|
+
name: string;
|
|
43
|
+
'preamble-tier'?: number;
|
|
44
|
+
description: string;
|
|
45
|
+
'allowed-tools'?: string[];
|
|
46
|
+
triggers?: string[];
|
|
47
|
+
domain?: SkillDomain;
|
|
48
|
+
priority?: number;
|
|
39
49
|
}
|
|
40
50
|
export interface SkillRecommendation {
|
|
41
51
|
skillId: string;
|
|
@@ -90,4 +100,5 @@ export declare class SkillRegistry implements ISkillRegistry {
|
|
|
90
100
|
private generateReason;
|
|
91
101
|
registerBatch(skills: SkillDefinition[]): void;
|
|
92
102
|
clear(): void;
|
|
103
|
+
loadFromFrontmatter(dir: string): Promise<number>;
|
|
93
104
|
}
|
|
@@ -125,5 +125,17 @@ export class SkillRegistry {
|
|
|
125
125
|
registerBatch(skills) { for (const skill of skills)
|
|
126
126
|
this.register(skill); }
|
|
127
127
|
clear() { this.skills.clear(); this.eventBus.emit('skills.cleared', { clearedAt: Date.now() }); }
|
|
128
|
+
async loadFromFrontmatter(dir) {
|
|
129
|
+
const { scanFrontmatterSkills } = await import('./SkillFrontmatter.js');
|
|
130
|
+
const scanned = scanFrontmatterSkills(dir);
|
|
131
|
+
let count = 0;
|
|
132
|
+
for (const { definition } of scanned) {
|
|
133
|
+
if (!this.skills.has(definition.id)) {
|
|
134
|
+
this.register(definition);
|
|
135
|
+
count++;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return count;
|
|
139
|
+
}
|
|
128
140
|
}
|
|
129
141
|
//# sourceMappingURL=SkillRegistry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SkillRegistry.js","sourceRoot":"","sources":["../../src/skills/SkillRegistry.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,mBAAmB;AAGnB,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"SkillRegistry.js","sourceRoot":"","sources":["../../src/skills/SkillRegistry.ts"],"names":[],"mappings":"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"}
|
package/dist/skills/index.d.ts
CHANGED
|
@@ -7,3 +7,4 @@ export * from './SkillCatalog.js';
|
|
|
7
7
|
export { SkillInstaller, type ISkillInstaller, type SkillInstallConfig, type InstallResult, type InstallMethod } from "./SkillInstaller.js";
|
|
8
8
|
export { SkillDiscovery, type ISkillDiscovery, type DiscoveryContext, type DiscoveryResult } from "./SkillDiscovery.js";
|
|
9
9
|
export * from "./routing/index.js";
|
|
10
|
+
export * from "./RoleSkills.js";
|
package/dist/skills/index.js
CHANGED
package/dist/skills/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/skills/index.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAE9C,OAAO,EAAE,aAAa,EAAsL,MAAM,oBAAoB,CAAA;AACtO,OAAO,EAAE,aAAa,EAA0C,MAAM,oBAAoB,CAAA;AAC1F,OAAO,EAAE,aAAa,EAAkD,MAAM,oBAAoB,CAAA;AAClG,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAC/E,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AAC5D,cAAc,mBAAmB,CAAA;AACjC,OAAO,EAAE,cAAc,EAAyF,MAAM,qBAAqB,CAAA;AAC3I,OAAO,EAAE,cAAc,EAAqE,MAAM,qBAAqB,CAAA;AACvH,cAAc,oBAAoB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/skills/index.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAE9C,OAAO,EAAE,aAAa,EAAsL,MAAM,oBAAoB,CAAA;AACtO,OAAO,EAAE,aAAa,EAA0C,MAAM,oBAAoB,CAAA;AAC1F,OAAO,EAAE,aAAa,EAAkD,MAAM,oBAAoB,CAAA;AAClG,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAC/E,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AAC5D,cAAc,mBAAmB,CAAA;AACjC,OAAO,EAAE,cAAc,EAAyF,MAAM,qBAAqB,CAAA;AAC3I,OAAO,EAAE,cAAc,EAAqE,MAAM,qBAAqB,CAAA;AACvH,cAAc,oBAAoB,CAAA;AAClC,cAAc,iBAAiB,CAAA"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export type TestTier = 'gate' | 'periodic';
|
|
2
|
+
export interface TestDependency {
|
|
3
|
+
testFile: string;
|
|
4
|
+
touchfiles: string[];
|
|
5
|
+
tier: TestTier;
|
|
6
|
+
}
|
|
7
|
+
export interface TestSelectionResult {
|
|
8
|
+
selected: string[];
|
|
9
|
+
skipped: string[];
|
|
10
|
+
reason: Record<string, string[]>;
|
|
11
|
+
globalChangeTriggeredAll: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface SelectOptions {
|
|
14
|
+
baseBranch?: string;
|
|
15
|
+
projectDir?: string;
|
|
16
|
+
tier?: TestTier;
|
|
17
|
+
}
|
|
18
|
+
export declare function registerTestDependency(dep: TestDependency): void;
|
|
19
|
+
export declare function clearDependencies(): void;
|
|
20
|
+
export declare function getDependencies(): TestDependency[];
|
|
21
|
+
export declare function selectTestsByDiff(opts?: SelectOptions): TestSelectionResult;
|
|
22
|
+
export declare function formatTestSelection(result: TestSelectionResult): string;
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
// SCALE Engine — Diff-Based Test Selector (v0.32.0)
|
|
2
|
+
// Select tests based on changed files to reduce test execution time.
|
|
3
|
+
// Inspired by gstack's touchfile-based test dependency tracking.
|
|
4
|
+
import { execSync } from 'node:child_process';
|
|
5
|
+
// ============================================================================
|
|
6
|
+
// Dependency Registry
|
|
7
|
+
// ============================================================================
|
|
8
|
+
const dependencyRegistry = new Map();
|
|
9
|
+
export function registerTestDependency(dep) {
|
|
10
|
+
dependencyRegistry.set(dep.testFile, dep);
|
|
11
|
+
}
|
|
12
|
+
export function clearDependencies() {
|
|
13
|
+
dependencyRegistry.clear();
|
|
14
|
+
}
|
|
15
|
+
export function getDependencies() {
|
|
16
|
+
return Array.from(dependencyRegistry.values());
|
|
17
|
+
}
|
|
18
|
+
// ============================================================================
|
|
19
|
+
// Global Patterns
|
|
20
|
+
// ============================================================================
|
|
21
|
+
// Changes to these files trigger ALL tests
|
|
22
|
+
const GLOBAL_PATTERNS = [
|
|
23
|
+
'package.json',
|
|
24
|
+
'package-lock.json',
|
|
25
|
+
'tsconfig.json',
|
|
26
|
+
'vitest.config.*',
|
|
27
|
+
'.github/**',
|
|
28
|
+
'AGENTS.md',
|
|
29
|
+
'CLAUDE.md',
|
|
30
|
+
];
|
|
31
|
+
// ============================================================================
|
|
32
|
+
// Core Selector
|
|
33
|
+
// ============================================================================
|
|
34
|
+
export function selectTestsByDiff(opts) {
|
|
35
|
+
const baseBranch = opts?.baseBranch ?? 'master';
|
|
36
|
+
const projectDir = opts?.projectDir ?? process.cwd();
|
|
37
|
+
const changedFiles = getChangedFiles(baseBranch, projectDir);
|
|
38
|
+
const deps = Array.from(dependencyRegistry.values());
|
|
39
|
+
// Filter by tier if specified
|
|
40
|
+
const filtered = opts?.tier ? deps.filter(d => d.tier === opts.tier) : deps;
|
|
41
|
+
// Check for global changes
|
|
42
|
+
const globalChangeTriggeredAll = changedFiles.some(f => GLOBAL_PATTERNS.some(pattern => matchGlob(f, pattern)));
|
|
43
|
+
const selected = [];
|
|
44
|
+
const skipped = [];
|
|
45
|
+
const reason = {};
|
|
46
|
+
for (const dep of filtered) {
|
|
47
|
+
if (globalChangeTriggeredAll) {
|
|
48
|
+
selected.push(dep.testFile);
|
|
49
|
+
reason[dep.testFile] = ['[global change]'];
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
const matchedFiles = changedFiles.filter(cf => dep.touchfiles.some(pattern => matchGlob(cf, pattern)));
|
|
53
|
+
if (matchedFiles.length > 0) {
|
|
54
|
+
selected.push(dep.testFile);
|
|
55
|
+
reason[dep.testFile] = matchedFiles;
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
skipped.push(dep.testFile);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return { selected, skipped, reason, globalChangeTriggeredAll };
|
|
62
|
+
}
|
|
63
|
+
// ============================================================================
|
|
64
|
+
// Formatter
|
|
65
|
+
// ============================================================================
|
|
66
|
+
export function formatTestSelection(result) {
|
|
67
|
+
const lines = ['## Test Selection\n'];
|
|
68
|
+
if (result.globalChangeTriggeredAll) {
|
|
69
|
+
lines.push('**Global config change detected — all tests selected.**\n');
|
|
70
|
+
}
|
|
71
|
+
lines.push(`**Selected:** ${result.selected.length}`);
|
|
72
|
+
for (const test of result.selected) {
|
|
73
|
+
const reasons = result.reason[test] ?? [];
|
|
74
|
+
lines.push(` ✅ ${test}`);
|
|
75
|
+
if (reasons.length > 0 && reasons[0] !== '[global change]') {
|
|
76
|
+
lines.push(` ↳ changed: ${reasons.join(', ')}`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (result.skipped.length > 0) {
|
|
80
|
+
lines.push(`\n**Skipped:** ${result.skipped.length}`);
|
|
81
|
+
for (const test of result.skipped) {
|
|
82
|
+
lines.push(` ⏭️ ${test}`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return lines.join('\n');
|
|
86
|
+
}
|
|
87
|
+
// ============================================================================
|
|
88
|
+
// Helpers
|
|
89
|
+
// ============================================================================
|
|
90
|
+
function getChangedFiles(baseBranch, projectDir) {
|
|
91
|
+
try {
|
|
92
|
+
const output = execSync(`git diff --name-only ${baseBranch}...HEAD`, { cwd: projectDir, encoding: 'utf-8', timeout: 10000 }).trim();
|
|
93
|
+
if (!output)
|
|
94
|
+
return [];
|
|
95
|
+
return output.split('\n').filter(Boolean);
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
// Not in a git repo or no base branch — return empty
|
|
99
|
+
return [];
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// Simple glob matching (no external dependency)
|
|
103
|
+
function matchGlob(filePath, pattern) {
|
|
104
|
+
// Convert glob to regex
|
|
105
|
+
const regexStr = pattern
|
|
106
|
+
.replace(/\./g, '\\.')
|
|
107
|
+
.replace(/\*\*/g, '{{GLOBSTAR}}')
|
|
108
|
+
.replace(/\*/g, '[^/]*')
|
|
109
|
+
.replace(/\{\{GLOBSTAR\}\}/g, '.*')
|
|
110
|
+
.replace(/\?/g, '[^/]');
|
|
111
|
+
const regex = new RegExp(`^${regexStr}$`);
|
|
112
|
+
return regex.test(filePath);
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=DiffTestSelector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DiffTestSelector.js","sourceRoot":"","sources":["../../src/testing/DiffTestSelector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './DiffTestSelector.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA,sCAAsC;AAEtC,cAAc,uBAAuB,CAAA"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { GovernanceMode, ProgressiveGovernanceReport } from '../governance/ProgressiveGovernance.js';
|
|
2
|
+
import type { AiOsEvaluatorIntelligence, AiOsToolStrategyPlan } from '../runtime/AiOsRuntime.js';
|
|
3
|
+
export type WorkflowProfile = 'light' | 'standard' | 'strict' | 'critical';
|
|
4
|
+
export interface GateOverride {
|
|
5
|
+
gateId: string;
|
|
6
|
+
action: 'add' | 'elevate';
|
|
7
|
+
reason: string;
|
|
8
|
+
source: 'evaluator' | 'tool-strategy' | 'governance';
|
|
9
|
+
}
|
|
10
|
+
export interface BehavioralConstraint {
|
|
11
|
+
id: string;
|
|
12
|
+
description: string;
|
|
13
|
+
required: boolean;
|
|
14
|
+
profile: WorkflowProfile;
|
|
15
|
+
}
|
|
16
|
+
export interface AdaptiveWorkflowProfile {
|
|
17
|
+
profile: WorkflowProfile;
|
|
18
|
+
strategy: 'adaptive-workflow-router-v1';
|
|
19
|
+
escalationReasons: string[];
|
|
20
|
+
gateOverrides: GateOverride[];
|
|
21
|
+
behavioralConstraints: BehavioralConstraint[];
|
|
22
|
+
exitCriteria: string[];
|
|
23
|
+
inputSignals: {
|
|
24
|
+
governanceMode: GovernanceMode;
|
|
25
|
+
evaluatorRisk: 'low' | 'medium' | 'high';
|
|
26
|
+
uncertaintyScore: number;
|
|
27
|
+
toolHighRiskSteps: number;
|
|
28
|
+
toolFallbackCoverage: number;
|
|
29
|
+
requiredEvaluatorGates: number;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export interface AdaptiveWorkflowRouterInput {
|
|
33
|
+
governance: ProgressiveGovernanceReport;
|
|
34
|
+
evaluator: AiOsEvaluatorIntelligence;
|
|
35
|
+
toolStrategy: AiOsToolStrategyPlan;
|
|
36
|
+
}
|
|
37
|
+
export declare function routeAdaptiveWorkflow(input: AdaptiveWorkflowRouterInput): AdaptiveWorkflowProfile;
|