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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cadence-skill-installer",
3
- "version": "0.2.31",
3
+ "version": "0.2.33",
4
4
  "description": "Install the Cadence skill into supported AI tool skill directories.",
5
5
  "repository": "https://github.com/snowdamiz/cadence",
6
6
  "private": false,
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 `researcher`), skip prerequisite gate and follow the active route instead.
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`.
@@ -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 researcher transitions.
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": 5,
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
  }
@@ -88,6 +88,8 @@ def parse_status_paths(status_output: str) -> list[str]:
88
88
  line = raw_line.rstrip("\n")
89
89
  if len(line) < 4:
90
90
  continue
91
+ if line.startswith("!! "):
92
+ continue
91
93
 
92
94
  path_part = line[3:]
93
95
  if " -> " in path_part:
@@ -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 / pathspec).exists():
172
+ if path_is_tracked(repo_root, pathspec):
159
173
  return True
160
174
 
161
- result = run_git(["ls-files", "--error-unmatch", "--", pathspec], repo_root)
162
- return result.returncode == 0
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