macca-method 2.0.0 → 2.1.1

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.
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "2.0.0",
2
+ "version": "2.1.1",
3
3
  "skills": [
4
4
  "_shared",
5
5
  "add-feature",
@@ -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,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.
@@ -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`.
@@ -34,15 +34,17 @@ You are **@Fachri — Tech Lead**, a **Senior API Architect** who designs clear,
34
34
 
35
35
  ## Shared Runtime Setup
36
36
 
37
+ 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.
38
+
37
39
  Before any interview:
38
40
 
39
41
  1. Read `../_shared/references/language-config.md`.
40
42
  2. Read `../_shared/references/config-mutation.md`.
41
43
  3. Read `../_shared/references/brainstorm-session.md`.
42
44
  4. Read `../_shared/references/scope-rules.md`.
43
- 4. Use `languagePreferences.communication.normalized` for chat.
44
- 5. Use `languagePreferences.documents.normalized` for the final `project-context/api.md`.
45
- 6. Apply `brainstormPreferences.discussionMode`, `recommendations`, and `discoveryDepth` using the shared session policy.
45
+ 5. Use `languagePreferences.communication.normalized` for chat.
46
+ 6. Use `languagePreferences.documents.normalized` for the final `project-context/api.md`.
47
+ 7. Apply `brainstormPreferences.discussionMode`, `recommendations`, and `discoveryDepth` using the shared session policy.
46
48
 
47
49
  ---
48
50
 
@@ -34,15 +34,17 @@ You are **@Fachri — Tech Lead**, a **Senior Software Architect** who designs s
34
34
 
35
35
  ## Shared Runtime Setup
36
36
 
37
+ 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.
38
+
37
39
  Before any interview:
38
40
 
39
41
  1. Read `../_shared/references/language-config.md`.
40
42
  2. Read `../_shared/references/config-mutation.md`.
41
43
  3. Read `../_shared/references/brainstorm-session.md`.
42
44
  4. Read `../_shared/references/scope-rules.md`.
43
- 4. Use `languagePreferences.communication.normalized` for chat.
44
- 5. Use `languagePreferences.documents.normalized` for the final `project-context/architecture.md`.
45
- 6. Apply `brainstormPreferences.discussionMode`, `recommendations`, and `discoveryDepth` using the shared session policy.
45
+ 5. Use `languagePreferences.communication.normalized` for chat.
46
+ 6. Use `languagePreferences.documents.normalized` for the final `project-context/architecture.md`.
47
+ 7. Apply `brainstormPreferences.discussionMode`, `recommendations`, and `discoveryDepth` using the shared session policy.
46
48
 
47
49
  ---
48
50
 
@@ -34,15 +34,17 @@ You are an experienced **Product Manager** who turns raw ideas into clear, actio
34
34
 
35
35
  ## Shared Runtime Setup
36
36
 
37
+ 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.
38
+
37
39
  Before any interview:
38
40
 
39
41
  1. Read `../_shared/references/language-config.md`.
40
42
  2. Read `../_shared/references/config-mutation.md`.
41
43
  3. Read `../_shared/references/brainstorm-session.md`.
42
44
  4. Read `../_shared/references/scope-rules.md`.
43
- 4. Use `languagePreferences.communication.normalized` for chat.
44
- 5. Use `languagePreferences.documents.normalized` for the final `project-context/PRD.md`.
45
- 6. Apply `brainstormPreferences.discussionMode`, `recommendations`, and `discoveryDepth` using the shared session policy.
45
+ 5. Use `languagePreferences.communication.normalized` for chat.
46
+ 6. Use `languagePreferences.documents.normalized` for the final `project-context/PRD.md`.
47
+ 7. Apply `brainstormPreferences.discussionMode`, `recommendations`, and `discoveryDepth` using the shared session policy.
46
48
 
47
49
  ---
48
50
 
@@ -44,7 +44,7 @@ This skill generates **rules.md**: a "code constitution" so AI works consistentl
44
44
  - `project-context/schema.md` — decisions about PII, retention, data protection
45
45
  - `project-context/api.md` — auth contract, rate limiting, abuse controls
46
46
 
47
- 3. **Shared Runtime Setup** — before the interview:
47
+ 3. **Shared Runtime Setup** — before the interview (paths written as `../...` are relative to this SKILL.md's own folder, not the project's working directory):
48
48
  - Read `../_shared/references/language-config.md`.
49
49
  - Read `../_shared/references/config-mutation.md`.
50
50
  - Read `../_shared/references/brainstorm-session.md`.
@@ -58,7 +58,7 @@ This skill generates **rules.md**: a "code constitution" so AI works consistentl
58
58
 
59
59
  5. After all topics are complete, create `project-context/rules.md` (create `project-context/` if needed).
60
60
 
61
- > ⚠️ **If the file already exists:** ask the user before overwriting — "(A) Replace the entire file, (B) cancel and review first." Wait for the answer.
61
+ > ⚠️ **If the file already exists:** "(A) Overwrite all, (B) Cancel and review first." Wait for the answer.
62
62
 
63
63
  6. Summarize the result and provide next steps.
64
64
 
@@ -34,15 +34,17 @@ You are **@Fachri — Tech Lead**, a **Senior Database Architect** who designs e
34
34
 
35
35
  ## Shared Runtime Setup
36
36
 
37
+ 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.
38
+
37
39
  Before any interview:
38
40
 
39
41
  1. Read `../_shared/references/language-config.md`.
40
42
  2. Read `../_shared/references/config-mutation.md`.
41
43
  3. Read `../_shared/references/brainstorm-session.md`.
42
44
  4. Read `../_shared/references/scope-rules.md`.
43
- 4. Use `languagePreferences.communication.normalized` for chat.
44
- 5. Use `languagePreferences.documents.normalized` for the final `project-context/schema.md`.
45
- 6. Apply `brainstormPreferences.discussionMode`, `recommendations`, and `discoveryDepth` using the shared session policy.
45
+ 5. Use `languagePreferences.communication.normalized` for chat.
46
+ 6. Use `languagePreferences.documents.normalized` for the final `project-context/schema.md`.
47
+ 7. Apply `brainstormPreferences.discussionMode`, `recommendations`, and `discoveryDepth` using the shared session policy.
46
48
 
47
49
  ---
48
50
 
@@ -43,7 +43,7 @@ This skill generates **StyleGuide.md** through an interactive interview. It prev
43
43
  - `project-context/architecture.md` — chosen frontend tech stack
44
44
  - If `.agents/developer-config.json` exists, read `developerPreferences.scope`
45
45
 
46
- 3. **Shared Runtime Setup** — before the interview:
46
+ 3. **Shared Runtime Setup** — before the interview (paths written as `../...` are relative to this SKILL.md's own folder, not the project's working directory):
47
47
  - Read `../_shared/references/language-config.md`.
48
48
  - Read `../_shared/references/config-mutation.md`.
49
49
  - Read `../_shared/references/brainstorm-session.md`.
@@ -59,7 +59,7 @@ This skill generates **StyleGuide.md** through an interactive interview. It prev
59
59
 
60
60
  6. After all topics are complete, create `project-context/StyleGuide.md` (create `project-context/` if needed).
61
61
 
62
- > ⚠️ **If the file already exists:** ask the user before overwriting — "(A) Replace the entire file, (B) cancel and review first." Wait for the answer.
62
+ > ⚠️ **If the file already exists:** "(A) Overwrite all, (B) Cancel and review first." Wait for the answer.
63
63
 
64
64
  7. Summarize the result and provide next steps.
65
65
 
@@ -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
  Before starting:
15
17
 
16
18
  1. Read `../_shared/references/language-config.md`.
@@ -11,14 +11,16 @@ 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
  Before continuing:
15
17
 
16
18
  1. Read `../_shared/references/language-config.md`.
17
19
  2. Read `../_shared/references/fix-mode.md`.
18
20
  3. Read `../_shared/references/human-loop.md`.
19
- 3. If the current message answers this skill's active report-first gate, resume directly at the approved fix under the Approval Resume Protocol. Do not repeat diagnosis or ask again.
20
- 4. Otherwise, read `codeReviewPreferences.fixMode` from `.agents/developer-config.json`. If it is missing, treat it as `"report-first"`. Announce: `[Fix mode: report-first]` or `[Fix mode: fix-then-report]`.
21
- 5. Use `languagePreferences.communication.normalized` for all chat output.
21
+ 4. If the current message answers this skill's active report-first gate, resume directly at the approved fix under the Approval Resume Protocol. Do not repeat diagnosis or ask again.
22
+ 5. Otherwise, read `codeReviewPreferences.fixMode` from `.agents/developer-config.json`. If it is missing, treat it as `"report-first"`. Announce: `[Fix mode: report-first]` or `[Fix mode: fix-then-report]`.
23
+ 6. Use `languagePreferences.communication.normalized` for all chat output.
22
24
 
23
25
  ---
24
26
 
@@ -107,9 +109,9 @@ Before reading code, use every available aid:
107
109
  - Search for the same bug pattern across the codebase now, before the gate. Include every known occurrence proposed for repair in the fix manifest.
108
110
  - Relevant specs (`project-context/architecture.md`, `schema.md`, etc.) if the bug spans multiple layers
109
111
 
110
- ### 2c. Explain the diagnosis to the user
112
+ ### 2c. Explain the diagnosis and propose the fix - one response
111
113
 
112
- MUST use EXACTLY these 3 points. MUST NOT show code - explain only in working logic:
114
+ MUST use EXACTLY these points, in this order, in a single response. MUST NOT show code in the first three points - explain only in working logic. This response does not end here - continue straight into the gate in 2d; do not stop after "Recommended fix" and wait for a separate reply:
113
115
 
114
116
  ```
115
117
  **Why can this happen?**
@@ -120,14 +122,19 @@ MUST use EXACTLY these 3 points. MUST NOT show code - explain only in working lo
120
122
 
121
123
  **Recommended fix**
122
124
  [Explain what needs to change in the logic and flow, not syntax. Speak as if explaining how the app works.]
125
+
126
+ **Files to change**
127
+ - `[path]` - [bounded change]
128
+ - `[path]` - [bounded change]
123
129
  ```
124
130
 
125
131
  ### 2d. Root-Cause Approval Gate
126
132
 
127
- Include the root cause, proposed files, bounded changes, and validation in the same diagnosis response.
133
+ End the SAME response as 2c with the `report-first` gate block from `fix-mode.md`, in the language required by `language-config.md`.
128
134
 
129
135
  - Always wait for explicit user approval before the first code change, regardless of `fixMode`.
130
- - Reuse the shared report-first gate wording when the diagnosis is presented as a report-style approval.
136
+ - MUST NOT split 2c and 2d across two responses - the diagnosis, the files to change, and the gate are one message, one turn.
137
+ - MUST NOT invent an alternate approval question (for example "reply agree" or "balas setuju"). Use only the exact gate block from `fix-mode.md`.
131
138
  - After the first implementation approval, `fixMode` governs downstream `spec-compliance` and `code-review` remediation only.
132
139
  - Do not add another implementation approval gate in Step 3.
133
140
 
@@ -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
  Before continuing:
15
17
 
16
18
  1. Read `../_shared/references/language-config.md`.
@@ -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
  Before continuing:
15
17
 
16
18
  1. Read `../_shared/references/language-config.md`.
@@ -7,7 +7,7 @@ Read this file only when identity/config/work mode is incomplete or plan-first m
7
7
  If `additionalSkills` is missing:
8
8
 
9
9
  1. Ask once whether the project uses framework/domain skills.
10
- 2. For each named skill, search `.agents/skills/`, `.github/skills/`, `.opencode/skills/`, then matching workspace folders.
10
+ 2. For each named skill, search every MACCA tool destination: `.agents/skills/` (codex/kimi), `.github/skills/` (copilot), `.opencode/skills/`, `.claude/skills/`, `.cursor/skills/`, `.windsurf/skills/`, `.gemini/skills/`, `.kilo/skills/`. If none match, also check the global equivalents `~/.config/opencode/skills/`, `~/.claude/skills/`, and `~/.agents/skills/`. Only then fall back to matching workspace folders.
11
11
  3. If found, record its path. If absent, ask for the path or allow `skip`.
12
12
  4. Before saving, load `../../_shared/references/additional-skills.md` and use its canonical `paths` shape.
13
13
 
@@ -11,12 +11,14 @@ 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`.
17
19
  2. Read `../_shared/references/scope-rules.md`.
18
20
  3. Read `../_shared/references/invocation-policy.md` when explaining how a skill is activated.
19
- 3. Use `languagePreferences.communication.normalized` for all chat output, reports, and guidance.
21
+ 4. Use `languagePreferences.communication.normalized` for all chat output, reports, and guidance.
20
22
 
21
23
  ---
22
24
 
@@ -46,8 +48,10 @@ You are a patient **Mentor and Guide** who explains complex systems with everyda
46
48
 
47
49
  Check whether the `project-context/` folder exists:
48
50
  - **No:** first check whether a real codebase already exists (for example `package.json`, `composer.json`, `go.mod`, `src/`, `app/`, `artisan`, `routes/`).
49
- - If a real codebase exists: show "The codebase already exists but `project-context/` has not been created yet. Start with `spec-init`." Then stop.
50
- - If no real codebase exists: show "No spec documents exist yet. This is a new project. Start with `brainstorm-prd` to create the PRD." Then stop.
51
+ - Before recommending a skill, give a short plain-language orientation (2-4 sentences, no jargon): this system writes down what to build before touching code, then checks the code against that writing afterward - this catches misunderstandings early and gives every future session a stable source of truth instead of re-guessing intent from scratch.
52
+ - If a real codebase exists: show "The codebase already exists but `project-context/` has not been created yet. Start with `spec-init` - it reads your existing code and drafts these documents for you; it does not invent requirements from scratch." Then stop.
53
+ - If no real codebase exists: show "No spec documents exist yet. This is a new project. Start with `brainstorm-prd` - a short guided conversation about what you want to build. Your answers become the first planning document, and each following step builds on it toward working code." Then stop.
54
+ - Mention once, briefly: you can call `help` again anytime you are not sure what to do next.
51
55
  - **Yes:** Continue and read whichever files exist.
52
56
 
53
57
  Check for the existence of:
@@ -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`.
@@ -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 (this also applies to the `../developer/references/...` reads later in this file).
15
+
14
16
  Before any output:
15
17
 
16
18
  1. Read `../_shared/references/language-config.md`.
@@ -79,7 +81,7 @@ Read `additionalSkills` and `availableMCPs` from `.agents/developer-config.json`
79
81
  Read `developerPreferences.scope` from `.agents/developer-config.json`.
80
82
 
81
83
  - **Exists:** show `[Scope: frontend / backend / fullstack]`. Tell the user to correct now if needed.
82
- - **Missing:** ask once using the same question as `developer` Step 0c. Save answer.
84
+ - **Missing:** ask once using the same question as `developer/references/onboarding.md` § Developer Scope. Save answer.
83
85
 
84
86
  ---
85
87
 
@@ -146,7 +148,7 @@ Scan `[FORBIDDEN]` in `rules.md` before any coding.
146
148
 
147
149
  ## Step 2b — Record an Approved Scope Delta Before Coding
148
150
 
149
- If the task is outside `project-context/`, follow the approval flow from `developer` Step 3a before editing code. After approval, create or update the lightweight `Task.md` entry immediately with `status: in-progress` and the delta details. If `Task.md` or an active phase is missing, stop and route to `developer`; do not invent a phase.
151
+ If the task is outside `project-context/`, follow the approval flow in `developer/references/execute-task.md` § Understand and Protect Scope before editing code. After approval, create or update the lightweight `Task.md` entry immediately with `status: in-progress` and the delta details. If `Task.md` or an active phase is missing, stop and route to `developer`; do not invent a phase.
150
152
 
151
153
  ## Step 3 — Execute
152
154
 
@@ -186,7 +188,7 @@ If a scope delta exists, record it inline:
186
188
  1. Run `spec-compliance`. Follow `fixMode` from Shared Runtime Setup.
187
189
  2. Run `code-review`. Follow `fixMode` from Shared Runtime Setup.
188
190
 
189
- Both follow the same gate behavior as `developer` Step 4. Do not proceed to Step 6 until both pass.
191
+ Both follow the same `spec-compliance` -> `code-review` gate sequence as `developer/references/close-phase.md`. Do not proceed to Step 6 until both pass.
190
192
 
191
193
  ---
192
194
 
@@ -11,6 +11,8 @@ metadata:
11
11
 
12
12
  ## Shared 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
  1. Read `../_shared/references/language-config.md`.
15
17
  2. Use the configured communication language.
16
18
  3. This skill is report-only. Do not edit files, run deployment, publish packages, rotate secrets, apply migrations, or change infrastructure.
@@ -11,14 +11,16 @@ 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`.
17
19
  2. Read `../_shared/references/fix-mode.md`.
18
20
  3. Read `../_shared/references/human-loop.md`.
19
- 3. If this message answers this skill's active correction gate, resume directly under the Approval Resume Protocol. Do not rerun startup or the audit.
20
- 4. Otherwise, read `codeReviewPreferences.fixMode` from `.agents/developer-config.json`. If it is missing, treat it as `"report-first"`. Announce: `[Fix mode: report-first]` or `[Fix mode: fix-then-report]`.
21
- 5. Use `languagePreferences.communication.normalized` for audit reports.
21
+ 4. If this message answers this skill's active correction gate, resume directly under the Approval Resume Protocol. Do not rerun startup or the audit.
22
+ 5. Otherwise, read `codeReviewPreferences.fixMode` from `.agents/developer-config.json`. If it is missing, treat it as `"report-first"`. Announce: `[Fix mode: report-first]` or `[Fix mode: fix-then-report]`.
23
+ 6. Use `languagePreferences.communication.normalized` for audit reports.
22
24
 
23
25
  ---
24
26
 
@@ -11,15 +11,17 @@ 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
  Before continuing:
15
17
 
16
18
  1. Read `../_shared/references/language-config.md`.
17
19
  2. Read `../_shared/references/fix-mode.md`.
18
20
  3. Read `../_shared/references/human-loop.md`.
19
21
  4. Read `../_shared/references/finding-format.md`.
20
- 3. If this message answers this skill's active report-first gate, resume directly under the Approval Resume Protocol. Do not rerun startup or compliance analysis.
21
- 4. Otherwise, read `codeReviewPreferences.fixMode` from `.agents/developer-config.json`. If it is missing, treat it as `"report-first"`. Announce: `[Fix mode: report-first]` or `[Fix mode: fix-then-report]`.
22
- 5. Use `languagePreferences.communication.normalized` for all user-facing reports and review output.
22
+ 5. If this message answers this skill's active report-first gate, resume directly under the Approval Resume Protocol. Do not rerun startup or compliance analysis.
23
+ 6. Otherwise, read `codeReviewPreferences.fixMode` from `.agents/developer-config.json`. If it is missing, treat it as `"report-first"`. Announce: `[Fix mode: report-first]` or `[Fix mode: fix-then-report]`.
24
+ 7. Use `languagePreferences.communication.normalized` for all user-facing reports and review output.
23
25
 
24
26
  ---
25
27
 
@@ -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
  Before starting:
15
17
 
16
18
  1. Read `../_shared/references/language-config.md`.
package/README.md CHANGED
@@ -305,7 +305,7 @@ Conditional rules are generated only when applicable: structured logging, migrat
305
305
  **Step 0 — Identify name & project**
306
306
  Read `.agents/developer-config.json`. If `name` or `project` is missing, AI asks once and saves the answer.
307
307
 
308
- **Step 0b — Setup additional skills & MCP**
308
+ **Additional skills & MCP setup** (`references/onboarding.md`)
309
309
 
310
310
  *Additional Skills:*
311
311
  - If `additionalSkills` already exists in config → use it directly
@@ -318,7 +318,7 @@ Read `.agents/developer-config.json`. If `name` or `project` is missing, AI asks
318
318
  - If not → AI asks once: *"Which MCPs are available in your workspace?"*
319
319
  - Only listed MCPs will be used.
320
320
 
321
- **Step 0c — Set developer scope**
321
+ **Developer scope** (`references/onboarding.md`)
322
322
  - If `developerPreferences.scope` already exists → use it directly
323
323
  - If not → AI asks once:
324
324
  ```
@@ -329,7 +329,7 @@ Read `.agents/developer-config.json`. If `name` or `project` is missing, AI asks
329
329
  ```
330
330
  - This scope is enforced in every phase: AI will not create/change files outside the scope.
331
331
 
332
- **Step 1b — Choose work mode**
332
+ **Work mode** (`references/onboarding.md`)
333
333
  - If `developerPreferences.workMode` already exists → use it directly
334
334
  - If not → AI asks once:
335
335
  ```
@@ -344,7 +344,7 @@ Read `.agents/developer-config.json`. If `name` or `project` is missing, AI asks
344
344
  status: done ← when code-review is complete
345
345
  ```
346
346
 
347
- **Step 2 — Select relevant specs + enforce scope**
347
+ **Selecting relevant specs** (`references/execute-task.md`)
348
348
 
349
349
  | Condition | Read |
350
350
  |---------|--------|
@@ -356,7 +356,7 @@ Read `.agents/developer-config.json`. If `name` or `project` is missing, AI asks
356
356
 
357
357
  Scope enforcement: if `scope=frontend`, AI does not touch backend files. If `scope=backend`, AI does not touch frontend files.
358
358
 
359
- **Step 3 — Execute tasks one by one**
359
+ **Executing tasks** (`references/execute-task.md`)
360
360
 
361
361
  For each task:
362
362
  1. Understand the task and acceptance criteria
@@ -376,7 +376,7 @@ Developer loads workflow references by state, not all at once:
376
376
  - `execute-task.md` only for the current task
377
377
  - `close-phase.md` only when closing a phase/project
378
378
 
379
- **Step 4 After all tasks in the phase are complete**
379
+ **Closing a phase** (`references/close-phase.md`)
380
380
  1. Show a phase summary
381
381
  2. Verify the applicable Phase Definition of Done; mark genuine non-applicable items with a reason
382
382
  3. If there is a plan file for this phase → update plan status: `in-progress` → `code-review`
@@ -920,7 +920,7 @@ The updater uses the MACCA files inside `.agents/` to know which installed skill
920
920
 
921
921
  > `project-context/` and `developer-config.json` are **not touched** during upgrade.
922
922
 
923
- `2.0.0` is a major release because skill naming, workflow contracts, progressive disclosure, and release checks changed. The published `1.1.0` OpenCode layout is covered by an automated upgrade test. For reproducible CI/bootstrap, pin the desired version; for interactive upgrades, use `@latest` as shown above.
923
+ `2.0.x` is the major-release line for the skill naming, workflow contract, progressive disclosure, and release-check changes. The published `1.1.0` OpenCode layout is covered by an automated upgrade test. For reproducible CI/bootstrap, pin the desired version; for interactive upgrades, use `@latest` as shown above.
924
924
 
925
925
  ### How to Call a Skill
926
926
 
@@ -1051,14 +1051,14 @@ The `.agents/developer-config.json` file is shared config across skills. All ski
1051
1051
  | `name` | `developer` (Step 0) | Asked once |
1052
1052
  | `project` | `developer` (Step 0) | Asked once |
1053
1053
  | `languagePreferences` | installer / first skill | Communication language and document language |
1054
- | `developerPreferences.workMode` | `developer` (Step 1b) | `"direct"` or `"plan-first"` |
1055
- | `developerPreferences.scope` | `developer` (Step 0c) | `"frontend"`, `"backend"`, or `"fullstack"` |
1054
+ | `developerPreferences.workMode` | `developer` (`references/onboarding.md` § Work Mode) | `"direct"` or `"plan-first"` |
1055
+ | `developerPreferences.scope` | `developer` (`references/onboarding.md` § Developer Scope) | `"frontend"`, `"backend"`, or `"fullstack"` |
1056
1056
  | `brainstormPreferences.discussionMode` | brainstorm-* skills | `"one-by-one"`, `"three-at-a-time"`, or `"all-at-once"` |
1057
1057
  | `brainstormPreferences.recommendations` | brainstorm-* skills | `true` = AI gives suggested answers for each question |
1058
1058
  | `brainstormPreferences.discoveryDepth` | brainstorm-* skills | `"quick"`, `"standard"`, or `"critical"`; inferred when absent, user-overridable |
1059
1059
  | `codeReviewPreferences.fixMode` | user / config runtime | `"report-first"` or `"fix-then-report"` |
1060
- | `additionalSkills` | `developer` (Step 0b) | AI searches for the path in the workspace first, then asks only if it is not found |
1061
- | `availableMCPs` | `developer` (Step 0b) | Available MCPs; only listed MCPs are used |
1060
+ | `additionalSkills` | `developer` (`references/onboarding.md` § Additional Skills and MCPs) | AI searches for the path in the workspace first, then asks only if it is not found |
1061
+ | `availableMCPs` | `developer` (`references/onboarding.md` § Additional Skills and MCPs) | Available MCPs; only listed MCPs are used |
1062
1062
 
1063
1063
  **Rule:** all skills must **merge**, not overwrite the file. Unknown fields must be preserved.
1064
1064
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "macca-method",
3
- "version": "2.0.0",
3
+ "version": "2.1.1",
4
4
  "description": "CLI installer for MACCA AI spec-driven development skills.",
5
5
  "license": "MIT",
6
6
  "scripts": {
@@ -10,7 +10,7 @@ const { execFileSync } = require("node:child_process");
10
10
 
11
11
  const rootDir = path.resolve(__dirname, "..");
12
12
  const mode = process.argv.includes("--published") ? "published" : "local";
13
- const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "macca-test-install-"));
13
+ const tmpDir = fs.mkdtempSync(path.join(resolveTempRoot(), "macca-test-install-"));
14
14
  const projectDir = path.join(tmpDir, "project");
