@hongmaple0820/scale-engine 0.33.0 → 0.39.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 (159) hide show
  1. package/README.en.md +86 -376
  2. package/README.md +95 -540
  3. package/dist/api/cli.js +293 -18
  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 +110 -0
  14. package/dist/bootstrap/DependencyBootstrap.js +829 -0
  15. package/dist/bootstrap/DependencyBootstrap.js.map +1 -0
  16. package/dist/bootstrap/DependencyBootstrapRenderer.d.ts +3 -0
  17. package/dist/bootstrap/DependencyBootstrapRenderer.js +140 -0
  18. package/dist/bootstrap/DependencyBootstrapRenderer.js.map +1 -0
  19. package/dist/capabilities/InstalledSkillsIntegration.js +14 -6
  20. package/dist/capabilities/InstalledSkillsIntegration.js.map +1 -1
  21. package/dist/cli/gateStatusCommands.d.ts +1 -0
  22. package/dist/cli/gateStatusCommands.js +52 -0
  23. package/dist/cli/gateStatusCommands.js.map +1 -0
  24. package/dist/cli/phaseCommands.js +15 -3
  25. package/dist/cli/phaseCommands.js.map +1 -1
  26. package/dist/cli/promptCommands.d.ts +1 -0
  27. package/dist/cli/promptCommands.js +57 -0
  28. package/dist/cli/promptCommands.js.map +1 -0
  29. package/dist/cli/scoreCommands.d.ts +1 -0
  30. package/dist/cli/scoreCommands.js +112 -0
  31. package/dist/cli/scoreCommands.js.map +1 -0
  32. package/dist/codegraph/CodeIntelligence.d.ts +12 -0
  33. package/dist/codegraph/CodeIntelligence.js +251 -30
  34. package/dist/codegraph/CodeIntelligence.js.map +1 -1
  35. package/dist/config/profiles.d.ts +12 -0
  36. package/dist/config/profiles.js +39 -4
  37. package/dist/config/profiles.js.map +1 -1
  38. package/dist/context/SessionStartSequence.js +13 -4
  39. package/dist/context/SessionStartSequence.js.map +1 -1
  40. package/dist/core/ExternalCommand.d.ts +9 -0
  41. package/dist/core/ExternalCommand.js +70 -0
  42. package/dist/core/ExternalCommand.js.map +1 -0
  43. package/dist/env/EnvironmentDoctor.d.ts +66 -0
  44. package/dist/env/EnvironmentDoctor.js +365 -0
  45. package/dist/env/EnvironmentDoctor.js.map +1 -0
  46. package/dist/i18n/Language.d.ts +9 -0
  47. package/dist/i18n/Language.js +38 -0
  48. package/dist/i18n/Language.js.map +1 -0
  49. package/dist/index.d.ts +2 -0
  50. package/dist/index.js +2 -0
  51. package/dist/index.js.map +1 -1
  52. package/dist/knowledge/CerebrumManager.d.ts +2 -2
  53. package/dist/knowledge/CerebrumManager.js.map +1 -1
  54. package/dist/knowledge/GraphifyKnowledgeBase.d.ts +38 -0
  55. package/dist/knowledge/GraphifyKnowledgeBase.js +409 -0
  56. package/dist/knowledge/GraphifyKnowledgeBase.js.map +1 -0
  57. package/dist/memory/MemoryFabric.js +1 -0
  58. package/dist/memory/MemoryFabric.js.map +1 -1
  59. package/dist/memory/MemoryIntelligence.d.ts +42 -0
  60. package/dist/memory/MemoryIntelligence.js +215 -0
  61. package/dist/memory/MemoryIntelligence.js.map +1 -0
  62. package/dist/memory/MemoryProviders.d.ts +22 -0
  63. package/dist/memory/MemoryProviders.js +171 -5
  64. package/dist/memory/MemoryProviders.js.map +1 -1
  65. package/dist/memory/index.d.ts +1 -0
  66. package/dist/memory/index.js +1 -0
  67. package/dist/memory/index.js.map +1 -1
  68. package/dist/prompts/PromptOptimizer.d.ts +42 -0
  69. package/dist/prompts/PromptOptimizer.js +309 -0
  70. package/dist/prompts/PromptOptimizer.js.map +1 -0
  71. package/dist/runtime/AiOsRuntime.d.ts +2 -0
  72. package/dist/runtime/AiOsRuntime.js +2 -0
  73. package/dist/runtime/AiOsRuntime.js.map +1 -1
  74. package/dist/runtime/ExecutionLedger.d.ts +46 -0
  75. package/dist/runtime/ExecutionLedger.js +71 -0
  76. package/dist/runtime/ExecutionLedger.js.map +1 -0
  77. package/dist/runtime/index.d.ts +1 -0
  78. package/dist/runtime/index.js +1 -0
  79. package/dist/runtime/index.js.map +1 -1
  80. package/dist/setup/SetupWizard.d.ts +42 -0
  81. package/dist/setup/SetupWizard.js +156 -0
  82. package/dist/setup/SetupWizard.js.map +1 -0
  83. package/dist/skills/SkillRepository.js +7 -7
  84. package/dist/skills/SkillRepository.js.map +1 -1
  85. package/dist/skills/routing/SkillPolicy.js +2 -2
  86. package/dist/skills/routing/SkillPolicy.js.map +1 -1
  87. package/dist/testing/DiffTestSelector.js +1 -1
  88. package/dist/testing/DiffTestSelector.js.map +1 -1
  89. package/dist/tools/RtkRuntime.d.ts +9 -0
  90. package/dist/tools/RtkRuntime.js +43 -0
  91. package/dist/tools/RtkRuntime.js.map +1 -0
  92. package/dist/tools/ToolCapabilityRegistry.d.ts +5 -0
  93. package/dist/tools/ToolCapabilityRegistry.js +75 -13
  94. package/dist/tools/ToolCapabilityRegistry.js.map +1 -1
  95. package/dist/tools/ToolOrchestrator.js +6 -4
  96. package/dist/tools/ToolOrchestrator.js.map +1 -1
  97. package/dist/tools/ToolPolicy.js +16 -1
  98. package/dist/tools/ToolPolicy.js.map +1 -1
  99. package/dist/workflow/AdaptiveWorkflowRouter.d.ts +1 -0
  100. package/dist/workflow/AdaptiveWorkflowRouter.js +3 -0
  101. package/dist/workflow/AdaptiveWorkflowRouter.js.map +1 -1
  102. package/dist/workflow/CommitDiscipline.d.ts +68 -0
  103. package/dist/workflow/CommitDiscipline.js +328 -0
  104. package/dist/workflow/CommitDiscipline.js.map +1 -0
  105. package/dist/workflow/CrossRepoOrchestrator.d.ts +92 -0
  106. package/dist/workflow/CrossRepoOrchestrator.js +408 -0
  107. package/dist/workflow/CrossRepoOrchestrator.js.map +1 -0
  108. package/dist/workflow/GateCatalog.d.ts +61 -0
  109. package/dist/workflow/GateCatalog.js +212 -0
  110. package/dist/workflow/GateCatalog.js.map +1 -0
  111. package/dist/workflow/GovernanceRoi.d.ts +52 -0
  112. package/dist/workflow/GovernanceRoi.js +204 -0
  113. package/dist/workflow/GovernanceRoi.js.map +1 -0
  114. package/dist/workflow/GovernanceTemplatePacks.js +19 -4
  115. package/dist/workflow/GovernanceTemplatePacks.js.map +1 -1
  116. package/dist/workflow/GovernanceTemplates.js +2 -2
  117. package/dist/workflow/McpGovernance.d.ts +63 -0
  118. package/dist/workflow/McpGovernance.js +198 -0
  119. package/dist/workflow/McpGovernance.js.map +1 -0
  120. package/dist/workflow/SessionCoordinator.d.ts +103 -0
  121. package/dist/workflow/SessionCoordinator.js +401 -0
  122. package/dist/workflow/SessionCoordinator.js.map +1 -0
  123. package/dist/workflow/SessionPreamble.js +7 -2
  124. package/dist/workflow/SessionPreamble.js.map +1 -1
  125. package/dist/workflow/TaskDependencyGraph.d.ts +73 -0
  126. package/dist/workflow/TaskDependencyGraph.js +245 -0
  127. package/dist/workflow/TaskDependencyGraph.js.map +1 -0
  128. package/dist/workflow/TaskScoreEngine.d.ts +42 -0
  129. package/dist/workflow/TaskScoreEngine.js +181 -0
  130. package/dist/workflow/TaskScoreEngine.js.map +1 -0
  131. package/dist/workflow/WorkflowTemplates.d.ts +38 -0
  132. package/dist/workflow/WorkflowTemplates.js +371 -0
  133. package/dist/workflow/WorkflowTemplates.js.map +1 -0
  134. package/dist/workflow/WorkspacePolicy.d.ts +46 -0
  135. package/dist/workflow/WorkspacePolicy.js +141 -0
  136. package/dist/workflow/WorkspacePolicy.js.map +1 -0
  137. package/dist/workflow/WorkspaceTopology.d.ts +3 -0
  138. package/dist/workflow/WorkspaceTopology.js +40 -3
  139. package/dist/workflow/WorkspaceTopology.js.map +1 -1
  140. package/dist/workflow/gates/GateSystem.js +14 -11
  141. package/dist/workflow/gates/GateSystem.js.map +1 -1
  142. package/dist/workflow/index.d.ts +9 -0
  143. package/dist/workflow/index.js +9 -0
  144. package/dist/workflow/index.js.map +1 -1
  145. package/docs/CODE_INTELLIGENCE.md +48 -6
  146. package/docs/EXTERNAL_REFERENCES.md +5 -2
  147. package/docs/MEMORY_FABRIC.md +28 -3
  148. package/docs/SKILL-REPOSITORY.md +3 -3
  149. package/docs/THIRD_PARTY_SKILLS.md +50 -1
  150. package/docs/guides/GETTING_STARTED.md +24 -0
  151. package/docs/start/quickstart.md +107 -69
  152. package/docs/workflow/GATES_AND_SCORE.md +56 -0
  153. package/docs/workflow/PROMPT_OPTIMIZATION.md +44 -0
  154. package/docs/workflow/README.md +7 -0
  155. package/docs/workflow/node-library.md +3 -3
  156. package/docs/workflow/templates/skill-plan.md +1 -1
  157. package/package.json +13 -5
  158. package/scripts/workflow/provider-rehearsal.mjs +425 -0
  159. package/scripts/workflow/setup-smoke.mjs +299 -0
