sherpa-skill 2.0.6 → 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.
- package/.agents/plugins/marketplace.json +11 -0
- package/.agents/skills/sherpa/SKILL.md +161 -0
- package/.agents/skills/sherpa/commands/README.md +43 -0
- package/.agents/skills/sherpa/commands/manifest.json +589 -0
- package/.agents/skills/sherpa/commands/sherpa-research.md +147 -0
- package/.agents/skills/sherpa/core/commands/router.py +171 -0
- package/.agents/skills/sherpa/core/configuration/manager.py +504 -0
- package/.agents/skills/sherpa/core/ideas/engine.py +564 -0
- package/.agents/skills/sherpa/docs/commands/README.md +96 -0
- package/.agents/skills/sherpa/docs/configuration/runtime-verification.md +64 -0
- package/.agents/skills/sherpa/rules/demo-preparation-rules.md +543 -0
- package/.agents/skills/sherpa/rules/engineering-rules.md +221 -0
- package/.agents/skills/sherpa/rules/final-audit-rules.md +824 -0
- package/.agents/skills/sherpa/rules/implementation-rules.md +127 -0
- package/.agents/skills/sherpa/rules/judge-rules.md +443 -0
- package/.agents/skills/sherpa/rules/mentor-rules.md +109 -0
- package/.agents/skills/sherpa/rules/postmortem-rules.md +69 -0
- package/.agents/skills/sherpa/rules/presentation-rules.md +783 -0
- package/.agents/skills/sherpa/rules/red-team-rules.md +185 -0
- package/.agents/skills/sherpa/rules/research-rules.md +184 -0
- package/.agents/skills/sherpa/rules/score-optimization-rules.md +355 -0
- package/.agents/skills/sherpa/rules/scoring-rules.md +216 -0
- package/.agents/skills/sherpa/rules/submission-rules.md +41 -0
- package/.agents/skills/sherpa/rules/testing-security-rules.md +87 -0
- package/.agents/skills/sherpa/rules/ux-rules.md +89 -0
- package/.agents/skills/sherpa/src/config_manager.py +474 -0
- package/.agents/skills/sherpa/src/verification.py +458 -0
- package/.agents/skills/sherpa/templates/audit-finding.md +20 -0
- package/.agents/skills/sherpa/templates/claim-audit.md +15 -0
- package/.agents/skills/sherpa/templates/configuration/hackathon.json +21 -0
- package/.agents/skills/sherpa/templates/configuration/integrations.env.example +3 -0
- package/.agents/skills/sherpa/templates/configuration/project.env.example +12 -0
- package/.agents/skills/sherpa/templates/configuration/providers.env.example +4 -0
- package/.agents/skills/sherpa/templates/configuration/settings.json +22 -0
- package/.agents/skills/sherpa/templates/consistency-audit.md +17 -0
- package/.agents/skills/sherpa/templates/decision-log.md +18 -0
- package/.agents/skills/sherpa/templates/demo-checkpoint.md +42 -0
- package/.agents/skills/sherpa/templates/demo-evidence.md +32 -0
- package/.agents/skills/sherpa/templates/demo-finding.md +112 -0
- package/.agents/skills/sherpa/templates/demo-flow.md +52 -0
- package/.agents/skills/sherpa/templates/demo-plan.md +265 -0
- package/.agents/skills/sherpa/templates/demo-verification.md +57 -0
- package/.agents/skills/sherpa/templates/final-audit.md +387 -0
- package/.agents/skills/sherpa/templates/final-risk.md +17 -0
- package/.agents/skills/sherpa/templates/final-verification.md +57 -0
- package/.agents/skills/sherpa/templates/gap-analysis.md +113 -0
- package/.agents/skills/sherpa/templates/idea-comparison.md +129 -0
- package/.agents/skills/sherpa/templates/idea-evaluation.md +251 -0
- package/.agents/skills/sherpa/templates/implementation-plan.md +96 -0
- package/.agents/skills/sherpa/templates/implementation-task.md +57 -0
- package/.agents/skills/sherpa/templates/improvement-candidate.md +135 -0
- package/.agents/skills/sherpa/templates/improvement.md +18 -0
- package/.agents/skills/sherpa/templates/incident.md +20 -0
- package/.agents/skills/sherpa/templates/judge-criterion.md +41 -0
- package/.agents/skills/sherpa/templates/judge-question.md +41 -0
- package/.agents/skills/sherpa/templates/judge-session.md +125 -0
- package/.agents/skills/sherpa/templates/judge-simulation.md +264 -0
- package/.agents/skills/sherpa/templates/lesson.md +14 -0
- package/.agents/skills/sherpa/templates/postmortem.md +87 -0
- package/.agents/skills/sherpa/templates/presentation-evidence.md +33 -0
- package/.agents/skills/sherpa/templates/presentation-plan.md +349 -0
- package/.agents/skills/sherpa/templates/presentation-qna.md +29 -0
- package/.agents/skills/sherpa/templates/presentation-risk.md +42 -0
- package/.agents/skills/sherpa/templates/presentation-verification.md +57 -0
- package/.agents/skills/sherpa/templates/project-plan.md +242 -0
- package/.agents/skills/sherpa/templates/project-state.md +84 -0
- package/.agents/skills/sherpa/templates/red-team-finding.md +73 -0
- package/.agents/skills/sherpa/templates/red-team-review.md +105 -0
- package/.agents/skills/sherpa/templates/red-team-scenario.md +43 -0
- package/.agents/skills/sherpa/templates/red-team-verification.md +31 -0
- package/.agents/skills/sherpa/templates/repo-analysis.md +204 -0
- package/.agents/skills/sherpa/templates/requirement-audit.md +15 -0
- package/.agents/skills/sherpa/templates/research-comparison.md +124 -0
- package/.agents/skills/sherpa/templates/research-plan.md +93 -0
- package/.agents/skills/sherpa/templates/research-report.md +92 -0
- package/.agents/skills/sherpa/templates/research-source.md +77 -0
- package/.agents/skills/sherpa/templates/score-optimization-plan.md +197 -0
- package/.agents/skills/sherpa/templates/security-finding.md +45 -0
- package/.agents/skills/sherpa/templates/security-review.md +64 -0
- package/.agents/skills/sherpa/templates/slide-claim.md +47 -0
- package/.agents/skills/sherpa/templates/slide-plan.md +127 -0
- package/.agents/skills/sherpa/templates/submission-artifact.md +15 -0
- package/.agents/skills/sherpa/templates/submission-checklist.md +24 -0
- package/.agents/skills/sherpa/templates/submission-field.md +14 -0
- package/.agents/skills/sherpa/templates/submission-link.md +14 -0
- package/.agents/skills/sherpa/templates/submission-plan.md +31 -0
- package/.agents/skills/sherpa/templates/submission-readiness.md +18 -0
- package/.agents/skills/sherpa/templates/submission-requirement.md +12 -0
- package/.agents/skills/sherpa/templates/submission-risk.md +14 -0
- package/.agents/skills/sherpa/templates/submission-snapshot.md +20 -0
- package/.agents/skills/sherpa/templates/submission-verification.md +12 -0
- package/.agents/skills/sherpa/templates/test-plan.md +59 -0
- package/.agents/skills/sherpa/templates/test-result.md +46 -0
- package/.agents/skills/sherpa/templates/timeline.md +11 -0
- package/.agents/skills/sherpa/templates/ux-finding.md +56 -0
- package/.agents/skills/sherpa/templates/ux-flow.md +46 -0
- package/.agents/skills/sherpa/templates/ux-review.md +113 -0
- package/.agents/skills/sherpa/templates/ux-verification.md +32 -0
- package/.agents/skills/sherpa/workflows/configuration.md +23 -0
- package/.agents/skills/sherpa/workflows/demo-preparation.md +399 -0
- package/.agents/skills/sherpa/workflows/final-audit.md +713 -0
- package/.agents/skills/sherpa/workflows/idea-evaluation.md +239 -0
- package/.agents/skills/sherpa/workflows/idea-intelligence.md +69 -0
- package/.agents/skills/sherpa/workflows/implementation.md +42 -0
- package/.agents/skills/sherpa/workflows/init.md +102 -0
- package/.agents/skills/sherpa/workflows/judge-simulation.md +408 -0
- package/.agents/skills/sherpa/workflows/lifecycle.md +51 -0
- package/.agents/skills/sherpa/workflows/next.md +96 -0
- package/.agents/skills/sherpa/workflows/postmortem.md +76 -0
- package/.agents/skills/sherpa/workflows/presentation.md +522 -0
- package/.agents/skills/sherpa/workflows/project-planning.md +327 -0
- package/.agents/skills/sherpa/workflows/red-team.md +373 -0
- package/.agents/skills/sherpa/workflows/research.md +142 -0
- package/.agents/skills/sherpa/workflows/score-optimization.md +276 -0
- package/.agents/skills/sherpa/workflows/status.md +107 -0
- package/.agents/skills/sherpa/workflows/submission.md +46 -0
- package/.agents/skills/sherpa/workflows/testing-security.md +44 -0
- package/.agents/skills/sherpa/workflows/ux-review.md +59 -0
- package/.claude-plugin/marketplace.json +21 -0
- package/.claude-plugin/plugin.json +13 -0
- package/.codex-plugin/plugin.json +13 -0
- package/GEMINI.md +3 -0
- package/README.md +11 -7
- package/SKILL.md +161 -0
- package/distribution/cli/sherpa +1 -1
- package/gemini-extension.json +7 -0
- package/package.json +31 -3
- package/plugin.json +20 -0
- package/qwen-extension.json +6 -0
- package/skills/sherpa/SKILL.md +161 -0
- package/skills/sherpa/commands/README.md +43 -0
- package/skills/sherpa/commands/manifest.json +589 -0
- package/skills/sherpa/commands/sherpa-research.md +147 -0
- package/skills/sherpa/core/commands/router.py +171 -0
- package/skills/sherpa/core/configuration/manager.py +504 -0
- package/skills/sherpa/core/ideas/engine.py +564 -0
- package/skills/sherpa/docs/commands/README.md +96 -0
- package/skills/sherpa/docs/configuration/runtime-verification.md +64 -0
- package/skills/sherpa/rules/demo-preparation-rules.md +543 -0
- package/skills/sherpa/rules/engineering-rules.md +221 -0
- package/skills/sherpa/rules/final-audit-rules.md +824 -0
- package/skills/sherpa/rules/implementation-rules.md +127 -0
- package/skills/sherpa/rules/judge-rules.md +443 -0
- package/skills/sherpa/rules/mentor-rules.md +109 -0
- package/skills/sherpa/rules/postmortem-rules.md +69 -0
- package/skills/sherpa/rules/presentation-rules.md +783 -0
- package/skills/sherpa/rules/red-team-rules.md +185 -0
- package/skills/sherpa/rules/research-rules.md +184 -0
- package/skills/sherpa/rules/score-optimization-rules.md +355 -0
- package/skills/sherpa/rules/scoring-rules.md +216 -0
- package/skills/sherpa/rules/submission-rules.md +41 -0
- package/skills/sherpa/rules/testing-security-rules.md +87 -0
- package/skills/sherpa/rules/ux-rules.md +89 -0
- package/skills/sherpa/src/config_manager.py +474 -0
- package/skills/sherpa/src/verification.py +458 -0
- package/skills/sherpa/templates/audit-finding.md +20 -0
- package/skills/sherpa/templates/claim-audit.md +15 -0
- package/skills/sherpa/templates/configuration/hackathon.json +21 -0
- package/skills/sherpa/templates/configuration/integrations.env.example +3 -0
- package/skills/sherpa/templates/configuration/project.env.example +12 -0
- package/skills/sherpa/templates/configuration/providers.env.example +4 -0
- package/skills/sherpa/templates/configuration/settings.json +22 -0
- package/skills/sherpa/templates/consistency-audit.md +17 -0
- package/skills/sherpa/templates/decision-log.md +18 -0
- package/skills/sherpa/templates/demo-checkpoint.md +42 -0
- package/skills/sherpa/templates/demo-evidence.md +32 -0
- package/skills/sherpa/templates/demo-finding.md +112 -0
- package/skills/sherpa/templates/demo-flow.md +52 -0
- package/skills/sherpa/templates/demo-plan.md +265 -0
- package/skills/sherpa/templates/demo-verification.md +57 -0
- package/skills/sherpa/templates/final-audit.md +387 -0
- package/skills/sherpa/templates/final-risk.md +17 -0
- package/skills/sherpa/templates/final-verification.md +57 -0
- package/skills/sherpa/templates/gap-analysis.md +113 -0
- package/skills/sherpa/templates/idea-comparison.md +129 -0
- package/skills/sherpa/templates/idea-evaluation.md +251 -0
- package/skills/sherpa/templates/implementation-plan.md +96 -0
- package/skills/sherpa/templates/implementation-task.md +57 -0
- package/skills/sherpa/templates/improvement-candidate.md +135 -0
- package/skills/sherpa/templates/improvement.md +18 -0
- package/skills/sherpa/templates/incident.md +20 -0
- package/skills/sherpa/templates/judge-criterion.md +41 -0
- package/skills/sherpa/templates/judge-question.md +41 -0
- package/skills/sherpa/templates/judge-session.md +125 -0
- package/skills/sherpa/templates/judge-simulation.md +264 -0
- package/skills/sherpa/templates/lesson.md +14 -0
- package/skills/sherpa/templates/postmortem.md +87 -0
- package/skills/sherpa/templates/presentation-evidence.md +33 -0
- package/skills/sherpa/templates/presentation-plan.md +349 -0
- package/skills/sherpa/templates/presentation-qna.md +29 -0
- package/skills/sherpa/templates/presentation-risk.md +42 -0
- package/skills/sherpa/templates/presentation-verification.md +57 -0
- package/skills/sherpa/templates/project-plan.md +242 -0
- package/skills/sherpa/templates/project-state.md +84 -0
- package/skills/sherpa/templates/red-team-finding.md +73 -0
- package/skills/sherpa/templates/red-team-review.md +105 -0
- package/skills/sherpa/templates/red-team-scenario.md +43 -0
- package/skills/sherpa/templates/red-team-verification.md +31 -0
- package/skills/sherpa/templates/repo-analysis.md +204 -0
- package/skills/sherpa/templates/requirement-audit.md +15 -0
- package/skills/sherpa/templates/research-comparison.md +124 -0
- package/skills/sherpa/templates/research-plan.md +93 -0
- package/skills/sherpa/templates/research-report.md +92 -0
- package/skills/sherpa/templates/research-source.md +77 -0
- package/skills/sherpa/templates/score-optimization-plan.md +197 -0
- package/skills/sherpa/templates/security-finding.md +45 -0
- package/skills/sherpa/templates/security-review.md +64 -0
- package/skills/sherpa/templates/slide-claim.md +47 -0
- package/skills/sherpa/templates/slide-plan.md +127 -0
- package/skills/sherpa/templates/submission-artifact.md +15 -0
- package/skills/sherpa/templates/submission-checklist.md +24 -0
- package/skills/sherpa/templates/submission-field.md +14 -0
- package/skills/sherpa/templates/submission-link.md +14 -0
- package/skills/sherpa/templates/submission-plan.md +31 -0
- package/skills/sherpa/templates/submission-readiness.md +18 -0
- package/skills/sherpa/templates/submission-requirement.md +12 -0
- package/skills/sherpa/templates/submission-risk.md +14 -0
- package/skills/sherpa/templates/submission-snapshot.md +20 -0
- package/skills/sherpa/templates/submission-verification.md +12 -0
- package/skills/sherpa/templates/test-plan.md +59 -0
- package/skills/sherpa/templates/test-result.md +46 -0
- package/skills/sherpa/templates/timeline.md +11 -0
- package/skills/sherpa/templates/ux-finding.md +56 -0
- package/skills/sherpa/templates/ux-flow.md +46 -0
- package/skills/sherpa/templates/ux-review.md +113 -0
- package/skills/sherpa/templates/ux-verification.md +32 -0
- package/skills/sherpa/workflows/configuration.md +23 -0
- package/skills/sherpa/workflows/demo-preparation.md +399 -0
- package/skills/sherpa/workflows/final-audit.md +713 -0
- package/skills/sherpa/workflows/idea-evaluation.md +239 -0
- package/skills/sherpa/workflows/idea-intelligence.md +69 -0
- package/skills/sherpa/workflows/implementation.md +42 -0
- package/skills/sherpa/workflows/init.md +102 -0
- package/skills/sherpa/workflows/judge-simulation.md +408 -0
- package/skills/sherpa/workflows/lifecycle.md +51 -0
- package/skills/sherpa/workflows/next.md +96 -0
- package/skills/sherpa/workflows/postmortem.md +76 -0
- package/skills/sherpa/workflows/presentation.md +522 -0
- package/skills/sherpa/workflows/project-planning.md +327 -0
- package/skills/sherpa/workflows/red-team.md +373 -0
- package/skills/sherpa/workflows/research.md +142 -0
- package/skills/sherpa/workflows/score-optimization.md +276 -0
- package/skills/sherpa/workflows/status.md +107 -0
- package/skills/sherpa/workflows/submission.md +46 -0
- package/skills/sherpa/workflows/testing-security.md +44 -0
- 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
|