@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
@@ -0,0 +1,179 @@
1
+ // SCALE Shield — Protected Paths & Command Blocklist
2
+ // 对齐 agent-hooks-in-depth: protect-paths.py + command-policy.py
3
+ // 阻断 .scale/ 修改 + 40+ 危险命令模式
4
+ import { existsSync } from 'node:fs';
5
+ import { join, resolve, normalize } from 'node:path';
6
+ const PROTECTED_PATHS = [
7
+ { glob: '.scale/**', reason: '.scale/ governance infrastructure — run scale shield compile to apply', allowReads: true },
8
+ { glob: '.hook-state/**', reason: 'hook state files — managed by Shield engine', allowReads: true },
9
+ { glob: '.scale/policy.yaml', reason: 'governance policy — must be reviewed before modification', allowReads: true },
10
+ { glob: 'SCALE_POLICY.md', reason: 'orchestration policy — managed by governance lead', allowReads: true },
11
+ { glob: '.claude/settings.json', reason: 'Claude Code settings — managed by scale shield compile', allowReads: true },
12
+ { glob: '.codex/hooks.json', reason: 'Codex hooks config — managed by scale shield compile', allowReads: true },
13
+ { glob: '.cursor/hooks.json', reason: 'Cursor hooks config — managed by scale shield compile', allowReads: true },
14
+ { glob: '.env', reason: 'environment secrets — never write to .env files', allowReads: false },
15
+ { glob: '.env.*', reason: 'environment secrets — never write to .env files', allowReads: false },
16
+ { glob: '**/.git/config', reason: 'git config — potential credential tampering', allowReads: false },
17
+ { glob: '**/credentials*', reason: 'credential files', allowReads: false },
18
+ { glob: '**/*.pem', reason: 'private key files', allowReads: false },
19
+ { glob: '**/*-key.json', reason: 'service account key files', allowReads: false },
20
+ ];
21
+ const COMMAND_BLOCKLIST = [
22
+ // === Destructive operations ===
23
+ { pattern: /\brm\s+-rf\b/, reason: 'Recursive force delete (rm -rf) — data loss risk', severity: 'block', category: 'destructive' },
24
+ { pattern: /\brm\s+-r\b/, reason: 'Recursive delete (rm -r)', severity: 'block', category: 'destructive' },
25
+ { pattern: /\brmdir\b/, reason: 'Remove directory', severity: 'warn', category: 'destructive' },
26
+ { pattern: /git\s+clean\s+-[fd]+/, reason: 'Git clean with force — removes untracked files', severity: 'block', category: 'destructive' },
27
+ { pattern: /git\s+reset\s+--hard/, reason: 'Git hard reset — destroys uncommitted work', severity: 'block', category: 'destructive' },
28
+ { pattern: /git\s+push\s+--force/, reason: 'Git force push — overwrites remote history', severity: 'block', category: 'destructive' },
29
+ { pattern: /git\s+push\s+-f\b/, reason: 'Git force push (short flag)', severity: 'block', category: 'destructive' },
30
+ { pattern: /git\s+checkout\s+--\s/, reason: 'Git checkout — discards working changes', severity: 'warn', category: 'destructive' },
31
+ { pattern: /git\s+stash\s+drop/, reason: 'Git stash drop — permanent stash deletion', severity: 'warn', category: 'destructive' },
32
+ { pattern: /git\s+branch\s+-D\b/, reason: 'Git branch force delete', severity: 'block', category: 'destructive' },
33
+ { pattern: /chmod\s+777\b/, reason: 'World-writable permissions (chmod 777)', severity: 'block', category: 'security' },
34
+ { pattern: /chmod\s+-R\s+777/, reason: 'Recursive world-writable (chmod -R 777)', severity: 'block', category: 'security' },
35
+ { pattern: /chown\s+root/, reason: 'Change ownership to root', severity: 'warn', category: 'security' },
36
+ { pattern: /\bdocker\s+rm\s+-f\b/, reason: 'Docker force remove container', severity: 'warn', category: 'destructive' },
37
+ { pattern: /\bdocker\s+system\s+prune\b/, reason: 'Docker system prune — removes all unused data', severity: 'block', category: 'destructive' },
38
+ { pattern: /\bkubectl\s+delete\b/, reason: 'Kubernetes resource deletion', severity: 'block', category: 'destructive' },
39
+ { pattern: /\bDROP\s+TABLE\b/i, reason: 'SQL DROP TABLE — data loss', severity: 'block', category: 'data-loss' },
40
+ { pattern: /\bDROP\s+DATABASE\b/i, reason: 'SQL DROP DATABASE — catastrophic data loss', severity: 'block', category: 'data-loss' },
41
+ { pattern: /\bTRUNCATE\s+TABLE\b/i, reason: 'SQL TRUNCATE TABLE — data loss', severity: 'block', category: 'data-loss' },
42
+ { pattern: /\bDELETE\s+FROM\b(?!.*\bWHERE\b)/i, reason: 'SQL DELETE without WHERE — full table deletion', severity: 'block', category: 'data-loss' },
43
+ // === Security: secret exposure ===
44
+ { pattern: /\bcat\s+.*\.env\b/, reason: 'Reading .env file — potential secret exposure in output', severity: 'block', category: 'security' },
45
+ { pattern: /\becho\s+.*\$?API[_-]?KEY\b/i, reason: 'Printing API key — secret exposure', severity: 'block', category: 'security' },
46
+ { pattern: /\becho\s+.*\$?TOKEN\b/i, reason: 'Printing token — secret exposure', severity: 'block', category: 'security' },
47
+ { pattern: /\becho\s+.*\$?SECRET\b/i, reason: 'Printing secret — credential leak', severity: 'block', category: 'security' },
48
+ { pattern: /\becho\s+.*\$?PASSWORD\b/i, reason: 'Printing password — credential leak', severity: 'block', category: 'security' },
49
+ { pattern: /\bcurl.*\|\s*bash\b/, reason: 'curl-pipe-bash — remote code execution risk', severity: 'block', category: 'security' },
50
+ { pattern: /\bwget.*\|\s*bash\b/, reason: 'wget-pipe-bash — remote code execution risk', severity: 'block', category: 'security' },
51
+ { pattern: /\beval\s+/i, reason: 'eval — code injection risk', severity: 'block', category: 'security' },
52
+ // === Governance bypass ===
53
+ { pattern: /--no-verify\b/, reason: 'Skipping git hooks (--no-verify)', severity: 'block', category: 'governance-bypass' },
54
+ { pattern: /--no-gpg-sign\b/, reason: 'Skipping GPG signing', severity: 'warn', category: 'governance-bypass' },
55
+ { pattern: /\.claude\b.*\brm\b/, reason: 'Modifying .claude directory — potential hook bypass', severity: 'block', category: 'governance-bypass' },
56
+ { pattern: /\.codex\b.*\brm\b/, reason: 'Modifying .codex directory — potential hook bypass', severity: 'block', category: 'governance-bypass' },
57
+ { pattern: /SKIP_HOOKS/i, reason: 'Environment variable to skip hooks — governance bypass', severity: 'block', category: 'governance-bypass' },
58
+ { pattern: /DISABLE_OMC/i, reason: 'OMC disable flag — governance bypass', severity: 'warn', category: 'governance-bypass' },
59
+ { pattern: /dang[eo]rously/i, reason: 'Dangerous mode flag — safety bypass', severity: 'block', category: 'governance-bypass' },
60
+ { pattern: /bypass/i, reason: 'Bypass flag detected', severity: 'warn', category: 'governance-bypass' },
61
+ { pattern: /allowDangerously/i, reason: 'allowDangerously flag — sandbox escape', severity: 'block', category: 'governance-bypass' },
62
+ ];
63
+ /**
64
+ * Check if a file write target is a protected path.
65
+ * Returns { blocked: true } if the path matches any protected glob.
66
+ */
67
+ export function checkProtectedPath(targetPath, cwd = process.cwd(), toolName) {
68
+ // Reads are always allowed
69
+ if (toolName && ['Read', 'Grep', 'Glob'].includes(toolName)) {
70
+ return { blocked: false, targetPath };
71
+ }
72
+ const normalized = normalize(targetPath);
73
+ const resolved = resolve(cwd, normalized);
74
+ for (const rule of PROTECTED_PATHS) {
75
+ if (matchGlob(normalized, rule.glob) || matchGlob(resolved, rule.glob)) {
76
+ return { blocked: true, matchedRule: rule, targetPath: normalized };
77
+ }
78
+ }
79
+ return { blocked: false, targetPath: normalized };
80
+ }
81
+ /**
82
+ * Check if a command contains any blocked patterns.
83
+ * Returns list of matched rules.
84
+ */
85
+ export function checkCommand(command) {
86
+ const matches = [];
87
+ for (const rule of COMMAND_BLOCKLIST) {
88
+ if (rule.pattern.test(command)) {
89
+ matches.push(rule);
90
+ }
91
+ }
92
+ return matches;
93
+ }
94
+ /**
95
+ * Full pre-flight check for a tool input.
96
+ * Returns allow/block decision.
97
+ */
98
+ export function checkToolInput(input) {
99
+ const cwd = input.cwd ?? process.cwd();
100
+ const toolName = input.tool_name;
101
+ const toolInput = input.tool_input ?? {};
102
+ // 1. Check protected paths for Write/Edit tools
103
+ if (toolName === 'Write' || toolName === 'Edit') {
104
+ const filePath = toolInput.file_path ?? toolInput.path ?? '';
105
+ if (filePath) {
106
+ const pathResult = checkProtectedPath(filePath, cwd, toolName);
107
+ if (pathResult.blocked) {
108
+ return {
109
+ decision: 'block',
110
+ reason: `[Protected Path] ${pathResult.matchedRule?.reason} — target: ${pathResult.targetPath}`,
111
+ suggestion: `Run 'scale shield compile' to update policy, or request governance lead approval`,
112
+ evidence: {
113
+ policy_rule: 'protected-path',
114
+ matched_pattern: pathResult.matchedRule?.glob,
115
+ timestamp: new Date().toISOString(),
116
+ },
117
+ };
118
+ }
119
+ }
120
+ }
121
+ // 2. Check command blocklist for Bash tools
122
+ if (toolName === 'Bash') {
123
+ const command = String(toolInput.command ?? '');
124
+ const matches = checkCommand(command);
125
+ if (matches.length > 0) {
126
+ const blocking = matches.filter(m => m.severity === 'block');
127
+ if (blocking.length > 0) {
128
+ const reasons = blocking.map(m => `[${m.category}] ${m.reason}`).join('; ');
129
+ return {
130
+ decision: 'block',
131
+ reason: reasons,
132
+ suggestion: 'If this command is intentional, request governance lead approval',
133
+ evidence: {
134
+ policy_rule: 'command-blocklist',
135
+ matched_pattern: blocking[0].pattern.source,
136
+ timestamp: new Date().toISOString(),
137
+ },
138
+ };
139
+ }
140
+ }
141
+ }
142
+ return { decision: 'allow', reason: 'OK', evidence: { policy_rule: 'default-allow', timestamp: new Date().toISOString() } };
143
+ }
144
+ /**
145
+ * Verify .scale/ directory integrity.
146
+ */
147
+ export function verifyScaleIntegrity(cwd) {
148
+ const required = [
149
+ '.scale/workspace.json',
150
+ '.scale/policy.yaml',
151
+ ];
152
+ const missing = required.filter(f => !existsSync(join(cwd, f)));
153
+ return { intact: missing.length === 0, missing };
154
+ }
155
+ // ---------------------------------------------------------------------------
156
+ // Simple glob matching (handles **, *, explicit paths)
157
+ // ---------------------------------------------------------------------------
158
+ function matchGlob(target, glob) {
159
+ // Normalize separators
160
+ const t = target.replace(/\\/g, '/');
161
+ const g = glob.replace(/\\/g, '/');
162
+ // Exact match
163
+ if (t === g || t.endsWith('/' + g) || t === g.replace(/^\*\*\//, ''))
164
+ return true;
165
+ // Convert glob to regex
166
+ const regexStr = g
167
+ .replace(/\./g, '\\.')
168
+ .replace(/\*\*/g, '<<<GLOBSTAR>>>')
169
+ .replace(/\*/g, '[^/]*')
170
+ .replace(/<<<GLOBSTAR>>>/g, '.*');
171
+ try {
172
+ const re = new RegExp(`^${regexStr}$|/${regexStr}$|^${regexStr}/`);
173
+ return re.test(t);
174
+ }
175
+ catch {
176
+ return false;
177
+ }
178
+ }
179
+ //# sourceMappingURL=ProtectedPaths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProtectedPaths.js","sourceRoot":"","sources":["../../src/shield/ProtectedPaths.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ export declare const EXIT_ALLOW = 0;
2
+ export declare const EXIT_BLOCK = 2;
3
+ export type HookEventType = 'PreToolUse' | 'PostToolUse' | 'Stop' | 'SessionStart';
4
+ export interface ShieldInput {
5
+ session_id: string;
6
+ cwd: string;
7
+ tool_name: string;
8
+ tool_input: Record<string, unknown>;
9
+ metadata?: {
10
+ harness?: 'claude' | 'codex' | 'cursor' | 'gemini';
11
+ gate_last_pass?: string;
12
+ policy_hash?: string;
13
+ };
14
+ }
15
+ export interface ShieldDecision {
16
+ decision: 'allow' | 'block';
17
+ reason: string;
18
+ suggestion?: string;
19
+ evidence?: {
20
+ policy_rule: string;
21
+ matched_pattern?: string;
22
+ gate_status?: string;
23
+ timestamp: string;
24
+ };
25
+ }
26
+ export interface HookStateEntry {
27
+ hook: HookEventType;
28
+ timestamp: string;
29
+ sessionId: string;
30
+ toolName?: string;
31
+ blocked: boolean;
32
+ reason?: string;
33
+ }
34
+ export declare function getHookStateDir(cwd: string): string;
35
+ export declare function ensureHookStateDir(cwd: string): string;
36
+ export declare function writeHookState(cwd: string, entry: HookStateEntry): void;
37
+ export declare function readHookState(cwd: string, hook: HookEventType): HookStateEntry | null;
38
+ export declare function readLastToolState(cwd: string): HookStateEntry | null;
39
+ export declare function wasLastToolBlocked(cwd: string): boolean;
40
+ export interface PolicyComplianceResult {
41
+ compliant: boolean;
42
+ gatePassed: boolean;
43
+ scaleIntegrity: boolean;
44
+ violations: string[];
45
+ lastGatePass?: string;
46
+ }
47
+ export declare function checkPolicyCompliance(cwd: string, gateCheckFn?: () => boolean): PolicyComplianceResult;
48
+ export declare function allow(reason?: string): void;
49
+ export declare function block(reason: string, suggestion?: string): void;
50
+ export declare function parseShieldInput(): ShieldInput;
@@ -0,0 +1,103 @@
1
+ // SCALE Shield — Deterministic Hook Interception Protocol
2
+ // 对齐 agent-hooks-in-depth: exit 0=allow, exit 2=block
3
+ // stdin/stdout JSON 协议,跨 hook 状态共享 via .hook-state/
4
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
5
+ import { join } from 'node:path';
6
+ // --- Exit Code Protocol ---
7
+ // exit 0 = 允许操作继续
8
+ // exit 2 = 阻断操作(stderr 输出原因)
9
+ export const EXIT_ALLOW = 0;
10
+ export const EXIT_BLOCK = 2;
11
+ const HOOK_STATE_DIR = '.hook-state';
12
+ export function getHookStateDir(cwd) {
13
+ return join(cwd, HOOK_STATE_DIR);
14
+ }
15
+ export function ensureHookStateDir(cwd) {
16
+ const dir = getHookStateDir(cwd);
17
+ if (!existsSync(dir))
18
+ mkdirSync(dir, { recursive: true });
19
+ return dir;
20
+ }
21
+ export function writeHookState(cwd, entry) {
22
+ const dir = ensureHookStateDir(cwd);
23
+ const file = join(dir, `${entry.hook}.json`);
24
+ writeFileSync(file, JSON.stringify(entry, null, 2));
25
+ }
26
+ export function readHookState(cwd, hook) {
27
+ const file = join(getHookStateDir(cwd), `${hook}.json`);
28
+ if (!existsSync(file))
29
+ return null;
30
+ try {
31
+ return JSON.parse(readFileSync(file, 'utf-8'));
32
+ }
33
+ catch {
34
+ return null;
35
+ }
36
+ }
37
+ export function readLastToolState(cwd) {
38
+ return readHookState(cwd, 'PreToolUse');
39
+ }
40
+ export function wasLastToolBlocked(cwd) {
41
+ const state = readHookState(cwd, 'PostToolUse');
42
+ return state?.blocked ?? false;
43
+ }
44
+ export function checkPolicyCompliance(cwd, gateCheckFn) {
45
+ const violations = [];
46
+ // Check .scale/ directory integrity
47
+ const scaleDir = join(cwd, '.scale');
48
+ const scaleExists = existsSync(scaleDir);
49
+ if (!scaleExists) {
50
+ violations.push('.scale/ directory missing — governance infrastructure absent');
51
+ }
52
+ // Check last gate quality pass
53
+ const lastGate = readHookState(cwd, 'Stop');
54
+ const gatePassed = lastGate?.reason?.includes('gate-quality:PASS') ?? false;
55
+ if (!gatePassed && gateCheckFn) {
56
+ const passed = gateCheckFn();
57
+ if (!passed)
58
+ violations.push('Gate quality check not passed — run scale gate-quality');
59
+ }
60
+ return {
61
+ compliant: violations.length === 0,
62
+ gatePassed,
63
+ scaleIntegrity: scaleExists,
64
+ violations,
65
+ lastGatePass: lastGate?.timestamp,
66
+ };
67
+ }
68
+ // --- Block / Allow helpers ---
69
+ export function allow(reason) {
70
+ const msg = {
71
+ decision: 'allow',
72
+ reason: reason ?? 'OK',
73
+ evidence: { policy_rule: 'default-allow', timestamp: new Date().toISOString() },
74
+ };
75
+ process.stdout.write(JSON.stringify(msg));
76
+ process.exit(EXIT_ALLOW);
77
+ }
78
+ export function block(reason, suggestion) {
79
+ const msg = {
80
+ decision: 'block',
81
+ reason,
82
+ suggestion,
83
+ evidence: { policy_rule: 'shield-block', timestamp: new Date().toISOString() },
84
+ };
85
+ process.stderr.write(reason);
86
+ if (suggestion)
87
+ process.stderr.write(`\n[Suggestion] ${suggestion}`);
88
+ process.stdout.write(JSON.stringify(msg));
89
+ process.exit(EXIT_BLOCK);
90
+ }
91
+ // --- stdin parser ---
92
+ export function parseShieldInput() {
93
+ try {
94
+ const raw = process.argv[2] ?? process.stdin;
95
+ if (!raw)
96
+ return { session_id: 'unknown', cwd: process.cwd(), tool_name: 'unknown', tool_input: {} };
97
+ return JSON.parse(typeof raw === 'string' ? raw : String(raw));
98
+ }
99
+ catch {
100
+ return { session_id: 'unknown', cwd: process.cwd(), tool_name: 'unknown', tool_input: {} };
101
+ }
102
+ }
103
+ //# sourceMappingURL=ShieldProtocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ShieldProtocol.js","sourceRoot":"","sources":["../../src/shield/ShieldProtocol.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ export interface SkillMdFrontmatter {
2
+ name: string;
3
+ description: string;
4
+ version?: string;
5
+ 'preamble-tier'?: 'tier-0' | 'tier-1' | 'tier-2' | 'tier-3';
6
+ 'allowed-tools'?: string[];
7
+ triggers?: string[];
8
+ type?: 'rigid' | 'flexible';
9
+ }
10
+ export interface ParsedSkillMd {
11
+ frontmatter: SkillMdFrontmatter;
12
+ body: string;
13
+ rawPath: string;
14
+ toolNamespaces: Record<string, string[]>;
15
+ }
16
+ /**
17
+ * Parse a SKILL.md file and extract cross-platform tool namespaces.
18
+ *
19
+ * Supported namespaces:
20
+ * gstack: — gstack platform tools
21
+ * omc: — oh-my-claudecode platform tools
22
+ * ecc: — ECC platform tools
23
+ * scale: — SCALE Engine tools (native)
24
+ */
25
+ export declare function parseSkillMd(filepath: string): ParsedSkillMd | null;
26
+ /**
27
+ * Convert a SCALE skill registry entry to a portable SKILL.md format.
28
+ */
29
+ export declare function skillToMarkdown(skill: {
30
+ id: string;
31
+ name: string;
32
+ description?: string;
33
+ }): string;
@@ -0,0 +1,88 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { resolve } from 'node:path';
3
+ /**
4
+ * Parse a SKILL.md file and extract cross-platform tool namespaces.
5
+ *
6
+ * Supported namespaces:
7
+ * gstack: — gstack platform tools
8
+ * omc: — oh-my-claudecode platform tools
9
+ * ecc: — ECC platform tools
10
+ * scale: — SCALE Engine tools (native)
11
+ */
12
+ export function parseSkillMd(filepath) {
13
+ const fullPath = resolve(filepath);
14
+ if (!existsSync(fullPath))
15
+ return null;
16
+ const content = readFileSync(fullPath, 'utf-8');
17
+ const fmMatch = content.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)/);
18
+ if (!fmMatch)
19
+ return null;
20
+ const fmLines = fmMatch[1].split('\n');
21
+ const frontmatter = { name: '', description: '' };
22
+ for (const line of fmLines) {
23
+ const colonIdx = line.indexOf(':');
24
+ if (colonIdx === -1)
25
+ continue;
26
+ const key = line.slice(0, colonIdx).trim();
27
+ const value = line.slice(colonIdx + 1).trim();
28
+ switch (key) {
29
+ case 'name':
30
+ frontmatter.name = value;
31
+ break;
32
+ case 'description':
33
+ frontmatter.description = value;
34
+ break;
35
+ case 'version':
36
+ frontmatter.version = value;
37
+ break;
38
+ case 'preamble-tier':
39
+ frontmatter['preamble-tier'] = value;
40
+ break;
41
+ case 'allowed-tools':
42
+ frontmatter['allowed-tools'] = value.replace(/[\[\]]/g, '').split(',').map(s => s.trim()).filter(Boolean);
43
+ break;
44
+ case 'triggers':
45
+ frontmatter.triggers = value.replace(/[\[\]]/g, '').split(',').map(s => s.trim()).filter(Boolean);
46
+ break;
47
+ case 'type':
48
+ frontmatter.type = value;
49
+ break;
50
+ }
51
+ }
52
+ // Parse tool namespaces
53
+ const toolNamespaces = {};
54
+ for (const tool of frontmatter['allowed-tools'] ?? []) {
55
+ const nsMatch = tool.match(/^([a-z]+):(.+)$/);
56
+ if (nsMatch) {
57
+ const ns = nsMatch[1];
58
+ const name = nsMatch[2];
59
+ if (!toolNamespaces[ns])
60
+ toolNamespaces[ns] = [];
61
+ toolNamespaces[ns].push(name);
62
+ }
63
+ }
64
+ return {
65
+ frontmatter,
66
+ body: fmMatch[2].trim(),
67
+ rawPath: fullPath,
68
+ toolNamespaces,
69
+ };
70
+ }
71
+ /**
72
+ * Convert a SCALE skill registry entry to a portable SKILL.md format.
73
+ */
74
+ export function skillToMarkdown(skill) {
75
+ return [
76
+ '---',
77
+ `name: ${skill.name}`,
78
+ `description: ${skill.description ?? skill.id}`,
79
+ 'allowed-tools: []',
80
+ '---',
81
+ '',
82
+ `# ${skill.name}`,
83
+ '',
84
+ `> Auto-generated from SCALE Engine skill registry.`,
85
+ `> Skill ID: ${skill.id}`,
86
+ ].join('\n');
87
+ }
88
+ //# sourceMappingURL=SkillMdStandard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SkillMdStandard.js","sourceRoot":"","sources":["../../src/skills/SkillMdStandard.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import type { IEventBus } from '../core/eventBus.js';
2
- export type SkillDomain = 'context' | 'planning' | 'execution' | 'verification' | 'evolution' | 'deployment';
2
+ export type SkillDomain = 'context' | 'planning' | 'execution' | 'verification' | 'evolution' | 'deployment' | 'domain';
3
3
  export type SkillExecutionType = 'cli-command' | 'agent-delegate' | 'mcp-tool' | 'skill-file' | 'builtin-function';
