macca-method 1.1.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/legacy-payloads.json +22 -0
- package/{skills-lock.json → .agents/macca-lock.json} +3 -2
- package/.agents/macca-managed-skills.txt +2 -1
- package/.agents/skills/_shared/references/additional-skills.md +30 -0
- package/.agents/skills/_shared/references/brainstorm-session.md +42 -11
- package/.agents/skills/_shared/references/config-mutation.md +25 -0
- package/.agents/skills/_shared/references/finding-format.md +25 -0
- package/.agents/skills/_shared/references/fix-mode.md +54 -0
- package/.agents/skills/_shared/references/human-loop.md +3 -1
- package/.agents/skills/_shared/references/implementation-principles.md +19 -0
- package/.agents/skills/_shared/references/invocation-policy.md +39 -0
- package/.agents/skills/_shared/references/language-config.md +17 -0
- package/.agents/skills/_shared/references/output-ownership.md +4 -2
- package/.agents/skills/_shared/references/runtime-config.md +7 -168
- package/.agents/skills/_shared/references/skill-catalog.md +34 -0
- package/.agents/skills/_shared/scripts/validate-skills.py +106 -4
- package/.agents/skills/add-feature/SKILL.md +12 -7
- package/.agents/skills/brainstorm-api/SKILL.md +53 -196
- package/.agents/skills/brainstorm-api/assets/api.template.md +147 -0
- package/.agents/skills/brainstorm-architecture/SKILL.md +26 -129
- package/.agents/skills/brainstorm-architecture/assets/architecture.template.md +135 -0
- package/.agents/skills/brainstorm-prd/SKILL.md +23 -104
- package/.agents/skills/brainstorm-prd/assets/PRD.template.md +106 -0
- package/.agents/skills/brainstorm-rules/SKILL.md +19 -153
- package/.agents/skills/brainstorm-rules/assets/rules.template.md +127 -0
- package/.agents/skills/brainstorm-schema/SKILL.md +53 -117
- package/.agents/skills/brainstorm-schema/assets/schema.template.md +109 -0
- package/.agents/skills/brainstorm-styleguide/SKILL.md +21 -136
- package/.agents/skills/brainstorm-styleguide/assets/StyleGuide.template.md +147 -0
- package/.agents/skills/brainstorm-task/SKILL.md +24 -107
- package/.agents/skills/brainstorm-task/assets/Task.template.md +113 -0
- package/.agents/skills/bug-fix/SKILL.md +54 -56
- package/.agents/skills/code-review/SKILL.md +28 -19
- package/.agents/skills/code-review/references/review-checklist.md +24 -26
- package/.agents/skills/developer/SKILL.md +27 -39
- package/.agents/skills/developer/references/close-phase.md +25 -0
- package/.agents/skills/developer/references/execute-task.md +69 -0
- package/.agents/skills/developer/references/onboarding.md +47 -0
- package/.agents/skills/help/SKILL.md +19 -16
- package/.agents/skills/meet/SKILL.md +170 -0
- package/.agents/skills/quick-dev/SKILL.md +32 -34
- package/.agents/skills/release-readiness/SKILL.md +151 -0
- package/.agents/skills/spec-audit/SKILL.md +39 -22
- package/.agents/skills/spec-compliance/SKILL.md +43 -40
- package/.agents/skills/spec-init/SKILL.md +31 -14
- package/README.md +181 -132
- package/bin/macca-method.js +779 -85
- package/flow.webp +0 -0
- package/image-macca-method.webp +0 -0
- package/package.json +12 -5
- package/scripts/run-skill-validator.js +24 -0
- package/scripts/test-install.js +430 -0
- package/scripts/test-upgrade-legacy.js +143 -0
- package/scripts/validate-skill-behavior.js +124 -0
- package/.agents/skills/developer/references/execution-workflow.md +0 -322
- package/.agents/skills/rapat/SKILL.md +0 -172
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
"use strict";
|
|
4
|
+
|
|
5
|
+
const fs = require("node:fs");
|
|
6
|
+
const path = require("node:path");
|
|
7
|
+
|
|
8
|
+
const root = path.resolve(__dirname, "..");
|
|
9
|
+
const skillsDir = path.join(root, ".agents", "skills");
|
|
10
|
+
const manifestPath = path.join(root, ".agents", "macca-managed-skills.txt");
|
|
11
|
+
const invocationPath = path.join(skillsDir, "_shared", "references", "invocation-policy.md");
|
|
12
|
+
const issues = [];
|
|
13
|
+
|
|
14
|
+
function read(relativePath) {
|
|
15
|
+
return fs.readFileSync(path.join(root, relativePath), "utf8");
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function requireText(file, text, message) {
|
|
19
|
+
if (!file.includes(text)) issues.push(message);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const managed = fs.readFileSync(manifestPath, "utf8").split(/\r?\n/).map((line) => line.trim()).filter(Boolean);
|
|
23
|
+
const publicSkills = fs.readdirSync(skillsDir, { withFileTypes: true })
|
|
24
|
+
.filter((entry) => entry.isDirectory() && entry.name !== "_shared" && fs.existsSync(path.join(skillsDir, entry.name, "SKILL.md")))
|
|
25
|
+
.map((entry) => entry.name)
|
|
26
|
+
.sort();
|
|
27
|
+
const manifestSkills = managed.filter((name) => name !== "_shared").sort();
|
|
28
|
+
|
|
29
|
+
if (JSON.stringify(publicSkills) !== JSON.stringify(manifestSkills)) {
|
|
30
|
+
issues.push(`manifest/folder mismatch: folders=${publicSkills.join(",")} manifest=${manifestSkills.join(",")}`);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const invocation = fs.readFileSync(invocationPath, "utf8");
|
|
34
|
+
for (const skill of publicSkills) {
|
|
35
|
+
if (!invocation.includes(`\`${skill}\``)) issues.push(`invocation policy missing ${skill}`);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const meet = read(".agents/skills/meet/SKILL.md");
|
|
39
|
+
requireText(meet, "exactly one contribution block", "meet must limit each selected persona to one contribution");
|
|
40
|
+
requireText(meet, "No persona gets a second response", "meet must prohibit second persona turns");
|
|
41
|
+
|
|
42
|
+
const quick = read(".agents/skills/quick-dev/SKILL.md");
|
|
43
|
+
requireText(quick, "active report-first gate", "quick-dev must not intercept active report-first approval");
|
|
44
|
+
|
|
45
|
+
for (const skill of ["bug-fix", "code-review", "spec-compliance", "spec-audit"]) {
|
|
46
|
+
const body = read(`.agents/skills/${skill}/SKILL.md`);
|
|
47
|
+
requireText(body, "fix-mode.md", `${skill} must load the canonical fix-mode contract`);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const bugFix = read(".agents/skills/bug-fix/SKILL.md");
|
|
51
|
+
requireText(bugFix, "Always wait for explicit user approval before the first code change", "bug-fix must require explicit approval before first code change");
|
|
52
|
+
requireText(bugFix, "Validate Regression Prevention", "bug-fix must validate regression-prevention changes before recording the bug");
|
|
53
|
+
|
|
54
|
+
const release = read(".agents/skills/release-readiness/SKILL.md");
|
|
55
|
+
requireText(release, "report-only", "release-readiness must remain report-only");
|
|
56
|
+
requireText(release, "Never deploys", "release-readiness description must prohibit deployment");
|
|
57
|
+
|
|
58
|
+
const brainstormSession = read(".agents/skills/_shared/references/brainstorm-session.md");
|
|
59
|
+
for (const depth of ["quick", "standard", "critical"]) {
|
|
60
|
+
requireText(brainstormSession, `\`${depth}\``, `brainstorm session must define ${depth} discovery depth`);
|
|
61
|
+
}
|
|
62
|
+
requireText(brainstormSession, "escalate the active depth to `critical`", "brainstorm session must escalate saved depth when current evidence is critical");
|
|
63
|
+
|
|
64
|
+
const requiredAssets = [
|
|
65
|
+
["brainstorm-prd", "PRD.template.md"],
|
|
66
|
+
["brainstorm-architecture", "architecture.template.md"],
|
|
67
|
+
["brainstorm-schema", "schema.template.md"],
|
|
68
|
+
["brainstorm-api", "api.template.md"],
|
|
69
|
+
["brainstorm-styleguide", "StyleGuide.template.md"],
|
|
70
|
+
["brainstorm-rules", "rules.template.md"],
|
|
71
|
+
["brainstorm-task", "Task.template.md"]
|
|
72
|
+
];
|
|
73
|
+
for (const [skill, asset] of requiredAssets) {
|
|
74
|
+
const assetPath = path.join(skillsDir, skill, "assets", asset);
|
|
75
|
+
if (!fs.existsSync(assetPath)) issues.push(`${skill} missing deferred output asset ${asset}`);
|
|
76
|
+
const body = read(`.agents/skills/${skill}/SKILL.md`);
|
|
77
|
+
requireText(body, `assets/${asset}`, `${skill} must defer-load ${asset}`);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
requireText(read(".agents/skills/spec-init/SKILL.md"), "## Missing Decisions", "spec-init must record missing decisions");
|
|
81
|
+
requireText(read(".agents/skills/brainstorm-task/SKILL.md"), "Definition of Done", "brainstorm-task must derive phase Definition of Done");
|
|
82
|
+
requireText(read(".agents/skills/developer/SKILL.md"), "references/execute-task.md", "developer must use state-based task workflow");
|
|
83
|
+
requireText(read(".agents/skills/spec-audit/SKILL.md"), "skill-catalog.md", "framework audit must use compact skill catalog first");
|
|
84
|
+
|
|
85
|
+
const apiAsset = read(".agents/skills/brainstorm-api/assets/api.template.md");
|
|
86
|
+
for (const marker of [
|
|
87
|
+
"## REST Section",
|
|
88
|
+
"## GraphQL Section",
|
|
89
|
+
"## RPC / tRPC Section",
|
|
90
|
+
"## Event-Driven Section",
|
|
91
|
+
"Retryable",
|
|
92
|
+
"Client Action"
|
|
93
|
+
]) {
|
|
94
|
+
requireText(apiAsset, marker, `api template missing ${marker}`);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const schemaAsset = read(".agents/skills/brainstorm-schema/assets/schema.template.md");
|
|
98
|
+
for (const marker of [
|
|
99
|
+
"## Relational Section",
|
|
100
|
+
"## Document Section",
|
|
101
|
+
"## Key-Value Section",
|
|
102
|
+
"## Graph Section",
|
|
103
|
+
"## Event Store Section"
|
|
104
|
+
]) {
|
|
105
|
+
requireText(schemaAsset, marker, `schema template missing ${marker}`);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const taskAsset = read(".agents/skills/brainstorm-task/assets/Task.template.md");
|
|
109
|
+
requireText(taskAsset, "## Phase 2: [Phase Name]", "task template missing a second phase example");
|
|
110
|
+
requireText(taskAsset, "Repeat the `Phase Definition of Done` block", "task template must require Definition of Done for every phase");
|
|
111
|
+
|
|
112
|
+
for (const skill of publicSkills) {
|
|
113
|
+
const body = read(`.agents/skills/${skill}/SKILL.md`);
|
|
114
|
+
if (body.includes("../_shared/references/runtime-config.md")) {
|
|
115
|
+
issues.push(`${skill} still loads monolithic runtime-config.md`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
if (issues.length) {
|
|
120
|
+
process.stderr.write(`Behavioral contract findings:\n${issues.map((issue) => `- ${issue}`).join("\n")}\n`);
|
|
121
|
+
process.exit(1);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
process.stdout.write(`OK: ${publicSkills.length} skill behavioral contracts validated\n`);
|
|
@@ -1,322 +0,0 @@
|
|
|
1
|
-
# Developer Execution Workflow
|
|
2
|
-
|
|
3
|
-
## Table of Contents
|
|
4
|
-
|
|
5
|
-
1. Step 0b - Check Additional Skills & MCP
|
|
6
|
-
2. Step 0c - Set Developer Scope
|
|
7
|
-
3. Step 1b - Choose Work Mode
|
|
8
|
-
4. Step 2 - Choose Relevant Specs
|
|
9
|
-
5. Step 3 - Execute Tasks One by One
|
|
10
|
-
6. Step 4 - After All Phase Tasks Are Complete
|
|
11
|
-
7. Step 5 - Project Complete
|
|
12
|
-
|
|
13
|
-
## Step 0b - Check Additional Skills & MCP
|
|
14
|
-
|
|
15
|
-
### Additional Skills
|
|
16
|
-
|
|
17
|
-
Check `additionalSkills` in `developer-config.json` first. If it exists, skip the question.
|
|
18
|
-
|
|
19
|
-
If it does not exist, ask once:
|
|
20
|
-
> "Do you use additional skills for this project? For example, framework-specific skills such as Laravel, Django, or Rails?"
|
|
21
|
-
|
|
22
|
-
**If no:** continue to the MCP section below.
|
|
23
|
-
|
|
24
|
-
**If yes:** ask:
|
|
25
|
-
> "How many? Name each one and briefly explain its purpose."
|
|
26
|
-
|
|
27
|
-
For each skill named by the user:
|
|
28
|
-
|
|
29
|
-
1. **Search the workspace first** in this order:
|
|
30
|
-
- `.agents/skills/{name}/SKILL.md`
|
|
31
|
-
- `.github/skills/{name}/SKILL.md`
|
|
32
|
-
- `.opencode/skill/{name}/SKILL.md`
|
|
33
|
-
- Any file named `{name}.md` or `SKILL.md` inside a folder matching the skill name
|
|
34
|
-
2. **If found:** fill the path automatically and tell the user: `"Found {path}. Using it."`
|
|
35
|
-
3. **If not found:** ask once per skill: `"I could not find SKILL.md for **{name}**. Where is it? (for example .agents/skills/name/SKILL.md) - or type 'skip' to register it without a path for now."`
|
|
36
|
-
4. Save it to `.agents/developer-config.json` using the canonical `paths` format from `../_shared/references/runtime-config.md`. Still read legacy fields such as `path`, `githubPath`, and `opencodePath`.
|
|
37
|
-
5. **Coding rule:** When writing code relevant to a listed skill, read that skill's `SKILL.md` first. This is mandatory. If a relevant skill has no path, note that it cannot be auto-loaded.
|
|
38
|
-
|
|
39
|
-
### Available MCPs
|
|
40
|
-
|
|
41
|
-
Check `availableMCPs` in `developer-config.json` first. If it exists, skip the question.
|
|
42
|
-
|
|
43
|
-
If it does not exist, ask once:
|
|
44
|
-
> "Which MCPs are available in your workspace? (for example context7, supabase, github - or type 'none')"
|
|
45
|
-
|
|
46
|
-
Save the answer to `.agents/developer-config.json`:
|
|
47
|
-
|
|
48
|
-
```json
|
|
49
|
-
{ "availableMCPs": ["context7", "supabase"] }
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
If it is already configured, show: `[MCPs: context7, supabase] - tell me now if you want to change it.`
|
|
53
|
-
|
|
54
|
-
**Usage rule:** Use only MCPs listed in `availableMCPs`. Skip silently if none of them help the current task.
|
|
55
|
-
|
|
56
|
-
---
|
|
57
|
-
|
|
58
|
-
## Step 0c - Set Developer Scope
|
|
59
|
-
|
|
60
|
-
Check `developerPreferences.scope` in `developer-config.json` first. If it exists, skip the question. Show: `[Scope: frontend / backend / fullstack] - tell me now if you want to change it.`
|
|
61
|
-
|
|
62
|
-
If it is missing, ask once:
|
|
63
|
-
|
|
64
|
-
```text
|
|
65
|
-
What is your scope on this project?
|
|
66
|
-
|
|
67
|
-
A) Frontend only - I do not touch backend/API/database code
|
|
68
|
-
B) Backend only - I do not touch UI/frontend code
|
|
69
|
-
C) Fullstack - I work across the whole stack
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
Save to `.agents/developer-config.json`:
|
|
73
|
-
- A -> `developerPreferences.scope = "frontend"`
|
|
74
|
-
- B -> `developerPreferences.scope = "backend"`
|
|
75
|
-
- C -> `developerPreferences.scope = "fullstack"`
|
|
76
|
-
|
|
77
|
-
## Step 1b - Choose Work Mode
|
|
78
|
-
|
|
79
|
-
Check `.agents/developer-config.json` for `developerPreferences.workMode`:
|
|
80
|
-
- If it exists, skip the question. Show: `[A/B] [mode name]. Using this for this session. Tell me now if you want to change it.`
|
|
81
|
-
- If it is missing, offer both options and save the choice while preserving other fields:
|
|
82
|
-
|
|
83
|
-
```text
|
|
84
|
-
Before I start, what do you prefer?
|
|
85
|
-
|
|
86
|
-
A) Code now - start immediately
|
|
87
|
-
Best for: small phases, clear tasks, or no pre-review needed
|
|
88
|
-
|
|
89
|
-
B) Plan first, then code - write a plan for your review first
|
|
90
|
-
Best for: larger phases, high risk of going in the wrong direction, or when you want a scope review
|
|
91
|
-
|
|
92
|
-
Choose A or B.
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
### A or workMode="direct"
|
|
96
|
-
|
|
97
|
-
Save `workMode = "direct"` to the config, then go to **Step 2**.
|
|
98
|
-
|
|
99
|
-
### B or workMode="plan-first"
|
|
100
|
-
|
|
101
|
-
Save `workMode = "plan-first"`, then:
|
|
102
|
-
|
|
103
|
-
1. Read the relevant specs (especially `project-context/architecture.md` and `project-context/PRD.md`).
|
|
104
|
-
2. Create a plan file at `project-context/plans/phase-[N]-[slug].md` with this header:
|
|
105
|
-
```
|
|
106
|
-
---
|
|
107
|
-
status: review
|
|
108
|
-
phase: [N]
|
|
109
|
-
created: [YYYY-MM-DD]
|
|
110
|
-
---
|
|
111
|
-
```
|
|
112
|
-
3. Review the plan internally against `Task.md`, `architecture.md`, and `rules.md`.
|
|
113
|
-
4. Show the draft to the user and wait for `start` before coding.
|
|
114
|
-
5. When the user types `start`, update the plan header: `status: review` -> `status: in-progress`.
|
|
115
|
-
|
|
116
|
-
Use this minimum plan template:
|
|
117
|
-
|
|
118
|
-
```markdown
|
|
119
|
-
---
|
|
120
|
-
status: review
|
|
121
|
-
phase: [N]
|
|
122
|
-
created: [YYYY-MM-DD]
|
|
123
|
-
---
|
|
124
|
-
|
|
125
|
-
# Phase [N] Plan - [Name]
|
|
126
|
-
|
|
127
|
-
## Goal
|
|
128
|
-
- [phase goal]
|
|
129
|
-
|
|
130
|
-
## Scope
|
|
131
|
-
- [main scope]
|
|
132
|
-
|
|
133
|
-
## Files
|
|
134
|
-
- `[path/file]` - [why it is touched]
|
|
135
|
-
|
|
136
|
-
## Risks
|
|
137
|
-
- [risk 1]
|
|
138
|
-
|
|
139
|
-
## Validation
|
|
140
|
-
- [main test/check]
|
|
141
|
-
```
|
|
142
|
-
|
|
143
|
-
## Step 2 - Choose Relevant Specs
|
|
144
|
-
|
|
145
|
-
**Preflight:** Before coding, verify that `project-context/` contains:
|
|
146
|
-
- `architecture.md` -> **required**. If it is missing, **stop** and ask the user to run `brainstorm-architecture` first.
|
|
147
|
-
- `rules.md` -> optional. If it is missing, note that code standards cannot be verified in this phase.
|
|
148
|
-
- Others (`schema.md`, `api.md`, `StyleGuide.md`, `PRD.md`) -> optional. If the task needs them and they are missing, warn and note the verification gap.
|
|
149
|
-
|
|
150
|
-
**After confirming the specs exist**, read only what the task needs:
|
|
151
|
-
|
|
152
|
-
| Condition | Read |
|
|
153
|
-
|-----------|------|
|
|
154
|
-
| All tasks (always) | `project-context/rules.md`, `project-context/architecture.md` |
|
|
155
|
-
| Task touches database/models | + `project-context/schema.md` |
|
|
156
|
-
| Task touches API/service endpoints | + `project-context/api.md` |
|
|
157
|
-
| Task touches UI/pages/components | + `project-context/StyleGuide.md` |
|
|
158
|
-
| Feature/requirement is unclear | + `project-context/PRD.md` |
|
|
159
|
-
|
|
160
|
-
**Scope enforcement:** After choosing specs, read `developerPreferences.scope` from `developer-config.json` and use `architecture.md` as the primary boundary. The folder list below is only a fallback when `architecture.md` is not specific enough:
|
|
161
|
-
|
|
162
|
-
| Scope | Restriction |
|
|
163
|
-
|-------|-------------|
|
|
164
|
-
| `frontend` | Do not write or modify backend files per `architecture.md`; fallback: avoid `routes/`, `controllers/`, `services/`, `repositories/`, `migrations/`, `database/`. If the task requires backend changes, stop and tell the user. |
|
|
165
|
-
| `backend` | Do not write or modify frontend files per `architecture.md`; fallback: avoid `components/`, `pages/`, `views/`, `styles/`, `public/`. If the task requires frontend changes, stop and tell the user. |
|
|
166
|
-
| `fullstack` | No restriction. |
|
|
167
|
-
| *(missing)* | Treat it as `fullstack`. |
|
|
168
|
-
|
|
169
|
-
**When reading `rules.md`:** scan `[FORBIDDEN]` first before any coding. If the section does not exist, continue without blocking.
|
|
170
|
-
|
|
171
|
-
## Step 3 - Execute Tasks One by One
|
|
172
|
-
|
|
173
|
-
### 3a. Understand the Task
|
|
174
|
-
- Read the task and acceptance criteria carefully
|
|
175
|
-
- Understand what is requested and what “done” means
|
|
176
|
-
- Climb the ladder from the main skill file after reading the task
|
|
177
|
-
- If it is complex or unclear, ask one focused clarification question
|
|
178
|
-
|
|
179
|
-
**MUST:** check whether this task touches something NOT recorded in `project-context/`.
|
|
180
|
-
|
|
181
|
-
If it does:
|
|
182
|
-
- DO NOT leave the `developer` flow
|
|
183
|
-
- DO NOT ask the user to restart in another skill
|
|
184
|
-
- DO NOT code without recording it first
|
|
185
|
-
- MUST record it as an **approved scope delta** in the active phase plan so `spec-compliance` and `spec-audit` can treat it as temporary official scope for the active phase
|
|
186
|
-
|
|
187
|
-
```text
|
|
188
|
-
---
|
|
189
|
-
I need confirmation before continuing.
|
|
190
|
-
|
|
191
|
-
This request touches [feature/data/endpoint/component] that is not yet recorded in project-context/.
|
|
192
|
-
If I continue without recording it, spec-compliance will mark it as a violation.
|
|
193
|
-
|
|
194
|
-
I will record it first as an approved scope delta in the active phase plan, then continue in the same developer session.
|
|
195
|
-
|
|
196
|
-
Options:
|
|
197
|
-
1) Record the approved scope delta, then continue coding (recommended)
|
|
198
|
-
2) Cancel
|
|
199
|
-
---
|
|
200
|
-
```
|
|
201
|
-
|
|
202
|
-
Wait for the answer. If the user chooses 1:
|
|
203
|
-
1. Make sure an active phase plan file exists. If `workMode = "plan-first"`, use the active `project-context/plans/phase-[N]-*.md` file.
|
|
204
|
-
2. If `workMode = "direct"` and no plan file exists yet, MUST create a lightweight plan file for the active phase.
|
|
205
|
-
3. Add this section to the plan file:
|
|
206
|
-
|
|
207
|
-
```markdown
|
|
208
|
-
## Approved Scope Delta
|
|
209
|
-
|
|
210
|
-
**Approved:** [YYYY-MM-DD]
|
|
211
|
-
**Source:** User request in the active developer session
|
|
212
|
-
**Affected files/docs:** `[path/file]`, `project-context/[doc].md`
|
|
213
|
-
**Traceability:** `DELTA-[N]`
|
|
214
|
-
**Acceptance Criteria:**
|
|
215
|
-
- [ ] [testable condition 1]
|
|
216
|
-
- [ ] [testable condition 2]
|
|
217
|
-
**Sync requirement:** Update the relevant formal spec documents before phase close, or when the user requests formal spec sync.
|
|
218
|
-
```
|
|
219
|
-
|
|
220
|
-
4. After recording the delta, continue to Step 3b in the same session.
|
|
221
|
-
|
|
222
|
-
MUST NOT code something that is outside the specs without explicit user confirmation and an approved scope delta record.
|
|
223
|
-
|
|
224
|
-
### 3b. Clarify (if ambiguous)
|
|
225
|
-
|
|
226
|
-
Stop. Do not code yet. Ask one concrete question using the shared confirmation style from `../_shared/references/human-loop.md`.
|
|
227
|
-
|
|
228
|
-
### 3b.5 - I/O Contract (for non-trivial functions)
|
|
229
|
-
|
|
230
|
-
For functions with business logic, data transformation, calculations, or validation, write the I/O contract first:
|
|
231
|
-
|
|
232
|
-
```text
|
|
233
|
-
Function: [function_name(param1, param2)]
|
|
234
|
-
|
|
235
|
-
| Input | Expected Output |
|
|
236
|
-
|-------|------------------|
|
|
237
|
-
| [real example 1] | [output 1] |
|
|
238
|
-
| [real example 2] | [output 2] |
|
|
239
|
-
| [edge case] | [edge output] |
|
|
240
|
-
```
|
|
241
|
-
|
|
242
|
-
Skip this for simple getters, setters, or one-liners without real logic.
|
|
243
|
-
|
|
244
|
-
### 3c. Code
|
|
245
|
-
|
|
246
|
-
**MUST do this BEFORE writing a single line of code:**
|
|
247
|
-
|
|
248
|
-
1. **Additional Skills** - open `developer-config.json`, check `additionalSkills`. If any skill is relevant to this task, MUST read its `SKILL.md` now. The correct best practice lives there, not in memory.
|
|
249
|
-
2. **MCP** - open `developer-config.json`, check `availableMCPs`, then use every MCP relevant to the task. Examples: `context7` for external library docs, `codebase-memory-mcp` for codebase discovery. MUST NOT rely on memory for external library APIs when a relevant docs MCP exists.
|
|
250
|
-
3. **YAGNI Ladder** - run the ladder from the main `developer` skill. Confirm you are at the lowest valid step before writing code.
|
|
251
|
-
|
|
252
|
-
MUST NOT skip step 1 or 2 if they are available and relevant.
|
|
253
|
-
|
|
254
|
-
Detect the task type:
|
|
255
|
-
- **Test task**: write the test, then jump to validation
|
|
256
|
-
- **Implementation with existing test dependency**: use the existing test first
|
|
257
|
-
- **Standalone implementation**: follow TDD order
|
|
258
|
-
|
|
259
|
-
For standalone implementation:
|
|
260
|
-
1. Write the test first
|
|
261
|
-
2. Write the implementation
|
|
262
|
-
3. Verify logically that the test should pass
|
|
263
|
-
|
|
264
|
-
### 3c.5 - [SELF-REVIEW]
|
|
265
|
-
|
|
266
|
-
After the code is done, write:
|
|
267
|
-
|
|
268
|
-
```text
|
|
269
|
-
[SELF-REVIEW] Task: [name]
|
|
270
|
-
|
|
271
|
-
1. Security risk: [1 potential hole - or "none identified"]
|
|
272
|
-
2. Performance bottleneck: [1 area that may be slow at scale - or "none identified"]
|
|
273
|
-
3. Spec assumption: [1 assumption that was not stated - or "none"]
|
|
274
|
-
```
|
|
275
|
-
|
|
276
|
-
### 3c.6 - Validate the Task
|
|
277
|
-
|
|
278
|
-
Run the narrowest validation that proves the task is correct:
|
|
279
|
-
- test task -> run the test
|
|
280
|
-
- implementation with related test -> rerun that test
|
|
281
|
-
- config/wiring/refactor -> run the narrowest relevant check
|
|
282
|
-
- no executable validation -> document manual verification
|
|
283
|
-
|
|
284
|
-
If validation fails because of a local defect, fix it and rerun the same validation before continuing.
|
|
285
|
-
|
|
286
|
-
### 3d. Update `Task.md`
|
|
287
|
-
|
|
288
|
-
After validation passes:
|
|
289
|
-
1. Change `[ ]` -> `[x]` for the completed task
|
|
290
|
-
2. Change `[ ]` -> `[x]` for any satisfied acceptance criteria
|
|
291
|
-
3. Add `> Implementation:` only if a short note is important
|
|
292
|
-
|
|
293
|
-
### 3e. Brief Report to the User
|
|
294
|
-
|
|
295
|
-
Report:
|
|
296
|
-
- task completed
|
|
297
|
-
- files changed
|
|
298
|
-
- validation command/check and result
|
|
299
|
-
|
|
300
|
-
Then follow `Task.md § Execution Rules` to decide whether to continue automatically or pause.
|
|
301
|
-
|
|
302
|
-
## Step 4 - After All Phase Tasks Are Complete
|
|
303
|
-
|
|
304
|
-
1. Show the phase summary.
|
|
305
|
-
2. If a plan file exists for this phase (`project-context/plans/phase-[N]-*.md`), update its status: `in-progress` -> `code-review`.
|
|
306
|
-
3. Run `spec-compliance`. It follows `fixMode` from Shared Runtime Setup.
|
|
307
|
-
- **`fix-then-report`**: if clean -> continue to step 4. If issues were fixed -> rerun `spec-compliance` before continuing.
|
|
308
|
-
- **`report-first`**: if issues exist -> `spec-compliance` shows the gate prompt and ends its response. **DO NOT** run `code-review` in the same response. Wait for user confirmation.
|
|
309
|
-
4. Run `code-review`. It follows `fixMode` from Shared Runtime Setup.
|
|
310
|
-
- **`report-first`**: if issues exist -> `code-review` shows the gate prompt and ends its response. Do not offer the next phase in the same response.
|
|
311
|
-
5. If both pass, offer the next phase and wait for confirmation.
|
|
312
|
-
|
|
313
|
-
## Step 5 - Project Complete
|
|
314
|
-
|
|
315
|
-
When all phases are done and `Task.md` is complete:
|
|
316
|
-
1. Show the project summary.
|
|
317
|
-
2. Suggest a final `spec-audit` if needed.
|
|
318
|
-
3. If the user requests new changes that are still small and do not need `add-feature`, enter **Post-Task / Maintenance Mode**:
|
|
319
|
-
- create a small delta phase or delta task in `Task.md`
|
|
320
|
-
- if needed, create/update a lightweight plan file
|
|
321
|
-
- continue within the `developer` skill
|
|
322
|
-
4. If the change expands business scope significantly or adds a new primary artifact, route to `add-feature`.
|
|
@@ -1,172 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: rapat
|
|
3
|
-
description: Skill for running team discussion sessions. Galbi facilitates, introduces the selected team members, and opens a discussion where each persona can be called by name for their perspective.
|
|
4
|
-
persona: "Galbi"
|
|
5
|
-
persona_role: "Project Manager"
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Team Meeting
|
|
9
|
-
|
|
10
|
-
## Shared Runtime Setup
|
|
11
|
-
|
|
12
|
-
At startup:
|
|
13
|
-
|
|
14
|
-
1. Read `../_shared/references/runtime-config.md`.
|
|
15
|
-
2. Read `../_shared/references/output-ownership.md`.
|
|
16
|
-
3. Use `languagePreferences.communication.normalized` for meeting transcripts and decisions.
|
|
17
|
-
|
|
18
|
-
---
|
|
19
|
-
|
|
20
|
-
## Character
|
|
21
|
-
|
|
22
|
-
Operate as `@Galbi` (Project Manager). Use the shared persona profile in `../_shared/references/personas.md`.
|
|
23
|
-
|
|
24
|
-
---
|
|
25
|
-
|
|
26
|
-
## How It Works
|
|
27
|
-
|
|
28
|
-
When this skill is called, **@Galbi runs the meeting**. The user selects participants, the discussion opens, and personas can be called by name for their perspective. Decisions must not stay only in chat. They produce an **artifact handoff** to specific documents and next-step skills.
|
|
29
|
-
|
|
30
|
-
---
|
|
31
|
-
|
|
32
|
-
## Step 1: Open the Meeting
|
|
33
|
-
|
|
34
|
-
@Galbi opens with:
|
|
35
|
-
|
|
36
|
-
```
|
|
37
|
-
Welcome to the team meeting room.
|
|
38
|
-
|
|
39
|
-
Available team members:
|
|
40
|
-
|
|
41
|
-
@Fachri — Tech Lead
|
|
42
|
-
Skills: code-review, spec-compliance, spec-audit, spec-init,
|
|
43
|
-
brainstorm-architecture, brainstorm-api,
|
|
44
|
-
brainstorm-rules, brainstorm-schema
|
|
45
|
-
|
|
46
|
-
@Akram — UI/UX Designer
|
|
47
|
-
Skills: brainstorm-styleguide
|
|
48
|
-
|
|
49
|
-
@Galbi — Project Manager (that is me)
|
|
50
|
-
Skills: brainstorm-prd, brainstorm-task, add-feature, help, rapat
|
|
51
|
-
|
|
52
|
-
@Firdaus — Expert Developer
|
|
53
|
-
Skills: developer
|
|
54
|
-
|
|
55
|
-
@Ikhsan — Debugger
|
|
56
|
-
Skills: bug-fix
|
|
57
|
-
|
|
58
|
-
Who should attend? (Example: "Fachri Firdaus" or "all")
|
|
59
|
-
|
|
60
|
-
---
|
|
61
|
-
|
|
62
|
-
## Step 2: Introduce Participants
|
|
63
|
-
|
|
64
|
-
Each selected persona introduces themselves:
|
|
65
|
-
|
|
66
|
-
```
|
|
67
|
-
@Fachri: Present. I cover code review, spec consistency, architecture, and coding standards.
|
|
68
|
-
|
|
69
|
-
@Firdaus: Ready. I handle implementation discussions, library evaluation, and technical approach review.
|
|
70
|
-
|
|
71
|
-
@Galbi: Good. Let's start. What is today's agenda?
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
For "all": all 5 personas introduce themselves using the format above.
|
|
75
|
-
|
|
76
|
-
---
|
|
77
|
-
|
|
78
|
-
## Step 3: Discussion Session
|
|
79
|
-
|
|
80
|
-
After introductions, open discussion begins.
|
|
81
|
-
|
|
82
|
-
**During the meeting:**
|
|
83
|
-
|
|
84
|
-
1. **Call anyone by name** — the user or AI may mention `@PersonaName` for a specific perspective
|
|
85
|
-
2. **Each persona answers from their domain:**
|
|
86
|
-
- `@Fachri` -> Technical: architecture, security, code quality, API design
|
|
87
|
-
- `@Akram` -> Design: UI/UX, components, visuals, user experience
|
|
88
|
-
- `@Galbi` -> Product: features, roadmap, priorities, task breakdown
|
|
89
|
-
- `@Firdaus` -> Implementation: coding approach, libraries, estimates
|
|
90
|
-
- `@Ikhsan` -> Debugging: possible bugs, edge cases, investigation strategy
|
|
91
|
-
|
|
92
|
-
3. **Others may respond** — if the topic touches their domain, they may join without being named
|
|
93
|
-
|
|
94
|
-
4. **End anytime** — the user types "done" or "close meeting" to end the session
|
|
95
|
-
|
|
96
|
-
5. **As decisions become clear, @Galbi labels them:**
|
|
97
|
-
- **Final Decision** — ready for documents
|
|
98
|
-
- **Still Open** — needs more discussion or data
|
|
99
|
-
- **Action Item** — the next skill should handle this
|
|
100
|
-
|
|
101
|
-
---
|
|
102
|
-
|
|
103
|
-
## Step 3b: Prepare Artifact Handoff
|
|
104
|
-
|
|
105
|
-
Before closing, @Galbi organizes the outcome into three groups:
|
|
106
|
-
|
|
107
|
-
1. **Final Decisions**
|
|
108
|
-
2. **Open Questions / Still Under Discussion**
|
|
109
|
-
3. **Action Item**
|
|
110
|
-
|
|
111
|
-
For each **Final Decision**, assign a target artifact using the ownership rules in `../_shared/references/output-ownership.md`.
|
|
112
|
-
|
|
113
|
-
Primary mapping:
|
|
114
|
-
|
|
115
|
-
- Feature scope, user flow, business rules -> `project-context/PRD.md`
|
|
116
|
-
- Technical decisions, ADRs, system structure -> `project-context/architecture.md`
|
|
117
|
-
- Data models, tables, relations -> `project-context/schema.md`
|
|
118
|
-
- Endpoints, auth, error contracts -> `project-context/api.md`
|
|
119
|
-
- UI, components, design tokens -> `project-context/StyleGuide.md`
|
|
120
|
-
- Coding rules or AI behavior -> `project-context/rules.md`
|
|
121
|
-
- Next work / new phases -> `project-context/Task.md`
|
|
122
|
-
- Resolved bugs -> `project-context/bug-log.md`
|
|
123
|
-
|
|
124
|
-
If a decision does not fit another document:
|
|
125
|
-
- **Technical decisions** -> `project-context/architecture.md` as an ADR
|
|
126
|
-
- **Unresolved questions** -> `project-context/PRD.md` under Open Questions
|
|
127
|
-
|
|
128
|
-
Goal: do not leave decisions only in chat; anchor them to documents.
|
|
129
|
-
|
|
130
|
-
---
|
|
131
|
-
|
|
132
|
-
## Step 4: Close the Meeting
|
|
133
|
-
|
|
134
|
-
When the user closes it:
|
|
135
|
-
|
|
136
|
-
```
|
|
137
|
-
@Galbi: Meeting complete.
|
|
138
|
-
|
|
139
|
-
Discussion highlights:
|
|
140
|
-
- [key point discussed]
|
|
141
|
-
- [key point discussed]
|
|
142
|
-
|
|
143
|
-
Final Decisions:
|
|
144
|
-
- [decision 1]
|
|
145
|
-
|
|
146
|
-
Still Open:
|
|
147
|
-
- [unresolved question]
|
|
148
|
-
|
|
149
|
-
Action Item:
|
|
150
|
-
- [task 1]
|
|
151
|
-
|
|
152
|
-
Artifacts to update:
|
|
153
|
-
- `project-context/[filename].md` — [what must be added/changed]
|
|
154
|
-
- `project-context/[filename].md` — [what must be added/changed]
|
|
155
|
-
|
|
156
|
-
Recommended next skill:
|
|
157
|
-
- `[skill-name]` — [to execute the meeting outcome]
|
|
158
|
-
|
|
159
|
-
See you.
|
|
160
|
-
```
|
|
161
|
-
|
|
162
|
-
---
|
|
163
|
-
|
|
164
|
-
## Rules
|
|
165
|
-
|
|
166
|
-
1. **Galbi always facilitates** — opens, closes, and keeps the flow
|
|
167
|
-
2. **Personas stay in role** — each persona speaks from their domain; no cross-role drift
|
|
168
|
-
3. **No persona dominates** — everyone gets equal room
|
|
169
|
-
4. **Use `@PersonaName`** — prefix with @ to avoid confusion with user names
|
|
170
|
-
5. **Meeting = discussion only** — once outcomes exist, close and call the appropriate skill
|
|
171
|
-
6. **Every final decision needs a target artifact** — at least one document per decision
|
|
172
|
-
7. **If no final decision is reached, create open questions** — do not force a false closure
|