@@ -0,0 +1,371 @@
1
+ // SCALE Engine — Adaptive Workflow Templates (v0.35.0)
2
+ // Composable workflow template system with profile-based selection
3
+ // ============================================================================
4
+ // Built-in Templates
5
+ // ============================================================================
6
+ const LIGHT_DOCS = {
7
+ id: 'light-docs',
8
+ name: 'Light Documentation',
9
+ description: 'Lightweight template for documentation and config changes',
10
+ profile: 'light',
11
+ riskLevel: 'low',
12
+ steps: [
13
+ {
14
+ id: 'explore',
15
+ type: 'explore',
16
+ name: 'Explore',
17
+ description: 'Understand existing documentation structure',
18
+ required: true,
19
+ riskLevel: 'low',
20
+ estimatedDuration: '5min',
21
+ evidenceRequired: [],
22
+ tools: ['Read', 'Glob'],
23
+ },
24
+ {
25
+ id: 'build',
26
+ type: 'build',
27
+ name: 'Build',
28
+ description: 'Write or update documentation',
29
+ required: true,
30
+ riskLevel: 'low',
31
+ estimatedDuration: '15min',
32
+ evidenceRequired: [],
33
+ tools: ['Edit', 'Write'],
34
+ },
35
+ {
36
+ id: 'verify',
37
+ type: 'verify',
38
+ name: 'Verify',
39
+ description: 'Check links, formatting, and accuracy',
40
+ required: false,
41
+ riskLevel: 'low',
42
+ estimatedDuration: '5min',
43
+ evidenceRequired: [],
44
+ tools: ['Read'],
45
+ skipConditions: ['No structural changes'],
46
+ },
47
+ ],
48
+ exitCriteria: ['Documentation updated and readable'],
49
+ tags: ['docs', 'config', 'lightweight'],
50
+ };
51
+ const STANDARD_CODE = {
52
+ id: 'standard-code',
53
+ name: 'Standard Code',
54
+ description: 'Standard template for typical code changes',
55
+ profile: 'standard',
56
+ riskLevel: 'medium',
57
+ steps: [
58
+ {
59
+ id: 'explore',
60
+ type: 'explore',
61
+ name: 'Explore',
62
+ description: 'Understand codebase structure and dependencies',
63
+ required: true,
64
+ riskLevel: 'low',
65
+ estimatedDuration: '10min',
66
+ evidenceRequired: [],
67
+ tools: ['Read', 'Glob', 'Grep'],
68
+ },
69
+ {
70
+ id: 'plan',
71
+ type: 'plan',
72
+ name: 'Plan',
73
+ description: 'Design implementation approach',
74
+ required: true,
75
+ riskLevel: 'low',
76
+ estimatedDuration: '10min',
77
+ evidenceRequired: [],
78
+ tools: ['Read'],
79
+ },
80
+ {
81
+ id: 'build',
82
+ type: 'build',
83
+ name: 'Build',
84
+ description: 'Implement changes with tests',
85
+ required: true,
86
+ riskLevel: 'medium',
87
+ estimatedDuration: '30min',
88
+ evidenceRequired: [],
89
+ tools: ['Edit', 'Write', 'Bash'],
90
+ },
91
+ {
92
+ id: 'verify',
93
+ type: 'verify',
94
+ name: 'Verify',
95
+ description: 'Run tests and type checks',
96
+ required: true,
97
+ riskLevel: 'medium',
98
+ estimatedDuration: '10min',
99
+ evidenceRequired: ['test-results', 'typecheck-results'],
100
+ tools: ['Bash'],
101
+ },
102
+ {
103
+ id: 'review',
104
+ type: 'review',
105
+ name: 'Review',
106
+ description: 'Code review for quality and security',
107
+ required: false,
108
+ riskLevel: 'medium',
109
+ estimatedDuration: '10min',
110
+ evidenceRequired: [],
111
+ tools: ['Read', 'Grep'],
112
+ skipConditions: ['Trivial changes under 20 lines'],
113
+ },
114
+ ],
115
+ exitCriteria: ['All tests pass', 'Type check clean', 'Code reviewed'],
116
+ tags: ['code', 'standard', 'feature'],
117
+ };
118
+ const STRICT_FEATURE = {
119
+ id: 'strict-feature',
120
+ name: 'Strict Feature',
121
+ description: 'Strict template for high-risk features with full gates',
122
+ profile: 'strict',
123
+ riskLevel: 'high',
124
+ steps: [
125
+ {
126
+ id: 'explore',
127
+ type: 'explore',
128
+ name: 'Explore',
129
+ description: 'Deep codebase analysis with dependency mapping',
130
+ required: true,
131
+ riskLevel: 'low',
132
+ estimatedDuration: '15min',
133
+ evidenceRequired: [],
134
+ tools: ['Read', 'Glob', 'Grep'],
135
+ },
136
+ {
137
+ id: 'plan',
138
+ type: 'plan',
139
+ name: 'Plan',
140
+ description: 'Detailed implementation plan with risk assessment',
141
+ required: true,
142
+ riskLevel: 'medium',
143
+ estimatedDuration: '15min',
144
+ evidenceRequired: ['risk-assessment'],
145
+ tools: ['Read'],
146
+ },
147
+ {
148
+ id: 'build',
149
+ type: 'build',
150
+ name: 'Build',
151
+ description: 'Implement with TDD and defensive coding',
152
+ required: true,
153
+ riskLevel: 'high',
154
+ estimatedDuration: '60min',
155
+ evidenceRequired: [],
156
+ tools: ['Edit', 'Write', 'Bash'],
157
+ },
158
+ {
159
+ id: 'verify',
160
+ type: 'verify',
161
+ name: 'Verify',
162
+ description: 'Full test suite + coverage + type check',
163
+ required: true,
164
+ riskLevel: 'high',
165
+ estimatedDuration: '15min',
166
+ evidenceRequired: ['test-results', 'typecheck-results', 'coverage-report'],
167
+ tools: ['Bash'],
168
+ },
169
+ {
170
+ id: 'review',
171
+ type: 'review',
172
+ name: 'Review',
173
+ description: 'Multi-role review (eng-manager + security-reviewer)',
174
+ required: true,
175
+ riskLevel: 'high',
176
+ estimatedDuration: '15min',
177
+ evidenceRequired: ['review-report'],
178
+ tools: ['Read', 'Grep'],
179
+ },
180
+ {
181
+ id: 'ship',
182
+ type: 'ship',
183
+ name: 'Ship',
184
+ description: 'Ship pipeline with version bump and PR',
185
+ required: false,
186
+ riskLevel: 'high',
187
+ estimatedDuration: '10min',
188
+ evidenceRequired: ['ship-report'],
189
+ tools: ['Bash'],
190
+ skipConditions: ['Not ready for release'],
191
+ },
192
+ ],
193
+ exitCriteria: ['All tests pass', 'Coverage >= 80%', 'Security review passed', 'Code reviewed by 2+ roles'],
194
+ tags: ['feature', 'strict', 'high-risk'],
195
+ };
196
+ const CRITICAL_SECURITY = {
197
+ id: 'critical-security',
198
+ name: 'Critical Security',
199
+ description: 'Maximum security template for auth, crypto, and sensitive changes',
200
+ profile: 'critical',
201
+ riskLevel: 'critical',
202
+ steps: [
203
+ {
204
+ id: 'explore',
205
+ type: 'explore',
206
+ name: 'Explore',
207
+ description: 'Full codebase audit with OWASP/STRIDE analysis',
208
+ required: true,
209
+ riskLevel: 'medium',
210
+ estimatedDuration: '20min',
211
+ evidenceRequired: [],
212
+ tools: ['Read', 'Glob', 'Grep'],
213
+ },
214
+ {
215
+ id: 'plan',
216
+ type: 'plan',
217
+ name: 'Plan',
218
+ description: 'Security-focused plan with threat model',
219
+ required: true,
220
+ riskLevel: 'high',
221
+ estimatedDuration: '20min',
222
+ evidenceRequired: ['threat-model', 'risk-assessment'],
223
+ tools: ['Read'],
224
+ },
225
+ {
226
+ id: 'build',
227
+ type: 'build',
228
+ name: 'Build',
229
+ description: 'Implement with security-first patterns',
230
+ required: true,
231
+ riskLevel: 'critical',
232
+ estimatedDuration: '60min',
233
+ evidenceRequired: [],
234
+ tools: ['Edit', 'Write', 'Bash'],
235
+ },
236
+ {
237
+ id: 'verify',
238
+ type: 'verify',
239
+ name: 'Verify',
240
+ description: 'Full test suite + security audit + dependency audit',
241
+ required: true,
242
+ riskLevel: 'critical',
243
+ estimatedDuration: '20min',
244
+ evidenceRequired: ['test-results', 'typecheck-results', 'security-audit', 'dependency-audit'],
245
+ tools: ['Bash'],
246
+ },
247
+ {
248
+ id: 'review',
249
+ type: 'review',
250
+ name: 'Review',
251
+ description: 'Security-reviewer + eng-manager mandatory review',
252
+ required: true,
253
+ riskLevel: 'critical',
254
+ estimatedDuration: '20min',
255
+ evidenceRequired: ['security-review-report', 'architecture-review-report'],
256
+ tools: ['Read', 'Grep'],
257
+ },
258
+ {
259
+ id: 'ship',
260
+ type: 'ship',
261
+ name: 'Ship',
262
+ description: 'Controlled ship with rollback plan',
263
+ required: true,
264
+ riskLevel: 'critical',
265
+ estimatedDuration: '15min',
266
+ evidenceRequired: ['ship-report', 'rollback-plan'],
267
+ tools: ['Bash'],
268
+ },
269
+ ],
270
+ exitCriteria: [
271
+ 'All tests pass',
272
+ 'Security audit clean',
273
+ 'OWASP Top 10 checked',
274
+ 'STRIDE analysis done',
275
+ 'Dependency audit clean',
276
+ 'Reviewed by security-reviewer',
277
+ 'Rollback plan documented',
278
+ ],
279
+ tags: ['security', 'critical', 'auth', 'crypto'],
280
+ };
281
+ export const WORKFLOW_TEMPLATES = {
282
+ 'light-docs': LIGHT_DOCS,
283
+ 'standard-code': STANDARD_CODE,
284
+ 'strict-feature': STRICT_FEATURE,
285
+ 'critical-security': CRITICAL_SECURITY,
286
+ };
287
+ const PROFILE_TEMPLATE_MAP = {
288
+ light: 'light-docs',
289
+ standard: 'standard-code',
290
+ strict: 'strict-feature',
291
+ critical: 'critical-security',
292
+ };
293
+ // ============================================================================
294
+ // Public API
295
+ // ============================================================================
296
+ export function selectTemplate(input) {
297
+ const { profile, task, level, riskFactors } = input;
298
+ // Check for security keywords → force critical template
299
+ const securityKeywords = ['auth', 'security', 'crypto', 'password', 'token', 'secret', 'credential', 'oauth', 'jwt'];
300
+ const taskLower = task.toLowerCase();
301
+ if (securityKeywords.some(kw => taskLower.includes(kw))) {
302
+ return WORKFLOW_TEMPLATES['critical-security'];
303
+ }
304
+ // Check for doc keywords → prefer light template
305
+ const docKeywords = ['readme', 'docs', 'documentation', 'changelog', 'comment'];
306
+ if (docKeywords.some(kw => taskLower.includes(kw)) && profile === 'light') {
307
+ return WORKFLOW_TEMPLATES['light-docs'];
308
+ }
309
+ // Risk factor escalation
310
+ if (riskFactors && riskFactors.length >= 3 && profileRank(profile) < profileRank('strict')) {
311
+ return WORKFLOW_TEMPLATES['strict-feature'];
312
+ }
313
+ // Level-based escalation
314
+ if ((level === 'CRITICAL' || level === 'L') && profileRank(profile) < profileRank('strict')) {
315
+ return WORKFLOW_TEMPLATES['strict-feature'];
316
+ }
317
+ // Default: use profile mapping
318
+ const templateId = PROFILE_TEMPLATE_MAP[profile] ?? 'standard-code';
319
+ return WORKFLOW_TEMPLATES[templateId];
320
+ }
321
+ export function customizeTemplate(template, overrides) {
322
+ return {
323
+ ...template,
324
+ ...overrides,
325
+ steps: overrides.steps ?? template.steps,
326
+ exitCriteria: overrides.exitCriteria ?? template.exitCriteria,
327
+ tags: overrides.tags ?? template.tags,
328
+ };
329
+ }
330
+ export function listTemplates() {
331
+ return Object.values(WORKFLOW_TEMPLATES);
332
+ }
333
+ export function getTemplateSteps(templateId) {
334
+ return WORKFLOW_TEMPLATES[templateId]?.steps ?? [];
335
+ }
336
+ export function formatTemplateForAgent(template) {
337
+ const lines = [
338
+ `# Workflow Template: ${template.name}`,
339
+ '',
340
+ `**Profile:** ${template.profile} | **Risk:** ${template.riskLevel}`,
341
+ `**Description:** ${template.description}`,
342
+ '',
343
+ '## Steps',
344
+ '',
345
+ ];
346
+ for (const step of template.steps) {
347
+ const required = step.required ? '*(required)*' : '*(optional)*';
348
+ lines.push(`### ${step.name} ${required}`);
349
+ lines.push(`- **Type:** ${step.type}`);
350
+ lines.push(`- **Risk:** ${step.riskLevel}`);
351
+ lines.push(`- **Duration:** ${step.estimatedDuration}`);
352
+ lines.push(`- **Description:** ${step.description}`);
353
+ if (step.evidenceRequired.length > 0) {
354
+ lines.push(`- **Evidence:** ${step.evidenceRequired.join(', ')}`);
355
+ }
356
+ if (step.skipConditions && step.skipConditions.length > 0) {
357
+ lines.push(`- **Skip when:** ${step.skipConditions.join('; ')}`);
358
+ }
359
+ lines.push('');
360
+ }
361
+ lines.push('## Exit Criteria');
362
+ for (const criteria of template.exitCriteria) {
363
+ lines.push(`- ${criteria}`);
364
+ }
365
+ return lines.join('\n');
366
+ }
367
+ function profileRank(profile) {
368
+ const order = ['light', 'standard', 'strict', 'critical'];
369
+ return order.indexOf(profile);
370
+ }
371
+ //# sourceMappingURL=WorkflowTemplates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkflowTemplates.js","sourceRoot":"","sources":["../../src/workflow/WorkflowTemplates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ export type PolicyEnforcement = 'advisory' | 'warn' | 'block';
2
+ export type ResourceType = 'file' | 'directory' | 'tool' | 'branch';
3
+ export interface ResourcePolicy {
4
+ resource: string;
5
+ type: ResourceType;
6
+ owner?: string;
7
+ allowedAgents?: string[];
8
+ enforcement: PolicyEnforcement;
9
+ reason?: string;
10
+ }
11
+ export interface WorkspacePolicyConfig {
12
+ version: number;
13
+ defaultEnforcement: PolicyEnforcement;
14
+ resources: ResourcePolicy[];
15
+ conflictResolution: 'first-wins' | 'owner-priority' | 'block-all';
16
+ }
17
+ export interface PolicyViolation {
18
+ id: string;
19
+ ts: string;
20
+ agentId: string;
21
+ resource: string;
22
+ policy: ResourcePolicy;
23
+ action: 'read' | 'write' | 'delete';
24
+ verdict: 'allowed' | 'warned' | 'blocked';
25
+ message: string;
26
+ }
27
+ export interface PolicyCheckResult {
28
+ allowed: boolean;
29
+ violations: PolicyViolation[];
30
+ message?: string;
31
+ }
32
+ export declare class WorkspacePolicyEngine {
33
+ private config;
34
+ private violations;
35
+ private now;
36
+ constructor(config?: WorkspacePolicyConfig, now?: () => Date);
37
+ checkAccess(agentId: string, resource: string, action: 'read' | 'write' | 'delete'): PolicyCheckResult;
38
+ addPolicy(policy: ResourcePolicy): void;
39
+ removePolicy(resource: string): void;
40
+ listPolicies(): ResourcePolicy[];
41
+ getViolations(agentId?: string): PolicyViolation[];
42
+ getConfig(): WorkspacePolicyConfig;
43
+ loadFromProject(projectDir?: string): void;
44
+ private evaluatePolicy;
45
+ private buildMessage;
46
+ }
@@ -0,0 +1,141 @@
1
+ // SCALE Engine — Workspace Policy Runtime Enforcement (v0.34.0)
2
+ // Runtime workspace policy engine with file access rules, resource locks, agent boundaries
3
+ import { existsSync, readFileSync } from 'node:fs';
4
+ import { join, resolve } from 'node:path';
5
+ import yaml from 'js-yaml';
6
+ import { randomUUID } from 'node:crypto';
7
+ const DEFAULT_CONFIG = {
8
+ version: 1,
9
+ defaultEnforcement: 'advisory',
10
+ resources: [],
11
+ conflictResolution: 'owner-priority',
12
+ };
13
+ export class WorkspacePolicyEngine {
14
+ constructor(config, now) {
15
+ this.violations = [];
16
+ this.config = config ?? { ...DEFAULT_CONFIG };
17
+ this.now = now ?? (() => new Date());
18
+ }
19
+ checkAccess(agentId, resource, action) {
20
+ const matchingPolicies = this.config.resources.filter(p => matchGlob(resource, p.resource));
21
+ if (matchingPolicies.length === 0) {
22
+ return { allowed: true, violations: [] };
23
+ }
24
+ const violations = [];
25
+ for (const policy of matchingPolicies) {
26
+ const verdict = this.evaluatePolicy(agentId, resource, action, policy);
27
+ if (verdict !== 'allowed') {
28
+ const violation = {
29
+ id: `PV-${Date.now()}-${randomUUID().slice(0, 8)}`,
30
+ ts: this.now().toISOString(),
31
+ agentId,
32
+ resource,
33
+ policy,
34
+ action,
35
+ verdict,
36
+ message: this.buildMessage(agentId, resource, action, policy, verdict),
37
+ };
38
+ violations.push(violation);
39
+ this.violations.push(violation);
40
+ }
41
+ }
42
+ const blocked = violations.some(v => v.verdict === 'blocked');
43
+ return {
44
+ allowed: !blocked,
45
+ violations,
46
+ message: blocked
47
+ ? `Access blocked: ${violations.filter(v => v.verdict === 'blocked').map(v => v.message).join('; ')}`
48
+ : undefined,
49
+ };
50
+ }
51
+ addPolicy(policy) {
52
+ const existing = this.config.resources.findIndex(p => p.resource === policy.resource);
53
+ if (existing >= 0) {
54
+ this.config.resources[existing] = policy;
55
+ }
56
+ else {
57
+ this.config.resources.push(policy);
58
+ }
59
+ }
60
+ removePolicy(resource) {
61
+ this.config.resources = this.config.resources.filter(p => p.resource !== resource);
62
+ }
63
+ listPolicies() {
64
+ return [...this.config.resources];
65
+ }
66
+ getViolations(agentId) {
67
+ if (agentId)
68
+ return this.violations.filter(v => v.agentId === agentId);
69
+ return [...this.violations];
70
+ }
71
+ getConfig() {
72
+ return { ...this.config };
73
+ }
74
+ loadFromProject(projectDir) {
75
+ const dir = resolve(projectDir ?? process.cwd());
76
+ const policyPath = join(dir, '.scale', 'workspace-policy.yaml');
77
+ if (!existsSync(policyPath))
78
+ return;
79
+ try {
80
+ const content = readFileSync(policyPath, 'utf-8');
81
+ const parsed = yaml.load(content);
82
+ if (parsed.version)
83
+ this.config.version = parsed.version;
84
+ if (parsed.defaultEnforcement)
85
+ this.config.defaultEnforcement = parsed.defaultEnforcement;
86
+ if (parsed.conflictResolution)
87
+ this.config.conflictResolution = parsed.conflictResolution;
88
+ if (Array.isArray(parsed.resources))
89
+ this.config.resources = parsed.resources;
90
+ }
91
+ catch {
92
+ // ignore parse errors, keep existing config
93
+ }
94
+ }
95
+ evaluatePolicy(agentId, _resource, _action, policy) {
96
+ // Owner always gets full access
97
+ if (policy.owner && policy.owner === agentId) {
98
+ return 'allowed';
99
+ }
100
+ // Check allowedAgents list
101
+ if (policy.allowedAgents && policy.allowedAgents.length > 0) {
102
+ if (!policy.allowedAgents.includes(agentId)) {
103
+ return policy.enforcement === 'block' ? 'blocked' : policy.enforcement === 'warn' ? 'warned' : 'allowed';
104
+ }
105
+ return 'allowed';
106
+ }
107
+ // Non-owner with owner-priority conflict resolution
108
+ if (policy.owner && this.config.conflictResolution === 'owner-priority') {
109
+ return policy.enforcement === 'block' ? 'blocked' : policy.enforcement === 'warn' ? 'warned' : 'allowed';
110
+ }
111
+ // Default enforcement for write/delete on directories
112
+ if (policy.type === 'directory' && (_action === 'write' || _action === 'delete')) {
113
+ if (policy.enforcement === 'block')
114
+ return 'blocked';
115
+ if (policy.enforcement === 'warn')
116
+ return 'warned';
117
+ }
118
+ return 'allowed';
119
+ }
120
+ buildMessage(agentId, resource, action, policy, verdict) {
121
+ const parts = [
122
+ `Agent "${agentId}" ${verdict} from ${action} "${resource}"`,
123
+ ];
124
+ if (policy.owner)
125
+ parts.push(`(owner: ${policy.owner})`);
126
+ if (policy.reason)
127
+ parts.push(`— ${policy.reason}`);
128
+ return parts.join(' ');
129
+ }
130
+ }
131
+ function matchGlob(filePath, pattern) {
132
+ const regexStr = pattern
133
+ .replace(/\./g, '\\.')
134
+ .replace(/\*\*/g, '{{GLOBSTAR}}')
135
+ .replace(/\*/g, '[^/]*')
136
+ .replace(/\{\{GLOBSTAR\}\}/g, '.*')
137
+ .replace(/\?/g, '[^/]');
138
+ const regex = new RegExp(`^${regexStr}$`);
139
+ return regex.test(filePath);
140
+ }
141
+ //# sourceMappingURL=WorkspacePolicy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkspacePolicy.js","sourceRoot":"","sources":["../../src/workflow/WorkspacePolicy.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,8 @@ export interface WorkspaceRepositoryConfig {
8
8
  services?: string[];
9
9
  branchPattern?: string;
10
10
  remote?: string;
11
+ dependsOn?: string[];
12
+ pointerFile?: string;
11
13
  }
12
14
  export interface WorkspaceBranchPolicy {
13
15
  mode?: 'gitlab-flow';
@@ -53,3 +55,4 @@ export declare function resolveWorkspaceTopology(options?: WorkspaceTopologyOpti
53
55
  export declare function writeWorkspaceTopologyTemplate(projectDir?: string, options?: WorkspaceTopologyTemplateOptions, scaleDir?: string): string;
54
56
  export declare function workspaceTopologyTemplate(options?: WorkspaceTopologyTemplateOptions): string;
55
57
  export declare function workspaceTopologyPath(projectDir?: string, scaleDir?: string): string;
58
+ export declare function resolveRepositoryPath(projectDir: string, repo: WorkspaceRepositoryConfig): string;