@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
@@ -0,0 +1,39 @@
1
+ # Skill Plan
2
+
3
+ ## Detected Intents
4
+
5
+ | Domain | Score | Evidence |
6
+ | --- | ---: | --- |
7
+ | | | |
8
+
9
+ ## Required Skills
10
+
11
+ - TBD
12
+
13
+ ## Recommended Skills
14
+
15
+ - TBD
16
+
17
+ ## Required Artifacts
18
+
19
+ - TBD
20
+
21
+ ## Required Verification Evidence
22
+
23
+ - TBD
24
+
25
+ ## Tool Orchestration
26
+
27
+ | Capability | Primary Tool Or Skill | Fallback | Required Evidence |
28
+ | --- | --- | --- | --- |
29
+ | UI/UX design | frontend-design, ui-ux-pro-max | awesome-design-md | design-system, ui-spec.md, visual-review.md |
30
+ | Web research or logged-in pages | web-access | agent-browser, Chrome DevTools MCP | source citations, browser evidence |
31
+ | Browser E2E | webapp-testing, Playwright | agent-browser, web-access | screenshot, console, network evidence |
32
+ | Desktop GUI automation | CUA/computer-use | manual verification | desktop screenshot, operator-safety notes |
33
+ | External agent CLI | codex/gemini/opencode CLI | manual review | version check, exact command output |
34
+
35
+ ## Skipped Skills
36
+
37
+ | Skill | Reason | Fallback Evidence |
38
+ | --- | --- | --- |
39
+ | | | |
@@ -0,0 +1,17 @@
1
+ # Spec - {{TASK_ID}}
2
+
3
+ Date: {{DATE}}
4
+ Level: {{LEVEL}}
5
+
6
+ ## What
7
+
8
+
9
+ ## Why
10
+
11
+
12
+ ## Boundaries
13
+
14
+
15
+ ## Acceptance Criteria
16
+
17
+ - [ ]
@@ -0,0 +1,28 @@
1
+ # Standards Impact
2
+
3
+ ## Standards Checked
4
+
5
+ - [ ] Logging and redaction
6
+ - [ ] Architecture boundaries
7
+ - [ ] ORM/database access
8
+ - [ ] Framework/component conventions
9
+ - [ ] UI/UX acceptance where user-facing
10
+ - [ ] Test and verification rigor
11
+ - [ ] Security-sensitive inputs and outputs
12
+
13
+ ## Findings
14
+
15
+ | Severity | Rule | Path | Decision |
16
+ | --- | --- | --- | --- |
17
+ | TBD | TBD | TBD | fix/accept/escalate |
18
+
19
+ ## Policy Updates
20
+
21
+ - [ ] .scale/engineering-standards.json
22
+ - [ ] .scale/frameworks.json
23
+ - [ ] docs/standards/
24
+
25
+ ## Settlement
26
+
27
+ - Standards scan:
28
+ - Standards doctor:
@@ -0,0 +1,16 @@
1
+ # Summary - {{TASK_ID}}
2
+
3
+ Date: {{DATE}}
4
+ Level: {{LEVEL}}
5
+
6
+ ## What Changed
7
+
8
+ - TBD
9
+
10
+ ## Verification Result
11
+
12
+ - TBD
13
+
14
+ ## Follow-up
15
+
16
+ - TBD
@@ -0,0 +1,8 @@
1
+ # Tasks - {{TASK_ID}}
2
+
3
+ Date: {{DATE}}
4
+ Level: {{LEVEL}}
5
+
6
+ ## Task List
7
+
8
+ - [ ]
@@ -0,0 +1,29 @@
1
+ # UI Spec
2
+
3
+ ## User Goal
4
+
5
+ TBD
6
+
7
+ ## Primary Flow
8
+
9
+ TBD
10
+
11
+ ## Interaction States
12
+
13
+ - Default:
14
+ - Loading:
15
+ - Empty:
16
+ - Error:
17
+ - Success:
18
+
19
+ ## Responsive Behavior
20
+
21
+ TBD
22
+
23
+ ## Accessibility Requirements
24
+
25
+ TBD
26
+
27
+ ## Acceptance Criteria
28
+
29
+ - [ ] TBD
@@ -0,0 +1,20 @@
1
+ # Verification - {{TASK_ID}}
2
+
3
+ Date: {{DATE}}
4
+ Level: {{LEVEL}}
5
+
6
+ ## Commands Run
7
+
8
+ - TBD
9
+
10
+ ## Passed
11
+
12
+ - TBD
13
+
14
+ ## Failed / Blocked
15
+
16
+ - TBD
17
+
18
+ ## Not Run
19
+
20
+ - TBD
@@ -0,0 +1,20 @@
1
+ # Visual Review
2
+
3
+ ## Screenshots Or Evidence
4
+
5
+ TBD
6
+
7
+ ## Layout And Responsiveness
8
+
9
+ TBD
10
+
11
+ ## Text Fit And Overlap
12
+
13
+ TBD
14
+
15
+ ## Accessibility Notes
16
+
17
+ TBD
18
+
19
+ ## Final Verdict
20
+ TBD
@@ -1,14 +1,14 @@
1
- # CONTEXT.md
2
-
3
- Project: Agent Governance Demo
4
-
5
- | Term | Definition | Examples | Aliases | Source |
6
- |------|------------|----------|---------|--------|
7
- | OAuth state | One-time callback correlation value that binds authorization return traffic to a user session | `state-123` | callback state | `src/oauth-state.ts` |
8
- | Consumed state | A state record that has already been used and must not be accepted again | `consumedAt: 900` | replayed state | `tests/oauth-state.test.ts` |
9
- | Evidence | A command result or artifact that proves what was verified | `npm test`, eval report, dashboard | verification proof | SCALE workflow |
10
-
11
- ## Rejected Meanings
12
-
13
- - Do not treat an expired state as recoverable without a new authorization flow.
14
- - Do not treat a dashboard or eval report as a substitute for the business test.
1
+ # CONTEXT.md
2
+
3
+ Project: Agent Governance Demo
4
+
5
+ | Term | Definition | Examples | Aliases | Source |
6
+ |------|------------|----------|---------|--------|
7
+ | OAuth state | One-time callback correlation value that binds authorization return traffic to a user session | `state-123` | callback state | `src/oauth-state.ts` |
8
+ | Consumed state | A state record that has already been used and must not be accepted again | `consumedAt: 900` | replayed state | `tests/oauth-state.test.ts` |
9
+ | Evidence | A command result or artifact that proves what was verified | `npm test`, eval report, dashboard | verification proof | SCALE workflow |
10
+
11
+ ## Rejected Meanings
12
+
13
+ - Do not treat an expired state as recoverable without a new authorization flow.
14
+ - Do not treat a dashboard or eval report as a substitute for the business test.
@@ -1,48 +1,48 @@
1
- # Agent Governance Demo
2
-
3
- 这是 SCALE Engine 的最小官方 demo 项目,用一个 OAuth state 校验场景展示 Agent 工程治理如何落到真实代码、测试、证据和报告里。
4
-
5
- 业务目标很小:OAuth callback 必须拒绝缺失、过期、已消费或不匹配的 state。
6
-
7
- 治理目标更重要:Agent 不能只说“我完成了”,必须留下可验证证据。
8
-
9
- ## 快速运行
10
-
11
- ```bash
12
- npm install
13
- npm test
14
- ```
15
-
16
- ## 一键治理烟测
17
-
18
- ```bash
19
- npm run workflow:smoke
20
- ```
21
-
22
- 这个命令会依次运行:
23
-
24
- - `npm test`:验证业务行为。
25
- - `scale eval run --dir .`:运行工作流基线评测。
26
- - `scale context budget --dir .`:检查上下文预算,避免无节制读取。
27
- - `scale artifact dashboard --dir . --lang zh`:生成本地治理 HTML 看板。
28
-
29
- ## 适合演示的 SCALE 命令
30
-
31
- ```bash
32
- scale governance mode --task "修复 OAuth state 校验绕过问题" --files "src/oauth-state.ts,tests/oauth-state.test.ts"
33
- scale skill radar --dir . --task "修复 OAuth state 校验绕过问题" --phase verify --level M --files "src/oauth-state.ts,tests/oauth-state.test.ts"
34
- scale codegraph status --dir .
35
- scale eval run --dir .
36
- scale artifact dashboard --dir . --lang zh
37
- ```
38
-
39
- ## 观察点
40
-
41
- - `src/oauth-state.ts` 保持很小,便于核对 Agent 是否过度设计。
42
- - `tests/oauth-state.test.ts` 覆盖成功、缺失、过期、已消费和不匹配 state。
43
- - `CONTEXT.md` 和 `docs/CONTEXT-MAP.md` 只提供必要上下文,避免 demo 自己变成 token 污染源。
44
- - `.scale/evals/suites/workflow-baseline.json` 可由 `scale eval init --dir .` 重新生成。
45
-
46
- ## 这不是业务模板
47
-
48
- 这个 demo 不是 OAuth 产品模板,而是治理闭环模板。真实项目接入时,应保留 SCALE 的证据、评测、上下文预算和看板机制,再替换成自己的业务代码、服务矩阵和验证脚本。
1
+ # Agent Governance Demo
2
+
3
+ 这是 SCALE Engine 的最小官方 demo 项目,用一个 OAuth state 校验场景展示 Agent 工程治理如何落到真实代码、测试、证据和报告里。
4
+
5
+ 业务目标很小:OAuth callback 必须拒绝缺失、过期、已消费或不匹配的 state。
6
+
7
+ 治理目标更重要:Agent 不能只说“我完成了”,必须留下可验证证据。
8
+
9
+ ## 快速运行
10
+
11
+ ```bash
12
+ npm install
13
+ npm test
14
+ ```
15
+
16
+ ## 一键治理烟测
17
+
18
+ ```bash
19
+ npm run workflow:smoke
20
+ ```
21
+
22
+ 这个命令会依次运行:
23
+
24
+ - `npm test`:验证业务行为。
25
+ - `scale eval run --dir .`:运行工作流基线评测。
26
+ - `scale context budget --dir .`:检查上下文预算,避免无节制读取。
27
+ - `scale artifact dashboard --dir . --lang zh`:生成本地治理 HTML 看板。
28
+
29
+ ## 适合演示的 SCALE 命令
30
+
31
+ ```bash
32
+ scale governance mode --task "修复 OAuth state 校验绕过问题" --files "src/oauth-state.ts,tests/oauth-state.test.ts"
33
+ scale skill radar --dir . --task "修复 OAuth state 校验绕过问题" --phase verify --level M --files "src/oauth-state.ts,tests/oauth-state.test.ts"
34
+ scale codegraph status --dir .
35
+ scale eval run --dir .
36
+ scale artifact dashboard --dir . --lang zh
37
+ ```
38
+
39
+ ## 观察点
40
+
41
+ - `src/oauth-state.ts` 保持很小,便于核对 Agent 是否过度设计。
42
+ - `tests/oauth-state.test.ts` 覆盖成功、缺失、过期、已消费和不匹配 state。
43
+ - `CONTEXT.md` 和 `docs/CONTEXT-MAP.md` 只提供必要上下文,避免 demo 自己变成 token 污染源。
44
+ - `.scale/evals/suites/workflow-baseline.json` 可由 `scale eval init --dir .` 重新生成。
45
+
46
+ ## 这不是业务模板
47
+
48
+ 这个 demo 不是 OAuth 产品模板,而是治理闭环模板。真实项目接入时,应保留 SCALE 的证据、评测、上下文预算和看板机制,再替换成自己的业务代码、服务矩阵和验证脚本。
@@ -1,14 +1,14 @@
1
- # CONTEXT-MAP.md
2
-
3
- Project: Agent Governance Demo
4
-
5
- | Module | Owner | Product Doc | Architecture Doc |
6
- | --- | --- | --- | --- |
7
- | OAuth state verifier | SCALE demo | `README.md` | `src/oauth-state.ts` |
8
- | Workflow evidence | SCALE demo | `README.md` | `.scale/evals/suites/workflow-baseline.json` |
9
-
10
- ## Cross-Module Rules
11
-
12
- - Behavior changes in `src/oauth-state.ts` must update `tests/oauth-state.test.ts`.
13
- - Workflow command changes must update `README.md`.
14
- - Generated reports under `.scale/reports/` are review artifacts, not source of truth.
1
+ # CONTEXT-MAP.md
2
+
3
+ Project: Agent Governance Demo
4
+
5
+ | Module | Owner | Product Doc | Architecture Doc |
6
+ | --- | --- | --- | --- |
7
+ | OAuth state verifier | SCALE demo | `README.md` | `src/oauth-state.ts` |
8
+ | Workflow evidence | SCALE demo | `README.md` | `.scale/evals/suites/workflow-baseline.json` |
9
+
10
+ ## Cross-Module Rules
11
+
12
+ - Behavior changes in `src/oauth-state.ts` must update `tests/oauth-state.test.ts`.
13
+ - Workflow command changes must update `README.md`.
14
+ - Generated reports under `.scale/reports/` are review artifacts, not source of truth.
@@ -1,21 +1,22 @@
1
- {
2
- "name": "scale-agent-governance-demo",
3
- "version": "0.1.0",
4
- "private": true,
5
- "type": "module",
6
- "scripts": {
7
- "build": "tsc --noEmit --module NodeNext --moduleResolution NodeNext --target ES2022 src/oauth-state.ts tests/oauth-state.test.ts",
8
- "lint": "tsc --noEmit --module NodeNext --moduleResolution NodeNext --target ES2022 src/oauth-state.ts tests/oauth-state.test.ts",
9
- "test": "vitest run",
10
- "scale:eval": "scale eval run --dir .",
11
- "scale:budget": "scale context budget --dir .",
12
- "scale:dashboard": "scale artifact dashboard --dir . --lang zh",
13
- "workflow:smoke": "npm test && npm run scale:eval && npm run scale:budget && npm run scale:dashboard"
14
- },
15
- "devDependencies": {
16
- "@hongmaple0820/scale-engine": "^0.20.0",
17
- "typescript": "^5.5.0",
18
- "vitest": "^2.1.9"
19
- }
20
- }
21
-
1
+ {
2
+ "name": "scale-agent-governance-demo",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "scripts": {
7
+ "build": "tsc --noEmit --module NodeNext --moduleResolution NodeNext --target ES2022 src/oauth-state.ts tests/oauth-state.test.ts",
8
+ "lint": "tsc --noEmit --module NodeNext --moduleResolution NodeNext --target ES2022 src/oauth-state.ts tests/oauth-state.test.ts",
9
+ "test": "vitest run",
10
+ "scale:eval": "scale eval run --dir .",
11
+ "scale:budget": "scale context budget --dir .",
12
+ "scale:dashboard": "scale artifact dashboard --dir . --lang zh",
13
+ "workflow:smoke": "npm test && npm run scale:eval && npm run scale:budget && npm run scale:dashboard"
14
+ },
15
+ "devDependencies": {
16
+ "@hongmaple0820/scale-engine": "^0.20.0",
17
+ "@types/node": "^20.14.0",
18
+ "typescript": "^5.5.0",
19
+ "vitest": "^2.1.9"
20
+ }
21
+ }
22
+
@@ -1,39 +1,39 @@
1
- export type OAuthStateFailure = 'missing-record' | 'state-mismatch' | 'state-expired' | 'state-consumed'
2
-
3
- export interface OAuthStateRecord {
4
- state: string
5
- userId: string
6
- expiresAt: number
7
- consumedAt?: number
8
- }
9
-
10
- export interface OAuthStateVerification {
11
- ok: boolean
12
- userId?: string
13
- reason?: OAuthStateFailure
14
- }
15
-
16
- export function verifyOAuthState(
17
- record: OAuthStateRecord | undefined,
18
- providedState: string,
19
- now: number = Date.now()
20
- ): OAuthStateVerification {
21
- if (!record) {
22
- return { ok: false, reason: 'missing-record' }
23
- }
24
-
25
- if (record.state !== providedState) {
26
- return { ok: false, reason: 'state-mismatch' }
27
- }
28
-
29
- if (record.expiresAt <= now) {
30
- return { ok: false, reason: 'state-expired' }
31
- }
32
-
33
- if (record.consumedAt !== undefined) {
34
- return { ok: false, reason: 'state-consumed' }
35
- }
36
-
37
- return { ok: true, userId: record.userId }
38
- }
39
-
1
+ export type OAuthStateFailure = 'missing-record' | 'state-mismatch' | 'state-expired' | 'state-consumed'
2
+
3
+ export interface OAuthStateRecord {
4
+ state: string
5
+ userId: string
6
+ expiresAt: number
7
+ consumedAt?: number
8
+ }
9
+
10
+ export interface OAuthStateVerification {
11
+ ok: boolean
12
+ userId?: string
13
+ reason?: OAuthStateFailure
14
+ }
15
+
16
+ export function verifyOAuthState(
17
+ record: OAuthStateRecord | undefined,
18
+ providedState: string,
19
+ now: number = Date.now()
20
+ ): OAuthStateVerification {
21
+ if (!record) {
22
+ return { ok: false, reason: 'missing-record' }
23
+ }
24
+
25
+ if (record.state !== providedState) {
26
+ return { ok: false, reason: 'state-mismatch' }
27
+ }
28
+
29
+ if (record.expiresAt <= now) {
30
+ return { ok: false, reason: 'state-expired' }
31
+ }
32
+
33
+ if (record.consumedAt !== undefined) {
34
+ return { ok: false, reason: 'state-consumed' }
35
+ }
36
+
37
+ return { ok: true, userId: record.userId }
38
+ }
39
+
@@ -1,52 +1,52 @@
1
- import { describe, expect, it } from 'vitest'
2
- import { verifyOAuthState, type OAuthStateRecord } from '../src/oauth-state.js'
3
-
4
- const future = 2_000
5
- const now = 1_000
6
-
7
- function record(overrides: Partial<OAuthStateRecord> = {}): OAuthStateRecord {
8
- return {
9
- state: 'state-123',
10
- userId: 'user-1',
11
- expiresAt: future,
12
- ...overrides
13
- }
14
- }
15
-
16
- describe('verifyOAuthState', () => {
17
- it('accepts a valid unexpired state', () => {
18
- expect(verifyOAuthState(record(), 'state-123', now)).toEqual({
19
- ok: true,
20
- userId: 'user-1'
21
- })
22
- })
23
-
24
- it('rejects a missing record', () => {
25
- expect(verifyOAuthState(undefined, 'state-123', now)).toEqual({
26
- ok: false,
27
- reason: 'missing-record'
28
- })
29
- })
30
-
31
- it('rejects a mismatched state', () => {
32
- expect(verifyOAuthState(record(), 'other-state', now)).toEqual({
33
- ok: false,
34
- reason: 'state-mismatch'
35
- })
36
- })
37
-
38
- it('rejects an expired state', () => {
39
- expect(verifyOAuthState(record({ expiresAt: now }), 'state-123', now)).toEqual({
40
- ok: false,
41
- reason: 'state-expired'
42
- })
43
- })
44
-
45
- it('rejects a consumed state', () => {
46
- expect(verifyOAuthState(record({ consumedAt: 900 }), 'state-123', now)).toEqual({
47
- ok: false,
48
- reason: 'state-consumed'
49
- })
50
- })
51
- })
52
-
1
+ import { describe, expect, it } from 'vitest'
2
+ import { verifyOAuthState, type OAuthStateRecord } from '../src/oauth-state.js'
3
+
4
+ const future = 2_000
5
+ const now = 1_000
6
+
7
+ function record(overrides: Partial<OAuthStateRecord> = {}): OAuthStateRecord {
8
+ return {
9
+ state: 'state-123',
10
+ userId: 'user-1',
11
+ expiresAt: future,
12
+ ...overrides
13
+ }
14
+ }
15
+
16
+ describe('verifyOAuthState', () => {
17
+ it('accepts a valid unexpired state', () => {
18
+ expect(verifyOAuthState(record(), 'state-123', now)).toEqual({
19
+ ok: true,
20
+ userId: 'user-1'
21
+ })
22
+ })
23
+
24
+ it('rejects a missing record', () => {
25
+ expect(verifyOAuthState(undefined, 'state-123', now)).toEqual({
26
+ ok: false,
27
+ reason: 'missing-record'
28
+ })
29
+ })
30
+
31
+ it('rejects a mismatched state', () => {
32
+ expect(verifyOAuthState(record(), 'other-state', now)).toEqual({
33
+ ok: false,
34
+ reason: 'state-mismatch'
35
+ })
36
+ })
37
+
38
+ it('rejects an expired state', () => {
39
+ expect(verifyOAuthState(record({ expiresAt: now }), 'state-123', now)).toEqual({
40
+ ok: false,
41
+ reason: 'state-expired'
42
+ })
43
+ })
44
+
45
+ it('rejects a consumed state', () => {
46
+ expect(verifyOAuthState(record({ consumedAt: 900 }), 'state-123', now)).toEqual({
47
+ ok: false,
48
+ reason: 'state-consumed'
49
+ })
50
+ })
51
+ })
52
+