tlc-claude-code 2.0.1 β 2.2.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/.claude/agents/builder.md +144 -0
- package/.claude/agents/planner.md +143 -0
- package/.claude/agents/reviewer.md +160 -0
- package/.claude/commands/tlc/build.md +4 -0
- package/.claude/commands/tlc/deploy.md +194 -2
- package/.claude/commands/tlc/e2e-verify.md +214 -0
- package/.claude/commands/tlc/guard.md +191 -0
- package/.claude/commands/tlc/help.md +32 -0
- package/.claude/commands/tlc/init.md +73 -37
- package/.claude/commands/tlc/llm.md +19 -4
- package/.claude/commands/tlc/preflight.md +134 -0
- package/.claude/commands/tlc/review-plan.md +363 -0
- package/.claude/commands/tlc/review.md +172 -57
- package/.claude/commands/tlc/watchci.md +159 -0
- package/.claude/hooks/tlc-block-tools.sh +41 -0
- package/.claude/hooks/tlc-capture-exchange.sh +50 -0
- package/.claude/hooks/tlc-post-build.sh +38 -0
- package/.claude/hooks/tlc-post-push.sh +22 -0
- package/.claude/hooks/tlc-prompt-guard.sh +69 -0
- package/.claude/hooks/tlc-session-init.sh +123 -0
- package/CLAUDE.md +13 -0
- package/bin/install.js +268 -2
- package/bin/postinstall.js +102 -24
- package/bin/setup-autoupdate.js +206 -0
- package/bin/setup-autoupdate.test.js +124 -0
- package/bin/tlc.js +0 -0
- package/dashboard-web/dist/assets/index-CdS5CHqu.css +1 -0
- package/dashboard-web/dist/assets/index-CwNPPVpg.js +483 -0
- package/dashboard-web/dist/assets/index-CwNPPVpg.js.map +1 -0
- package/dashboard-web/dist/index.html +2 -2
- package/docker-compose.dev.yml +18 -12
- package/package.json +4 -2
- package/scripts/project-docs.js +1 -1
- package/server/index.js +228 -2
- package/server/lib/capture-bridge.js +242 -0
- package/server/lib/capture-bridge.test.js +363 -0
- package/server/lib/capture-guard.js +140 -0
- package/server/lib/capture-guard.test.js +182 -0
- package/server/lib/command-runner.js +159 -0
- package/server/lib/command-runner.test.js +92 -0
- package/server/lib/cost-tracker.test.js +49 -12
- package/server/lib/deploy/runners/dependency-runner.js +106 -0
- package/server/lib/deploy/runners/dependency-runner.test.js +148 -0
- package/server/lib/deploy/runners/secrets-runner.js +174 -0
- package/server/lib/deploy/runners/secrets-runner.test.js +127 -0
- package/server/lib/deploy/security-gates.js +11 -24
- package/server/lib/deploy/security-gates.test.js +9 -2
- package/server/lib/deploy-engine.js +182 -0
- package/server/lib/deploy-engine.test.js +147 -0
- package/server/lib/docker-api.js +137 -0
- package/server/lib/docker-api.test.js +202 -0
- package/server/lib/docker-client.js +297 -0
- package/server/lib/docker-client.test.js +308 -0
- package/server/lib/input-sanitizer.js +86 -0
- package/server/lib/input-sanitizer.test.js +117 -0
- package/server/lib/launchd-agent.js +225 -0
- package/server/lib/launchd-agent.test.js +185 -0
- package/server/lib/memory-api.js +3 -1
- package/server/lib/memory-api.test.js +3 -5
- package/server/lib/memory-bridge-e2e.test.js +160 -0
- package/server/lib/memory-committer.js +18 -4
- package/server/lib/memory-committer.test.js +21 -0
- package/server/lib/memory-hooks-capture.test.js +69 -4
- package/server/lib/memory-hooks-integration.test.js +98 -0
- package/server/lib/memory-hooks.js +42 -4
- package/server/lib/memory-store-adapter.js +105 -0
- package/server/lib/memory-store-adapter.test.js +141 -0
- package/server/lib/memory-wiring-e2e.test.js +93 -0
- package/server/lib/nginx-config.js +114 -0
- package/server/lib/nginx-config.test.js +82 -0
- package/server/lib/ollama-health.js +91 -0
- package/server/lib/ollama-health.test.js +74 -0
- package/server/lib/orchestration/agent-dispatcher.js +114 -0
- package/server/lib/orchestration/agent-dispatcher.test.js +110 -0
- package/server/lib/orchestration/orchestrator.js +130 -0
- package/server/lib/orchestration/orchestrator.test.js +192 -0
- package/server/lib/orchestration/tmux-manager.js +101 -0
- package/server/lib/orchestration/tmux-manager.test.js +109 -0
- package/server/lib/orchestration/worktree-manager.js +132 -0
- package/server/lib/orchestration/worktree-manager.test.js +129 -0
- package/server/lib/port-guard.js +44 -0
- package/server/lib/port-guard.test.js +65 -0
- package/server/lib/project-scanner.js +37 -2
- package/server/lib/project-scanner.test.js +152 -0
- package/server/lib/remember-command.js +2 -0
- package/server/lib/remember-command.test.js +23 -0
- package/server/lib/review/plan-reviewer.js +260 -0
- package/server/lib/review/plan-reviewer.test.js +269 -0
- package/server/lib/review/review-schemas.js +173 -0
- package/server/lib/review/review-schemas.test.js +152 -0
- package/server/lib/security/crypto-utils.test.js +2 -2
- package/server/lib/semantic-recall.js +1 -1
- package/server/lib/semantic-recall.test.js +17 -0
- package/server/lib/ssh-client.js +184 -0
- package/server/lib/ssh-client.test.js +127 -0
- package/server/lib/vps-api.js +184 -0
- package/server/lib/vps-api.test.js +208 -0
- package/server/lib/vps-bootstrap.js +124 -0
- package/server/lib/vps-bootstrap.test.js +79 -0
- package/server/lib/vps-monitor.js +126 -0
- package/server/lib/vps-monitor.test.js +98 -0
- package/server/lib/workspace-api.js +182 -1
- package/server/lib/workspace-api.test.js +474 -0
- package/server/package-lock.json +737 -0
- package/server/package.json +3 -0
- package/server/setup.sh +271 -271
- package/dashboard-web/dist/assets/index-Uhc49PE-.css +0 -1
- package/dashboard-web/dist/assets/index-W36XHPC5.js +0 -431
- package/dashboard-web/dist/assets/index-W36XHPC5.js.map +0 -1
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# /tlc:preflight - Completeness Check Before Done
|
|
2
|
+
|
|
3
|
+
Never declare a task complete without running this. Catches gaps, loose ends, and half-solutions before they ship.
|
|
4
|
+
|
|
5
|
+
## Philosophy
|
|
6
|
+
|
|
7
|
+
**Assume nothing is complete.** Every task has edges you didn't think about. This skill forces you to actively look for what's missing rather than confirming what's present.
|
|
8
|
+
|
|
9
|
+
## When This Runs
|
|
10
|
+
|
|
11
|
+
This is a **plugin** β it fires automatically via PostToolUse hook whenever Claude is about to declare work "done." You don't invoke it manually.
|
|
12
|
+
|
|
13
|
+
It also runs:
|
|
14
|
+
- After `/tlc:build` (via guard + preflight chain)
|
|
15
|
+
- After any multi-file change
|
|
16
|
+
- Before recommending a commit or push
|
|
17
|
+
|
|
18
|
+
## Process
|
|
19
|
+
|
|
20
|
+
### Step 1: Inventory What Was Changed
|
|
21
|
+
|
|
22
|
+
List every file that was created, modified, or deleted in this session. For each one:
|
|
23
|
+
- What was the intent?
|
|
24
|
+
- Was the change completed or left partial?
|
|
25
|
+
|
|
26
|
+
### Step 2: Trace All References
|
|
27
|
+
|
|
28
|
+
For every file changed, check:
|
|
29
|
+
- **Is it registered/imported where needed?** (e.g., new module added to an index, new command added to a commands array, new route added to a router)
|
|
30
|
+
- **Does anything else reference it?** (e.g., config files, package.json, install scripts, documentation)
|
|
31
|
+
- **Are there parallel systems that need the same update?** (e.g., install.js AND postinstall.js, package.json `files` AND `bin`, CLAUDE.md AND help.md)
|
|
32
|
+
|
|
33
|
+
This is the #1 source of half-solutions: changing the thing but not updating everything that points to the thing.
|
|
34
|
+
|
|
35
|
+
### Step 3: Check Consistency Across Layers
|
|
36
|
+
|
|
37
|
+
For each change, verify consistency across ALL layers:
|
|
38
|
+
|
|
39
|
+
| Layer | Check |
|
|
40
|
+
|-------|-------|
|
|
41
|
+
| **Source files** | Does the code do what was intended? |
|
|
42
|
+
| **Tests** | Do tests exist and pass? |
|
|
43
|
+
| **Config** | Are config files updated (package.json, .tlc.json, settings.json)? |
|
|
44
|
+
| **Distribution** | Will this ship to end users? (files array, install scripts, postinstall) |
|
|
45
|
+
| **Documentation** | Is the change reflected in docs, help text, command tables? |
|
|
46
|
+
| **Integration** | Do other systems that depend on this still work? |
|
|
47
|
+
|
|
48
|
+
### Step 4: Ask the Hard Questions
|
|
49
|
+
|
|
50
|
+
Before declaring done, explicitly answer each:
|
|
51
|
+
|
|
52
|
+
1. **"If someone installs this fresh right now, will it work?"**
|
|
53
|
+
- Not "does it work on my machine" β does it work from a clean install?
|
|
54
|
+
|
|
55
|
+
2. **"What did I assume exists that might not?"**
|
|
56
|
+
- Files, directories, env vars, running services, permissions
|
|
57
|
+
|
|
58
|
+
3. **"What's the blast radius?"**
|
|
59
|
+
- What else touches the same files/systems I changed?
|
|
60
|
+
- Did I update ALL of those touchpoints?
|
|
61
|
+
|
|
62
|
+
4. **"Is there a parallel path I forgot?"**
|
|
63
|
+
- Two install scripts? Two config files? Multiple places the same list appears?
|
|
64
|
+
|
|
65
|
+
5. **"What would a user try that I didn't test?"**
|
|
66
|
+
- Edge cases in usage, not just happy path
|
|
67
|
+
|
|
68
|
+
### Step 5: Report
|
|
69
|
+
|
|
70
|
+
**If gaps found:**
|
|
71
|
+
```
|
|
72
|
+
PREFLIGHT CHECK β GAPS FOUND
|
|
73
|
+
|
|
74
|
+
Changes made: 3 files created, 2 files modified
|
|
75
|
+
|
|
76
|
+
Gaps:
|
|
77
|
+
1. Created new-feature.md but not added to COMMANDS array in install.js
|
|
78
|
+
2. Modified settings.json but init.md template not updated to match
|
|
79
|
+
3. No test file for new utility function
|
|
80
|
+
|
|
81
|
+
Fix these before declaring done.
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
**If clean:**
|
|
85
|
+
```
|
|
86
|
+
PREFLIGHT CHECK β CLEAR
|
|
87
|
+
|
|
88
|
+
Changes made: 3 files created, 2 files modified
|
|
89
|
+
All references updated: β
|
|
90
|
+
Distribution verified: β
|
|
91
|
+
Tests exist: β
|
|
92
|
+
Config consistent: β
|
|
93
|
+
|
|
94
|
+
Task is complete.
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## Common Gap Patterns
|
|
98
|
+
|
|
99
|
+
These are the most frequent gaps this skill catches:
|
|
100
|
+
|
|
101
|
+
| Pattern | Example |
|
|
102
|
+
|---------|---------|
|
|
103
|
+
| **Registry miss** | New file created but not added to install array, export list, or index |
|
|
104
|
+
| **Parallel system miss** | Updated install.js but not postinstall.js |
|
|
105
|
+
| **Config drift** | Changed settings.json but init.md still generates the old version |
|
|
106
|
+
| **Distribution miss** | File exists in repo but won't ship (not in package.json files) |
|
|
107
|
+
| **Doc drift** | New command added but not in CLAUDE.md dispatch table or help.md |
|
|
108
|
+
| **Test miss** | New code without corresponding test |
|
|
109
|
+
| **Cross-reference miss** | Renamed something but didn't grep for all references |
|
|
110
|
+
|
|
111
|
+
## Example
|
|
112
|
+
|
|
113
|
+
```
|
|
114
|
+
PREFLIGHT CHECK β GAPS FOUND
|
|
115
|
+
|
|
116
|
+
Session changes:
|
|
117
|
+
+ .claude/commands/tlc/watchci.md (new skill)
|
|
118
|
+
+ .claude/commands/tlc/e2e-verify.md (new skill)
|
|
119
|
+
+ .claude/commands/tlc/guard.md (new skill)
|
|
120
|
+
+ .claude/hooks/tlc-post-push.sh (new hook)
|
|
121
|
+
+ .claude/hooks/tlc-post-build.sh (new hook)
|
|
122
|
+
~ .claude/settings.json (added PostToolUse hooks)
|
|
123
|
+
~ CLAUDE.md (added dispatch entries)
|
|
124
|
+
|
|
125
|
+
Gaps:
|
|
126
|
+
β watchci.md, e2e-verify.md, guard.md not in COMMANDS array (bin/install.js)
|
|
127
|
+
β .claude/hooks/ not in package.json files array β won't ship
|
|
128
|
+
β postinstall.js doesn't copy hooks β fresh install broken
|
|
129
|
+
β init.md settings template doesn't include new hooks
|
|
130
|
+
β help.md doesn't list new commands
|
|
131
|
+
β bootstrap.md was already missing from COMMANDS array (pre-existing gap)
|
|
132
|
+
|
|
133
|
+
6 gaps found. Fix before declaring done.
|
|
134
|
+
```
|
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
# /tlc:review-plan - Review a TLC Phase Plan
|
|
2
|
+
|
|
3
|
+
Review a `.planning/phases/{N}-PLAN.md` file for structure, scope, architecture, and completeness. Uses Claude in-session plus Codex (if available) for consensus.
|
|
4
|
+
|
|
5
|
+
## What This Does
|
|
6
|
+
|
|
7
|
+
1. Auto-detects the target plan file (or uses the phase number you provide)
|
|
8
|
+
2. **Runs Claude in-session analysis** against all quality dimensions
|
|
9
|
+
3. **Invokes Codex** (if available in router state) for a second opinion
|
|
10
|
+
4. Combines verdicts β both must APPROVE for overall APPROVED
|
|
11
|
+
5. Generates a structured report with per-provider attribution
|
|
12
|
+
|
|
13
|
+
## Usage
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
/tlc:review-plan # Auto-detect latest PLAN.md
|
|
17
|
+
/tlc:review-plan 7 # Review .planning/phases/7-PLAN.md
|
|
18
|
+
/tlc:review-plan 12 # Review .planning/phases/12-PLAN.md
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Process
|
|
22
|
+
|
|
23
|
+
### Step 1: Load Context
|
|
24
|
+
|
|
25
|
+
**Read router state first**, then load the plan file.
|
|
26
|
+
|
|
27
|
+
```javascript
|
|
28
|
+
// 1. Read persistent router state (written by session-init hook)
|
|
29
|
+
const routerState = JSON.parse(fs.readFileSync('.tlc/.router-state.json', 'utf-8'));
|
|
30
|
+
|
|
31
|
+
// 2. Read config for capability mappings
|
|
32
|
+
const config = JSON.parse(fs.readFileSync('.tlc.json', 'utf-8'));
|
|
33
|
+
const reviewProviders = config.router?.capabilities?.['review-plan']?.providers
|
|
34
|
+
|| config.router?.capabilities?.review?.providers
|
|
35
|
+
|| ['claude'];
|
|
36
|
+
|
|
37
|
+
// 3. Filter to only AVAILABLE providers (from state file)
|
|
38
|
+
const availableReviewers = reviewProviders.filter(p =>
|
|
39
|
+
routerState.providers[p]?.available === true
|
|
40
|
+
);
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
**The state file (`.tlc/.router-state.json`) is authoritative for availability.** Never run `which codex` yourself β read the state file. If the state file is missing or stale (>1 hour), probe manually and write a fresh one.
|
|
44
|
+
|
|
45
|
+
**Locate the plan file:**
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
# If phase number provided (e.g., "7"):
|
|
49
|
+
PLAN_FILE=".planning/phases/7-PLAN.md"
|
|
50
|
+
|
|
51
|
+
# If no argument β find the highest-numbered PLAN.md:
|
|
52
|
+
ls .planning/phases/*-PLAN.md | sort -t- -k1 -n | tail -1
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Also optionally read for context (if they exist):
|
|
56
|
+
- `.planning/phases/{N}-DISCUSSION.md` β design decisions
|
|
57
|
+
- `PROJECT.md` β project name, tech stack
|
|
58
|
+
- `.planning/ROADMAP.md` β phase dependencies
|
|
59
|
+
|
|
60
|
+
### Step 2: Claude In-Session Review
|
|
61
|
+
|
|
62
|
+
Analyze the plan across four dimensions. For each, produce a list of issues (empty = passing).
|
|
63
|
+
|
|
64
|
+
#### Dimension 1: Structure
|
|
65
|
+
|
|
66
|
+
Check every `### Task N:` block for:
|
|
67
|
+
|
|
68
|
+
| Field | Check | Fail Condition |
|
|
69
|
+
|-------|-------|----------------|
|
|
70
|
+
| `**Goal:**` | Present and non-empty | Missing or blank |
|
|
71
|
+
| `**Files:**` | At least one file listed | No files listed |
|
|
72
|
+
| `**Acceptance Criteria:**` | At least one `- [ ]` checkbox | Missing or empty section |
|
|
73
|
+
| `**Test Cases:**` | At least one bullet | Missing or empty section |
|
|
74
|
+
|
|
75
|
+
#### Dimension 2: Scope
|
|
76
|
+
|
|
77
|
+
| Check | Fail Condition |
|
|
78
|
+
|-------|----------------|
|
|
79
|
+
| Task title specificity | Title contains vague words: `system`, `entire`, `all`, `everything`, `complete`, `whole`, `full` |
|
|
80
|
+
| Vertical slice | Task mixes unrelated concerns (e.g., "Add auth AND refactor DB") |
|
|
81
|
+
| No files listed | Task has empty `**Files:**` section |
|
|
82
|
+
|
|
83
|
+
#### Dimension 3: Architecture
|
|
84
|
+
|
|
85
|
+
| Check | Fail Condition |
|
|
86
|
+
|-------|----------------|
|
|
87
|
+
| File line estimates | Any file has `estimated: NNN lines` where NNN > 1000 |
|
|
88
|
+
| Folder density | Any folder listed that already has > 15 files (check disk if accessible) |
|
|
89
|
+
| Module structure | Files dumped into flat `src/services/` or `src/controllers/` with > 5 items |
|
|
90
|
+
|
|
91
|
+
#### Dimension 4: Completeness
|
|
92
|
+
|
|
93
|
+
| Check | Fail Condition |
|
|
94
|
+
|-------|----------------|
|
|
95
|
+
| Prerequisites section | No `## Prerequisites` block in the plan |
|
|
96
|
+
| Dependencies section | No `## Dependencies` block (warn, not fail) |
|
|
97
|
+
| Phase ordering | Prerequisites reference phases that don't exist in ROADMAP (if readable) |
|
|
98
|
+
|
|
99
|
+
#### Dimension 5: TDD Readiness
|
|
100
|
+
|
|
101
|
+
Every task must have testable acceptance criteria:
|
|
102
|
+
|
|
103
|
+
| Check | Fail Condition |
|
|
104
|
+
|-------|----------------|
|
|
105
|
+
| Criteria are checkboxes | Criteria written as prose instead of `- [ ] ...` checkboxes |
|
|
106
|
+
| Criteria are specific | Criterion is too vague to write a test for (e.g., "works correctly") |
|
|
107
|
+
| Test cases listed | `**Test Cases:**` section is absent or has zero items |
|
|
108
|
+
| Test cases cover happy + sad paths | Only happy-path tests listed (warn) |
|
|
109
|
+
|
|
110
|
+
**Scoring:**
|
|
111
|
+
- 0 structure issues + 0 scope issues + 0 completeness issues + all tasks TDD-ready = **APPROVED**
|
|
112
|
+
- Any issues in structure, completeness, or TDD = **CHANGES_REQUESTED**
|
|
113
|
+
- Scope/architecture issues alone = **CHANGES_REQUESTED**
|
|
114
|
+
|
|
115
|
+
### Step 3: Invoke Codex (if available)
|
|
116
|
+
|
|
117
|
+
**CRITICAL: This step runs automatically when Codex is available in router state.**
|
|
118
|
+
|
|
119
|
+
Check availability:
|
|
120
|
+
```javascript
|
|
121
|
+
const codexAvailable = routerState.providers?.codex?.available === true
|
|
122
|
+
&& availableReviewers.includes('codex');
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
If Codex is available, invoke it with `exec` in read-only sandbox mode:
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
# Write the plan-review JSON schema to a temp file
|
|
129
|
+
cat > /tmp/plan-review-schema.json << 'EOF'
|
|
130
|
+
{
|
|
131
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
132
|
+
"type": "object",
|
|
133
|
+
"required": ["verdict", "structureIssues", "scopeIssues", "suggestions"],
|
|
134
|
+
"properties": {
|
|
135
|
+
"verdict": { "type": "string", "enum": ["APPROVED", "CHANGES_REQUESTED"] },
|
|
136
|
+
"structureIssues": { "type": "array", "items": { "type": "string" } },
|
|
137
|
+
"scopeIssues": { "type": "array", "items": { "type": "string" } },
|
|
138
|
+
"suggestions": { "type": "array", "items": { "type": "string" } }
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
EOF
|
|
142
|
+
|
|
143
|
+
# Invoke Codex with the plan content
|
|
144
|
+
codex exec -s read-only --output-schema /tmp/plan-review-schema.json \
|
|
145
|
+
"Review this TLC phase plan for quality. Check:
|
|
146
|
+
1. Structure: every task has Goal, Files, Acceptance Criteria (checkboxes), and Test Cases.
|
|
147
|
+
2. Scope: no vague titles, each task is a vertical slice with specific deliverables.
|
|
148
|
+
3. Architecture: no files planned >1000 lines, no folders >15 files.
|
|
149
|
+
4. Completeness: Prerequisites section present, dependencies are explicit.
|
|
150
|
+
5. TDD: every acceptance criterion is a testable, specific checkbox; test cases cover happy and sad paths.
|
|
151
|
+
|
|
152
|
+
Respond with JSON matching the output schema.
|
|
153
|
+
|
|
154
|
+
PLAN CONTENT:
|
|
155
|
+
$(cat .planning/phases/${PHASE_NUMBER}-PLAN.md)"
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
If `codex exec` is not available (older Codex without `exec` subcommand), fall back to:
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
codex --print \
|
|
162
|
+
"Review this TLC phase plan. For each issue found, format as:
|
|
163
|
+
- [structure|scope|architecture|completeness|tdd] <description>
|
|
164
|
+
End your response with either: Verdict: APPROVED or Verdict: CHANGES_REQUESTED
|
|
165
|
+
|
|
166
|
+
$(cat .planning/phases/${PHASE_NUMBER}-PLAN.md)"
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
Parse the fallback output using the `Verdict: APPROVED|CHANGES_REQUESTED` pattern.
|
|
170
|
+
|
|
171
|
+
**If Codex is unavailable:** Skip this step. Claude-only review proceeds. Note in the report: `Codex: unavailable (skipped)`.
|
|
172
|
+
|
|
173
|
+
### Step 4: Combine Verdicts
|
|
174
|
+
|
|
175
|
+
```
|
|
176
|
+
Overall verdict rules:
|
|
177
|
+
- ALL available providers approve β APPROVED
|
|
178
|
+
- ANY provider requests changes β CHANGES_REQUESTED
|
|
179
|
+
- Only 1 provider available β that provider's verdict is final
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
Combine issues from all providers. Tag each issue with its source: `[Claude]` or `[Codex]`.
|
|
183
|
+
|
|
184
|
+
### Step 5: Generate Report
|
|
185
|
+
|
|
186
|
+
```markdown
|
|
187
|
+
# Plan Review Report
|
|
188
|
+
|
|
189
|
+
**Plan:** .planning/phases/{N}-PLAN.md
|
|
190
|
+
**Phase:** {N}
|
|
191
|
+
**Tasks:** {count}
|
|
192
|
+
**Date:** {ISO timestamp}
|
|
193
|
+
|
|
194
|
+
## Verdict: APPROVED | CHANGES_REQUESTED
|
|
195
|
+
|
|
196
|
+
## Dimension Results
|
|
197
|
+
|
|
198
|
+
### Structure
|
|
199
|
+
β
All tasks have Goal, Files, Acceptance Criteria, and Test Cases
|
|
200
|
+
β or β
|
|
201
|
+
β 2 tasks missing acceptance criteria
|
|
202
|
+
βββ Task 3: "Add OAuth flow" β missing **Acceptance Criteria:** section
|
|
203
|
+
βββ Task 5: "Write migration" β missing **Test Cases:** section
|
|
204
|
+
|
|
205
|
+
### Scope
|
|
206
|
+
β
All task titles are specific and scoped
|
|
207
|
+
β or β
|
|
208
|
+
β οΈ Task 2: "Complete user system" β title too vague (contains "complete", "system")
|
|
209
|
+
|
|
210
|
+
### Architecture
|
|
211
|
+
β
No files planned over 1000 lines
|
|
212
|
+
β
No folders over 15 files
|
|
213
|
+
|
|
214
|
+
### Completeness
|
|
215
|
+
β
Prerequisites section present
|
|
216
|
+
β οΈ No ## Dependencies section (recommended)
|
|
217
|
+
|
|
218
|
+
### TDD Readiness
|
|
219
|
+
β
All tasks have testable criteria as checkboxes
|
|
220
|
+
β or β
|
|
221
|
+
β Task 4 criteria written as prose, not checkboxes
|
|
222
|
+
|
|
223
|
+
## Provider Results
|
|
224
|
+
|
|
225
|
+
β
Claude: APPROVED
|
|
226
|
+
β
Codex: APPROVED (GPT-5.2)
|
|
227
|
+
β or β
|
|
228
|
+
β Codex: unavailable (skipped)
|
|
229
|
+
|
|
230
|
+
## Combined Issues
|
|
231
|
+
|
|
232
|
+
[Claude] Task 3 missing acceptance criteria
|
|
233
|
+
[Codex] Task 2 scope too broad β split into separate tasks
|
|
234
|
+
|
|
235
|
+
## Action Required
|
|
236
|
+
|
|
237
|
+
1. Add **Acceptance Criteria:** checkboxes to Task 3
|
|
238
|
+
2. Narrow Task 2 title and split "auth" from "profile" concerns
|
|
239
|
+
3. Add test cases covering auth failure paths in Task 1
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
## Example Output
|
|
243
|
+
|
|
244
|
+
### Plan Passes Review
|
|
245
|
+
|
|
246
|
+
```
|
|
247
|
+
/tlc:review-plan 7
|
|
248
|
+
|
|
249
|
+
Loading router state from .tlc/.router-state.json...
|
|
250
|
+
Plan review providers: claude, codex
|
|
251
|
+
|
|
252
|
+
Target plan: .planning/phases/7-PLAN.md (5 tasks)
|
|
253
|
+
|
|
254
|
+
βββββββββββββββββββββββββββββββββββββββββ
|
|
255
|
+
Claude in-session review...
|
|
256
|
+
βββββββββββββββββββββββββββββββββββββββββ
|
|
257
|
+
|
|
258
|
+
Structure: β
All 5 tasks complete
|
|
259
|
+
Scope: β
All titles specific
|
|
260
|
+
Architecture: β
No oversized files planned
|
|
261
|
+
Completeness: β
Prerequisites present
|
|
262
|
+
TDD: β
All criteria as checkboxes
|
|
263
|
+
|
|
264
|
+
Claude verdict: β
APPROVED
|
|
265
|
+
|
|
266
|
+
βββββββββββββββββββββββββββββββββββββββββ
|
|
267
|
+
Invoking Codex (GPT-5.2) for plan review...
|
|
268
|
+
βββββββββββββββββββββββββββββββββββββββββ
|
|
269
|
+
|
|
270
|
+
Codex verdict: β
APPROVED
|
|
271
|
+
- Clear task decomposition
|
|
272
|
+
- Good test coverage planning
|
|
273
|
+
- Prerequisites are explicit
|
|
274
|
+
|
|
275
|
+
Provider Results:
|
|
276
|
+
β
Claude: APPROVED
|
|
277
|
+
β
Codex: APPROVED
|
|
278
|
+
|
|
279
|
+
βββββββββββββββββββββββββββββββββββββββββ
|
|
280
|
+
β
APPROVED β Plan is ready for /tlc:build (2/2 agree)
|
|
281
|
+
βββββββββββββββββββββββββββββββββββββββββ
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
### Plan Needs Changes
|
|
285
|
+
|
|
286
|
+
```
|
|
287
|
+
/tlc:review-plan 12
|
|
288
|
+
|
|
289
|
+
Loading router state from .tlc/.router-state.json...
|
|
290
|
+
Plan review providers: claude, codex
|
|
291
|
+
|
|
292
|
+
Target plan: .planning/phases/12-PLAN.md (4 tasks)
|
|
293
|
+
|
|
294
|
+
βββββββββββββββββββββββββββββββββββββββββ
|
|
295
|
+
Claude in-session review...
|
|
296
|
+
βββββββββββββββββββββββββββββββββββββββββ
|
|
297
|
+
|
|
298
|
+
Structure: β 2 issues
|
|
299
|
+
βββ Task 2: missing **Acceptance Criteria:**
|
|
300
|
+
βββ Task 4: missing **Test Cases:**
|
|
301
|
+
Scope: β οΈ 1 issue
|
|
302
|
+
βββ Task 1: "Complete full system" β title too vague
|
|
303
|
+
Architecture: β
No oversized files planned
|
|
304
|
+
Completeness: β 1 issue
|
|
305
|
+
βββ No ## Prerequisites section
|
|
306
|
+
TDD: β 1 issue
|
|
307
|
+
βββ Task 3: criteria written as prose, not checkboxes
|
|
308
|
+
|
|
309
|
+
Claude verdict: β CHANGES_REQUESTED
|
|
310
|
+
|
|
311
|
+
βββββββββββββββββββββββββββββββββββββββββ
|
|
312
|
+
Invoking Codex (GPT-5.2) for plan review...
|
|
313
|
+
βββββββββββββββββββββββββββββββββββββββββ
|
|
314
|
+
|
|
315
|
+
Codex verdict: β CHANGES_REQUESTED
|
|
316
|
+
- Task 2 has no way to verify completion
|
|
317
|
+
- Task 1 scope covers too many concerns
|
|
318
|
+
- Missing error-path test cases throughout
|
|
319
|
+
|
|
320
|
+
Provider Results:
|
|
321
|
+
β Claude: CHANGES_REQUESTED
|
|
322
|
+
β Codex: CHANGES_REQUESTED
|
|
323
|
+
|
|
324
|
+
Combined Issues:
|
|
325
|
+
[Claude] Task 2 missing acceptance criteria
|
|
326
|
+
[Claude] Task 4 missing test cases
|
|
327
|
+
[Claude] Task 1 title too vague ("complete", "system")
|
|
328
|
+
[Claude] No ## Prerequisites section
|
|
329
|
+
[Claude] Task 3 criteria are prose, not checkboxes
|
|
330
|
+
[Codex] Task 2 has no verifiable completion criteria
|
|
331
|
+
[Codex] Task 1 mixes auth, profile, and settings concerns
|
|
332
|
+
[Codex] Missing error/failure path test cases in Tasks 1β3
|
|
333
|
+
|
|
334
|
+
βββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
335
|
+
β CHANGES_REQUESTED (0/2 approved)
|
|
336
|
+
|
|
337
|
+
Action required:
|
|
338
|
+
1. Add **Acceptance Criteria:** checkboxes to Task 2
|
|
339
|
+
2. Add **Test Cases:** to Task 4
|
|
340
|
+
3. Rename Task 1 β split auth/profile/settings into separate tasks
|
|
341
|
+
4. Add ## Prerequisites section listing prior phases
|
|
342
|
+
5. Rewrite Task 3 criteria as - [ ] checkboxes
|
|
343
|
+
6. Add sad-path test cases to Tasks 1β3 (Codex)
|
|
344
|
+
βββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
## Flags
|
|
348
|
+
|
|
349
|
+
| Flag | Description |
|
|
350
|
+
|------|-------------|
|
|
351
|
+
| `--no-external` | Skip Codex, use Claude only |
|
|
352
|
+
| `--codex-only` | Use only Codex (skip Claude in-session deep checks) |
|
|
353
|
+
| `--strict` | Treat warnings (vague titles, missing deps) as failures |
|
|
354
|
+
|
|
355
|
+
## Integration
|
|
356
|
+
|
|
357
|
+
This review runs automatically:
|
|
358
|
+
- At the end of `/tlc:plan` (informational β does not block)
|
|
359
|
+
- Can be run manually before `/tlc:build` to validate a plan
|
|
360
|
+
|
|
361
|
+
## ARGUMENTS
|
|
362
|
+
|
|
363
|
+
$ARGUMENTS
|