harnessed 1.0.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 (51) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +20 -0
  3. package/README.md +178 -0
  4. package/config-templates/README.md +21 -0
  5. package/config-templates/hooks/.gitkeep +0 -0
  6. package/dist/cli.d.ts +1 -0
  7. package/dist/cli.mjs +4653 -0
  8. package/dist/cli.mjs.map +1 -0
  9. package/dist/index.d.ts +3 -0
  10. package/dist/index.mjs +10 -0
  11. package/dist/index.mjs.map +1 -0
  12. package/dist/schemas/index.d.ts +47 -0
  13. package/dist/schemas/index.mjs +384 -0
  14. package/dist/schemas/index.mjs.map +1 -0
  15. package/manifests/README.md +23 -0
  16. package/manifests/SCHEMA.md +180 -0
  17. package/manifests/aliases.yaml +14 -0
  18. package/manifests/cc-hooks/dashboard-autospawn.yaml +45 -0
  19. package/manifests/skill-packs/.gitkeep +0 -0
  20. package/manifests/skill-packs/anthropics-skills-pptx.yaml +46 -0
  21. package/manifests/skill-packs/anthropics-skills-slide-deck.yaml +46 -0
  22. package/manifests/skill-packs/frontend-design.yaml +63 -0
  23. package/manifests/skill-packs/gsd.yaml +43 -0
  24. package/manifests/skill-packs/gstack.yaml +40 -0
  25. package/manifests/skill-packs/karpathy-skills.yaml +64 -0
  26. package/manifests/skill-packs/mattpocock-skills.yaml +40 -0
  27. package/manifests/skill-packs/planning-with-files.yaml +45 -0
  28. package/manifests/skill-packs/ui-ux-pro-max.yaml +61 -0
  29. package/manifests/tools/.gitkeep +0 -0
  30. package/manifests/tools/chrome-devtools-mcp.yaml +44 -0
  31. package/manifests/tools/ctx7.yaml +39 -0
  32. package/manifests/tools/exa-mcp.yaml +39 -0
  33. package/manifests/tools/playwright-test.yaml +47 -0
  34. package/manifests/tools/ralph-loop.yaml +46 -0
  35. package/manifests/tools/superpowers.yaml +42 -0
  36. package/manifests/tools/tavily-mcp.yaml +39 -0
  37. package/package.json +96 -0
  38. package/routing/.gitkeep +0 -0
  39. package/routing/README.md +22 -0
  40. package/routing/SCHEMA.md +199 -0
  41. package/routing/decision_rules.yaml +387 -0
  42. package/routing/plan-review-schema.yaml +50 -0
  43. package/schemas/.gitkeep +0 -0
  44. package/schemas/README.md +33 -0
  45. package/schemas/manifest.v1.schema.json +1107 -0
  46. package/workflows/.gitkeep +0 -0
  47. package/workflows/README.md +23 -0
  48. package/workflows/SCHEMA.md +157 -0
  49. package/workflows/execute-task/SKILL.md +70 -0
  50. package/workflows/execute-task/phases.yaml +27 -0
  51. package/workflows/plan-feature/workflow.yaml +40 -0
