sherpa-skill 2.0.5 → 2.0.7

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 (247) hide show
  1. package/.agents/plugins/marketplace.json +11 -0
  2. package/.agents/skills/sherpa/SKILL.md +161 -0
  3. package/.agents/skills/sherpa/commands/README.md +43 -0
  4. package/.agents/skills/sherpa/commands/manifest.json +589 -0
  5. package/.agents/skills/sherpa/commands/sherpa-research.md +147 -0
  6. package/.agents/skills/sherpa/core/commands/router.py +171 -0
  7. package/.agents/skills/sherpa/core/configuration/manager.py +504 -0
  8. package/.agents/skills/sherpa/core/ideas/engine.py +564 -0
  9. package/.agents/skills/sherpa/docs/commands/README.md +96 -0
  10. package/.agents/skills/sherpa/docs/configuration/runtime-verification.md +64 -0
  11. package/.agents/skills/sherpa/rules/demo-preparation-rules.md +543 -0
  12. package/.agents/skills/sherpa/rules/engineering-rules.md +221 -0
  13. package/.agents/skills/sherpa/rules/final-audit-rules.md +824 -0
  14. package/.agents/skills/sherpa/rules/implementation-rules.md +127 -0
  15. package/.agents/skills/sherpa/rules/judge-rules.md +443 -0
  16. package/.agents/skills/sherpa/rules/mentor-rules.md +109 -0
  17. package/.agents/skills/sherpa/rules/postmortem-rules.md +69 -0
  18. package/.agents/skills/sherpa/rules/presentation-rules.md +783 -0
  19. package/.agents/skills/sherpa/rules/red-team-rules.md +185 -0
  20. package/.agents/skills/sherpa/rules/research-rules.md +184 -0
  21. package/.agents/skills/sherpa/rules/score-optimization-rules.md +355 -0
  22. package/.agents/skills/sherpa/rules/scoring-rules.md +216 -0
  23. package/.agents/skills/sherpa/rules/submission-rules.md +41 -0
  24. package/.agents/skills/sherpa/rules/testing-security-rules.md +87 -0
  25. package/.agents/skills/sherpa/rules/ux-rules.md +89 -0
  26. package/.agents/skills/sherpa/src/config_manager.py +474 -0
  27. package/.agents/skills/sherpa/src/verification.py +458 -0
  28. package/.agents/skills/sherpa/templates/audit-finding.md +20 -0
  29. package/.agents/skills/sherpa/templates/claim-audit.md +15 -0
  30. package/.agents/skills/sherpa/templates/configuration/hackathon.json +21 -0
  31. package/.agents/skills/sherpa/templates/configuration/integrations.env.example +3 -0
  32. package/.agents/skills/sherpa/templates/configuration/project.env.example +12 -0
  33. package/.agents/skills/sherpa/templates/configuration/providers.env.example +4 -0
  34. package/.agents/skills/sherpa/templates/configuration/settings.json +22 -0
  35. package/.agents/skills/sherpa/templates/consistency-audit.md +17 -0
  36. package/.agents/skills/sherpa/templates/decision-log.md +18 -0
  37. package/.agents/skills/sherpa/templates/demo-checkpoint.md +42 -0
  38. package/.agents/skills/sherpa/templates/demo-evidence.md +32 -0
  39. package/.agents/skills/sherpa/templates/demo-finding.md +112 -0
  40. package/.agents/skills/sherpa/templates/demo-flow.md +52 -0
  41. package/.agents/skills/sherpa/templates/demo-plan.md +265 -0
  42. package/.agents/skills/sherpa/templates/demo-verification.md +57 -0
  43. package/.agents/skills/sherpa/templates/final-audit.md +387 -0
  44. package/.agents/skills/sherpa/templates/final-risk.md +17 -0
  45. package/.agents/skills/sherpa/templates/final-verification.md +57 -0
  46. package/.agents/skills/sherpa/templates/gap-analysis.md +113 -0
  47. package/.agents/skills/sherpa/templates/idea-comparison.md +129 -0
  48. package/.agents/skills/sherpa/templates/idea-evaluation.md +251 -0
  49. package/.agents/skills/sherpa/templates/implementation-plan.md +96 -0
  50. package/.agents/skills/sherpa/templates/implementation-task.md +57 -0
  51. package/.agents/skills/sherpa/templates/improvement-candidate.md +135 -0
  52. package/.agents/skills/sherpa/templates/improvement.md +18 -0
  53. package/.agents/skills/sherpa/templates/incident.md +20 -0
  54. package/.agents/skills/sherpa/templates/judge-criterion.md +41 -0
  55. package/.agents/skills/sherpa/templates/judge-question.md +41 -0
  56. package/.agents/skills/sherpa/templates/judge-session.md +125 -0
  57. package/.agents/skills/sherpa/templates/judge-simulation.md +264 -0
  58. package/.agents/skills/sherpa/templates/lesson.md +14 -0
  59. package/.agents/skills/sherpa/templates/postmortem.md +87 -0
  60. package/.agents/skills/sherpa/templates/presentation-evidence.md +33 -0
  61. package/.agents/skills/sherpa/templates/presentation-plan.md +349 -0
  62. package/.agents/skills/sherpa/templates/presentation-qna.md +29 -0
  63. package/.agents/skills/sherpa/templates/presentation-risk.md +42 -0
  64. package/.agents/skills/sherpa/templates/presentation-verification.md +57 -0
  65. package/.agents/skills/sherpa/templates/project-plan.md +242 -0
  66. package/.agents/skills/sherpa/templates/project-state.md +84 -0
  67. package/.agents/skills/sherpa/templates/red-team-finding.md +73 -0
  68. package/.agents/skills/sherpa/templates/red-team-review.md +105 -0
  69. package/.agents/skills/sherpa/templates/red-team-scenario.md +43 -0
  70. package/.agents/skills/sherpa/templates/red-team-verification.md +31 -0
  71. package/.agents/skills/sherpa/templates/repo-analysis.md +204 -0
  72. package/.agents/skills/sherpa/templates/requirement-audit.md +15 -0
  73. package/.agents/skills/sherpa/templates/research-comparison.md +124 -0
  74. package/.agents/skills/sherpa/templates/research-plan.md +93 -0
  75. package/.agents/skills/sherpa/templates/research-report.md +92 -0
  76. package/.agents/skills/sherpa/templates/research-source.md +77 -0
  77. package/.agents/skills/sherpa/templates/score-optimization-plan.md +197 -0
  78. package/.agents/skills/sherpa/templates/security-finding.md +45 -0
  79. package/.agents/skills/sherpa/templates/security-review.md +64 -0
  80. package/.agents/skills/sherpa/templates/slide-claim.md +47 -0
  81. package/.agents/skills/sherpa/templates/slide-plan.md +127 -0
  82. package/.agents/skills/sherpa/templates/submission-artifact.md +15 -0
  83. package/.agents/skills/sherpa/templates/submission-checklist.md +24 -0
  84. package/.agents/skills/sherpa/templates/submission-field.md +14 -0
  85. package/.agents/skills/sherpa/templates/submission-link.md +14 -0
  86. package/.agents/skills/sherpa/templates/submission-plan.md +31 -0
  87. package/.agents/skills/sherpa/templates/submission-readiness.md +18 -0
  88. package/.agents/skills/sherpa/templates/submission-requirement.md +12 -0
  89. package/.agents/skills/sherpa/templates/submission-risk.md +14 -0
  90. package/.agents/skills/sherpa/templates/submission-snapshot.md +20 -0
  91. package/.agents/skills/sherpa/templates/submission-verification.md +12 -0
  92. package/.agents/skills/sherpa/templates/test-plan.md +59 -0
  93. package/.agents/skills/sherpa/templates/test-result.md +46 -0
  94. package/.agents/skills/sherpa/templates/timeline.md +11 -0
  95. package/.agents/skills/sherpa/templates/ux-finding.md +56 -0
  96. package/.agents/skills/sherpa/templates/ux-flow.md +46 -0
  97. package/.agents/skills/sherpa/templates/ux-review.md +113 -0
  98. package/.agents/skills/sherpa/templates/ux-verification.md +32 -0
  99. package/.agents/skills/sherpa/workflows/configuration.md +23 -0
  100. package/.agents/skills/sherpa/workflows/demo-preparation.md +399 -0
  101. package/.agents/skills/sherpa/workflows/final-audit.md +713 -0
  102. package/.agents/skills/sherpa/workflows/idea-evaluation.md +239 -0
  103. package/.agents/skills/sherpa/workflows/idea-intelligence.md +69 -0
  104. package/.agents/skills/sherpa/workflows/implementation.md +42 -0
  105. package/.agents/skills/sherpa/workflows/init.md +102 -0
  106. package/.agents/skills/sherpa/workflows/judge-simulation.md +408 -0
  107. package/.agents/skills/sherpa/workflows/lifecycle.md +51 -0
  108. package/.agents/skills/sherpa/workflows/next.md +96 -0
  109. package/.agents/skills/sherpa/workflows/postmortem.md +76 -0
  110. package/.agents/skills/sherpa/workflows/presentation.md +522 -0
  111. package/.agents/skills/sherpa/workflows/project-planning.md +327 -0
  112. package/.agents/skills/sherpa/workflows/red-team.md +373 -0
  113. package/.agents/skills/sherpa/workflows/research.md +142 -0
  114. package/.agents/skills/sherpa/workflows/score-optimization.md +276 -0
  115. package/.agents/skills/sherpa/workflows/status.md +107 -0
  116. package/.agents/skills/sherpa/workflows/submission.md +46 -0
  117. package/.agents/skills/sherpa/workflows/testing-security.md +44 -0
  118. package/.agents/skills/sherpa/workflows/ux-review.md +59 -0
  119. package/.claude-plugin/marketplace.json +21 -0
  120. package/.claude-plugin/plugin.json +13 -0
  121. package/.codex-plugin/plugin.json +13 -0
  122. package/GEMINI.md +3 -0
  123. package/README.md +14 -8
  124. package/SKILL.md +161 -0
  125. package/distribution/cli/sherpa +7 -2
  126. package/distribution/npm/sherpa.mjs +15 -8
  127. package/gemini-extension.json +7 -0
  128. package/package.json +31 -3
  129. package/plugin.json +20 -0
  130. package/qwen-extension.json +6 -0
  131. package/skills/sherpa/SKILL.md +161 -0
  132. package/skills/sherpa/commands/README.md +43 -0
  133. package/skills/sherpa/commands/manifest.json +589 -0
  134. package/skills/sherpa/commands/sherpa-research.md +147 -0
  135. package/skills/sherpa/core/commands/router.py +171 -0
  136. package/skills/sherpa/core/configuration/manager.py +504 -0
  137. package/skills/sherpa/core/ideas/engine.py +564 -0
  138. package/skills/sherpa/docs/commands/README.md +96 -0
  139. package/skills/sherpa/docs/configuration/runtime-verification.md +64 -0
  140. package/skills/sherpa/rules/demo-preparation-rules.md +543 -0
  141. package/skills/sherpa/rules/engineering-rules.md +221 -0
  142. package/skills/sherpa/rules/final-audit-rules.md +824 -0
  143. package/skills/sherpa/rules/implementation-rules.md +127 -0
  144. package/skills/sherpa/rules/judge-rules.md +443 -0
  145. package/skills/sherpa/rules/mentor-rules.md +109 -0
  146. package/skills/sherpa/rules/postmortem-rules.md +69 -0
  147. package/skills/sherpa/rules/presentation-rules.md +783 -0
  148. package/skills/sherpa/rules/red-team-rules.md +185 -0
  149. package/skills/sherpa/rules/research-rules.md +184 -0
  150. package/skills/sherpa/rules/score-optimization-rules.md +355 -0
  151. package/skills/sherpa/rules/scoring-rules.md +216 -0
  152. package/skills/sherpa/rules/submission-rules.md +41 -0
  153. package/skills/sherpa/rules/testing-security-rules.md +87 -0
  154. package/skills/sherpa/rules/ux-rules.md +89 -0
  155. package/skills/sherpa/src/config_manager.py +474 -0
  156. package/skills/sherpa/src/verification.py +458 -0
  157. package/skills/sherpa/templates/audit-finding.md +20 -0
  158. package/skills/sherpa/templates/claim-audit.md +15 -0
  159. package/skills/sherpa/templates/configuration/hackathon.json +21 -0
  160. package/skills/sherpa/templates/configuration/integrations.env.example +3 -0
  161. package/skills/sherpa/templates/configuration/project.env.example +12 -0
  162. package/skills/sherpa/templates/configuration/providers.env.example +4 -0
  163. package/skills/sherpa/templates/configuration/settings.json +22 -0
  164. package/skills/sherpa/templates/consistency-audit.md +17 -0
  165. package/skills/sherpa/templates/decision-log.md +18 -0
  166. package/skills/sherpa/templates/demo-checkpoint.md +42 -0
  167. package/skills/sherpa/templates/demo-evidence.md +32 -0
  168. package/skills/sherpa/templates/demo-finding.md +112 -0
  169. package/skills/sherpa/templates/demo-flow.md +52 -0
  170. package/skills/sherpa/templates/demo-plan.md +265 -0
  171. package/skills/sherpa/templates/demo-verification.md +57 -0
  172. package/skills/sherpa/templates/final-audit.md +387 -0
  173. package/skills/sherpa/templates/final-risk.md +17 -0
  174. package/skills/sherpa/templates/final-verification.md +57 -0
  175. package/skills/sherpa/templates/gap-analysis.md +113 -0
  176. package/skills/sherpa/templates/idea-comparison.md +129 -0
  177. package/skills/sherpa/templates/idea-evaluation.md +251 -0
  178. package/skills/sherpa/templates/implementation-plan.md +96 -0
  179. package/skills/sherpa/templates/implementation-task.md +57 -0
  180. package/skills/sherpa/templates/improvement-candidate.md +135 -0
  181. package/skills/sherpa/templates/improvement.md +18 -0
  182. package/skills/sherpa/templates/incident.md +20 -0
  183. package/skills/sherpa/templates/judge-criterion.md +41 -0
  184. package/skills/sherpa/templates/judge-question.md +41 -0
  185. package/skills/sherpa/templates/judge-session.md +125 -0
  186. package/skills/sherpa/templates/judge-simulation.md +264 -0
  187. package/skills/sherpa/templates/lesson.md +14 -0
  188. package/skills/sherpa/templates/postmortem.md +87 -0
  189. package/skills/sherpa/templates/presentation-evidence.md +33 -0
  190. package/skills/sherpa/templates/presentation-plan.md +349 -0
  191. package/skills/sherpa/templates/presentation-qna.md +29 -0
  192. package/skills/sherpa/templates/presentation-risk.md +42 -0
  193. package/skills/sherpa/templates/presentation-verification.md +57 -0
  194. package/skills/sherpa/templates/project-plan.md +242 -0
  195. package/skills/sherpa/templates/project-state.md +84 -0
  196. package/skills/sherpa/templates/red-team-finding.md +73 -0
  197. package/skills/sherpa/templates/red-team-review.md +105 -0
  198. package/skills/sherpa/templates/red-team-scenario.md +43 -0
  199. package/skills/sherpa/templates/red-team-verification.md +31 -0
  200. package/skills/sherpa/templates/repo-analysis.md +204 -0
  201. package/skills/sherpa/templates/requirement-audit.md +15 -0
  202. package/skills/sherpa/templates/research-comparison.md +124 -0
  203. package/skills/sherpa/templates/research-plan.md +93 -0
  204. package/skills/sherpa/templates/research-report.md +92 -0
  205. package/skills/sherpa/templates/research-source.md +77 -0
  206. package/skills/sherpa/templates/score-optimization-plan.md +197 -0
  207. package/skills/sherpa/templates/security-finding.md +45 -0
  208. package/skills/sherpa/templates/security-review.md +64 -0
  209. package/skills/sherpa/templates/slide-claim.md +47 -0
  210. package/skills/sherpa/templates/slide-plan.md +127 -0
  211. package/skills/sherpa/templates/submission-artifact.md +15 -0
  212. package/skills/sherpa/templates/submission-checklist.md +24 -0
  213. package/skills/sherpa/templates/submission-field.md +14 -0
  214. package/skills/sherpa/templates/submission-link.md +14 -0
  215. package/skills/sherpa/templates/submission-plan.md +31 -0
  216. package/skills/sherpa/templates/submission-readiness.md +18 -0
  217. package/skills/sherpa/templates/submission-requirement.md +12 -0
  218. package/skills/sherpa/templates/submission-risk.md +14 -0
  219. package/skills/sherpa/templates/submission-snapshot.md +20 -0
  220. package/skills/sherpa/templates/submission-verification.md +12 -0
  221. package/skills/sherpa/templates/test-plan.md +59 -0
  222. package/skills/sherpa/templates/test-result.md +46 -0
  223. package/skills/sherpa/templates/timeline.md +11 -0
  224. package/skills/sherpa/templates/ux-finding.md +56 -0
  225. package/skills/sherpa/templates/ux-flow.md +46 -0
  226. package/skills/sherpa/templates/ux-review.md +113 -0
  227. package/skills/sherpa/templates/ux-verification.md +32 -0
  228. package/skills/sherpa/workflows/configuration.md +23 -0
  229. package/skills/sherpa/workflows/demo-preparation.md +399 -0
  230. package/skills/sherpa/workflows/final-audit.md +713 -0
  231. package/skills/sherpa/workflows/idea-evaluation.md +239 -0
  232. package/skills/sherpa/workflows/idea-intelligence.md +69 -0
  233. package/skills/sherpa/workflows/implementation.md +42 -0
  234. package/skills/sherpa/workflows/init.md +102 -0
  235. package/skills/sherpa/workflows/judge-simulation.md +408 -0
  236. package/skills/sherpa/workflows/lifecycle.md +51 -0
  237. package/skills/sherpa/workflows/next.md +96 -0
  238. package/skills/sherpa/workflows/postmortem.md +76 -0
  239. package/skills/sherpa/workflows/presentation.md +522 -0
  240. package/skills/sherpa/workflows/project-planning.md +327 -0
  241. package/skills/sherpa/workflows/red-team.md +373 -0
  242. package/skills/sherpa/workflows/research.md +142 -0
  243. package/skills/sherpa/workflows/score-optimization.md +276 -0
  244. package/skills/sherpa/workflows/status.md +107 -0
  245. package/skills/sherpa/workflows/submission.md +46 -0
  246. package/skills/sherpa/workflows/testing-security.md +44 -0
  247. package/skills/sherpa/workflows/ux-review.md +59 -0
