@hongmaple0820/scale-engine 0.40.1 → 0.43.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 (228) hide show
  1. package/README.md +30 -2
  2. package/dist/api/cli.js +286 -7
  3. package/dist/api/cli.js.map +1 -1
  4. package/dist/api/doctor.js +1 -1
  5. package/dist/api/doctor.js.map +1 -1
  6. package/dist/api/quickstart.d.ts +11 -0
  7. package/dist/api/quickstart.js +98 -1
  8. package/dist/api/quickstart.js.map +1 -1
  9. package/dist/artifact/fsmDefinitions.js +15 -2
  10. package/dist/artifact/fsmDefinitions.js.map +1 -1
  11. package/dist/artifact/types.d.ts +1 -1
  12. package/dist/artifact/types.js.map +1 -1
  13. package/dist/bootstrap/DependencyBootstrap.d.ts +1 -0
  14. package/dist/bootstrap/DependencyBootstrap.js +137 -25
  15. package/dist/bootstrap/DependencyBootstrap.js.map +1 -1
  16. package/dist/cache/ScanCache.d.ts +41 -0
  17. package/dist/cache/ScanCache.js +120 -0
  18. package/dist/cache/ScanCache.js.map +1 -0
  19. package/dist/capabilities/BrowserQACapability.d.ts +14 -0
  20. package/dist/capabilities/BrowserQACapability.js +94 -0
  21. package/dist/capabilities/BrowserQACapability.js.map +1 -1
  22. package/dist/capabilities/InstalledSkillsIntegration.js +29 -9
  23. package/dist/capabilities/InstalledSkillsIntegration.js.map +1 -1
  24. package/dist/cli/autofixCommands.d.ts +22 -0
  25. package/dist/cli/autofixCommands.js +32 -0
  26. package/dist/cli/autofixCommands.js.map +1 -0
  27. package/dist/cli/cortexCommands.d.ts +71 -0
  28. package/dist/cli/cortexCommands.js +335 -0
  29. package/dist/cli/cortexCommands.js.map +1 -0
  30. package/dist/cli/costCommands.d.ts +13 -0
  31. package/dist/cli/costCommands.js +48 -0
  32. package/dist/cli/costCommands.js.map +1 -0
  33. package/dist/cli/orchCommands.d.ts +43 -0
  34. package/dist/cli/orchCommands.js +135 -0
  35. package/dist/cli/orchCommands.js.map +1 -0
  36. package/dist/cli/phaseCommands.js +1 -2
  37. package/dist/cli/phaseCommands.js.map +1 -1
  38. package/dist/cli/qaCommands.d.ts +22 -0
  39. package/dist/cli/qaCommands.js +84 -0
  40. package/dist/cli/qaCommands.js.map +1 -0
  41. package/dist/cli/quickstartCommands.d.ts +17 -0
  42. package/dist/cli/quickstartCommands.js +47 -0
  43. package/dist/cli/quickstartCommands.js.map +1 -0
  44. package/dist/cli/shieldCommands.d.ts +30 -0
  45. package/dist/cli/shieldCommands.js +212 -0
  46. package/dist/cli/shieldCommands.js.map +1 -0
  47. package/dist/cli/tuiCommands.d.ts +7 -0
  48. package/dist/cli/tuiCommands.js +33 -0
  49. package/dist/cli/tuiCommands.js.map +1 -0
  50. package/dist/config/profiles.js +26 -0
  51. package/dist/config/profiles.js.map +1 -1
  52. package/dist/context/ContextBudget.js +2 -2
  53. package/dist/core/GbrainRuntime.d.ts +25 -0
  54. package/dist/core/GbrainRuntime.js +270 -0
  55. package/dist/core/GbrainRuntime.js.map +1 -0
  56. package/dist/cortex/GovernanceMetrics.d.ts +66 -0
  57. package/dist/cortex/GovernanceMetrics.js +230 -0
  58. package/dist/cortex/GovernanceMetrics.js.map +1 -0
  59. package/dist/cortex/InstinctExtractor.d.ts +61 -0
  60. package/dist/cortex/InstinctExtractor.js +184 -0
  61. package/dist/cortex/InstinctExtractor.js.map +1 -0
  62. package/dist/cortex/InstinctStore.d.ts +54 -0
  63. package/dist/cortex/InstinctStore.js +266 -0
  64. package/dist/cortex/InstinctStore.js.map +1 -0
  65. package/dist/cortex/ReflexionEngine.d.ts +34 -0
  66. package/dist/cortex/ReflexionEngine.js +157 -0
  67. package/dist/cortex/ReflexionEngine.js.map +1 -0
  68. package/dist/cortex/SessionInjector.d.ts +44 -0
  69. package/dist/cortex/SessionInjector.js +127 -0
  70. package/dist/cortex/SessionInjector.js.map +1 -0
  71. package/dist/cortex/adapters/ClaudeAdapter.d.ts +17 -0
  72. package/dist/cortex/adapters/ClaudeAdapter.js +61 -0
  73. package/dist/cortex/adapters/ClaudeAdapter.js.map +1 -0
  74. package/dist/cortex/adapters/CodexAdapter.d.ts +10 -0
  75. package/dist/cortex/adapters/CodexAdapter.js +52 -0
  76. package/dist/cortex/adapters/CodexAdapter.js.map +1 -0
  77. package/dist/cortex/adapters/CursorAdapter.d.ts +10 -0
  78. package/dist/cortex/adapters/CursorAdapter.js +46 -0
  79. package/dist/cortex/adapters/CursorAdapter.js.map +1 -0
  80. package/dist/cortex/adapters/GeminiAdapter.d.ts +11 -0
  81. package/dist/cortex/adapters/GeminiAdapter.js +48 -0
  82. package/dist/cortex/adapters/GeminiAdapter.js.map +1 -0
  83. package/dist/env/EnvironmentDoctor.js +221 -5
  84. package/dist/env/EnvironmentDoctor.js.map +1 -1
  85. package/dist/eval/BenchmarkPublisher.d.ts +25 -0
  86. package/dist/eval/BenchmarkPublisher.js +27 -0
  87. package/dist/eval/BenchmarkPublisher.js.map +1 -0
  88. package/dist/guardrails/DependencyAuditor.js +10 -1
  89. package/dist/guardrails/DependencyAuditor.js.map +1 -1
  90. package/dist/memory/MemoryProviders.js +38 -91
  91. package/dist/memory/MemoryProviders.js.map +1 -1
  92. package/dist/orchestrator/OrchestratorDaemon.d.ts +44 -0
  93. package/dist/orchestrator/OrchestratorDaemon.js +150 -0
  94. package/dist/orchestrator/OrchestratorDaemon.js.map +1 -0
  95. package/dist/orchestrator/PolicyLoader.d.ts +80 -0
  96. package/dist/orchestrator/PolicyLoader.js +229 -0
  97. package/dist/orchestrator/PolicyLoader.js.map +1 -0
  98. package/dist/orchestrator/ReconciliationLoop.d.ts +71 -0
  99. package/dist/orchestrator/ReconciliationLoop.js +266 -0
  100. package/dist/orchestrator/ReconciliationLoop.js.map +1 -0
  101. package/dist/orchestrator/TrackerAdapter.d.ts +60 -0
  102. package/dist/orchestrator/TrackerAdapter.js +147 -0
  103. package/dist/orchestrator/TrackerAdapter.js.map +1 -0
  104. package/dist/orchestrator/WorkspaceManager.d.ts +66 -0
  105. package/dist/orchestrator/WorkspaceManager.js +257 -0
  106. package/dist/orchestrator/WorkspaceManager.js.map +1 -0
  107. package/dist/qa/BrowserDaemon.d.ts +23 -0
  108. package/dist/qa/BrowserDaemon.js +79 -0
  109. package/dist/qa/BrowserDaemon.js.map +1 -0
  110. package/dist/qa/E2ETestOrchestrator.d.ts +14 -0
  111. package/dist/qa/E2ETestOrchestrator.js +19 -0
  112. package/dist/qa/E2ETestOrchestrator.js.map +1 -0
  113. package/dist/review/CrossModelReviewer.d.ts +35 -0
  114. package/dist/review/CrossModelReviewer.js +75 -0
  115. package/dist/review/CrossModelReviewer.js.map +1 -0
  116. package/dist/review/ReviewAggregator.d.ts +13 -0
  117. package/dist/review/ReviewAggregator.js +28 -0
  118. package/dist/review/ReviewAggregator.js.map +1 -0
  119. package/dist/review/reviewCommands.d.ts +15 -0
  120. package/dist/review/reviewCommands.js +24 -0
  121. package/dist/review/reviewCommands.js.map +1 -0
  122. package/dist/routing/LocalModelProvider.d.ts +11 -0
  123. package/dist/routing/LocalModelProvider.js +21 -0
  124. package/dist/routing/LocalModelProvider.js.map +1 -0
  125. package/dist/routing/ModelRouter.d.ts +12 -0
  126. package/dist/routing/ModelRouter.js +31 -4
  127. package/dist/routing/ModelRouter.js.map +1 -1
  128. package/dist/runtime/AiOsRuntime.d.ts +1 -0
  129. package/dist/runtime/AiOsRuntime.js +15 -0
  130. package/dist/runtime/AiOsRuntime.js.map +1 -1
  131. package/dist/runtime/CostAnalyzer.d.ts +53 -0
  132. package/dist/runtime/CostAnalyzer.js +160 -0
  133. package/dist/runtime/CostAnalyzer.js.map +1 -0
  134. package/dist/runtime/CostOptimizer.d.ts +11 -0
  135. package/dist/runtime/CostOptimizer.js +21 -0
  136. package/dist/runtime/CostOptimizer.js.map +1 -0
  137. package/dist/runtime/ModelUsageLedger.d.ts +53 -2
  138. package/dist/runtime/ModelUsageLedger.js +243 -39
  139. package/dist/runtime/ModelUsageLedger.js.map +1 -1
  140. package/dist/setup/SetupVerification.d.ts +42 -0
  141. package/dist/setup/SetupVerification.js +180 -0
  142. package/dist/setup/SetupVerification.js.map +1 -0
  143. package/dist/shield/PolicyCompiler.d.ts +70 -0
  144. package/dist/shield/PolicyCompiler.js +540 -0
  145. package/dist/shield/PolicyCompiler.js.map +1 -0
  146. package/dist/shield/ProtectedPaths.d.ts +39 -0
  147. package/dist/shield/ProtectedPaths.js +179 -0
  148. package/dist/shield/ProtectedPaths.js.map +1 -0
  149. package/dist/shield/ShieldProtocol.d.ts +50 -0
  150. package/dist/shield/ShieldProtocol.js +103 -0
  151. package/dist/shield/ShieldProtocol.js.map +1 -0
  152. package/dist/skills/SkillMdStandard.d.ts +33 -0
  153. package/dist/skills/SkillMdStandard.js +88 -0
  154. package/dist/skills/SkillMdStandard.js.map +1 -0
  155. package/dist/skills/SkillRegistry.d.ts +9 -1
  156. package/dist/skills/SkillRegistry.js +20 -0
  157. package/dist/skills/SkillRegistry.js.map +1 -1
  158. package/dist/skills/interop/GStackInterop.d.ts +15 -0
  159. package/dist/skills/interop/GStackInterop.js +34 -0
  160. package/dist/skills/interop/GStackInterop.js.map +1 -0
  161. package/dist/skills/interop/OMCInterop.d.ts +15 -0
  162. package/dist/skills/interop/OMCInterop.js +34 -0
  163. package/dist/skills/interop/OMCInterop.js.map +1 -0
  164. package/dist/tools/ToolCapabilityRegistry.js +10 -0
  165. package/dist/tools/ToolCapabilityRegistry.js.map +1 -1
  166. package/dist/tui/TuiDashboard.d.ts +3 -0
  167. package/dist/tui/TuiDashboard.js +120 -0
  168. package/dist/tui/TuiDashboard.js.map +1 -0
  169. package/dist/workflow/GateCatalog.d.ts +2 -0
  170. package/dist/workflow/GateCatalog.js +59 -3
  171. package/dist/workflow/GateCatalog.js.map +1 -1
  172. package/dist/workflow/GovernanceTemplatePacks.d.ts +1 -1
  173. package/dist/workflow/GovernanceTemplatePacks.js +15 -0
  174. package/dist/workflow/GovernanceTemplatePacks.js.map +1 -1
  175. package/dist/workflow/TddLoop.d.ts +2 -0
  176. package/dist/workflow/TddLoop.js +2 -0
  177. package/dist/workflow/TddLoop.js.map +1 -1
  178. package/dist/workflow/UpgradeManager.d.ts +10 -1
  179. package/dist/workflow/UpgradeManager.js +55 -0
  180. package/dist/workflow/UpgradeManager.js.map +1 -1
  181. package/dist/workflow/VerificationProfile.d.ts +8 -0
  182. package/dist/workflow/VerificationProfile.js +62 -1
  183. package/dist/workflow/VerificationProfile.js.map +1 -1
  184. package/dist/workflow/VerificationSchema.d.ts +46 -0
  185. package/dist/workflow/VerificationSchema.js +97 -0
  186. package/dist/workflow/VerificationSchema.js.map +1 -0
  187. package/dist/workflow/autofix/AutoFixEngine.d.ts +37 -0
  188. package/dist/workflow/autofix/AutoFixEngine.js +169 -0
  189. package/dist/workflow/autofix/AutoFixEngine.js.map +1 -0
  190. package/dist/workflow/execution/RalphEngine.d.ts +18 -0
  191. package/dist/workflow/execution/RalphEngine.js +22 -0
  192. package/dist/workflow/execution/RalphEngine.js.map +1 -1
  193. package/dist/workflow/gates/EnhancedGates.d.ts +74 -0
  194. package/dist/workflow/gates/EnhancedGates.js +653 -0
  195. package/dist/workflow/gates/EnhancedGates.js.map +1 -0
  196. package/dist/workflow/gates/GateSystem.d.ts +3 -0
  197. package/dist/workflow/gates/GateSystem.js +94 -1
  198. package/dist/workflow/gates/GateSystem.js.map +1 -1
  199. package/dist/workflow/types.d.ts +1 -1
  200. package/docs/README.md +3 -0
  201. package/docs/guides/DEVELOPMENT_WORKFLOW.md +28 -9
  202. package/docs/guides/GETTING_STARTED.md +19 -0
  203. package/docs/guides/MIGRATION.md +119 -0
  204. package/docs/start/quickstart.md +1 -0
  205. package/docs/workflow/GATES_AND_SCORE.md +34 -1
  206. package/docs/workflow/README.md +58 -10
  207. package/package.json +7 -18
  208. package/scripts/workflow/lib/gbrain-runtime.mjs +185 -0
  209. package/scripts/workflow/lib/report-output.mjs +107 -0
  210. package/scripts/workflow/provider-rehearsal.mjs +129 -48
  211. package/scripts/workflow/setup-smoke.mjs +142 -8
  212. package/docs/ACTIVE_SECURITY_VISUAL_GATES.md +0 -87
  213. package/docs/AI_ENGINEERING_OS_POSITIONING.md +0 -607
  214. package/docs/BACKGROUND_HUNTER.md +0 -62
  215. package/docs/CODE_INTELLIGENCE.md +0 -180
  216. package/docs/CONTEXT_BUDGET.md +0 -155
  217. package/docs/DEPENDENCY_AUDIT.md +0 -118
  218. package/docs/EVOLUTION_SHADOW_MODE.md +0 -63
  219. package/docs/GITLAB_FLOW.md +0 -125
  220. package/docs/GOVERNANCE_DASHBOARD.md +0 -85
  221. package/docs/MEMORY_BRAIN.md +0 -104
  222. package/docs/MEMORY_FABRIC.md +0 -161
  223. package/docs/RESOURCE_GOVERNANCE.md +0 -92
  224. package/docs/RUNTIME_EVIDENCE.md +0 -101
  225. package/docs/WORKFLOW_EVAL.md +0 -151
  226. package/image/wechat-public.jpg +0 -0
  227. package/image/wxPay.jpg +0 -0
  228. package/image/zfb.jpg +0 -0
