wize-dev-kit 0.20.0 → 0.22.0
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/CHANGELOG.md +31 -0
- package/README.es.md +12 -2
- package/README.md +11 -2
- package/README.pt-BR.md +12 -2
- package/adapters/README.md +1 -0
- package/adapters/copilot/README.md +54 -0
- package/adapters/copilot/adapter.yaml +8 -0
- package/adapters/copilot/render.js +77 -0
- package/docs/harnesses/copilot.md +65 -0
- package/docs/harnesses/copilot.pt-BR.md +65 -0
- package/package.json +1 -1
- package/src/core-skills/module.yaml +6 -0
- package/src/core-skills/wize-debt/skill.md +89 -0
- package/src/core-skills/wize-subtract/skill.md +91 -0
- package/src/method-skills/4-implementation/wize-agent-dev/persona.md +2 -1
- package/src/method-skills/4-implementation/wize-code-review/steps/step-02-review.md +4 -0
- package/src/method-skills/4-implementation/wize-code-review/steps/step-03-triage.md +7 -1
- package/src/method-skills/4-implementation/wize-code-review/steps/step-04-present.md +2 -0
- package/src/method-skills/4-implementation/wize-code-review/workflow.md +1 -1
- package/src/method-skills/4-implementation/wize-retrospective/workflow.md +23 -0
- package/tools/check-skills-all-adapters.js +88 -0
- package/tools/installer/baseline.js +7 -2
- package/tools/installer/commands/doctor.js +1 -0
- package/tools/installer/render-shared.js +33 -1
- package/tools/installer/setup-helpers.js +2 -0
- package/tools/installer/validators/run-all.js +8 -0
- package/tools/installer/wize-cli.js +1 -0
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,37 @@ Format inspired by [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
|
7
7
|
> **0.10.0 and earlier are in Brazilian Portuguese** and are kept verbatim as a
|
|
8
8
|
> historical record (not back-translated).
|
|
9
9
|
|
|
10
|
+
## [0.22.0] — 2026-09-25
|
|
11
|
+
|
|
12
|
+
**GitHub Copilot is now the 12th supported harness.** The new `copilot` IDE target renders the kit into the two trees Copilot actually reads: `.github/skills/wize-{code}/SKILL.md` for workflows + skills (Agent Skills standard) and `.github/agents/wize-{code}.agent.md` for the 10 personas (custom agents, pickable in the chat dropdown). Works across the Copilot cloud agent, Copilot code review, the GitHub Copilot CLI, the Copilot app, and agent mode in VS Code, JetBrains IDEs, Eclipse and Xcode. Highlighted in all 3 READMEs + `docs/harnesses/copilot.md` (+pt-BR); registered in the installer targets, `doctor`, the `.gitignore` block, the brownfield baseline and the test suites.
|
|
13
|
+
|
|
14
|
+
### Added
|
|
15
|
+
|
|
16
|
+
- **`copilot` IDE target** (`adapters/copilot/`) — personas → `.github/agents/*.agent.md` (frontmatter `name` + `description`, persona body as the prompt, `tools` omitted so each persona keeps every available tool); workflows + skills → `.github/skills/*/SKILL.md` via the shared Anthropic emitter, including companion files (`steps/`, `templates/`, `data/`, `*.csv`) so micro-file workflows resolve their relative paths.
|
|
17
|
+
- **`copilot` harness in the brownfield baseline** — headless one-shot via `copilot -p "<prompt>"` (grant the minimum permissions you need for unattended runs, e.g. `--allow-tool=write`, instead of `--allow-all`).
|
|
18
|
+
- **`docs/harnesses/copilot.md` + `copilot.pt-BR.md`** — the skill vs custom-agent split, progressive disclosure, `AGENTS.md` as the always-on instructions source (no `.github/copilot-instructions.md` duplicate is written), why prompt files are deliberately not shipped (VS Code deprecated `.github/prompts/*.prompt.md` in favor of agent skills), and the headless invocation.
|
|
19
|
+
- **`renderAnthropicSkills` accepts an optional `opts.kinds` filter** — one emitter now serves harnesses that split assets across trees (Copilot sends workflows/skills to `.github/skills/` and personas to `.github/agents/`) without duplicating the rendering logic.
|
|
20
|
+
|
|
21
|
+
## [0.21.0] — 2026-09-25
|
|
22
|
+
|
|
23
|
+
**Less code, and a way to verify it.** Four changes put the kit's reuse discipline to work *after* the code is written, not only while it is being written: a deletion-first review (`/wize-subtract`) wired as a fourth layer of `wize-code-review`, a ledger for deliberate shortcuts (`/wize-debt` + the `wize-debt:` marker), the code ladder promoted into the generated `AGENTS.md` (always-on in every harness), and code accounting in the retrospective. Inspired by [Ponytail](https://github.com/DietrichGebert/ponytail) by Dietrich Gebert (credited in all 3 READMEs).
|
|
24
|
+
|
|
25
|
+
### Added
|
|
26
|
+
|
|
27
|
+
- **`/wize-subtract`** (core skill) — over-engineering-only review of a diff: one line per finding (`delete:`, `stdlib:`, `native:`, `yagni:`, `shrink:`), ranked by lines saved, closing with `net: -<N> lines possible.` Names the replacement for every cut, verifies reuse claims against the codebase, and never flags tests, trust-boundary validation, security or accessibility. Lists findings; does not apply them.
|
|
28
|
+
- **`/wize-debt`** (core skill) — harvests every `wize-debt:` marker (ceiling + upgrade path) into one ledger, so a deferral can't quietly become permanent. Flags markers that name no trigger as `no-trigger` rot risk. Read-only.
|
|
29
|
+
- **`wize-code-review` runs a fourth layer: the Subtraction Hunter** — alongside the Blind Hunter, Edge Case Hunter and Acceptance Auditor on every code PR. Triage classifies its findings (`patch` for code this diff introduced, `defer` for pre-existing code, `dismiss` when a requirement or a safety floor protects it) and the summary reports the cuts and `net: -N lines possible`.
|
|
30
|
+
- **Code accounting in `wize-retrospective`** — lines added/removed/net, files touched, dependencies added, new abstractions, `wize-debt:` markers added vs retired, and the complexity delta, all measured from git over the sprint window and reported as numbers in the retro doc.
|
|
31
|
+
|
|
32
|
+
### Changed
|
|
33
|
+
|
|
34
|
+
- **The generated `AGENTS.md` now carries the code ladder** — YAGNI → already-here → stdlib → native → installed dependency → one-liner → minimum, plus the anti-over-engineering rules (no unrequested abstractions or dependencies, deletion over addition, boring over clever, fewest files, bug fix = root cause) and the safety floor (trust-boundary validation, data-loss handling, security, accessibility, tests on non-trivial logic). The ladder is now **always-on** in every harness that reads `AGENTS.md`, instead of living only inside the implementation skills. Existing installs: delete the kit-generated `AGENTS.md` and re-run `npx wize-dev-kit sync` to regenerate it.
|
|
35
|
+
- **Shuri's persona** — the blanket "no TODO" rule becomes "no *vague* TODO": a deliberate shortcut with a known ceiling ships with a `wize-debt:` marker naming ceiling and upgrade trigger, or it doesn't ship. Shuri also runs `/wize-subtract` on her own diff before opening the PR.
|
|
36
|
+
|
|
37
|
+
### Fixed
|
|
38
|
+
|
|
39
|
+
- **Validator: descriptions with escaped quotes** — the kit's frontmatter parser reads double-quoted scalars with `/^"([^"]*)"$/`, so a `description` containing `\"` was parsed with its wrapping quotes and re-escaped on render (visible in every harness). `npm run validate` now fails that pattern, with the fix spelled out.
|
|
40
|
+
|
|
10
41
|
## [0.20.0] — 2026-09-18
|
|
11
42
|
|
|
12
43
|
### Added
|
package/README.es.md
CHANGED
|
@@ -69,12 +69,13 @@ Tras instalar, abre tu IDE y di:
|
|
|
69
69
|
|
|
70
70
|
## Harnesses soportados
|
|
71
71
|
|
|
72
|
-
Los
|
|
72
|
+
Los 12 IDEs objetivo se renderizan desde la misma fuente; el formato y la mecánica varían por harness. **OpenCode** recibe la integración más profunda — la separación persona/workflow del kit se mapea sobre las primitivas propias de OpenCode (`mode: primary|subagent`, `agent:`, `subtask:`) en lugar de aplanarse en un único tipo de archivo.
|
|
73
73
|
|
|
74
74
|
| Harness | Salida | Destacado |
|
|
75
75
|
|---|---|---|
|
|
76
76
|
| **OpenCode** 🆕 | `.opencode/agents/` + `.opencode/commands/` | `mode: primary\|subagent` nativo; los comandos se vinculan automáticamente a su persona propietaria (`agent:`); los workers de fan-out corren aislados (`subtask: true`). [Docs →](docs/harnesses/opencode.md) |
|
|
77
77
|
| **Claude Code** | `.claude/skills/*/SKILL.md` | Formato Skill de Anthropic; fan-out ad-hoc vía Task/Agent tool (`wize-code-review`). [Docs →](docs/harnesses/claude-code.md) |
|
|
78
|
+
| **GitHub Copilot** 🆕 | `.github/skills/*/SKILL.md` + `.github/agents/*.agent.md` | Agent Skills standard para workflows/skills, **custom agents** para las 10 personas (seleccionables en el desplegable del chat); contexto always-on vía `AGENTS.md`; funciona en el cloud agent, code review, CLI, app y agent mode de VS Code/JetBrains. [Docs →](docs/harnesses/copilot.md) |
|
|
78
79
|
| **Codex** | `.agents/skills/*/SKILL.md` | Mismo formato Skill + `AGENTS.md` en la raíz. [Docs →](docs/harnesses/codex.md) |
|
|
79
80
|
| **Kimi Code** | `.kimi/skills/*/SKILL.md` | Mismo formato Skill; autodetecta árboles de skills de Claude/Codex. [Docs →](docs/harnesses/kimi-code.md) |
|
|
80
81
|
| **Hermes Agent** 🆕 | `.hermes/skills/*/SKILL.md` | Mismo formato Skill, project-local; trust gate (`hermes skills trust`); las skills del proyecto sobreescriben las de perfil. [Docs →](docs/harnesses/hermes.md) |
|
|
@@ -170,7 +171,14 @@ Transversales:
|
|
|
170
171
|
/wize-correct-course Re-planifica cuando un gate falla o el loop se
|
|
171
172
|
estanca (auto-disparado por la guarda de max-cycles;
|
|
172
173
|
también manual).
|
|
173
|
-
/wize-code-review Revisión adversarial antes del gate TEA de Hawkeye
|
|
174
|
+
/wize-code-review Revisión adversarial antes del gate TEA de Hawkeye
|
|
175
|
+
(4 capas: ciega, casos-límite, sustracción, auditoría de AC).
|
|
176
|
+
/wize-subtract Revisión de diff enfocada solo en over-engineering:
|
|
177
|
+
lista de cortes (delete / stdlib / native / yagni /
|
|
178
|
+
shrink) + el total de líneas ahorrables. También es capa.
|
|
179
|
+
/wize-debt Cosecha cada atajo deliberado marcado con `wize-debt:`
|
|
180
|
+
(techo + ruta de upgrade) en un ledger único, para que
|
|
181
|
+
"después" no se vuelva "nunca".
|
|
174
182
|
/wize-party-mode Wizer reúne multi-persona para decisiones difíciles.
|
|
175
183
|
```
|
|
176
184
|
|
|
@@ -273,6 +281,8 @@ npx wize-dev-kit version-check [--json] # instalada vs. más reciente (con cach
|
|
|
273
281
|
- [Whiteport Design Studio expansion](https://github.com/bmad-code-org/bmad-method-wds-expansion) — metodología UX-first, panteón nórdico (Saga, Freya), estructura de fases.
|
|
274
282
|
- [No AI Slop](https://github.com/petergyang/no-ai-slop) por Peter Yang — higiene de escrita que elimina patrones de AI slop sin aplanar la voz del autor; la inspiración para `/wize-no-ai-slop`.
|
|
275
283
|
- [apple-appstore-reviewer (awesome-copilot)](https://github.com/github/awesome-copilot/blob/main/skills/apple-appstore-reviewer/SKILL.md) — auditoría con mentalidad de reviewer para la submisión a App Store; la inspiración para `wize-app-store-review` (gate de publicación del overlay).
|
|
284
|
+
- [ELI5](https://github.com/dreambigou/eli5) por Andrew Ou — explicaciones calibradas al oyente; inspiración de `/wize-eli5`.
|
|
285
|
+
- [Ponytail](https://github.com/DietrichGebert/ponytail) por Dietrich Gebert — revisión orientada a la eliminación (`/wize-subtract`), el marcador de atajo `wize-debt:` con su ledger, y el encuadre medido de "menos código" detrás de la contabilidad de código de la retrospectiva. La reuse ladder del kit comparte los mismos peldaños.
|
|
276
286
|
|
|
277
287
|
Wize Development Kit es una **adaptación independiente** — no afiliada ni respaldada por los autores de BMAD o WDS. Los nombres de personas Marvel se usan como referencias creativas bajo uso nominativo justo.
|
|
278
288
|
|
package/README.md
CHANGED
|
@@ -69,12 +69,13 @@ After install, open your IDE and say:
|
|
|
69
69
|
|
|
70
70
|
## Supported harnesses
|
|
71
71
|
|
|
72
|
-
All
|
|
72
|
+
All 12 IDE targets render from the same source; format and mechanics differ per harness. **OpenCode** gets the deepest integration — the kit's persona/workflow split maps onto OpenCode's own primitives (`mode: primary|subagent`, `agent:`, `subtask:`) instead of being flattened into one file type.
|
|
73
73
|
|
|
74
74
|
| Harness | Output | Notable |
|
|
75
75
|
|---|---|---|
|
|
76
76
|
| **OpenCode** 🆕 | `.opencode/agents/` + `.opencode/commands/` | Native `mode: primary\|subagent`; commands auto-bind to their owning persona (`agent:`); fan-out workers run isolated (`subtask: true`). [Docs →](docs/harnesses/opencode.md) |
|
|
77
77
|
| **Claude Code** | `.claude/skills/*/SKILL.md` | Anthropic Skill format; ad-hoc Task/Agent-tool fan-out (`wize-code-review`). [Docs →](docs/harnesses/claude-code.md) |
|
|
78
|
+
| **GitHub Copilot** 🆕 | `.github/skills/*/SKILL.md` + `.github/agents/*.agent.md` | Agent Skills standard for workflows/skills, **custom agents** for the 10 personas (pickable in the chat dropdown); always-on context via `AGENTS.md`; works in the cloud agent, code review, CLI, app and VS Code/JetBrains agent mode. [Docs →](docs/harnesses/copilot.md) |
|
|
78
79
|
| **Codex** | `.agents/skills/*/SKILL.md` | Same Skill format + root `AGENTS.md`. [Docs →](docs/harnesses/codex.md) |
|
|
79
80
|
| **Kimi Code** | `.kimi/skills/*/SKILL.md` | Same Skill format; auto-detects Claude/Codex skill trees. [Docs →](docs/harnesses/kimi-code.md) |
|
|
80
81
|
| **Hermes Agent** 🆕 | `.hermes/skills/*/SKILL.md` | Same Skill format, project-local; trust gate (`hermes skills trust`); project skills override profile ones. [Docs →](docs/harnesses/hermes.md) |
|
|
@@ -169,7 +170,14 @@ Cross-cutting:
|
|
|
169
170
|
opening a PR — fail fast, zero CI runner cost.
|
|
170
171
|
/wize-correct-course Re-plan when a gate fails or a loop stalls (auto-
|
|
171
172
|
triggered by the max-cycles guard; also manual).
|
|
172
|
-
/wize-code-review Adversarial peer review before Hawkeye's TEA gate
|
|
173
|
+
/wize-code-review Adversarial peer review before Hawkeye's TEA gate
|
|
174
|
+
(4 layers: blind, edge case, subtraction, AC audit).
|
|
175
|
+
/wize-subtract Over-engineering-only review of a diff: ranked
|
|
176
|
+
delete-list (delete / stdlib / native / yagni /
|
|
177
|
+
shrink) + the net lines saved. Also a review layer.
|
|
178
|
+
/wize-debt Harvest every deliberate `wize-debt:` shortcut
|
|
179
|
+
(ceiling + upgrade path) into one ledger, so a
|
|
180
|
+
deferral can't quietly become permanent.
|
|
173
181
|
/wize-party-mode Wizer convenes multi-persona for hard calls.
|
|
174
182
|
```
|
|
175
183
|
|
|
@@ -272,6 +280,7 @@ npx wize-dev-kit version-check [--json] # installed vs latest (cached; scriptab
|
|
|
272
280
|
- [ELI5](https://github.com/dreambigou/eli5) by Andrew Ou — audience-calibrated explanations; the inspiration for `/wize-eli5`.
|
|
273
281
|
- [No AI Slop](https://github.com/petergyang/no-ai-slop) by Peter Yang — writing hygiene that removes AI-slop patterns without flattening the writer's voice; the inspiration for `/wize-no-ai-slop` (Peggy Carter & Mantis apply it to end-user-facing prose).
|
|
274
282
|
- [awesome-copilot's apple-appstore-reviewer](https://github.com/github/awesome-copilot/blob/main/skills/apple-appstore-reviewer/SKILL.md) — reviewer-mindset audit for App Store submission; the inspiration for `wize-app-store-review` (the app-overlay publication gate).
|
|
283
|
+
- [Ponytail](https://github.com/DietrichGebert/ponytail) by Dietrich Gebert — deletion-first review (`/wize-subtract`), the `wize-debt:` shortcut marker and its ledger, and the measured "less code" framing behind the retrospective's code accounting. The kit's reuse ladder shares its rungs.
|
|
275
284
|
|
|
276
285
|
Wize Development Kit is an **independent adaptation** — not affiliated with or endorsed by BMAD or WDS authors. Marvel persona names are used as creative references under nominative fair use.
|
|
277
286
|
|
package/README.pt-BR.md
CHANGED
|
@@ -69,12 +69,13 @@ Após instalar, abra sua IDE e diga:
|
|
|
69
69
|
|
|
70
70
|
## Harnesses suportadas
|
|
71
71
|
|
|
72
|
-
Os
|
|
72
|
+
Os 12 alvos de IDE são gerados a partir da mesma fonte; formato e mecânica mudam por harness. O **OpenCode** tem a integração mais profunda — a divisão persona/workflow do kit mapeia pras primitivas nativas do próprio OpenCode (`mode: primary|subagent`, `agent:`, `subtask:`) em vez de ser achatada num único tipo de arquivo.
|
|
73
73
|
|
|
74
74
|
| Harness | Saída | Destaque |
|
|
75
75
|
|---|---|---|
|
|
76
76
|
| **OpenCode** 🆕 | `.opencode/agents/` + `.opencode/commands/` | `mode: primary\|subagent` nativo; commands se ligam à persona dona (`agent:`); workers de fan-out rodam isolados (`subtask: true`). [Docs →](docs/harnesses/opencode.pt-BR.md) |
|
|
77
77
|
| **Claude Code** | `.claude/skills/*/SKILL.md` | Formato Skill da Anthropic; fan-out ad hoc via Task/Agent tool (`wize-code-review`). [Docs →](docs/harnesses/claude-code.pt-BR.md) |
|
|
78
|
+
| **GitHub Copilot** 🆕 | `.github/skills/*/SKILL.md` + `.github/agents/*.agent.md` | Agent Skills standard para workflows/skills, **custom agents** para as 10 personas (selecionáveis na dropdown do chat); contexto always-on via `AGENTS.md`; funciona no cloud agent, code review, CLI, app e agent mode do VS Code/JetBrains. [Docs →](docs/harnesses/copilot.pt-BR.md) |
|
|
78
79
|
| **Codex** | `.agents/skills/*/SKILL.md` | Mesmo formato Skill + `AGENTS.md` na raiz. [Docs →](docs/harnesses/codex.pt-BR.md) |
|
|
79
80
|
| **Kimi Code** | `.kimi/skills/*/SKILL.md` | Mesmo formato Skill; autodetecta as árvores do Claude/Codex. [Docs →](docs/harnesses/kimi-code.pt-BR.md) |
|
|
80
81
|
| **Hermes Agent** 🆕 | `.hermes/skills/*/SKILL.md` | Mesmo formato Skill, project-local; trust gate (`hermes skills trust`); skills do projeto sobrescrevem as de perfil. [Docs →](docs/harnesses/hermes.pt-BR.md) |
|
|
@@ -172,7 +173,14 @@ Transversais:
|
|
|
172
173
|
/wize-correct-course Re-planeja quando um gate falha ou o loop trava
|
|
173
174
|
(auto-disparado pela guarda de max-cycles; também
|
|
174
175
|
manual).
|
|
175
|
-
/wize-code-review Revisão adversarial antes do gate TEA do Hawkeye
|
|
176
|
+
/wize-code-review Revisão adversarial antes do gate TEA do Hawkeye
|
|
177
|
+
(4 camadas: cega, casos-limite, subtração, auditoria de AC).
|
|
178
|
+
/wize-subtract Revisão de diff focada só em over-engineering: lista
|
|
179
|
+
de cortes (delete / stdlib / native / yagni / shrink)
|
|
180
|
+
+ o total de linhas economizáveis. Também é uma camada.
|
|
181
|
+
/wize-debt Colhe todo atalho deliberado marcado com `wize-debt:`
|
|
182
|
+
(teto + caminho de upgrade) num ledger único, para que
|
|
183
|
+
"depois" não vire "nunca".
|
|
176
184
|
/wize-party-mode Wizer reúne multi-persona para decisões difíceis.
|
|
177
185
|
```
|
|
178
186
|
|
|
@@ -274,6 +282,8 @@ npx wize-dev-kit version-check [--json] # instalada vs. mais recente (com cache
|
|
|
274
282
|
- [Whiteport Design Studio expansion](https://github.com/bmad-code-org/bmad-method-wds-expansion) — metodologia UX-first, panteão nórdico (Saga, Freya), estrutura de fases.
|
|
275
283
|
- [No AI Slop](https://github.com/petergyang/no-ai-slop) por Peter Yang — higiene de escrita que elimina padrões de AI slop sem achatar a voz do autor; a inspiração para `/wize-no-ai-slop`.
|
|
276
284
|
- [apple-appstore-reviewer (awesome-copilot)](https://github.com/github/awesome-copilot/blob/main/skills/apple-appstore-reviewer/SKILL.md) — auditoria com mentalidade de reviewer para submissão na App Store; a inspiração para `wize-app-store-review` (gate de publicação do overlay de app).
|
|
285
|
+
- [ELI5](https://github.com/dreambigou/eli5) por Andrew Ou — explicações calibradas ao ouvinte; inspiração do `/wize-eli5`.
|
|
286
|
+
- [Ponytail](https://github.com/DietrichGebert/ponytail) por Dietrich Gebert — revisão orientada a deleção (`/wize-subtract`), o marcador de atalho `wize-debt:` com seu ledger, e o enquadramento medido de "menos código" por trás da contabilidade de código da retrospectiva. A reuse ladder do kit compartilha os mesmos degraus.
|
|
277
287
|
|
|
278
288
|
O Wize Development Kit é uma **adaptação independente** — não afiliada nem endossada pelos autores do BMAD ou do WDS. Os nomes de personas Marvel são referências criativas sob uso nominativo justo.
|
|
279
289
|
|
package/adapters/README.md
CHANGED
|
@@ -7,6 +7,7 @@ Each adapter renders the kit's agents/skills/workflows into the file layout that
|
|
|
7
7
|
| Code | Target path in repo | File format | Notes |
|
|
8
8
|
|---|---|---|---|
|
|
9
9
|
| `claude-code` | `.claude/skills/wize-*/` | `SKILL.md` per agent/workflow | Default. Uses Claude Code skill folder pattern. |
|
|
10
|
+
| `copilot` | `.github/skills/wize-*/` + `.github/agents/wize-*.agent.md` | `SKILL.md` per workflow/skill + `.agent.md` per persona | GitHub Copilot — Agent Skills standard for skills, custom agents for personas. |
|
|
10
11
|
| `cursor` | `.cursor/rules/wize-*.mdc` | MDC | Each agent/skill becomes a rule file. |
|
|
11
12
|
| `windsurf` | `.windsurf/rules/wize-*.md` | Markdown | Cascade-friendly. |
|
|
12
13
|
| `codex` | `.agents/skills/wize-*/` | `SKILL.md` per agent/workflow | OpenAI Codex. |
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# GitHub Copilot — Wize Dev Kit Adapter
|
|
2
|
+
|
|
3
|
+
Emits the kit's assets into the two trees GitHub Copilot reads, mirroring how
|
|
4
|
+
Copilot itself separates **skills** from **agents**:
|
|
5
|
+
|
|
6
|
+
- `.github/skills/wize-{code}/SKILL.md` — workflows + skills, as **agent skills**
|
|
7
|
+
(Agent Skills standard: one folder per skill, `SKILL.md` with `name` +
|
|
8
|
+
`description` frontmatter, optional companion files).
|
|
9
|
+
- `.github/agents/wize-{code}.agent.md` — the 10 personas, as **custom agents**
|
|
10
|
+
(frontmatter: `name`, `description`; body = the persona).
|
|
11
|
+
|
|
12
|
+
## How Copilot picks these up
|
|
13
|
+
|
|
14
|
+
- **Skills** work with the Copilot cloud agent, Copilot code review, the GitHub
|
|
15
|
+
Copilot CLI, the Copilot app, and agent mode in VS Code, JetBrains IDEs,
|
|
16
|
+
Eclipse and Xcode. Copilot discovers project skills in `.github/skills/`,
|
|
17
|
+
`.claude/skills/` or `.agents/skills/` — this adapter writes the canonical
|
|
18
|
+
`.github/skills/` path, so it also works without picking the Claude Code or
|
|
19
|
+
Codex target.
|
|
20
|
+
- **Custom agents** surface in the agent dropdown (VS Code, JetBrains, and the
|
|
21
|
+
agents tab on github.com). VS Code detects any `.md` under `.github/agents/`
|
|
22
|
+
as a custom agent; GitHub's cloud agent uses the same folder. `tools` is
|
|
23
|
+
intentionally omitted so each persona keeps every available tool — the persona
|
|
24
|
+
body defines the role, and narrowing tools is a per-team decision.
|
|
25
|
+
- **Progressive disclosure:** only `name` + `description` load at session start;
|
|
26
|
+
the full `SKILL.md` activates when your request matches the description (or is
|
|
27
|
+
invoked explicitly). The kit's descriptions are written keyword-rich for
|
|
28
|
+
exactly this match.
|
|
29
|
+
- **Always-on instructions are not duplicated.** Copilot reads the root
|
|
30
|
+
`AGENTS.md` as agent instructions (nearest file in the tree wins), and the
|
|
31
|
+
generic adapter already emits it — including the code ladder and the kit's
|
|
32
|
+
operating contract. Writing a `.github/copilot-instructions.md` with the same
|
|
33
|
+
content would only fork it.
|
|
34
|
+
- **No prompt files.** `.github/prompts/*.prompt.md` is deprecated by VS Code
|
|
35
|
+
(the migration path is *prompt → agent skill*), so this adapter ships skills
|
|
36
|
+
instead of prompts on purpose.
|
|
37
|
+
- Generated `wize-*` entries are gitignored (regenerate with
|
|
38
|
+
`npx wize-dev-kit sync`); hand-written team skills you add next to them should
|
|
39
|
+
be committed, per GitHub's own guidance.
|
|
40
|
+
|
|
41
|
+
## Files
|
|
42
|
+
|
|
43
|
+
- `render.js` — personas → `.github/agents/`; workflows + skills → `.github/skills/`
|
|
44
|
+
via the shared `renderAnthropicSkills` emitter (`kinds` filter), which also
|
|
45
|
+
copies companion files (`steps/`, `templates/`, `data/`, `*.csv`) so
|
|
46
|
+
micro-file workflows resolve their relative paths.
|
|
47
|
+
- `adapter.yaml` — descriptor (target path, file pattern).
|
|
48
|
+
|
|
49
|
+
## Headless
|
|
50
|
+
|
|
51
|
+
`copilot -p "<prompt>"` runs a one-shot session (the installer's brownfield
|
|
52
|
+
baseline uses this when the Copilot CLI is the detected harness). For unattended
|
|
53
|
+
automation add the minimum permissions you need, e.g. `--allow-tool=write`
|
|
54
|
+
instead of `--allow-all`.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
code: copilot
|
|
2
|
+
description: "GitHub Copilot — agent skills (.github/skills/, Agent Skills standard) + custom agents (.github/agents/*.agent.md)."
|
|
3
|
+
target_path: ".github/"
|
|
4
|
+
file_pattern: "skills/wize-*/SKILL.md + agents/wize-*.agent.md"
|
|
5
|
+
file_format: markdown
|
|
6
|
+
hooks:
|
|
7
|
+
pre_render: []
|
|
8
|
+
post_render: []
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
// GitHub Copilot adapter — emits two trees, mirroring how Copilot itself
|
|
2
|
+
// separates skills from agents:
|
|
3
|
+
//
|
|
4
|
+
// - .github/skills/wize-{code}/SKILL.md workflows + skills → agent skills
|
|
5
|
+
// - .github/agents/wize-{code}.agent.md personas → custom agents
|
|
6
|
+
//
|
|
7
|
+
// GitHub Copilot reads project agent skills from .github/skills/, .claude/skills/
|
|
8
|
+
// or .agents/skills/ (Agent Skills standard: a folder per skill, SKILL.md with
|
|
9
|
+
// `name` + `description` frontmatter, optional companion files), and custom
|
|
10
|
+
// agents from .github/agents/*.agent.md. Both paths are honored by agent mode
|
|
11
|
+
// in VS Code, the Copilot cloud agent on github.com, Copilot code review, the
|
|
12
|
+
// GitHub Copilot CLI and the Copilot app.
|
|
13
|
+
//
|
|
14
|
+
// Always-on instructions are NOT duplicated here: Copilot reads the root
|
|
15
|
+
// AGENTS.md (generated by the generic adapter) as agent instructions, so
|
|
16
|
+
// writing a .github/copilot-instructions.md would only fork the same content.
|
|
17
|
+
//
|
|
18
|
+
// Skills: https://docs.github.com/en/copilot/concepts/agents/about-agent-skills
|
|
19
|
+
// Agents: https://docs.github.com/en/copilot/how-tos/copilot-on-github/customize-copilot/customize-cloud-agent/create-custom-agents
|
|
20
|
+
|
|
21
|
+
'use strict';
|
|
22
|
+
|
|
23
|
+
const fs = require('node:fs');
|
|
24
|
+
const path = require('node:path');
|
|
25
|
+
const {
|
|
26
|
+
collectAssets,
|
|
27
|
+
renderAnthropicSkills,
|
|
28
|
+
escapeYamlDouble,
|
|
29
|
+
clipOneLine,
|
|
30
|
+
ensureDir
|
|
31
|
+
} = require('../../tools/installer/render-shared.js');
|
|
32
|
+
|
|
33
|
+
function render(kitRoot, projectRoot, opts = {}) {
|
|
34
|
+
const skillsDir = path.join(projectRoot, '.github', 'skills');
|
|
35
|
+
const agentsDir = path.join(projectRoot, '.github', 'agents');
|
|
36
|
+
|
|
37
|
+
// 1. Workflows + skills → .github/skills/wize-{code}/SKILL.md
|
|
38
|
+
// (companion files — steps/, templates/, data/ — are copied alongside by
|
|
39
|
+
// the shared emitter so micro-file workflows resolve their relative paths.)
|
|
40
|
+
const skills = renderAnthropicSkills(kitRoot, skillsDir, { ...opts, kinds: ['workflow', 'skill'] });
|
|
41
|
+
const written = [...skills.written];
|
|
42
|
+
const skipped = [...(skills.skipped || [])];
|
|
43
|
+
|
|
44
|
+
// 2. Personas → .github/agents/wize-{code}.agent.md
|
|
45
|
+
// Frontmatter: name (the stable wize-* identifier), description (persona
|
|
46
|
+
// name + role + summary, shown as the chat placeholder). `tools` is left
|
|
47
|
+
// out on purpose — the persona body defines the role, and omitting the
|
|
48
|
+
// property grants the agent every available tool (per GitHub docs).
|
|
49
|
+
const agents = collectAssets(kitRoot, opts).filter(a => a.kind === 'agent');
|
|
50
|
+
if (!opts.dryRun) ensureDir(agentsDir);
|
|
51
|
+
|
|
52
|
+
for (const a of agents) {
|
|
53
|
+
const desc = clipOneLine(`${a.name} (${a.title}) — ${a.description}`);
|
|
54
|
+
const content = [
|
|
55
|
+
'---',
|
|
56
|
+
`name: ${a.code}`,
|
|
57
|
+
`description: "${escapeYamlDouble(desc)}"`,
|
|
58
|
+
'---',
|
|
59
|
+
'',
|
|
60
|
+
`# ${a.name} — ${a.title}`,
|
|
61
|
+
'',
|
|
62
|
+
a.body.trim(),
|
|
63
|
+
''
|
|
64
|
+
].join('\n');
|
|
65
|
+
|
|
66
|
+
if (opts.dryRun) {
|
|
67
|
+
written.push(`[dry-run] ${a.code}.agent.md`);
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
fs.writeFileSync(path.join(agentsDir, `${a.code}.agent.md`), content, 'utf-8');
|
|
71
|
+
written.push(`${a.code}.agent.md`);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return { written, skipped };
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
module.exports = { render };
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# GitHub Copilot — Wize Development Kit
|
|
2
|
+
|
|
3
|
+
🌐 **Languages:** **English** · [Português (pt-BR)](copilot.pt-BR.md)
|
|
4
|
+
|
|
5
|
+
← [Back to README](../../README.md)
|
|
6
|
+
|
|
7
|
+
GitHub Copilot reads two kinds of project customizations, and the kit fills both:
|
|
8
|
+
|
|
9
|
+
- **Agent skills** — `.github/skills/wize-{code}/SKILL.md`, following the open
|
|
10
|
+
[Agent Skills](https://agentskills.io) standard (a folder per skill; YAML
|
|
11
|
+
frontmatter with `name` + `description`).
|
|
12
|
+
- **Custom agents** — `.github/agents/wize-{code}.agent.md`, one per persona,
|
|
13
|
+
with the persona as its prompt.
|
|
14
|
+
|
|
15
|
+
## Output
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
.github/
|
|
19
|
+
├── agents/ wize-orchestrator.agent.md, wize-agent-dev.agent.md, … (10 personas)
|
|
20
|
+
└── skills/ wize-grill/SKILL.md, wize-code-review/SKILL.md, … (workflows + skills)
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Companion files (`steps/`, `templates/`, `data/`, `*.csv`) are copied next to
|
|
24
|
+
each `SKILL.md`, so micro-file workflows like `wize-create-architecture` resolve
|
|
25
|
+
their relative paths.
|
|
26
|
+
|
|
27
|
+
## Notable
|
|
28
|
+
|
|
29
|
+
- **Where it works.** Copilot cloud agent, Copilot code review, the GitHub
|
|
30
|
+
Copilot CLI, the Copilot app, and agent mode in VS Code, JetBrains IDEs,
|
|
31
|
+
Eclipse and Xcode. Copilot discovers project skills in `.github/skills/`,
|
|
32
|
+
`.claude/skills/` or `.agents/skills/` — this adapter writes the canonical
|
|
33
|
+
`.github/skills/` path.
|
|
34
|
+
- **Progressive disclosure.** Only `name` + `description` load at session start;
|
|
35
|
+
the full `SKILL.md` activates when your request matches the description. The
|
|
36
|
+
kit's descriptions are keyword-rich on purpose.
|
|
37
|
+
- **Always-on context comes from `AGENTS.md`.** Copilot treats `AGENTS.md` as
|
|
38
|
+
agent instructions (the nearest file in the directory tree wins), and the
|
|
39
|
+
installer already generates one — carrying the operating contract **and** the
|
|
40
|
+
code ladder (YAGNI → reuse → stdlib → native → installed dependency →
|
|
41
|
+
one-liner → minimum). No `.github/copilot-instructions.md` duplicate is
|
|
42
|
+
written; keep your own there if you need repo-specific rules beyond the kit's.
|
|
43
|
+
- **The personas are pickable.** The agent dropdown (VS Code / JetBrains) and
|
|
44
|
+
the agents tab on github.com list the 10 `wize-*` agents, each with its role
|
|
45
|
+
as description. `tools` is omitted, so a persona keeps every available tool.
|
|
46
|
+
- **No prompt files.** `.github/prompts/*.prompt.md` is deprecated by VS Code
|
|
47
|
+
(migrating to agent skills), so the kit ships skills instead — `/wize-{code}`
|
|
48
|
+
invocations are covered by skill activation.
|
|
49
|
+
|
|
50
|
+
## Setup
|
|
51
|
+
|
|
52
|
+
Pick **GitHub Copilot** as an IDE target during `npx wize-dev-kit install` (or
|
|
53
|
+
add it and re-run `npx wize-dev-kit sync`). Restart Copilot, then start with
|
|
54
|
+
`/wize-orchestrator` in chat — or select a persona from the agent dropdown.
|
|
55
|
+
|
|
56
|
+
Generated `wize-*` files are gitignored (regenerate any time with
|
|
57
|
+
`npx wize-dev-kit sync`). Hand-written team skills added next to them should be
|
|
58
|
+
committed.
|
|
59
|
+
|
|
60
|
+
## Headless
|
|
61
|
+
|
|
62
|
+
`copilot -p "<prompt>"` runs a one-shot session without entering the interactive
|
|
63
|
+
UI, which is what the installer's brownfield baseline uses when the Copilot CLI
|
|
64
|
+
is the detected harness. For unattended automation, grant the minimum you need
|
|
65
|
+
(for example `--allow-tool=write`) rather than `--allow-all`.
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# GitHub Copilot — Wize Development Kit
|
|
2
|
+
|
|
3
|
+
🌐 **Idiomas:** [English](copilot.md) · **Português (pt-BR)**
|
|
4
|
+
|
|
5
|
+
← [Voltar ao README](../../README.pt-BR.md)
|
|
6
|
+
|
|
7
|
+
O GitHub Copilot lê dois tipos de customização de projeto, e o kit preenche os dois:
|
|
8
|
+
|
|
9
|
+
- **Agent skills** — `.github/skills/wize-{code}/SKILL.md`, seguindo o padrão aberto
|
|
10
|
+
[Agent Skills](https://agentskills.io) (uma pasta por skill; frontmatter YAML com
|
|
11
|
+
`name` + `description`).
|
|
12
|
+
- **Custom agents** — `.github/agents/wize-{code}.agent.md`, um por persona, com a
|
|
13
|
+
persona como prompt.
|
|
14
|
+
|
|
15
|
+
## Saída
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
.github/
|
|
19
|
+
├── agents/ wize-orchestrator.agent.md, wize-agent-dev.agent.md, … (10 personas)
|
|
20
|
+
└── skills/ wize-grill/SKILL.md, wize-code-review/SKILL.md, … (workflows + skills)
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Arquivos companheiros (`steps/`, `templates/`, `data/`, `*.csv`) são copiados ao
|
|
24
|
+
lado de cada `SKILL.md`, então workflows micro-file como `wize-create-architecture`
|
|
25
|
+
resolvem seus caminhos relativos.
|
|
26
|
+
|
|
27
|
+
## Destaques
|
|
28
|
+
|
|
29
|
+
- **Onde funciona.** Copilot cloud agent, Copilot code review, GitHub Copilot CLI,
|
|
30
|
+
app do Copilot e agent mode no VS Code, JetBrains IDEs, Eclipse e Xcode. O Copilot
|
|
31
|
+
descobre skills de projeto em `.github/skills/`, `.claude/skills/` ou
|
|
32
|
+
`.agents/skills/` — este adapter escreve o caminho canônico `.github/skills/`.
|
|
33
|
+
- **Progressive disclosure.** No início da sessão só `name` + `description` são
|
|
34
|
+
carregados; o `SKILL.md` completo ativa quando o pedido casa com a descrição. As
|
|
35
|
+
descrições do kit são ricas em palavras-chave de propósito.
|
|
36
|
+
- **Contexto always-on vem do `AGENTS.md`.** O Copilot trata `AGENTS.md` como
|
|
37
|
+
instruções de agente (o arquivo mais próximo na árvore vence), e o installer já
|
|
38
|
+
gera um — carregando o contrato de operação **e** a ladder de código
|
|
39
|
+
(YAGNI → reuso → stdlib → nativo → dependência instalada → uma linha → mínimo).
|
|
40
|
+
Nenhum `.github/copilot-instructions.md` duplicado é escrito; mantenha o seu ali
|
|
41
|
+
se precisar de regras específicas do repo além das do kit.
|
|
42
|
+
- **As personas são selecionáveis.** A dropdown de agentes (VS Code / JetBrains) e a
|
|
43
|
+
aba de agentes no github.com listam os 10 agentes `wize-*`, cada um com seu papel
|
|
44
|
+
na descrição. O campo `tools` é omitido, então cada persona mantém todas as
|
|
45
|
+
ferramentas disponíveis.
|
|
46
|
+
- **Sem prompt files.** `.github/prompts/*.prompt.md` está deprecado pelo VS Code
|
|
47
|
+
(migrando para agent skills), então o kit entrega skills — as invocações
|
|
48
|
+
`/wize-{code}` ficam cobertas pela ativação por descrição.
|
|
49
|
+
|
|
50
|
+
## Instalação
|
|
51
|
+
|
|
52
|
+
Escolha **GitHub Copilot** como IDE target no `npx wize-dev-kit install` (ou
|
|
53
|
+
adicione e rode `npx wize-dev-kit sync`). Reinicie o Copilot e comece com
|
|
54
|
+
`/wize-orchestrator` no chat — ou selecione uma persona na dropdown de agentes.
|
|
55
|
+
|
|
56
|
+
Arquivos `wize-*` gerados ficam no `.gitignore` (regenere com
|
|
57
|
+
`npx wize-dev-kit sync`). Skills de time escritas à mão ao lado deles devem ser
|
|
58
|
+
commitadas.
|
|
59
|
+
|
|
60
|
+
## Headless
|
|
61
|
+
|
|
62
|
+
`copilot -p "<prompt>"` roda uma sessão one-shot sem entrar na UI interativa — é o
|
|
63
|
+
que o baseline brownfield do installer usa quando o Copilot CLI é o harness
|
|
64
|
+
detectado. Para automação não assistida, conceda o mínimo necessário (por exemplo
|
|
65
|
+
`--allow-tool=write`) em vez de `--allow-all`.
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json.schemastore.org/package.json",
|
|
3
3
|
"name": "wize-dev-kit",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.22.0",
|
|
5
5
|
"description": "Full-lifecycle AI-assisted development kit with Test Architect and Whiteport Design Studio embedded. Inspired by BMAD Method and WDS.",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"ai",
|
|
@@ -31,10 +31,16 @@ skills:
|
|
|
31
31
|
- code: wize-review-adversarial
|
|
32
32
|
name: "Adversarial Review"
|
|
33
33
|
description: "Red-team review of artifacts — challenges assumptions, surfaces edge cases."
|
|
34
|
+
- code: wize-subtract
|
|
35
|
+
name: "Subtract"
|
|
36
|
+
description: "Over-engineering-only review of a diff: what to delete, simplify, or replace with stdlib/native — ranked delete-list plus the net lines saved."
|
|
34
37
|
- code: wize-spec
|
|
35
38
|
name: "Spec"
|
|
36
39
|
description: "Distills any intent input into a canonical five-field spec kernel + companions."
|
|
37
40
|
- code: wize-pre-pr-check
|
|
38
41
|
name: "Pre-PR Check"
|
|
39
42
|
description: "Quando for abrir um Pull Request ou PR leia — gate local para lint, format, build e testes rápidos antes de submeter código."
|
|
43
|
+
- code: wize-debt
|
|
44
|
+
name: "Debt Ledger"
|
|
45
|
+
description: "Harvests every deliberate `wize-debt:` shortcut (ceiling + upgrade path) into one ledger so deferrals don't rot into \"never\"."
|
|
40
46
|
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
---
|
|
2
|
+
|
|
3
|
+
code: wize-debt
|
|
4
|
+
description: "Use quando precisar colher os atalhos deliberados espalhados no código (marcadores wize-debt:) num ledger único, para que o adiamento não vire esquecimento permanente."
|
|
5
|
+
name: Debt Ledger
|
|
6
|
+
module: core
|
|
7
|
+
status: ready
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Debt Ledger
|
|
11
|
+
|
|
12
|
+
**Goal.** Every deliberate shortcut with a known ceiling is marked in code as a `wize-debt:` comment naming its ceiling and its upgrade path. This skill harvests every marker into one ledger, so a deferral can't quietly become permanent.
|
|
13
|
+
|
|
14
|
+
Reads and reports. Changes nothing.
|
|
15
|
+
|
|
16
|
+
## When to run
|
|
17
|
+
|
|
18
|
+
- Before the retrospective (`wize-retrospective`) — the debt marker count is a sprint metric.
|
|
19
|
+
- Before a release (`wize-release`).
|
|
20
|
+
- When the user says "what did we defer", "list the shortcuts", "debt ledger", "what's marked wize-debt", "/wize-debt".
|
|
21
|
+
|
|
22
|
+
## The marker
|
|
23
|
+
|
|
24
|
+
```js
|
|
25
|
+
// wize-debt: single-threaded — upgrade to a queue when the second worker lands
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
# wize-debt: O(n²) scan — index it if the list passes ~10k rows
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
- **ceiling** — the limit we knowingly accepted (global lock, O(n²) scan, naive heuristic, in-memory only, retry-less call).
|
|
33
|
+
- **upgrade path** — the trigger to revisit. Prefer an **event or threshold** ("when the second worker lands", "if rows pass 10k") over a date — a date rots silently.
|
|
34
|
+
|
|
35
|
+
A deliberate shortcut **without** a marker is the real problem: nobody remembers it. Vague TODOs (`// TODO: improve this`) are not a ceiling and not an upgrade path — they are noise, and they do not belong in the ledger.
|
|
36
|
+
|
|
37
|
+
## Steps
|
|
38
|
+
|
|
39
|
+
### 1. Scan
|
|
40
|
+
|
|
41
|
+
Grep the repo for the marker, skipping `node_modules`, `.git`, build output and vendored code:
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
grep -rnE '(#|//|<!--|/\*|--) ?wize-debt:' . \
|
|
45
|
+
--exclude-dir=node_modules --exclude-dir=.git --exclude-dir=dist --exclude-dir=build
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Each hit is one ledger row. The `wize-debt:` prefix keeps prose that merely mentions the convention out of the ledger.
|
|
49
|
+
|
|
50
|
+
### 2. Build the ledger
|
|
51
|
+
|
|
52
|
+
One row per marker, grouped by file:
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
<file>:L<line> — <what was simplified>. ceiling: <limit>. upgrade: <trigger>.
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Optional owner per row, when the user asks for one:
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
git blame -L<line>,<line> --date=short -- <file> | head -1
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### 3. Flag the rot
|
|
65
|
+
|
|
66
|
+
Any marker that names no trigger gets the tag `no-trigger`. Those are the ones that silently rot — say so explicitly rather than hiding them in the list.
|
|
67
|
+
|
|
68
|
+
### 4. Report
|
|
69
|
+
|
|
70
|
+
End with the count:
|
|
71
|
+
|
|
72
|
+
```
|
|
73
|
+
<N> markers, <M> no-trigger.
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Nothing found: `Clean ledger — no wize-debt markers.`
|
|
77
|
+
|
|
78
|
+
Write it to `.wize/implementation/debt.md` **only when asked**; otherwise it is a one-shot report in the conversation.
|
|
79
|
+
|
|
80
|
+
## Rules
|
|
81
|
+
|
|
82
|
+
- **Read-only.** Never edits the code, never removes a marker, never "fixes" one. Revisiting a ceiling is a separate change with its own review.
|
|
83
|
+
- **A marker is not a TODO.** The ledger tracks shortcuts with a named ceiling and trigger. Missing behavior, unfinished work, or "improve later" notes are not debt rows.
|
|
84
|
+
- **`no-trigger` markers are the finding.** A ceiling with no upgrade path is the definition of rot — surface it, don't normalize it.
|
|
85
|
+
- **Skip generated and vendored code.** Markers in `dist/`, `node_modules/`, or vendored trees are noise.
|
|
86
|
+
|
|
87
|
+
## Hand-off
|
|
88
|
+
|
|
89
|
+
> Debt ledger complete. `<N>` marker(s), `<M>` no-trigger. Next: feed the count into `wize-retrospective`, or fix a ceiling via `wize-quick-dev`.
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
---
|
|
2
|
+
|
|
3
|
+
code: wize-subtract
|
|
4
|
+
description: "Use quando um diff ou PR precisar de revisão focada em over-engineering — o que dá para deletar, simplificar ou trocar por stdlib/nativo, com a lista de cortes e o total de linhas economizáveis."
|
|
5
|
+
name: Subtract
|
|
6
|
+
module: core
|
|
7
|
+
status: ready
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Subtract
|
|
11
|
+
|
|
12
|
+
**Goal.** Review a diff with one lens only: **unnecessary complexity**. Answer the question the other review layers don't ask — *what can be deleted, and what replaces it?* The best outcome for a diff is that it gets shorter.
|
|
13
|
+
|
|
14
|
+
This complements `wize-code-review` (correctness, edge cases, acceptance criteria) and `wize-tea-review` (AC fulfillment). Subtract hunts bloat. It **lists** findings; it does not apply them.
|
|
15
|
+
|
|
16
|
+
## When to run
|
|
17
|
+
|
|
18
|
+
- Before opening a PR, once the diff is complete.
|
|
19
|
+
- As the **Subtraction Hunter** layer inside `wize-code-review` (runs on every code PR).
|
|
20
|
+
- When the user says "review for over-engineering", "what can we delete", "is this too much code", "simplify this", "/wize-subtract".
|
|
21
|
+
|
|
22
|
+
## When NOT to run
|
|
23
|
+
|
|
24
|
+
- As a replacement for correctness or security review — those are out of scope here.
|
|
25
|
+
- On generated code, vendored code, or lockfiles.
|
|
26
|
+
- When the diff is already minimal: say so and stop (see "Clean diff").
|
|
27
|
+
|
|
28
|
+
## Inputs
|
|
29
|
+
|
|
30
|
+
- The diff (PR, branch, commit range, or staged changes).
|
|
31
|
+
- Read access to the codebase — reuse claims must be verified, not guessed.
|
|
32
|
+
|
|
33
|
+
## Output
|
|
34
|
+
|
|
35
|
+
One line per finding, ranked by lines saved (biggest cut first):
|
|
36
|
+
|
|
37
|
+
```
|
|
38
|
+
path/to/file:L<line>: <tag> <what to cut>. <what replaces it>.
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Tags:
|
|
42
|
+
|
|
43
|
+
- `delete:` — dead code, unused flexibility, speculative feature. Replacement: nothing.
|
|
44
|
+
- `stdlib:` — a hand-rolled thing the standard library ships. Name the function.
|
|
45
|
+
- `native:` — a dependency or code doing what the platform/framework already does. Name the feature.
|
|
46
|
+
- `yagni:` — an abstraction with one implementation, config nobody sets, a layer with one caller.
|
|
47
|
+
- `shrink:` — same logic, fewer lines. Show the shorter form.
|
|
48
|
+
|
|
49
|
+
End with the only metric that matters: `net: -<N> lines possible.`
|
|
50
|
+
|
|
51
|
+
**Clean diff:** `Lean already. Ship.` and stop.
|
|
52
|
+
|
|
53
|
+
## Rules
|
|
54
|
+
|
|
55
|
+
- **One line per finding.** Location, what to cut, what replaces it. The review's own output obeys the ladder — no essays.
|
|
56
|
+
- **Name the replacement.** "This looks complex" is not a finding. `stdlib:` must name the function; `native:` must name the feature; `yagni:`/`delete:` must name what already exists or state that nothing replaces it.
|
|
57
|
+
- **Complexity only.** Correctness bugs, security holes, and performance problems are out of scope — route them to `wize-code-review`, don't smuggle them in here.
|
|
58
|
+
- **Never flag the floor.** Tests on non-trivial logic are the kit's minimum, not bloat. Validation at trust boundaries, data-loss handling, security, accessibility, and anything explicitly requested are **never** on the chopping block.
|
|
59
|
+
- **Verify before claiming.** "Already in this codebase" requires the existing helper/pattern to be named; "the stdlib does it" requires the function to exist in the target language/runtime.
|
|
60
|
+
- **Read before cutting.** Trace the real flow the change touches. The shortest diff in the wrong place is not lazy — it's a second bug.
|
|
61
|
+
- **Report only.** Do not apply the findings. Applying them is a separate, reviewable change (usually `wize-quick-dev`).
|
|
62
|
+
|
|
63
|
+
## Steps
|
|
64
|
+
|
|
65
|
+
### 1. Read the diff against the codebase
|
|
66
|
+
|
|
67
|
+
For every hunk, know what it touches and who calls it. Claims about reuse need the surrounding code read, not recalled.
|
|
68
|
+
|
|
69
|
+
### 2. Walk the ladder backwards
|
|
70
|
+
|
|
71
|
+
For each hunk, stop at the first question that holds:
|
|
72
|
+
|
|
73
|
+
1. Does this need to exist at all? → `delete:` (replacement: nothing).
|
|
74
|
+
2. Does it duplicate something already here? → `yagni:` or `delete:`, naming the existing helper/pattern.
|
|
75
|
+
3. Does the standard library do it? → `stdlib:`, naming the function.
|
|
76
|
+
4. Does the platform or framework do it? → `native:`, naming the feature.
|
|
77
|
+
5. Is a dependency doing one small thing? → `native:` / `shrink:`, naming what replaces it.
|
|
78
|
+
6. Same logic in fewer lines? → `shrink:`, showing the shorter form.
|
|
79
|
+
7. Is it configuration, an interface, or a layer with a single caller? → `yagni:`.
|
|
80
|
+
|
|
81
|
+
### 3. Rank and totalize
|
|
82
|
+
|
|
83
|
+
Sort by estimated lines removed (descending). Sum them: `net: -<N> lines possible.`
|
|
84
|
+
|
|
85
|
+
### 4. Hand back
|
|
86
|
+
|
|
87
|
+
Present the list as-is. Findings that contradict an explicit requirement or the safety floor are dropped out loud — say which and why, so the omission is visible.
|
|
88
|
+
|
|
89
|
+
## Hand-off
|
|
90
|
+
|
|
91
|
+
> Subtraction review complete for `{change}`. `{count}` finding(s), `net: -{N} lines possible.` Next: apply via `wize-quick-dev`, or continue to `wize-code-review` for correctness.
|
|
@@ -11,6 +11,7 @@ I am **Shuri**. Wakandan technologist. I implement the story Tony wrote, against
|
|
|
11
11
|
3. **Red → green → refactor.** Tests first; minimum code to pass; clean.
|
|
12
12
|
4. **Security & perf.** I think about both at write-time, not at review-time.
|
|
13
13
|
5. **Commit with AC IDs.** Every commit cites the story acceptance criteria it advances.
|
|
14
|
+
6. **Subtract before I push.** Before opening the PR I run `/wize-subtract` on my own diff — my code climbs the ladder too, and the review's best outcome is a shorter diff.
|
|
14
15
|
|
|
15
16
|
## Before I write new code (the reuse ladder)
|
|
16
17
|
|
|
@@ -34,7 +35,7 @@ At the "green" step, before typing a new function, I walk this ladder in order a
|
|
|
34
35
|
|
|
35
36
|
- I won't change architecture without an ADR from Tony.
|
|
36
37
|
- I won't waive a Hawkeye gate without Wizer's approval logged.
|
|
37
|
-
- I won't ship
|
|
38
|
+
- I won't ship a vague TODO for someone else. A **deliberate shortcut with a known ceiling** is a different thing: it gets a `wize-debt:` marker naming its ceiling and its upgrade trigger (harvested by `/wize-debt`) — or it doesn't ship.
|
|
38
39
|
|
|
39
40
|
## Quick-dev mode
|
|
40
41
|
|
|
@@ -9,6 +9,7 @@ failed_layers: ''
|
|
|
9
9
|
- Speak in `{communication_language}`.
|
|
10
10
|
- The Blind Hunter subagent receives **only** the diff — no project context.
|
|
11
11
|
- The Edge Case Hunter subagent receives the diff and project read access.
|
|
12
|
+
- The Subtraction Hunter subagent receives the diff and project read access.
|
|
12
13
|
- The Acceptance Auditor subagent receives the diff, spec, and context docs.
|
|
13
14
|
- All review subagents run at the same model capability as the current session.
|
|
14
15
|
|
|
@@ -26,6 +27,9 @@ This step is an instance of Wizer's subagent fan-out pattern (see `wize-orchestr
|
|
|
26
27
|
- **Edge Case Hunter** — receives `{diff_output}` and read access to the project. Invoke via `wize-review-edge-case-hunter`.
|
|
27
28
|
Prompt: "Walk every branching path and boundary condition in this diff. Report only unhandled edge cases as a JSON array."
|
|
28
29
|
|
|
30
|
+
- **Subtraction Hunter** — receives `{diff_output}` and read access to the project. Invoke via `wize-subtract`.
|
|
31
|
+
Prompt: "Review this diff for over-engineering only. One line per finding: `path:L<line>: <tag> <what to cut>. <what replaces it>.` Tags: delete | stdlib | native | yagni | shrink. Rank by lines saved. End with `net: -<N> lines possible.` Never flag tests, validation, security, or accessibility."
|
|
32
|
+
|
|
29
33
|
- **Acceptance Auditor** (only if `{review_mode}` = `"full"`) — receives `{diff_output}`, `{spec_file}` content, and context docs.
|
|
30
34
|
Prompt: "Review this diff against the spec. Check for violations of acceptance criteria, deviations from spec intent, and missing behavior. Output findings as a Markdown list with AC/constraint reference and evidence."
|
|
31
35
|
|
|
@@ -10,11 +10,12 @@
|
|
|
10
10
|
1. **Normalize** findings into a common format. Expected input formats:
|
|
11
11
|
- Blind Hunter: Markdown list of descriptions.
|
|
12
12
|
- Edge Case Hunter: JSON array with `location`, `trigger_condition`, `guard_snippet`, `potential_consequence`.
|
|
13
|
+
- Subtraction Hunter: Markdown list of `path:L<line>: <tag> <what to cut>. <what replaces it>.` plus a closing `net: -<N> lines possible.` Keep the tags (`delete`, `stdlib`, `native`, `yagni`, `shrink`) and the net total verbatim.
|
|
13
14
|
- Acceptance Auditor: Markdown list with title, AC/constraint reference, and evidence.
|
|
14
15
|
|
|
15
16
|
Convert all to a unified list with:
|
|
16
17
|
- `id` — sequential integer
|
|
17
|
-
- `source` — `blind`, `edge`, `auditor`, or merged (`blind+edge`, etc.)
|
|
18
|
+
- `source` — `blind`, `edge`, `subtract`, `auditor`, or merged (`blind+edge`, etc.)
|
|
18
19
|
- `title` — one-line summary
|
|
19
20
|
- `detail` — full description
|
|
20
21
|
- `location` — file and line reference if available
|
|
@@ -30,6 +31,11 @@
|
|
|
30
31
|
- **defer** — pre-existing issue not caused by this change.
|
|
31
32
|
- **dismiss** — noise, false positive, or handled elsewhere.
|
|
32
33
|
|
|
34
|
+
Classification of Subtraction Hunter findings:
|
|
35
|
+
- Cutting code **this diff introduced** → `patch`.
|
|
36
|
+
- Cutting pre-existing code the diff didn't touch → `defer` (record it; the change is out of scope for this PR).
|
|
37
|
+
- A cut that contradicts an explicit requirement or the safety floor (validation at trust boundaries, data-loss handling, security, accessibility, tests on non-trivial logic) → `dismiss`, and say which requirement protected it.
|
|
38
|
+
|
|
33
39
|
If `{review_mode}` = `"no-spec"` and a finding would be `decision_needed`, reclassify as `patch` or `defer`.
|
|
34
40
|
|
|
35
41
|
4. **Drop** all `dismiss` findings. Record the dismiss count.
|
|
@@ -45,6 +45,8 @@ Code review complete.
|
|
|
45
45
|
- dismissed: {R}
|
|
46
46
|
```
|
|
47
47
|
|
|
48
|
+
When the Subtraction Hunter ran, add its metric on the following line: `Subtraction: {C} cut(s) proposed, net: -{N} lines possible.` Report it as a number, not a vibe — a diff that got shorter is a review outcome, not a style preference.
|
|
49
|
+
|
|
48
50
|
If `{spec_file}` is set, add: "Findings written to `{spec_file}`."
|
|
49
51
|
|
|
50
52
|
### 4. Resolve decision_needed findings
|
|
@@ -57,7 +57,7 @@ This skill uses **step-file architecture**:
|
|
|
57
57
|
## Steps
|
|
58
58
|
|
|
59
59
|
1. `step-01-gather-context.md` — identify the diff source, construct `{diff_output}`, set `{review_mode}` and `{spec_file}`.
|
|
60
|
-
2. `step-02-review.md` — launch parallel review layers (Blind Hunter, Edge Case Hunter, Acceptance Auditor).
|
|
60
|
+
2. `step-02-review.md` — launch parallel review layers (Blind Hunter, Edge Case Hunter, Subtraction Hunter, Acceptance Auditor).
|
|
61
61
|
3. `step-03-triage.md` — normalize, deduplicate, and classify findings into `decision_needed`, `patch`, `defer`, `dismiss`.
|
|
62
62
|
4. `step-04-present.md` — present findings, resolve decisions, apply patches, update story status.
|
|
63
63
|
|
|
@@ -26,6 +26,7 @@ Wizer facilitates. Hill enforces output discipline. Everyone (including Pepper,
|
|
|
26
26
|
- All `gate.md` files from current sprint
|
|
27
27
|
- `tea/nfr/{epic}.md` if an epic closed this sprint
|
|
28
28
|
- Quick-dev log
|
|
29
|
+
- Git history for the sprint window (tag range, or first → last commit)
|
|
29
30
|
|
|
30
31
|
## Output
|
|
31
32
|
|
|
@@ -57,6 +58,21 @@ Wizer reads the sprint dashboard from `sprint-status.md`:
|
|
|
57
58
|
|
|
58
59
|
Stats anchor the retro in observations, not feelings.
|
|
59
60
|
|
|
61
|
+
#### Code accounting (numbers, not adjectives)
|
|
62
|
+
|
|
63
|
+
Measured from git over the sprint window. Report the numbers even when they look bad — especially then:
|
|
64
|
+
|
|
65
|
+
| Metric | How to get it |
|
|
66
|
+
|---|---|
|
|
67
|
+
| Lines added / removed / net | `git diff --shortstat <base>..<head>` (base = last sprint's tag or first commit) |
|
|
68
|
+
| Files touched | count of distinct files in the range: `git diff --name-only <base>..<head> \| wc -l` |
|
|
69
|
+
| Dependencies | entries added/removed in the manifest diff (`package.json`, `composer.json`, `pyproject.toml`, `Cargo.toml`) |
|
|
70
|
+
| New abstractions | modules, classes, or interfaces introduced by the sprint (count from the diff) |
|
|
71
|
+
| Debt markers | `wize-debt:` added vs retired this sprint (run `/wize-debt`) |
|
|
72
|
+
| Complexity | cyclomatic-complexity delta from `tea/nfr/{epic}.md` when an epic closed |
|
|
73
|
+
|
|
74
|
+
Why this exists: the kit's discipline (reuse ladder, `/wize-subtract`, debt markers) is only verifiable with numbers. A sprint that ships 4 stories while adding 3k net lines and 6 dependencies is telling you something — say it out loud in the retro, and turn it into a change if it repeats.
|
|
75
|
+
|
|
60
76
|
### 2. Worked / didn't / surprised
|
|
61
77
|
|
|
62
78
|
Each engineer brings 2–3 items per section, written in advance ideally. Time-box discussion: any item that takes > 3 min becomes a follow-up.
|
|
@@ -98,6 +114,13 @@ attendees: [Hill, Tony, Mantis, Pepper, Fury, Hawkeye, Shuri]
|
|
|
98
114
|
- Blockers: 1 (vendor sandbox, resolved Day 5)
|
|
99
115
|
- Carry-over to S8: 0
|
|
100
116
|
|
|
117
|
+
## Code accounting
|
|
118
|
+
- Lines: +1.842 / −2.310 (net −468) across 71 files
|
|
119
|
+
- Dependencies: +1 (`zod`), −0
|
|
120
|
+
- New abstractions: 2 (one repository interface, one mapper — both with a single implementation; flagged by `/wize-subtract`)
|
|
121
|
+
- Debt markers: +3 added, −1 retired (2 with a trigger, 1 `no-trigger`)
|
|
122
|
+
- Complexity: no NFR delta this sprint (no epic closed)
|
|
123
|
+
|
|
101
124
|
## Worked
|
|
102
125
|
- Pairing on E03-S02 (auth refresh) — issue caught at integration test instead of in prod.
|
|
103
126
|
- TEA design done at planning for R-3 stories paid off.
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Verifica que as skills core (wize-subtract, wize-debt, wize-eli5) são
|
|
3
|
+
// renderizadas por TODOS os 12 adapters de harness.
|
|
4
|
+
//
|
|
5
|
+
// Uso:
|
|
6
|
+
// node tools/check-skills-all-adapters.js # valida a lista padrão
|
|
7
|
+
// node tools/check-skills-all-adapters.js wize-grill # valida skills específicas
|
|
8
|
+
'use strict';
|
|
9
|
+
const fs = require('node:fs');
|
|
10
|
+
const path = require('node:path');
|
|
11
|
+
const os = require('node:os');
|
|
12
|
+
|
|
13
|
+
const KIT = path.resolve(__dirname, '..');
|
|
14
|
+
|
|
15
|
+
// Skill code -> { dir, marker } — `dir` é o diretório esperado dentro de cada
|
|
16
|
+
// adapter e `marker` a string que precisa aparecer no arquivo renderizado.
|
|
17
|
+
const SKILLS = {
|
|
18
|
+
'wize-subtract': { dir: 'wize-subtract', marker: 'Subtraction Hunter' },
|
|
19
|
+
'wize-debt': { dir: 'wize-debt', marker: 'wize-debt:' },
|
|
20
|
+
'wize-eli5': { dir: 'wize-eli5', marker: 'Explain Like I Am 5' },
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
// Onde cada harness deposita uma skill `wize-{code}`.
|
|
24
|
+
const ADAPTERS = [
|
|
25
|
+
{ code: 'claude-code', path: (c) => `.claude/skills/${c}/SKILL.md` },
|
|
26
|
+
{ code: 'copilot', path: (c) => `.github/skills/${c}/SKILL.md` },
|
|
27
|
+
{ code: 'antigravity', path: (c) => `.agent/skills/${c}/SKILL.md` },
|
|
28
|
+
{ code: 'codex', path: (c) => `.agents/skills/${c}/SKILL.md` },
|
|
29
|
+
{ code: 'kimi-code', path: (c) => `.kimi/skills/${c}/SKILL.md` },
|
|
30
|
+
{ code: 'hermes', path: (c) => `.hermes/skills/${c}/SKILL.md` },
|
|
31
|
+
{ code: 'kiro', path: (c) => `.kiro/skills/${c}/SKILL.md` },
|
|
32
|
+
{ code: 'cursor', path: (c) => `.cursor/rules/${c}.mdc` },
|
|
33
|
+
{ code: 'windsurf', path: (c) => `.windsurf/rules/${c}.md` },
|
|
34
|
+
{ code: 'continue', path: (c) => `.continue/prompts/${c}.prompt` },
|
|
35
|
+
{ code: 'opencode', path: (c) => `.opencode/commands/${c}.md` },
|
|
36
|
+
{ code: 'generic', path: (c) => `.wize/agents/${c}.md` },
|
|
37
|
+
];
|
|
38
|
+
|
|
39
|
+
const requested = process.argv.slice(2);
|
|
40
|
+
const targets = requested.length ? requested : Object.keys(SKILLS);
|
|
41
|
+
for (const code of targets) {
|
|
42
|
+
if (!SKILLS[code]) {
|
|
43
|
+
console.error(`Skill desconhecida: ${code}. Conhecidas: ${Object.keys(SKILLS).join(', ')}`);
|
|
44
|
+
process.exit(2);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
let ok = 0, fail = 0;
|
|
49
|
+
|
|
50
|
+
for (const skill of targets) {
|
|
51
|
+
const { marker } = SKILLS[skill];
|
|
52
|
+
console.log(`\n${skill} (marcador: "${marker}")`);
|
|
53
|
+
|
|
54
|
+
for (const a of ADAPTERS) {
|
|
55
|
+
const root = fs.mkdtempSync(path.join(os.tmpdir(), `wize-${skill}-${a.code}-`));
|
|
56
|
+
try {
|
|
57
|
+
const mod = require(path.join(KIT, 'adapters', a.code, 'render.js'));
|
|
58
|
+
mod.render(KIT, root, { profiles: ['core'] });
|
|
59
|
+
const rel = a.path(skill);
|
|
60
|
+
const f = path.join(root, rel);
|
|
61
|
+
if (!fs.existsSync(f)) {
|
|
62
|
+
console.log(` ✖ ${a.code.padEnd(11)} -> ${rel} NÃO foi gerado`);
|
|
63
|
+
fail++;
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
const content = fs.readFileSync(f, 'utf-8');
|
|
67
|
+
// O corpo da skill é o que precisa estar lá; o código `wize-{skill}` só
|
|
68
|
+
// aparece no frontmatter, que não é copiado por todos os adapters
|
|
69
|
+
// (cursor/windsurf/opencode/generic não carregam o code no arquivo).
|
|
70
|
+
if (content.includes(marker)) {
|
|
71
|
+
console.log(` ✓ ${a.code.padEnd(11)} -> ${rel}`);
|
|
72
|
+
ok++;
|
|
73
|
+
} else {
|
|
74
|
+
console.log(` ✖ ${a.code}: ${rel} existe mas não contém o corpo esperado ("${marker}")`);
|
|
75
|
+
fail++;
|
|
76
|
+
}
|
|
77
|
+
} catch (e) {
|
|
78
|
+
console.log(` ✖ ${a.code}: erro ao renderizar — ${e.message}`);
|
|
79
|
+
fail++;
|
|
80
|
+
} finally {
|
|
81
|
+
fs.rmSync(root, { recursive: true, force: true });
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const total = targets.length * ADAPTERS.length;
|
|
87
|
+
console.log(`\n${ok}/${total} renderizações OK (${targets.length} skill(s) × ${ADAPTERS.length} harnesses).`);
|
|
88
|
+
process.exit(fail ? 1 : 0);
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
//
|
|
6
6
|
// Harness priority is:
|
|
7
7
|
// 1. user's selected IDE targets (from .wize/config/project.toml), highest first
|
|
8
|
-
// 2. claude > codex > opencode > hermes > kiro-cli (universal fallback)
|
|
8
|
+
// 2. claude > copilot > codex > opencode > hermes > kiro-cli (universal fallback)
|
|
9
9
|
//
|
|
10
10
|
// Set WIZE_SKIP_BASELINE=1 in the environment to disable any execution (the
|
|
11
11
|
// install still suggests the next step). Useful for CI and unattended setups.
|
|
@@ -26,6 +26,11 @@ const HARNESSES = [
|
|
|
26
26
|
binary: 'claude',
|
|
27
27
|
buildCmd: (prompt) => ({ cmd: 'claude', args: ['-p', prompt] })
|
|
28
28
|
},
|
|
29
|
+
{
|
|
30
|
+
code: 'copilot',
|
|
31
|
+
binary: 'copilot',
|
|
32
|
+
buildCmd: (prompt) => ({ cmd: 'copilot', args: ['-p', prompt] })
|
|
33
|
+
},
|
|
29
34
|
{
|
|
30
35
|
code: 'codex',
|
|
31
36
|
binary: 'codex',
|
|
@@ -106,7 +111,7 @@ function manualInstructions(harness) {
|
|
|
106
111
|
if (!harness) {
|
|
107
112
|
return [
|
|
108
113
|
'',
|
|
109
|
-
'No AI harness CLI was detected on PATH (claude / codex / opencode / hermes / kiro-cli).',
|
|
114
|
+
'No AI harness CLI was detected on PATH (claude / copilot / codex / opencode / hermes / kiro-cli).',
|
|
110
115
|
'Open your IDE in this repo and run:',
|
|
111
116
|
' /wize-document-project',
|
|
112
117
|
''
|
|
@@ -57,6 +57,7 @@ function adapterTargetPath(targetCode, projectRoot) {
|
|
|
57
57
|
// Mirror of the adapter render conventions documented in adapters/README.md.
|
|
58
58
|
switch (targetCode) {
|
|
59
59
|
case 'claude-code': return path.join(projectRoot, '.claude/skills');
|
|
60
|
+
case 'copilot': return path.join(projectRoot, '.github/skills');
|
|
60
61
|
case 'antigravity': return path.join(projectRoot, '.agent/skills');
|
|
61
62
|
case 'codex': return path.join(projectRoot, '.agents/skills');
|
|
62
63
|
case 'kimi-code': return path.join(projectRoot, '.kimi/skills');
|
|
@@ -211,8 +211,12 @@ function collectAssets(kitRoot, { profiles = ['core'] } = {}) {
|
|
|
211
211
|
|
|
212
212
|
// Anthropic-style SKILL.md renderer used by Claude Code, Antigravity, Codex, Kimi.
|
|
213
213
|
// Each asset becomes <targetDir>/<code>/SKILL.md with YAML frontmatter (name, description).
|
|
214
|
+
// `opts.kinds` (optional) restricts the emitter to some asset kinds — GitHub
|
|
215
|
+
// Copilot uses it to send workflows/skills to .github/skills/ while its personas
|
|
216
|
+
// go out as .agent.md custom agents instead.
|
|
214
217
|
function renderAnthropicSkills(kitRoot, targetDir, opts = {}) {
|
|
215
|
-
const
|
|
218
|
+
const kinds = opts.kinds ? new Set(opts.kinds) : null;
|
|
219
|
+
const assets = collectAssets(kitRoot, opts).filter(a => !kinds || kinds.has(a.kind));
|
|
216
220
|
const written = [];
|
|
217
221
|
if (!opts.dryRun) ensureDir(targetDir);
|
|
218
222
|
|
|
@@ -303,6 +307,34 @@ function renderAgentsMd(kitRoot, projectRoot, opts = {}) {
|
|
|
303
307
|
'implementation and review, a high-capability tier only for architecture, critical',
|
|
304
308
|
'decisions, or final adversarial review.',
|
|
305
309
|
'',
|
|
310
|
+
'## Writing code (always on)',
|
|
311
|
+
'',
|
|
312
|
+
'Before writing new code, climb this ladder and stop at the first rung that holds:',
|
|
313
|
+
'',
|
|
314
|
+
'1. Does this need to exist? → no: skip it (YAGNI).',
|
|
315
|
+
'2. Already in this codebase? → reuse the helper, util, or pattern; don\'t rewrite it.',
|
|
316
|
+
'3. Does the standard library do it? → use it.',
|
|
317
|
+
'4. Does a platform or framework feature cover it? → use it.',
|
|
318
|
+
'5. Does an already-installed dependency solve it? → use it.',
|
|
319
|
+
'6. Is it one line? → write the one line.',
|
|
320
|
+
'7. Only then: the minimum code that works.',
|
|
321
|
+
'',
|
|
322
|
+
'The ladder runs **after** you understand the problem: read the code the change touches and',
|
|
323
|
+
'trace the real flow before picking a rung.',
|
|
324
|
+
'',
|
|
325
|
+
'- No abstractions, configuration, or boilerplate nobody asked for. No new dependency if it can be avoided.',
|
|
326
|
+
'- Deletion over addition. Boring over clever. Fewest files possible.',
|
|
327
|
+
'- Bug fix = root cause, not symptom: grep every caller of the function you touch and fix the shared function once.',
|
|
328
|
+
'- The shortest working diff wins — but only once you understand the problem.',
|
|
329
|
+
'',
|
|
330
|
+
'Lazy, not negligent — never on the chopping block: input validation at trust boundaries,',
|
|
331
|
+
'error handling that prevents data loss, security, accessibility, tests on non-trivial logic,',
|
|
332
|
+
'and anything explicitly requested.',
|
|
333
|
+
'',
|
|
334
|
+
'A deliberate shortcut with a known ceiling gets a `wize-debt:` comment naming the ceiling and',
|
|
335
|
+
'the upgrade trigger, so it can be harvested later with `/wize-debt`. Before a PR, run',
|
|
336
|
+
'`/wize-subtract` on the diff — the best review outcome is a shorter diff.',
|
|
337
|
+
'',
|
|
306
338
|
'## Roster',
|
|
307
339
|
''
|
|
308
340
|
];
|
|
@@ -21,6 +21,8 @@ const GITIGNORE_BODY = [
|
|
|
21
21
|
'',
|
|
22
22
|
'# Generated IDE adapter outputs (regenerate with `npx wize-dev-kit install`)',
|
|
23
23
|
'.claude/skills/wize-*',
|
|
24
|
+
'.github/skills/wize-*',
|
|
25
|
+
'.github/agents/wize-*.agent.md',
|
|
24
26
|
'.agent/skills/wize-*',
|
|
25
27
|
'.agents/skills/wize-*',
|
|
26
28
|
'.kimi/skills/wize-*',
|
|
@@ -28,6 +28,14 @@ function checkWorkflow(file) {
|
|
|
28
28
|
if (!/^name:/m.test(content)) errs.push('missing "name:"');
|
|
29
29
|
if (!/^owner:/m.test(content) && !/^module:/m.test(content)) errs.push('missing "owner:" or "module:"');
|
|
30
30
|
if (!/^description:/m.test(content)) errs.push('missing "description:"');
|
|
31
|
+
// The kit's parser (readFrontmatter) reads a double-quoted scalar with
|
|
32
|
+
// /^"([^"]*)"$/, so an escaped quote inside the value (\" or \') breaks it:
|
|
33
|
+
// the value is parsed with its wrapping quotes and re-escaped on render.
|
|
34
|
+
// Write descriptions without inner quotes instead.
|
|
35
|
+
const dm = content.match(/^description:\s*"(.*)"\s*$/m);
|
|
36
|
+
if (dm && /\\["']/.test(dm[1])) {
|
|
37
|
+
errs.push('description contains escaped quotes (\\" or \\\') — the kit parser does not support them; rewrite without quotes');
|
|
38
|
+
}
|
|
31
39
|
return errs;
|
|
32
40
|
}
|
|
33
41
|
|
|
@@ -33,6 +33,7 @@ const KIT_VERSION = require(path.join(KIT_ROOT, 'package.json')).version;
|
|
|
33
33
|
|
|
34
34
|
const TARGETS = [
|
|
35
35
|
{ code: 'claude-code', label: 'Claude Code (.claude/skills/)', default: true },
|
|
36
|
+
{ code: 'copilot', label: 'GitHub Copilot (.github/skills/ + .github/agents/)', default: false },
|
|
36
37
|
{ code: 'cursor', label: 'Cursor (.cursor/rules/)', default: false },
|
|
37
38
|
{ code: 'windsurf', label: 'Windsurf', default: false },
|
|
38
39
|
{ code: 'codex', label: 'Codex', default: false },
|