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.
- package/.agents/macca-lock.json +1 -1
- package/.agents/skills/_shared/references/fix-mode.md +18 -3
- package/.agents/skills/_shared/references/human-loop.md +1 -1
- package/.agents/skills/_shared/references/language-config.md +7 -5
- package/.agents/skills/add-feature/SKILL.md +2 -0
- package/.agents/skills/brainstorm-api/SKILL.md +5 -3
- package/.agents/skills/brainstorm-architecture/SKILL.md +5 -3
- package/.agents/skills/brainstorm-prd/SKILL.md +5 -3
- package/.agents/skills/brainstorm-rules/SKILL.md +2 -2
- package/.agents/skills/brainstorm-schema/SKILL.md +5 -3
- package/.agents/skills/brainstorm-styleguide/SKILL.md +2 -2
- package/.agents/skills/brainstorm-task/SKILL.md +2 -0
- package/.agents/skills/bug-fix/SKILL.md +14 -7
- package/.agents/skills/code-review/SKILL.md +2 -0
- package/.agents/skills/developer/SKILL.md +2 -0
- package/.agents/skills/developer/references/onboarding.md +1 -1
- package/.agents/skills/help/SKILL.md +7 -3
- package/.agents/skills/meet/SKILL.md +2 -0
- package/.agents/skills/quick-dev/SKILL.md +5 -3
- package/.agents/skills/release-readiness/SKILL.md +2 -0
- package/.agents/skills/spec-audit/SKILL.md +5 -3
- package/.agents/skills/spec-compliance/SKILL.md +5 -3
- package/.agents/skills/spec-init/SKILL.md +2 -0
- package/README.md +11 -11
- package/package.json +1 -1
- package/scripts/test-install.js +40 -8
- package/scripts/test-upgrade-legacy.js +42 -6
package/.agents/macca-lock.json
CHANGED
|
@@ -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
|
|
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.
|
|
33
|
-
|
|
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,
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
13
|
-
- English: `english`, `en`
|
|
12
|
+
Match `raw` or `normalized` case-insensitively against these equivalents (same mapping the installer's `normalizeLanguage()` uses):
|
|
14
13
|
|
|
15
|
-
|
|
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
|
-
|
|
44
|
-
|
|
45
|
-
|
|
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
|
-
|
|
44
|
-
|
|
45
|
-
|
|
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
|
-
|
|
44
|
-
|
|
45
|
-
|
|
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:**
|
|
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
|
-
|
|
44
|
-
|
|
45
|
-
|
|
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:**
|
|
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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
|
112
|
+
### 2c. Explain the diagnosis and propose the fix - one response
|
|
111
113
|
|
|
112
|
-
MUST use EXACTLY these
|
|
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
|
-
|
|
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
|
-
-
|
|
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
|
|
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
|
-
|
|
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
|
-
-
|
|
50
|
-
- If
|
|
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`
|
|
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
|
|
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
|
|
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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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
|
-
**
|
|
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
|
-
**
|
|
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
|
-
**
|
|
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
|
-
**
|
|
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
|
-
**
|
|
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
|
-
**
|
|
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.
|
|
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` (
|
|
1055
|
-
| `developerPreferences.scope` | `developer` (
|
|
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` (
|
|
1061
|
-
| `availableMCPs` | `developer` (
|
|
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
package/scripts/test-install.js
CHANGED
|
@@ -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(
|
|
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
|
-
|
|
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
|
-
|
|
74
|
+
runNpmWithInheritedStdio(["exec", "--yes", "--package", "macca-method", "--", "macca-method", ...args]);
|
|
43
75
|
return;
|
|
44
76
|
}
|
|
45
77
|
|
|
46
|
-
|
|
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
|
-
|
|
84
|
+
runNpm(["exec", "--yes", "--package", "macca-method", "--", "macca-method", ...args], { cwd: rootDir, stdio: "pipe" });
|
|
53
85
|
} else {
|
|
54
|
-
|
|
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 =
|
|
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(
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
118
|
+
runNpm([
|
|
119
|
+
"exec",
|
|
85
120
|
"--yes",
|
|
86
121
|
"--package",
|
|
87
122
|
packageSpec,
|
|
123
|
+
"--",
|
|
88
124
|
"macca-method",
|
|
89
125
|
"upgrade",
|
|
90
126
|
"--directory",
|