@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.
- package/README.md +30 -2
- package/dist/api/cli.js +286 -7
- package/dist/api/cli.js.map +1 -1
- package/dist/api/doctor.js +1 -1
- package/dist/api/doctor.js.map +1 -1
- package/dist/api/quickstart.d.ts +11 -0
- package/dist/api/quickstart.js +98 -1
- package/dist/api/quickstart.js.map +1 -1
- package/dist/artifact/fsmDefinitions.js +15 -2
- package/dist/artifact/fsmDefinitions.js.map +1 -1
- package/dist/artifact/types.d.ts +1 -1
- package/dist/artifact/types.js.map +1 -1
- package/dist/bootstrap/DependencyBootstrap.d.ts +1 -0
- package/dist/bootstrap/DependencyBootstrap.js +137 -25
- package/dist/bootstrap/DependencyBootstrap.js.map +1 -1
- package/dist/cache/ScanCache.d.ts +41 -0
- package/dist/cache/ScanCache.js +120 -0
- package/dist/cache/ScanCache.js.map +1 -0
- package/dist/capabilities/BrowserQACapability.d.ts +14 -0
- package/dist/capabilities/BrowserQACapability.js +94 -0
- package/dist/capabilities/BrowserQACapability.js.map +1 -1
- package/dist/capabilities/InstalledSkillsIntegration.js +29 -9
- package/dist/capabilities/InstalledSkillsIntegration.js.map +1 -1
- package/dist/cli/autofixCommands.d.ts +22 -0
- package/dist/cli/autofixCommands.js +32 -0
- package/dist/cli/autofixCommands.js.map +1 -0
- package/dist/cli/cortexCommands.d.ts +71 -0
- package/dist/cli/cortexCommands.js +335 -0
- package/dist/cli/cortexCommands.js.map +1 -0
- package/dist/cli/costCommands.d.ts +13 -0
- package/dist/cli/costCommands.js +48 -0
- package/dist/cli/costCommands.js.map +1 -0
- package/dist/cli/orchCommands.d.ts +43 -0
- package/dist/cli/orchCommands.js +135 -0
- package/dist/cli/orchCommands.js.map +1 -0
- package/dist/cli/phaseCommands.js +1 -2
- package/dist/cli/phaseCommands.js.map +1 -1
- package/dist/cli/qaCommands.d.ts +22 -0
- package/dist/cli/qaCommands.js +84 -0
- package/dist/cli/qaCommands.js.map +1 -0
- package/dist/cli/quickstartCommands.d.ts +17 -0
- package/dist/cli/quickstartCommands.js +47 -0
- package/dist/cli/quickstartCommands.js.map +1 -0
- package/dist/cli/shieldCommands.d.ts +30 -0
- package/dist/cli/shieldCommands.js +212 -0
- package/dist/cli/shieldCommands.js.map +1 -0
- package/dist/cli/tuiCommands.d.ts +7 -0
- package/dist/cli/tuiCommands.js +33 -0
- package/dist/cli/tuiCommands.js.map +1 -0
- package/dist/config/profiles.js +26 -0
- package/dist/config/profiles.js.map +1 -1
- package/dist/context/ContextBudget.js +2 -2
- package/dist/core/GbrainRuntime.d.ts +25 -0
- package/dist/core/GbrainRuntime.js +270 -0
- package/dist/core/GbrainRuntime.js.map +1 -0
- package/dist/cortex/GovernanceMetrics.d.ts +66 -0
- package/dist/cortex/GovernanceMetrics.js +230 -0
- package/dist/cortex/GovernanceMetrics.js.map +1 -0
- package/dist/cortex/InstinctExtractor.d.ts +61 -0
- package/dist/cortex/InstinctExtractor.js +184 -0
- package/dist/cortex/InstinctExtractor.js.map +1 -0
- package/dist/cortex/InstinctStore.d.ts +54 -0
- package/dist/cortex/InstinctStore.js +266 -0
- package/dist/cortex/InstinctStore.js.map +1 -0
- package/dist/cortex/ReflexionEngine.d.ts +34 -0
- package/dist/cortex/ReflexionEngine.js +157 -0
- package/dist/cortex/ReflexionEngine.js.map +1 -0
- package/dist/cortex/SessionInjector.d.ts +44 -0
- package/dist/cortex/SessionInjector.js +127 -0
- package/dist/cortex/SessionInjector.js.map +1 -0
- package/dist/cortex/adapters/ClaudeAdapter.d.ts +17 -0
- package/dist/cortex/adapters/ClaudeAdapter.js +61 -0
- package/dist/cortex/adapters/ClaudeAdapter.js.map +1 -0
- package/dist/cortex/adapters/CodexAdapter.d.ts +10 -0
- package/dist/cortex/adapters/CodexAdapter.js +52 -0
- package/dist/cortex/adapters/CodexAdapter.js.map +1 -0
- package/dist/cortex/adapters/CursorAdapter.d.ts +10 -0
- package/dist/cortex/adapters/CursorAdapter.js +46 -0
- package/dist/cortex/adapters/CursorAdapter.js.map +1 -0
- package/dist/cortex/adapters/GeminiAdapter.d.ts +11 -0
- package/dist/cortex/adapters/GeminiAdapter.js +48 -0
- package/dist/cortex/adapters/GeminiAdapter.js.map +1 -0
- package/dist/env/EnvironmentDoctor.js +221 -5
- package/dist/env/EnvironmentDoctor.js.map +1 -1
- package/dist/eval/BenchmarkPublisher.d.ts +25 -0
- package/dist/eval/BenchmarkPublisher.js +27 -0
- package/dist/eval/BenchmarkPublisher.js.map +1 -0
- package/dist/guardrails/DependencyAuditor.js +10 -1
- package/dist/guardrails/DependencyAuditor.js.map +1 -1
- package/dist/memory/MemoryProviders.js +38 -91
- package/dist/memory/MemoryProviders.js.map +1 -1
- package/dist/orchestrator/OrchestratorDaemon.d.ts +44 -0
- package/dist/orchestrator/OrchestratorDaemon.js +150 -0
- package/dist/orchestrator/OrchestratorDaemon.js.map +1 -0
- package/dist/orchestrator/PolicyLoader.d.ts +80 -0
- package/dist/orchestrator/PolicyLoader.js +229 -0
- package/dist/orchestrator/PolicyLoader.js.map +1 -0
- package/dist/orchestrator/ReconciliationLoop.d.ts +71 -0
- package/dist/orchestrator/ReconciliationLoop.js +266 -0
- package/dist/orchestrator/ReconciliationLoop.js.map +1 -0
- package/dist/orchestrator/TrackerAdapter.d.ts +60 -0
- package/dist/orchestrator/TrackerAdapter.js +147 -0
- package/dist/orchestrator/TrackerAdapter.js.map +1 -0
- package/dist/orchestrator/WorkspaceManager.d.ts +66 -0
- package/dist/orchestrator/WorkspaceManager.js +257 -0
- package/dist/orchestrator/WorkspaceManager.js.map +1 -0
- package/dist/qa/BrowserDaemon.d.ts +23 -0
- package/dist/qa/BrowserDaemon.js +79 -0
- package/dist/qa/BrowserDaemon.js.map +1 -0
- package/dist/qa/E2ETestOrchestrator.d.ts +14 -0
- package/dist/qa/E2ETestOrchestrator.js +19 -0
- package/dist/qa/E2ETestOrchestrator.js.map +1 -0
- package/dist/review/CrossModelReviewer.d.ts +35 -0
- package/dist/review/CrossModelReviewer.js +75 -0
- package/dist/review/CrossModelReviewer.js.map +1 -0
- package/dist/review/ReviewAggregator.d.ts +13 -0
- package/dist/review/ReviewAggregator.js +28 -0
- package/dist/review/ReviewAggregator.js.map +1 -0
- package/dist/review/reviewCommands.d.ts +15 -0
- package/dist/review/reviewCommands.js +24 -0
- package/dist/review/reviewCommands.js.map +1 -0
- package/dist/routing/LocalModelProvider.d.ts +11 -0
- package/dist/routing/LocalModelProvider.js +21 -0
- package/dist/routing/LocalModelProvider.js.map +1 -0
- package/dist/routing/ModelRouter.d.ts +12 -0
- package/dist/routing/ModelRouter.js +31 -4
- package/dist/routing/ModelRouter.js.map +1 -1
- package/dist/runtime/AiOsRuntime.d.ts +1 -0
- package/dist/runtime/AiOsRuntime.js +15 -0
- package/dist/runtime/AiOsRuntime.js.map +1 -1
- package/dist/runtime/CostAnalyzer.d.ts +53 -0
- package/dist/runtime/CostAnalyzer.js +160 -0
- package/dist/runtime/CostAnalyzer.js.map +1 -0
- package/dist/runtime/CostOptimizer.d.ts +11 -0
- package/dist/runtime/CostOptimizer.js +21 -0
- package/dist/runtime/CostOptimizer.js.map +1 -0
- package/dist/runtime/ModelUsageLedger.d.ts +53 -2
- package/dist/runtime/ModelUsageLedger.js +243 -39
- package/dist/runtime/ModelUsageLedger.js.map +1 -1
- package/dist/setup/SetupVerification.d.ts +42 -0
- package/dist/setup/SetupVerification.js +180 -0
- package/dist/setup/SetupVerification.js.map +1 -0
- package/dist/shield/PolicyCompiler.d.ts +70 -0
- package/dist/shield/PolicyCompiler.js +540 -0
- package/dist/shield/PolicyCompiler.js.map +1 -0
- package/dist/shield/ProtectedPaths.d.ts +39 -0
- package/dist/shield/ProtectedPaths.js +179 -0
- package/dist/shield/ProtectedPaths.js.map +1 -0
- package/dist/shield/ShieldProtocol.d.ts +50 -0
- package/dist/shield/ShieldProtocol.js +103 -0
- package/dist/shield/ShieldProtocol.js.map +1 -0
- package/dist/skills/SkillMdStandard.d.ts +33 -0
- package/dist/skills/SkillMdStandard.js +88 -0
- package/dist/skills/SkillMdStandard.js.map +1 -0
- package/dist/skills/SkillRegistry.d.ts +9 -1
- package/dist/skills/SkillRegistry.js +20 -0
- package/dist/skills/SkillRegistry.js.map +1 -1
- package/dist/skills/interop/GStackInterop.d.ts +15 -0
- package/dist/skills/interop/GStackInterop.js +34 -0
- package/dist/skills/interop/GStackInterop.js.map +1 -0
- package/dist/skills/interop/OMCInterop.d.ts +15 -0
- package/dist/skills/interop/OMCInterop.js +34 -0
- package/dist/skills/interop/OMCInterop.js.map +1 -0
- package/dist/tools/ToolCapabilityRegistry.js +10 -0
- package/dist/tools/ToolCapabilityRegistry.js.map +1 -1
- package/dist/tui/TuiDashboard.d.ts +3 -0
- package/dist/tui/TuiDashboard.js +120 -0
- package/dist/tui/TuiDashboard.js.map +1 -0
- package/dist/workflow/GateCatalog.d.ts +2 -0
- package/dist/workflow/GateCatalog.js +59 -3
- package/dist/workflow/GateCatalog.js.map +1 -1
- package/dist/workflow/GovernanceTemplatePacks.d.ts +1 -1
- package/dist/workflow/GovernanceTemplatePacks.js +15 -0
- package/dist/workflow/GovernanceTemplatePacks.js.map +1 -1
- package/dist/workflow/TddLoop.d.ts +2 -0
- package/dist/workflow/TddLoop.js +2 -0
- package/dist/workflow/TddLoop.js.map +1 -1
- package/dist/workflow/UpgradeManager.d.ts +10 -1
- package/dist/workflow/UpgradeManager.js +55 -0
- package/dist/workflow/UpgradeManager.js.map +1 -1
- package/dist/workflow/VerificationProfile.d.ts +8 -0
- package/dist/workflow/VerificationProfile.js +62 -1
- package/dist/workflow/VerificationProfile.js.map +1 -1
- package/dist/workflow/VerificationSchema.d.ts +46 -0
- package/dist/workflow/VerificationSchema.js +97 -0
- package/dist/workflow/VerificationSchema.js.map +1 -0
- package/dist/workflow/autofix/AutoFixEngine.d.ts +37 -0
- package/dist/workflow/autofix/AutoFixEngine.js +169 -0
- package/dist/workflow/autofix/AutoFixEngine.js.map +1 -0
- package/dist/workflow/execution/RalphEngine.d.ts +18 -0
- package/dist/workflow/execution/RalphEngine.js +22 -0
- package/dist/workflow/execution/RalphEngine.js.map +1 -1
- package/dist/workflow/gates/EnhancedGates.d.ts +74 -0
- package/dist/workflow/gates/EnhancedGates.js +653 -0
- package/dist/workflow/gates/EnhancedGates.js.map +1 -0
- package/dist/workflow/gates/GateSystem.d.ts +3 -0
- package/dist/workflow/gates/GateSystem.js +94 -1
- package/dist/workflow/gates/GateSystem.js.map +1 -1
- package/dist/workflow/types.d.ts +1 -1
- package/docs/README.md +3 -0
- package/docs/guides/DEVELOPMENT_WORKFLOW.md +28 -9
- package/docs/guides/GETTING_STARTED.md +19 -0
- package/docs/guides/MIGRATION.md +119 -0
- package/docs/start/quickstart.md +1 -0
- package/docs/workflow/GATES_AND_SCORE.md +34 -1
- package/docs/workflow/README.md +58 -10
- package/package.json +7 -18
- package/scripts/workflow/lib/gbrain-runtime.mjs +185 -0
- package/scripts/workflow/lib/report-output.mjs +107 -0
- package/scripts/workflow/provider-rehearsal.mjs +129 -48
- package/scripts/workflow/setup-smoke.mjs +142 -8
- package/docs/ACTIVE_SECURITY_VISUAL_GATES.md +0 -87
- package/docs/AI_ENGINEERING_OS_POSITIONING.md +0 -607
- package/docs/BACKGROUND_HUNTER.md +0 -62
- package/docs/CODE_INTELLIGENCE.md +0 -180
- package/docs/CONTEXT_BUDGET.md +0 -155
- package/docs/DEPENDENCY_AUDIT.md +0 -118
- package/docs/EVOLUTION_SHADOW_MODE.md +0 -63
- package/docs/GITLAB_FLOW.md +0 -125
- package/docs/GOVERNANCE_DASHBOARD.md +0 -85
- package/docs/MEMORY_BRAIN.md +0 -104
- package/docs/MEMORY_FABRIC.md +0 -161
- package/docs/RESOURCE_GOVERNANCE.md +0 -92
- package/docs/RUNTIME_EVIDENCE.md +0 -101
- package/docs/WORKFLOW_EVAL.md +0 -151
- package/image/wechat-public.jpg +0 -0
- package/image/wxPay.jpg +0 -0
- 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.
|
|
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.
|
|
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
|
[](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 =
|
|
2844
|
-
|
|
2845
|
-
|
|
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);
|