cadence-skill-installer 0.2.31 → 0.2.33
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/package.json +1 -1
- package/skill/SKILL.md +7 -1
- package/skill/agents/openai.yaml +1 -1
- package/skill/assets/cadence.json +22 -1
- package/skill/config/commit-conventions.json +6 -0
- package/skill/scripts/finalize-skill-checkpoint.py +2 -0
- package/skill/scripts/git-checkpoint.py +20 -4
- package/skill/scripts/run-planner.py +573 -0
- package/skill/scripts/scaffold-project.sh +22 -1
- package/skill/scripts/workflow_state.py +138 -2
- package/skill/skills/planner/SKILL.md +29 -0
- package/skill/skills/planner/agents/openai.yaml +15 -0
- package/skill/skills/researcher/SKILL.md +4 -1
- package/skill/skills/researcher/agents/openai.yaml +2 -0
- package/skill/tests/test_finalize_checkpoint_batches.py +11 -0
- package/skill/tests/test_git_checkpoint_stage_paths.py +73 -0
- package/skill/tests/test_run_planner.py +174 -0
- package/skill/tests/test_workflow_state.py +51 -0
package/package.json
CHANGED
package/skill/SKILL.md
CHANGED
|
@@ -66,7 +66,7 @@ description: Structured project operating system for end-to-end greenfield or br
|
|
|
66
66
|
|
|
67
67
|
## Prerequisite Gate (Conditional)
|
|
68
68
|
1. Invoke `skills/prerequisite-gate/SKILL.md` only when `route.skill_name` is `prerequisite-gate`.
|
|
69
|
-
2. If `route.skill_name` is not `prerequisite-gate` (for example `brownfield-intake`, `brownfield-documenter`, `ideator`, or `
|
|
69
|
+
2. If `route.skill_name` is not `prerequisite-gate` (for example `brownfield-intake`, `brownfield-documenter`, `ideator`, `researcher`, or `planner`), skip prerequisite gate and follow the active route instead.
|
|
70
70
|
|
|
71
71
|
## Project Mode Intake Gate (Conditional)
|
|
72
72
|
1. Invoke `skills/brownfield-intake/SKILL.md` only when `route.skill_name` is `brownfield-intake`.
|
|
@@ -107,6 +107,12 @@ description: Structured project operating system for end-to-end greenfield or br
|
|
|
107
107
|
2. Enforce one research pass per conversation so context stays bounded.
|
|
108
108
|
3. When the researcher flow reports additional passes remain (`handoff_required=true`), end with this exact line: `Start a new chat and say "continue research".`
|
|
109
109
|
4. Continue routing to researcher on subsequent chats until workflow reports the research task complete.
|
|
110
|
+
5. For greenfield projects, when research completes and route advances to `planner`, invoke `skills/planner/SKILL.md` in the next routed conversation.
|
|
111
|
+
|
|
112
|
+
## Planner Flow
|
|
113
|
+
1. If the workflow route is `planner`, invoke `skills/planner/SKILL.md`.
|
|
114
|
+
2. Planner is greenfield-only and should not run for brownfield routes.
|
|
115
|
+
3. Keep planner output at milestone/phase level in `.cadence/cadence.json` and defer waves/tasks decomposition to a later planning subskill.
|
|
110
116
|
|
|
111
117
|
## Ideation Update Flow
|
|
112
118
|
1. If the user wants to modify or discuss existing ideation, invoke `skills/ideation-updater/SKILL.md`.
|
package/skill/agents/openai.yaml
CHANGED
|
@@ -14,4 +14,4 @@ interface:
|
|
|
14
14
|
For each successful subskill conversation, run scripts/finalize-skill-checkpoint.py from PROJECT_ROOT with
|
|
15
15
|
that subskill's --scope/--checkpoint and --paths ., allow status=no_changes, and treat checkpoint/push
|
|
16
16
|
failures as blocking.
|
|
17
|
-
Use the exact handoff lines in SKILL.md for ideator, brownfield-documenter, and
|
|
17
|
+
Use the exact handoff lines in SKILL.md for ideator, brownfield-documenter, researcher, and planner transitions.
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"brownfield-documentation-completed": false
|
|
11
11
|
},
|
|
12
12
|
"workflow": {
|
|
13
|
-
"schema_version":
|
|
13
|
+
"schema_version": 6,
|
|
14
14
|
"plan": [
|
|
15
15
|
{
|
|
16
16
|
"id": "milestone-foundation",
|
|
@@ -86,6 +86,16 @@
|
|
|
86
86
|
"skill_path": "skills/researcher/SKILL.md",
|
|
87
87
|
"reason": "Ideation research agenda has not been completed yet."
|
|
88
88
|
}
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
"id": "task-roadmap-planning",
|
|
92
|
+
"kind": "task",
|
|
93
|
+
"title": "Plan project roadmap",
|
|
94
|
+
"route": {
|
|
95
|
+
"skill_name": "planner",
|
|
96
|
+
"skill_path": "skills/planner/SKILL.md",
|
|
97
|
+
"reason": "Project roadmap planning has not been completed yet."
|
|
98
|
+
}
|
|
89
99
|
}
|
|
90
100
|
]
|
|
91
101
|
}
|
|
@@ -135,5 +145,16 @@
|
|
|
135
145
|
"handoff_required": false,
|
|
136
146
|
"handoff_message": "Start a new chat and say \"continue research\"."
|
|
137
147
|
}
|
|
148
|
+
},
|
|
149
|
+
"planning": {
|
|
150
|
+
"version": 1,
|
|
151
|
+
"status": "pending",
|
|
152
|
+
"detail_level": "",
|
|
153
|
+
"decomposition_pending": true,
|
|
154
|
+
"created_at": "",
|
|
155
|
+
"updated_at": "",
|
|
156
|
+
"summary": "",
|
|
157
|
+
"assumptions": [],
|
|
158
|
+
"milestones": []
|
|
138
159
|
}
|
|
139
160
|
}
|
|
@@ -133,6 +133,12 @@
|
|
|
133
133
|
"checkpoints": {
|
|
134
134
|
"research-pass-recorded": "persist one ideation research pass"
|
|
135
135
|
}
|
|
136
|
+
},
|
|
137
|
+
"planner": {
|
|
138
|
+
"description": "Greenfield roadmap planning persistence",
|
|
139
|
+
"checkpoints": {
|
|
140
|
+
"plan-created": "persist milestone and phase roadmap plan"
|
|
141
|
+
}
|
|
136
142
|
}
|
|
137
143
|
}
|
|
138
144
|
}
|
|
@@ -154,12 +154,28 @@ def ensure_no_pre_staged_changes(repo_root: Path) -> None:
|
|
|
154
154
|
raise CheckpointError("STAGED_CHANGES_PRESENT")
|
|
155
155
|
|
|
156
156
|
|
|
157
|
+
def path_is_tracked(repo_root: Path, pathspec: str) -> bool:
|
|
158
|
+
result = run_git(["ls-files", "--error-unmatch", "--", pathspec], repo_root)
|
|
159
|
+
return result.returncode == 0
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
def path_is_ignored(repo_root: Path, pathspec: str) -> bool:
|
|
163
|
+
result = run_git(["check-ignore", "--quiet", "--", pathspec], repo_root)
|
|
164
|
+
if result.returncode == 0:
|
|
165
|
+
return True
|
|
166
|
+
if result.returncode == 1:
|
|
167
|
+
return False
|
|
168
|
+
raise CheckpointError(format_git_error("GIT_CHECK_IGNORE_FAILED", result))
|
|
169
|
+
|
|
170
|
+
|
|
157
171
|
def path_exists_or_tracked(repo_root: Path, pathspec: str) -> bool:
|
|
158
|
-
if (repo_root
|
|
172
|
+
if path_is_tracked(repo_root, pathspec):
|
|
159
173
|
return True
|
|
160
174
|
|
|
161
|
-
|
|
162
|
-
|
|
175
|
+
if not (repo_root / pathspec).exists():
|
|
176
|
+
return False
|
|
177
|
+
|
|
178
|
+
return not path_is_ignored(repo_root, pathspec)
|
|
163
179
|
|
|
164
180
|
|
|
165
181
|
def stage_paths(repo_root: Path, paths: list[str]) -> None:
|
|
@@ -167,7 +183,7 @@ def stage_paths(repo_root: Path, paths: list[str]) -> None:
|
|
|
167
183
|
if not valid_paths:
|
|
168
184
|
return
|
|
169
185
|
|
|
170
|
-
result = run_git(["add", "--", *valid_paths], repo_root)
|
|
186
|
+
result = run_git(["add", "-f", "--", *valid_paths], repo_root)
|
|
171
187
|
if result.returncode != 0:
|
|
172
188
|
raise CheckpointError(format_git_error("GIT_ADD_FAILED", result))
|
|
173
189
|
|