package/README.md CHANGED
@@ -1,9 +1,9 @@
1
1
  <p align="center">
2
- <img src="https://img.shields.io/badge/version-0.38.0-orange?style=flat-square" alt="version" />
2
+ <img src="https://img.shields.io/badge/version-0.42.0-orange?style=flat-square" alt="version" />
3
3
  <img src="https://img.shields.io/badge/platforms-22-blue?style=flat-square" alt="platforms" />
4
4
  <img src="https://img.shields.io/badge/agents-12-blue?style=flat-square" alt="agents" />
5
5
  <img src="https://img.shields.io/badge/tests-verified-brightgreen?style=flat-square" alt="tests" />
6
- <img src="https://img.shields.io/badge/npm-0.38.0-cb3837?style=flat-square&logo=npm" alt="npm" />
6
+ <img src="https://img.shields.io/badge/npm-0.42.0-cb3837?style=flat-square&logo=npm" alt="npm" />
7
7
  </p>
8
8
 
9
9
  [![RepoStars](https://repostars.dev/api/embed?repo=hongmaple0820%2Fscale-engine&theme=copper)](https://repostars.dev/?repos=hongmaple0820%2Fscale-engine&theme=copper)
@@ -114,6 +114,34 @@ scale doctor env --json
114
114
  | **Role Skills** | 6 个角色化审查视角(eng-manager、security-reviewer、qa-lead 等) |
115
115
  | **Memory Intelligence** | 6 信号质量评分,跨 provider 冲突检测,新鲜度衰减 |
116
116
  | **Governance ROI** | 端到端治理 ROI 度量 — token 成本 vs 质量 vs 门禁摩擦 |
117
+ | **Scale Shield** | 退出码钩子拦截引擎 — YAML 策略 → hook 脚本编译,40+ 危险命令阻断,退出码协议 |
118
+ | **Scale Orchestrator** | 声明式编排守护进程 — SCALE_POLICY.md 策略驱动,git worktree 隔离,协调循环 |
119
+ | **Scale Cortex** | 证据驱动持续进化 — 本能提取 (Instincts 0.3-0.9),SessionStart 注入,跨 harness 适配器 |
120
+
121
+ ## SCALE 2.0 三引擎架构
122
+
123
+ SCALE 2.0 引入三层引擎,对齐业界前沿项目的核心模式:
124
+
125
+ | 引擎 | 对标项目 | 核心能力 |
126
+ |------|---------|---------|
127
+ | **Scale Shield** | agent-hooks-in-depth | 退出码阻断 (exit 0/2)、stdin/stdout JSON 协议、40+ 危险命令拦截、`.scale/` 完整性保护 |
128
+ | **Scale Orchestrator** | Symphony WORKFLOW.md | 声明式策略驱动、git worktree 隔离、协调循环、多轮 Worker |
129
+ | **Scale Cortex** | ECC Instincts | 观察→模式→本能提取 (置信度 0.3-0.9)、SessionStart 注入、跨 harness (Claude/Codex/Cursor/Gemini) |
130
+
131
+ ```bash
132
+ # Shield: 编译策略并安装 hook
133
+ scale shield compile
134
+ scale shield status
135
+
136
+ # Orchestrator: 启动声明式编排守护进程
137
+ scale orch start
138
+ scale orch status
139
+
140
+ # Cortex: 从失败中学习
141
+ scale cortex evolve
142
+ scale cortex metrics --days 30
143
+ scale cortex inject --minimal
144
+ ```
117
145
 
118
146
  ## AI OS Runtime
119
147
 
package/dist/api/cli.js CHANGED
@@ -33,6 +33,7 @@ import { quickStart, detectPlatform, governanceNextSteps } from './quickstart.js
33
33
  import { bootstrapDependencies } from '../bootstrap/DependencyBootstrap.js';
34
34
  import { renderDependencyBootstrapReport } from '../bootstrap/DependencyBootstrapRenderer.js';
35
35
  import { runSetupWizard } from '../setup/SetupWizard.js';
36
+ import { verifySetup } from '../setup/SetupVerification.js';
36
37
  import { normalizeLanguage, resolveCliLanguage } from '../i18n/Language.js';
37
38
  import { SkillDiscovery } from '../skills/SkillDiscovery.js';
38
39
  import { inspectRequiredWorkflowSkills, inspectWorkflowSkills } from '../skills/SkillDoctor.js';
@@ -49,6 +50,15 @@ import { preflightGateStages } from '../workflow/GateCatalog.js';
49
50
  import { gatesCommand } from '../cli/gateStatusCommands.js';
50
51
  import { scoreCommand } from '../cli/scoreCommands.js';
51
52
  import { promptCommand } from '../cli/promptCommands.js';
53
+ import { quickstartCommand } from '../cli/quickstartCommands.js';
54
+ import { tuiCommand } from '../cli/tuiCommands.js';
55
+ import { qaCommand } from '../cli/qaCommands.js';
56
+ import { autofixCommand } from '../cli/autofixCommands.js';
57
+ import { costReportCommand, costOptimizeCommand } from '../cli/costCommands.js';
58
+ import { reviewCommand as crossReviewCommand } from '../review/reviewCommands.js';
59
+ import { shieldCommand } from '../cli/shieldCommands.js';
60
+ import { orchCommand } from '../cli/orchCommands.js';
61
+ import { cortexCommand } from '../cli/cortexCommands.js';
52
62
  import { writeGovernanceTemplates } from '../workflow/GovernanceTemplates.js';
53
63
  import { getBootstrapPlanForProfile, getProfile as getConfigProfile, generateConfigForProfile, listProfiles as listConfigProfiles, } from '../config/profiles.js';
54
64
  import { computeGovernanceDrift } from '../workflow/GovernanceLock.js';
@@ -75,7 +85,7 @@ import { doctorHtmlArtifacts, renderHtmlArtifact, resolveHtmlArtifactForOpen, se
75
85
  import { renderGovernanceDashboard } from '../output/GovernanceDashboard.js';
76
86
  import { cleanupWorkspaceLifecycle, inspectWorkspaceLifecycle, } from '../workflow/WorkspaceLifecycle.js';
77
87
  import { inspectWorkspaceSafety } from '../workflow/WorkspaceSafety.js';
78
- import { RuntimeEvidenceLedger, SessionLedger, createAiOsAdoption, createAiOsBenchmark, createAiOsDashboard, createAiOsDoctor, createAiOsMigration, createAiOsPlan, createAiOsRun, createAiOsStatus, doctorRuntimeEvidence, evaluateFinalReportReadiness, } from '../runtime/index.js';
88
+ import { ModelUsageLedger, RuntimeEvidenceLedger, SessionLedger, buildModelUsageInput, createAiOsAdoption, createAiOsBenchmark, createAiOsDashboard, createAiOsDoctor, createAiOsMigration, createAiOsPlan, createAiOsRun, createAiOsStatus, doctorRuntimeEvidence, evaluateFinalReportReadiness, } from '../runtime/index.js';
79
89
  import { MemoryFabric, MemoryBrain, doctorMemoryFabric, renderContextPackMarkdown, renderMemoryLearningCandidateMarkdown, inspectMemoryProviders, recallMemoryProviders, settleMemoryLearning, useMemoryProvider, writeMemoryProvidersConfig, } from '../memory/index.js';
80
90
  import { resolveWorkspaceTopology, workspaceTopologyPath, workspaceTopologyTemplate, } from '../workflow/WorkspaceTopology.js';
81
91
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
@@ -2817,7 +2827,6 @@ const bootstrap = defineCommand({
2817
2827
  meta: { name: 'bootstrap', description: 'Bootstrap third-party workflow dependencies with explicit install intent' },
2818
2828
  subCommands: { deps: bootstrapDepsCommand },
2819
2829
  });
2820
- // ============================================================================
2821
2830
  const setup = defineCommand({
2822
2831
  meta: { name: 'setup', description: 'Interactive SCALE setup for third-party skills, CLIs, memory, and knowledge providers' },
2823
2832
  args: {
@@ -2828,6 +2837,7 @@ const setup = defineCommand({
2828
2837
  include: { type: 'string', description: 'Additional dependency ids to include explicitly' },
2829
2838
  apply: { type: 'boolean', default: false, description: 'Run install commands for ready dependencies' },
2830
2839
  yes: { type: 'boolean', default: false, description: 'Confirm installation without prompting' },
2840
+ verify: { type: 'boolean', default: false, description: 'Verify governed setup and dependency readiness instead of running the setup wizard' },
2831
2841
  interactive: { type: 'boolean', default: true, description: 'Prompt before installation when dependencies are ready' },
2832
2842
  lang: { type: 'string', description: 'Output language zh/en. Defaults to zh, then SCALE_LANG, then .scale/config.yaml locale.' },
2833
2843
  'memory-provider': { type: 'string', description: 'Switch memory provider during setup: gbrain, agentmemory, or scale-local' },
@@ -2840,10 +2850,24 @@ const setup = defineCommand({
2840
2850
  async run({ args }) {
2841
2851
  const projectDir = resolve(String(args.dir ?? PROJECT_DIR));
2842
2852
  const lang = resolveCliLanguage({ lang: args.lang, projectDir, scaleDir: SCALE_DIR });
2843
- const explicitPacks = parseCommaList(args.pack);
2844
- const recommendedPacks = args.profile
2845
- ? getBootstrapPlanForProfile(String(args.profile), args['governance-pack'] ? String(args['governance-pack']) : undefined).packs
2846
- : [];
2853
+ const { explicitPacks, recommendedPacks } = resolveSetupPacks(args);
2854
+ if (isTruthyFlag(args.verify)) {
2855
+ const verification = await verifySetup({
2856
+ projectDir,
2857
+ scaleDir: SCALE_DIR,
2858
+ packIds: explicitPacks.length > 0 ? uniqueStrings([...recommendedPacks, ...explicitPacks]) : recommendedPacks,
2859
+ includeIds: parseCommaList(args.include),
2860
+ });
2861
+ if (args.json) {
2862
+ console.log(JSON.stringify(verification, null, 2));
2863
+ }
2864
+ else {
2865
+ renderSetupVerifyReport(verification, lang);
2866
+ }
2867
+ if (!verification.ok)
2868
+ process.exitCode = 1;
2869
+ return;
2870
+ }
2847
2871
  const report = await runSetupWizard({
2848
2872
  projectDir,
2849
2873
  scaleDir: SCALE_DIR,
@@ -2892,6 +2916,64 @@ const setup = defineCommand({
2892
2916
  });
2893
2917
  // config command — Configuration profile management
2894
2918
  // ============================================================================
2919
+ function resolveSetupPacks(args) {
2920
+ const explicitPacks = parseCommaList(args.pack);
2921
+ const recommendedPacks = args.profile
2922
+ ? getBootstrapPlanForProfile(String(args.profile), args['governance-pack'] ? String(args['governance-pack']) : undefined).packs
2923
+ : [];
2924
+ return { explicitPacks, recommendedPacks };
2925
+ }
2926
+ function renderSetupVerifyReport(report, lang) {
2927
+ if (lang === 'zh') {
2928
+ console.log('\nSCALE 安装验收');
2929
+ console.log(` 项目: ${report.projectDir}`);
2930
+ console.log(` 依赖包: ${report.packIds.join(', ') || 'full'}`);
2931
+ console.log(` 结论: ${report.ok ? '通过' : '未通过'}`);
2932
+ console.log(` 阻塞项: ${report.summary.blockingIssues.length}`);
2933
+ console.log(` 受管能力: ${report.summary.installedTools}/${report.summary.totalTools}`);
2934
+ console.log(` 记忆供应商: ${report.summary.availableMemoryProviders}`);
2935
+ console.log(` 代码图谱供应商: ${report.summary.availableCodeProviders}`);
2936
+ if (report.summary.blockingIssues.length > 0) {
2937
+ console.log(' 阻塞详情:');
2938
+ for (const issue of report.summary.blockingIssues)
2939
+ console.log(` - ${issue}`);
2940
+ }
2941
+ if (report.warnings.length > 0) {
2942
+ console.log(` 警告${report.warnings.length > 12 ? ` (显示前 12 条,共 ${report.warnings.length} 条)` : ''}:`);
2943
+ for (const warning of report.warnings.slice(0, 12))
2944
+ console.log(` - ${warning}`);
2945
+ }
2946
+ if (report.recommendations.length > 0) {
2947
+ console.log(' 下一步:');
2948
+ for (const command of report.recommendations.slice(0, 12))
2949
+ console.log(` ${command}`);
2950
+ }
2951
+ return;
2952
+ }
2953
+ console.log('\nSCALE Setup Verification');
2954
+ console.log(` Project: ${report.projectDir}`);
2955
+ console.log(` Packs: ${report.packIds.join(', ') || 'full'}`);
2956
+ console.log(` Result: ${report.ok ? 'passed' : 'failed'}`);
2957
+ console.log(` Blocking issues: ${report.summary.blockingIssues.length}`);
2958
+ console.log(` Governed capabilities: ${report.summary.installedTools}/${report.summary.totalTools}`);
2959
+ console.log(` Memory providers: ${report.summary.availableMemoryProviders}`);
2960
+ console.log(` Code providers: ${report.summary.availableCodeProviders}`);
2961
+ if (report.summary.blockingIssues.length > 0) {
2962
+ console.log(' Blockers:');
2963
+ for (const issue of report.summary.blockingIssues)
2964
+ console.log(` - ${issue}`);
2965
+ }
2966
+ if (report.warnings.length > 0) {
2967
+ console.log(` Warnings${report.warnings.length > 12 ? ` (showing first 12 of ${report.warnings.length})` : ''}:`);
2968
+ for (const warning of report.warnings.slice(0, 12))
2969
+ console.log(` - ${warning}`);
2970
+ }
2971
+ if (report.recommendations.length > 0) {
2972
+ console.log(' Next:');
2973
+ for (const command of report.recommendations.slice(0, 12))
2974
+ console.log(` ${command}`);
2975
+ }
2976
+ }
2895
2977
  const configProfile = defineCommand({
2896
2978
  meta: { name: 'profile', description: 'View or switch configuration profile' },
2897
2979
  args: {
@@ -4537,6 +4619,169 @@ function normalizeRuntimeSessionStatus(value) {
4537
4619
  return normalized;
4538
4620
  throw new Error(`Invalid runtime session status "${normalized}"; expected active, completed, failed, or abandoned.`);
4539
4621
  }
4622
+ function parseNonNegativeNumberArg(value, name) {
4623
+ if (value === undefined || value === null || value === '')
4624
+ return undefined;
4625
+ const parsed = Number(value);
4626
+ if (!Number.isFinite(parsed) || parsed < 0) {
4627
+ throw new Error(`${name} must be a non-negative number.`);
4628
+ }
4629
+ return parsed;
4630
+ }
4631
+ function parseJsonArg(value, name) {
4632
+ try {
4633
+ return JSON.parse(String(value ?? 'null'));
4634
+ }
4635
+ catch {
4636
+ throw new Error(`${name} must be valid JSON.`);
4637
+ }
4638
+ }
4639
+ function parseMetadataJson(value, name = '--metadata-json') {
4640
+ const parsed = parseJsonArg(value ?? '{}', name);
4641
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
4642
+ throw new Error(`${name} must be a JSON object.`);
4643
+ }
4644
+ return parsed;
4645
+ }
4646
+ function hasModelUsageArgs(args) {
4647
+ return [
4648
+ 'provider',
4649
+ 'model',
4650
+ 'usage-json',
4651
+ 'usage-file',
4652
+ 'input-tokens',
4653
+ 'output-tokens',
4654
+ 'cache-eligible-tokens',
4655
+ 'cache-creation-input-tokens',
4656
+ 'cache-read-input-tokens',
4657
+ 'cached-tokens',
4658
+ 'estimated-cost-usd',
4659
+ ].some(key => args[key] !== undefined && args[key] !== '');
4660
+ }
4661
+ function buildModelUsageRecordInput(args, defaults = {}) {
4662
+ const usagePayload = args['usage-file']
4663
+ ? parseJsonArg(readFileSync(resolve(PROJECT_DIR, String(args['usage-file'])), 'utf-8'), '--usage-file')
4664
+ : args['usage-json']
4665
+ ? parseJsonArg(args['usage-json'], '--usage-json')
4666
+ : undefined;
4667
+ const provider = String(args.provider ?? defaults.provider ?? '').trim();
4668
+ if (!provider)
4669
+ throw new Error('Model usage recording requires --provider.');
4670
+ return buildModelUsageInput({
4671
+ provider,
4672
+ model: args.model ? String(args.model) : undefined,
4673
+ taskId: args['task-id'] ? String(args['task-id']) : defaults.taskId,
4674
+ sessionId: args['session-id'] ? String(args['session-id']) : defaults.sessionId,
4675
+ inputTokens: parseNonNegativeNumberArg(args['input-tokens'], '--input-tokens'),
4676
+ outputTokens: parseNonNegativeNumberArg(args['output-tokens'], '--output-tokens'),
4677
+ cacheEligibleTokens: parseNonNegativeNumberArg(args['cache-eligible-tokens'], '--cache-eligible-tokens'),
4678
+ cacheCreationInputTokens: parseNonNegativeNumberArg(args['cache-creation-input-tokens'], '--cache-creation-input-tokens'),
4679
+ cacheReadInputTokens: parseNonNegativeNumberArg(args['cache-read-input-tokens'], '--cache-read-input-tokens'),
4680
+ cachedTokens: parseNonNegativeNumberArg(args['cached-tokens'], '--cached-tokens'),
4681
+ estimatedCostUsd: parseNonNegativeNumberArg(args['estimated-cost-usd'], '--estimated-cost-usd'),
4682
+ metadata: args['metadata-json'] !== undefined ? parseMetadataJson(args['metadata-json']) : undefined,
4683
+ timestamp: args.timestamp ? String(args.timestamp) : undefined,
4684
+ usagePayload,
4685
+ });
4686
+ }
4687
+ const tokenRecord = defineCommand({
4688
+ meta: { name: 'record', description: 'Record real model usage from provider usage payloads or explicit token counts' },
4689
+ args: {
4690
+ provider: { type: 'string', required: true, description: 'Model provider: anthropic, openai, codex, etc.' },
4691
+ model: { type: 'string', description: 'Optional model id' },
4692
+ 'task-id': { type: 'string', description: 'Task id linked to this model usage' },
4693
+ 'session-id': { type: 'string', description: 'Session id linked to this model usage' },
4694
+ 'usage-json': { type: 'string', description: 'Raw provider response or usage JSON to normalize into the usage ledger' },
4695
+ 'usage-file': { type: 'string', description: 'Path to a JSON file containing a raw provider response or usage payload' },
4696
+ 'input-tokens': { type: 'string', description: 'Explicit input token count; overrides usage JSON when provided' },
4697
+ 'output-tokens': { type: 'string', description: 'Explicit output token count; overrides usage JSON when provided' },
4698
+ 'cache-eligible-tokens': { type: 'string', description: 'Explicit cache-eligible token count' },
4699
+ 'cache-creation-input-tokens': { type: 'string', description: 'Explicit Anthropic cache creation token count' },
4700
+ 'cache-read-input-tokens': { type: 'string', description: 'Explicit Anthropic cache read token count' },
4701
+ 'cached-tokens': { type: 'string', description: 'Explicit OpenAI cached token count' },
4702
+ 'estimated-cost-usd': { type: 'string', description: 'Optional estimated cost in USD' },
4703
+ timestamp: { type: 'string', description: 'Optional ISO timestamp' },
4704
+ 'metadata-json': { type: 'string', default: '{}', description: 'Additional JSON metadata' },
4705
+ json: { type: 'boolean', default: false },
4706
+ },
4707
+ run({ args }) {
4708
+ const record = new ModelUsageLedger(SCALE_DIR).record(buildModelUsageRecordInput(args));
4709
+ if (args.json) {
4710
+ console.log(JSON.stringify(record, null, 2));
4711
+ return;
4712
+ }
4713
+ console.log(`Model usage recorded: ${record.id}`);
4714
+ console.log(` Provider: ${record.provider}`);
4715
+ console.log(` Model: ${record.model ?? 'unknown'}`);
4716
+ console.log(` Tokens: input ${record.inputTokens}, output ${record.outputTokens}, total ${record.totalTokens}`);
4717
+ if (record.cacheSavingsTokens > 0)
4718
+ console.log(` Cache savings: ${record.cacheSavingsTokens} tokens`);
4719
+ },
4720
+ });
4721
+ const tokenReport = defineCommand({
4722
+ meta: { name: 'report', description: 'Summarize recorded model usage by day, provider, model, and task' },
4723
+ args: {
4724
+ day: { type: 'string', description: 'Exact UTC day in YYYY-MM-DD format' },
4725
+ since: { type: 'string', description: 'ISO timestamp lower bound' },
4726
+ until: { type: 'string', description: 'ISO timestamp upper bound' },
4727
+ 'since-days': { type: 'string', default: '7d', description: 'Relative time window when day/since/until are omitted; use all to disable' },
4728
+ provider: { type: 'string', description: 'Filter by provider' },
4729
+ model: { type: 'string', description: 'Filter by model id' },
4730
+ 'task-id': { type: 'string', description: 'Filter by task id' },
4731
+ 'session-id': { type: 'string', description: 'Filter by session id' },
4732
+ limit: { type: 'string', description: 'Maximum recent records to include in the report; defaults to 20' },
4733
+ json: { type: 'boolean', default: false },
4734
+ },
4735
+ run({ args }) {
4736
+ const limit = parsePositiveIntArg(args.limit, '--limit');
4737
+ const sinceDays = args.day || args.since || args.until ? undefined : parseSinceDays(args['since-days']) ?? 7;
4738
+ const since = args.since
4739
+ ? String(args.since)
4740
+ : sinceDays
4741
+ ? new Date(Date.now() - sinceDays * 24 * 60 * 60 * 1000).toISOString()
4742
+ : undefined;
4743
+ const report = new ModelUsageLedger(SCALE_DIR).report({
4744
+ day: args.day ? String(args.day) : undefined,
4745
+ since,
4746
+ until: args.until ? String(args.until) : undefined,
4747
+ provider: args.provider ? String(args.provider) : undefined,
4748
+ model: args.model ? String(args.model) : undefined,
4749
+ taskId: args['task-id'] ? String(args['task-id']) : undefined,
4750
+ sessionId: args['session-id'] ? String(args['session-id']) : undefined,
4751
+ limit,
4752
+ });
4753
+ if (args.json) {
4754
+ console.log(JSON.stringify(report, null, 2));
4755
+ return;
4756
+ }
4757
+ console.log('SCALE Token Report');
4758
+ if (report.filters.day)
4759
+ console.log(` Day: ${report.filters.day}`);
4760
+ else if (report.filters.since || report.filters.until)
4761
+ console.log(` Window: ${report.filters.since ?? '-inf'} -> ${report.filters.until ?? 'now'}`);
4762
+ console.log(` Records: ${report.summary.totalRecords}`);
4763
+ console.log(` Tokens: input ${report.summary.totalInputTokens}, output ${report.summary.totalOutputTokens}, total ${report.summary.totalTokens}`);
4764
+ console.log(` Cache: eligible ${report.summary.cacheEligibleTokens}, create ${report.summary.cacheCreationInputTokens}, read ${report.summary.cacheReadInputTokens}, cached ${report.summary.cachedTokens}, saved ${report.summary.cacheSavingsTokens}`);
4765
+ if (report.summary.estimatedCostUsd !== undefined)
4766
+ console.log(` Estimated cost: $${report.summary.estimatedCostUsd.toFixed(6)}`);
4767
+ for (const row of report.byProvider.slice(0, 5)) {
4768
+ console.log(` Provider ${row.key}: ${row.records} record(s), ${row.totalTokens} total tokens, ${row.cacheSavingsTokens} saved`);
4769
+ }
4770
+ for (const row of report.byModel.slice(0, 5)) {
4771
+ console.log(` Model ${row.key}: ${row.records} record(s), ${row.totalTokens} total tokens`);
4772
+ }
4773
+ for (const row of report.byTask.slice(0, 5)) {
4774
+ console.log(` Task ${row.key}: ${row.records} record(s), ${row.totalTokens} total tokens`);
4775
+ }
4776
+ for (const row of report.records.slice(0, 10)) {
4777
+ console.log(` Recent ${row.timestamp}: ${row.provider}/${row.model ?? 'unknown'} task=${row.taskId ?? '-'} total=${row.totalTokens}`);
4778
+ }
4779
+ },
4780
+ });
4781
+ const token = defineCommand({
4782
+ meta: { name: 'token', description: 'Record and audit real model token usage' },
4783
+ subCommands: { record: tokenRecord, report: tokenReport },
4784
+ });
4540
4785
  const runtimeStart = defineCommand({
4541
4786
  meta: { name: 'start', description: 'Start a runtime session ledger' },
4542
4787
  args: {
@@ -4604,6 +4849,18 @@ const runtimeRecord = defineCommand({
4604
4849
  'exit-code': { type: 'string', description: 'Exit code when applicable' },
4605
4850
  summary: { type: 'string', required: true, description: 'Short output summary' },
4606
4851
  artifacts: { type: 'string', description: 'Comma-separated artifact paths' },
4852
+ provider: { type: 'string', description: 'Optional model provider when attaching model usage: anthropic, openai, codex, etc.' },
4853
+ model: { type: 'string', description: 'Optional model id when attaching model usage' },
4854
+ 'usage-json': { type: 'string', description: 'Raw provider response or usage JSON to normalize into the usage ledger' },
4855
+ 'usage-file': { type: 'string', description: 'Path to a JSON file containing a raw provider response or usage payload' },
4856
+ 'input-tokens': { type: 'string', description: 'Explicit input token count; overrides usage JSON when provided' },
4857
+ 'output-tokens': { type: 'string', description: 'Explicit output token count; overrides usage JSON when provided' },
4858
+ 'cache-eligible-tokens': { type: 'string', description: 'Explicit cache-eligible token count' },
4859
+ 'cache-creation-input-tokens': { type: 'string', description: 'Explicit Anthropic cache creation token count' },
4860
+ 'cache-read-input-tokens': { type: 'string', description: 'Explicit Anthropic cache read token count' },
4861
+ 'cached-tokens': { type: 'string', description: 'Explicit OpenAI cached token count' },
4862
+ 'estimated-cost-usd': { type: 'string', description: 'Optional estimated cost in USD' },
4863
+ timestamp: { type: 'string', description: 'Optional ISO timestamp for the usage record' },
4607
4864
  'metadata-json': { type: 'string', default: '{}', description: 'Additional JSON metadata' },
4608
4865
  json: { type: 'boolean', default: false },
4609
4866
  },
@@ -4648,13 +4905,24 @@ const runtimeRecord = defineCommand({
4648
4905
  },
4649
4906
  });
4650
4907
  }
4908
+ const usageRecord = hasModelUsageArgs(args)
4909
+ ? new ModelUsageLedger(SCALE_DIR).record(buildModelUsageRecordInput(args, {
4910
+ taskId: record.taskId,
4911
+ sessionId: record.sessionId,
4912
+ }))
4913
+ : undefined;
4651
4914
  if (args.json) {
4652
- console.log(JSON.stringify(record, null, 2));
4915
+ console.log(JSON.stringify(usageRecord ? { evidence: record, usage: usageRecord } : record, null, 2));
4653
4916
  return;
4654
4917
  }
4655
4918
  console.log(`Runtime evidence recorded: ${record.id}`);
4656
4919
  console.log(` Status: ${record.status}`);
4657
4920
  console.log(` Kind: ${record.kind}`);
4921
+ if (usageRecord) {
4922
+ console.log(` Model usage: ${usageRecord.provider}/${usageRecord.model ?? 'unknown'} ${usageRecord.totalTokens} total tokens`);
4923
+ if (usageRecord.cacheSavingsTokens > 0)
4924
+ console.log(` Cache savings: ${usageRecord.cacheSavingsTokens} tokens`);
4925
+ }
4658
4926
  if (record.redactionApplied)
4659
4927
  console.log(' Redaction: applied');
4660
4928
  },
@@ -6274,6 +6542,7 @@ const main = defineCommand({
6274
6542
  workflow,
6275
6543
  evidence,
6276
6544
  runtime,
6545
+ token,
6277
6546
  memory,
6278
6547
  diagnose,
6279
6548
  hunt,
@@ -6288,6 +6557,16 @@ const main = defineCommand({
6288
6557
  'create-prd': createPRD,
6289
6558
  'out-of-scope': outOfScope,
6290
6559
  config,
6560
+ quickstart: quickstartCommand,
6561
+ tui: tuiCommand,
6562
+ qa: qaCommand,
6563
+ 'auto-fix': autofixCommand,
6564
+ 'cost-report': costReportCommand,
6565
+ 'cost-optimize': costOptimizeCommand,
6566
+ 'cross-review': crossReviewCommand,
6567
+ shield: shieldCommand,
6568
+ orch: orchCommand,
6569
+ cortex: cortexCommand,
6291
6570
  },
6292
6571
  });
6293
6572
  normalizeUpgradeRootOptionValues(process.argv);