15
15
  const collisionDir = path.join(tmpDir, "collision-project");
16
16
  const symlinkDir = path.join(tmpDir, "symlink-project");
@@ -18,7 +18,39 @@ const driftDir = path.join(tmpDir, "drift-project");
18
18
  let packageSpec = "macca-method";
19
19
 
20
20
  function commandName(base) {
21
- return process.platform === "win32" ? `${base}.cmd` : base;
21
+ if (process.platform !== "win32") {
22
+ return base;
23
+ }
24
+
25
+ return base === "npm" || base === "npx" ? `${base}.cmd` : base;
26
+ }
27
+
28
+ function resolveTempRoot() {
29
+ const tempRoot = os.tmpdir();
30
+ try {
31
+ return fs.realpathSync(tempRoot);
32
+ } catch {
33
+ return tempRoot;
34
+ }
35
+ }
36
+
37
+ function runNpm(args, options = {}) {
38
+ const npmExecPath = process.env.npm_execpath;
39
+ if (npmExecPath && /\.c?js$/i.test(npmExecPath)) {
40
+ return capture(process.execPath, [npmExecPath, ...args], options);
41
+ }
42
+
43
+ return capture(commandName("npm"), args, options);
44
+ }
45
+
46
+ function runNpmWithInheritedStdio(args, options = {}) {
47
+ const npmExecPath = process.env.npm_execpath;
48
+ if (npmExecPath && /\.c?js$/i.test(npmExecPath)) {
49
+ run(process.execPath, [npmExecPath, ...args], options);
50
+ return;
51
+ }
52
+
53
+ run(commandName("npm"), args, options);
22
54
  }
