@hongmaple0820/scale-engine 0.25.0 → 0.27.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 (171) hide show
  1. package/LICENSE +15 -15
  2. package/README.en.md +384 -346
  3. package/README.md +564 -529
  4. package/dist/adapters/AiderAdapter.js +52 -52
  5. package/dist/adapters/AntigravityAdapter.d.ts +4 -0
  6. package/dist/adapters/AntigravityAdapter.js +21 -0
  7. package/dist/adapters/AntigravityAdapter.js.map +1 -0
  8. package/dist/adapters/ClaudeCodeAdapter.d.ts +4 -1
  9. package/dist/adapters/ClaudeCodeAdapter.js +34 -34
  10. package/dist/adapters/ClaudeCodeAdapter.js.map +1 -1
  11. package/dist/adapters/ClineAdapter.d.ts +4 -0
  12. package/dist/adapters/ClineAdapter.js +20 -0
  13. package/dist/adapters/ClineAdapter.js.map +1 -0
  14. package/dist/adapters/CodexAdapter.js +28 -28
  15. package/dist/adapters/CursorAdapter.js +26 -26
  16. package/dist/adapters/DeepSeekTuiAdapter.js +97 -97
  17. package/dist/adapters/DoubaoAdapter.js +33 -33
  18. package/dist/adapters/GeminiAdapter.js +26 -26
  19. package/dist/adapters/GenericProjectAgentAdapter.d.ts +29 -0
  20. package/dist/adapters/GenericProjectAgentAdapter.js +204 -0
  21. package/dist/adapters/GenericProjectAgentAdapter.js.map +1 -0
  22. package/dist/adapters/HermesAdapter.js +26 -26
  23. package/dist/adapters/JCodeAdapter.d.ts +4 -0
  24. package/dist/adapters/JCodeAdapter.js +19 -0
  25. package/dist/adapters/JCodeAdapter.js.map +1 -0
  26. package/dist/adapters/KiloCodeAdapter.d.ts +4 -0
  27. package/dist/adapters/KiloCodeAdapter.js +20 -0
  28. package/dist/adapters/KiloCodeAdapter.js.map +1 -0
  29. package/dist/adapters/KimiAdapter.js +32 -32
  30. package/dist/adapters/KiroAdapter.js +26 -26
  31. package/dist/adapters/OpenClawAdapter.js +26 -26
  32. package/dist/adapters/OpenCodeAdapter.js +26 -26
  33. package/dist/adapters/QCoderAdapter.js +26 -26
  34. package/dist/adapters/QoderAdapter.d.ts +4 -0
  35. package/dist/adapters/QoderAdapter.js +21 -0
  36. package/dist/adapters/QoderAdapter.js.map +1 -0
  37. package/dist/adapters/TraeAdapter.js +26 -26
  38. package/dist/adapters/VSCAdapter.js +26 -26
  39. package/dist/adapters/WindsurfAdapter.js +32 -32
  40. package/dist/adapters/WorkBuddyAdapter.js +26 -26
  41. package/dist/adapters/index.d.ts +5 -0
  42. package/dist/adapters/index.js +15 -0
  43. package/dist/adapters/index.js.map +1 -1
  44. package/dist/api/cli.js +190 -56
  45. package/dist/api/cli.js.map +1 -1
  46. package/dist/api/doctor.js +10 -3
  47. package/dist/api/doctor.js.map +1 -1
  48. package/dist/api/quickstart.js +7 -1
  49. package/dist/api/quickstart.js.map +1 -1
  50. package/dist/artifact/sqliteStore.js +89 -89
  51. package/dist/artifact/types.d.ts +1 -1
  52. package/dist/cli/phaseCommands.js +53 -53
  53. package/dist/cli/phaseCommands.js.map +1 -1
  54. package/dist/context/AntiPatternRegistry.js +20 -20
  55. package/dist/context/ContextBudget.d.ts +14 -0
  56. package/dist/context/ContextBudget.js +50 -14
  57. package/dist/context/ContextBudget.js.map +1 -1
  58. package/dist/context/ContextBuilder.js +155 -155
  59. package/dist/context/ContextCompiler.d.ts +34 -0
  60. package/dist/context/ContextCompiler.js +120 -0
  61. package/dist/context/ContextCompiler.js.map +1 -0
  62. package/dist/eval/WorkflowEval.js +4 -6
  63. package/dist/eval/WorkflowEval.js.map +1 -1
  64. package/dist/evolution/EvolutionEngine.js +31 -31
  65. package/dist/evolution/EvolutionEvaluator.d.ts +2 -0
  66. package/dist/evolution/EvolutionEvaluator.js +7 -1
  67. package/dist/evolution/EvolutionEvaluator.js.map +1 -1
  68. package/dist/fsm/FSMAgentBridge.js +11 -11
  69. package/dist/governance/GovernanceRoi.d.ts +6 -1
  70. package/dist/governance/GovernanceRoi.js +32 -0
  71. package/dist/governance/GovernanceRoi.js.map +1 -1
  72. package/dist/guardrails/DependencyAuditor.js +38 -0
  73. package/dist/guardrails/DependencyAuditor.js.map +1 -1
  74. package/dist/hooks/HookGeneratorEnhanced.js +218 -218
  75. package/dist/index.d.ts +2 -1
  76. package/dist/index.js +3 -2
  77. package/dist/index.js.map +1 -1
  78. package/dist/knowledge/SQLiteKnowledgeBase.js +28 -28
  79. package/dist/memory/MemoryBrain.js +52 -52
  80. package/dist/output/GovernanceDashboard.js +44 -44
  81. package/dist/output/HTMLArtifactLayer.js +31 -31
  82. package/dist/prompts/VibeTemplateGallery.js +121 -121
  83. package/dist/runtime/AiOsRuntime.d.ts +53 -0
  84. package/dist/runtime/AiOsRuntime.js +142 -0
  85. package/dist/runtime/AiOsRuntime.js.map +1 -0
  86. package/dist/runtime/index.d.ts +1 -0
  87. package/dist/runtime/index.js +1 -0
  88. package/dist/runtime/index.js.map +1 -1
  89. package/dist/skills/SkillDiscovery.js +12 -1
  90. package/dist/skills/SkillDiscovery.js.map +1 -1
  91. package/dist/skills/routing/SkillPlanner.js +128 -40
  92. package/dist/skills/routing/SkillPlanner.js.map +1 -1
  93. package/dist/skills/routing/SkillRoutingTypes.d.ts +17 -0
  94. package/dist/tools/SafeCommandRunner.d.ts +16 -0
  95. package/dist/tools/SafeCommandRunner.js +83 -0
  96. package/dist/tools/SafeCommandRunner.js.map +1 -0
  97. package/dist/workflow/EngineeringStandards.js +62 -62
  98. package/dist/workflow/GovernanceTemplatePacks.d.ts +1 -1
  99. package/dist/workflow/GovernanceTemplatePacks.js +1990 -162
  100. package/dist/workflow/GovernanceTemplatePacks.js.map +1 -1
  101. package/dist/workflow/GovernanceTemplates.d.ts +2 -0
  102. package/dist/workflow/GovernanceTemplates.js +1012 -1001
  103. package/dist/workflow/GovernanceTemplates.js.map +1 -1
  104. package/dist/workflow/ResourceGovernance.js +16 -16
  105. package/dist/workflow/TaskArtifactScaffolder.js +10 -10
  106. package/dist/workflow/UpgradeManager.d.ts +3 -2
  107. package/dist/workflow/UpgradeManager.js +134 -49
  108. package/dist/workflow/UpgradeManager.js.map +1 -1
  109. package/dist/workflow/WorkspaceTopology.js +18 -15
  110. package/dist/workflow/WorkspaceTopology.js.map +1 -1
  111. package/dist/workflow/gates/GateSystem.js +3 -9
  112. package/dist/workflow/gates/GateSystem.js.map +1 -1
  113. package/docs/ACTIVE_SECURITY_VISUAL_GATES.md +87 -87
  114. package/docs/AI_ENGINEERING_OS_POSITIONING.md +462 -0
  115. package/docs/BACKGROUND_HUNTER.md +62 -62
  116. package/docs/CODE_INTELLIGENCE.md +138 -138
  117. package/docs/CONTEXT_BUDGET.md +155 -113
  118. package/docs/DEPENDENCY_AUDIT.md +118 -89
  119. package/docs/EVOLUTION_SHADOW_MODE.md +63 -63
  120. package/docs/EXTERNAL_REFERENCES.md +63 -58
  121. package/docs/GITLAB_FLOW.md +125 -125
  122. package/docs/GOVERNANCE_DASHBOARD.md +85 -85
  123. package/docs/MEMORY_BRAIN.md +104 -104
  124. package/docs/MEMORY_FABRIC.md +136 -134
  125. package/docs/README.md +102 -92
  126. package/docs/RUNTIME_EVIDENCE.md +101 -101
  127. package/docs/SKILL-REPOSITORY.md +57 -57
  128. package/docs/SKILL_RADAR.md +135 -122
  129. package/docs/THIRD_PARTY_SKILLS.md +57 -57
  130. package/docs/WORKFLOW_EVAL.md +151 -151
  131. package/docs/guides/DEVELOPMENT_WORKFLOW.md +80 -0
  132. package/docs/guides/GETTING_STARTED.md +50 -0
  133. package/docs/start/README.md +78 -72
  134. package/docs/start/agent-governance-demo.md +107 -107
  135. package/docs/start/quickstart.md +137 -127
  136. package/docs/start/workflow-upgrade.md +32 -8
  137. package/docs/workflow/README.md +67 -0
  138. package/docs/workflow/node-library.md +52 -0
  139. package/docs/workflow/templates/api-contract.md +29 -0
  140. package/docs/workflow/templates/architecture-review.md +23 -0
  141. package/docs/workflow/templates/db-change-plan.md +20 -0
  142. package/docs/workflow/templates/docs-impact.md +17 -0
  143. package/docs/workflow/templates/e2e-plan.md +20 -0
  144. package/docs/workflow/templates/explore.md +16 -0
  145. package/docs/workflow/templates/github-actions-scale-preflight.yml +32 -0
  146. package/docs/workflow/templates/mini-prd.md +16 -0
  147. package/docs/workflow/templates/plan.md +37 -0
  148. package/docs/workflow/templates/pre-push-scale-preflight.sh +8 -0
  149. package/docs/workflow/templates/product-smoke.md +61 -0
  150. package/docs/workflow/templates/reality-check.md +28 -0
  151. package/docs/workflow/templates/resource-cleanup.md +17 -0
  152. package/docs/workflow/templates/resource-impact.md +25 -0
  153. package/docs/workflow/templates/review.md +12 -0
  154. package/docs/workflow/templates/runtime.md +23 -0
  155. package/docs/workflow/templates/security-review.md +26 -0
  156. package/docs/workflow/templates/skill-evidence.md +33 -0
  157. package/docs/workflow/templates/skill-plan.md +39 -0
  158. package/docs/workflow/templates/spec.md +17 -0
  159. package/docs/workflow/templates/standards-impact.md +28 -0
  160. package/docs/workflow/templates/summary.md +16 -0
  161. package/docs/workflow/templates/tasks.md +8 -0
  162. package/docs/workflow/templates/ui-spec.md +29 -0
  163. package/docs/workflow/templates/verification.md +20 -0
  164. package/docs/workflow/templates/visual-review.md +20 -0
  165. package/examples/demo-projects/agent-governance-demo/CONTEXT.md +14 -14
  166. package/examples/demo-projects/agent-governance-demo/README.md +48 -48
  167. package/examples/demo-projects/agent-governance-demo/docs/CONTEXT-MAP.md +14 -14
  168. package/examples/demo-projects/agent-governance-demo/package.json +22 -21
  169. package/examples/demo-projects/agent-governance-demo/src/oauth-state.ts +39 -39
  170. package/examples/demo-projects/agent-governance-demo/tests/oauth-state.test.ts +52 -52
  171. package/package.json +95 -78
