@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.
- package/README.en.md +86 -374
- package/README.md +89 -547
- package/dist/api/cli.js +189 -12
- package/dist/api/cli.js.map +1 -1
- package/dist/api/doctor.d.ts +38 -3
- package/dist/api/doctor.js +269 -44
- package/dist/api/doctor.js.map +1 -1
- package/dist/api/mcp.js +2 -2
- package/dist/api/mcp.js.map +1 -1
- package/dist/api/quickstart.d.ts +34 -4
- package/dist/api/quickstart.js +90 -73
- package/dist/api/quickstart.js.map +1 -1
- package/dist/bootstrap/DependencyBootstrap.d.ts +89 -0
- package/dist/bootstrap/DependencyBootstrap.js +441 -0
- package/dist/bootstrap/DependencyBootstrap.js.map +1 -0
- package/dist/capabilities/InstalledSkillsIntegration.js +14 -6
- package/dist/capabilities/InstalledSkillsIntegration.js.map +1 -1
- package/dist/codegraph/CodeIntelligence.d.ts +12 -0
- package/dist/codegraph/CodeIntelligence.js +251 -30
- package/dist/codegraph/CodeIntelligence.js.map +1 -1
- package/dist/config/profiles.d.ts +12 -0
- package/dist/config/profiles.js +39 -4
- package/dist/config/profiles.js.map +1 -1
- package/dist/core/ExternalCommand.d.ts +9 -0
- package/dist/core/ExternalCommand.js +56 -0
- package/dist/core/ExternalCommand.js.map +1 -0
- 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/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/knowledge/CerebrumManager.d.ts +2 -2
- package/dist/knowledge/CerebrumManager.js.map +1 -1
- package/dist/knowledge/GraphifyKnowledgeBase.d.ts +38 -0
- package/dist/knowledge/GraphifyKnowledgeBase.js +409 -0
- package/dist/knowledge/GraphifyKnowledgeBase.js.map +1 -0
- package/dist/memory/MemoryFabric.js +1 -0
- package/dist/memory/MemoryFabric.js.map +1 -1
- package/dist/memory/MemoryIntelligence.d.ts +42 -0
- package/dist/memory/MemoryIntelligence.js +215 -0
- package/dist/memory/MemoryIntelligence.js.map +1 -0
- package/dist/memory/MemoryProviders.d.ts +22 -0
- package/dist/memory/MemoryProviders.js +138 -5
- package/dist/memory/MemoryProviders.js.map +1 -1
- package/dist/memory/index.d.ts +1 -0
- package/dist/memory/index.js +1 -0
- package/dist/memory/index.js.map +1 -1
- package/dist/runtime/AiOsRuntime.d.ts +101 -1
- package/dist/runtime/AiOsRuntime.js +464 -14
- package/dist/runtime/AiOsRuntime.js.map +1 -1
- package/dist/runtime/ExecutionLedger.d.ts +46 -0
- package/dist/runtime/ExecutionLedger.js +71 -0
- package/dist/runtime/ExecutionLedger.js.map +1 -0
- package/dist/runtime/index.d.ts +1 -0
- package/dist/runtime/index.js +1 -0
- package/dist/runtime/index.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/SkillRepository.js +5 -5
- package/dist/skills/SkillRepository.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/skills/routing/SkillPolicy.js +2 -2
- package/dist/skills/routing/SkillPolicy.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/tools/RtkRuntime.d.ts +9 -0
- package/dist/tools/RtkRuntime.js +43 -0
- package/dist/tools/RtkRuntime.js.map +1 -0
- package/dist/tools/ToolCapabilityRegistry.d.ts +1 -0
- package/dist/tools/ToolCapabilityRegistry.js +68 -11
- package/dist/tools/ToolCapabilityRegistry.js.map +1 -1
- package/dist/tools/ToolOrchestrator.js +6 -4
- package/dist/tools/ToolOrchestrator.js.map +1 -1
- package/dist/tools/ToolPolicy.js +16 -1
- package/dist/tools/ToolPolicy.js.map +1 -1
- package/dist/workflow/AdaptiveWorkflowRouter.d.ts +38 -0
- package/dist/workflow/AdaptiveWorkflowRouter.js +214 -0
- package/dist/workflow/AdaptiveWorkflowRouter.js.map +1 -0
- package/dist/workflow/CommitDiscipline.d.ts +68 -0
- package/dist/workflow/CommitDiscipline.js +327 -0
- package/dist/workflow/CommitDiscipline.js.map +1 -0
- package/dist/workflow/CrossRepoOrchestrator.d.ts +92 -0
- package/dist/workflow/CrossRepoOrchestrator.js +400 -0
- package/dist/workflow/CrossRepoOrchestrator.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/GovernanceRoi.d.ts +52 -0
- package/dist/workflow/GovernanceRoi.js +204 -0
- package/dist/workflow/GovernanceRoi.js.map +1 -0
- package/dist/workflow/GovernanceTemplates.js +2 -2
- package/dist/workflow/McpGovernance.d.ts +63 -0
- package/dist/workflow/McpGovernance.js +198 -0
- package/dist/workflow/McpGovernance.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/SessionCoordinator.d.ts +103 -0
- package/dist/workflow/SessionCoordinator.js +401 -0
- package/dist/workflow/SessionCoordinator.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/TaskDependencyGraph.d.ts +73 -0
- package/dist/workflow/TaskDependencyGraph.js +245 -0
- package/dist/workflow/TaskDependencyGraph.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/WorkflowTemplates.d.ts +38 -0
- package/dist/workflow/WorkflowTemplates.js +371 -0
- package/dist/workflow/WorkflowTemplates.js.map +1 -0
- package/dist/workflow/WorkspacePolicy.d.ts +46 -0
- package/dist/workflow/WorkspacePolicy.js +141 -0
- package/dist/workflow/WorkspacePolicy.js.map +1 -0
- package/dist/workflow/gates/GateSystem.js +12 -9
- package/dist/workflow/gates/GateSystem.js.map +1 -1
- package/dist/workflow/index.d.ts +12 -0
- package/dist/workflow/index.js +12 -0
- package/dist/workflow/index.js.map +1 -1
- package/docs/AI_ENGINEERING_OS_POSITIONING.md +9 -0
- package/docs/CODE_INTELLIGENCE.md +22 -5
- package/docs/CONTEXT_BUDGET.md +1 -1
- package/docs/EXTERNAL_REFERENCES.md +5 -2
- package/docs/MEMORY_FABRIC.md +7 -3
- package/docs/SKILL-REPOSITORY.md +3 -3
- package/docs/start/quickstart.md +11 -0
- package/docs/workflow/templates/skill-plan.md +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
// SCALE Engine — Adaptive Workflow Router v1
|
|
2
|
+
// Routes evaluator risk/uncertainty and tool strategy signals into a concrete workflow profile.
|
|
3
|
+
import { selectTemplate } from './WorkflowTemplates.js';
|
|
4
|
+
const PROFILE_ORDER = ['light', 'standard', 'strict', 'critical'];
|
|
5
|
+
export function routeAdaptiveWorkflow(input) {
|
|
6
|
+
const { governance, evaluator, toolStrategy } = input;
|
|
7
|
+
const reasons = [];
|
|
8
|
+
const gateOverrides = [];
|
|
9
|
+
const signals = {
|
|
10
|
+
governanceMode: governance.effectiveMode,
|
|
11
|
+
evaluatorRisk: evaluator.riskLevel,
|
|
12
|
+
uncertaintyScore: evaluator.uncertainty.score,
|
|
13
|
+
toolHighRiskSteps: toolStrategy.summary.highRiskSteps,
|
|
14
|
+
toolFallbackCoverage: toolStrategy.summary.fallbackCoveredSteps / Math.max(1, toolStrategy.summary.totalSteps),
|
|
15
|
+
requiredEvaluatorGates: evaluator.gates.filter(g => g.required).length,
|
|
16
|
+
};
|
|
17
|
+
// Start from governance mode baseline
|
|
18
|
+
let profile = governanceModeToProfile(governance.effectiveMode);
|
|
19
|
+
if (profile !== 'light') {
|
|
20
|
+
reasons.push(`Governance mode "${governance.effectiveMode}" sets baseline profile "${profile}".`);
|
|
21
|
+
}
|
|
22
|
+
// Escalate from evaluator risk
|
|
23
|
+
const evaluatorProfile = evaluatorRiskToProfile(evaluator.riskLevel);
|
|
24
|
+
if (profileRank(evaluatorProfile) > profileRank(profile)) {
|
|
25
|
+
reasons.push(`Evaluator risk "${evaluator.riskLevel}" escalates profile to "${evaluatorProfile}".`);
|
|
26
|
+
profile = evaluatorProfile;
|
|
27
|
+
}
|
|
28
|
+
// Escalate from uncertainty score
|
|
29
|
+
if (evaluator.uncertainty.score >= 0.8) {
|
|
30
|
+
if (profileRank('critical') > profileRank(profile)) {
|
|
31
|
+
reasons.push(`Uncertainty score ${evaluator.uncertainty.score} >= 0.8 escalates profile to "critical".`);
|
|
32
|
+
profile = 'critical';
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
else if (evaluator.uncertainty.score >= 0.6) {
|
|
36
|
+
if (profileRank('strict') > profileRank(profile)) {
|
|
37
|
+
reasons.push(`Uncertainty score ${evaluator.uncertainty.score} >= 0.6 escalates profile to "strict".`);
|
|
38
|
+
profile = 'strict';
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// Escalate from tool strategy high-risk steps
|
|
42
|
+
if (toolStrategy.summary.highRiskSteps >= 2) {
|
|
43
|
+
if (profileRank('strict') > profileRank(profile)) {
|
|
44
|
+
reasons.push(`${toolStrategy.summary.highRiskSteps} high-risk tool steps escalates profile to "strict".`);
|
|
45
|
+
profile = 'strict';
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// Escalate from required security/release evaluator gates
|
|
49
|
+
const hasSecurityGate = evaluator.gates.some(g => g.id === 'security-threat-model' && g.required);
|
|
50
|
+
const hasReleaseGate = evaluator.gates.some(g => g.id === 'release-readiness-review' && g.required);
|
|
51
|
+
if (hasSecurityGate || hasReleaseGate) {
|
|
52
|
+
if (profileRank('critical') > profileRank(profile)) {
|
|
53
|
+
const gateName = hasSecurityGate ? 'security-threat-model' : 'release-readiness-review';
|
|
54
|
+
reasons.push(`Required evaluator gate "${gateName}" escalates profile to "critical".`);
|
|
55
|
+
profile = 'critical';
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// Escalate from fallback coverage gaps
|
|
59
|
+
if (toolStrategy.summary.totalSteps > 0 && signals.toolFallbackCoverage < 0.5) {
|
|
60
|
+
if (profileRank('strict') > profileRank(profile)) {
|
|
61
|
+
reasons.push(`Tool fallback coverage ${Math.round(signals.toolFallbackCoverage * 100)}% < 50% escalates profile to "strict".`);
|
|
62
|
+
profile = 'strict';
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// Build gate overrides from evaluator gates
|
|
66
|
+
for (const gate of evaluator.gates) {
|
|
67
|
+
if (gate.required) {
|
|
68
|
+
gateOverrides.push({
|
|
69
|
+
gateId: gate.id,
|
|
70
|
+
action: 'add',
|
|
71
|
+
reason: gate.reason,
|
|
72
|
+
source: 'evaluator',
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// Build gate overrides from tool strategy high-risk nodes
|
|
77
|
+
if (toolStrategy.summary.highRiskSteps > 0) {
|
|
78
|
+
gateOverrides.push({
|
|
79
|
+
gateId: 'tool-risk-review',
|
|
80
|
+
action: 'add',
|
|
81
|
+
reason: `${toolStrategy.summary.highRiskSteps} high-risk tool step(s) require execution review.`,
|
|
82
|
+
source: 'tool-strategy',
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
const behavioralConstraints = buildBehavioralConstraints(profile, signals);
|
|
86
|
+
const exitCriteria = buildExitCriteria(profile, evaluator, toolStrategy);
|
|
87
|
+
const template = selectTemplate({ profile, task: '', level: profile === 'critical' ? 'CRITICAL' : profile === 'strict' ? 'L' : 'M' });
|
|
88
|
+
return {
|
|
89
|
+
profile,
|
|
90
|
+
templateId: template.id,
|
|
91
|
+
strategy: 'adaptive-workflow-router-v1',
|
|
92
|
+
escalationReasons: reasons,
|
|
93
|
+
gateOverrides,
|
|
94
|
+
behavioralConstraints,
|
|
95
|
+
exitCriteria,
|
|
96
|
+
inputSignals: signals,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
function governanceModeToProfile(mode) {
|
|
100
|
+
switch (mode) {
|
|
101
|
+
case 'minimal': return 'light';
|
|
102
|
+
case 'standard': return 'standard';
|
|
103
|
+
case 'expanded': return 'strict';
|
|
104
|
+
case 'critical': return 'critical';
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
function evaluatorRiskToProfile(risk) {
|
|
108
|
+
switch (risk) {
|
|
109
|
+
case 'low': return 'light';
|
|
110
|
+
case 'medium': return 'standard';
|
|
111
|
+
case 'high': return 'strict';
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
function profileRank(profile) {
|
|
115
|
+
return PROFILE_ORDER.indexOf(profile);
|
|
116
|
+
}
|
|
117
|
+
function buildBehavioralConstraints(profile, signals) {
|
|
118
|
+
const constraints = [];
|
|
119
|
+
// All profiles get verification evidence
|
|
120
|
+
constraints.push({
|
|
121
|
+
id: 'record-verification-evidence',
|
|
122
|
+
description: 'Record verification evidence before claiming completion.',
|
|
123
|
+
required: profile !== 'light',
|
|
124
|
+
profile,
|
|
125
|
+
});
|
|
126
|
+
if (profile === 'standard' || profile === 'strict' || profile === 'critical') {
|
|
127
|
+
constraints.push({
|
|
128
|
+
id: 'summarize-context-budget',
|
|
129
|
+
description: 'Summarize context budget and explain included/omitted sections.',
|
|
130
|
+
required: true,
|
|
131
|
+
profile,
|
|
132
|
+
});
|
|
133
|
+
constraints.push({
|
|
134
|
+
id: 'skill-radar',
|
|
135
|
+
description: 'Run skill radar when tool, browser, UI, or external CLI signals apply.',
|
|
136
|
+
required: true,
|
|
137
|
+
profile,
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
if (profile === 'strict' || profile === 'critical') {
|
|
141
|
+
constraints.push({
|
|
142
|
+
id: 'code-review',
|
|
143
|
+
description: 'Code review is required before merge or promotion.',
|
|
144
|
+
required: true,
|
|
145
|
+
profile,
|
|
146
|
+
});
|
|
147
|
+
if (signals.evaluatorRisk === 'high' || signals.uncertaintyScore >= 0.6) {
|
|
148
|
+
constraints.push({
|
|
149
|
+
id: 'uncertainty-logging',
|
|
150
|
+
description: 'Log uncertainty score, rejected alternatives, and evidence gaps.',
|
|
151
|
+
required: true,
|
|
152
|
+
profile,
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
if (profile === 'critical') {
|
|
157
|
+
constraints.push({
|
|
158
|
+
id: 'security-review',
|
|
159
|
+
description: 'Security review is mandatory for critical profile tasks.',
|
|
160
|
+
required: true,
|
|
161
|
+
profile,
|
|
162
|
+
});
|
|
163
|
+
constraints.push({
|
|
164
|
+
id: 'rollback-plan',
|
|
165
|
+
description: 'Record rollback or disable strategy before shipping.',
|
|
166
|
+
required: true,
|
|
167
|
+
profile,
|
|
168
|
+
});
|
|
169
|
+
constraints.push({
|
|
170
|
+
id: 'human-review-destructive',
|
|
171
|
+
description: 'Require human review for destructive, data, auth, or production changes.',
|
|
172
|
+
required: true,
|
|
173
|
+
profile,
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
if (signals.toolHighRiskSteps > 0) {
|
|
177
|
+
constraints.push({
|
|
178
|
+
id: 'tool-risk-review',
|
|
179
|
+
description: `Review ${signals.toolHighRiskSteps} high-risk tool step(s) before autonomous execution.`,
|
|
180
|
+
required: profile !== 'light',
|
|
181
|
+
profile,
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
return constraints;
|
|
185
|
+
}
|
|
186
|
+
function buildExitCriteria(profile, evaluator, toolStrategy) {
|
|
187
|
+
const criteria = [
|
|
188
|
+
'Context compiler explains included and omitted sections.',
|
|
189
|
+
'Memory recall records provider, score, and evidence paths.',
|
|
190
|
+
'Skill plan lists required proof and fallback policy.',
|
|
191
|
+
'Governance ROI states benefit and overhead before completion.',
|
|
192
|
+
];
|
|
193
|
+
if (profile === 'standard' || profile === 'strict' || profile === 'critical') {
|
|
194
|
+
criteria.push('Verification evidence is recorded for the completed task.');
|
|
195
|
+
}
|
|
196
|
+
if (profile === 'strict' || profile === 'critical') {
|
|
197
|
+
criteria.push('Code review evidence is recorded.');
|
|
198
|
+
if (evaluator.gates.some(g => g.required)) {
|
|
199
|
+
criteria.push('Required evaluator gates record critique outcome and follow-up.');
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
if (profile === 'critical') {
|
|
203
|
+
criteria.push('Security review or threat model evidence is recorded.');
|
|
204
|
+
criteria.push('Rollback or disable strategy is documented.');
|
|
205
|
+
}
|
|
206
|
+
if (toolStrategy.summary.highRiskSteps > 0) {
|
|
207
|
+
criteria.push('High-risk tool steps have execution review evidence.');
|
|
208
|
+
}
|
|
209
|
+
if (evaluator.uncertainty.score >= 0.6) {
|
|
210
|
+
criteria.push('Uncertainty decision log records rejected alternatives and evidence gaps.');
|
|
211
|
+
}
|
|
212
|
+
return criteria;
|
|
213
|
+
}
|
|
214
|
+
//# sourceMappingURL=AdaptiveWorkflowRouter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdaptiveWorkflowRouter.js","sourceRoot":"","sources":["../../src/workflow/AdaptiveWorkflowRouter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
export type ViolationType = 'too-many-files' | 'too-long-since-commit' | 'task-switch-without-commit';
|
|
2
|
+
export type ViolationSeverity = 'warn' | 'block';
|
|
3
|
+
export interface CommitDisciplineConfig {
|
|
4
|
+
maxUncommittedFiles: number;
|
|
5
|
+
maxUncommittedFilesBlock: number;
|
|
6
|
+
maxMinutesWithoutCommit: number;
|
|
7
|
+
maxMinutesBlock: number;
|
|
8
|
+
warnOnTaskSwitch: boolean;
|
|
9
|
+
projectDir?: string;
|
|
10
|
+
scaleDir?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface CommitViolation {
|
|
13
|
+
type: ViolationType;
|
|
14
|
+
severity: ViolationSeverity;
|
|
15
|
+
message: string;
|
|
16
|
+
count?: number;
|
|
17
|
+
threshold?: number;
|
|
18
|
+
}
|
|
19
|
+
export interface CommitDisciplineStatus {
|
|
20
|
+
uncommittedFiles: number;
|
|
21
|
+
stagedFiles: number;
|
|
22
|
+
unstagedFiles: number;
|
|
23
|
+
untrackedFiles: number;
|
|
24
|
+
minutesSinceLastCommit: number;
|
|
25
|
+
commitsThisSession: number;
|
|
26
|
+
avgFilesPerCommit: number;
|
|
27
|
+
violations: CommitViolation[];
|
|
28
|
+
recommendations: string[];
|
|
29
|
+
}
|
|
30
|
+
export interface FileGroup {
|
|
31
|
+
name: string;
|
|
32
|
+
files: string[];
|
|
33
|
+
suggestedMessage: string;
|
|
34
|
+
}
|
|
35
|
+
export interface CommitRecord {
|
|
36
|
+
id: string;
|
|
37
|
+
sha: string;
|
|
38
|
+
timestamp: string;
|
|
39
|
+
fileCount: number;
|
|
40
|
+
message: string;
|
|
41
|
+
files: string[];
|
|
42
|
+
}
|
|
43
|
+
export interface TaskSwitchResult {
|
|
44
|
+
allowed: boolean;
|
|
45
|
+
violations: CommitViolation[];
|
|
46
|
+
uncommittedCount: number;
|
|
47
|
+
suggestion: string;
|
|
48
|
+
}
|
|
49
|
+
export declare class CommitDiscipline {
|
|
50
|
+
private config;
|
|
51
|
+
private records;
|
|
52
|
+
private statePath;
|
|
53
|
+
private stateDir;
|
|
54
|
+
private now;
|
|
55
|
+
constructor(config?: Partial<CommitDisciplineConfig>, now?: () => Date);
|
|
56
|
+
check(): CommitDisciplineStatus;
|
|
57
|
+
suggestGroups(taskDescription?: string): FileGroup[];
|
|
58
|
+
recordCommit(sha: string, message: string, files: string[]): CommitRecord;
|
|
59
|
+
enforceBeforeTaskSwitch(taskDescription?: string): TaskSwitchResult;
|
|
60
|
+
summarize(): string;
|
|
61
|
+
getRecords(): CommitRecord[];
|
|
62
|
+
private inspectGit;
|
|
63
|
+
private getUncommittedFiles;
|
|
64
|
+
private minutesSinceLastCommit;
|
|
65
|
+
private loadState;
|
|
66
|
+
private saveState;
|
|
67
|
+
}
|
|
68
|
+
export declare function summarizeCommitDiscipline(status: CommitDisciplineStatus): string;
|
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
// SCALE Engine — Commit Discipline (v0.38.0)
|
|
2
|
+
// Prevents agents from accumulating uncommitted changes. Monitors git state,
|
|
3
|
+
// enforces thresholds, suggests logical commit groupings, tracks commit cadence.
|
|
4
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import { execSync } from 'node:child_process';
|
|
7
|
+
import { randomUUID } from 'node:crypto';
|
|
8
|
+
// ============================================================================
|
|
9
|
+
// Defaults
|
|
10
|
+
// ============================================================================
|
|
11
|
+
const DEFAULT_CONFIG = {
|
|
12
|
+
maxUncommittedFiles: 10,
|
|
13
|
+
maxUncommittedFilesBlock: 25,
|
|
14
|
+
maxMinutesWithoutCommit: 30,
|
|
15
|
+
maxMinutesBlock: 60,
|
|
16
|
+
warnOnTaskSwitch: true,
|
|
17
|
+
};
|
|
18
|
+
// Group name rules: path prefix → group name
|
|
19
|
+
const GROUP_RULES = [
|
|
20
|
+
{ test: f => /^src\/workflow\//.test(f), name: 'workflow', commitPrefix: 'feat(workflow)' },
|
|
21
|
+
{ test: f => /^src\/memory\//.test(f), name: 'memory', commitPrefix: 'feat(memory)' },
|
|
22
|
+
{ test: f => /^src\/runtime\//.test(f), name: 'runtime', commitPrefix: 'feat(runtime)' },
|
|
23
|
+
{ test: f => /^src\/governance\//.test(f), name: 'governance', commitPrefix: 'feat(governance)' },
|
|
24
|
+
{ test: f => /^src\/tools\//.test(f), name: 'tools', commitPrefix: 'feat(tools)' },
|
|
25
|
+
{ test: f => /^src\/skills\//.test(f), name: 'skills', commitPrefix: 'feat(skills)' },
|
|
26
|
+
{ test: f => /^src\//.test(f), name: 'src-other', commitPrefix: 'feat' },
|
|
27
|
+
{ test: f => /^tests\/workflow\//.test(f), name: 'tests-workflow', commitPrefix: 'test(workflow)' },
|
|
28
|
+
{ test: f => /^tests\//.test(f), name: 'tests', commitPrefix: 'test' },
|
|
29
|
+
{ test: f => /^docs\//.test(f), name: 'docs', commitPrefix: 'docs' },
|
|
30
|
+
{ test: f => /\.md$/.test(f) && !f.includes('/'), name: 'docs-root', commitPrefix: 'docs' },
|
|
31
|
+
{ test: f => /^package(-lock)?\.json$/.test(f), name: 'deps', commitPrefix: 'chore(deps)' },
|
|
32
|
+
{ test: f => /^\.(eslint|prettier|gitignore|npmrc)/.test(f), name: 'config', commitPrefix: 'chore(config)' },
|
|
33
|
+
];
|
|
34
|
+
// ============================================================================
|
|
35
|
+
// CommitDiscipline
|
|
36
|
+
// ============================================================================
|
|
37
|
+
export class CommitDiscipline {
|
|
38
|
+
constructor(config, now) {
|
|
39
|
+
this.records = [];
|
|
40
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
41
|
+
this.now = now ?? (() => new Date());
|
|
42
|
+
const projectDir = this.config.projectDir ?? process.cwd();
|
|
43
|
+
const scaleRoot = this.config.scaleDir ?? '.scale';
|
|
44
|
+
this.stateDir = join(projectDir, scaleRoot, 'commit-discipline');
|
|
45
|
+
this.statePath = join(this.stateDir, 'records.json');
|
|
46
|
+
this.loadState();
|
|
47
|
+
}
|
|
48
|
+
// --------------------------------------------------------------------------
|
|
49
|
+
// Core API
|
|
50
|
+
// --------------------------------------------------------------------------
|
|
51
|
+
check() {
|
|
52
|
+
const gitState = this.inspectGit();
|
|
53
|
+
const minutes = this.minutesSinceLastCommit();
|
|
54
|
+
const violations = [];
|
|
55
|
+
const recommendations = [];
|
|
56
|
+
// File count violations
|
|
57
|
+
const total = gitState.staged + gitState.unstaged + gitState.untracked;
|
|
58
|
+
if (total >= this.config.maxUncommittedFilesBlock) {
|
|
59
|
+
violations.push({
|
|
60
|
+
type: 'too-many-files',
|
|
61
|
+
severity: 'block',
|
|
62
|
+
message: `${total} uncommitted files exceeds block threshold (${this.config.maxUncommittedFilesBlock}). Commit or stash before continuing.`,
|
|
63
|
+
count: total,
|
|
64
|
+
threshold: this.config.maxUncommittedFilesBlock,
|
|
65
|
+
});
|
|
66
|
+
recommendations.push(`Split into logical commits by module. Use 'suggestGroups()' for grouping.`);
|
|
67
|
+
}
|
|
68
|
+
else if (total >= this.config.maxUncommittedFiles) {
|
|
69
|
+
violations.push({
|
|
70
|
+
type: 'too-many-files',
|
|
71
|
+
severity: 'warn',
|
|
72
|
+
message: `${total} uncommitted files exceeds warning threshold (${this.config.maxUncommittedFiles}). Consider committing soon.`,
|
|
73
|
+
count: total,
|
|
74
|
+
threshold: this.config.maxUncommittedFiles,
|
|
75
|
+
});
|
|
76
|
+
recommendations.push(`${total} files accumulating — commit before adding more changes.`);
|
|
77
|
+
}
|
|
78
|
+
// Time violations
|
|
79
|
+
if (minutes >= this.config.maxMinutesBlock) {
|
|
80
|
+
violations.push({
|
|
81
|
+
type: 'too-long-since-commit',
|
|
82
|
+
severity: 'block',
|
|
83
|
+
message: `${Math.round(minutes)} minutes since last commit exceeds block threshold (${this.config.maxMinutesBlock} min). Commit now.`,
|
|
84
|
+
count: Math.round(minutes),
|
|
85
|
+
threshold: this.config.maxMinutesBlock,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
else if (minutes >= this.config.maxMinutesWithoutCommit) {
|
|
89
|
+
violations.push({
|
|
90
|
+
type: 'too-long-since-commit',
|
|
91
|
+
severity: 'warn',
|
|
92
|
+
message: `${Math.round(minutes)} minutes since last commit exceeds warning threshold (${this.config.maxMinutesWithoutCommit} min).`,
|
|
93
|
+
count: Math.round(minutes),
|
|
94
|
+
threshold: this.config.maxMinutesWithoutCommit,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
// General recommendations
|
|
98
|
+
if (gitState.staged > 0 && gitState.unstaged > 0) {
|
|
99
|
+
recommendations.push('You have both staged and unstaged changes. Consider committing staged changes first.');
|
|
100
|
+
}
|
|
101
|
+
if (gitState.untracked > 5) {
|
|
102
|
+
recommendations.push(`${gitState.untracked} untracked files. Add new files intentionally with 'git add <file>'.`);
|
|
103
|
+
}
|
|
104
|
+
const totalCommitted = this.records.reduce((s, r) => s + r.fileCount, 0);
|
|
105
|
+
const avgFiles = this.records.length > 0 ? Math.round(totalCommitted / this.records.length) : 0;
|
|
106
|
+
return {
|
|
107
|
+
uncommittedFiles: total,
|
|
108
|
+
stagedFiles: gitState.staged,
|
|
109
|
+
unstagedFiles: gitState.unstaged,
|
|
110
|
+
untrackedFiles: gitState.untracked,
|
|
111
|
+
minutesSinceLastCommit: Math.round(minutes),
|
|
112
|
+
commitsThisSession: this.records.length,
|
|
113
|
+
avgFilesPerCommit: avgFiles,
|
|
114
|
+
violations,
|
|
115
|
+
recommendations,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
suggestGroups(taskDescription) {
|
|
119
|
+
const files = this.getUncommittedFiles();
|
|
120
|
+
if (files.length === 0)
|
|
121
|
+
return [];
|
|
122
|
+
const groupMap = new Map();
|
|
123
|
+
for (const file of files) {
|
|
124
|
+
let matched = false;
|
|
125
|
+
for (const rule of GROUP_RULES) {
|
|
126
|
+
if (rule.test(file)) {
|
|
127
|
+
const group = groupMap.get(rule.name) ?? [];
|
|
128
|
+
group.push(file);
|
|
129
|
+
groupMap.set(rule.name, group);
|
|
130
|
+
matched = true;
|
|
131
|
+
break;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
if (!matched) {
|
|
135
|
+
const group = groupMap.get('misc') ?? [];
|
|
136
|
+
group.push(file);
|
|
137
|
+
groupMap.set('misc', group);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
const groups = [];
|
|
141
|
+
for (const [name, groupFiles] of groupMap) {
|
|
142
|
+
const rule = GROUP_RULES.find(r => r.name === name);
|
|
143
|
+
const prefix = rule?.commitPrefix ?? 'chore';
|
|
144
|
+
const desc = taskDescription ?? 'update';
|
|
145
|
+
groups.push({
|
|
146
|
+
name,
|
|
147
|
+
files: groupFiles,
|
|
148
|
+
suggestedMessage: `${prefix}: ${desc}`,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
return groups;
|
|
152
|
+
}
|
|
153
|
+
recordCommit(sha, message, files) {
|
|
154
|
+
const record = {
|
|
155
|
+
id: `COMMIT-${Date.now()}-${randomUUID().slice(0, 8)}`,
|
|
156
|
+
sha,
|
|
157
|
+
timestamp: this.now().toISOString(),
|
|
158
|
+
fileCount: files.length,
|
|
159
|
+
message,
|
|
160
|
+
files,
|
|
161
|
+
};
|
|
162
|
+
this.records.push(record);
|
|
163
|
+
this.saveState();
|
|
164
|
+
return record;
|
|
165
|
+
}
|
|
166
|
+
enforceBeforeTaskSwitch(taskDescription) {
|
|
167
|
+
const status = this.check();
|
|
168
|
+
const violations = [];
|
|
169
|
+
if (status.uncommittedFiles > 0 && this.config.warnOnTaskSwitch) {
|
|
170
|
+
const severity = status.uncommittedFiles >= this.config.maxUncommittedFilesBlock ? 'block' : 'warn';
|
|
171
|
+
violations.push({
|
|
172
|
+
type: 'task-switch-without-commit',
|
|
173
|
+
severity,
|
|
174
|
+
message: `Switching tasks with ${status.uncommittedFiles} uncommitted files. Commit current work first.`,
|
|
175
|
+
count: status.uncommittedFiles,
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
const allowed = !violations.some(v => v.severity === 'block');
|
|
179
|
+
const groups = this.suggestGroups(taskDescription);
|
|
180
|
+
return {
|
|
181
|
+
allowed,
|
|
182
|
+
violations: [...status.violations, ...violations],
|
|
183
|
+
uncommittedCount: status.uncommittedFiles,
|
|
184
|
+
suggestion: groups.length > 0
|
|
185
|
+
? `Suggested commit groups: ${groups.map(g => `${g.name} (${g.files.length} files)`).join(', ')}`
|
|
186
|
+
: 'No uncommitted files.',
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
summarize() {
|
|
190
|
+
const status = this.check();
|
|
191
|
+
const lines = [
|
|
192
|
+
'## Commit Discipline Status',
|
|
193
|
+
'',
|
|
194
|
+
`**Uncommitted Files:** ${status.uncommittedFiles} (staged: ${status.stagedFiles}, unstaged: ${status.unstagedFiles}, untracked: ${status.untrackedFiles})`,
|
|
195
|
+
`**Time Since Last Commit:** ${status.minutesSinceLastCommit} min`,
|
|
196
|
+
`**Commits This Session:** ${status.commitsThisSession}`,
|
|
197
|
+
`**Avg Files Per Commit:** ${status.avgFilesPerCommit}`,
|
|
198
|
+
'',
|
|
199
|
+
];
|
|
200
|
+
if (status.violations.length > 0) {
|
|
201
|
+
lines.push('### Violations');
|
|
202
|
+
for (const v of status.violations) {
|
|
203
|
+
const icon = v.severity === 'block' ? '[BLOCK]' : '[WARN]';
|
|
204
|
+
lines.push(`- ${icon} ${v.message}`);
|
|
205
|
+
}
|
|
206
|
+
lines.push('');
|
|
207
|
+
}
|
|
208
|
+
if (status.recommendations.length > 0) {
|
|
209
|
+
lines.push('### Recommendations');
|
|
210
|
+
for (const r of status.recommendations)
|
|
211
|
+
lines.push(`- ${r}`);
|
|
212
|
+
lines.push('');
|
|
213
|
+
}
|
|
214
|
+
const groups = this.suggestGroups();
|
|
215
|
+
if (groups.length > 1) {
|
|
216
|
+
lines.push('### Suggested Commit Groups');
|
|
217
|
+
for (const g of groups) {
|
|
218
|
+
lines.push(`- **${g.name}** (${g.files.length} files): \`${g.suggestedMessage}\``);
|
|
219
|
+
for (const f of g.files)
|
|
220
|
+
lines.push(` - ${f}`);
|
|
221
|
+
}
|
|
222
|
+
lines.push('');
|
|
223
|
+
}
|
|
224
|
+
if (status.violations.length === 0 && status.uncommittedFiles === 0) {
|
|
225
|
+
lines.push('No issues detected. Working tree is clean.');
|
|
226
|
+
}
|
|
227
|
+
return lines.join('\n');
|
|
228
|
+
}
|
|
229
|
+
getRecords() {
|
|
230
|
+
return [...this.records];
|
|
231
|
+
}
|
|
232
|
+
// --------------------------------------------------------------------------
|
|
233
|
+
// Git Inspection
|
|
234
|
+
// --------------------------------------------------------------------------
|
|
235
|
+
inspectGit() {
|
|
236
|
+
try {
|
|
237
|
+
const projectDir = this.config.projectDir ?? process.cwd();
|
|
238
|
+
const staged = execSync('git diff --cached --name-only', {
|
|
239
|
+
cwd: projectDir, encoding: 'utf-8', timeout: 5000,
|
|
240
|
+
}).trim().split('\n').filter(Boolean).length;
|
|
241
|
+
const unstaged = execSync('git diff --name-only', {
|
|
242
|
+
cwd: projectDir, encoding: 'utf-8', timeout: 5000,
|
|
243
|
+
}).trim().split('\n').filter(Boolean).length;
|
|
244
|
+
const untracked = execSync('git ls-files --others --exclude-standard', {
|
|
245
|
+
cwd: projectDir, encoding: 'utf-8', timeout: 5000,
|
|
246
|
+
}).trim().split('\n').filter(Boolean).length;
|
|
247
|
+
return { staged, unstaged, untracked };
|
|
248
|
+
}
|
|
249
|
+
catch {
|
|
250
|
+
return { staged: 0, unstaged: 0, untracked: 0 };
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
getUncommittedFiles() {
|
|
254
|
+
try {
|
|
255
|
+
const projectDir = this.config.projectDir ?? process.cwd();
|
|
256
|
+
const staged = execSync('git diff --cached --name-only', {
|
|
257
|
+
cwd: projectDir, encoding: 'utf-8', timeout: 5000,
|
|
258
|
+
}).trim().split('\n').filter(Boolean);
|
|
259
|
+
const unstaged = execSync('git diff --name-only', {
|
|
260
|
+
cwd: projectDir, encoding: 'utf-8', timeout: 5000,
|
|
261
|
+
}).trim().split('\n').filter(Boolean);
|
|
262
|
+
const untracked = execSync('git ls-files --others --exclude-standard', {
|
|
263
|
+
cwd: projectDir, encoding: 'utf-8', timeout: 5000,
|
|
264
|
+
}).trim().split('\n').filter(Boolean);
|
|
265
|
+
return [...new Set([...staged, ...unstaged, ...untracked])];
|
|
266
|
+
}
|
|
267
|
+
catch {
|
|
268
|
+
return [];
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
minutesSinceLastCommit() {
|
|
272
|
+
try {
|
|
273
|
+
const projectDir = this.config.projectDir ?? process.cwd();
|
|
274
|
+
const ts = execSync('git log -1 --format=%ct', {
|
|
275
|
+
cwd: projectDir, encoding: 'utf-8', timeout: 5000,
|
|
276
|
+
}).trim();
|
|
277
|
+
const lastCommitEpoch = parseInt(ts, 10) * 1000;
|
|
278
|
+
return (this.now().getTime() - lastCommitEpoch) / 60000;
|
|
279
|
+
}
|
|
280
|
+
catch {
|
|
281
|
+
return 0;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
// --------------------------------------------------------------------------
|
|
285
|
+
// State Persistence
|
|
286
|
+
// --------------------------------------------------------------------------
|
|
287
|
+
loadState() {
|
|
288
|
+
if (!existsSync(this.statePath))
|
|
289
|
+
return;
|
|
290
|
+
try {
|
|
291
|
+
const raw = JSON.parse(readFileSync(this.statePath, 'utf-8'));
|
|
292
|
+
if (Array.isArray(raw.records))
|
|
293
|
+
this.records = raw.records;
|
|
294
|
+
}
|
|
295
|
+
catch { /* ignore corrupt state */ }
|
|
296
|
+
}
|
|
297
|
+
saveState() {
|
|
298
|
+
if (!existsSync(this.stateDir))
|
|
299
|
+
mkdirSync(this.stateDir, { recursive: true });
|
|
300
|
+
writeFileSync(this.statePath, JSON.stringify({ records: this.records }, null, 2), 'utf-8');
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
// ============================================================================
|
|
304
|
+
// Summary Formatter (standalone)
|
|
305
|
+
// ============================================================================
|
|
306
|
+
export function summarizeCommitDiscipline(status) {
|
|
307
|
+
const lines = [
|
|
308
|
+
'## Commit Discipline',
|
|
309
|
+
'',
|
|
310
|
+
`**Uncommitted:** ${status.uncommittedFiles} files (staged: ${status.stagedFiles}, unstaged: ${status.unstagedFiles}, untracked: ${status.untrackedFiles})`,
|
|
311
|
+
`**Last Commit:** ${status.minutesSinceLastCommit} min ago`,
|
|
312
|
+
`**Session Commits:** ${status.commitsThisSession} (avg ${status.avgFilesPerCommit} files/commit)`,
|
|
313
|
+
];
|
|
314
|
+
if (status.violations.length > 0) {
|
|
315
|
+
lines.push('', '### Violations');
|
|
316
|
+
for (const v of status.violations) {
|
|
317
|
+
lines.push(`- ${v.severity === 'block' ? '[BLOCK]' : '[WARN]'} ${v.message}`);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
if (status.recommendations.length > 0) {
|
|
321
|
+
lines.push('', '### Recommendations');
|
|
322
|
+
for (const r of status.recommendations)
|
|
323
|
+
lines.push(`- ${r}`);
|
|
324
|
+
}
|
|
325
|
+
return lines.join('\n');
|
|
326
|
+
}
|
|
327
|
+
//# sourceMappingURL=CommitDiscipline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CommitDiscipline.js","sourceRoot":"","sources":["../../src/workflow/CommitDiscipline.ts"],"names":[],"mappings":"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"}
|