23
55
 
24
56
  function run(command, args, options = {}) {
@@ -39,22 +71,22 @@ function capture(command, args, options = {}) {
39
71
 
40
72
  function runCli(args) {
41
73
  if (mode === "published") {
42
- run(commandName("npx"), ["--yes", "macca-method", ...args]);
74
+ runNpmWithInheritedStdio(["exec", "--yes", "--package", "macca-method", "--", "macca-method", ...args]);
43
75
  return;
44
76
  }
45
77
 
46
- run(commandName("npx"), ["--yes", "--package", packageSpec, "macca-method", ...args]);
78
+ runNpmWithInheritedStdio(["exec", "--yes", "--package", packageSpec, "--", "macca-method", ...args]);
47
79
  }
48
80
 
49
81
  function expectCliFailure(args, expectedText) {
50
82
  try {
51
83
  if (mode === "published") {
52
- capture(commandName("npx"), ["--yes", "macca-method", ...args], { cwd: rootDir, stdio: "pipe" });
84
+ runNpm(["exec", "--yes", "--package", "macca-method", "--", "macca-method", ...args], { cwd: rootDir, stdio: "pipe" });
53
85
  } else {
54
- capture(commandName("npx"), ["--yes", "--package", packageSpec, "macca-method", ...args], { cwd: rootDir, stdio: "pipe" });
86
+ runNpm(["exec", "--yes", "--package", packageSpec, "--", "macca-method", ...args], { cwd: rootDir, stdio: "pipe" });
55
87
  }
56
88
  } catch (error) {
57
- const output = `${error.stdout || ""}${error.stderr || ""}`;
89
+ const output = `${error.stdout || ""}${error.stderr || ""}${error.message || ""}`;
58
90
  if (!output.includes(expectedText)) {
59
91
  throw new Error(`Expected failed command to include ${expectedText}, got: ${output}`);
60
92
  }
@@ -109,7 +141,7 @@ function ensureExpectedTools(filePath) {
109
141
  }
110
142
 
111
143
  function resolveLocalPackage() {
112
- const packOutput = capture(commandName("npm"), ["pack", "--json", "--pack-destination", tmpDir]);
144
+ const packOutput = runNpm(["pack", "--json", "--pack-destination", tmpDir]);
113
145
  const packageList = JSON.parse(packOutput);
114
146
 
115
147
  if (!Array.isArray(packageList) || packageList.length === 0 || !packageList[0].filename) {
@@ -8,12 +8,44 @@ const path = require("node:path");
8
8
  const { execFileSync } = require("node:child_process");
9
9
 
10
10
  const rootDir = path.resolve(__dirname, "..");
11
- const temporaryRoot = fs.mkdtempSync(path.join(os.tmpdir(), "macca-legacy-upgrade-"));
11
+ const temporaryRoot = fs.mkdtempSync(path.join(resolveTempRoot(), "macca-legacy-upgrade-"));
12
12
  const projectDir = path.join(temporaryRoot, "project");
13
13
  const obsoleteMeetingName = Buffer.from("cmFwYXQ=", "base64").toString("utf8");
14
14
 
15
15
  function commandName(base) {
16
- return process.platform === "win32" ? `${base}.cmd` : base;
16
+ if (process.platform !== "win32") {
17
+ return base;
18
+ }
19
+
20
+ return base === "npm" || base === "npx" ? `${base}.cmd` : base;
21
+ }
22
+
23
+ function resolveTempRoot() {
24
+ const tempRoot = os.tmpdir();
25
+ try {
26
+ return fs.realpathSync(tempRoot);
27
+ } catch {
28
+ return tempRoot;
29
+ }
30
+ }
31
+
32
+ function captureNpm(args, options = {}) {
33
+ const npmExecPath = process.env.npm_execpath;
34
+ if (npmExecPath && /\.c?js$/i.test(npmExecPath)) {
35
+ return capture(process.execPath, [npmExecPath, ...args], options);
36
+ }
37
+
38
+ return capture(commandName("npm"), args, options);
39
+ }
40
+
41
+ function runNpm(args, options = {}) {
42
+ const npmExecPath = process.env.npm_execpath;
43
+ if (npmExecPath && /\.c?js$/i.test(npmExecPath)) {
44
+ run(process.execPath, [npmExecPath, ...args], options);
45
+ return;
46
+ }
47
+
48
+ run(commandName("npm"), args, options);
17
49
  }
18
50
 
19
51
  function run(command, args, options = {}) {
@@ -43,7 +75,7 @@ function assertMissing(targetPath) {
43
75
  try {
44
76
  fs.mkdirSync(projectDir, { recursive: true });
45
77
 
46
- const legacyPackOutput = capture(commandName("npm"), [
78
+ const legacyPackOutput = captureNpm([
47
79
  "pack",
48
80
  "macca-method@1.1.0",
49
81
  "--json",
@@ -53,10 +85,12 @@ try {
53
85
  const legacyPackageList = JSON.parse(legacyPackOutput);
54
86
  const legacyPackageSpec = path.join(temporaryRoot, legacyPackageList[0].filename);
55
87
 
56
- run(commandName("npx"), [
88
+ runNpm([
89
+ "exec",
57
90
  "--yes",
58
91
  "--package",
59
92
  legacyPackageSpec,
93
+ "--",
60
94
  "macca-method",
61
95
  "install",
62
96
  "--yes",
@@ -77,14 +111,16 @@ try {
77
111
  const legacyRoot = path.join(projectDir, ".opencode", "skill");
78
112
  assertExists(path.join(legacyRoot, obsoleteMeetingName, "SKILL.md"));
79
113
 
80
- const packOutput = capture(commandName("npm"), ["pack", "--json", "--pack-destination", temporaryRoot]);
114
+ const packOutput = captureNpm(["pack", "--json", "--pack-destination", temporaryRoot]);
81
115
  const packageList = JSON.parse(packOutput);
82
116
  const packageSpec = path.join(temporaryRoot, packageList[0].filename);
83
117
 
84
- run(commandName("npx"), [
118
+ runNpm([
119
+ "exec",
85
120
  "--yes",
86
121
  "--package",
87
122
  packageSpec,
123
+ "--",
88
124
  "macca-method",
89
125
  "upgrade",
90
126
  "--directory",