package/dist/api/cli.js CHANGED
@@ -60,11 +60,12 @@ import { evaluateToolEvidenceGate } from '../tools/ToolEvidenceGate.js';
60
60
  import { ToolEvidenceStore } from '../tools/ToolEvidenceStore.js';
61
61
  import { ToolOrchestrator } from '../tools/ToolOrchestrator.js';
62
62
  import { loadToolPolicy, toolPolicyTemplate } from '../tools/ToolPolicy.js';
63
+ import { runSafeCommand } from '../tools/SafeCommandRunner.js';
63
64
  import { doctorHtmlArtifacts, renderHtmlArtifact, resolveHtmlArtifactForOpen, settleHtmlArtifacts, } from '../output/HTMLArtifactLayer.js';
64
65
  import { renderGovernanceDashboard } from '../output/GovernanceDashboard.js';
65
66
  import { cleanupWorkspaceLifecycle, inspectWorkspaceLifecycle, } from '../workflow/WorkspaceLifecycle.js';
66
67
  import { inspectWorkspaceSafety } from '../workflow/WorkspaceSafety.js';
67
- import { RuntimeEvidenceLedger, SessionLedger, doctorRuntimeEvidence, evaluateFinalReportReadiness, } from '../runtime/index.js';
68
+ import { RuntimeEvidenceLedger, SessionLedger, createAiOsPlan, doctorRuntimeEvidence, evaluateFinalReportReadiness, } from '../runtime/index.js';
68
69
  import { MemoryFabric, MemoryBrain, doctorMemoryFabric, renderContextPackMarkdown, renderMemoryLearningCandidateMarkdown, inspectMemoryProviders, recallMemoryProviders, settleMemoryLearning, writeMemoryProvidersConfig, } from '../memory/index.js';
