wdi-method 0.4.3 → 0.4.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/README.md +252 -222
  2. package/bin/wdi-method.js +1030 -1029
  3. package/kit/.constitution/document/delivery-flow-guide.md +1 -1
  4. package/kit/.constitution/document/templates/cross-cutting.md +4 -4
  5. package/kit/.constitution/document/templates/model.md +2 -2
  6. package/kit/.constitution/document/templates/questions.md +10 -9
  7. package/kit/.constitution/document/templates/srs.md +2 -2
  8. package/kit/.constitution/scripts/inventory.py +102 -100
  9. package/kit/.constitution/scripts/timeline.py +665 -665
  10. package/kit/.constitution/scripts/validate.py +314 -312
  11. package/kit/assets/bmad-custom/bmad-advanced-elicitation.toml +15 -15
  12. package/kit/assets/bmad-custom/bmad-architecture.toml +17 -15
  13. package/kit/assets/bmad-custom/bmad-build-auto.toml +5 -5
  14. package/kit/assets/bmad-custom/bmad-build.toml +52 -52
  15. package/kit/assets/bmad-custom/bmad-code-review.toml +6 -5
  16. package/kit/assets/bmad-custom/bmad-correct-course.toml +28 -27
  17. package/kit/assets/bmad-custom/bmad-deep-recon.toml +12 -11
  18. package/kit/assets/bmad-custom/bmad-prd.toml +22 -22
  19. package/kit/assets/bmad-custom/bmad-product-brief.toml +34 -34
  20. package/kit/assets/bmad-custom/bmad-retrospective.toml +9 -9
  21. package/kit/assets/bmad-custom/bmad-spec.toml +9 -8
  22. package/kit/assets/bmad-custom/bmad-ux.toml +7 -7
  23. package/kit/assets/bmad-custom/config.toml +3 -3
  24. package/kit/skills/wdi-report/SKILL.md +5 -5
  25. package/package.json +2 -2
  26. package/scaffold/.control/product-glossary.md +21 -21
  27. package/scaffold/.control/project-non-technical-log.md +23 -23
  28. package/scaffold/.control/questions/answered.md +11 -11
  29. package/scaffold/.control/questions/assumptions.md +15 -15
  30. package/scaffold/.control/questions/blocking.md +21 -21
  31. package/scaffold/.control/questions/external.md +11 -11
  32. package/scaffold/.control/registry/components.yaml +21 -21
  33. package/scaffold/.control/registry/defects.yaml +3 -3
  34. package/scaffold/.control/registry/index.yaml +46 -46
  35. package/scaffold/.control/registry/requirements.yaml +15 -15
  36. package/scaffold/.control/registry/risks.yaml +5 -5
  37. package/scaffold/.control/registry/usecases.yaml +6 -6
@@ -44,11 +44,11 @@ it prints before reading anything else:
44
44
 
45
45
  | What it says | What you MUST do |
46
46
  |---|---|
47
- | `rtm/status belum ada` (exit 3) | Stop. The tables cannot be built, so there is nothing honest to report |
48
- | `git tidak menjawab` (exit 3) | Stop. Every actual date comes from git; without it there is no time dimension |
49
- | `registry punya perubahan yang belum dicommit` | Say so in the report header. The numbers describe a working tree, not `main` |
50
- | `story tanpa riwayat git` | Name those stories. They count toward progres janji but cannot appear under Proven |
51
- | `n temuan validator` | Report the count and, if any are red, say which gate they block |
47
+ | `rtm/status not yet generated` (exit 3) | Stop. The tables cannot be built, so there is nothing honest to report |
48
+ | `git did not respond` (exit 3) | Stop. Every actual date comes from git; without it there is no time dimension |
49
+ | `the registry has uncommitted changes` | Say so in the report header. The numbers describe a working tree, not `main` |
50
+ | `story with no git history` | Name those stories. They count toward promise progress but cannot appear under Proven |
51
+ | `n findings` | Report the count and, if any are red, say which gate they block |
52
52
 
