macca-method 2.0.0 → 2.1.2

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 (64) hide show
  1. package/.agents/macca-lock.json +1 -1
  2. package/.agents/skills/_shared/references/brainstorm-session.md +5 -5
  3. package/.agents/skills/_shared/references/fix-mode.md +18 -3
  4. package/.agents/skills/_shared/references/human-loop.md +1 -1
  5. package/.agents/skills/_shared/references/invocation-policy.md +20 -20
  6. package/.agents/skills/_shared/references/language-config.md +7 -5
  7. package/.agents/skills/_shared/references/output-ownership.md +11 -11
  8. package/.agents/skills/_shared/references/scope-rules.md +1 -1
  9. package/.agents/skills/_shared/references/skill-catalog.md +20 -20
  10. package/.agents/skills/_shared/scripts/validate-skills.py +37 -15
  11. package/.agents/skills/add-feature/SKILL.md +11 -3
  12. package/.agents/skills/antislop-copywriting/SKILL.md +372 -0
  13. package/.agents/skills/brainstorm-api/SKILL.md +33 -19
  14. package/.agents/skills/brainstorm-api/assets/api.template.md +35 -15
  15. package/.agents/skills/brainstorm-architecture/SKILL.md +40 -18
  16. package/.agents/skills/brainstorm-architecture/assets/architecture.template.md +44 -25
  17. package/.agents/skills/brainstorm-prd/SKILL.md +52 -20
  18. package/.agents/skills/brainstorm-prd/assets/PRD.template.md +47 -23
  19. package/.agents/skills/brainstorm-rules/SKILL.md +39 -22
  20. package/.agents/skills/brainstorm-rules/assets/rules.template.md +32 -18
  21. package/.agents/skills/brainstorm-schema/SKILL.md +23 -11
  22. package/.agents/skills/brainstorm-schema/assets/schema.template.md +25 -10
  23. package/.agents/skills/brainstorm-styleguide/SKILL.md +40 -22
  24. package/.agents/skills/brainstorm-styleguide/assets/StyleGuide.template.md +78 -60
  25. package/.agents/skills/brainstorm-task/SKILL.md +29 -14
  26. package/.agents/skills/brainstorm-task/assets/Task.template.md +29 -18
  27. package/.agents/skills/bug-fix/SKILL.md +39 -8
  28. package/.agents/skills/code-review/SKILL.md +9 -7
  29. package/.agents/skills/code-review/references/review-checklist.md +21 -10
  30. package/.agents/skills/developer/SKILL.md +10 -0
  31. package/.agents/skills/developer/references/execute-task.md +13 -7
  32. package/.agents/skills/developer/references/onboarding.md +1 -1
  33. package/.agents/skills/help/SKILL.md +39 -23
  34. package/.agents/skills/meet/SKILL.md +11 -4
  35. package/.agents/skills/quick-dev/SKILL.md +29 -22
  36. package/.agents/skills/release-readiness/SKILL.md +19 -13
  37. package/.agents/skills/skill-creator/LICENSE.txt +202 -0
  38. package/.agents/skills/skill-creator/SKILL.md +485 -0
  39. package/.agents/skills/skill-creator/agents/analyzer.md +274 -0
  40. package/.agents/skills/skill-creator/agents/comparator.md +202 -0
  41. package/.agents/skills/skill-creator/agents/grader.md +223 -0
  42. package/.agents/skills/skill-creator/assets/eval_review.html +146 -0
  43. package/.agents/skills/skill-creator/eval-viewer/generate_review.py +471 -0
  44. package/.agents/skills/skill-creator/eval-viewer/viewer.html +1325 -0
  45. package/.agents/skills/skill-creator/references/schemas.md +441 -0
  46. package/.agents/skills/skill-creator/scripts/__init__.py +0 -0
  47. package/.agents/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
  48. package/.agents/skills/skill-creator/scripts/generate_report.py +326 -0
  49. package/.agents/skills/skill-creator/scripts/improve_description.py +247 -0
  50. package/.agents/skills/skill-creator/scripts/package_skill.py +136 -0
  51. package/.agents/skills/skill-creator/scripts/quick_validate.py +103 -0
  52. package/.agents/skills/skill-creator/scripts/run_eval.py +310 -0
  53. package/.agents/skills/skill-creator/scripts/run_loop.py +328 -0
  54. package/.agents/skills/skill-creator/scripts/utils.py +47 -0
  55. package/.agents/skills/spec-audit/SKILL.md +33 -4
  56. package/.agents/skills/spec-compliance/SKILL.md +36 -21
  57. package/.agents/skills/spec-init/SKILL.md +31 -17
  58. package/README.md +165 -129
  59. package/bin/macca-method.js +1378 -1077
  60. package/package.json +40 -40
  61. package/scripts/run-skill-validator.js +27 -9
  62. package/scripts/test-install.js +611 -337
  63. package/scripts/test-upgrade-legacy.js +131 -76
  64. package/scripts/validate-skill-behavior.js +175 -64
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "2.0.0",
2
+ "version": "2.1.2",
3
3
  "skills": [
4
4
  "_shared",
5
5
  "add-feature",
@@ -84,11 +84,11 @@ When a brainstorming skill starts:
84
84
  2. Read `brainstormPreferences` if present.
85
85
  3. **Announce the session** before asking anything:
86
86
  - If preferences are already saved, announce and proceed in the same response. The user may override them at any time:
87
- ```
88
- This session has [N] topics.
89
- Saved preferences: [pacing] | recommendations: [on/off] | depth: [quick/standard/critical]
90
- Using these settings. Type different settings at any time.
91
- ```
87
+ ```
88
+ This session has [N] topics.
89
+ Saved preferences: [pacing] | recommendations: [on/off] | depth: [quick/standard/critical]
90
+ Using these settings. Type different settings at any time.
91
+ ```
92
92
  - If no preferences are saved — ask both before starting:
93
93
  ```
94
94
  This session has [N] topics. Two things before we start:
@@ -11,7 +11,20 @@ Announce `[Fix mode: report-first]` or `[Fix mode: fix-then-report]` at the star
11
11
 
12
12
  ## Required Report-First Gate
13
13
 
14
- After the full report and fix manifest, print this block verbatim and end the response:
14
+ After the full report and fix manifest, print the block below matching `languagePreferences.communication.normalized` (see `language-config.md`) and end the response. Use only one language block - never mix English and Indonesian inside it.
15
+
16
+ Indonesian (`indonesian`, `id`, and any equivalent listed in `language-config.md` - also the default when the preference is missing or unrecognized):
17
+
18
+ ```text
19
+ ---
20
+ [GATE — Mode: report-first]
21
+ Semua temuan sudah dilaporkan. Belum ada file yang diubah.
22
+ Balas "ya" / "setuju" / "lanjut" / "perbaiki" untuk menerapkan semua perbaikan,
23
+ atau sebutkan temuan mana saja yang ingin diperbaiki.
24
+ ---
25
+ ```
26
+
27
+ English (`english`, `en`):
15
28
 
16
29
  ```text
17
30
  ---
@@ -29,8 +42,10 @@ The fix manifest records each actionable finding ID, target, bounded change, and
29
42
  This takes precedence over normal routing, startup, identity, onboarding, preflight, and work-mode prompts.
30
43
 
31
44
  1. Trim and case-fold the next response.
32
- 2. Exact `yes`, `fix`, or `continue` approves every actionable finding in the immediately preceding report, including actionable MINOR findings.
33
- 3. Named IDs approve only those findings.
45
+ 2. Any of these approves every actionable finding in the immediately preceding report, including actionable MINOR findings:
46
+ - English: `yes`, `fix`, `continue`
47
+ - Indonesian: `ya`, `iya`, `setuju`, `lanjut`, `perbaiki`
48
+ 3. Named IDs approve only those findings, in either language.
34
49
  4. Resume directly at edits. Do not repeat analysis, the report, startup, preflight, or the same gate.
35
50
  5. Ask again only if the worktree changed materially, a target disappeared, findings conflict, or the implementation becomes destructive or exceeds disclosed scope.
36
51
  6. Run the narrowest relevant validation and one bounded verdict pass: `resolved`, `partial`, or `unresolved`.
@@ -54,4 +54,4 @@ Keep one decision topic per pause.
54
54
 
55
55
  After the user answers, continue from the exact paused step. Do not restart the workflow or ask for the same confirmation again unless the situation materially changes.
56
56
 
57
- An answer to an active gate takes precedence over normal skill startup and routing. For a report-first gate, exact `yes`, `fix`, or `continue` and finding-ID subsets follow the Approval Resume Protocol in `fix-mode.md`. Do not send them through identity setup, preflight, or a second confirmation.
57
+ An answer to an active gate takes precedence over normal skill startup and routing. For a report-first gate, the approval tokens and finding-ID subsets defined in `fix-mode.md`'s Approval Resume Protocol take priority. Do not send them through identity setup, preflight, or a second confirmation.
@@ -4,26 +4,26 @@ This catalog documents intent; it does not replace host routing or safety gates.
4
4
 
5
5
  Portable Agent Skills rely on `name` and `description`. OpenCode ignores Copilot-specific invocation fields. Therefore canonical skills keep standard frontmatter and express routing through descriptions and workflow boundaries.
6
6
 
7
- | Skill | Policy | Rationale |
8
- |---|---|---|
9
- | `add-feature` | explicit-intent | Broad source-of-truth mutation |
10
- | `brainstorm-prd` | explicit-intent | Long interview and PRD creation |
11
- | `brainstorm-architecture` | explicit-intent | Strategic technical decisions |
12
- | `brainstorm-schema` | explicit-intent | Consequential data contract |
13
- | `brainstorm-api` | explicit-intent | External contract creation |
14
- | `brainstorm-styleguide` | explicit-intent | UI contract interview |
15
- | `brainstorm-rules` | explicit-intent | Repository-wide rules |
16
- | `brainstorm-task` | both | Direct use and `add-feature` orchestration |
17
- | `spec-init` | explicit-intent | Whole-codebase scan and multi-document generation |
18
- | `developer` | explicit-implementation-intent | Broad implementation mutation |
19
- | `quick-dev` | model-auto | Bounded router for small implementation tasks |
20
- | `bug-fix` | both | Automatic bug/error routing and direct use; the first code change still requires explicit implementation approval from the diagnosis gate |
21
- | `spec-compliance` | orchestrated | Called by execution/remediation workflows; ad hoc requests remain valid |
22
- | `code-review` | both | Direct review and post-phase orchestration |
23
- | `spec-audit` | both | Direct audit and final workflow check |
24
- | `release-readiness` | both | Direct pre-release request and project-complete handoff |
25
- | `help` | both | Cheap read-only routing |
26
- | `meet` | both | Non-mutating meeting intent |
7
+ | Skill | Policy | Rationale |
8
+ | ------------------------- | ------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------- |
9
+ | `add-feature` | explicit-intent | Broad source-of-truth mutation |
10
+ | `brainstorm-prd` | explicit-intent | Long interview and PRD creation |
11
+ | `brainstorm-architecture` | explicit-intent | Strategic technical decisions |
12
+ | `brainstorm-schema` | explicit-intent | Consequential data contract |
13
+ | `brainstorm-api` | explicit-intent | External contract creation |
14
+ | `brainstorm-styleguide` | explicit-intent | UI contract interview |
15
+ | `brainstorm-rules` | explicit-intent | Repository-wide rules |
16
+ | `brainstorm-task` | both | Direct use and `add-feature` orchestration |
17
+ | `spec-init` | explicit-intent | Whole-codebase scan and multi-document generation |
18
+ | `developer` | explicit-implementation-intent | Broad implementation mutation |
19
+ | `quick-dev` | model-auto | Bounded router for small implementation tasks |
20
+ | `bug-fix` | both | Automatic bug/error routing and direct use; the first code change still requires explicit implementation approval from the diagnosis gate |
21
+ | `spec-compliance` | orchestrated | Called by execution/remediation workflows; ad hoc requests remain valid |
22
+ | `code-review` | both | Direct review and post-phase orchestration |
23
+ | `spec-audit` | both | Direct audit and final workflow check |
24
+ | `release-readiness` | both | Direct pre-release request and project-complete handoff |
25
+ | `help` | both | Cheap read-only routing |
26
+ | `meet` | both | Non-mutating meeting intent |
27
27
 
28
28
  Definitions:
29
29
 
@@ -4,12 +4,14 @@ Read `.agents/developer-config.json` if it exists.
4
4
 
5
5
  Use:
6
6
 
7
- - `languagePreferences.communication.normalized` for chat, reports, prompts, and confirmations.
7
+ - `languagePreferences.communication.normalized` for chat, reports, prompts, confirmations, and gate/approval text.
8
8
  - `languagePreferences.documents.normalized` for generated project documents.
9
9
 
10
- Accepted reader values:
10
+ When the resolved language is Indonesian, all chat output - including report-first gates and their reply options - MUST be Indonesian. Do not mix in English sentences or fall back to English-only reply tokens.
11
11
 
12
- - Indonesian: `indonesian`, `id`
13
- - English: `english`, `en`
12
+ Match `raw` or `normalized` case-insensitively against these equivalents (same mapping the installer's `normalizeLanguage()` uses):
14
13
 
15
- If missing, use Indonesian. Never translate file names, traceability IDs, config keys, or code literals.
14
+ - Indonesian: `indonesian`, `id`, `indo`, `indonesia`, `bahasa indonesia`
15
+ - English: `english`, `en`, `eng`, `inggris`, `bahasa inggris`
16
+
17
+ If missing or unrecognized, use Indonesian. Never translate file names, traceability IDs, config keys, or code literals.
@@ -6,17 +6,17 @@ This file defines which skill primarily owns each persistent output, so skills d
6
6
 
7
7
  ## Primary Owners
8
8
 
9
- | Output | Primary Owner | Secondary / Limited Authors |
10
- |---|---|---|
11
- | `project-context/PRD.md` | `brainstorm-prd` | `add-feature`, `spec-init` |
12
- | `project-context/architecture.md` | `brainstorm-architecture` | `add-feature`, `spec-init` |
13
- | `project-context/schema.md` | `brainstorm-schema` | `add-feature`, `spec-init` |
14
- | `project-context/api.md` | `brainstorm-api` | `add-feature`, `spec-init` |
15
- | `project-context/StyleGuide.md` | `brainstorm-styleguide` | `add-feature`, `spec-init` |
16
- | `project-context/rules.md` | `brainstorm-rules` | `add-feature`, `spec-init` |
17
- | `project-context/Task.md` | `brainstorm-task` | `developer` updates progress and approved phase deltas; `quick-dev` adds one approved lightweight entry; `add-feature` hands off to `brainstorm-task` |
18
- | `project-context/bug-log.md` | `bug-fix` | none |
19
- | `project-context/plans/*.md` | `developer` | `add-feature`, `code-review` limited updates per workflow |
9
+ | Output | Primary Owner | Secondary / Limited Authors |
10
+ | --------------------------------- | ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
11
+ | `project-context/PRD.md` | `brainstorm-prd` | `add-feature`, `spec-init` |
12
+ | `project-context/architecture.md` | `brainstorm-architecture` | `add-feature`, `spec-init` |
13
+ | `project-context/schema.md` | `brainstorm-schema` | `add-feature`, `spec-init` |
14
+ | `project-context/api.md` | `brainstorm-api` | `add-feature`, `spec-init` |
15
+ | `project-context/StyleGuide.md` | `brainstorm-styleguide` | `add-feature`, `spec-init` |
16
+ | `project-context/rules.md` | `brainstorm-rules` | `add-feature`, `spec-init` |
17
+ | `project-context/Task.md` | `brainstorm-task` | `developer` updates progress and approved phase deltas; `quick-dev` adds one approved lightweight entry; `add-feature` adds approved phase deltas (or hands off to `brainstorm-task` if missing) |
18
+ | `project-context/bug-log.md` | `bug-fix` | none |
19
+ | `project-context/plans/*.md` | `developer` | `add-feature`, `code-review` limited updates per workflow |
20
20
 
21
21
  ## Ownership Rules
22
22
 
@@ -9,7 +9,7 @@ This file defines how skills must adjust documents, recommendations, and work bo
9
9
  - `frontend`
10
10
  - `backend`
11
11
  - `fullstack`
12
- - *(missing)* → treat as `fullstack`
12
+ - _(missing)_ → treat as `fullstack`
13
13
 
14
14
  ## General Rules
15
15
 
@@ -2,26 +2,26 @@
2
2
 
3
3
  Compact framework-audit index. This is not a replacement for each `SKILL.md`; it identifies which full files need inspection when a conflict is suspected.
4
4
 
5
- | Skill | Invocation | Reads | Writes / Output | Primary Handoff |
6
- |---|---|---|---|---|
7
- | `brainstorm-prd` | explicit-intent | scope/config, user discovery | `PRD.md` | `brainstorm-architecture` |
8
- | `brainstorm-architecture` | explicit-intent | PRD | `architecture.md` | schema/API/style/rules |
9
- | `brainstorm-schema` | explicit-intent | PRD, architecture | `schema.md` | `brainstorm-api` |
10
- | `brainstorm-api` | explicit-intent | PRD, architecture, schema when applicable | `api.md` | style/rules/task |
11
- | `brainstorm-styleguide` | explicit-intent | PRD, architecture | `StyleGuide.md` | rules/task |
12
- | `brainstorm-rules` | explicit-intent | architecture and applicable domain specs | `rules.md` | `brainstorm-task` |
13
- | `brainstorm-task` | both | applicable specs | `Task.md` | `developer` |
14
- | `add-feature` | explicit-intent | all existing specs | approved spec deltas; delegates Task | `developer` |
15
- | `spec-init` | explicit-intent | existing code/config/evidence | bootstrap specs, not Task | audit/task |
16
- | `developer` | explicit-implementation-intent | Task and relevant specs | code, Task progress, plans | compliance/review |
17
- | `quick-dev` | model-auto | relevant specs | bounded code and Task entry | compliance/review |
18
- | `bug-fix` | both | bug log, relevant code/specs | approved fix, prevention, confirmed bug log | compliance/review |
19
- | `spec-compliance` | orchestrated | code and applicable specs | report; approved fixes | code-review |
20
- | `code-review` | both | diff/code, rules, architecture, applicable contracts | report; approved fixes | phase completion |
21
- | `spec-audit` | both | spec pairs or framework catalog | report; explicitly requested corrections | owning skills |
22
- | `release-readiness` | both | existing quality/release evidence | report only | release owner |
23
- | `help` | both | project status/config/catalog | routing report | selected skill |
24
- | `meet` | both | agenda-relevant evidence | one-round discussion report | owning skills |
5
+ | Skill | Invocation | Reads | Writes / Output | Primary Handoff |
6
+ | ------------------------- | ------------------------------ | ---------------------------------------------------- | ------------------------------------------- | ------------------------- |
7
+ | `brainstorm-prd` | explicit-intent | scope/config, user discovery | `PRD.md` | `brainstorm-architecture` |
8
+ | `brainstorm-architecture` | explicit-intent | PRD | `architecture.md` | schema/API/style/rules |
9
+ | `brainstorm-schema` | explicit-intent | PRD, architecture | `schema.md` | `brainstorm-api` |
10
+ | `brainstorm-api` | explicit-intent | PRD, architecture, schema when applicable | `api.md` | style/rules/task |
11
+ | `brainstorm-styleguide` | explicit-intent | PRD, architecture | `StyleGuide.md` | rules/task |
12
+ | `brainstorm-rules` | explicit-intent | architecture and applicable domain specs | `rules.md` | `brainstorm-task` |
13
+ | `brainstorm-task` | both | applicable specs | `Task.md` | `developer` |
14
+ | `add-feature` | explicit-intent | all existing specs | approved spec deltas; delegates Task | `developer` |
15
+ | `spec-init` | explicit-intent | existing code/config/evidence | bootstrap specs, not Task | audit/task |
16
+ | `developer` | explicit-implementation-intent | Task and relevant specs | code, Task progress, plans | compliance/review |
17
+ | `quick-dev` | model-auto | relevant specs | bounded code and Task entry | compliance/review |
18
+ | `bug-fix` | both | bug log, relevant code/specs | approved fix, prevention, confirmed bug log | compliance/review |
19
+ | `spec-compliance` | orchestrated | code and applicable specs | report; approved fixes | code-review |
20
+ | `code-review` | both | diff/code, rules, architecture, applicable contracts | report; approved fixes | phase completion |
21
+ | `spec-audit` | both | spec pairs or framework catalog | report; explicitly requested corrections | owning skills |
22
+ | `release-readiness` | both | existing quality/release evidence | report only | release owner |
23
+ | `help` | both | project status/config/catalog | routing report | selected skill |
24
+ | `meet` | both | agenda-relevant evidence | one-round discussion report | owning skills |
25
25
 
26
26
  Framework invariants:
27
27
 
@@ -6,7 +6,6 @@ import re
6
6
  import sys
7
7
  from pathlib import Path
8
8
 
9
-
10
9
  SKILLS_DIR = Path(__file__).resolve().parents[2]
11
10
  ALLOWED_FRONTMATTER = {
12
11
  "name",
@@ -46,12 +45,14 @@ def parse_frontmatter(path: Path, text: str) -> tuple[dict[str, object], list[st
46
45
  continue
47
46
  if line.startswith(" "):
48
47
  if current_map != "metadata" or ":" not in line:
49
- issues.append(f"{path}:{line_number}: unsupported nested frontmatter value")
48
+ issues.append(
49
+ f"{path}:{line_number}: unsupported nested frontmatter value"
50
+ )
50
51
  continue
51
52
  key, value = line.strip().split(":", 1)
52
53
  metadata = data.setdefault("metadata", {})
53
54
  assert isinstance(metadata, dict)
54
- metadata[key] = value.strip().strip('"\'')
55
+ metadata[key] = value.strip().strip("\"'")
55
56
  continue
56
57
  if ":" not in line:
57
58
  issues.append(f"{path}:{line_number}: invalid frontmatter line")
@@ -62,7 +63,7 @@ def parse_frontmatter(path: Path, text: str) -> tuple[dict[str, object], list[st
62
63
  issues.append(f"{path}:{line_number}: duplicate frontmatter key {key}")
63
64
  value = value.strip()
64
65
  if value:
65
- data[key] = value.strip('"\'')
66
+ data[key] = value.strip("\"'")
66
67
  current_map = None
67
68
  else:
68
69
  data[key] = {}
@@ -93,20 +94,31 @@ def check_skill_file(path: Path) -> list[str]:
93
94
  if frontmatter:
94
95
  unknown = sorted(set(frontmatter) - ALLOWED_FRONTMATTER)
95
96
  if unknown:
96
- issues.append(f"{path}: unsupported frontmatter fields: {', '.join(unknown)}")
97
+ issues.append(
98
+ f"{path}: unsupported frontmatter fields: {', '.join(unknown)}"
99
+ )
97
100
 
98
101
  name = frontmatter.get("name")
99
102
  description = frontmatter.get("description")
100
103
  if not isinstance(name, str) or not NAME_RE.fullmatch(name) or len(name) > 64:
101
104
  issues.append(f"{path}: invalid skill name {name!r}")
102
105
  elif name != path.parent.name:
103
- issues.append(f"{path}: name {name!r} does not match folder {path.parent.name!r}")
104
- if not isinstance(description, str) or not description or len(description) > 1024:
106
+ issues.append(
107
+ f"{path}: name {name!r} does not match folder {path.parent.name!r}"
108
+ )
109
+ if (
110
+ not isinstance(description, str)
111
+ or not description
112
+ or len(description) > 1024
113
+ ):
105
114
  issues.append(f"{path}: description must contain 1-1024 characters")
106
115
  metadata = frontmatter.get("metadata")
107
116
  if metadata is not None and (
108
117
  not isinstance(metadata, dict)
109
- or any(not isinstance(key, str) or not isinstance(value, str) for key, value in metadata.items())
118
+ or any(
119
+ not isinstance(key, str) or not isinstance(value, str)
120
+ for key, value in metadata.items()
121
+ )
110
122
  ):
111
123
  issues.append(f"{path}: metadata must be a string-to-string map")
112
124
  compatibility = frontmatter.get("compatibility")
@@ -121,14 +133,24 @@ def check_skill_file(path: Path) -> list[str]:
121
133
  if "<SECURITY_REVIEW>" in text:
122
134
  issues.append(f"{path}: <SECURITY_REVIEW> placeholder was not replaced")
123
135
 
124
- if re.search(r"^```markdown\s*$", text, re.MULTILINE) and re.search(
125
- r"^```(?:json|text|typescript|bash)\s*$", text, re.MULTILINE
126
- ):
127
- issues.append(
128
- f"{path}: possible broken nested fence; check and use 4 backticks for the outer template"
129
- )
136
+ # Check for actual unclosed markdown fences containing inner fences
137
+ # If a ```markdown block is opened, ensure any nested ``` blocks use 4 backticks ```` or are properly closed
138
+ if re.search(r"^```markdown\s*$", text, re.MULTILINE):
139
+ # Scan if there's an inner unescaped fence before closing ```
140
+ parts = text.split("```markdown")
141
+ for part in parts[1:]:
142
+ inside = part.split("\n```\n")[0] if "\n```\n" in part else part
143
+ if re.search(
144
+ r"^```(?:json|text|typescript|bash)\s*$", inside, re.MULTILINE
145
+ ):
146
+ issues.append(
147
+ f"{path}: possible broken nested fence inside ```markdown block; check and use 4 backticks for the outer template"
148
+ )
130
149
 
131
- if "[GATE — Fix mode: report-first]" in text and "Approval Resume Protocol" not in text:
150
+ if (
151
+ "[GATE — Fix mode: report-first]" in text
152
+ or "[GATE — Mode: report-first]" in text
153
+ ) and "Approval Resume Protocol" not in text:
132
154
  issues.append(f"{path}: report-first gate has no approval resume protocol")
133
155
 
134
156
  issues.extend(check_local_links(path, text))
@@ -11,6 +11,8 @@ metadata:
11
11
 
12
12
  ## Shared Runtime Setup
13
13
 
14
+ Paths written as `../...` below are relative to this SKILL.md's own folder, not the project's working directory - resolve them as a sibling of the folder that contains this file.
15
+
14
16
  At startup:
15
17
 
16
18
  1. Read `../_shared/references/language-config.md`.
@@ -31,6 +33,7 @@ Operate as `@Galbi` (Project Manager). Use the shared persona profile in `../_sh
31
33
  You are a **Product Engineer** adding features to a running project. Do not start from scratch. Read the current specs, understand the context, then update only the affected areas. Every impacted spec is updated; none are skipped.
32
34
 
33
35
  **Workflow:**
36
+
34
37
  - Read all existing specs first
35
38
  - Identify the impact on each document
36
39
  - Update ALL impacted specs (required)
@@ -59,13 +62,14 @@ If the user gives a free-form description, extract the relevant information and
59
62
  ## Step 1: Read All Existing Specs
60
63
 
61
64
  Read every existing file in `project-context/`:
65
+
62
66
  - `PRD.md`
63
67
  - `architecture.md`
64
68
  - `schema.md`
65
69
  - `api.md`
66
70
  - `rules.md`
67
71
  - `StyleGuide.md`
68
- - `Task.md` *(if it exists; otherwise it will be created by brainstorm-task)*
72
+ - `Task.md` _(if it exists; otherwise it will be created by brainstorm-task)_
69
73
 
70
74
  Read everything that exists. Skip nothing. Note the ID patterns in use (`FEAT-*`, `BR-*`, `DATA-*`, `API-*`, etc.).
71
75
 
@@ -114,15 +118,17 @@ For each **IMPACTED** document, update it in this order:
114
118
  4. `api.md` — add endpoints
115
119
  5. `StyleGuide.md` — add components/styles
116
120
  6. `rules.md` — add conventions if needed
117
- 7. `project-context/plans/` — if a plan file exists for the affected phase (for example `plans/phase-2-checkout.md`), update it to reflect the new scope. Add a section: `## Feature Addition: [feature name]` with a short description of the approach change. Do not overwrite existing plan content.
121
+ 7. `project-context/plans/` — if a plan file exists for the affected phase (for example `project-context/plans/phase-2-checkout.md`), update it to reflect the new scope. Add a section: `## Feature Addition: [feature name]` with a short description of the approach change. Do not overwrite existing plan content.
122
+
123
+ ### Update Principles
118
124
 
119
- ### Update Principles:
120
125
  - **Preserve unrelated content and IDs** — make the smallest targeted edit needed to keep each affected document internally consistent; update an existing statement when the approved feature changes it
121
126
  - **Match the existing style** — follow the current document format and tone
122
127
  - **Make additions clear** — place them logically; no special tags are needed
123
128
  - **Preserve old IDs** — assign new IDs for new items using the existing pattern
124
129
 
125
130
  After each update:
131
+
126
132
  ```
127
133
  ✅ PRD.md updated
128
134
  Section: [heading]
@@ -137,12 +143,14 @@ After each update:
137
143
  Call `brainstorm-task` to add a phase and tasks to `Task.md`.
138
144
 
139
145
  **Do not create tasks manually.** The `brainstorm-task` skill:
146
+
140
147
  - Performs deep analysis of the updated specs
141
148
  - Ensures task dependencies are ordered correctly
142
149
  - Creates testable acceptance criteria
143
150
  - Preserves consistency with existing phases
144
151
 
145
152
  Provide context:
153
+
146
154
  - If `Task.md` exists: "Add a new phase for this feature (do not rewrite everything)"
147
155
  - If `Task.md` does not exist: "Create Task.md from scratch using all specs"
148
156