69
70
  import { resolveWorkspaceTopology, workspaceTopologyPath, workspaceTopologyTemplate, } from '../workflow/WorkspaceTopology.js';
70
71
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
@@ -663,14 +664,13 @@ const verifyTask = defineCommand({
663
664
  };
664
665
  // Helper: run command and capture exit code
665
666
  const runCmd = async (cmd) => {
666
- const { spawn } = await import('node:child_process');
667
- return new Promise((resolve) => {
668
- const child = spawn(cmd, [], { shell: true, stdio: 'pipe' });
669
- let output = '';
670
- child.stdout?.on('data', (d) => (output += d));
671
- child.stderr?.on('data', (d) => (output += d));
672
- child.on('close', (code) => resolve({ exitCode: code ?? 1, output }));
673
- });
667
+ try {
668
+ const result = await runSafeCommand(cmd);
669
+ return { exitCode: result.exitCode, output: [result.stdout, result.stderr].filter(Boolean).join('\n') };
670
+ }
671
+ catch (error) {
672
+ return { exitCode: 1, output: error instanceof Error ? error.message : String(error) };
673
+ }
674
674
  };
675
675
  // Run build
676
676
  if (!args['skip-build']) {
@@ -2537,7 +2537,7 @@ const init = defineCommand({
2537
2537
  'governance-pack': {
2538
2538
  type: 'string',
2539
2539
  default: 'standard',
2540
- description: 'Governance template pack (standard/project-scaffold/moe-workspace/resource-governance/go-service-matrix/node-library/frontend-app)',
2540
+ description: 'Governance template pack (standard/project-scaffold/scale-engine-repo/moe-workspace/resource-governance/go-service-matrix/node-library/frontend-app)',
2541
2541
  },
2542
2542
  quick: { type: 'boolean', default: false, description: 'Quick start with auto-detection' },
2543
2543
  interactive: { type: 'boolean', default: false, description: 'Interactive configuration mode with prompts' },
@@ -2907,17 +2907,66 @@ const governance = defineCommand({
2907
2907
  meta: { name: 'governance', description: 'Governance template pack tools' },
2908
2908
  subCommands: { diff: governanceDiff, mode: governanceModeCommand, roi: governanceRoiCommand },
2909
2909
  });
2910
+ const aiOsPlanCommand = defineCommand({
2911
+ meta: { name: 'plan', description: 'Create a unified AI OS runtime plan for governance, context, memory, skills, and ROI' },
2912
+ args: {
2913
+ dir: { type: 'string', default: PROJECT_DIR, description: 'Project directory' },
2914
+ 'task-id': { type: 'string', description: 'Task id' },
2915
+ task: { type: 'string', required: true, description: 'Task or requirement description' },
2916
+ level: { type: 'string', default: 'M', description: 'Task level: S, M, L, or CRITICAL' },
2917
+ files: { type: 'string', description: 'Comma-separated changed or target files' },
2918
+ services: { type: 'string', description: 'Comma-separated affected services' },
2919
+ budget: { type: 'string', description: 'Maximum estimated tokens for the context compiler' },
2920
+ 'requested-mode': { type: 'string', description: 'Requested governance mode: minimal, standard, expanded, or critical' },
2921
+ json: { type: 'boolean', default: false },
2922
+ },
2923
+ async run({ args }) {
2924
+ const projectDir = resolve(String(args.dir ?? PROJECT_DIR));
2925
+ const scaleDir = resolveScaleDirForProject(projectDir);
2926
+ const plan = await createAiOsPlan({
2927
+ projectDir,
2928
+ scaleDir,
2929
+ taskId: args['task-id'] ? String(args['task-id']) : undefined,
2930
+ task: String(args.task),
2931
+ level: normalizeTaskArtifactLevel(args.level),
2932
+ files: parseCommaList(args.files),
2933
+ services: parseCommaList(args.services),
2934
+ budget: parsePositiveIntArg(args.budget, '--budget'),
2935
+ requestedMode: normalizeGovernanceMode(args['requested-mode']),
2936
+ });
2937
+ if (args.json) {
2938
+ console.log(JSON.stringify(plan, null, 2));
2939
+ return;
2940
+ }
2941
+ console.log('SCALE AI OS Runtime Plan');
2942
+ console.log(` Version: ${plan.version}`);
2943
+ console.log(` Task: ${plan.task.taskId ?? 'n/a'} ${plan.task.task}`);
2944
+ console.log(` Governance: ${plan.governance.effectiveMode}`);
2945
+ console.log(` Context: ${plan.context.totalEstimatedTokens}/${plan.context.task.budget} tokens; saved ${plan.context.compiler?.estimatedTokenSavings ?? 0}`);
2946
+ console.log(` Memory: ${plan.memory.items.length} item(s); providers ${plan.memory.providerOrder.join(' -> ')}`);
2947
+ console.log(` Skill steps: ${plan.skillPlan.executionPlan.steps.length}`);
2948
+ console.log(` ROI: ${plan.roi.summary.recommendation}`);
2949
+ for (const recommendation of plan.recommendations)
2950
+ console.log(` recommendation: ${recommendation}`);
2951
+ },
2952
+ });
2953
+ const aiOs = defineCommand({
2954
+ meta: { name: 'ai-os', description: 'AI Engineering OS runtime planning and governance orchestration' },
2955
+ subCommands: { plan: aiOsPlanCommand },
2956
+ });
2910
2957
  // ============================================================================
2911
2958
  // upgrade command - Safe workflow/template/capability update planning
2912
2959
  // ============================================================================
2913
2960
  const upgradeCheck = defineCommand({
2914
- meta: { name: 'check', description: 'Check SCALE workflow, governance pack, and third-party capability update status' },
2961
+ meta: { name: 'check', description: '检查 SCALE 工作流、治理包和第三方能力更新状态 / Check SCALE workflow, governance pack, and third-party capability update status' },
2915
2962
  args: {
2916
- dir: { type: 'string', default: PROJECT_DIR, description: 'Project directory' },
2917
- 'target-version': { type: 'string', description: 'Target SCALE Engine version; defaults to the running CLI version' },
2918
- json: { type: 'boolean', default: false, description: 'Print JSON output' },
2963
+ dir: { type: 'string', default: PROJECT_DIR, description: '项目目录 / Project directory' },
2964
+ 'target-version': { type: 'string', description: '目标 SCALE Engine 版本,默认使用当前 CLI 版本 / Target SCALE Engine version' },
2965
+ lang: { type: 'string', default: 'zh', description: '输出语言 zh/en / Output language' },
2966
+ json: { type: 'boolean', default: false, description: '输出 JSON / Print JSON output' },
2919
2967
  },
2920
2968
  run({ args }) {
2969
+ const lang = normalizeLangArg(args.lang);
2921
2970
  const report = createUpgradeCheckReport({
2922
2971
  projectDir: args.dir,
2923
2972
  targetScaleVersion: args['target-version'] ? String(args['target-version']) : undefined,
@@ -2926,63 +2975,87 @@ const upgradeCheck = defineCommand({
2926
2975
  console.log(JSON.stringify(report, null, 2));
2927
2976
  return;
2928
2977
  }
2929
- console.log('SCALE Upgrade Check');
2930
- console.log(` Project: ${report.projectDir}`);
2931
- console.log(` Status: ${report.status}`);
2932
- console.log(` SCALE Engine: ${report.scaleEngine.currentVersion ?? 'none'} -> ${report.scaleEngine.latestVersion}`);
2933
- console.log(` Governance pack: ${report.governancePack.id ?? 'none'} v${report.governancePack.currentVersion ?? 'none'} -> v${report.governancePack.latestVersion ?? 'none'}`);
2934
- console.log(` Generated files: ${report.generatedFiles.clean} clean, ${report.generatedFiles.changed} changed, ${report.generatedFiles.missing} missing`);
2935
- console.log(` Third-party policy: ${report.thirdParty.policy}; review required: ${report.thirdParty.reviewRequired}`);
2936
- console.log(' Next:');
2978
+ if (lang === 'zh') {
2979
+ console.log('SCALE 升级检查');
2980
+ console.log(` 项目: ${report.projectDir}`);
2981
+ console.log(` 状态: ${report.status}`);
2982
+ console.log(` SCALE Engine: ${report.scaleEngine.currentVersion ?? ''} -> ${report.scaleEngine.latestVersion}`);
2983
+ console.log(` 治理包: ${report.governancePack.id ?? '无'} v${report.governancePack.currentVersion ?? '无'} -> v${report.governancePack.latestVersion ?? '无'}`);
2984
+ console.log(` 受管生成文件: ${report.generatedFiles.clean} 个干净, ${report.generatedFiles.changed} 个本地改动, ${report.generatedFiles.missing} 个缺失`);
2985
+ console.log(` 第三方能力策略: ${report.thirdParty.policy}; 需要人工审查: ${report.thirdParty.reviewRequired}`);
2986
+ console.log(' 下一步:');
2987
+ }
2988
+ else {
2989
+ console.log('SCALE Upgrade Check');
2990
+ console.log(` Project: ${report.projectDir}`);
2991
+ console.log(` Status: ${report.status}`);
2992
+ console.log(` SCALE Engine: ${report.scaleEngine.currentVersion ?? 'none'} -> ${report.scaleEngine.latestVersion}`);
2993
+ console.log(` Governance pack: ${report.governancePack.id ?? 'none'} v${report.governancePack.currentVersion ?? 'none'} -> v${report.governancePack.latestVersion ?? 'none'}`);
2994
+ console.log(` Generated files: ${report.generatedFiles.clean} clean, ${report.generatedFiles.changed} changed, ${report.generatedFiles.missing} missing`);
2995
+ console.log(` Third-party policy: ${report.thirdParty.policy}; review required: ${report.thirdParty.reviewRequired}`);
2996
+ console.log(' Next:');
2997
+ }
2937
2998
  for (const command of report.recommendedCommands)
2938
2999
  console.log(` ${command}`);
2939
3000
  },
2940
3001
  });
2941
3002
  const upgradePlan = defineCommand({
2942
- meta: { name: 'plan', description: 'Create a non-destructive SCALE upgrade plan' },
3003
+ meta: { name: 'plan', description: '生成非破坏性的 SCALE 升级计划 / Create a non-destructive SCALE upgrade plan' },
2943
3004
  args: {
2944
- dir: { type: 'string', default: PROJECT_DIR, description: 'Project directory' },
2945
- 'target-version': { type: 'string', description: 'Target SCALE Engine version; defaults to the running CLI version' },
2946
- html: { type: 'boolean', default: false, description: 'Write .scale/reports/upgrade-plan.html' },
2947
- json: { type: 'boolean', default: false, description: 'Print JSON output' },
3005
+ dir: { type: 'string', default: PROJECT_DIR, description: '项目目录 / Project directory' },
3006
+ 'target-version': { type: 'string', description: '目标 SCALE Engine 版本,默认使用当前 CLI 版本 / Target SCALE Engine version' },
3007
+ html: { type: 'boolean', default: false, description: '写入 .scale/reports/upgrade-plan.html / Write HTML plan' },
3008
+ lang: { type: 'string', default: 'zh', description: '输出语言 zh/en / Output language' },
3009
+ json: { type: 'boolean', default: false, description: '输出 JSON / Print JSON output' },
2948
3010
  },
2949
3011
  run({ args }) {
3012
+ const lang = normalizeLangArg(args.lang);
2950
3013
  const report = createUpgradePlanReport({
2951
3014
  projectDir: args.dir,
2952
3015
  targetScaleVersion: args['target-version'] ? String(args['target-version']) : undefined,
2953
3016
  });
2954
- const htmlPath = args.html ? writeUpgradePlanHtml(report) : undefined;
3017
+ const htmlPath = args.html ? writeUpgradePlanHtml(report, undefined, lang) : undefined;
2955
3018
  if (args.json) {
2956
3019
  console.log(JSON.stringify({ ...report, htmlPath }, null, 2));
2957
3020
  return;
2958
3021
  }
2959
- console.log('SCALE Upgrade Plan');
2960
- console.log(` Project: ${report.projectDir}`);
2961
- console.log(` Status: ${report.status}`);
2962
- console.log(` Apply mode: ${report.applyMode}`);
3022
+ if (lang === 'zh') {
3023
+ console.log('SCALE 升级计划');
3024
+ console.log(` 项目: ${report.projectDir}`);
3025
+ console.log(` 状态: ${report.status}`);
3026
+ console.log(` 应用模式: ${report.applyMode}`);
3027
+ }
3028
+ else {
3029
+ console.log('SCALE Upgrade Plan');
3030
+ console.log(` Project: ${report.projectDir}`);
3031
+ console.log(` Status: ${report.status}`);
3032
+ console.log(` Apply mode: ${report.applyMode}`);
3033
+ }
2963
3034
  if (report.blockers.length > 0) {
2964
- console.log(' Blockers:');
3035
+ console.log(lang === 'zh' ? ' 阻塞项:' : ' Blockers:');
2965
3036
  for (const blocker of report.blockers)
2966
- console.log(` [${blocker.code}] ${blocker.path ?? ''} ${blocker.message}`);
3037
+ console.log(` [${blocker.code}] ${blocker.path ?? ''} ${formatUpgradeBlockerMessage(blocker.code, blocker.message, lang)}`);
2967
3038
  }
2968
- console.log(' Steps:');
3039
+ console.log(lang === 'zh' ? ' 步骤:' : ' Steps:');
2969
3040
  for (const step of report.steps) {
2970
3041
  const path = step.path ? ` ${step.path}` : '';
2971
3042
  const command = step.command ? ` -> ${step.command}` : '';
2972
- console.log(` [${step.risk}] ${step.action}${path}: ${step.reason}${command}`);
3043
+ console.log(` [${step.risk}] ${step.action}${path}: ${formatUpgradeStepReason(step.action, step.reason, lang)}${command}`);
2973
3044
  }
2974
3045
  if (htmlPath)
2975
3046
  console.log(` HTML: ${htmlPath}`);
2976
3047
  },
2977
3048
  });
2978
3049
  const upgradeApply = defineCommand({
2979
- meta: { name: 'apply', description: 'Guarded entrypoint for applying an upgrade plan' },
3050
+ meta: { name: 'apply', description: '按已审阅计划安全应用升级 / Guarded entrypoint for applying an upgrade plan' },
2980
3051
  args: {
2981
- dir: { type: 'string', default: PROJECT_DIR, description: 'Project directory' },
2982
- confirm: { type: 'boolean', default: false, description: 'Confirm that the current plan was reviewed' },
2983
- json: { type: 'boolean', default: false, description: 'Print JSON output' },
3052
+ dir: { type: 'string', default: PROJECT_DIR, description: '项目目录 / Project directory' },
3053
+ confirm: { type: 'boolean', default: false, description: '确认当前升级计划已经审阅 / Confirm the current plan was reviewed' },
3054
+ lang: { type: 'string', default: 'zh', description: '输出语言 zh/en / Output language' },
3055
+ json: { type: 'boolean', default: false, description: '输出 JSON / Print JSON output' },
2984
3056
  },
2985
3057
  run({ args }) {
3058
+ const lang = normalizeLangArg(args.lang);
2986
3059
  const result = applyUpgradePlan({
2987
3060
  projectDir: args.dir,
2988
3061
  confirm: isTruthyFlag(args.confirm),
@@ -2993,25 +3066,27 @@ const upgradeApply = defineCommand({
2993
3066
  process.exitCode = 1;
2994
3067
  return;
2995
3068
  }
2996
- console.log('SCALE Upgrade Apply');
2997
- console.log(` Applied: ${result.applied}`);
2998
- console.log(` Reason: ${result.reason}`);
2999
- console.log(` Apply mode: ${result.plan.applyMode}`);
3069
+ console.log(lang === 'zh' ? 'SCALE 应用升级' : 'SCALE Upgrade Apply');
3070
+ console.log(lang === 'zh' ? ` 已应用: ${result.applied}` : ` Applied: ${result.applied}`);
3071
+ console.log(lang === 'zh' ? ` 原因: ${formatUpgradeApplyReason(result.reason, lang)}` : ` Reason: ${result.reason}`);
3072
+ console.log(lang === 'zh' ? ` 应用模式: ${result.plan.applyMode}` : ` Apply mode: ${result.plan.applyMode}`);
3000
3073
  if (result.backup)
3001
- console.log(` Backup: ${result.backup.manifestPath}`);
3074
+ console.log(lang === 'zh' ? ` 备份: ${result.backup.manifestPath}` : ` Backup: ${result.backup.manifestPath}`);
3002
3075
  for (const path of result.changedFiles)
3003
- console.log(` changed: ${path}`);
3076
+ console.log(lang === 'zh' ? ` 已变更: ${path}` : ` changed: ${path}`);
3004
3077
  if (!result.ok)
3005
3078
  process.exitCode = 1;
3006
3079
  },
3007
3080
  });
3008
3081
  const upgradeRollback = defineCommand({
3009
- meta: { name: 'rollback', description: 'Explain rollback state for SCALE upgrades' },
3082
+ meta: { name: 'rollback', description: '回滚最近一次 SCALE 托管升级 / Roll back the latest SCALE-managed upgrade' },
3010
3083
  args: {
3011
- dir: { type: 'string', default: PROJECT_DIR, description: 'Project directory' },
3012
- json: { type: 'boolean', default: false, description: 'Print JSON output' },
3084
+ dir: { type: 'string', default: PROJECT_DIR, description: '项目目录 / Project directory' },
3085
+ lang: { type: 'string', default: 'zh', description: '输出语言 zh/en / Output language' },
3086
+ json: { type: 'boolean', default: false, description: '输出 JSON / Print JSON output' },
3013
3087
  },
3014
3088
  run({ args }) {
3089
+ const lang = normalizeLangArg(args.lang);
3015
3090
  const result = rollbackLatestUpgrade({ projectDir: args.dir });
3016
3091
  if (args.json) {
3017
3092
  console.log(JSON.stringify(result, null, 2));
@@ -3019,21 +3094,78 @@ const upgradeRollback = defineCommand({
3019
3094
  process.exitCode = 1;
3020
3095
  return;
3021
3096
  }
3022
- console.log('SCALE Upgrade Rollback');
3023
- console.log(` Applied: ${result.applied}`);
3024
- console.log(` Reason: ${result.reason}`);
3097
+ console.log(lang === 'zh' ? 'SCALE 升级回滚' : 'SCALE Upgrade Rollback');
3098
+ console.log(lang === 'zh' ? ` 已回滚: ${result.applied}` : ` Applied: ${result.applied}`);
3099
+ console.log(lang === 'zh' ? ` 原因: ${formatUpgradeApplyReason(result.reason, lang)}` : ` Reason: ${result.reason}`);
3025
3100
  if (result.backup)
3026
- console.log(` Backup: ${result.backup.manifestPath}`);
3101
+ console.log(lang === 'zh' ? ` 备份: ${result.backup.manifestPath}` : ` Backup: ${result.backup.manifestPath}`);
3027
3102
  for (const path of result.restoredFiles)
3028
- console.log(` restored: ${path}`);
3103
+ console.log(lang === 'zh' ? ` 已恢复: ${path}` : ` restored: ${path}`);
3029
3104
  if (!result.ok)
3030
3105
  process.exitCode = 1;
3031
3106
  },
3032
3107
  });
3033
3108
  const upgrade = defineCommand({
3034
- meta: { name: 'upgrade', description: 'Safe update planning for SCALE workflow, generated templates, skills, MCP, and CLI tools' },
3109
+ meta: { name: 'upgrade', description: 'SCALE 工作流、模板、skills、MCP、CLI 工具的安全升级规划 / Safe update planning for workflow assets' },
3035
3110
  subCommands: { check: upgradeCheck, plan: upgradePlan, apply: upgradeApply, rollback: upgradeRollback },
3036
3111
  });
3112
+ function formatUpgradeBlockerMessage(code, fallback, lang) {
3113
+ if (lang !== 'zh')
3114
+ return fallback;
3115
+ if (code === 'missing-governance-lock')
3116
+ return '缺少治理锁文件,无法判断哪些生成文件可以安全升级。';
3117
+ if (code === 'local-generated-file-changed')
3118
+ return '受管生成文件已有本地改动,需要三方对比或人工审阅后再升级。';
3119
+ return fallback;
3120
+ }
3121
+ function formatUpgradeStepReason(action, fallback, lang) {
3122
+ if (lang !== 'zh')
3123
+ return fallback;
3124
+ switch (action) {
3125
+ case 'initialize-governance-lock':
3126
+ return '先创建治理锁文件,后续才能安全升级生成的治理资产。';
3127
+ case 'upgrade-scale-engine':
3128
+ return fallback.replace('SCALE Engine changed from', 'SCALE Engine 版本变化:').replace(' to ', ' -> ');
3129
+ case 'upgrade-governance-pack':
3130
+ return fallback.replace('Governance pack', '治理包').replace('changed from', '版本变化:').replace(' to ', ' -> ');
3131
+ case 'refresh-managed-generated-files':
3132
+ return fallback.replace('clean managed governance files can be refreshed automatically; local edits still block automatic apply.', '个干净受管治理文件可自动刷新;已有本地改动的文件仍会阻止自动应用。');
3133
+ case 'restore-missing-generated-file':
3134
+ return '该文件由治理锁管理,但当前本地缺失,可从当前治理包恢复。';
3135
+ case 'review-local-change':
3136
+ return '需要保留、合并或明确替换本地改动,不能自动覆盖。';
3137
+ case 'review-third-party-capability':
3138
+ return fallback
3139
+ .replace('updates require manual-review; SCALE never auto-installs third-party capabilities.', '更新需要人工审阅;SCALE 不会自动安装第三方能力。')
3140
+ .replace('updates require blocked; SCALE never auto-installs third-party capabilities.', '更新默认阻断;SCALE 不会自动安装第三方能力。');
3141
+ case 'run-preflight':
3142
+ return '完成已接受的升级后,运行项目级预检。';
3143
+ default:
3144
+ return fallback;
3145
+ }
3146
+ }
3147
+ function formatUpgradeApplyReason(reason, lang) {
3148
+ if (lang !== 'zh')
3149
+ return reason;
3150
+ switch (reason) {
3151
+ case 'Review scale upgrade plan first, then rerun with --confirm.':
3152
+ return '请先审阅 SCALE 升级计划,再使用 --confirm 重新运行。';
3153
+ case 'Upgrade requires manual review because generated files have local changes or the lock is missing.':
3154
+ return '生成文件存在本地改动或缺少锁文件,本次升级需要人工审阅。';
3155
+ case 'Cannot apply without a governance lock and pack id.':
3156
+ return '缺少治理锁文件或治理包 ID,无法应用升级。';
3157
+ case 'No safe upgrade changes were needed.':
3158
+ return '没有需要应用的安全升级变更。';
3159
+ case 'Safe upgrade changes were applied.':
3160
+ return '已应用安全升级变更。';
3161
+ case 'No SCALE-managed upgrade backup was found.':
3162
+ return '未找到 SCALE 管理的升级备份。';
3163
+ case 'Latest SCALE-managed upgrade backup was rolled back.':
3164
+ return '已回滚最近一次 SCALE 管理的升级备份。';
3165
+ default:
3166
+ return reason;
3167
+ }
3168
+ }
3037
3169
  // ============================================================================
3038
3170
  // assets command - Resource lifecycle governance
3039
3171
  // ============================================================================
@@ -3482,7 +3614,8 @@ function normalizeThemeArg(value) {
3482
3614
  return 'auto';
3483
3615
  }
3484
3616
  function normalizeLangArg(value) {
3485
- return String(value ?? 'zh').trim().toLowerCase() === 'en' ? 'en' : 'zh';
3617
+ const raw = String(value ?? process.env.SCALE_LANG ?? 'zh').trim().toLowerCase();
3618
+ return raw === 'en' || raw.startsWith('en-') || raw === 'english' ? 'en' : 'zh';
3486
3619
  }
3487
3620
  function launchLocalFile(path) {
3488
3621
  try {
@@ -5351,6 +5484,7 @@ const main = defineCommand({
5351
5484
  preflight,
5352
5485
  upgrade,
5353
5486
  governance,
5487
+ 'ai-os': aiOs,
5354
5488
  codegraph,
5355
5489
  eval: evalCommand,
5356
5490
  artifact,