53
53
  A report built on stale tables is worse than no report: it looks authoritative and is not.
54
54
 
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "wdi-method",
3
- "version": "0.4.3",
3
+ "version": "0.4.6",
4
4
  "description": "WDI Method — software delivery method that wraps BMad",
5
5
  "type": "module",
6
6
  "bin": {
7
- "wdi-method": "./bin/wdi-method.js"
7
+ "wdi-method": "bin/wdi-method.js"
8
8
  },
9
9
  "files": [
10
10
  "bin/",
@@ -1,21 +1,21 @@
1
- # Product Glossary
2
-
3
- **Dimuat saat:** menulis dokumen apa pun di korpus.
4
-
5
- SSOT kosakata **produk** — apa yang produk ini bicarakan. Tiap istilah didefinisikan **sekali** di
6
- sini, lalu dipakai apa adanya di seluruh korpus.
7
-
8
- Kosakata **metode** tinggal di `.constitution/method-glossary.md` dan MUST NOT didefinisikan ulang di
9
- sini. Tes pemisahnya: apakah istilah ini tetap berlaku kalau dipakai di produk lain? Ya
10
- `method-glossary.md`, tidak → sini.
11
-
12
- ## Aturan
13
-
14
- - Istilah baru yang muncul di dokumen mana pun MUST ditambahkan ke sini **dalam lintasan yang sama**.
15
- - Definisi MUST menyebut hubungan ke istilah lain dan kardinalitasnya bila relevan.
16
- - Satu istilah MUST NOT punya dua entri.
17
- - Berkas ini lahir **kosong** dan diisi dari produknya. Entri pertamanya lahir bersama brief di G1.
18
-
19
- ## Entri
20
-
21
- <!-- Urut abjad. Format: **Istilah** — definisi. Hubungan. Kardinalitas bila relevan. -->
1
+ # Product Glossary
2
+
3
+ **Loaded when:** writing any document in the corpus.
4
+
5
+ The SSOT for **product** vocabulary what this product talks about. Every term is defined **once**
6
+ here, then used as-is across the corpus.
7
+
8
+ **Method** vocabulary lives in `.constitution/method-glossary.md` and MUST NOT be redefined here. The
9
+ split test: does this term still hold if used in another product? Yes `method-glossary.md`, no →
10
+ here.
11
+
12
+ ## Rules
13
+
14
+ - A new term appearing in any document MUST be added here **in the same pass**.
15
+ - A definition MUST name its relationship to other terms and its cardinality where relevant.
16
+ - One term MUST NOT have two entries.
17
+ - This file is born **empty** and filled from the product. Its first entries are born with the brief at G1.
18
+
19
+ ## Entries
20
+
21
+ <!-- Alphabetical. Format: **Term** — definition. Relationship. Cardinality where relevant. -->
@@ -1,23 +1,23 @@
1
- # Project Non-Technical Log
2
-
3
- **Dimuat saat:** sebuah fakta non-teknis yang membatasi pembangunan produk ini berubah, atau saat
4
- mencari tahu apa yang sudah berlaku di luar kode.
5
-
6
- Ditulis lewat skill `wdi-log` intent `fact`, tidak pernah dengan tangan langsung.
7
-
8
- Tes satu kalimat: **kalau angkanya dihapus dan faktanya masih berguna bagi yang membangun, ia boleh
9
- di sini.**
10
-
11
- Kategori: `domain` · `akun` · `legal` · `jadwal` · `organisasi`.
12
-
13
- ## Berlaku
14
-
15
- | id | Tanggal | Kategori | Fakta | Akibat | Sumber |
16
- |---|---|---|---|---|---|
17
- | — | — | — | — | — | — |
18
-
19
- ## Tidak Berlaku Lagi
20
-
21
- | id | Fakta | Berhenti berlaku | Digantikan |
22
- |---|---|---|---|
23
- | — | — | — | — |
1
+ # Project Non-Technical Log
2
+
3
+ **Loaded when:** a non-technical fact that constrains this product's build changes, or when finding
4
+ out what already holds outside the code.
5
+
6
+ Written through the `wdi-log` skill's `fact` intent, never by hand directly.
7
+
8
+ One-sentence test: **if the number were deleted and the fact would still be useful to whoever is
9
+ building, it belongs here.**
10
+
11
+ Categories: `domain` · `account` · `legal` · `schedule` · `organisation`.
12
+
13
+ ## In force
14
+
15
+ | id | Date | Category | Fact | Effect | Source |
16
+ |---|---|---|---|---|---|
17
+ | — | — | — | — | — | — |
18
+
19
+ ## No longer in force
20
+
21
+ | id | Fact | Stopped holding | Superseded by |
22
+ |---|---|---|---|
23
+ | — | — | — | — |
@@ -1,11 +1,11 @@
1
- # Terjawab
2
-
3
- **Dimuat saat:** mencari keputusan yang sudah diambil lewat pertanyaan, bukan lewat `DEC-`.
4
-
5
- Baris pindah ke sini dari ketiga daftar lain. MUST NOT dihapus.
6
-
7
- ## Terjawab
8
-
9
- | id | Pertanyaan | Jawaban | Ditutup |
10
- |---|---|---|---|
11
- | — | — | — | — |
1
+ # Answered
2
+
3
+ **Loaded when:** looking for a decision that was reached through a question, not through a `DEC-`.
4
+
5
+ Rows move here from the other three lists. MUST NOT be deleted.
6
+
7
+ ## Answered
8
+
9
+ | id | Question | Answer | Closed |
10
+ |---|---|---|---|
11
+ | — | — | — | — |
@@ -1,15 +1,15 @@
1
- # Asumsi
2
-
3
- **Dimuat saat:** disapu sekali per gate; boleh dilewati.
4
-
5
- Kelas **default** sebuah pertanyaan. Agent mengambil jawabannya sendiri lalu mencatatnya di sini, satu
6
- baris: asumsinya, plus akibat kalau ia salah. Berkas ini **tidak menahan apa pun**.
7
-
8
- Sebuah baris di sini MUST naik ke `blocking.md` begitu ia lulus salah satu dari tiga tes yang berkas
9
- itu nyatakan.
10
-
11
- ## Terbuka
12
-
13
- | id | Asumsi | Akibat kalau salah | Diambil | Oleh |
14
- |---|---|---|---|---|
15
- | — | — | — | — | — |
1
+ # Assumptions
2
+
3
+ **Loaded when:** swept once per gate; MAY be skipped.
4
+
5
+ The **default** class for a question. The agent takes the answer itself and records it here, one
6
+ row: the assumption, plus the cost if it turns out wrong. This file **holds nothing**.
7
+
8
+ A row here MUST move up to `blocking.md` the moment it passes one of the three tests that file
9
+ states.
10
+
11
+ ## Open
12
+
13
+ | id | Assumption | Cost if wrong | Taken | By |
14
+ |---|---|---|---|---|
15
+ | — | — | — | — | — |
@@ -1,21 +1,21 @@
1
- # Pertanyaan yang Memblokir
2
-
3
- **Dimuat saat:** setiap gate.
4
-
5
- Hanya berkas ini yang menahan sebuah gate. Ditulis lewat `wdi-question`, tidak pernah dengan tangan
6
- langsung; bentuk barisnya di `.constitution/document/templates/questions.md`.
7
-
8
- Sasarannya **≤3 baris per Product Component**. Sebuah pertanyaan naik ke sini hanya lewat tiga tes,
9
- salah satu cukup:
10
-
11
- 1. Menyentuh uang, data pribadi, atau kewajiban legal.
12
- 2. Mengubah bunyi janji sebuah `FR`.
13
- 3. Salah menjawab memaksa tulis ulang lebih dari satu komponen.
14
-
15
- Gagal ketiganya → `assumptions.md`. Sebuah pertanyaan MUST NOT didaftarkan di sini "untuk aman".
16
-
17
- ## Terbuka
18
-
19
- | id | Pertanyaan | Memblokir | Owner | Sebelum |
20
- |---|---|---|---|---|
21
- | — | — | — | — | — |
1
+ # Blocking Questions
2
+
3
+ **Loaded when:** every gate.
4
+
5
+ Only this file holds a gate. Written through `wdi-question`, never by hand directly; the row shape
6
+ lives in `.constitution/document/templates/questions.md`.
7
+
8
+ Target **<=3 rows per Product Component**. A question rises to here only through three tests, one is
9
+ enough:
10
+
11
+ 1. It touches money, personal data, or a legal obligation.
12
+ 2. It changes the wording of an `FR`'s promise.
13
+ 3. Answering it wrong forces a rewrite of more than one component.
14
+
15
+ Failing all three → `assumptions.md`. A question MUST NOT be filed here "to be safe".
16
+
17
+ ## Open
18
+
19
+ | id | Question | Blocks | Owner | Before |
20
+ |---|---|---|---|---|
21
+ | — | — | — | — | — |
@@ -1,11 +1,11 @@
1
- # Menunggu Pihak Luar
2
-
3
- **Dimuat saat:** ada jawaban yang hanya bisa datang dari luar sesi ini.
4
-
5
- Berkas ini **tidak menahan gate** kecuali barisnya juga ditunjuk dari `blocking.md`.
6
-
7
- ## Terbuka
8
-
9
- | id | Pertanyaan | Menunggu | Sejak |
10
- |---|---|---|---|
11
- | — | — | — | — |
1
+ # Waiting on an Outside Party
2
+
3
+ **Loaded when:** an answer can only come from outside this session.
4
+
5
+ This file **does not hold a gate** unless its row is also pointed to from `blocking.md`.
6
+
7
+ ## Open
8
+
9
+ | id | Question | Waiting on | Since |
10
+ |---|---|---|---|
11
+ | — | — | — | — |
@@ -1,21 +1,21 @@
1
- # components.yaml — SSOT untuk Product Component, container, dan Logical Component
2
- #
3
- # Tiga hal berbeda, dua di antaranya berbagi kata "component":
4
- # Product Component (PC) — irisan DOMAIN, permukaan yang bisa disebut pengguna
5
- # Container — unit yang berjalan atau dideploy sendiri; C4 L2 memilikinya
6
- # Logical Component (LC) — satu unit build yang bisa ditunjuk
7
- #
8
- # `mode` — KEDALAMAN DOKUMEN. Ditulis HANYA pada komponen yang memang perlu beda dari global.
9
- # `risk_accepted` — INTENSITAS REVIEW, bukan kedalaman. low · medium · high
10
- # `owns` — entitas domain yang komponen ini BERWENANG MENULIS.
11
- # `g4_passed` — hanya berarti pada komponen ber-mode di atas catalog.
12
- #
13
- # Komponen lahir lewat wdi-init intent `component` di ekor G2. Berkas ini lahir kosong.
14
-
15
- product_components: []
16
-
17
- platform_owns: []
18
-
19
- containers: []
20
-
21
- logical_components: []
1
+ # components.yaml — SSOT for Product Components, containers, and Logical Components
2
+ #
3
+ # Three different things, two of which share the word "component":
4
+ # Product Component (PC) — a DOMAIN slice, a surface a user could name
5
+ # Container — a unit that runs or deploys on its own; owned by C4 L2
6
+ # Logical Component (LC) — one nameable build unit
7
+ #
8
+ # `mode` — DOCUMENT DEPTH. Written ONLY on a component that genuinely needs to differ from global.
9
+ # `risk_accepted` — REVIEW INTENSITY, not depth. low · medium · high
10
+ # `owns` — the domain entities this component is AUTHORISED TO WRITE.
11
+ # `g4_passed` — only means something on a component at a mode above catalog.
12
+ #
13
+ # A component is born through wdi-init intent `component` at the tail of G2. This file is born empty.
14
+
15
+ product_components: []
16
+
17
+ platform_owns: []
18
+
19
+ containers: []
20
+
21
+ logical_components: []
@@ -1,3 +1,3 @@
1
- # defects.yaml — SSOT untuk cacat: bug biasa dan hotfix.
2
-
3
- defects: []
1
+ # defects.yaml — SSOT for defects: ordinary bugs and hotfixes.
2
+
3
+ defects: []
@@ -1,46 +1,46 @@
1
- # index.yaml — peta kendali
2
- #
3
- # Memuat yang tidak punya rumah di registry lain: identitas produk, kedalaman global, peran, jatah
4
- # waktu gate, jatah pertanyaan terbuka, dan kosakata `touches`.
5
-
6
- # IDENTITAS PRODUK. Satu-satunya tempat terstruktur. Diisi di G1.
7
- # constitution.md Pasal 1 dan judul brief mengutip nilai inimereka MUST NOT menjadi sumber kedua.
8
- product:
9
- name: "{product}"
10
- client: ""
11
-
12
- # KEDALAMAN GLOBAL. Satu-satunya knob kedalaman dokumen, dan ia MUST NOT ikut mengendalikan intensitas
13
- # review itu `risk_accepted` per komponen di components.yaml.
14
- # catalog daftar UC + tiga inventaris + C4; nol berkas tambahan per komponen. G4 dilewati
15
- # outline + alur penuh maks 3 UC, business rule lokal, Decision Summary, daftar LC
16
- # guarded + Failure Behaviour seluruh boundary, Inherited Constraints, dokumen integrasi
17
- # deep + ABCE, spec kontrak per endpoint, data dictionary, flow, state machine, skenario
18
- # Default `catalog` bila baris ini tidak ada. Baris per komponen di components.yaml MENANG atas ini.
19
- # Tidak ada scope ketiga: `mode` MUST NOT di-override per wave maupun per SPEC.md.
20
- mode: catalog
21
-
22
- # GATE YANG SUDAH LULUS. Ditulis hanya atas keputusan pemilik repo di gate-nya sendiri, dan MUST NOT
23
- # diisi agent untuk membuka jalan bagi dirinya.
24
- gates_passed: []
25
-
26
- roles: []
27
- # - role: Product Owner
28
- # files: []
29
-
30
- gates:
31
- G1: { name: Problem, stage: 1, budget_minutes: 20 }
32
- G2: { name: Product, stage: 2, budget_minutes: 45 }
33
- G3: { name: Blueprint, stage: 3, budget_minutes: 45 }
34
- G4: { name: Component, stage: 4, budget_minutes: 30 }
35
- G5: { name: Release, stage: 5, budget_minutes: 10 }
36
-
37
- question_budget:
38
- blocking_per_component: 3
39
- assumptions_per_gate: 15
40
-
41
- wave_sizes:
42
- S: { stories: "<=3", note: "tanpa FR baru; G4 dan G5 digabung satu sesi 20 menit" }
43
- M: { stories: "4-12", note: "seperti biasa" }
44
- L: { stories: ">12", note: "atau container baru; retrospektif dijalankan" }
45
-
46
- touches_vocabulary: []
1
+ # index.yaml — the control map
2
+ #
3
+ # Holds what has no home in another registry: product identity, global depth, roles, gate time
4
+ # budgets, the open-question budget, and the `touches` vocabulary.
5
+
6
+ # PRODUCT IDENTITY. The one structured place for it. Filled at G1.
7
+ # constitution.md Article 1 and the brief's title quote this value they MUST NOT become a second source.
8
+ product:
9
+ name: "{product}"
10
+ client: ""
11
+
12
+ # GLOBAL DEPTH. The only document-depth knob, and it MUST NOT also govern review intensity —
13
+ # that is `risk_accepted` per component in components.yaml.
14
+ # catalog UC list + three inventories + C4; zero extra files per component. G4 is skipped
15
+ # outline + full flows for at most 3 UC, local business rules, Decision Summary, LC list
16
+ # guarded + Failure Behaviour for every boundary, Inherited Constraints, integration documents
17
+ # deep + ABCE, a contract spec per endpoint, data dictionary, flow, state machine, scenarios
18
+ # Defaults to `catalog` when this line is absent. A component's own row in components.yaml WINS over this.
19
+ # There is no third scope: `mode` MUST NOT be overridden per wave or per SPEC.md.
20
+ mode: catalog
21
+
22
+ # GATES ALREADY PASSED. Written only by the repo owner's own decision at their own gate, and MUST NOT
23
+ # be filled by an agent to clear its own way forward.
24
+ gates_passed: []
25
+
26
+ roles: []
27
+ # - role: Product Owner
28
+ # files: []
29
+
30
+ gates:
31
+ G1: { name: Problem, stage: 1, budget_minutes: 20 }
32
+ G2: { name: Product, stage: 2, budget_minutes: 45 }
33
+ G3: { name: Blueprint, stage: 3, budget_minutes: 45 }
34
+ G4: { name: Component, stage: 4, budget_minutes: 30 }
35
+ G5: { name: Release, stage: 5, budget_minutes: 10 }
36
+
37
+ question_budget:
38
+ blocking_per_component: 3
39
+ assumptions_per_gate: 15
40
+
41
+ wave_sizes:
42
+ S: { stories: "<=3", note: "no new FR; G4 and G5 merge into one 20-minute session" }
43
+ M: { stories: "4-12", note: "as usual" }
44
+ L: { stories: ">12", note: "or a new container; a retrospective runs" }
45
+
46
+ touches_vocabulary: []
@@ -1,15 +1,15 @@
1
- # requirements.yaml — SSOT untuk BG · CAP · FR · NFR · UJ
2
- #
3
- # Kunci berbahasa Inggris; isi nilainya Bahasa Indonesia.
4
- # Nomor dialokasikan DARI SINI dan MUST NOT dimulai ulang per dokumen, per komponen, atau per rilis.
5
- # Deretnya global untuk satu produk.
6
-
7
- goals: []
8
-
9
- capabilities: []
10
-
11
- functional: []
12
-
13
- nonfunctional: []
14
-
15
- journeys: []
1
+ # requirements.yaml — SSOT for BG · CAP · FR · NFR · UJ
2
+ #
3
+ # Keys are English; prose values follow the product's chosen `doc_language`.
4
+ # Numbers are allocated FROM HERE and MUST NOT restart per document, per component, or per release.
5
+ # The sequence is global to one product.
6
+
7
+ goals: []
8
+
9
+ capabilities: []
10
+
11
+ functional: []
12
+
13
+ nonfunctional: []
14
+
15
+ journeys: []
@@ -1,5 +1,5 @@
1
- # risks.yaml — Risk Register
2
- #
3
- # `pivot_trigger` adalah kondisi terukur yang membuat berbelok atau menyerah jadi tindakan benar.
4
-
5
- risks: []
1
+ # risks.yaml — Risk Register
2
+ #
3
+ # `pivot_trigger` is a measurable condition that makes turning or giving up the right call.
4
+
5
+ risks: []
@@ -1,6 +1,6 @@
1
- # usecases.yaml — SSOT untuk UC
2
- #
3
- # `critical: true` bila UC itu menyentuh UANG, DATA PRIBADI, atau TINDAKAN TAK-TERBALIKKAN.
4
- # Label ini menentukan sesuatu HANYA pada `mode: deep`.
5
-
6
- usecases: []
1
+ # usecases.yaml — SSOT for UC
2
+ #
3
+ # `critical: true` when the UC touches MONEY, PERSONAL DATA, or an IRREVERSIBLE ACTION.
4
+ # This label decides something ONLY at `mode: deep`.
5
+
6
+ usecases: []