@wazir-dev/cli 1.2.0 → 1.4.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 +54 -44
- package/README.md +13 -13
- package/assets/demo.cast +47 -0
- package/assets/demo.gif +0 -0
- package/docs/anti-patterns/AP-23-skipping-enabled-workflows.md +28 -0
- package/docs/anti-patterns/AP-24-clarifier-deciding-scope.md +34 -0
- package/docs/concepts/architecture.md +1 -1
- package/docs/concepts/why-wazir.md +1 -1
- package/docs/readmes/INDEX.md +1 -1
- package/docs/readmes/features/expertise/README.md +1 -1
- package/docs/readmes/features/hooks/pre-compact-summary.md +1 -1
- package/docs/reference/hooks.md +1 -0
- package/docs/reference/launch-checklist.md +3 -3
- package/docs/reference/review-loop-pattern.md +3 -2
- package/docs/reference/skill-tiers.md +2 -2
- package/docs/research/2026-03-20-agents/a18fb002157904af5.txt +187 -0
- package/docs/research/2026-03-20-agents/a1d0ac79ac2f11e6f.txt +2 -0
- package/docs/research/2026-03-20-agents/a324079de037abd7c.txt +198 -0
- package/docs/research/2026-03-20-agents/a357586bccfafb0e5.txt +256 -0
- package/docs/research/2026-03-20-agents/a4365394e4d753105.txt +137 -0
- package/docs/research/2026-03-20-agents/a492af28bc52d3613.txt +136 -0
- package/docs/research/2026-03-20-agents/a4984db0b6a8eee07.txt +124 -0
- package/docs/research/2026-03-20-agents/a5b30e59d34bbb062.txt +214 -0
- package/docs/research/2026-03-20-agents/a5cf7829dab911586.txt +165 -0
- package/docs/research/2026-03-20-agents/a607157c30dd97c9e.txt +96 -0
- package/docs/research/2026-03-20-agents/a60b68b1e19d1e16b.txt +115 -0
- package/docs/research/2026-03-20-agents/a722af01c5594aba0.txt +166 -0
- package/docs/research/2026-03-20-agents/a787bdc516faa5829.txt +181 -0
- package/docs/research/2026-03-20-agents/a7c46d1bba1056ed2.txt +132 -0
- package/docs/research/2026-03-20-agents/a7e5abbab2b281a0d.txt +100 -0
- package/docs/research/2026-03-20-agents/a8dbadc66cd0d7d5a.txt +95 -0
- package/docs/research/2026-03-20-agents/a904d9f45d6b86a6d.txt +75 -0
- package/docs/research/2026-03-20-agents/a927659a942ee7f60.txt +102 -0
- package/docs/research/2026-03-20-agents/a962cb569191f7583.txt +125 -0
- package/docs/research/2026-03-20-agents/aab6decea538aac41.txt +148 -0
- package/docs/research/2026-03-20-agents/abd58b853dd938a1b.txt +295 -0
- package/docs/research/2026-03-20-agents/ac009da573eff7f65.txt +100 -0
- package/docs/research/2026-03-20-agents/ac1bc783364405e5f.txt +190 -0
- package/docs/research/2026-03-20-agents/aca5e2b57fde152a0.txt +132 -0
- package/docs/research/2026-03-20-agents/ad849b8c0a7e95b8b.txt +176 -0
- package/docs/research/2026-03-20-agents/adc2b12a4da32c962.txt +258 -0
- package/docs/research/2026-03-20-agents/af97caaaa9a80e4cb.txt +146 -0
- package/docs/research/2026-03-20-agents/afc5faceee368b3ca.txt +111 -0
- package/docs/research/2026-03-20-agents/afdb282d866e3c1e4.txt +164 -0
- package/docs/research/2026-03-20-agents/afe9d1f61c02b1e8d.txt +299 -0
- package/docs/research/2026-03-20-agents/b4hmkwril.txt +1856 -0
- package/docs/research/2026-03-20-agents/b80ptk89g.txt +1856 -0
- package/docs/research/2026-03-20-agents/bf54s1jss.txt +1150 -0
- package/docs/research/2026-03-20-agents/bhd6kq2kx.txt +1856 -0
- package/docs/research/2026-03-20-agents/bmb2fodyr.txt +988 -0
- package/docs/research/2026-03-20-agents/bmmsrij8i.txt +826 -0
- package/docs/research/2026-03-20-agents/bn4t2ywpu.txt +2175 -0
- package/docs/research/2026-03-20-agents/bu22t9f1z.txt +0 -0
- package/docs/research/2026-03-20-agents/bwvl98v2p.txt +738 -0
- package/docs/research/2026-03-20-agents/psych-a3697a7fd06eb64fd.txt +135 -0
- package/docs/research/2026-03-20-agents/psych-a37776fabc870feae.txt +123 -0
- package/docs/research/2026-03-20-agents/psych-a5b1fe05c0589efaf.txt +2 -0
- package/docs/research/2026-03-20-agents/psych-a95c15b1f29424435.txt +76 -0
- package/docs/research/2026-03-20-agents/psych-a9c26f4d9172dde7c.txt +2 -0
- package/docs/research/2026-03-20-agents/psych-aa19c69f0ca2c5ad3.txt +2 -0
- package/docs/research/2026-03-20-agents/psych-aa4e4cb70e1be5ecb.txt +95 -0
- package/docs/research/2026-03-20-agents/psych-ab5b302f26a554663.txt +102 -0
- package/docs/research/2026-03-20-deep-research-complete.md +101 -0
- package/docs/research/2026-03-20-deep-research-status.md +38 -0
- package/docs/research/2026-03-20-enforcement-research.md +107 -0
- package/expertise/antipatterns/process/ai-coding-antipatterns.md +117 -0
- package/expertise/composition-map.yaml +27 -8
- package/expertise/digests/reviewer/ai-coding-digest.md +83 -0
- package/expertise/digests/reviewer/architectural-thinking-digest.md +63 -0
- package/expertise/digests/reviewer/architecture-antipatterns-digest.md +49 -0
- package/expertise/digests/reviewer/code-smells-digest.md +53 -0
- package/expertise/digests/reviewer/coupling-cohesion-digest.md +54 -0
- package/expertise/digests/reviewer/ddd-digest.md +60 -0
- package/expertise/digests/reviewer/dependency-risk-digest.md +40 -0
- package/expertise/digests/reviewer/error-handling-digest.md +55 -0
- package/expertise/digests/reviewer/review-methodology-digest.md +49 -0
- package/exports/hosts/claude/.claude/commands/learn.md +61 -8
- package/exports/hosts/claude/.claude/commands/plan-review.md +3 -1
- package/exports/hosts/claude/.claude/commands/verify.md +30 -1
- package/exports/hosts/claude/.claude/settings.json +7 -6
- package/exports/hosts/claude/export.manifest.json +8 -5
- package/exports/hosts/claude/host-package.json +3 -0
- package/exports/hosts/codex/export.manifest.json +8 -5
- package/exports/hosts/codex/host-package.json +3 -0
- package/exports/hosts/cursor/.cursor/hooks.json +6 -6
- package/exports/hosts/cursor/export.manifest.json +8 -5
- package/exports/hosts/cursor/host-package.json +3 -0
- package/exports/hosts/gemini/export.manifest.json +8 -5
- package/exports/hosts/gemini/host-package.json +3 -0
- package/hooks/definitions/pretooluse_dispatcher.yaml +26 -0
- package/hooks/definitions/pretooluse_pipeline_guard.yaml +22 -0
- package/hooks/definitions/stop_pipeline_gate.yaml +22 -0
- package/hooks/hooks.json +7 -6
- package/hooks/pretooluse-dispatcher +84 -0
- package/hooks/pretooluse-pipeline-guard +9 -0
- package/hooks/stop-pipeline-gate +9 -0
- package/llms-full.txt +48 -18
- package/package.json +2 -3
- package/schemas/decision.schema.json +15 -0
- package/schemas/hook.schema.json +4 -1
- package/schemas/phase-report.schema.json +9 -0
- package/skills/TEMPLATE-3-ZONE.md +160 -0
- package/skills/brainstorming/SKILL.md +137 -21
- package/skills/clarifier/SKILL.md +364 -53
- package/skills/claude-cli/SKILL.md +91 -12
- package/skills/codex-cli/SKILL.md +91 -12
- package/skills/debugging/SKILL.md +133 -38
- package/skills/design/SKILL.md +173 -37
- package/skills/dispatching-parallel-agents/SKILL.md +129 -31
- package/skills/executing-plans/SKILL.md +113 -25
- package/skills/executor/SKILL.md +252 -21
- package/skills/finishing-a-development-branch/SKILL.md +107 -18
- package/skills/gemini-cli/SKILL.md +91 -12
- package/skills/humanize/SKILL.md +92 -13
- package/skills/init-pipeline/SKILL.md +90 -18
- package/skills/prepare-next/SKILL.md +93 -24
- package/skills/receiving-code-review/SKILL.md +90 -16
- package/skills/requesting-code-review/SKILL.md +100 -24
- package/skills/requesting-code-review/code-reviewer.md +29 -17
- package/skills/reviewer/SKILL.md +270 -57
- package/skills/run-audit/SKILL.md +92 -15
- package/skills/scan-project/SKILL.md +93 -14
- package/skills/self-audit/SKILL.md +133 -39
- package/skills/skill-research/SKILL.md +275 -0
- package/skills/subagent-driven-development/SKILL.md +129 -30
- package/skills/subagent-driven-development/code-quality-reviewer-prompt.md +30 -2
- package/skills/subagent-driven-development/implementer-prompt.md +40 -27
- package/skills/subagent-driven-development/spec-reviewer-prompt.md +25 -12
- package/skills/tdd/SKILL.md +125 -20
- package/skills/using-git-worktrees/SKILL.md +118 -28
- package/skills/using-skills/SKILL.md +116 -29
- package/skills/verification/SKILL.md +160 -17
- package/skills/wazir/SKILL.md +750 -120
- package/skills/writing-plans/SKILL.md +134 -28
- package/skills/writing-skills/SKILL.md +91 -13
- package/skills/writing-skills/anthropic-best-practices.md +104 -64
- package/skills/writing-skills/persuasion-principles.md +100 -34
- package/tooling/src/capture/command.js +46 -2
- package/tooling/src/capture/decision.js +40 -0
- package/tooling/src/capture/store.js +33 -0
- package/tooling/src/capture/user-input.js +66 -0
- package/tooling/src/checks/security-sensitivity.js +69 -0
- package/tooling/src/cli.js +28 -26
- package/tooling/src/config/depth-table.js +60 -0
- package/tooling/src/export/compiler.js +7 -8
- package/tooling/src/guards/guardrail-functions.js +131 -0
- package/tooling/src/guards/phase-prerequisite-guard.js +97 -3
- package/tooling/src/hooks/pretooluse-dispatcher.js +300 -0
- package/tooling/src/hooks/pretooluse-pipeline-guard.js +141 -0
- package/tooling/src/hooks/stop-pipeline-gate.js +92 -0
- package/tooling/src/init/auto-detect.js +0 -2
- package/tooling/src/init/command.js +3 -95
- package/tooling/src/learn/pipeline.js +177 -0
- package/tooling/src/state/db.js +251 -2
- package/tooling/src/state/pipeline-state.js +262 -0
- package/tooling/src/status/command.js +6 -1
- package/tooling/src/verify/proof-collector.js +299 -0
- package/wazir.manifest.yaml +3 -0
- package/workflows/learn.md +61 -8
- package/workflows/plan-review.md +3 -1
- package/workflows/verify.md +30 -1
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# Code Smells — Reviewer Digest
|
|
2
|
+
|
|
3
|
+
> Detection-focused extract for reviewer context. For full remediation guidance, see `antipatterns/code/code-smells.md`.
|
|
4
|
+
|
|
5
|
+
## Method-Level Smells
|
|
6
|
+
|
|
7
|
+
| Smell | Detection Signal | Severity |
|
|
8
|
+
|-------|-----------------|----------|
|
|
9
|
+
| **Long Method** | >30 lines or >3 levels of nesting | medium |
|
|
10
|
+
| **Parameter List** | >4 parameters | medium |
|
|
11
|
+
| **Feature Envy** | Method accesses another object's data more than its own | high |
|
|
12
|
+
| **Message Chains** | `a.b().c().d()` — 3+ chained calls | medium |
|
|
13
|
+
| **Inappropriate Intimacy** | Class reaches into another's private/internal state | high |
|
|
14
|
+
| **Refused Bequest** | Subclass overrides parent methods to do nothing | medium |
|
|
15
|
+
|
|
16
|
+
## Class-Level Smells
|
|
17
|
+
|
|
18
|
+
| Smell | Detection Signal | Severity |
|
|
19
|
+
|-------|-----------------|----------|
|
|
20
|
+
| **Large Class** | >300 lines or >10 public methods | medium |
|
|
21
|
+
| **God Class** | Handles >3 unrelated responsibilities | high |
|
|
22
|
+
| **Data Class** | Only getters/setters, no behavior | low |
|
|
23
|
+
| **Lazy Class** | <3 methods, delegating everything | low |
|
|
24
|
+
| **Speculative Generality** | Abstract classes/interfaces with single implementation | medium |
|
|
25
|
+
| **Middle Man** | Class delegates >80% of methods to another | medium |
|
|
26
|
+
|
|
27
|
+
## Structural Smells
|
|
28
|
+
|
|
29
|
+
| Smell | Detection Signal | Severity |
|
|
30
|
+
|-------|-----------------|----------|
|
|
31
|
+
| **Shotgun Surgery** | One change requires edits to 5+ files | high |
|
|
32
|
+
| **Divergent Change** | One file changes for multiple unrelated reasons | high |
|
|
33
|
+
| **Parallel Inheritance** | Adding a subclass in one hierarchy requires adding one in another | medium |
|
|
34
|
+
| **Data Clumps** | Same 3+ fields appear together in multiple places | medium |
|
|
35
|
+
| **Primitive Obsession** | Using primitives where a domain type would be clearer | low |
|
|
36
|
+
| **Switch Statements** | Repeated switch/if-else on the same discriminant | medium |
|
|
37
|
+
|
|
38
|
+
## Code Duplication
|
|
39
|
+
|
|
40
|
+
| Smell | Detection Signal | Severity |
|
|
41
|
+
|-------|-----------------|----------|
|
|
42
|
+
| **Exact Duplication** | Identical blocks >5 lines | high |
|
|
43
|
+
| **Structural Duplication** | Same algorithm with different types/names | medium |
|
|
44
|
+
| **Semantic Duplication** | Different code doing the same thing | medium |
|
|
45
|
+
|
|
46
|
+
## Naming Smells
|
|
47
|
+
|
|
48
|
+
| Smell | Detection Signal | Severity |
|
|
49
|
+
|-------|-----------------|----------|
|
|
50
|
+
| **Misleading Name** | Name implies different behavior than actual | high |
|
|
51
|
+
| **Inconsistent Naming** | Same concept has different names across files | medium |
|
|
52
|
+
| **Generic Name** | `data`, `info`, `handler`, `manager`, `utils` without qualifier | medium |
|
|
53
|
+
| **Encoded Type** | Hungarian notation or type in name (`strName`, `arrList`) | low |
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# Coupling & Cohesion — Reviewer Digest
|
|
2
|
+
|
|
3
|
+
> Evaluation-focused extract for reviewer context. For full guidance, see `architecture/foundations/coupling-and-cohesion.md`.
|
|
4
|
+
|
|
5
|
+
## Coupling Assessment
|
|
6
|
+
|
|
7
|
+
| Coupling Type | Detection Signal | Severity |
|
|
8
|
+
|---------------|-----------------|----------|
|
|
9
|
+
| **Content Coupling** | One module directly modifies another's internal state (private fields, internal data structures) | critical |
|
|
10
|
+
| **Common Coupling** | Multiple modules read/write shared global state (global config they all mutate, shared DB table without coordination) | high |
|
|
11
|
+
| **Control Coupling** | Function parameter controls another module's execution flow (boolean flag argument that switches behavior) | medium |
|
|
12
|
+
| **Stamp Coupling** | Passing a large object when only 1-2 fields are needed (entire User object for a function that needs email) | low |
|
|
13
|
+
| **Data Coupling** | Passing only needed data — this is GOOD coupling | none (target) |
|
|
14
|
+
| **Message Coupling** | Modules communicate through events/messages with no identity knowledge — this is BEST coupling | none (target) |
|
|
15
|
+
|
|
16
|
+
## Cohesion Assessment
|
|
17
|
+
|
|
18
|
+
| Cohesion Type | Detection Signal | Quality |
|
|
19
|
+
|---------------|-----------------|---------|
|
|
20
|
+
| **Functional** | Module does one thing and does it completely | best |
|
|
21
|
+
| **Sequential** | Output of one operation feeds input of the next (ETL pipeline) | good |
|
|
22
|
+
| **Communicational** | Operations work on the same data (read, compute, format same record) | acceptable |
|
|
23
|
+
| **Temporal** | Operations happen at the same time but serve different purposes (init, cleanup) | poor |
|
|
24
|
+
| **Logical** | Operations share control flow but not purpose (util files, catch-all handlers) | poor |
|
|
25
|
+
| **Coincidental** | No relationship between operations (random grab-bag module) | worst |
|
|
26
|
+
|
|
27
|
+
## Quick Check
|
|
28
|
+
|
|
29
|
+
For each module in the diff, ask:
|
|
30
|
+
1. **Cohesion:** Can I describe this module's purpose in one sentence without "and"? If no, low cohesion.
|
|
31
|
+
2. **Coupling:** If I change this module's internals, how many other files need to change? If >2, high coupling.
|
|
32
|
+
3. **Direction:** Do dependencies flow from unstable (UI, API handlers) toward stable (domain, utilities)? If reversed, structural debt.
|
|
33
|
+
|
|
34
|
+
## Connascence Quick Reference
|
|
35
|
+
|
|
36
|
+
Connascence refines coupling into a more granular classification. Ordered from weakest (acceptable) to strongest (most harmful):
|
|
37
|
+
|
|
38
|
+
| Connascence | Description | Acceptable? |
|
|
39
|
+
|-------------|-------------|-------------|
|
|
40
|
+
| **Name** | Two components must agree on a name (function name, variable name) | Yes — unavoidable and cheaply refactored |
|
|
41
|
+
| **Type** | Two components must agree on a type (parameter type, return type) | Yes — enforced by type systems |
|
|
42
|
+
| **Meaning** | Two components must agree on the meaning of a value (true = active, 0 = success) | Caution — use enums/constants instead of magic values |
|
|
43
|
+
| **Position** | Two components must agree on parameter order | Caution — use named parameters or option objects |
|
|
44
|
+
| **Algorithm** | Two components must use the same algorithm (hashing, encoding) | Risky — extract shared algorithm to single location |
|
|
45
|
+
| **Execution** | Two components must execute in a specific order | Risky — make ordering explicit in control flow |
|
|
46
|
+
| **Timing** | Two components must execute at the same time or within a window | High risk — source of race conditions |
|
|
47
|
+
| **Value** | Two components must have correlated values (e.g., two arrays that must be same length) | High risk — encapsulate into a single data structure |
|
|
48
|
+
| **Identity** | Two components must reference the same object instance | High risk — shared mutable state |
|
|
49
|
+
|
|
50
|
+
## Module Boundary Health
|
|
51
|
+
|
|
52
|
+
- Modules should have narrow interfaces (few public exports relative to total code)
|
|
53
|
+
- Changes should be localized: a bugfix in module A should not require changes in modules B, C, D
|
|
54
|
+
- Test for boundary health: can you write a unit test for this module without importing 5+ other modules?
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Domain-Driven Design — Reviewer Digest
|
|
2
|
+
|
|
3
|
+
> Evaluation-focused extract for reviewer context. For full guidance, see `architecture/foundations/domain-driven-design.md`.
|
|
4
|
+
|
|
5
|
+
## Bounded Context Check
|
|
6
|
+
|
|
7
|
+
- Is the module boundary aligned with a domain concept (not a technical layer)?
|
|
8
|
+
- Do different modules use the same term to mean different things? If yes, a context boundary is needed.
|
|
9
|
+
- Are there translation/mapping layers between modules? If not and they share types, potential coupling risk.
|
|
10
|
+
- Is the system applying DDD where it's warranted? (Complex domain logic, multiple teams, long-lived system) Or is it over-engineering CRUD?
|
|
11
|
+
|
|
12
|
+
## Entity & Value Object Check
|
|
13
|
+
|
|
14
|
+
- Do domain objects have identity (ID field) that persists across state changes? If yes, they are Entities.
|
|
15
|
+
- Are domain objects defined purely by their attributes (money, address, date range)? If yes, they are Value Objects.
|
|
16
|
+
- Are entities being compared by value when they should be compared by ID?
|
|
17
|
+
- Are value objects being given IDs when they should be immutable and interchangeable?
|
|
18
|
+
- Are value objects actually immutable? (No setters, no mutation methods)
|
|
19
|
+
|
|
20
|
+
## Aggregate Check
|
|
21
|
+
|
|
22
|
+
- Is there a clear aggregate root that controls access to child entities?
|
|
23
|
+
- Are child entities being accessed directly (bypassing the root)? This breaks aggregate invariants.
|
|
24
|
+
- Does the aggregate enforce its invariants (validation, state transitions)?
|
|
25
|
+
- Are aggregates too large? (>5 entities suggests decomposition needed)
|
|
26
|
+
- Are aggregates being loaded in full when only a subset is needed? (Performance smell)
|
|
27
|
+
- Do transactions span multiple aggregates? (Design smell — aggregates should be consistency boundaries)
|
|
28
|
+
|
|
29
|
+
## Domain Event Check
|
|
30
|
+
|
|
31
|
+
- Are significant state changes published as domain events?
|
|
32
|
+
- Do event names use past tense and domain language? (`OrderPlaced`, not `HandleOrder`)
|
|
33
|
+
- Are events immutable once published?
|
|
34
|
+
- Is there a clear distinction between domain events (within bounded context) and integration events (across contexts)?
|
|
35
|
+
|
|
36
|
+
## Naming Review
|
|
37
|
+
|
|
38
|
+
| Signal | Issue | Severity |
|
|
39
|
+
|--------|-------|----------|
|
|
40
|
+
| Generic names: `Service`, `Manager`, `Handler`, `Processor` | Missing domain language | medium |
|
|
41
|
+
| Technical names in domain layer: `UserDTO`, `OrderRepository` | Infrastructure leaking into domain | medium |
|
|
42
|
+
| Inconsistent naming: `Customer` in one module, `Client` in another for same concept | Missing ubiquitous language | high |
|
|
43
|
+
| Verb-only names: `validate`, `process`, `handle` without domain qualifier | Ambiguous responsibility | medium |
|
|
44
|
+
| Pluralization confusion: `Order` entity vs `Orders` service vs `OrderList` collection | No naming convention | low |
|
|
45
|
+
|
|
46
|
+
## Repository Pattern Check
|
|
47
|
+
|
|
48
|
+
- Do repositories return domain objects (not database rows/DTOs)?
|
|
49
|
+
- Is the repository interface in the domain layer, implementation in infrastructure?
|
|
50
|
+
- Are queries filtering by domain concepts (not SQL/table structure)?
|
|
51
|
+
- Is there one repository per aggregate root? (Not per entity or per table)
|
|
52
|
+
|
|
53
|
+
## Strategic DDD Red Flags
|
|
54
|
+
|
|
55
|
+
| Signal | Issue | Severity |
|
|
56
|
+
|--------|-------|----------|
|
|
57
|
+
| Universal data model shared across all modules | Missing bounded contexts | high |
|
|
58
|
+
| One "User" type used everywhere with 30+ fields | Context-specific models needed | high |
|
|
59
|
+
| Tactical patterns (Aggregates, Value Objects) without strategic boundaries | Cargo-culting DDD | medium |
|
|
60
|
+
| No ubiquitous language — developers and domain experts use different terms | Core DDD principle violated | high |
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# Dependency Risk — Reviewer Digest
|
|
2
|
+
|
|
3
|
+
> Detection-focused extract for reviewer context. For full analysis, see `antipatterns/code/dependency-antipatterns.md`.
|
|
4
|
+
|
|
5
|
+
## Dependency Antipatterns
|
|
6
|
+
|
|
7
|
+
| Antipattern | Detection Signal | Severity |
|
|
8
|
+
|-------------|-----------------|----------|
|
|
9
|
+
| **Trivial Dependency (Left-Pad)** | Package imported for one utility function achievable in <10 lines | medium |
|
|
10
|
+
| **Phantom Dependency** | Import resolves at dev time but not in production (missing from package.json `dependencies`) | critical |
|
|
11
|
+
| **Version Range Roulette** | `"*"` or `"latest"` or overly broad ranges (`^0.x`) in package.json | high |
|
|
12
|
+
| **Dependency Confusion** | Internal package name collides with public registry name; no scoped namespace | critical |
|
|
13
|
+
| **Typosquatting Risk** | Package name is one character off from a popular package | high |
|
|
14
|
+
| **Circular Dependency** | A imports B imports C imports A | high |
|
|
15
|
+
| **Diamond Dependency** | Two deps require incompatible versions of a shared transitive dep | high |
|
|
16
|
+
| **Stale Lock File** | package-lock.json / yarn.lock not updated after package.json change | medium |
|
|
17
|
+
| **Dev Dependency in Production** | devDependency imported in src/ code | high |
|
|
18
|
+
| **Unused Dependency** | Package in package.json but no import found in src/ | low |
|
|
19
|
+
| **Deprecated API Usage** | Calling APIs marked @deprecated in the dependency | medium |
|
|
20
|
+
| **Tightly Coupled to Dependency** | Dependency's types/interfaces leak through public API | medium |
|
|
21
|
+
| **Unmaintained Dependency** | No commits in 12+ months, unresolved security advisories | medium |
|
|
22
|
+
| **License Incompatibility** | Dependency license conflicts with project license (e.g., GPL in MIT project) | high |
|
|
23
|
+
| **Transitive Bloat** | Adding one dependency pulls in 100+ transitive deps | medium |
|
|
24
|
+
|
|
25
|
+
## Import Health Checks
|
|
26
|
+
|
|
27
|
+
- Every `import` or `require` resolves to an installed package or local file
|
|
28
|
+
- No circular import chains (check with `madge --circular`)
|
|
29
|
+
- Lock file is consistent with package.json
|
|
30
|
+
- No `node_modules` path imports (e.g., `require('pkg/node_modules/sub')`)
|
|
31
|
+
- No relative imports escaping package boundaries (e.g., `../../other-package/src/`)
|
|
32
|
+
|
|
33
|
+
## New Dependency Evaluation
|
|
34
|
+
|
|
35
|
+
When a PR adds a new dependency, check:
|
|
36
|
+
1. **Necessity:** Can the functionality be achieved in <20 lines without the dep?
|
|
37
|
+
2. **Health:** Last publish date, open issues ratio, known CVEs
|
|
38
|
+
3. **Size:** What is the install footprint? (check `bundlephobia` or `packagephobia`)
|
|
39
|
+
4. **License:** Compatible with project license?
|
|
40
|
+
5. **Alternatives:** Is there a lighter or more maintained alternative?
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# Error Handling — Reviewer Digest
|
|
2
|
+
|
|
3
|
+
> Detection-focused extract for reviewer context. For full analysis, see `antipatterns/code/error-handling-antipatterns.md`.
|
|
4
|
+
|
|
5
|
+
## Error Handling Antipatterns
|
|
6
|
+
|
|
7
|
+
| Antipattern | Detection Signal | Severity |
|
|
8
|
+
|-------------|-----------------|----------|
|
|
9
|
+
| **Pokemon Exception (AP-01)** | `catch(Exception e)` / `catch(e) {}` catching everything without discrimination | critical |
|
|
10
|
+
| **Swallowed Exception (AP-02)** | Empty catch block, or catch that only logs without re-throwing or recovering | high |
|
|
11
|
+
| **Exception as Flow Control (AP-03)** | Using try/catch for expected conditions (not found, validation failure, empty input) | medium |
|
|
12
|
+
| **Incomplete Error Handling (AP-04)** | Handling some error cases but not others from the same operation | high |
|
|
13
|
+
| **Missing Async Error Handling (AP-05)** | `await` without try/catch or `.catch()`; unhandled promise rejections | high |
|
|
14
|
+
| **Re-throw Without Context (AP-06)** | `catch(e) { throw e }` losing stack/context information; no wrapping | medium |
|
|
15
|
+
| **Error String Matching (AP-07)** | `if (error.message.includes('not found'))` instead of typed error classes | medium |
|
|
16
|
+
| **Silent Failure (AP-08)** | Function returns null/undefined on error with no indication to caller | high |
|
|
17
|
+
| **Inconsistent Error Types (AP-09)** | Same module throws Error, string, object, and number | medium |
|
|
18
|
+
| **Missing Error Boundary (AP-10)** | UI component tree can crash entirely from one child component error | high |
|
|
19
|
+
| **Retry Without Backoff (AP-11)** | Retrying failed operations in a tight loop without exponential backoff | high |
|
|
20
|
+
| **Logging Without Acting (AP-12)** | `catch(e) { logger.error(e) }` — logged but no recovery, no re-throw, no alert | high |
|
|
21
|
+
| **Overly Broad Recovery (AP-13)** | Catch block returns a default value for ALL errors, masking different failure modes | high |
|
|
22
|
+
| **Missing Cleanup (AP-14)** | Resources (file handles, DB connections, locks) not released in error paths | high |
|
|
23
|
+
| **User-Facing Stack Traces (AP-15)** | Error responses include internal stack traces, file paths, or SQL queries | high (security) |
|
|
24
|
+
| **Missing Correlation ID (AP-16)** | Errors logged without request/trace ID, making debugging across services impossible | medium |
|
|
25
|
+
|
|
26
|
+
## Async Error Patterns
|
|
27
|
+
|
|
28
|
+
- Every `await` should be in a try/catch or the promise should have `.catch()`
|
|
29
|
+
- `Promise.all` should handle partial failures (use `Promise.allSettled` if appropriate)
|
|
30
|
+
- Event handlers and callbacks should have error handling
|
|
31
|
+
- Stream/iterator error events should be subscribed to
|
|
32
|
+
- Async generators should handle `throw()` method calls
|
|
33
|
+
|
|
34
|
+
## Error Propagation Check
|
|
35
|
+
|
|
36
|
+
- Do errors propagate upward with context added at each layer?
|
|
37
|
+
- Is there a top-level error handler (global catch, error middleware, process.on('unhandledRejection'))?
|
|
38
|
+
- Are user-facing error messages sanitized (no stack traces, no internal details)?
|
|
39
|
+
- Are errors logged with correlation IDs for tracing?
|
|
40
|
+
- Do error responses use consistent format (error code + message + optional details)?
|
|
41
|
+
|
|
42
|
+
## Transaction & State Consistency
|
|
43
|
+
|
|
44
|
+
- Are multi-step mutations wrapped in transactions?
|
|
45
|
+
- If a step fails mid-operation, is partial state rolled back or compensated?
|
|
46
|
+
- Are idempotency keys used for operations that might be retried?
|
|
47
|
+
- Do constructors/initializers validate invariants, or can objects be created in invalid state?
|
|
48
|
+
|
|
49
|
+
## Resource Cleanup Checklist
|
|
50
|
+
|
|
51
|
+
- File handles: opened in try, closed in finally
|
|
52
|
+
- Database connections: returned to pool in finally
|
|
53
|
+
- Locks/mutexes: released in finally
|
|
54
|
+
- Temporary files: deleted in finally
|
|
55
|
+
- Event listeners: removed in cleanup/dispose
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# Code Review Methodology — Reviewer Digest
|
|
2
|
+
|
|
3
|
+
> Detection-focused extract for reviewer context. For full analysis, see `antipatterns/process/code-review-antipatterns.md`.
|
|
4
|
+
|
|
5
|
+
## Reviewer Antipatterns to Avoid
|
|
6
|
+
|
|
7
|
+
| Antipattern | Signal You're Doing It | Correction |
|
|
8
|
+
|-------------|----------------------|------------|
|
|
9
|
+
| **Rubber Stamping (AP-01)** | All passes clean with no findings | Every diff has something worth noting. Look harder. |
|
|
10
|
+
| **Nitpick Focus (AP-02)** | >50% of findings are style/formatting | Rebalance: logic > structure > style |
|
|
11
|
+
| **Too-Late Review (AP-03)** | Raising architectural objections after full implementation | Review early artifacts (spec, design, plan) when available |
|
|
12
|
+
| **Scope Creep (AP-04)** | Suggesting features/refactors outside the diff | Review what changed. File issues for what should change next. |
|
|
13
|
+
| **Severity Inflation (AP-05)** | Everything is "blocking" | Reserve blocking for: security, data loss, crash, wrong behavior. |
|
|
14
|
+
| **Severity Deflation (AP-06)** | Nothing is "blocking" despite clear bugs | If it would break in production, it's blocking. Period. |
|
|
15
|
+
| **Confirmation Bias (AP-07)** | Checking "did they follow the plan" not "does it work" | Test against the spec, not the approach. |
|
|
16
|
+
| **Anchoring (AP-08)** | Prior review pass findings anchoring this pass | Each pass is independent. Re-read the diff fresh. |
|
|
17
|
+
| **Inconsistent Standards (AP-09)** | Different quality bar for different authors or modules | Apply the same severity criteria uniformly across the codebase. |
|
|
18
|
+
| **Review by Checklist Only (AP-10)** | Mechanically checking boxes without reading logic | Checklists supplement deep reading, they don't replace it. |
|
|
19
|
+
|
|
20
|
+
## Severity Calibration
|
|
21
|
+
|
|
22
|
+
| Severity | Criteria | Examples |
|
|
23
|
+
|----------|----------|---------|
|
|
24
|
+
| **blocking** | Would cause incorrect behavior, data loss, security vulnerability, or crash in production | Missing auth check, SQL injection, unhandled null, wrong business logic |
|
|
25
|
+
| **warning** | Degrades quality but does not break correctness | Missing error message, poor naming, missing test for edge case |
|
|
26
|
+
| **note** | Improvement opportunity, style preference, or observation | Alternative approach suggestion, documentation gap, minor duplication |
|
|
27
|
+
|
|
28
|
+
## Dimension Coverage Discipline
|
|
29
|
+
|
|
30
|
+
- Score EVERY assigned dimension, even if it passes cleanly
|
|
31
|
+
- A dimension with no findings gets score 10 with brief justification
|
|
32
|
+
- Never skip a dimension because "it looks fine" — that is rubber stamping
|
|
33
|
+
- Findings must reference specific file:line locations
|
|
34
|
+
|
|
35
|
+
## Review Pass Independence
|
|
36
|
+
|
|
37
|
+
- Each review pass is a fresh evaluation — do not anchor on previous pass findings
|
|
38
|
+
- Re-read the diff from scratch on each pass
|
|
39
|
+
- If a prior finding was fixed, verify the fix independently (don't assume it's correct)
|
|
40
|
+
- Track pass numbers explicitly: pass 1 of N, pass 2 of N
|
|
41
|
+
|
|
42
|
+
## Finding Quality Checklist
|
|
43
|
+
|
|
44
|
+
Each finding must have:
|
|
45
|
+
1. **Location:** file path and line number(s)
|
|
46
|
+
2. **Severity:** blocking / warning / note
|
|
47
|
+
3. **Dimension:** which review dimension it belongs to
|
|
48
|
+
4. **Description:** what the issue is and why it matters
|
|
49
|
+
5. **Source tag:** `[Internal]`, `[Codex]`, or `[Both]`
|
|
@@ -2,37 +2,90 @@
|
|
|
2
2
|
|
|
3
3
|
## Purpose
|
|
4
4
|
|
|
5
|
-
Extract durable scoped learnings
|
|
5
|
+
Extract durable scoped learnings from the completed run using the 4-stage promotion pipeline.
|
|
6
6
|
|
|
7
7
|
## Phase entry
|
|
8
8
|
|
|
9
9
|
On entering this phase, run:
|
|
10
|
-
`wazir capture event --run <run-id> --event phase_enter --phase
|
|
10
|
+
`wazir capture event --run <run-id> --event phase_enter --phase learn --status in_progress`
|
|
11
11
|
|
|
12
12
|
## Inputs
|
|
13
13
|
|
|
14
14
|
- run artifacts
|
|
15
|
-
- review findings
|
|
15
|
+
- review findings (all passes, all tiers)
|
|
16
16
|
- verification proof
|
|
17
17
|
|
|
18
18
|
## Primary Role
|
|
19
19
|
|
|
20
20
|
- `learner`
|
|
21
21
|
|
|
22
|
+
## Pipeline Stages
|
|
23
|
+
|
|
24
|
+
The learning pipeline follows a 4-stage promotion model (Tally → Candidate → Promote → Active):
|
|
25
|
+
|
|
26
|
+
### Stage 1: TALLY (Automatic)
|
|
27
|
+
|
|
28
|
+
Every finding from the run is:
|
|
29
|
+
1. Canonicalized (file paths, line numbers, identifiers stripped)
|
|
30
|
+
2. Hashed for dedup
|
|
31
|
+
3. Clustered by semantic similarity in `finding_clusters` table
|
|
32
|
+
4. Category-tagged (from the reviewer's finding category)
|
|
33
|
+
|
|
34
|
+
Also:
|
|
35
|
+
- Read `.wazir/runs/<id>/decisions.ndjson` for recurring patterns
|
|
36
|
+
- Append summary to `memory/findings/cumulative-findings.md`
|
|
37
|
+
|
|
38
|
+
Implementation: `tooling/src/learn/pipeline.js` → `tallyFinding()`
|
|
39
|
+
|
|
40
|
+
### Stage 2: CANDIDATE (Automatic)
|
|
41
|
+
|
|
42
|
+
Clusters meeting the promotion threshold are flagged:
|
|
43
|
+
- **Occurrence threshold:** 3+ findings with the same canonical pattern
|
|
44
|
+
- **Run threshold:** Pattern must appear across 2+ distinct runs
|
|
45
|
+
- **Drift cap:** No promotion if active antipatterns count >= 30
|
|
46
|
+
|
|
47
|
+
Implementation: `tooling/src/learn/pipeline.js` → `identifyCandidates()` + `promoteToCandidates()`
|
|
48
|
+
|
|
49
|
+
### Stage 3: PROMOTE (Human Gate)
|
|
50
|
+
|
|
51
|
+
Candidates are proposed for user review:
|
|
52
|
+
- Written to `memory/learnings/proposed/<run-id>-<NNN>.md`
|
|
53
|
+
- User reviews and accepts/rejects via `/wazir audit learnings`
|
|
54
|
+
- Accepted candidates move to `status: accepted` in `antipattern_candidates` table
|
|
55
|
+
|
|
56
|
+
### Stage 4: ACTIVE (Automatic)
|
|
57
|
+
|
|
58
|
+
Accepted antipatterns are loaded into reviewer context for future runs:
|
|
59
|
+
- Injected as project-level learnings alongside expertise modules
|
|
60
|
+
- Hit-rate tracked: if an antipattern triggers in <5% of runs over 90 days, it's demoted
|
|
61
|
+
- Max 30 active project-level antipatterns (drift prevention)
|
|
62
|
+
|
|
63
|
+
## Drift Prevention
|
|
64
|
+
|
|
65
|
+
- **Cap:** 30 active project antipatterns maximum
|
|
66
|
+
- **TTL:** 90-day expiry on unreviewed candidates
|
|
67
|
+
- **Demotion:** Antipatterns with <5% hit rate over 90 days are auto-demoted
|
|
68
|
+
- **Consolidation:** When count exceeds 25, similar antipatterns are merged
|
|
69
|
+
|
|
22
70
|
## Outputs
|
|
23
71
|
|
|
24
|
-
-
|
|
25
|
-
-
|
|
72
|
+
- Tallied findings in `finding_clusters` table
|
|
73
|
+
- Promoted candidates in `antipattern_candidates` table
|
|
74
|
+
- Proposed learning artifacts in `memory/learnings/proposed/`
|
|
75
|
+
- Cumulative findings appended to `memory/findings/cumulative-findings.md`
|
|
26
76
|
|
|
27
77
|
## Approval Gate
|
|
28
78
|
|
|
29
|
-
-
|
|
79
|
+
- Accepted learnings require explicit user review and scope tags
|
|
80
|
+
- Learnings are NEVER auto-applied to future runs without user acceptance
|
|
30
81
|
|
|
31
82
|
## Phase exit
|
|
32
83
|
|
|
33
84
|
On completing this phase, run:
|
|
34
|
-
`wazir capture event --run <run-id> --event phase_exit --phase
|
|
85
|
+
`wazir capture event --run <run-id> --event phase_exit --phase learn --status completed`
|
|
35
86
|
|
|
36
87
|
## Failure Conditions
|
|
37
88
|
|
|
38
|
-
- auto-applied learning drift
|
|
89
|
+
- auto-applied learning drift (bypassing human gate)
|
|
90
|
+
- candidate count exceeds cap without consolidation
|
|
91
|
+
- stale candidates not expired
|
|
@@ -39,7 +39,9 @@ On completing this phase, run:
|
|
|
39
39
|
|
|
40
40
|
## Loop Structure
|
|
41
41
|
|
|
42
|
-
Follows the review loop pattern in `docs/reference/review-loop-pattern.md` with plan dimensions. The planner role resolves findings. Pass count determined by depth. No extension.
|
|
42
|
+
Follows the review loop pattern in `docs/reference/review-loop-pattern.md` with 8 plan dimensions (including Input Coverage). The planner role resolves findings. Pass count determined by depth. No extension.
|
|
43
|
+
|
|
44
|
+
**Input Coverage dimension:** The reviewer reads the original input/briefing, counts distinct items, and compares against tasks in the plan. If `tasks_in_plan < items_in_input`, this is a HIGH finding listing the missing items. This prevents silent scope reduction where 21 input items become 5 tasks.
|
|
43
45
|
|
|
44
46
|
## Failure Conditions
|
|
45
47
|
|
|
@@ -14,6 +14,16 @@ On entering this phase, run:
|
|
|
14
14
|
- changed files
|
|
15
15
|
- claimed outcomes
|
|
16
16
|
- acceptance criteria
|
|
17
|
+
- project type (detected via `detectRunnableType(projectRoot)` → web | api | cli | library, from `tooling/src/verify/proof-collector.js`)
|
|
18
|
+
|
|
19
|
+
## Process
|
|
20
|
+
|
|
21
|
+
1. **Detect project type:** Run `detectRunnableType(projectRoot)` to determine verification strategy
|
|
22
|
+
2. **Collect evidence:** Run `collectProof(taskSpec, runConfig)` with the detected type
|
|
23
|
+
3. **For runnable output (web/api/cli):** Run the application and capture runtime evidence (build output, screenshots, curl responses, CLI output)
|
|
24
|
+
4. **For non-runnable output (library/config/skills):** Run lint, format check, type check, and tests — all must pass
|
|
25
|
+
5. **Save evidence:** Write to `.wazir/runs/<id>/artifacts/proof-<task>.json`
|
|
26
|
+
6. **Validate:** Ensure every acceptance criterion has at least one evidence item mapped to it
|
|
17
27
|
|
|
18
28
|
## Primary Role
|
|
19
29
|
|
|
@@ -21,7 +31,11 @@ On entering this phase, run:
|
|
|
21
31
|
|
|
22
32
|
## Outputs
|
|
23
33
|
|
|
24
|
-
- verification proof artifact
|
|
34
|
+
- verification proof artifact (produced by `collectProof` from `tooling/src/verify/proof-collector.js`)
|
|
35
|
+
|
|
36
|
+
## Proof Collection
|
|
37
|
+
|
|
38
|
+
Use `detectRunnableType` to classify the project, then `collectProof` to gather evidence. The proof-collector runs type-appropriate commands (build, test, lint, type-check) using `execFileSync` and returns structured `{ type, evidence }`.
|
|
25
39
|
|
|
26
40
|
## Approval Gate
|
|
27
41
|
|
|
@@ -32,6 +46,19 @@ On entering this phase, run:
|
|
|
32
46
|
On completing this phase, run:
|
|
33
47
|
`wazir capture event --run <run-id> --event phase_exit --phase <phase-name> --status completed`
|
|
34
48
|
|
|
49
|
+
## Proof of Implementation
|
|
50
|
+
|
|
51
|
+
The verifier detects whether the project output is runnable and collects appropriate evidence:
|
|
52
|
+
|
|
53
|
+
| Project Type | Detection | Evidence Collected |
|
|
54
|
+
|-------------|-----------|-------------------|
|
|
55
|
+
| `web` | next/vite/react-scripts in deps | Build output, Playwright screenshot (if available), curl response |
|
|
56
|
+
| `api` | express/fastify/hono in deps | curl endpoint responses with status codes |
|
|
57
|
+
| `cli` | `bin` field in package.json | `--help` output, test run with sample args |
|
|
58
|
+
| `library` | default (no runnable markers) | npm test, tsc, eslint, prettier — all must pass |
|
|
59
|
+
|
|
60
|
+
Evidence is saved to `.wazir/runs/<id>/artifacts/proof-<task>.json` using `collectProof()` from `tooling/src/verify/proof-collector.js`.
|
|
61
|
+
|
|
35
62
|
## Relationship to Review Loops
|
|
36
63
|
|
|
37
64
|
Verification is invoked per-task during execution, not as a review loop. It produces deterministic proof, not adversarial findings.
|
|
@@ -39,3 +66,5 @@ Verification is invoked per-task during execution, not as a review loop. It prod
|
|
|
39
66
|
## Failure Conditions
|
|
40
67
|
|
|
41
68
|
- stale or partial verification
|
|
69
|
+
- proof-collector reports `status: "fail"` for any evidence item
|
|
70
|
+
- runnable type detected but no evidence collected
|
|
@@ -1,21 +1,22 @@
|
|
|
1
1
|
{
|
|
2
2
|
"hooks": {
|
|
3
|
-
"
|
|
3
|
+
"Stop": [
|
|
4
4
|
{
|
|
5
|
-
"matcher": "Write|Edit",
|
|
6
5
|
"hooks": [
|
|
7
6
|
{
|
|
8
7
|
"type": "command",
|
|
9
|
-
"command": "./hooks/
|
|
8
|
+
"command": "./hooks/stop-pipeline-gate"
|
|
10
9
|
}
|
|
11
10
|
]
|
|
12
|
-
}
|
|
11
|
+
}
|
|
12
|
+
],
|
|
13
|
+
"PreToolUse": [
|
|
13
14
|
{
|
|
14
|
-
"matcher": "Bash",
|
|
15
|
+
"matcher": "Write|Edit|Bash",
|
|
15
16
|
"hooks": [
|
|
16
17
|
{
|
|
17
18
|
"type": "command",
|
|
18
|
-
"command": "./hooks/
|
|
19
|
+
"command": "./hooks/pretooluse-dispatcher"
|
|
19
20
|
}
|
|
20
21
|
]
|
|
21
22
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"host": "claude",
|
|
3
3
|
"source_hashes": {
|
|
4
|
-
"wazir.manifest.yaml": "
|
|
4
|
+
"wazir.manifest.yaml": "48a188248faf429807b241eb57fbb99afae3c6ddfdf71b24c5c532ca0bc2d33f",
|
|
5
5
|
"roles/clarifier.md": "1e1b8a2c05f1070fdcef485963cfcbffff62c4b2703a8d73fe51ac52d056e573",
|
|
6
6
|
"roles/content-author.md": "cc20b80bd70ab68b3239a9cf56bf1ffc2c06843d38afc6b190844b35a1d73c3e",
|
|
7
7
|
"roles/designer.md": "76cff5bda82975cfb4074de71681e7c8ba284e2e49d0cc98f90208642fef74fc",
|
|
@@ -18,23 +18,26 @@
|
|
|
18
18
|
"workflows/design.md": "7f69758b22f88c12d16846ac1dd444f4e178ab116559ef9f2f26f6daa1a10d62",
|
|
19
19
|
"workflows/discover.md": "0696add486f739a46ed4c2b71b67bdda3ab9fea2d1395e662191282529ed21d2",
|
|
20
20
|
"workflows/execute.md": "33428704476877b2c8cf34c6eda3a56d1fd71e8bbea0f05c122bb3da2c6475a6",
|
|
21
|
-
"workflows/learn.md": "
|
|
22
|
-
"workflows/plan-review.md": "
|
|
21
|
+
"workflows/learn.md": "450bbfbfaa9143365284e13c608f800e94caea47210c57d252d1c9a720160035",
|
|
22
|
+
"workflows/plan-review.md": "1dfe76dfe4fd9c32409d508e47654ad3b985b5429bd4616adde719b19fd606ac",
|
|
23
23
|
"workflows/plan.md": "fd52737159ab13688af8cbcb1c3fa224b1a9dda441b9ab337ab98cbfb5c68fa5",
|
|
24
24
|
"workflows/prepare-next.md": "8769b692be6d9fddf3b3f36fee6888159fb9fb2a5c31360cdbc9402e0f43fc27",
|
|
25
25
|
"workflows/review.md": "aaeaf7ab4515e325084a77e75e18b325295f8d16799f71f8b7cd0ec67c52c0d6",
|
|
26
26
|
"workflows/run-audit.md": "e582f767967dc3fb6aaeb938ad1672e7bed18bf044055ce8c45c2114251b787a",
|
|
27
27
|
"workflows/spec-challenge.md": "dc99137c28c49a6f8312924709afb6077754d128e90466dc911150ce15737897",
|
|
28
28
|
"workflows/specify.md": "53b84e74871f6dbd93cae22a881cc5907e398b29501d0a1fa08c7ed69df705cb",
|
|
29
|
-
"workflows/verify.md": "
|
|
29
|
+
"workflows/verify.md": "4eff7b9b1c94b9a2c4a6f65cae076a3cd5a278a86430109b6033cd958e1e8ab8",
|
|
30
30
|
"hooks/definitions/context_mode_router.yaml": "a10dc927418bc130b447eb33faf0f45669ecd9c7917f56947ddd74850a4e0e37",
|
|
31
31
|
"hooks/definitions/loop_cap_guard.yaml": "f0fd220e028ab6fad3d8fd650602884fe500ca4899eff6e428cf217af058618d",
|
|
32
32
|
"hooks/definitions/post_tool_capture.yaml": "a773cd6e18972dee8eef3b7cb06fd1d319a71de4588897cebfbe643f6781a3b2",
|
|
33
33
|
"hooks/definitions/pre_compact_summary.yaml": "daa0175d79f3e0127c5ce86a7a2f8df0be3f58b5c94fe749da715a17c7b2d04e",
|
|
34
34
|
"hooks/definitions/pre_tool_capture_route.yaml": "3c2663380ff3cd09f09de5b96bcf6123266fa74d8a03dfb2d6fbe40a43fb13cf",
|
|
35
|
+
"hooks/definitions/pretooluse_dispatcher.yaml": "5b0646ab17704e6f4665bb4c08ead5bcfe2aa6e71395fa5694cb0debcbce69da",
|
|
36
|
+
"hooks/definitions/pretooluse_pipeline_guard.yaml": "ac89617b91093ff0a39da0e8c48affbcaa71054666fa316a42c32f73f656ae69",
|
|
35
37
|
"hooks/definitions/protected_path_write_guard.yaml": "6683d41778b823e2a4e606065597569aa04363f091e135e165de9732f1fc2171",
|
|
36
38
|
"hooks/definitions/session_start.yaml": "9383fcf1f8304c87e57726478a461706c0fc73dc62bcc4d8661f2eeffa43a82d",
|
|
37
39
|
"hooks/definitions/stop_handoff_harvest.yaml": "67a3c0a8bb7cb66b88e77dc79e748082e964d278c47935662c453922a846482b",
|
|
38
|
-
"hooks/
|
|
40
|
+
"hooks/definitions/stop_pipeline_gate.yaml": "f27dde7605809aae56ac566b93b8692f5d40db1e11b569010e32d2878b677fcf",
|
|
41
|
+
"hooks/hooks.json": "65e022a151aa9546a6988581ee62ec853f0df5580aeed4b164e3ccc3dc2e72de"
|
|
39
42
|
}
|
|
40
43
|
}
|
|
@@ -32,9 +32,12 @@
|
|
|
32
32
|
"hooks/definitions/post_tool_capture.yaml",
|
|
33
33
|
"hooks/definitions/pre_compact_summary.yaml",
|
|
34
34
|
"hooks/definitions/pre_tool_capture_route.yaml",
|
|
35
|
+
"hooks/definitions/pretooluse_dispatcher.yaml",
|
|
36
|
+
"hooks/definitions/pretooluse_pipeline_guard.yaml",
|
|
35
37
|
"hooks/definitions/protected_path_write_guard.yaml",
|
|
36
38
|
"hooks/definitions/session_start.yaml",
|
|
37
39
|
"hooks/definitions/stop_handoff_harvest.yaml",
|
|
40
|
+
"hooks/definitions/stop_pipeline_gate.yaml",
|
|
38
41
|
"hooks/hooks.json"
|
|
39
42
|
],
|
|
40
43
|
"files": [
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"host": "codex",
|
|
3
3
|
"source_hashes": {
|
|
4
|
-
"wazir.manifest.yaml": "
|
|
4
|
+
"wazir.manifest.yaml": "48a188248faf429807b241eb57fbb99afae3c6ddfdf71b24c5c532ca0bc2d33f",
|
|
5
5
|
"roles/clarifier.md": "1e1b8a2c05f1070fdcef485963cfcbffff62c4b2703a8d73fe51ac52d056e573",
|
|
6
6
|
"roles/content-author.md": "cc20b80bd70ab68b3239a9cf56bf1ffc2c06843d38afc6b190844b35a1d73c3e",
|
|
7
7
|
"roles/designer.md": "76cff5bda82975cfb4074de71681e7c8ba284e2e49d0cc98f90208642fef74fc",
|
|
@@ -18,23 +18,26 @@
|
|
|
18
18
|
"workflows/design.md": "7f69758b22f88c12d16846ac1dd444f4e178ab116559ef9f2f26f6daa1a10d62",
|
|
19
19
|
"workflows/discover.md": "0696add486f739a46ed4c2b71b67bdda3ab9fea2d1395e662191282529ed21d2",
|
|
20
20
|
"workflows/execute.md": "33428704476877b2c8cf34c6eda3a56d1fd71e8bbea0f05c122bb3da2c6475a6",
|
|
21
|
-
"workflows/learn.md": "
|
|
22
|
-
"workflows/plan-review.md": "
|
|
21
|
+
"workflows/learn.md": "450bbfbfaa9143365284e13c608f800e94caea47210c57d252d1c9a720160035",
|
|
22
|
+
"workflows/plan-review.md": "1dfe76dfe4fd9c32409d508e47654ad3b985b5429bd4616adde719b19fd606ac",
|
|
23
23
|
"workflows/plan.md": "fd52737159ab13688af8cbcb1c3fa224b1a9dda441b9ab337ab98cbfb5c68fa5",
|
|
24
24
|
"workflows/prepare-next.md": "8769b692be6d9fddf3b3f36fee6888159fb9fb2a5c31360cdbc9402e0f43fc27",
|
|
25
25
|
"workflows/review.md": "aaeaf7ab4515e325084a77e75e18b325295f8d16799f71f8b7cd0ec67c52c0d6",
|
|
26
26
|
"workflows/run-audit.md": "e582f767967dc3fb6aaeb938ad1672e7bed18bf044055ce8c45c2114251b787a",
|
|
27
27
|
"workflows/spec-challenge.md": "dc99137c28c49a6f8312924709afb6077754d128e90466dc911150ce15737897",
|
|
28
28
|
"workflows/specify.md": "53b84e74871f6dbd93cae22a881cc5907e398b29501d0a1fa08c7ed69df705cb",
|
|
29
|
-
"workflows/verify.md": "
|
|
29
|
+
"workflows/verify.md": "4eff7b9b1c94b9a2c4a6f65cae076a3cd5a278a86430109b6033cd958e1e8ab8",
|
|
30
30
|
"hooks/definitions/context_mode_router.yaml": "a10dc927418bc130b447eb33faf0f45669ecd9c7917f56947ddd74850a4e0e37",
|
|
31
31
|
"hooks/definitions/loop_cap_guard.yaml": "f0fd220e028ab6fad3d8fd650602884fe500ca4899eff6e428cf217af058618d",
|
|
32
32
|
"hooks/definitions/post_tool_capture.yaml": "a773cd6e18972dee8eef3b7cb06fd1d319a71de4588897cebfbe643f6781a3b2",
|
|
33
33
|
"hooks/definitions/pre_compact_summary.yaml": "daa0175d79f3e0127c5ce86a7a2f8df0be3f58b5c94fe749da715a17c7b2d04e",
|
|
34
34
|
"hooks/definitions/pre_tool_capture_route.yaml": "3c2663380ff3cd09f09de5b96bcf6123266fa74d8a03dfb2d6fbe40a43fb13cf",
|
|
35
|
+
"hooks/definitions/pretooluse_dispatcher.yaml": "5b0646ab17704e6f4665bb4c08ead5bcfe2aa6e71395fa5694cb0debcbce69da",
|
|
36
|
+
"hooks/definitions/pretooluse_pipeline_guard.yaml": "ac89617b91093ff0a39da0e8c48affbcaa71054666fa316a42c32f73f656ae69",
|
|
35
37
|
"hooks/definitions/protected_path_write_guard.yaml": "6683d41778b823e2a4e606065597569aa04363f091e135e165de9732f1fc2171",
|
|
36
38
|
"hooks/definitions/session_start.yaml": "9383fcf1f8304c87e57726478a461706c0fc73dc62bcc4d8661f2eeffa43a82d",
|
|
37
39
|
"hooks/definitions/stop_handoff_harvest.yaml": "67a3c0a8bb7cb66b88e77dc79e748082e964d278c47935662c453922a846482b",
|
|
38
|
-
"hooks/
|
|
40
|
+
"hooks/definitions/stop_pipeline_gate.yaml": "f27dde7605809aae56ac566b93b8692f5d40db1e11b569010e32d2878b677fcf",
|
|
41
|
+
"hooks/hooks.json": "65e022a151aa9546a6988581ee62ec853f0df5580aeed4b164e3ccc3dc2e72de"
|
|
39
42
|
}
|
|
40
43
|
}
|
|
@@ -32,9 +32,12 @@
|
|
|
32
32
|
"hooks/definitions/post_tool_capture.yaml",
|
|
33
33
|
"hooks/definitions/pre_compact_summary.yaml",
|
|
34
34
|
"hooks/definitions/pre_tool_capture_route.yaml",
|
|
35
|
+
"hooks/definitions/pretooluse_dispatcher.yaml",
|
|
36
|
+
"hooks/definitions/pretooluse_pipeline_guard.yaml",
|
|
35
37
|
"hooks/definitions/protected_path_write_guard.yaml",
|
|
36
38
|
"hooks/definitions/session_start.yaml",
|
|
37
39
|
"hooks/definitions/stop_handoff_harvest.yaml",
|
|
40
|
+
"hooks/definitions/stop_pipeline_gate.yaml",
|
|
38
41
|
"hooks/hooks.json"
|
|
39
42
|
],
|
|
40
43
|
"files": [
|