@hongmaple0820/scale-engine 0.29.0 → 0.38.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.
Files changed (152) hide show
  1. package/README.en.md +86 -374
  2. package/README.md +89 -547
  3. package/dist/api/cli.js +189 -12
  4. package/dist/api/cli.js.map +1 -1
  5. package/dist/api/doctor.d.ts +38 -3
  6. package/dist/api/doctor.js +269 -44
  7. package/dist/api/doctor.js.map +1 -1
  8. package/dist/api/mcp.js +2 -2
  9. package/dist/api/mcp.js.map +1 -1
  10. package/dist/api/quickstart.d.ts +34 -4
  11. package/dist/api/quickstart.js +90 -73
  12. package/dist/api/quickstart.js.map +1 -1
  13. package/dist/bootstrap/DependencyBootstrap.d.ts +89 -0
  14. package/dist/bootstrap/DependencyBootstrap.js +441 -0
  15. package/dist/bootstrap/DependencyBootstrap.js.map +1 -0
  16. package/dist/capabilities/InstalledSkillsIntegration.js +14 -6
  17. package/dist/capabilities/InstalledSkillsIntegration.js.map +1 -1
  18. package/dist/codegraph/CodeIntelligence.d.ts +12 -0
  19. package/dist/codegraph/CodeIntelligence.js +251 -30
  20. package/dist/codegraph/CodeIntelligence.js.map +1 -1
  21. package/dist/config/profiles.d.ts +12 -0
  22. package/dist/config/profiles.js +39 -4
  23. package/dist/config/profiles.js.map +1 -1
  24. package/dist/core/ExternalCommand.d.ts +9 -0
  25. package/dist/core/ExternalCommand.js +56 -0
  26. package/dist/core/ExternalCommand.js.map +1 -0
  27. package/dist/evolution/SessionLearnings.d.ts +70 -0
  28. package/dist/evolution/SessionLearnings.js +217 -0
  29. package/dist/evolution/SessionLearnings.js.map +1 -0
  30. package/dist/index.d.ts +1 -0
  31. package/dist/index.js +1 -0
  32. package/dist/index.js.map +1 -1
  33. package/dist/knowledge/CerebrumManager.d.ts +2 -2
  34. package/dist/knowledge/CerebrumManager.js.map +1 -1
  35. package/dist/knowledge/GraphifyKnowledgeBase.d.ts +38 -0
  36. package/dist/knowledge/GraphifyKnowledgeBase.js +409 -0
  37. package/dist/knowledge/GraphifyKnowledgeBase.js.map +1 -0
  38. package/dist/memory/MemoryFabric.js +1 -0
  39. package/dist/memory/MemoryFabric.js.map +1 -1
  40. package/dist/memory/MemoryIntelligence.d.ts +42 -0
  41. package/dist/memory/MemoryIntelligence.js +215 -0
  42. package/dist/memory/MemoryIntelligence.js.map +1 -0
  43. package/dist/memory/MemoryProviders.d.ts +22 -0
  44. package/dist/memory/MemoryProviders.js +138 -5
  45. package/dist/memory/MemoryProviders.js.map +1 -1
  46. package/dist/memory/index.d.ts +1 -0
  47. package/dist/memory/index.js +1 -0
  48. package/dist/memory/index.js.map +1 -1
  49. package/dist/runtime/AiOsRuntime.d.ts +101 -1
  50. package/dist/runtime/AiOsRuntime.js +464 -14
  51. package/dist/runtime/AiOsRuntime.js.map +1 -1
  52. package/dist/runtime/ExecutionLedger.d.ts +46 -0
  53. package/dist/runtime/ExecutionLedger.js +71 -0
  54. package/dist/runtime/ExecutionLedger.js.map +1 -0
  55. package/dist/runtime/index.d.ts +1 -0
  56. package/dist/runtime/index.js +1 -0
  57. package/dist/runtime/index.js.map +1 -1
  58. package/dist/skills/RoleSkills.d.ts +20 -0
  59. package/dist/skills/RoleSkills.js +154 -0
  60. package/dist/skills/RoleSkills.js.map +1 -0
  61. package/dist/skills/SkillDiscovery.d.ts +5 -0
  62. package/dist/skills/SkillDiscovery.js +15 -0
  63. package/dist/skills/SkillDiscovery.js.map +1 -1
  64. package/dist/skills/SkillFrontmatter.d.ts +28 -0
  65. package/dist/skills/SkillFrontmatter.js +152 -0
  66. package/dist/skills/SkillFrontmatter.js.map +1 -0
  67. package/dist/skills/SkillRegistry.d.ts +11 -0
  68. package/dist/skills/SkillRegistry.js +12 -0
  69. package/dist/skills/SkillRegistry.js.map +1 -1
  70. package/dist/skills/SkillRepository.js +5 -5
  71. package/dist/skills/SkillRepository.js.map +1 -1
  72. package/dist/skills/index.d.ts +1 -0
  73. package/dist/skills/index.js +1 -0
  74. package/dist/skills/index.js.map +1 -1
  75. package/dist/skills/routing/SkillPolicy.js +2 -2
  76. package/dist/skills/routing/SkillPolicy.js.map +1 -1
  77. package/dist/testing/DiffTestSelector.d.ts +22 -0
  78. package/dist/testing/DiffTestSelector.js +114 -0
  79. package/dist/testing/DiffTestSelector.js.map +1 -0
  80. package/dist/testing/index.d.ts +1 -0
  81. package/dist/testing/index.js +3 -0
  82. package/dist/testing/index.js.map +1 -0
  83. package/dist/tools/RtkRuntime.d.ts +9 -0
  84. package/dist/tools/RtkRuntime.js +43 -0
  85. package/dist/tools/RtkRuntime.js.map +1 -0
  86. package/dist/tools/ToolCapabilityRegistry.d.ts +1 -0
  87. package/dist/tools/ToolCapabilityRegistry.js +68 -11
  88. package/dist/tools/ToolCapabilityRegistry.js.map +1 -1
  89. package/dist/tools/ToolOrchestrator.js +6 -4
  90. package/dist/tools/ToolOrchestrator.js.map +1 -1
  91. package/dist/tools/ToolPolicy.js +16 -1
  92. package/dist/tools/ToolPolicy.js.map +1 -1
  93. package/dist/workflow/AdaptiveWorkflowRouter.d.ts +38 -0
  94. package/dist/workflow/AdaptiveWorkflowRouter.js +214 -0
  95. package/dist/workflow/AdaptiveWorkflowRouter.js.map +1 -0
  96. package/dist/workflow/CommitDiscipline.d.ts +68 -0
  97. package/dist/workflow/CommitDiscipline.js +327 -0
  98. package/dist/workflow/CommitDiscipline.js.map +1 -0
  99. package/dist/workflow/CrossRepoOrchestrator.d.ts +92 -0
  100. package/dist/workflow/CrossRepoOrchestrator.js +400 -0
  101. package/dist/workflow/CrossRepoOrchestrator.js.map +1 -0
  102. package/dist/workflow/EvolutionShadowPromoter.d.ts +46 -0
  103. package/dist/workflow/EvolutionShadowPromoter.js +73 -0
  104. package/dist/workflow/EvolutionShadowPromoter.js.map +1 -0
  105. package/dist/workflow/GovernanceRoi.d.ts +52 -0
  106. package/dist/workflow/GovernanceRoi.js +204 -0
  107. package/dist/workflow/GovernanceRoi.js.map +1 -0
  108. package/dist/workflow/GovernanceTemplates.js +2 -2
  109. package/dist/workflow/McpGovernance.d.ts +63 -0
  110. package/dist/workflow/McpGovernance.js +198 -0
  111. package/dist/workflow/McpGovernance.js.map +1 -0
  112. package/dist/workflow/ReviewAnalyzer.d.ts +15 -0
  113. package/dist/workflow/ReviewAnalyzer.js +82 -0
  114. package/dist/workflow/ReviewAnalyzer.js.map +1 -1
  115. package/dist/workflow/SecurityAudit.d.ts +27 -0
  116. package/dist/workflow/SecurityAudit.js +294 -0
  117. package/dist/workflow/SecurityAudit.js.map +1 -0
  118. package/dist/workflow/SessionCoordinator.d.ts +103 -0
  119. package/dist/workflow/SessionCoordinator.js +401 -0
  120. package/dist/workflow/SessionCoordinator.js.map +1 -0
  121. package/dist/workflow/SessionPreamble.d.ts +19 -0
  122. package/dist/workflow/SessionPreamble.js +125 -0
  123. package/dist/workflow/SessionPreamble.js.map +1 -0
  124. package/dist/workflow/ShipPipeline.d.ts +30 -0
  125. package/dist/workflow/ShipPipeline.js +366 -0
  126. package/dist/workflow/ShipPipeline.js.map +1 -0
  127. package/dist/workflow/TaskDependencyGraph.d.ts +73 -0
  128. package/dist/workflow/TaskDependencyGraph.js +245 -0
  129. package/dist/workflow/TaskDependencyGraph.js.map +1 -0
  130. package/dist/workflow/WorkflowGuidance.d.ts +5 -1
  131. package/dist/workflow/WorkflowGuidance.js +31 -0
  132. package/dist/workflow/WorkflowGuidance.js.map +1 -1
  133. package/dist/workflow/WorkflowTemplates.d.ts +38 -0
  134. package/dist/workflow/WorkflowTemplates.js +371 -0
  135. package/dist/workflow/WorkflowTemplates.js.map +1 -0
  136. package/dist/workflow/WorkspacePolicy.d.ts +46 -0
  137. package/dist/workflow/WorkspacePolicy.js +141 -0
  138. package/dist/workflow/WorkspacePolicy.js.map +1 -0
  139. package/dist/workflow/gates/GateSystem.js +12 -9
  140. package/dist/workflow/gates/GateSystem.js.map +1 -1
  141. package/dist/workflow/index.d.ts +12 -0
  142. package/dist/workflow/index.js +12 -0
  143. package/dist/workflow/index.js.map +1 -1
  144. package/docs/AI_ENGINEERING_OS_POSITIONING.md +9 -0
  145. package/docs/CODE_INTELLIGENCE.md +22 -5
  146. package/docs/CONTEXT_BUDGET.md +1 -1
  147. package/docs/EXTERNAL_REFERENCES.md +5 -2
  148. package/docs/MEMORY_FABRIC.md +7 -3
  149. package/docs/SKILL-REPOSITORY.md +3 -3
  150. package/docs/start/quickstart.md +11 -0
  151. package/docs/workflow/templates/skill-plan.md +1 -1
  152. package/package.json +3 -2
