@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,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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"}