@massu/core 1.15.6 → 1.15.7
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 +40 -0
- package/agents/massu-architecture-reviewer.md +20 -0
- package/agents/massu-blast-radius-analyzer.md +20 -0
- package/agents/massu-competitive-scorer.md +20 -0
- package/agents/massu-help-sync.md +20 -0
- package/agents/massu-migration-writer.md +20 -0
- package/agents/massu-output-scorer.md +20 -0
- package/agents/massu-pattern-reviewer.md +20 -0
- package/agents/massu-plan-auditor.md +20 -0
- package/agents/massu-schema-sync-verifier.md +20 -0
- package/agents/massu-security-reviewer.md +20 -0
- package/agents/massu-ux-reviewer.md +20 -0
- package/commands/_shared-preamble.md +21 -0
- package/commands/_shared-references/auto-learning-protocol.md +2 -0
- package/commands/_shared-references/blast-radius-protocol.md +2 -0
- package/commands/_shared-references/security-pre-screen.md +2 -0
- package/commands/_shared-references/test-first-protocol.md +2 -0
- package/commands/_shared-references/verification-table.md +2 -0
- package/commands/_verification-laws.md +131 -0
- package/commands/_verification-laws.md.sha256 +1 -0
- package/commands/massu-data/references/common-queries.md +2 -0
- package/commands/massu-data/references/table-guide.md +2 -0
- package/commands/massu-data.md +2 -0
- package/commands/massu-debug/references/auto-learning.md +2 -0
- package/commands/massu-debug/references/codegraph-tracing.md +2 -0
- package/commands/massu-debug/references/common-shortcuts.md +2 -0
- package/commands/massu-debug/references/investigation-phases.md +2 -0
- package/commands/massu-debug/references/report-format.md +2 -0
- package/commands/massu-deploy.python-docker.md +2 -0
- package/commands/massu-deploy.python-fly.md +2 -0
- package/commands/massu-deploy.python-launchd.md +2 -0
- package/commands/massu-deploy.python-systemd.md +2 -0
- package/commands/massu-full-audit.md +2 -0
- package/commands/massu-golden-path/references/approval-points.md +2 -0
- package/commands/massu-golden-path/references/phase-0-requirements.md +2 -0
- package/commands/massu-golden-path/references/phase-1-plan-creation.md +2 -0
- package/commands/massu-golden-path/references/phase-2-implementation.md +2 -0
- package/commands/massu-golden-path/references/phase-2.5-gap-analyzer.md +2 -0
- package/commands/massu-golden-path/references/phase-3-simplify.md +2 -0
- package/commands/massu-golden-path/references/phase-3.5-security-audit.md +2 -0
- package/commands/massu-golden-path/references/phase-4-commit.md +2 -0
- package/commands/massu-golden-path/references/phase-5-push.md +2 -0
- package/commands/massu-golden-path/references/phase-5.5-production-verify.md +2 -0
- package/commands/massu-golden-path/references/phase-6-completion.md +2 -0
- package/commands/massu-golden-path/references/qa-evaluator-spec.md +2 -0
- package/commands/massu-golden-path/references/sprint-contract-protocol.md +2 -0
- package/commands/massu-golden-path/references/vr-visual-calibration.md +2 -0
- package/commands/massu-guide.md +2 -0
- package/commands/massu-hooks.md +2 -0
- package/commands/massu-learning-audit.md +2 -0
- package/commands/massu-loop/references/auto-learning.md +2 -0
- package/commands/massu-loop/references/checkpoint-audit.md +2 -0
- package/commands/massu-loop/references/guardrails.md +2 -0
- package/commands/massu-loop/references/iteration-structure.md +2 -0
- package/commands/massu-loop/references/loop-controller.md +2 -0
- package/commands/massu-loop/references/plan-extraction.md +2 -0
- package/commands/massu-loop/references/vr-plan-spec.md +2 -0
- package/commands/massu-parity.md +2 -0
- package/commands/massu-push.md +2 -0
- package/commands/massu-scaffold-hook.md +2 -0
- package/commands/massu-scaffold-page.md +2 -0
- package/commands/massu-scaffold-page.swift.md +2 -0
- package/commands/massu-scaffold-router.md +2 -0
- package/commands/massu-scaffold-router.python-django.md +2 -0
- package/commands/massu-scaffold-router.python-fastapi.md +2 -0
- package/commands/massu-scaffold-router.python.md +2 -0
- package/dist/cli.js +69 -13
- package/package.json +4 -3
- package/patterns/build-patterns.md +2 -0
- package/patterns/component-patterns.md +2 -0
- package/patterns/display-patterns.md +2 -0
- package/patterns/form-patterns.md +2 -0
- package/patterns/integration-testing-checklist.md +2 -0
- package/patterns/security-patterns.md +2 -0
- package/patterns/testing-patterns.md +2 -0
- package/patterns/tool-routing.md +2 -0
- package/patterns/ui-patterns.md +2 -0
- package/protocols/plan-implementation.md +2 -0
- package/protocols/recovery.md +2 -0
- package/protocols/verification.md +2 -0
- package/reference/cr-rules-reference.md +2 -0
- package/reference/hook-execution-order.md +2 -0
- package/reference/lessons-learned.md +2 -0
- package/reference/patterns-quickref.md +2 -0
- package/reference/standards.md +2 -0
- package/reference/subagents-reference.md +2 -0
- package/reference/vr-verification-reference.md +2 -0
|
@@ -4,6 +4,8 @@ description: "Deploy a containerized Python service via docker compose — force
|
|
|
4
4
|
allowed-tools: Bash(*), Read(*), Grep(*), Glob(*)
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
+
> **Shared rules apply.** Read `.claude/commands/_shared-preamble.md` before proceeding — including **THE VERIFICATION LAWS** (CR-64: a gate must prove it can fail; CR-65: broken and empty may never render identically; an audit that does not run commands is not an audit).
|
|
8
|
+
|
|
7
9
|
# Massu Deploy: Python Service — Docker Compose
|
|
8
10
|
|
|
9
11
|
Force-recreates the Docker container for a Python service using `docker compose`. Use this variant when your service is containerized and `massu.config.yaml` declares `config.python.service_label` matching the compose service name.
|
|
@@ -4,6 +4,8 @@ description: "Deploy a Python service to Fly.io — flyctl deploy, status check,
|
|
|
4
4
|
allowed-tools: Bash(*), Read(*), Grep(*), Glob(*)
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
+
> **Shared rules apply.** Read `.claude/commands/_shared-preamble.md` before proceeding — including **THE VERIFICATION LAWS** (CR-64: a gate must prove it can fail; CR-65: broken and empty may never render identically; an audit that does not run commands is not an audit).
|
|
8
|
+
|
|
7
9
|
# Massu Deploy: Python Service — Fly.io
|
|
8
10
|
|
|
9
11
|
Deploys a Python service to Fly.io using `flyctl deploy`. Use this variant when your project targets Fly.io and has a `fly.toml` in the repository root. The app name comes from `fly.toml` (or `config.python.service_label` as a fallback).
|
|
@@ -4,6 +4,8 @@ description: "Deploy a Python service supervised by launchd (macOS) — restart
|
|
|
4
4
|
allowed-tools: Bash(*), Read(*), Grep(*), Glob(*)
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
+
> **Shared rules apply.** Read `.claude/commands/_shared-preamble.md` before proceeding — including **THE VERIFICATION LAWS** (CR-64: a gate must prove it can fail; CR-65: broken and empty may never render identically; an audit that does not run commands is not an audit).
|
|
8
|
+
|
|
7
9
|
# Massu Deploy: Python Service — launchd (macOS)
|
|
8
10
|
|
|
9
11
|
Restarts a Python service running under `launchd` on macOS. Use this variant when your `massu.config.yaml` declares `config.python.service_label` and your host is macOS.
|
|
@@ -4,6 +4,8 @@ description: "Deploy a Python service supervised by systemd (Linux) — restart
|
|
|
4
4
|
allowed-tools: Bash(*), Read(*), Grep(*), Glob(*)
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
+
> **Shared rules apply.** Read `.claude/commands/_shared-preamble.md` before proceeding — including **THE VERIFICATION LAWS** (CR-64: a gate must prove it can fail; CR-65: broken and empty may never render identically; an audit that does not run commands is not an audit).
|
|
8
|
+
|
|
7
9
|
# Massu Deploy: Python Service — systemd (Linux)
|
|
8
10
|
|
|
9
11
|
Restarts a Python service running under a `systemd --user` unit on Linux. Use this variant when your `massu.config.yaml` declares `config.python.service_label` and your host is Linux.
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
> **Shared rules apply.** Read `.claude/commands/_shared-preamble.md` before proceeding — including **THE VERIFICATION LAWS** (CR-64: a gate must prove it can fail; CR-65: broken and empty may never render identically; an audit that does not run commands is not an audit).
|
|
2
|
+
|
|
1
3
|
name: massu-full-audit
|
|
2
4
|
|
|
3
5
|
# Massu Full Audit
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# Approval Points
|
|
2
2
|
|
|
3
|
+
> **Verification laws apply.** Read `.claude/commands/_verification-laws.md` — CR-64 (a gate must prove it can fail), CR-65 (broken and empty may never render identically), and: an audit that does not run commands is not an audit.
|
|
4
|
+
|
|
3
5
|
> Reference doc for `/massu-golden-path`. Return to main file for overview.
|
|
4
6
|
|
|
5
7
|
There are exactly 4 approval points (5 when using `--competitive` mode) where the golden path pauses for user input. Everything else runs automatically.
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# Phase 0: Requirements & Context Loading
|
|
2
2
|
|
|
3
|
+
> **Verification laws apply.** Read `.claude/commands/_verification-laws.md` — CR-64 (a gate must prove it can fail), CR-65 (broken and empty may never render identically), and: an audit that does not run commands is not an audit.
|
|
4
|
+
|
|
3
5
|
> Reference doc for `/massu-golden-path`. Return to main file for overview.
|
|
4
6
|
|
|
5
7
|
## 0.1 Session Context Loading
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# Phase 1: Plan Creation & Audit
|
|
2
2
|
|
|
3
|
+
> **Verification laws apply.** Read `.claude/commands/_verification-laws.md` — CR-64 (a gate must prove it can fail), CR-65 (broken and empty may never render identically), and: an audit that does not run commands is not an audit.
|
|
4
|
+
|
|
3
5
|
> Reference doc for `/massu-golden-path`. Return to main file for overview.
|
|
4
6
|
|
|
5
7
|
## Phase 1A: Research & Reality Check
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# Phase 2: Implementation
|
|
2
2
|
|
|
3
|
+
> **Verification laws apply.** Read `.claude/commands/_verification-laws.md` — CR-64 (a gate must prove it can fail), CR-65 (broken and empty may never render identically), and: an audit that does not run commands is not an audit.
|
|
4
|
+
|
|
3
5
|
> Reference doc for `/massu-golden-path`. Return to main file for overview.
|
|
4
6
|
|
|
5
7
|
## Competitive Mode Check
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# Phase 2.5: Gap & Enhancement Analyzer Loop
|
|
2
2
|
|
|
3
|
+
> **Verification laws apply.** Read `.claude/commands/_verification-laws.md` — CR-64 (a gate must prove it can fail), CR-65 (broken and empty may never render identically), and: an audit that does not run commands is not an audit.
|
|
4
|
+
|
|
3
5
|
> Reference doc for `/massu-golden-path`. Return to main file for overview.
|
|
4
6
|
|
|
5
7
|
```
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# Phase 3: Simplification
|
|
2
2
|
|
|
3
|
+
> **Verification laws apply.** Read `.claude/commands/_verification-laws.md` — CR-64 (a gate must prove it can fail), CR-65 (broken and empty may never render identically), and: an audit that does not run commands is not an audit.
|
|
4
|
+
|
|
3
5
|
> Reference doc for `/massu-golden-path`. Return to main file for overview.
|
|
4
6
|
|
|
5
7
|
```
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# Phase 3.5: Deep Security Audit
|
|
2
2
|
|
|
3
|
+
> **Verification laws apply.** Read `.claude/commands/_verification-laws.md` — CR-64 (a gate must prove it can fail), CR-65 (broken and empty may never render identically), and: an audit that does not run commands is not an audit.
|
|
4
|
+
|
|
3
5
|
> Reference doc for `/massu-golden-path`. Return to main file for overview.
|
|
4
6
|
|
|
5
7
|
```
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# Phase 4: Pre-Commit Verification
|
|
2
2
|
|
|
3
|
+
> **Verification laws apply.** Read `.claude/commands/_verification-laws.md` — CR-64 (a gate must prove it can fail), CR-65 (broken and empty may never render identically), and: an audit that does not run commands is not an audit.
|
|
4
|
+
|
|
3
5
|
> Reference doc for `/massu-golden-path`. Return to main file for overview.
|
|
4
6
|
|
|
5
7
|
```
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# Phase 5: Push Verification & Push
|
|
2
2
|
|
|
3
|
+
> **Verification laws apply.** Read `.claude/commands/_verification-laws.md` — CR-64 (a gate must prove it can fail), CR-65 (broken and empty may never render identically), and: an audit that does not run commands is not an audit.
|
|
4
|
+
|
|
3
5
|
> Reference doc for `/massu-golden-path`. Return to main file for overview.
|
|
4
6
|
|
|
5
7
|
```
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# Phase 5.5: Production Verification
|
|
2
2
|
|
|
3
|
+
> **Verification laws apply.** Read `.claude/commands/_verification-laws.md` — CR-64 (a gate must prove it can fail), CR-65 (broken and empty may never render identically), and: an audit that does not run commands is not an audit.
|
|
4
|
+
|
|
3
5
|
> Reference doc for `/massu-golden-path`. Return to main file for overview.
|
|
4
6
|
|
|
5
7
|
```
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# Phase 6: Completion
|
|
2
2
|
|
|
3
|
+
> **Verification laws apply.** Read `.claude/commands/_verification-laws.md` — CR-64 (a gate must prove it can fail), CR-65 (broken and empty may never render identically), and: an audit that does not run commands is not an audit.
|
|
4
|
+
|
|
3
5
|
> Reference doc for `/massu-golden-path`. Return to main file for overview.
|
|
4
6
|
|
|
5
7
|
## 6.1 Final Report
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# QA Evaluator Specification
|
|
2
2
|
|
|
3
|
+
> **Verification laws apply.** Read `.claude/commands/_verification-laws.md` — CR-64 (a gate must prove it can fail), CR-65 (broken and empty may never render identically), and: an audit that does not run commands is not an audit.
|
|
4
|
+
|
|
3
5
|
> Reference doc for `/massu-golden-path` Phase 2C. Return to `phase-2-implementation.md` for full Phase 2.
|
|
4
6
|
|
|
5
7
|
## Purpose
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# Sprint Contract Protocol
|
|
2
2
|
|
|
3
|
+
> **Verification laws apply.** Read `.claude/commands/_verification-laws.md` — CR-64 (a gate must prove it can fail), CR-65 (broken and empty may never render identically), and: an audit that does not run commands is not an audit.
|
|
4
|
+
|
|
3
5
|
> Reference doc for `/massu-golden-path` Phase 2A.5. Return to `phase-2-implementation.md` for full Phase 2.
|
|
4
6
|
|
|
5
7
|
## What Is a Sprint Contract?
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# VR-VISUAL Calibration Examples
|
|
2
2
|
|
|
3
|
+
> **Verification laws apply.** Read `.claude/commands/_verification-laws.md` — CR-64 (a gate must prove it can fail), CR-65 (broken and empty may never render identically), and: an audit that does not run commands is not an audit.
|
|
4
|
+
|
|
3
5
|
> Reference doc for VR-VISUAL 4-dimension weighted scoring.
|
|
4
6
|
> Used by `scripts/ui-review.sh` and golden-path Phase 2.5 gap analysis.
|
|
5
7
|
|
package/commands/massu-guide.md
CHANGED
|
@@ -3,6 +3,8 @@ name: massu-guide
|
|
|
3
3
|
description: "When a new user or contributor asks 'how does this work', 'give me a tour', 'onboarding', or needs an interactive walkthrough of the codebase"
|
|
4
4
|
allowed-tools: Bash(*), Read(*), Grep(*), Glob(*)
|
|
5
5
|
---
|
|
6
|
+
|
|
7
|
+
> **Shared rules apply.** Read `.claude/commands/_shared-preamble.md` before proceeding — including **THE VERIFICATION LAWS** (CR-64: a gate must prove it can fail; CR-65: broken and empty may never render identically; an audit that does not run commands is not an audit).
|
|
6
8
|
name: massu-guide
|
|
7
9
|
|
|
8
10
|
# Massu Guide: Codebase Onboarding Walkthrough
|
package/commands/massu-hooks.md
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
> **Shared rules apply.** Read `.claude/commands/_shared-preamble.md` before proceeding — including **THE VERIFICATION LAWS** (CR-64: a gate must prove it can fail; CR-65: broken and empty may never render identically; an audit that does not run commands is not an audit).
|
|
2
|
+
|
|
1
3
|
name: massu-hooks
|
|
2
4
|
|
|
3
5
|
# Massu Hooks: Profile & Status Dashboard
|
|
@@ -4,6 +4,8 @@ description: "When user says 'learning audit', 'check auto-learning', 'memory co
|
|
|
4
4
|
allowed-tools: Bash(*), Read(*), Grep(*), Glob(*), ToolSearch(mcp__massu-codegraph__*)
|
|
5
5
|
disable-model-invocation: true
|
|
6
6
|
---
|
|
7
|
+
|
|
8
|
+
> **Shared rules apply.** Read `.claude/commands/_shared-preamble.md` before proceeding — including **THE VERIFICATION LAWS** (CR-64: a gate must prove it can fail; CR-65: broken and empty may never render identically; an audit that does not run commands is not an audit).
|
|
7
9
|
name: massu-learning-audit
|
|
8
10
|
|
|
9
11
|
# Massu Learning Audit: Auto-Learning Effectiveness Validation
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# Auto-Learning Protocol
|
|
2
2
|
|
|
3
|
+
> **Verification laws apply.** Read `.claude/commands/_verification-laws.md` — CR-64 (a gate must prove it can fail), CR-65 (broken and empty may never render identically), and: an audit that does not run commands is not an audit.
|
|
4
|
+
|
|
3
5
|
> Reference doc for `/massu-loop`. Return to main file for overview.
|
|
4
6
|
|
|
5
7
|
## POST-BUILD REFLECTION + MANDATORY MEMORY PERSIST (CR-38)
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# Checkpoint Audit Protocol
|
|
2
2
|
|
|
3
|
+
> **Verification laws apply.** Read `.claude/commands/_verification-laws.md` — CR-64 (a gate must prove it can fail), CR-65 (broken and empty may never render identically), and: an audit that does not run commands is not an audit.
|
|
4
|
+
|
|
3
5
|
> Reference doc for `/massu-loop`. Return to main file for overview.
|
|
4
6
|
|
|
5
7
|
## CHECKPOINT AUDIT (Phase Boundaries)
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# The 10 Accountability Safeguards
|
|
2
2
|
|
|
3
|
+
> **Verification laws apply.** Read `.claude/commands/_verification-laws.md` — CR-64 (a gate must prove it can fail), CR-65 (broken and empty may never render identically), and: an audit that does not run commands is not an audit.
|
|
4
|
+
|
|
3
5
|
> Reference doc for `/massu-loop`. Return to main file for overview.
|
|
4
6
|
|
|
5
7
|
## THE 10 ACCOUNTABILITY SAFEGUARDS
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# Iteration Structure
|
|
2
2
|
|
|
3
|
+
> **Verification laws apply.** Read `.claude/commands/_verification-laws.md` — CR-64 (a gate must prove it can fail), CR-65 (broken and empty may never render identically), and: an audit that does not run commands is not an audit.
|
|
4
|
+
|
|
3
5
|
> Reference doc for `/massu-loop`. Return to main file for overview.
|
|
4
6
|
|
|
5
7
|
## ITERATION STRUCTURE
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# Loop Controller
|
|
2
2
|
|
|
3
|
+
> **Verification laws apply.** Read `.claude/commands/_verification-laws.md` — CR-64 (a gate must prove it can fail), CR-65 (broken and empty may never render identically), and: an audit that does not run commands is not an audit.
|
|
4
|
+
|
|
3
5
|
> Reference doc for `/massu-loop`. Return to main file for overview.
|
|
4
6
|
|
|
5
7
|
## MANDATORY LOOP CONTROLLER (EXECUTE THIS - DO NOT SKIP)
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# Plan Item Extraction
|
|
2
2
|
|
|
3
|
+
> **Verification laws apply.** Read `.claude/commands/_verification-laws.md` — CR-64 (a gate must prove it can fail), CR-65 (broken and empty may never render identically), and: an audit that does not run commands is not an audit.
|
|
4
|
+
|
|
3
5
|
> Reference doc for `/massu-loop`. Return to main file for overview.
|
|
4
6
|
|
|
5
7
|
## PLAN ITEM EXTRACTION PROTOCOL (MANDATORY - STEP 0)
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# VR-PLAN Verification Details
|
|
2
2
|
|
|
3
|
+
> **Verification laws apply.** Read `.claude/commands/_verification-laws.md` — CR-64 (a gate must prove it can fail), CR-65 (broken and empty may never render identically), and: an audit that does not run commands is not an audit.
|
|
4
|
+
|
|
3
5
|
> Reference doc for `/massu-loop`. Return to main file for overview.
|
|
4
6
|
|
|
5
7
|
## VR-PLAN: VERIFICATION PLANNING STEP
|
package/commands/massu-parity.md
CHANGED
|
@@ -3,6 +3,8 @@ name: massu-parity
|
|
|
3
3
|
description: Generic feature parity check between two systems or components
|
|
4
4
|
allowed-tools: Bash(*), Read(*), Grep(*), Glob(*), Write(*), Task(*)
|
|
5
5
|
---
|
|
6
|
+
|
|
7
|
+
> **Shared rules apply.** Read `.claude/commands/_shared-preamble.md` before proceeding — including **THE VERIFICATION LAWS** (CR-64: a gate must prove it can fail; CR-65: broken and empty may never render identically; an audit that does not run commands is not an audit).
|
|
6
8
|
name: massu-parity
|
|
7
9
|
|
|
8
10
|
# Massu Parity: Feature Parity Check
|
package/commands/massu-push.md
CHANGED
|
@@ -3,6 +3,8 @@ name: massu-push
|
|
|
3
3
|
description: "When user says 'push', 'push to remote', 'deploy', or wants to push committed changes to the remote repository"
|
|
4
4
|
allowed-tools: Bash(*), Read(*), Edit(*), Write(*), Grep(*), Glob(*)
|
|
5
5
|
---
|
|
6
|
+
|
|
7
|
+
> **Shared rules apply.** Read `.claude/commands/_shared-preamble.md` before proceeding — including **THE VERIFICATION LAWS** (CR-64: a gate must prove it can fail; CR-65: broken and empty may never render identically; an audit that does not run commands is not an audit).
|
|
6
8
|
name: massu-push
|
|
7
9
|
|
|
8
10
|
# Massu Push: Verify, Push, Monitor CI
|
|
@@ -4,6 +4,8 @@ description: "When user wants to create a new Claude Code hook — scaffolds the
|
|
|
4
4
|
allowed-tools: Bash(*), Read(*), Write(*), Edit(*), Grep(*), Glob(*)
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
+
> **Shared rules apply.** Read `.claude/commands/_shared-preamble.md` before proceeding — including **THE VERIFICATION LAWS** (CR-64: a gate must prove it can fail; CR-65: broken and empty may never render identically; an audit that does not run commands is not an audit).
|
|
8
|
+
|
|
7
9
|
# Scaffold New Hook
|
|
8
10
|
|
|
9
11
|
Creates a complete Claude Code hook following the 3-tier profile system.
|
|
@@ -4,6 +4,8 @@ description: "When user wants to create a new page, screen, or view — asks whi
|
|
|
4
4
|
allowed-tools: Bash(*), Read(*), Write(*), Edit(*), Grep(*), Glob(*)
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
+
> **Shared rules apply.** Read `.claude/commands/_shared-preamble.md` before proceeding — including **THE VERIFICATION LAWS** (CR-64: a gate must prove it can fail; CR-65: broken and empty may never render identically; an audit that does not run commands is not an audit).
|
|
8
|
+
|
|
7
9
|
# Scaffold New Page / View
|
|
8
10
|
|
|
9
11
|
This default template is **framework-agnostic**. It asks the user (or, when invoked by an agent, infers from `massu.config.yaml`) which target to scaffold, then dispatches to one of the embedded patterns below.
|
|
@@ -4,6 +4,8 @@ description: "When user wants to create a new view, screen, or page in a SwiftUI
|
|
|
4
4
|
allowed-tools: Bash(*), Read(*), Write(*), Edit(*), Grep(*), Glob(*)
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
+
> **Shared rules apply.** Read `.claude/commands/_shared-preamble.md` before proceeding — including **THE VERIFICATION LAWS** (CR-64: a gate must prove it can fail; CR-65: broken and empty may never render identically; an audit that does not run commands is not an audit).
|
|
8
|
+
|
|
7
9
|
# Scaffold New SwiftUI View
|
|
8
10
|
|
|
9
11
|
Creates a SwiftUI View + `@MainActor` ViewModel + Decodable response model. Suitable for iOS, visionOS, or any cross-platform SwiftUI target.
|
|
@@ -4,6 +4,8 @@ description: "When user wants to create a new tRPC router, API endpoint, or back
|
|
|
4
4
|
allowed-tools: Bash(*), Read(*), Write(*), Edit(*), Grep(*), Glob(*)
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
+
> **Shared rules apply.** Read `.claude/commands/_shared-preamble.md` before proceeding — including **THE VERIFICATION LAWS** (CR-64: a gate must prove it can fail; CR-65: broken and empty may never render identically; an audit that does not run commands is not an audit).
|
|
8
|
+
|
|
7
9
|
# Scaffold New tRPC Router
|
|
8
10
|
|
|
9
11
|
Creates a complete tRPC router following all project database and auth patterns.
|
|
@@ -4,6 +4,8 @@ description: "Django-specific scaffold for {{paths.python_source | default("djan
|
|
|
4
4
|
allowed-tools: Bash(*), Read(*), Write(*), Edit(*), Grep(*), Glob(*)
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
+
> **Shared rules apply.** Read `.claude/commands/_shared-preamble.md` before proceeding — including **THE VERIFICATION LAWS** (CR-64: a gate must prove it can fail; CR-65: broken and empty may never render identically; an audit that does not run commands is not an audit).
|
|
8
|
+
|
|
7
9
|
# Scaffold New Django View
|
|
8
10
|
|
|
9
11
|
Creates Django views in `{{paths.python_source | default("django_app")}}` following the project's conventions. Covers function-based views (FBV), class-based views (CBV), and the corresponding `urls.py` registration. Auth guard uses `{{detected.python.auth_dep | default("login_required")}}`.
|
|
@@ -4,6 +4,8 @@ description: "FastAPI-specific scaffold for {{paths.python_source | default("app
|
|
|
4
4
|
allowed-tools: Bash(*), Read(*), Write(*), Edit(*), Grep(*), Glob(*)
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
+
> **Shared rules apply.** Read `.claude/commands/_shared-preamble.md` before proceeding — including **THE VERIFICATION LAWS** (CR-64: a gate must prove it can fail; CR-65: broken and empty may never render identically; an audit that does not run commands is not an audit).
|
|
8
|
+
|
|
7
9
|
# Scaffold New FastAPI Router
|
|
8
10
|
|
|
9
11
|
Creates a complete FastAPI router following the project's existing conventions in `{{paths.python_source | default("app")}}/routers/`. Auth dependency sourced from the massu introspector's `detected.python.auth_dep` (falls back to `get_current_user` if not detected).
|
|
@@ -4,6 +4,8 @@ description: "When user wants to create a new FastAPI router, API endpoint, or b
|
|
|
4
4
|
allowed-tools: Bash(*), Read(*), Write(*), Edit(*), Grep(*), Glob(*)
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
+
> **Shared rules apply.** Read `.claude/commands/_shared-preamble.md` before proceeding — including **THE VERIFICATION LAWS** (CR-64: a gate must prove it can fail; CR-65: broken and empty may never render identically; an audit that does not run commands is not an audit).
|
|
8
|
+
|
|
7
9
|
# Scaffold New FastAPI Router
|
|
8
10
|
|
|
9
11
|
Creates a complete FastAPI router following the project's existing conventions in `${paths.python_source}/routers/` (or wherever your project's `paths.python_source` resolves).
|
package/dist/cli.js
CHANGED
|
@@ -4132,11 +4132,15 @@ var init_permissions = __esm({
|
|
|
4132
4132
|
// src/commands/install-commands.ts
|
|
4133
4133
|
var install_commands_exports = {};
|
|
4134
4134
|
__export(install_commands_exports, {
|
|
4135
|
+
MASSU_OWNED_PATHS: () => MASSU_OWNED_PATHS,
|
|
4135
4136
|
buildTemplateVars: () => buildTemplateVars,
|
|
4137
|
+
canonicalizeOwned: () => canonicalizeOwned,
|
|
4136
4138
|
hashContent: () => hashContent,
|
|
4137
4139
|
installAll: () => installAll,
|
|
4138
4140
|
installCommands: () => installCommands,
|
|
4141
|
+
isMassuOwned: () => isMassuOwned,
|
|
4139
4142
|
loadManifest: () => loadManifest,
|
|
4143
|
+
massuOwnedSourceIsValid: () => massuOwnedSourceIsValid,
|
|
4140
4144
|
pickVariant: () => pickVariant,
|
|
4141
4145
|
resolveAssetDir: () => resolveAssetDir,
|
|
4142
4146
|
resolveCommandsDir: () => resolveCommandsDir,
|
|
@@ -4155,25 +4159,51 @@ import {
|
|
|
4155
4159
|
import { resolve as resolve6, dirname as dirname7, join as join6 } from "path";
|
|
4156
4160
|
import { fileURLToPath as fileURLToPath2 } from "url";
|
|
4157
4161
|
import { createHash as createHash3 } from "crypto";
|
|
4162
|
+
function dirHoldsAssets(dir) {
|
|
4163
|
+
if (!existsSync9(dir)) return false;
|
|
4164
|
+
try {
|
|
4165
|
+
return readdirSync3(dir).some(
|
|
4166
|
+
(e2) => e2.endsWith(".md") || statSync2(resolve6(dir, e2)).isDirectory()
|
|
4167
|
+
);
|
|
4168
|
+
} catch {
|
|
4169
|
+
return false;
|
|
4170
|
+
}
|
|
4171
|
+
}
|
|
4158
4172
|
function resolveAssetDir(assetName) {
|
|
4159
4173
|
const cwd = process.cwd();
|
|
4160
|
-
const
|
|
4161
|
-
|
|
4162
|
-
|
|
4163
|
-
|
|
4164
|
-
|
|
4165
|
-
|
|
4166
|
-
|
|
4167
|
-
|
|
4168
|
-
const
|
|
4169
|
-
|
|
4170
|
-
return srcRelPath;
|
|
4174
|
+
const candidates = [
|
|
4175
|
+
// 1. npm-installed: node_modules/@massu/core/{assetName}
|
|
4176
|
+
resolve6(cwd, "node_modules/@massu/core", assetName),
|
|
4177
|
+
// 2. Relative to compiled dist/cli.js → ../{assetName}
|
|
4178
|
+
resolve6(__dirname, "..", assetName),
|
|
4179
|
+
// 3. Relative to source src/commands/ → ../../{assetName}
|
|
4180
|
+
resolve6(__dirname, "../..", assetName)
|
|
4181
|
+
];
|
|
4182
|
+
for (const c2 of candidates) {
|
|
4183
|
+
if (dirHoldsAssets(c2)) return c2;
|
|
4171
4184
|
}
|
|
4172
4185
|
return null;
|
|
4173
4186
|
}
|
|
4174
4187
|
function resolveCommandsDir() {
|
|
4175
4188
|
return resolveAssetDir("commands");
|
|
4176
4189
|
}
|
|
4190
|
+
function isMassuOwned(manifestKey) {
|
|
4191
|
+
return MASSU_OWNED_PATHS.includes(manifestKey);
|
|
4192
|
+
}
|
|
4193
|
+
function canonicalizeOwned(content) {
|
|
4194
|
+
return content.replace(/\r\n/g, "\n").split("\n").map((l2) => l2.replace(/\s+$/, "")).join("\n").trim();
|
|
4195
|
+
}
|
|
4196
|
+
function massuOwnedSourceIsValid(resolvedSourcePath, content) {
|
|
4197
|
+
const sidecar = `${resolvedSourcePath}.sha256`;
|
|
4198
|
+
if (!existsSync9(sidecar)) return false;
|
|
4199
|
+
let expected;
|
|
4200
|
+
try {
|
|
4201
|
+
expected = readFileSync6(sidecar, "utf-8").trim();
|
|
4202
|
+
} catch {
|
|
4203
|
+
return false;
|
|
4204
|
+
}
|
|
4205
|
+
return hashContent(canonicalizeOwned(content)) === expected;
|
|
4206
|
+
}
|
|
4177
4207
|
function hashContent(content) {
|
|
4178
4208
|
return createHash3("sha256").update(content, "utf-8").digest("hex");
|
|
4179
4209
|
}
|
|
@@ -4349,13 +4379,38 @@ function syncDirectory(sourceDir, targetDir, framework, manifest, manifestKeyPre
|
|
|
4349
4379
|
const manifestKey = manifestKeyPrefix === "" ? targetFilename : `${manifestKeyPrefix}/${targetFilename}`;
|
|
4350
4380
|
const lastInstalledHash = manifest.entries[manifestKey];
|
|
4351
4381
|
if (existsSync9(targetPath)) {
|
|
4352
|
-
|
|
4382
|
+
let existingContent;
|
|
4383
|
+
try {
|
|
4384
|
+
if (!statSync2(targetPath).isFile()) throw new Error("not a regular file");
|
|
4385
|
+
existingContent = readFileSync6(targetPath, "utf-8");
|
|
4386
|
+
} catch (err) {
|
|
4387
|
+
process.stderr.write(
|
|
4388
|
+
`massu: skipping ${manifestKey}: target is not a readable file (${err instanceof Error ? err.message : String(err)}). Remove it and re-install.
|
|
4389
|
+
`
|
|
4390
|
+
);
|
|
4391
|
+
stats.skipped++;
|
|
4392
|
+
continue;
|
|
4393
|
+
}
|
|
4353
4394
|
const existingHash = hashContent(existingContent);
|
|
4354
4395
|
if (existingHash === sourceHash) {
|
|
4355
4396
|
manifest.entries[manifestKey] = sourceHash;
|
|
4356
4397
|
stats.skipped++;
|
|
4357
4398
|
continue;
|
|
4358
4399
|
}
|
|
4400
|
+
if (isMassuOwned(manifestKey)) {
|
|
4401
|
+
if (!massuOwnedSourceIsValid(resolvedSourcePath, sourceContent)) {
|
|
4402
|
+
process.stderr.write(
|
|
4403
|
+
`massu: REFUSING to overwrite massu-owned ${manifestKey} \u2014 the source failed its integrity hash (${resolvedSourcePath}.sha256 missing or mismatched). Your installed @massu/core may be stale or tampered; run \`npm i @massu/core@latest\` and re-install. Kept the existing file.
|
|
4404
|
+
`
|
|
4405
|
+
);
|
|
4406
|
+
stats.kept++;
|
|
4407
|
+
continue;
|
|
4408
|
+
}
|
|
4409
|
+
atomicWriteFile(targetPath, sourceContent);
|
|
4410
|
+
manifest.entries[manifestKey] = sourceHash;
|
|
4411
|
+
stats.updated++;
|
|
4412
|
+
continue;
|
|
4413
|
+
}
|
|
4359
4414
|
if (lastInstalledHash === void 0) {
|
|
4360
4415
|
process.stderr.write(
|
|
4361
4416
|
`First-install: keeping existing ${targetPath} (differs from upstream, and massu has no record of writing it).
|
|
@@ -4531,7 +4586,7 @@ async function runInstallCommands() {
|
|
|
4531
4586
|
console.log(" Restart your Claude Code session to use them.");
|
|
4532
4587
|
console.log("");
|
|
4533
4588
|
}
|
|
4534
|
-
var __filename, __dirname, ASSET_TYPES, MANIFEST_VERSION, MANIFEST_RELPATH, PASSTHROUGH_LANG_KEYS;
|
|
4589
|
+
var __filename, __dirname, ASSET_TYPES, MANIFEST_VERSION, MANIFEST_RELPATH, MASSU_OWNED_PATHS, PASSTHROUGH_LANG_KEYS;
|
|
4535
4590
|
var init_install_commands = __esm({
|
|
4536
4591
|
"src/commands/install-commands.ts"() {
|
|
4537
4592
|
"use strict";
|
|
@@ -4550,6 +4605,7 @@ var init_install_commands = __esm({
|
|
|
4550
4605
|
];
|
|
4551
4606
|
MANIFEST_VERSION = 1;
|
|
4552
4607
|
MANIFEST_RELPATH = join6(".massu", "install-manifest.json");
|
|
4608
|
+
MASSU_OWNED_PATHS = ["commands/_verification-laws.md"];
|
|
4553
4609
|
PASSTHROUGH_LANG_KEYS = [
|
|
4554
4610
|
"typescript",
|
|
4555
4611
|
"javascript",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@massu/core",
|
|
3
|
-
"version": "1.15.
|
|
3
|
+
"version": "1.15.7",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "AI Engineering Governance MCP Server - Session memory, knowledge system, feature registry, code intelligence, rule enforcement, tiered tooling (12 free / 73 total), 56 workflow commands, 11 agents, 20+ patterns",
|
|
6
6
|
"main": "./dist/cli.js",
|
|
@@ -24,14 +24,15 @@
|
|
|
24
24
|
"start": "npx tsx src/server.ts",
|
|
25
25
|
"test": "vitest run",
|
|
26
26
|
"build": "tsc --noEmit && npm run build:cli && npm run build:hooks && npm run build:assets && npm run build:adapter-types && npm run build:adapter-subpath && npm run build:bundle-adapters",
|
|
27
|
-
"build:assets": "node scripts/copy-embedder-assets.mjs",
|
|
27
|
+
"build:assets": "node scripts/gen-owned-sidecars.mjs && node scripts/copy-embedder-assets.mjs",
|
|
28
28
|
"build:adapter-types": "tsc -p tsconfig.adapter-types.json",
|
|
29
29
|
"build:adapter-subpath": "tsx scripts/bundle-adapters.ts --subpath-only",
|
|
30
30
|
"build:bundle-adapters": "tsx scripts/bundle-adapters.ts",
|
|
31
31
|
"build:cli": "esbuild --bundle --platform=node --format=esm --outfile=dist/cli.js src/cli.ts --external:better-sqlite3 --external:yaml --external:zod --external:chokidar --external:proper-lockfile --external:fsevents --external:web-tree-sitter --external:tweetnacl --external:tar --external:smol-toml --external:vscode-languageserver-protocol --external:onnxruntime-web --external:@massu/adapter-rails --external:@massu/adapter-spring --banner:js='#!/usr/bin/env node\nimport{createRequire as __cr}from\"module\";const require=__cr(import.meta.url);'",
|
|
32
32
|
"build:hooks": "esbuild --bundle --platform=node --format=esm --outdir=dist/hooks src/hooks/*.ts --external:better-sqlite3 --external:yaml --external:zod --external:chokidar --external:proper-lockfile --external:fsevents --external:web-tree-sitter --external:tweetnacl --external:tar --external:smol-toml --external:vscode-languageserver-protocol --external:onnxruntime-web --external:@massu/adapter-rails --external:@massu/adapter-spring --banner:js='import{createRequire as __cr}from\"module\";const require=__cr(import.meta.url);'",
|
|
33
33
|
"prepublishOnly": "bash ../../scripts/prepublish-check.sh && node ../../scripts/bundle-pubkey.mjs && node ../../scripts/bundle-license-pubkey.mjs && node ../../scripts/bundle-promotion-pubkey.mjs && node ../../scripts/bundle-audit-export-pubkey.mjs && cp ../../CHANGELOG.md ./CHANGELOG.md && npm run build && bash ../../scripts/npm-publish-guard.sh",
|
|
34
|
-
"bench:watch": "tsx test/perf/watch-benchmark.ts"
|
|
34
|
+
"bench:watch": "tsx test/perf/watch-benchmark.ts",
|
|
35
|
+
"build:owned-sidecars": "node scripts/gen-owned-sidecars.mjs"
|
|
35
36
|
},
|
|
36
37
|
"dependencies": {
|
|
37
38
|
"@clack/prompts": "^0.9.1",
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# Build Patterns
|
|
2
2
|
|
|
3
|
+
> **Verification laws apply.** Read `.claude/commands/_verification-laws.md` — CR-64 (a gate must prove it can fail), CR-65 (broken and empty may never render identically), and: an audit that does not run commands is not an audit.
|
|
4
|
+
|
|
3
5
|
**Purpose**: Patterns for resolving build issues in Next.js applications with Prisma, native modules, and Edge Runtime.
|
|
4
6
|
|
|
5
7
|
**When to Read**: When encountering build errors, hangs, or warnings. Before adding heavy dependencies.
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# Component Patterns
|
|
2
2
|
|
|
3
|
+
> **Verification laws apply.** Read `.claude/commands/_verification-laws.md` — CR-64 (a gate must prove it can fail), CR-65 (broken and empty may never render identically), and: an audit that does not run commands is not an audit.
|
|
4
|
+
|
|
3
5
|
**Purpose**: Standard patterns for UI components, forms, search inputs, and common interactive elements.
|
|
4
6
|
|
|
5
7
|
**When to Read**: Before creating or modifying UI components.
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# Display Patterns
|
|
2
2
|
|
|
3
|
+
> **Verification laws apply.** Read `.claude/commands/_verification-laws.md` — CR-64 (a gate must prove it can fail), CR-65 (broken and empty may never render identically), and: an audit that does not run commands is not an audit.
|
|
4
|
+
|
|
3
5
|
**Purpose**: Centralized formatting functions and display conventions for data presentation.
|
|
4
6
|
|
|
5
7
|
**When to Read**: Before displaying formatted data (currency, phone numbers, dates, names, file sizes).
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# Form Field Patterns
|
|
2
2
|
|
|
3
|
+
> **Verification laws apply.** Read `.claude/commands/_verification-laws.md` — CR-64 (a gate must prove it can fail), CR-65 (broken and empty may never render identically), and: an audit that does not run commands is not an audit.
|
|
4
|
+
|
|
3
5
|
**Purpose**: Form patterns for semantic TextField types, PhoneInputField, AddressForm, react-hook-form + Zod setup, register() vs Controller, edit forms, submission patterns.
|
|
4
6
|
|
|
5
7
|
**When to Read**: Before creating or modifying forms.
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# Integration Testing Checklist
|
|
2
2
|
|
|
3
|
+
> **Verification laws apply.** Read `.claude/commands/_verification-laws.md` — CR-64 (a gate must prove it can fail), CR-65 (broken and empty may never render identically), and: an audit that does not run commands is not an audit.
|
|
4
|
+
|
|
3
5
|
**Purpose**: Router contract verification, pre-test writing steps, test templates, common anti-patterns, prevention system.
|
|
4
6
|
|
|
5
7
|
**When to Read**: Before writing integration tests.
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# Security Patterns
|
|
2
2
|
|
|
3
|
+
> **Verification laws apply.** Read `.claude/commands/_verification-laws.md` — CR-64 (a gate must prove it can fail), CR-65 (broken and empty may never render identically), and: an audit that does not run commands is not an audit.
|
|
4
|
+
|
|
3
5
|
**Purpose**: Security patterns for credential management, authentication, and code safety.
|
|
4
6
|
|
|
5
7
|
**When to Read**: Before handling secrets, authentication, or security-sensitive code.
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# Testing Patterns
|
|
2
2
|
|
|
3
|
+
> **Verification laws apply.** Read `.claude/commands/_verification-laws.md` — CR-64 (a gate must prove it can fail), CR-65 (broken and empty may never render identically), and: an audit that does not run commands is not an audit.
|
|
4
|
+
|
|
3
5
|
**Purpose**: Testing pyramid, patterns, and best practices for unit, integration, and E2E tests.
|
|
4
6
|
|
|
5
7
|
**When to Read**: Before writing tests, setting up test infrastructure, or debugging test failures.
|
package/patterns/tool-routing.md
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# Tool Routing Patterns
|
|
2
2
|
|
|
3
|
+
> **Verification laws apply.** Read `.claude/commands/_verification-laws.md` — CR-64 (a gate must prove it can fail), CR-65 (broken and empty may never render identically), and: an audit that does not run commands is not an audit.
|
|
4
|
+
|
|
3
5
|
**Purpose**: Decision trees for selecting the correct tool/MCP for browser automation, Google services, and code search.
|
|
4
6
|
|
|
5
7
|
**When to Read**: Before using any browser automation, Google service, or code search tool.
|
package/patterns/ui-patterns.md
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# UI Patterns
|
|
2
2
|
|
|
3
|
+
> **Verification laws apply.** Read `.claude/commands/_verification-laws.md` — CR-64 (a gate must prove it can fail), CR-65 (broken and empty may never render identically), and: an audit that does not run commands is not an audit.
|
|
4
|
+
|
|
3
5
|
**Purpose**: Layout, theming, component selection, and UI quality standards.
|
|
4
6
|
|
|
5
7
|
**When to Read**: Before creating or modifying UI components, pages, or styles.
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# Plan Implementation Protocol
|
|
2
2
|
|
|
3
|
+
> **Verification laws apply.** Read `.claude/commands/_verification-laws.md` — CR-64 (a gate must prove it can fail), CR-65 (broken and empty may never render identically), and: an audit that does not run commands is not an audit.
|
|
4
|
+
|
|
3
5
|
**Purpose**: Unified protocol for implementing and auditing multi-step plans. Merges Plan Implementation, Plan Audit, and Pre-Completion protocols.
|
|
4
6
|
|
|
5
7
|
**When to Read**: When implementing any multi-step plan, before claiming a plan is complete.
|