@@ -0,0 +1,147 @@
1
+ # sherpa Research Command
2
+
3
+ Research candidate ideas against evidence.
4
+
5
+ ## Operation: RESEARCH
6
+
7
+ **Purpose**: Evaluate research questions against evidence in a deterministic pipeline.
8
+
9
+ **Prerequisite:** sherpa must be initialized (`.sherpa/project-state.md` exists).
10
+
11
+ ## Input
12
+
13
+ **Read from `.sherpa/project-state.md`:**
14
+ - Hackathon name, deadline, time remaining
15
+ - Judging criteria and weights (or UNKNOWN)
16
+ - Problem statement
17
+ - Target users (if known)
18
+
19
+ **Accept from user:**
20
+ - Research question (one sentence)
21
+ - Scope (what is in scope, what is out of scope)
22
+ - Depth (calibration, standard, deep)
23
+
24
+ **If no research question provided:**
25
+ - Report "No research question provided."
26
+ - Ask user to supply a research question before research can run.
27
+ - Stop.
28
+
29
+ ## Workflow Steps
30
+
31
+ ### Step 1: Research Plan
32
+
33
+ Define:
34
+ - What needs to be found
35
+ - Where to look (repository files, web search, documentation, team input)
36
+ - Evidence quality threshold
37
+ - Time budget
38
+
39
+ Record the plan in `.sherpa/evidence/research/<research-query>.md`.
40
+
41
+ ### Step 2: Retrieve
42
+
43
+ Retrieve candidate evidence from:
44
+ - Repository source code, config, tests, docs
45
+ - Web search (if available and permitted)
46
+ - Team input
47
+ - Existing sherpa artifacts
48
+
49
+ Save raw retrieval results to `.sherpa/evidence/research/`.
50
+
51
+ ### Step 3: Verify
52
+
53
+ For each candidate evidence item:
54
+ - Verify the source is real and accessible
55
+ - Check the claim against the source text
56
+ - Verify numbers, dates, entity names match exactly
57
+ - Check polarity/negation
58
+ - Check temporal consistency (dates, versions)
59
+
60
+ ### Step 4: Analyze
61
+
62
+ Classify each claim as FACT, INFERENCE, ASSUMPTION, or UNKNOWN.
63
+
64
+ ### Step 5: Synthesize
65
+
66
+ Combine evidence into a coherent answer:
67
+ - What is known (FACT)
68
+ - What is reasonable (INFERENCE)
69
+ - What is assumed (ASSUMPTION)
70
+ - What is unknown (UNKNOWN)
71
+
72
+ ### Step 6: Decide
73
+
74
+ Determine what the research means for the project decision:
75
+ - Does it support proceeding?
76
+ - Does it raise blockers?
77
+ - What assumptions must hold?
78
+ - What is the recommended next action?
79
+
80
+ ### Step 7: Persist
81
+
82
+ Save the research record to `.sherpa/evidence/research/<research-query>.md`.
83
+ Include all evidence, gates, decisions, and unknowns.
84
+
85
+ ## Evidence Model
86
+
87
+ | Field | Values |
88
+ |-------|--------|
89
+ | type | FACT | INFERENCE | ASSUMPTION | UNKNOWN |
90
+ | value | The claim |
91
+ | source | URL, file path, or "team input" |
92
+ | confidence | low | medium | high |
93
+
94
+ Rules:
95
+ - No claim may be tagged FACT unless directly verified from source
96
+ - No claim may be tagged INFERENCE without explicit reasoning
97
+ - ASSUMPTION must be explicitly marked as provisional
98
+ - UNKNOWN means no information available
99
+ - Never claim research was performed unless evidence was actually retrieved
100
+
101
+ ## Source Priority
102
+
103
+ Priority order for evidence:
104
+ 1. Official documentation / official repository / official specification
105
+ 2. Repository source code and tests (direct inspection)
106
+ 3. Team input (explicitly attributed)
107
+ 4. Secondary sources (blog posts, tutorials, secondary docs)
108
+ 5. General web search results (lowest confidence)
109
+
110
+ ## Source Consistency
111
+
112
+ When multiple sources conflict:
113
+ - Record each claim separately with its source
114
+ - Do not silently reconcile contradictions
115
+ - Flag contradictory claims explicitly
116
+ - Mark conflicting claims as UNKNOWN until resolved
117
+
118
+ ## Time Awareness
119
+
120
+ - If remaining time is UNKNOWN, record `TIME STRATEGY = UNKNOWN`
121
+ - Do not spend unlimited time on research
122
+ - If time is limited, prefer repository evidence over web search
123
+ - Record time spent on research if it exceeds a reasonable threshold
124
+
125
+ ## Human Authority
126
+
127
+ Research recommends; the human decides. Research does not:
128
+ - Auto-approve ideas
129
+ - Auto-approve architecture
130
+ - Auto-approve implementation
131
+ - Change the selected idea
132
+ - Silently redesign architecture
133
+ - Replace Phase 5/7/8 engines
134
+
135
+ Research findings route to the appropriate phase but do not replace it.
136
+
137
+ ## Output Contract
138
+
139
+ After each research invocation, return:
140
+ - Research question
141
+ - Evidence found (with sources and confidence)
142
+ - Contradictions found (if any)
143
+ - Unknowns
144
+ - Decision/recommendation
145
+ - Exactly one PRIMARY NEXT ACTION
146
+
147
+ All research artifacts live in `.sherpa/evidence/research/`.
@@ -0,0 +1,171 @@
1
+ """Deterministic command argument routing shared by sherpa adapters."""
2
+ from __future__ import annotations
3
+
4
+ from dataclasses import dataclass
5
+ import json
6
+ from pathlib import Path
7
+ import re
8
+
9
+
10
+ @dataclass(frozen=True)
11
+ class Route:
12
+ operation: str
13
+ workflow: str
14
+
15
+
16
+ ROUTES = {
17
+ "status": Route("STATUS", "workflows/status.md"),
18
+ "next": Route("NEXT", "workflows/next.md"),
19
+ "help": Route("HELP", "SKILL.md#help"),
20
+ "init": Route("INIT", "workflows/init.md"),
21
+ "phase": Route("PHASE", "SKILL.md#phase"),
22
+ "config": Route("CONFIG", "workflows/configuration.md"),
23
+ "config check": Route("CONFIG CHECK", "workflows/configuration.md"),
24
+ "suggest": Route("SUGGEST", "workflows/idea-intelligence.md"),
25
+ }
26
+
27
+ MANIFEST_PATH = Path(__file__).resolve().parents[2] / "commands" / "manifest.json"
28
+ _MANIFEST = json.loads(MANIFEST_PATH.read_text(encoding="utf-8"))
29
+ _ROOT = MANIFEST_PATH.parent.parent
30
+
31
+
32
+ def validate_manifest(manifest: dict, root: Path = _ROOT, check_adapter_files: bool = True) -> list[str]:
33
+ """Validate command identity, route targets, adapter coverage and collisions."""
34
+ errors: list[str] = []
35
+ if not isinstance(manifest, dict) or manifest.get("schema_version") != 1:
36
+ return ["unsupported or malformed manifest"]
37
+ if manifest.get("master_command") != "/sherpa":
38
+ errors.append("master command must remain /sherpa")
39
+ if not isinstance(manifest.get("implemented"), list) or not isinstance(manifest.get("planned"), list):
40
+ return errors + ["implemented and planned must be lists"]
41
+ required_adapters = {"claude", "opencode", "kilo"}
42
+ group_values = manifest.get("groups")
43
+ groups = set(group_values) if isinstance(group_values, list) else set()
44
+ if not groups or len(groups) != len(group_values):
45
+ errors.append("groups must be a non-empty unique list")
46
+ commands: set[str] = set()
47
+ router_keys: set[str] = set()
48
+ aliases: set[str] = set()
49
+ for index, item in enumerate(manifest["implemented"]):
50
+ label = f"implemented[{index}]"
51
+ if not isinstance(item, dict):
52
+ errors.append(f"{label} must be an object")
53
+ continue
54
+ command = item.get("command")
55
+ if not isinstance(command, str) or not re.fullmatch(r"sherpa-[a-z0-9]+(?:-[a-z0-9]+)*", command):
56
+ errors.append(f"{label} has an invalid canonical command name")
57
+ elif command in commands:
58
+ errors.append(f"duplicate canonical command: {command}")
59
+ else:
60
+ commands.add(command)
61
+ if item.get("group") not in groups:
62
+ errors.append(f"{label} has an invalid group")
63
+ if item.get("status") != "implemented":
64
+ errors.append(f"{label} must have implemented status")
65
+ operation, key, workflow = item.get("operation"), item.get("router_key"), item.get("workflow")
66
+ if not all(isinstance(value, str) and value for value in (operation, key, workflow)):
67
+ errors.append(f"{label} is missing operation, router_key, or workflow")
68
+ elif key in router_keys:
69
+ errors.append(f"duplicate router key: {key}")
70
+ else:
71
+ router_keys.add(key)
72
+ if isinstance(workflow, str) and workflow:
73
+ target, _, anchor = workflow.partition("#")
74
+ resolved = (root / target).resolve()
75
+ if root.resolve() not in resolved.parents and resolved != root.resolve():
76
+ errors.append(f"workflow escapes repository root: {workflow}")
77
+ elif not resolved.is_file():
78
+ errors.append(f"missing workflow: {workflow}")
79
+ elif anchor and not re.search(rf"^##\s+{re.escape(anchor)}\s*$", resolved.read_text(encoding="utf-8-sig"), re.M | re.I):
80
+ errors.append(f"missing workflow anchor: {workflow}")
81
+ adapter_list = item.get("adapters")
82
+ if not isinstance(adapter_list, list) or set(adapter_list) != required_adapters:
83
+ errors.append(f"{label} must register all three host adapters")
84
+ elif check_adapter_files:
85
+ paths = {
86
+ "claude": root / ".claude" / "skills" / str(command) / "SKILL.md",
87
+ "opencode": root / ".opencode" / "commands" / f"{command}.md",
88
+ "kilo": root / ".kilo" / "commands" / f"{command}.md",
89
+ }
90
+ for host, path in paths.items():
91
+ if not path.is_file():
92
+ errors.append(f"missing {host} adapter: {command}")
93
+ item_aliases = item.get("legacy_aliases")
94
+ if not isinstance(item_aliases, list):
95
+ errors.append(f"{label} legacy_aliases must be a list")
96
+ else:
97
+ for alias in item_aliases:
98
+ if not isinstance(alias, str) or not alias.strip():
99
+ errors.append(f"{label} has an invalid legacy alias")
100
+ elif alias.casefold() in aliases:
101
+ errors.append(f"duplicate command alias: {alias}")
102
+ elif command and alias.casefold() == f"/{command}".casefold():
103
+ errors.append(f"native command collides with legacy alias: {alias}")
104
+ else:
105
+ aliases.add(alias.casefold())
106
+ planned_names: set[str] = set()
107
+ for index, item in enumerate(manifest["planned"]):
108
+ if not isinstance(item, dict):
109
+ errors.append(f"planned[{index}] must be an object")
110
+ continue
111
+ command = item.get("command")
112
+ if not isinstance(command, str) or not re.fullmatch(r"sherpa-[a-z0-9]+(?:-[a-z0-9]+)*", command):
113
+ errors.append(f"planned[{index}] has an invalid canonical command name")
114
+ elif command in planned_names or command in commands:
115
+ errors.append(f"duplicate or colliding planned command: {command}")
116
+ else:
117
+ planned_names.add(command)
118
+ if item.get("status") != "planned":
119
+ errors.append(f"planned[{index}] must remain planned")
120
+ statuses = manifest.get("host_runtime_status", {})
121
+ if not isinstance(statuses, dict) or set(statuses) != required_adapters:
122
+ errors.append("host runtime status must cover Claude Code, OpenCode, and Kilo")
123
+ else:
124
+ for host, record in statuses.items():
125
+ if not isinstance(record, dict) or record.get("status") not in {"PASS", "FAIL", "UNKNOWN", "NOT VERIFIED"}:
126
+ errors.append(f"invalid runtime status for {host}")
127
+ return errors
128
+
129
+
130
+ # Host adapter files live beside the framework in the source repository, but
131
+ # in host-specific global directories after installation. Validate their names
132
+ # in every bundle; repository regression checks verify the physical files.
133
+ _MANIFEST_ERRORS = validate_manifest(_MANIFEST, check_adapter_files=False)
134
+ if _MANIFEST_ERRORS:
135
+ raise ValueError("Invalid sherpa command manifest: " + "; ".join(_MANIFEST_ERRORS))
136
+
137
+ _NATIVE_ROUTES = {
138
+ item["command"]: Route(item["operation"], item["workflow"])
139
+ for item in _MANIFEST["implemented"]
140
+ }
141
+ _LEGACY_ROUTES = {
142
+ item["router_key"]: Route(item["operation"], item["workflow"])
143
+ for item in _MANIFEST["implemented"]
144
+ }
145
+
146
+
147
+ def resolve(arguments: str) -> Route | None:
148
+ """Resolve explicit command arguments or a full root-command invocation.
149
+
150
+ None means no supported explicit operation. Empty arguments are left to the
151
+ canonical SKILL.md intent router; unknown explicit commands stay unavailable.
152
+ """
153
+ normalized = " ".join(arguments.strip().lower().split())
154
+ for command in ("/sherpa", "\\sherpa", "sherpa"):
155
+ if normalized == command:
156
+ normalized = ""
157
+ break
158
+ if normalized.startswith(command + " "):
159
+ normalized = normalized[len(command):].strip()
160
+ break
161
+ normalized = normalized.lstrip("/")
162
+ native_name = normalized.partition(" ")[0]
163
+ route = _NATIVE_ROUTES.get(native_name)
164
+ if route:
165
+ return route
166
+ route = _LEGACY_ROUTES.get(normalized) or ROUTES.get(normalized)
167
+ if route:
168
+ return route
169
+ if normalized.startswith("suggest "):
170
+ return Route("SUGGEST", "workflows/idea-intelligence.md")
171
+ return None