@@ -0,0 +1,61 @@
1
+ # yaml-language-server: $schema=../../schemas/manifest.v1.schema.json
2
+ apiVersion: harnessed/v1
3
+ kind: Manifest
4
+ metadata:
5
+ name: ui-ux-pro-max
6
+ display_name: ui-ux-pro-max (midwayjs/midway)
7
+ description: Data-driven, standards-based UI/UX expert skill (Codex skill ported via git-clone-with-setup; v4-next branch).
8
+ upstream:
9
+ source: midwayjs/midway
10
+ homepage: https://github.com/midwayjs/midway/tree/v4-next/.codex/skills/ui-ux-pro-max
11
+ repository: https://github.com/midwayjs/midway.git
12
+ license: MIT
13
+ notice: |
14
+ ui-ux-pro-max skill from midwayjs/midway v4-next branch (Codex skill ported to Claude Code skills/).
15
+ D1.3-5 path B 主推 (avoids vercel-labs/skills issue #373 update break on non-main branches).
16
+ spec:
17
+ type: cc-skill-pack
18
+ component_type: command
19
+ category: design
20
+ install_type: git
21
+ install:
22
+ method: git-clone-with-setup
23
+ cmd: "rm -rf ~/.claude/skills/.cache/midway-uiux && git clone --depth 1 --branch v4-next https://github.com/midwayjs/midway.git ~/.claude/skills/.cache/midway-uiux && mkdir -p ~/.claude/skills && cp -R ~/.claude/skills/.cache/midway-uiux/.codex/skills/ui-ux-pro-max ~/.claude/skills/ui-ux-pro-max && rm -rf ~/.claude/skills/.cache/midway-uiux"
24
+ git_ref: e89d70e4bcd0ae04709a773db549cf61fcf813ac
25
+ idempotent_check: "test -f ~/.claude/skills/ui-ux-pro-max/SKILL.md"
26
+ verify:
27
+ cmd: "test -f ~/.claude/skills/ui-ux-pro-max/SKILL.md"
28
+ timeout_ms: 5000
29
+ expected_exit_code: 0
30
+ uninstall:
31
+ cmd: "rm -rf ~/.claude/skills/ui-ux-pro-max"
32
+ cleanup_paths:
33
+ - ~/.claude/skills/ui-ux-pro-max
34
+ upstream_health:
35
+ stability: beta
36
+ last_check: "2026-05-13"
37
+ last_known_good_version: v4-next-e89d70e4bcd0
38
+ fallback_action: warn
39
+ signed_by: easyinplay
40
+ platforms:
41
+ - linux
42
+ - darwin
43
+ - win32
44
+ decision_rules:
45
+ trigger: "user 请求 UI/UX 设计 / 前端组件 / design system / 数据驱动可视化"
46
+ default_expert: ui-ux-pro-max
47
+ arbitration_rule: "ui-ux-pro-max 出主方案 (数据驱动 / 标准化); frontend-design 补 layout / 动效 / 装饰细节"
48
+ override_signals:
49
+ - phrase: "做出风格"
50
+ use: frontend-design
51
+ - phrase: "experimental"
52
+ use: frontend-design
53
+ - phrase: "design-led"
54
+ use: frontend-design
55
+ # Phase 2.3 W2 T2.5 — B-17 per-manifest hint 冗余守护层 (SSOT 主导 routing/decision_rules.yaml — D-04)
56
+ do_not_use_when:
57
+ - 做出风格
58
+ - 独创
59
+ - 风格化
60
+ - design-led
61
+ if_rejected_use: frontend-design
File without changes
@@ -0,0 +1,44 @@
1
+ # yaml-language-server: $schema=../../schemas/manifest.v1.schema.json
2
+ apiVersion: harnessed/v1
3
+ kind: Manifest
4
+ metadata:
5
+ name: chrome-devtools-mcp
6
+ display_name: Chrome DevTools MCP
7
+ description: Performance / a11y / memory-leak diagnostics via Chrome DevTools MCP (LCP / Core Web Vitals / ARIA / heap snapshot).
8
+ upstream:
9
+ source: chrome-devtools-mcp
10
+ homepage: https://github.com/ChromeDevTools/chrome-devtools-mcp
11
+ repository: https://github.com/ChromeDevTools/chrome-devtools-mcp.git
12
+ license: Apache-2.0
13
+ notice: |
14
+ chrome-devtools-mcp by ChromeDevTools team (Apache-2.0, npm stdio MCP).
15
+ Method = mcp-stdio-add (research § 3.3: no HTTP endpoint; matches tavily-mcp shape).
16
+ testing category — perf / a11y / memory-leak; routed via `perf-a11y-memory` rule.
17
+ spec:
18
+ type: mcp-npm
19
+ component_type: mcp-tool
20
+ category: testing
21
+ install_type: mcp
22
+ install:
23
+ method: mcp-stdio-add
24
+ cmd: "claude mcp add --scope project --transport stdio chrome-devtools-mcp -- npx --yes chrome-devtools-mcp@^0.1.0"
25
+ npm_version: ^0.1.0
26
+ idempotent_check: "claude mcp list | grep -q chrome-devtools-mcp"
27
+ verify:
28
+ cmd: "claude mcp list | grep -q chrome-devtools-mcp"
29
+ timeout_ms: 10000
30
+ uninstall:
31
+ cmd: "claude mcp remove --scope project chrome-devtools-mcp"
32
+ upstream_health:
33
+ stability: stable
34
+ last_check: "2026-05-16"
35
+ last_known_good_version: "0.1.0"
36
+ fallback_action: warn
37
+ signed_by: easyinplay
38
+ platforms:
39
+ - linux
40
+ - darwin
41
+ - win32
42
+ decision_rules:
43
+ trigger: "perf / a11y / memory-leak / LCP / Core Web Vitals"
44
+ default_expert: chrome-devtools-mcp
@@ -0,0 +1,39 @@
1
+ # yaml-language-server: $schema=../../schemas/manifest.v1.schema.json
2
+ apiVersion: harnessed/v1
3
+ kind: Manifest
4
+ metadata:
5
+ name: ctx7
6
+ display_name: ctx7 CLI
7
+ description: Up-to-date library / framework documentation fetcher (Upstash). Bash CLI, two-step library + docs.
8
+ upstream:
9
+ source: ctx7
10
+ homepage: https://context7.com
11
+ repository: https://github.com/upstash/context7.git
12
+ license: MIT
13
+ notice: ctx7 by Upstash (official), used as on-demand library doc retriever in harnessed plan-feature workflow.
14
+ spec:
15
+ type: cli-npm
16
+ component_type: cli-binary
17
+ category: search
18
+ install_type: npm
19
+ install:
20
+ method: npm-cli
21
+ cmd: "npm install -g ctx7"
22
+ npm_version: ^0.4.0
23
+ idempotent_check: "command -v ctx7"
24
+ verify:
25
+ cmd: "ctx7 --version"
26
+ timeout_ms: 5000
27
+ expected_exit_code: 0
28
+ uninstall:
29
+ cmd: "npm uninstall -g ctx7"
30
+ upstream_health:
31
+ stability: stable
32
+ last_check: "2026-05-11"
33
+ last_known_good_version: 0.4.x
34
+ fallback_action: warn
35
+ signed_by: easyinplay
36
+ platforms:
37
+ - linux
38
+ - darwin
39
+ - win32
@@ -0,0 +1,39 @@
1
+ # yaml-language-server: $schema=../../schemas/manifest.v1.schema.json
2
+ apiVersion: harnessed/v1
3
+ kind: Manifest
4
+ metadata:
5
+ name: exa-mcp
6
+ display_name: Exa MCP
7
+ description: Neural-search MCP for descriptive queries / academic papers / batch URL fetch (web_fetch_exa).
8
+ upstream:
9
+ source: exa-mcp-server
10
+ homepage: https://docs.exa.ai/reference/exa-mcp
11
+ repository: https://github.com/exa-labs/exa-mcp-server.git
12
+ license: MIT
13
+ notice: exa-mcp-server by exa-labs (official), used as semantic-search MCP per harnessed routing rules.
14
+ spec:
15
+ type: mcp-npm
16
+ component_type: mcp-tool
17
+ category: search
18
+ install_type: mcp
19
+ install:
20
+ method: mcp-stdio-add
21
+ cmd: "claude mcp add --scope project --transport stdio exa-mcp -- npx --yes exa-mcp-server@^3.2.0"
22
+ npm_version: ^3.2.0
23
+ idempotent_check: "claude mcp list | grep -q exa"
24
+ verify:
25
+ cmd: "claude mcp list | grep -q exa"
26
+ timeout_ms: 10000
27
+ uninstall:
28
+ cmd: "claude mcp remove --scope project exa-mcp"
29
+ upstream_health:
30
+ stability: stable
31
+ last_check: "2026-05-11"
32
+ last_known_good_version: 3.2.1
33
+ fallback_action: use_alternative
34
+ alternative: tavily-mcp
35
+ signed_by: easyinplay
36
+ platforms:
37
+ - linux
38
+ - darwin
39
+ - win32
@@ -0,0 +1,47 @@
1
+ # yaml-language-server: $schema=../../schemas/manifest.v1.schema.json
2
+ apiVersion: harnessed/v1
3
+ kind: Manifest
4
+ metadata:
5
+ name: playwright-test
6
+ display_name: Playwright Test (microsoft/playwright-cli)
7
+ description: End-to-end browser test framework. Frontend e2e (TS / React / Vue) default per decision_rules e2e-default.
8
+ upstream:
9
+ source: github.com/microsoft/playwright-cli
10
+ homepage: https://github.com/microsoft/playwright-cli
11
+ repository: https://github.com/microsoft/playwright-cli.git
12
+ license: Apache-2.0
13
+ notice: |
14
+ playwright-test skill from microsoft/playwright-cli (Microsoft official, Apache-2.0; .planning/research/v0.2.0-extensions.md § 3.2).
15
+ testing category — frontend e2e default; routed via decision_rules.yaml `e2e-default` rule (priority 50 at L107-114).
16
+ perf / a11y / memory-leak forbidden — those route to chrome-devtools-mcp per `perf-a11y-memory` rule (L79-95).
17
+ spec:
18
+ type: cc-skill-pack
19
+ component_type: command
20
+ category: testing
21
+ install_type: skill
22
+ install:
23
+ method: npx-skill-installer
24
+ cmd: "npx --yes skills@1.5.7 add microsoft/playwright-cli --copy --global"
25
+ npm_version: ^1.5.7
26
+ idempotent_check: "test -f ~/.claude/skills/playwright-cli/SKILL.md"
27
+ verify:
28
+ cmd: "test -f ~/.claude/skills/playwright-cli/SKILL.md"
29
+ timeout_ms: 5000
30
+ expected_exit_code: 0
31
+ uninstall:
32
+ cmd: "rm -rf ~/.claude/skills/playwright-cli"
33
+ cleanup_paths:
34
+ - ~/.claude/skills/playwright-cli
35
+ upstream_health:
36
+ stability: stable
37
+ last_check: "2026-05-16"
38
+ last_known_good_version: "1.5.7"
39
+ fallback_action: warn
40
+ signed_by: easyinplay
41
+ platforms:
42
+ - linux
43
+ - darwin
44
+ - win32
45
+ decision_rules:
46
+ trigger: "e2e test / browser test / TypeScript frontend e2e"
47
+ default_expert: playwright-test
@@ -0,0 +1,46 @@
1
+ # yaml-language-server: $schema=../../schemas/manifest.v1.schema.json
2
+ #
3
+ # NOTE: spec.install.cmd is a Claude Code REPL slash command, NOT a shell command.
4
+ # cc-plugin-marketplace install method's actual mechanism is undefined for
5
+ # headless installer execution. Phase 1.2 plan-phase will resolve via one of:
6
+ # (A) Auto-print prompt + require user to paste into CC REPL (semi-automated);
7
+ # (B) Headless `claude plugin install <name>` CLI if/when CC ships it;
8
+ # (C) Defer ralph-loop to v0.2+ (until headless mechanism exists).
9
+ # Tracked: progress.md § B F20.
10
+ apiVersion: harnessed/v1
11
+ kind: Manifest
12
+ metadata:
13
+ name: ralph-loop
14
+ display_name: ralph-loop
15
+ description: Sub-task delivery loop with completion-promise (Anthropic-official). Windows requires jq + Git Bash.
16
+ upstream:
17
+ source: ralph-loop
18
+ homepage: https://github.com/anthropics/claude-plugins-official/tree/main/plugins/ralph-loop
19
+ repository: https://github.com/anthropics/claude-plugins-official.git
20
+ license: MIT
21
+ notice: ralph-loop maintained by Anthropic in claude-plugins-official, used as sub-task delivery guarantor in harnessed.
22
+ spec:
23
+ type: cc-plugin
24
+ component_type: command
25
+ category: engineering
26
+ install_type: skill
27
+ install:
28
+ method: cc-plugin-marketplace
29
+ cmd: "/plugin install ralph-loop@claude-plugins-official"
30
+ git_ref: 45896c8f2fe68e68ca2a8e3554d4441f48475431
31
+ idempotent_check: "/plugin list | grep -q ralph-loop"
32
+ verify:
33
+ cmd: "/plugin list | grep -q ralph-loop"
34
+ timeout_ms: 5000
35
+ uninstall:
36
+ cmd: "/plugin uninstall ralph-loop@claude-plugins-official"
37
+ upstream_health:
38
+ stability: beta
39
+ last_check: "2026-05-11"
40
+ last_known_good_version: main
41
+ fallback_action: warn
42
+ signed_by: easyinplay
43
+ platforms:
44
+ - linux
45
+ - darwin
46
+ - win32
@@ -0,0 +1,42 @@
1
+ # yaml-language-server: $schema=../../schemas/manifest.v1.schema.json
2
+ #
3
+ # NOTE: spec.install.cmd is a Claude Code REPL slash command, NOT a shell command.
4
+ # cc-plugin-marketplace install method's actual mechanism is undefined for
5
+ # headless installer execution. See progress.md § B F20.
6
+ apiVersion: harnessed/v1
7
+ kind: Manifest
8
+ metadata:
9
+ name: superpowers
10
+ display_name: superpowers
11
+ description: Senior-engineer skill plugin (brainstorming, TDD, git worktrees) auto-activated by Claude.
12
+ upstream:
13
+ source: superpowers
14
+ homepage: https://github.com/obra/superpowers
15
+ repository: https://github.com/obra/superpowers.git
16
+ license: MIT
17
+ notice: superpowers by Jesse Vincent (obra) and Prime Radiant team, used as execution-layer engineering quality skills.
18
+ spec:
19
+ type: cc-plugin
20
+ component_type: command
21
+ category: engineering
22
+ install_type: skill
23
+ install:
24
+ method: cc-plugin-marketplace
25
+ cmd: "/plugin marketplace add obra/superpowers-marketplace && /plugin install superpowers@superpowers-marketplace"
26
+ git_ref: v5.1.0
27
+ idempotent_check: "/plugin list | grep -q superpowers"
28
+ verify:
29
+ cmd: "/plugin list | grep -q superpowers"
30
+ timeout_ms: 5000
31
+ uninstall:
32
+ cmd: "/plugin uninstall superpowers@superpowers-marketplace"
33
+ upstream_health:
34
+ stability: stable
35
+ last_check: "2026-05-11"
36
+ last_known_good_version: 5.1.0
37
+ fallback_action: warn
38
+ signed_by: easyinplay
39
+ platforms:
40
+ - linux
41
+ - darwin
42
+ - win32
@@ -0,0 +1,39 @@
1
+ # yaml-language-server: $schema=../../schemas/manifest.v1.schema.json
2
+ apiVersion: harnessed/v1
3
+ kind: Manifest
4
+ metadata:
5
+ name: tavily-mcp
6
+ display_name: Tavily MCP
7
+ description: Web search / extract / map / crawl MCP server. Default web search via tavily_search.
8
+ upstream:
9
+ source: tavily-mcp
10
+ homepage: https://docs.tavily.com/docs/mcp
11
+ repository: https://github.com/tavily-ai/tavily-mcp.git
12
+ license: MIT
13
+ notice: tavily-mcp by tavily-ai (official), used as default web-search MCP per harnessed routing rules.
14
+ spec:
15
+ type: mcp-npm
16
+ component_type: mcp-tool
17
+ category: search
18
+ install_type: mcp
19
+ install:
20
+ method: mcp-stdio-add
21
+ cmd: "claude mcp add --scope project --transport stdio tavily-mcp -- npx --yes tavily-mcp@^0.2.0"
22
+ npm_version: ^0.2.0
23
+ idempotent_check: "claude mcp list | grep -q tavily"
24
+ verify:
25
+ cmd: "claude mcp list | grep -q tavily"
26
+ timeout_ms: 10000
27
+ uninstall:
28
+ cmd: "claude mcp remove --scope project tavily-mcp"
29
+ upstream_health:
30
+ stability: beta
31
+ last_check: "2026-05-11"
32
+ last_known_good_version: 0.2.19
33
+ fallback_action: use_alternative
34
+ alternative: exa-mcp
35
+ signed_by: easyinplay
36
+ platforms:
37
+ - linux
38
+ - darwin
39
+ - win32
package/package.json ADDED
@@ -0,0 +1,96 @@
1
+ {
2
+ "name": "harnessed",
3
+ "version": "1.0.0",
4
+ "description": "AI coding harness package manager + composition orchestrator",
5
+ "type": "module",
6
+ "license": "Apache-2.0",
7
+ "author": "easyinplay",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "https://github.com/easyinplay/harnessed.git"
11
+ },
12
+ "homepage": "https://github.com/easyinplay/harnessed#readme",
13
+ "bugs": "https://github.com/easyinplay/harnessed/issues",
14
+ "keywords": [
15
+ "claude-code",
16
+ "ai-harness",
17
+ "package-manager",
18
+ "composition",
19
+ "skill-pack",
20
+ "mcp",
21
+ "orchestrator"
22
+ ],
23
+ "engines": {
24
+ "node": ">=22.0.0"
25
+ },
26
+ "packageManager": "pnpm@10.12.0",
27
+ "bin": {
28
+ "harnessed": "./dist/cli.mjs"
29
+ },
30
+ "main": "./dist/index.mjs",
31
+ "types": "./dist/index.d.ts",
32
+ "exports": {
33
+ ".": {
34
+ "types": "./dist/index.d.ts",
35
+ "import": "./dist/index.mjs",
36
+ "default": "./dist/index.mjs"
37
+ },
38
+ "./schemas": {
39
+ "types": "./dist/schemas/index.d.ts",
40
+ "import": "./dist/schemas/index.mjs"
41
+ },
42
+ "./package.json": "./package.json"
43
+ },
44
+ "files": [
45
+ "dist",
46
+ "manifests",
47
+ "workflows",
48
+ "routing",
49
+ "config-templates",
50
+ "schemas",
51
+ "README.md",
52
+ "LICENSE",
53
+ "NOTICE"
54
+ ],
55
+ "scripts": {
56
+ "dev": "tsup --watch",
57
+ "build": "tsc --noEmit && tsup",
58
+ "build:schema": "node ./scripts/build-schema.mjs",
59
+ "validate:schema": "node ./scripts/validate-schema.mjs",
60
+ "typecheck": "tsc --noEmit",
61
+ "test": "vitest run --passWithNoTests",
62
+ "test:watch": "vitest",
63
+ "test:coverage": "vitest run --coverage --passWithNoTests",
64
+ "bench": "vitest bench --run",
65
+ "lint": "biome check .",
66
+ "lint:fix": "biome check --write .",
67
+ "format": "biome format --write ."
68
+ },
69
+ "dependencies": {
70
+ "@anthropic-ai/claude-agent-sdk": "0.3.142",
71
+ "@clack/prompts": "^0.10.1",
72
+ "@sinclair/typebox": "^0.34.49",
73
+ "ajv": "^8.20.0",
74
+ "ajv-errors": "^3.0.0",
75
+ "ajv-formats": "^3.0.1",
76
+ "commander": "^13.0.0",
77
+ "diff": "^9.0.0",
78
+ "picocolors": "^1.1.1",
79
+ "proper-lockfile": "^4.1.2",
80
+ "yaml": "^2.9.0"
81
+ },
82
+ "devDependencies": {
83
+ "@biomejs/biome": "^2.0.0",
84
+ "@types/node": "^22.10.0",
85
+ "@types/proper-lockfile": "^4.1.4",
86
+ "@vitest/coverage-v8": "^4.0.0",
87
+ "tsup": "^8.3.0",
88
+ "typescript": "^5.6.0",
89
+ "vitest": "^4.0.0"
90
+ },
91
+ "pnpm": {
92
+ "onlyBuiltDependencies": [
93
+ "esbuild"
94
+ ]
95
+ }
96
+ }
File without changes
@@ -0,0 +1,22 @@
1
+ # routing/ — B+C 混合路由 SSOT
2
+
3
+ `routing/` 是 harnessed 的**路由元规则**——B 层(skill description 自动生成)+ C 层(UserPromptSubmit hook 硬路由)共享同一份 yaml frontmatter,避免双轨维护。
4
+
5
+ ## 结构(v0.1 MVP)
6
+
7
+ - `search.md` — research workflow 路由(ctx7 / tavily / exa / parallel) — v0.1.0
8
+ - `ui.md` — UI/UX 任务路由(ui-ux-pro-max + frontend-design) — v0.3.0
9
+ - `testing.md` — 测试工具路由(playwright / vitest / webapp-testing) — v0.3.0
10
+ - `execute.md` — execute-task 内部路由(mattpocock 招式触发) — v0.2.0
11
+
12
+ ## Schema
13
+
14
+ 每个 routing 文件 yaml frontmatter 必须含 `trigger` / `hard_route` / `soft_hint` / `fallback` 四块(详见 `routing/SCHEMA.md`)。
15
+
16
+ JSON Schema 严格校验:
17
+ - 字段定义:`PROJECT-SPEC.md` v2.1 § 9
18
+ - 实现:`schemas/routing.v1.schema.json`(v0.1 phase 1.4)
19
+
20
+ ## 透明度
21
+
22
+ 每次路由决策**必须可见输出**(默认折叠,可展开)— 决策来源、备选方案、实际命令均显示给用户。详见 `WORKFLOWS-MVP.md` § 路由透明度设计。