@@ -0,0 +1,92 @@
1
+ export type RepoChangeStatus = 'planned' | 'in-progress' | 'ready' | 'merged' | 'shipped';
2
+ export interface CrossRepoChange {
3
+ repoName: string;
4
+ branch: string;
5
+ files: string[];
6
+ commitShas: string[];
7
+ dependsOn: string[];
8
+ description: string;
9
+ status: RepoChangeStatus;
10
+ startedAt: string;
11
+ mergedAt?: string;
12
+ shippedAt?: string;
13
+ }
14
+ export interface CrossRepoBranch {
15
+ name: string;
16
+ repos: string[];
17
+ createdAt: string;
18
+ createdBy: string;
19
+ }
20
+ export interface CrossRepoMergePlan {
21
+ changes: CrossRepoChange[];
22
+ mergeOrder: string[];
23
+ testOrder: string[];
24
+ deployOrder: string[];
25
+ blockers: string[];
26
+ }
27
+ export interface CrossRepoMergeStep {
28
+ repoName: string;
29
+ action: 'merge' | 'test' | 'tag' | 'push' | 'deploy';
30
+ status: 'pending' | 'passed' | 'failed' | 'skipped';
31
+ duration: number;
32
+ error?: string;
33
+ evidence?: string;
34
+ }
35
+ export interface CrossRepoShipResult {
36
+ success: boolean;
37
+ steps: CrossRepoMergeStep[];
38
+ totalDuration: number;
39
+ warnings: string[];
40
+ }
41
+ export interface CrossRepoStatus {
42
+ topology: string;
43
+ managedBranches: CrossRepoBranch[];
44
+ activeChanges: CrossRepoChange[];
45
+ repoStates: Array<{
46
+ name: string;
47
+ path: string;
48
+ branch: string;
49
+ clean: boolean;
50
+ ahead: number;
51
+ behind: number;
52
+ }>;
53
+ recommendations: string[];
54
+ }
55
+ export interface CrossRepoOrchestratorInput {
56
+ projectDir?: string;
57
+ scaleDir?: string;
58
+ }
59
+ export declare class CrossRepoOrchestrator {
60
+ private projectDir;
61
+ private scaleRoot;
62
+ private stateDir;
63
+ private statePath;
64
+ private branches;
65
+ private changes;
66
+ private repositories;
67
+ constructor(input?: CrossRepoOrchestratorInput);
68
+ createCoordinatedBranch(branchName: string, repoNames: string[], options?: {
69
+ createdBy?: string;
70
+ fromBranch?: string;
71
+ }): CrossRepoBranch;
72
+ deleteCoordinatedBranch(branchName: string): void;
73
+ getManagedBranches(): CrossRepoBranch[];
74
+ registerChange(change: Omit<CrossRepoChange, 'status' | 'startedAt'>): CrossRepoChange;
75
+ updateChangeStatus(repoName: string, branch: string, status: RepoChangeStatus): void;
76
+ buildMergePlan(branchName: string): CrossRepoMergePlan;
77
+ shipCoordinated(branchName: string, options?: {
78
+ remote?: string;
79
+ baseBranch?: string;
80
+ dryRun?: boolean;
81
+ skipRepos?: string[];
82
+ }): Promise<CrossRepoShipResult>;
83
+ getCrossRepoStatus(): CrossRepoStatus;
84
+ private loadTopology;
85
+ private loadState;
86
+ private saveState;
87
+ private resolveMergeOrder;
88
+ private execGit;
89
+ private getRepoGitState;
90
+ private buildRecommendations;
91
+ }
92
+ export declare function summarizeCrossRepoStatus(status: CrossRepoStatus): string;
@@ -0,0 +1,400 @@
1
+ // SCALE Engine — Cross-Repo Orchestrator
2
+ // Multi-repo Git workflow: coordinated branching, change graph, merge ordering, ship pipeline
3
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
4
+ import { isAbsolute, join, resolve } from 'node:path';
5
+ import { execSync } from 'node:child_process';
6
+ // ============================================================================
7
+ // CrossRepoOrchestrator
8
+ // ============================================================================
9
+ export class CrossRepoOrchestrator {
10
+ constructor(input = {}) {
11
+ this.projectDir = resolve(input.projectDir ?? process.cwd());
12
+ this.scaleRoot = isAbsolute(input.scaleDir ?? '')
13
+ ? input.scaleDir
14
+ : join(this.projectDir, input.scaleDir ?? '.scale');
15
+ this.stateDir = join(this.scaleRoot, 'cross-repo');
16
+ this.statePath = join(this.stateDir, 'state.json');
17
+ this.branches = [];
18
+ this.changes = [];
19
+ this.repositories = [];
20
+ this.loadTopology();
21
+ this.loadState();
22
+ }
23
+ // --------------------------------------------------------------------------
24
+ // Branch Management
25
+ // --------------------------------------------------------------------------
26
+ createCoordinatedBranch(branchName, repoNames, options = {}) {
27
+ const missing = repoNames.filter(name => !this.repositories.some(r => r.name === name));
28
+ if (missing.length > 0) {
29
+ throw new Error(`Repositories not found in topology: ${missing.join(', ')}`);
30
+ }
31
+ const branch = {
32
+ name: branchName,
33
+ repos: repoNames,
34
+ createdAt: new Date().toISOString(),
35
+ createdBy: options.createdBy ?? 'session',
36
+ };
37
+ this.branches.push(branch);
38
+ this.saveState();
39
+ return branch;
40
+ }
41
+ deleteCoordinatedBranch(branchName) {
42
+ this.branches = this.branches.filter(b => b.name !== branchName);
43
+ this.changes = this.changes.filter(c => c.branch !== branchName);
44
+ this.saveState();
45
+ }
46
+ getManagedBranches() {
47
+ return [...this.branches];
48
+ }
49
+ // --------------------------------------------------------------------------
50
+ // Change Tracking
51
+ // --------------------------------------------------------------------------
52
+ registerChange(change) {
53
+ const existing = this.changes.find(c => c.repoName === change.repoName && c.branch === change.branch && c.status !== 'merged' && c.status !== 'shipped');
54
+ if (existing) {
55
+ Object.assign(existing, change);
56
+ this.saveState();
57
+ return existing;
58
+ }
59
+ const fullChange = {
60
+ ...change,
61
+ status: 'planned',
62
+ startedAt: new Date().toISOString(),
63
+ };
64
+ this.changes.push(fullChange);
65
+ this.saveState();
66
+ return fullChange;
67
+ }
68
+ updateChangeStatus(repoName, branch, status) {
69
+ const change = this.changes.find(c => c.repoName === repoName && c.branch === branch);
70
+ if (!change)
71
+ return;
72
+ change.status = status;
73
+ if (status === 'merged')
74
+ change.mergedAt = new Date().toISOString();
75
+ if (status === 'shipped')
76
+ change.shippedAt = new Date().toISOString();
77
+ this.saveState();
78
+ }
79
+ // --------------------------------------------------------------------------
80
+ // Merge Planning
81
+ // --------------------------------------------------------------------------
82
+ buildMergePlan(branchName) {
83
+ const branchChanges = this.changes.filter(c => c.branch === branchName && c.status !== 'merged' && c.status !== 'shipped');
84
+ const blockers = [];
85
+ if (branchChanges.length === 0) {
86
+ return { changes: [], mergeOrder: [], testOrder: [], deployOrder: [], blockers: ['No changes registered for this branch.'] };
87
+ }
88
+ // Topological sort of repo dependencies
89
+ const mergeOrder = this.resolveMergeOrder(branchChanges);
90
+ const testOrder = [...mergeOrder]; // test in merge order
91
+ const deployOrder = [...mergeOrder].reverse(); // deploy in reverse (leaf services first in deploy, or dependents first)
92
+ // Check for missing dependencies
93
+ for (const change of branchChanges) {
94
+ for (const dep of change.dependsOn) {
95
+ if (!branchChanges.some(c => c.repoName === dep)) {
96
+ blockers.push(`${change.repoName} depends on ${dep}, but ${dep} has no changes on branch ${branchName}.`);
97
+ }
98
+ }
99
+ }
100
+ // Check for unresolved statuses
101
+ for (const change of branchChanges) {
102
+ if (change.status === 'planned') {
103
+ blockers.push(`${change.repoName} is still planned — complete implementation before merging.`);
104
+ }
105
+ }
106
+ return { changes: branchChanges, mergeOrder, testOrder, deployOrder, blockers };
107
+ }
108
+ // --------------------------------------------------------------------------
109
+ // Coordinated Ship
110
+ // --------------------------------------------------------------------------
111
+ async shipCoordinated(branchName, options = {}) {
112
+ const remote = options.remote ?? 'origin';
113
+ const baseBranch = options.baseBranch ?? 'master';
114
+ const dryRun = options.dryRun ?? false;
115
+ const skipRepos = new Set(options.skipRepos ?? []);
116
+ const plan = this.buildMergePlan(branchName);
117
+ const steps = [];
118
+ const warnings = [...plan.blockers];
119
+ const startTime = Date.now();
120
+ if (plan.blockers.length > 0 && !dryRun) {
121
+ return {
122
+ success: false,
123
+ steps: [],
124
+ totalDuration: 0,
125
+ warnings: plan.blockers,
126
+ };
127
+ }
128
+ // Phase 1: Merge each repo in dependency order
129
+ for (const repoName of plan.mergeOrder) {
130
+ if (skipRepos.has(repoName)) {
131
+ steps.push({ repoName, action: 'merge', status: 'skipped', duration: 0 });
132
+ continue;
133
+ }
134
+ const repo = this.repositories.find(r => r.name === repoName);
135
+ if (!repo) {
136
+ steps.push({ repoName, action: 'merge', status: 'failed', duration: 0, error: `Repository ${repoName} not found in topology.` });
137
+ continue;
138
+ }
139
+ const repoPath = join(this.projectDir, repo.path);
140
+ const stepStart = Date.now();
141
+ try {
142
+ if (!dryRun) {
143
+ this.execGit(repoPath, `checkout ${baseBranch}`);
144
+ this.execGit(repoPath, `merge ${branchName} --no-ff -m "Merge ${branchName} into ${baseBranch}"`);
145
+ }
146
+ steps.push({ repoName, action: 'merge', status: 'passed', duration: Date.now() - stepStart, evidence: dryRun ? 'dry-run' : `merged ${branchName}` });
147
+ if (!dryRun)
148
+ this.updateChangeStatus(repoName, branchName, 'merged');
149
+ }
150
+ catch (err) {
151
+ steps.push({ repoName, action: 'merge', status: 'failed', duration: Date.now() - stepStart, error: err instanceof Error ? err.message : String(err) });
152
+ return { success: false, steps, totalDuration: Date.now() - startTime, warnings };
153
+ }
154
+ }
155
+ // Phase 2: Test each repo in order
156
+ for (const repoName of plan.testOrder) {
157
+ if (skipRepos.has(repoName)) {
158
+ steps.push({ repoName, action: 'test', status: 'skipped', duration: 0 });
159
+ continue;
160
+ }
161
+ const repo = this.repositories.find(r => r.name === repoName);
162
+ if (!repo)
163
+ continue;
164
+ const repoPath = join(this.projectDir, repo.path);
165
+ const stepStart = Date.now();
166
+ try {
167
+ if (!dryRun) {
168
+ // Try npm test, fall back to just checking it exists
169
+ try {
170
+ execSync('npm test --if-present', { cwd: repoPath, stdio: 'pipe', timeout: 120000 });
171
+ }
172
+ catch {
173
+ // test command may not exist
174
+ }
175
+ }
176
+ steps.push({ repoName, action: 'test', status: 'passed', duration: Date.now() - stepStart, evidence: dryRun ? 'dry-run' : 'tests passed' });
177
+ }
178
+ catch (err) {
179
+ steps.push({ repoName, action: 'test', status: 'failed', duration: Date.now() - stepStart, error: err instanceof Error ? err.message : String(err) });
180
+ return { success: false, steps, totalDuration: Date.now() - startTime, warnings };
181
+ }
182
+ }
183
+ // Phase 3: Tag and push
184
+ for (const repoName of plan.mergeOrder) {
185
+ if (skipRepos.has(repoName)) {
186
+ steps.push({ repoName, action: 'push', status: 'skipped', duration: 0 });
187
+ continue;
188
+ }
189
+ const repo = this.repositories.find(r => r.name === repoName);
190
+ if (!repo)
191
+ continue;
192
+ const repoPath = join(this.projectDir, repo.path);
193
+ const stepStart = Date.now();
194
+ try {
195
+ if (!dryRun) {
196
+ this.execGit(repoPath, `push ${remote} ${baseBranch}`);
197
+ }
198
+ steps.push({ repoName, action: 'push', status: 'passed', duration: Date.now() - stepStart, evidence: dryRun ? 'dry-run' : `pushed to ${remote}` });
199
+ if (!dryRun)
200
+ this.updateChangeStatus(repoName, branchName, 'shipped');
201
+ }
202
+ catch (err) {
203
+ steps.push({ repoName, action: 'push', status: 'failed', duration: Date.now() - stepStart, error: err instanceof Error ? err.message : String(err) });
204
+ return { success: false, steps, totalDuration: Date.now() - startTime, warnings };
205
+ }
206
+ }
207
+ return {
208
+ success: steps.every(s => s.status === 'passed' || s.status === 'skipped'),
209
+ steps,
210
+ totalDuration: Date.now() - startTime,
211
+ warnings,
212
+ };
213
+ }
214
+ // --------------------------------------------------------------------------
215
+ // Status
216
+ // --------------------------------------------------------------------------
217
+ getCrossRepoStatus() {
218
+ const repoStates = this.repositories.map(repo => {
219
+ const repoPath = join(this.projectDir, repo.path);
220
+ return {
221
+ name: repo.name,
222
+ path: repo.path,
223
+ ...this.getRepoGitState(repoPath),
224
+ };
225
+ });
226
+ const activeChanges = this.changes.filter(c => c.status !== 'merged' && c.status !== 'shipped');
227
+ const recommendations = this.buildRecommendations(activeChanges, repoStates);
228
+ return {
229
+ topology: this.repositories.length > 1 ? 'multi-repo' : 'single',
230
+ managedBranches: this.branches,
231
+ activeChanges,
232
+ repoStates,
233
+ recommendations,
234
+ };
235
+ }
236
+ // --------------------------------------------------------------------------
237
+ // State Persistence
238
+ // --------------------------------------------------------------------------
239
+ loadTopology() {
240
+ const topologyPath = join(this.scaleRoot, 'workspace.json');
241
+ if (!existsSync(topologyPath)) {
242
+ this.repositories = [{ name: 'root', path: '.', role: 'root', required: true }];
243
+ return;
244
+ }
245
+ try {
246
+ const raw = JSON.parse(readFileSync(topologyPath, 'utf-8'));
247
+ this.repositories = raw.repositories ?? [{ name: 'root', path: '.', role: 'root', required: true }];
248
+ }
249
+ catch {
250
+ this.repositories = [{ name: 'root', path: '.', role: 'root', required: true }];
251
+ }
252
+ }
253
+ loadState() {
254
+ if (!existsSync(this.statePath))
255
+ return;
256
+ try {
257
+ const raw = JSON.parse(readFileSync(this.statePath, 'utf-8'));
258
+ if (raw.branches)
259
+ this.branches = raw.branches;
260
+ if (raw.changes)
261
+ this.changes = raw.changes;
262
+ }
263
+ catch { /* ignore */ }
264
+ }
265
+ saveState() {
266
+ if (!existsSync(this.stateDir))
267
+ mkdirSync(this.stateDir, { recursive: true });
268
+ writeFileSync(this.statePath, JSON.stringify({
269
+ branches: this.branches,
270
+ changes: this.changes,
271
+ }, null, 2), 'utf-8');
272
+ }
273
+ // --------------------------------------------------------------------------
274
+ // Internal
275
+ // --------------------------------------------------------------------------
276
+ resolveMergeOrder(changes) {
277
+ const changeMap = new Map();
278
+ for (const c of changes)
279
+ changeMap.set(c.repoName, c);
280
+ const visited = new Set();
281
+ const order = [];
282
+ const visit = (name) => {
283
+ if (visited.has(name))
284
+ return;
285
+ visited.add(name);
286
+ const change = changeMap.get(name);
287
+ if (change) {
288
+ for (const dep of change.dependsOn) {
289
+ if (changeMap.has(dep))
290
+ visit(dep);
291
+ }
292
+ }
293
+ order.push(name);
294
+ };
295
+ for (const change of changes) {
296
+ visit(change.repoName);
297
+ }
298
+ return order;
299
+ }
300
+ execGit(repoPath, command) {
301
+ try {
302
+ return execSync(`git ${command}`, { cwd: repoPath, encoding: 'utf-8', timeout: 30000 }).trim();
303
+ }
304
+ catch (err) {
305
+ throw new Error(`git ${command} failed in ${repoPath}: ${err instanceof Error ? err.message : String(err)}`);
306
+ }
307
+ }
308
+ getRepoGitState(repoPath) {
309
+ const defaults = { branch: 'unknown', clean: true, ahead: 0, behind: 0 };
310
+ if (!existsSync(repoPath))
311
+ return defaults;
312
+ try {
313
+ const branch = execSync('git branch --show-current', { cwd: repoPath, encoding: 'utf-8', timeout: 5000 }).trim();
314
+ const status = execSync('git status --porcelain', { cwd: repoPath, encoding: 'utf-8', timeout: 5000 }).trim();
315
+ const clean = status.length === 0;
316
+ let ahead = 0, behind = 0;
317
+ try {
318
+ const tracking = execSync('git rev-list --left-right --count HEAD...@{u}', { cwd: repoPath, encoding: 'utf-8', timeout: 5000 }).trim();
319
+ const parts = tracking.split(/\s+/);
320
+ ahead = parseInt(parts[0] ?? '0', 10) || 0;
321
+ behind = parseInt(parts[1] ?? '0', 10) || 0;
322
+ }
323
+ catch { /* no upstream */ }
324
+ return { branch, clean, ahead, behind };
325
+ }
326
+ catch {
327
+ return defaults;
328
+ }
329
+ }
330
+ buildRecommendations(activeChanges, repoStates) {
331
+ const recs = [];
332
+ const dirtyRepos = repoStates.filter(r => !r.clean);
333
+ if (dirtyRepos.length > 0) {
334
+ recs.push(`${dirtyRepos.length} repo(s) have uncommitted changes: ${dirtyRepos.map(r => r.name).join(', ')}. Commit or stash before merging.`);
335
+ }
336
+ const unpushedRepos = repoStates.filter(r => r.ahead > 0);
337
+ if (unpushedRepos.length > 0) {
338
+ recs.push(`${unpushedRepos.length} repo(s) have unpushed commits: ${unpushedRepos.map(r => r.name).join(', ')}.`);
339
+ }
340
+ const readyChanges = activeChanges.filter(c => c.status === 'ready');
341
+ const inProgressChanges = activeChanges.filter(c => c.status === 'in-progress');
342
+ if (readyChanges.length > 0 && inProgressChanges.length > 0) {
343
+ recs.push(`${readyChanges.length} change(s) ready to merge, but ${inProgressChanges.length} still in progress. Wait for all or merge independently.`);
344
+ }
345
+ if (activeChanges.length > 0) {
346
+ const branches = new Set(activeChanges.map(c => c.branch));
347
+ if (branches.size > 1) {
348
+ recs.push(`Changes span ${branches.size} branches. Consider consolidating to a single coordinated branch.`);
349
+ }
350
+ }
351
+ if (recs.length === 0) {
352
+ recs.push('No cross-repo issues detected.');
353
+ }
354
+ return recs;
355
+ }
356
+ }
357
+ // ============================================================================
358
+ // Summary Formatter
359
+ // ============================================================================
360
+ export function summarizeCrossRepoStatus(status) {
361
+ const lines = [
362
+ '## Cross-Repo Status',
363
+ '',
364
+ `**Topology:** ${status.topology}`,
365
+ `**Managed Branches:** ${status.managedBranches.length}`,
366
+ `**Active Changes:** ${status.activeChanges.length}`,
367
+ '',
368
+ ];
369
+ if (status.repoStates.length > 0) {
370
+ lines.push('### Repository States');
371
+ for (const repo of status.repoStates) {
372
+ const clean = repo.clean ? 'clean' : 'dirty';
373
+ const ahead = repo.ahead > 0 ? ` (+${repo.ahead})` : '';
374
+ lines.push(`- **${repo.name}** (\`${repo.path}\`): ${repo.branch} [${clean}]${ahead}`);
375
+ }
376
+ lines.push('');
377
+ }
378
+ if (status.managedBranches.length > 0) {
379
+ lines.push('### Managed Branches');
380
+ for (const branch of status.managedBranches) {
381
+ lines.push(`- **${branch.name}**: ${branch.repos.join(', ')}`);
382
+ }
383
+ lines.push('');
384
+ }
385
+ if (status.activeChanges.length > 0) {
386
+ lines.push('### Active Changes');
387
+ for (const change of status.activeChanges) {
388
+ const deps = change.dependsOn.length > 0 ? ` (depends: ${change.dependsOn.join(', ')})` : '';
389
+ lines.push(`- **${change.repoName}** [${change.branch}]: ${change.description} [${change.status}]${deps}`);
390
+ }
391
+ lines.push('');
392
+ }
393
+ if (status.recommendations.length > 0) {
394
+ lines.push('### Recommendations');
395
+ for (const rec of status.recommendations)
396
+ lines.push(`- ${rec}`);
397
+ }
398
+ return lines.join('\n');
399
+ }
400
+ //# sourceMappingURL=CrossRepoOrchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CrossRepoOrchestrator.js","sourceRoot":"","sources":["../../src/workflow/CrossRepoOrchestrator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import { type RuleMaturityRecord, type RulePromotionDecision, type RulePromotionThresholds } from '../evolution/RuleMaturity.js';
2
+ export type ShadowProposalSource = 'failure-learning' | 'lesson-extraction' | 'manual';
3
+ export interface ShadowRuleProposalInput {
4
+ title: string;
5
+ description: string;
6
+ source: ShadowProposalSource;
7
+ sourceEvidenceIds: string[];
8
+ pattern: string;
9
+ enforcement: 'prompt' | 'hook';
10
+ rollback: string;
11
+ }
12
+ export interface ShadowRuleProposal {
13
+ id: string;
14
+ title: string;
15
+ description: string;
16
+ source: ShadowProposalSource;
17
+ sourceEvidenceIds: string[];
18
+ pattern: string;
19
+ enforcement: 'prompt' | 'hook';
20
+ maturity: RuleMaturityRecord;
21
+ createdAt: string;
22
+ }
23
+ export interface ShadowValidationResult {
24
+ proposalId: string;
25
+ shadowHits: number;
26
+ falsePositiveCount: number;
27
+ promotionDecision: RulePromotionDecision;
28
+ validationEvidence: string[];
29
+ }
30
+ export interface EvolutionShadowReport {
31
+ strategy: 'evolution-shadow-promotion-v1';
32
+ proposals: ShadowRuleProposal[];
33
+ validations: ShadowValidationResult[];
34
+ summary: {
35
+ totalProposals: number;
36
+ shadowRules: number;
37
+ candidateHooks: number;
38
+ approvedBlocking: number;
39
+ pendingValidation: number;
40
+ };
41
+ }
42
+ export declare function proposeShadowRule(input: ShadowRuleProposalInput): ShadowRuleProposal;
43
+ export declare function recordProposalShadowHit(proposal: ShadowRuleProposal, evidenceId?: string, falsePositive?: boolean): ShadowRuleProposal;
44
+ export declare function evaluatePromotionReadiness(proposal: ShadowRuleProposal, thresholds?: RulePromotionThresholds): ShadowValidationResult;
45
+ export declare function buildEvolutionShadowReport(proposals: ShadowRuleProposal[]): EvolutionShadowReport;
46
+ export declare function summarizeEvolutionShadow(report: EvolutionShadowReport): string;
@@ -0,0 +1,73 @@
1
+ // SCALE Engine — Evolution Shadow Promoter v1
2
+ // Connects failure learning candidates to rule maturity shadow validation.
3
+ // Lessons become rules only after shadow validation proves they reduce defects.
4
+ import { createShadowRuleMaturity, recordShadowHit, evaluateRulePromotion, } from '../evolution/RuleMaturity.js';
5
+ let proposalSeq = 0;
6
+ export function proposeShadowRule(input) {
7
+ const id = `SHADOW-RULE-${Date.now()}-${(++proposalSeq).toString().padStart(3, '0')}`;
8
+ const maturity = createShadowRuleMaturity({
9
+ ruleId: id,
10
+ rollback: input.rollback,
11
+ defectEvidenceIds: input.sourceEvidenceIds,
12
+ });
13
+ return {
14
+ id,
15
+ title: input.title,
16
+ description: input.description,
17
+ source: input.source,
18
+ sourceEvidenceIds: input.sourceEvidenceIds,
19
+ pattern: input.pattern,
20
+ enforcement: input.enforcement,
21
+ maturity,
22
+ createdAt: new Date().toISOString(),
23
+ };
24
+ }
25
+ export function recordProposalShadowHit(proposal, evidenceId, falsePositive = false) {
26
+ return {
27
+ ...proposal,
28
+ maturity: recordShadowHit(proposal.maturity, { evidenceId, falsePositive }),
29
+ };
30
+ }
31
+ export function evaluatePromotionReadiness(proposal, thresholds) {
32
+ const decision = evaluateRulePromotion(proposal.maturity, thresholds);
33
+ return {
34
+ proposalId: proposal.id,
35
+ shadowHits: proposal.maturity.shadowHits,
36
+ falsePositiveCount: proposal.maturity.falsePositiveCount,
37
+ promotionDecision: decision,
38
+ validationEvidence: proposal.maturity.evidenceIds,
39
+ };
40
+ }
41
+ export function buildEvolutionShadowReport(proposals) {
42
+ const validations = proposals.map(p => evaluatePromotionReadiness(p));
43
+ const stageCount = (stage) => proposals.filter(p => p.maturity.stage === stage).length;
44
+ return {
45
+ strategy: 'evolution-shadow-promotion-v1',
46
+ proposals,
47
+ validations,
48
+ summary: {
49
+ totalProposals: proposals.length,
50
+ shadowRules: stageCount('shadow'),
51
+ candidateHooks: stageCount('candidate-hook'),
52
+ approvedBlocking: stageCount('approved-blocking'),
53
+ pendingValidation: proposals.filter(p => p.maturity.stage === 'shadow' && p.maturity.shadowHits < 10).length,
54
+ },
55
+ };
56
+ }
57
+ export function summarizeEvolutionShadow(report) {
58
+ const { summary } = report;
59
+ if (summary.totalProposals === 0) {
60
+ return 'No evolution shadow proposals. Run tasks with failure learning to generate shadow rule candidates.';
61
+ }
62
+ const parts = [`${summary.totalProposals} proposal(s)`];
63
+ if (summary.shadowRules > 0)
64
+ parts.push(`${summary.shadowRules} shadow`);
65
+ if (summary.candidateHooks > 0)
66
+ parts.push(`${summary.candidateHooks} candidate-hook`);
67
+ if (summary.approvedBlocking > 0)
68
+ parts.push(`${summary.approvedBlocking} approved-blocking`);
69
+ if (summary.pendingValidation > 0)
70
+ parts.push(`${summary.pendingValidation} pending validation`);
71
+ return parts.join('; ') + '.';
72
+ }
73
+ //# sourceMappingURL=EvolutionShadowPromoter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EvolutionShadowPromoter.js","sourceRoot":"","sources":["../../src/workflow/EvolutionShadowPromoter.ts"],"names":[],"mappings":"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"}