4
4
  export type SkillTriggerType = 'taskType' | 'phase' | 'detectorTriggered' | 'complexity' | 'keyword' | 'manual' | 'artifactType' | 'artifactStatus';
5
5
  export interface SkillTrigger {
@@ -99,6 +99,14 @@ export declare class SkillRegistry implements ISkillRegistry {
99
99
  private calculatePriority;
100
100
  private generateReason;
101
101
  registerBatch(skills: SkillDefinition[]): void;
102
+ /** Register a domain-specific skill (site-level selectors/flows) */
103
+ registerDomainSkill(domain: string, skill: {
104
+ selectors: Record<string, string>;
105
+ flows: Array<{
106
+ name: string;
107
+ steps: unknown[];
108
+ }>;
109
+ }): void;
102
110
  clear(): void;
103
111
  loadFromFrontmatter(dir: string): Promise<number>;
104
112
  }
@@ -124,6 +124,26 @@ export class SkillRegistry {
124
124
  }
125
125
  registerBatch(skills) { for (const skill of skills)
126
126
  this.register(skill); }
127
+ /** Register a domain-specific skill (site-level selectors/flows) */
128
+ registerDomainSkill(domain, skill) {
129
+ const hash = Buffer.from(domain).toString('hex').slice(0, 16);
130
+ this.skills.set(`domain:${hash}`, {
131
+ id: `domain:${hash}`,
132
+ name: `Site skill for ${domain}`,
133
+ description: `Domain-specific selectors and flows for ${domain}`,
134
+ domain: 'domain',
135
+ triggers: [],
136
+ execution: {
137
+ type: 'builtin-function',
138
+ config: {
139
+ functionName: 'applyDomainSkill',
140
+ parameters: skill,
141
+ },
142
+ },
143
+ priority: 60,
144
+ installed: true,
145
+ });
146
+ }
127
147
  clear() { this.skills.clear(); this.eventBus.emit('skills.cleared', { clearedAt: Date.now() }); }
128
148
  async loadFromFrontmatter(dir) {
129
149
  const { scanFrontmatterSkills } = await import('./SkillFrontmatter.js');
@@ -1 +1 @@
1
- {"version":3,"file":"SkillRegistry.js","sourceRoot":"","sources":["../../src/skills/SkillRegistry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SkillRegistry.js","sourceRoot":"","sources":["../../src/skills/SkillRegistry.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,mBAAmB;AAGnB,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAuF1C,+EAA+E;AAC/E,+BAA+B;AAC/B,+EAA+E;AAE/E,MAAM,OAAO,aAAa;IAIxB,YAAY,QAAmB;QAHvB,WAAM,GAAG,IAAI,GAAG,EAA2B,CAAA;QAIjD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;IAC1B,CAAC;IAED,QAAQ,CAAC,KAAsB;QAC7B,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;YACjD,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAA;QACtE,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;YAClD,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,EAAE,oCAAoC,CAAC,CAAA;YACxE,OAAM;QACR,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;QAChC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAA;QAC/G,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAA;IAC9E,CAAC;IAED,UAAU,CAAC,OAAe;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QACtC,IAAI,CAAC,KAAK;YAAE,OAAM;QAClB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QAC3B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAA;QACrD,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,oBAAoB,CAAC,CAAA;IAChD,CAAC;IAED,GAAG,CAAC,OAAe;QACjB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IACjC,CAAC;IAED,OAAO,CAAC,MAAoB;QAC1B,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAA;QACrC,IAAI,MAAM;YAAE,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAA;QACvD,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAA;IACpD,CAAC;IAED,aAAa;QACX,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAA;IACnG,CAAC;IAED,SAAS,CAAC,OAA8B;QACtC,MAAM,UAAU,GAA0B,EAAE,CAAA;QAC5C,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YACzC,IAAI,CAAC,KAAK,CAAC,SAAS;gBAAE,SAAQ;YAC9B,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;YAChE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,GAAG,GAAG,EAAE,CAAC;gBACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,CAAA;gBAC9D,UAAU,CAAC,IAAI,CAAC;oBACd,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC;oBACxE,WAAW,EAAE,OAAO,EAAE,aAAa,EAAE,KAAK,CAAC,SAAS,CAAC,IAAI;iBAC1D,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;QACD,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACvE,CAAC;IAED,gBAAgB,CAAC,KAAsB,EAAE,OAA8B;QACrE,MAAM,OAAO,GAAmB,EAAE,CAAA;QAClC,IAAI,WAAW,GAAG,CAAC,EAAE,aAAa,GAAG,CAAC,CAAA;QACtC,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACrC,WAAW,IAAI,OAAO,CAAC,MAAM,CAAA;YAC7B,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC;gBAC1C,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;gBACrB,aAAa,IAAI,OAAO,CAAC,MAAM,CAAA;YACjC,CAAC;QACH,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAC9E,CAAC;IAED,YAAY,CAAC,OAAe,EAAE,SAAkB;QAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QACtC,IAAI,CAAC,KAAK;YAAE,OAAM;QAClB,KAAK,CAAC,SAAS,GAAG,SAAS,CAAA;QAC3B,KAAK,CAAC,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;QACtD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,4BAA4B,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAA;IAC1E,CAAC;IAED,eAAe,CAAC,OAAe;QAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QACtC,IAAI,CAAC,KAAK,EAAE,aAAa;YAAE,OAAO,EAAE,CAAA;QACpC,OAAO,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAsB,CAAA;IAChG,CAAC;IAED,cAAc,CAAC,OAAe;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QACtC,IAAI,CAAC,KAAK,EAAE,SAAS;YAAE,OAAO,EAAE,CAAA;QAChC,OAAO,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAA;IACrE,CAAC;IAEO,cAAc,CAAC,OAAqB,EAAE,OAA8B;QAC1E,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;YACrB,KAAK,UAAU;gBACb,OAAO,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAA;YAC/H,KAAK,OAAO,CAAC,CAAC,OAAO,OAAO,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,CAAA;YACpD,KAAK,mBAAmB;gBACtB,OAAO,OAAO,CAAC,iBAAiB,KAAK,OAAO,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC,CAAA;YACjJ,KAAK,YAAY,CAAC,CAAC,OAAO,OAAO,CAAC,UAAU,KAAK,OAAO,CAAC,KAAK,CAAA;YAC9D,KAAK,SAAS;gBACZ,IAAI,CAAC,OAAO,CAAC,QAAQ;oBAAE,OAAO,KAAK,CAAA;gBACnC,MAAM,eAAe,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;gBACtF,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,QAAS,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAA;YAC5G,KAAK,QAAQ,CAAC,CAAC,OAAO,KAAK,CAAA;YAC3B,OAAO,CAAC,CAAC,OAAO,KAAK,CAAA;QACvB,CAAC;IACH,CAAC;IAEO,iBAAiB,CAAC,KAAsB,EAAE,YAAoB,EAAE,OAA8B;QACpG,IAAI,QAAQ,GAAG,KAAK,CAAC,QAAQ,GAAG,YAAY,GAAG,EAAE,CAAA;QACjD,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,UAAU;YAAE,QAAQ,IAAI,EAAE,CAAA;QACnF,IAAI,OAAO,CAAC,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,cAAc;YAAE,QAAQ,IAAI,EAAE,CAAA;QACjF,IAAI,OAAO,CAAC,KAAK,KAAK,WAAW,IAAI,KAAK,CAAC,MAAM,KAAK,WAAW;YAAE,QAAQ,IAAI,EAAE,CAAA;QACjF,IAAI,OAAO,CAAC,iBAAiB,IAAI,KAAK,CAAC,MAAM,KAAK,cAAc;YAAE,QAAQ,IAAI,EAAE,CAAA;QAChF,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAA;IAC7C,CAAC;IAEO,cAAc,CAAC,KAAsB,EAAE,OAAuB;QACpE,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACxD,OAAO,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,YAAY,YAAY,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,WAAW,YAAY,KAAK,OAAO,CAAC,MAAM,QAAQ,CAAA;IACzI,CAAC;IAED,aAAa,CAAC,MAAyB,IAAU,KAAK,MAAM,KAAK,IAAI,MAAM;QAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA,CAAC,CAAC;IAEnG,oEAAoE;IACpE,mBAAmB,CAAC,MAAc,EAAE,KAA8F;QAChI,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QAC7D,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,EAAE;YAChC,EAAE,EAAE,UAAU,IAAI,EAAE;YACpB,IAAI,EAAE,kBAAkB,MAAM,EAAE;YAChC,WAAW,EAAE,2CAA2C,MAAM,EAAE;YAChE,MAAM,EAAE,QAAQ;YAChB,QAAQ,EAAE,EAAE;YACZ,SAAS,EAAE;gBACT,IAAI,EAAE,kBAAkB;gBACxB,MAAM,EAAE;oBACN,YAAY,EAAE,kBAAkB;oBAChC,UAAU,EAAE,KAA2C;iBACxD;aACF;YACD,QAAQ,EAAE,EAAE;YACZ,SAAS,EAAE,IAAI;SAChB,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,KAAW,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA,CAAC,CAAC;IAEtG,KAAK,CAAC,mBAAmB,CAAC,GAAW;QACnC,MAAM,EAAE,qBAAqB,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAA;QACvE,MAAM,OAAO,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAA;QAC1C,IAAI,KAAK,GAAG,CAAC,CAAA;QACb,KAAK,MAAM,EAAE,UAAU,EAAE,IAAI,OAAO,EAAE,CAAC;YACrC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC;gBACpC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAA;gBACzB,KAAK,EAAE,CAAA;YACT,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;CACF"}
@@ -0,0 +1,15 @@
1
+ import type { ParsedSkillMd } from '../SkillMdStandard.js';
2
+ export interface GStackSkill {
3
+ name: string;
4
+ tier: string;
5
+ commands: string[];
6
+ scope: string;
7
+ }
8
+ /**
9
+ * Convert a parsed SKILL.md to gstack-compatible skill format.
10
+ */
11
+ export declare function convertToGStack(parsed: ParsedSkillMd): GStackSkill;
12
+ /**
13
+ * Import a gstack skill into SCALE skill format.
14
+ */
15
+ export declare function importFromGStack(gstackSkill: GStackSkill, outputDir: string): void;
@@ -0,0 +1,34 @@
1
+ import { writeFileSync, mkdirSync, existsSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ /**
4
+ * Convert a parsed SKILL.md to gstack-compatible skill format.
5
+ */
6
+ export function convertToGStack(parsed) {
7
+ return {
8
+ name: parsed.frontmatter.name,
9
+ tier: parsed.frontmatter['preamble-tier'] ?? 'tier-1',
10
+ commands: parsed.toolNamespaces['gstack'] ?? [],
11
+ scope: parsed.frontmatter.type === 'rigid' ? 'system' : 'user',
12
+ };
13
+ }
14
+ /**
15
+ * Import a gstack skill into SCALE skill format.
16
+ */
17
+ export function importFromGStack(gstackSkill, outputDir) {
18
+ if (!existsSync(outputDir))
19
+ mkdirSync(outputDir, { recursive: true });
20
+ const content = [
21
+ '---',
22
+ `name: ${gstackSkill.name}`,
23
+ `description: gstack skill: ${gstackSkill.scope}`,
24
+ `preamble-tier: ${gstackSkill.tier}`,
25
+ `allowed-tools: [${gstackSkill.commands.map(c => `gstack:${c}`).join(', ')}]`,
26
+ '---',
27
+ '',
28
+ `# ${gstackSkill.name}`,
29
+ '',
30
+ `> Imported from gstack. Scope: ${gstackSkill.scope}`,
31
+ ].join('\n');
32
+ writeFileSync(join(outputDir, `${gstackSkill.name.replace(/\s+/g, '-').toLowerCase()}.skill.md`), content);
33
+ }
34
+ //# sourceMappingURL=GStackInterop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GStackInterop.js","sourceRoot":"","sources":["../../../src/skills/interop/GStackInterop.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAUhC;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,MAAqB;IACnD,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,WAAW,CAAC,IAAI;QAC7B,IAAI,EAAE,MAAM,CAAC,WAAW,CAAC,eAAe,CAAC,IAAI,QAAQ;QACrD,QAAQ,EAAE,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,EAAE;QAC/C,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM;KAC/D,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAAwB,EAAE,SAAiB;IAC1E,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACrE,MAAM,OAAO,GAAG;QACd,KAAK;QACL,SAAS,WAAW,CAAC,IAAI,EAAE;QAC3B,8BAA8B,WAAW,CAAC,KAAK,EAAE;QACjD,kBAAkB,WAAW,CAAC,IAAI,EAAE;QACpC,mBAAmB,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;QAC7E,KAAK;QACL,EAAE;QACF,KAAK,WAAW,CAAC,IAAI,EAAE;QACvB,EAAE;QACF,kCAAkC,WAAW,CAAC,KAAK,EAAE;KACtD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACZ,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,CAAA;AAC5G,CAAC"}