Skip to content

Commit 253943f

Browse files
jwaldripclaude
andcommitted
Revert marketplace to path source, add plugin zip download
git-subdir source not supported by claude.ai. Reverted to path-based. Added prebuild zip generation and download option on start-here page. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 2efcac2 commit 253943f

File tree

13 files changed

+419
-30
lines changed

13 files changed

+419
-30
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ coverage/
3131
# Misc
3232
*.tsbuildinfo
3333

34+
# Generated plugin zip
35+
website/public/ai-dlc-plugin.zip
36+
3437
# AI-DLC worktrees
3538
.ai-dlc/worktrees/
3639
.claude/worktrees

plugin/lib/dag.sh

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,18 @@ parse_unit_deps() {
9898
_yaml_get_array "depends_on" < "$unit_file"
9999
}
100100

101+
# Parse unit pass from frontmatter (fast - no subprocess)
102+
# Returns the pass type (design, product, dev) or empty for single-pass units
103+
# Usage: parse_unit_pass <unit_file>
104+
parse_unit_pass() {
105+
local unit_file="$1"
106+
if [ ! -f "$unit_file" ]; then
107+
echo ""
108+
return
109+
fi
110+
_yaml_get_simple "pass" "" < "$unit_file"
111+
}
112+
101113
# Parse unit branch name from frontmatter (fast - no subprocess)
102114
# Usage: parse_unit_branch <unit_file>
103115
parse_unit_branch() {
@@ -238,6 +250,41 @@ find_ready_units() {
238250
done
239251
}
240252

253+
# Find ready units filtered by pass
254+
# When active_pass is set, only returns units belonging to that pass
255+
# When active_pass is empty, returns all ready units (backward compatible)
256+
# Usage: find_ready_units_for_pass <intent_dir> <active_pass>
257+
find_ready_units_for_pass() {
258+
local intent_dir="$1"
259+
local active_pass="$2"
260+
261+
if [ ! -d "$intent_dir" ]; then
262+
return
263+
fi
264+
265+
for unit_file in "$intent_dir"/unit-*.md; do
266+
[ -f "$unit_file" ] || continue
267+
268+
# Filter by pass if active_pass is set
269+
if [ -n "$active_pass" ]; then
270+
local unit_pass
271+
unit_pass=$(parse_unit_pass "$unit_file")
272+
[ "$unit_pass" != "$active_pass" ] && continue
273+
fi
274+
275+
local unit_status
276+
unit_status=$(parse_unit_status "$unit_file")
277+
278+
# Only consider pending units
279+
[ "$unit_status" != "pending" ] && continue
280+
281+
# Check if all deps are completed
282+
if are_deps_completed "$intent_dir" "$unit_file"; then
283+
basename "$unit_file" .md
284+
fi
285+
done
286+
}
287+
241288
# Find in-progress units
242289
# Returns unit names (without .md) one per line
243290
# Usage: find_in_progress_units <intent_dir>

plugin/skills/construct/SKILL.md

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -837,7 +837,41 @@ SendMessage({
837837
TeamDelete()
838838
```
839839

840-
3. Mark intent complete:
840+
3. **Check for next pass** before marking intent complete:
841+
842+
```bash
843+
# Read pass configuration from intent.md
844+
INTENT_DIR=".ai-dlc/${INTENT_SLUG}"
845+
PASSES=$(grep '^passes:' "$INTENT_DIR/intent.md" | sed 's/passes: *//' | sed 's/\[//;s/\]//' | tr ',' '\n' | sed 's/ //g' | grep -v '^$')
846+
ACTIVE_PASS=$(grep '^active_pass:' "$INTENT_DIR/intent.md" | sed 's/active_pass: *//' | tr -d '"')
847+
848+
if [ -n "$PASSES" ] && [ -n "$ACTIVE_PASS" ]; then
849+
# Find the next pass after the active one
850+
NEXT_PASS=""
851+
FOUND_ACTIVE=false
852+
for pass in $PASSES; do
853+
if [ "$FOUND_ACTIVE" = "true" ]; then
854+
NEXT_PASS="$pass"
855+
break
856+
fi
857+
[ "$pass" = "$ACTIVE_PASS" ] && FOUND_ACTIVE=true
858+
done
859+
860+
if [ -n "$NEXT_PASS" ]; then
861+
echo "PASS_TRANSITION: $ACTIVE_PASS -> $NEXT_PASS"
862+
fi
863+
fi
864+
```
865+
866+
**If a next pass exists:** Do NOT mark intent complete. Instead:
867+
1. Update `active_pass` in intent.md frontmatter to the next pass
868+
2. Notify the user: "The **{active_pass}** pass is complete. The next pass is **{next_pass}**. Run `/elaborate` to define {next_pass} units using the artifacts from the {active_pass} pass."
869+
3. Save state with `status=pass_transition`
870+
4. Stop construction — the user will re-elaborate for the next pass
871+
872+
**If no next pass** (last pass or no passes configured):
873+
874+
Mark intent complete:
841875

842876
```bash
843877
STATE=$(echo "$STATE" | han parse json --set "status=complete")

plugin/skills/elaborate/SKILL.md

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -834,6 +834,37 @@ Map selections to the `announcements` array in intent.md frontmatter:
834834

835835
---
836836

837+
## Phase 5.95: Iteration Passes
838+
839+
Ask the user if this intent needs multi-phase iteration across disciplines. Most intents only need a single dev pass (the default). Cross-functional teams building user-facing features may benefit from design and product passes before dev.
840+
841+
Use `AskUserQuestion`:
842+
```json
843+
{
844+
"questions": [{
845+
"question": "Does this intent need cross-functional iteration passes?",
846+
"header": "Iteration Passes",
847+
"options": [
848+
{"label": "Dev only", "description": "Single pass — elaborate and build (default for most work)"},
849+
{"label": "Design + Dev", "description": "Design pass produces artifacts, then dev pass builds from them"},
850+
{"label": "Design + Product + Dev", "description": "Full cross-functional: design artifacts → product specs → working code"},
851+
{"label": "Product + Dev", "description": "Product defines acceptance criteria, then dev builds"}
852+
],
853+
"multiSelect": false
854+
}]
855+
}
856+
```
857+
858+
Map selections to the `passes` array in intent.md frontmatter:
859+
- "Dev only" → `[]` (empty — single implicit dev pass, the default)
860+
- "Design + Dev" → `[design, dev]`
861+
- "Design + Product + Dev" → `[design, product, dev]`
862+
- "Product + Dev" → `[product, dev]`
863+
864+
When passes are configured, set `active_pass` to the first pass in the list. The units elaborated in this session belong to the active pass. When construction completes the active pass, the next pass will trigger a new elaboration cycle for its discipline-specific units.
865+
866+
---
867+
837868
## Phase 6: Write AI-DLC Artifacts
838869

839870
Write intent and unit files in `.ai-dlc/{intent-slug}/` (already in the intent worktree since Phase 2.25):
@@ -866,6 +897,8 @@ git:
866897
auto_merge: {true|false}
867898
auto_squash: false
868899
announcements: [] # e.g., [changelog, release-notes, social-posts, blog-draft]
900+
passes: [] # Optional: [design, product, dev] — omit or leave empty for single-pass (default dev)
901+
active_pass: "" # Current pass being worked on (auto-managed by construct)
869902
created: {ISO date}
870903
status: active
871904
epic: "" # Ticketing provider epic key (auto-populated if ticketing provider configured)
@@ -925,6 +958,7 @@ status: pending
925958
depends_on: []
926959
branch: ai-dlc/{intent-slug}/NN-{unit-slug}
927960
discipline: {discipline} # frontend, backend, api, documentation, devops, design, etc.
961+
pass: "" # Which pass this unit belongs to (design, product, dev) — empty for single-pass intents
928962
workflow: "" # Per-unit workflow override (optional — omit or leave empty to use intent-level workflow)
929963
ticket: "" # Ticketing provider ticket key (auto-populated if ticketing provider configured)
930964
# git: # Optional: per-unit VCS override (only include when unit has an override)

website/app/big-picture/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ export default function BigPicturePage() {
3535
<div className="mt-16 grid gap-8 md:grid-cols-2">
3636
<ExplanationCard
3737
title="Development Phases"
38-
description="Work flows from Intent (what you want to build) through Units (cohesive work elements) and Bolts (focused iteration cycles) to Deploy (shipping verified work)."
38+
description="Work flows from Intent (what you want to build) through optional Passes (cross-functional iterations), Units (cohesive work elements), and Bolts (focused iteration cycles) to Deploy (shipping verified work)."
3939
href="/docs/concepts/"
4040
color="blue"
4141
/>

website/app/components/big-picture/data.ts

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ const xPos = (index: number, total: number): number => {
1313
return spacing * (index + 1) - NODE_WIDTH / 2
1414
}
1515

16+
// Top row has 5 nodes now (Intent, Pass, Unit, Bolt, Deploy)
17+
const TOP_ROW_COUNT = 5
18+
1619
export const diagramData: DiagramData = {
1720
layers: [
1821
{
@@ -49,7 +52,19 @@ export const diagramData: DiagramData = {
4952
"High-level statement of purpose defining what you want to achieve with clear completion criteria.",
5053
href: "/paper/#intent",
5154
category: "artifact",
52-
x: xPos(0, 4),
55+
x: xPos(0, TOP_ROW_COUNT),
56+
y: 30,
57+
width: NODE_WIDTH,
58+
height: NODE_HEIGHT,
59+
},
60+
{
61+
id: "pass",
62+
label: "Pass",
63+
description:
64+
"A typed iteration (design, product, dev) through the standard AI-DLC loop. Enables cross-functional handoffs within a single intent.",
65+
href: "/paper/#pass",
66+
category: "artifact",
67+
x: xPos(1, TOP_ROW_COUNT),
5368
y: 30,
5469
width: NODE_WIDTH,
5570
height: NODE_HEIGHT,
@@ -61,7 +76,7 @@ export const diagramData: DiagramData = {
6176
"Cohesive, self-contained work element derived from an Intent. Independently deployable with clear boundaries.",
6277
href: "/paper/#unit",
6378
category: "artifact",
64-
x: xPos(1, 4),
79+
x: xPos(2, TOP_ROW_COUNT),
6580
y: 30,
6681
width: NODE_WIDTH,
6782
height: NODE_HEIGHT,
@@ -73,7 +88,7 @@ export const diagramData: DiagramData = {
7388
"Single iteration cycle - one focused work session bounded by context resets. High-velocity delivery.",
7489
href: "/paper/#bolt",
7590
category: "artifact",
76-
x: xPos(2, 4),
91+
x: xPos(3, TOP_ROW_COUNT),
7792
y: 30,
7893
width: NODE_WIDTH,
7994
height: NODE_HEIGHT,
@@ -85,7 +100,7 @@ export const diagramData: DiagramData = {
85100
"Ship verified work to production. Units are independently deployable when criteria are met.",
86101
href: "/paper/#deployment-unit",
87102
category: "artifact",
88-
x: xPos(3, 4),
103+
x: xPos(4, TOP_ROW_COUNT),
89104
y: 30,
90105
width: NODE_WIDTH,
91106
height: NODE_HEIGHT,
@@ -231,9 +246,12 @@ export const diagramData: DiagramData = {
231246
],
232247
connectors: [
233248
// Phase flow (left to right)
234-
{ id: "intent-unit", from: "intent", to: "unit", type: "flow" },
249+
{ id: "intent-pass", from: "intent", to: "pass", type: "flow" },
250+
{ id: "pass-unit", from: "pass", to: "unit", type: "flow" },
235251
{ id: "unit-bolt", from: "unit", to: "bolt", type: "flow" },
236252
{ id: "bolt-deploy", from: "bolt", to: "deploy", type: "flow" },
253+
// Feedback: bolts can feed back to passes (cross-functional iteration)
254+
{ id: "bolt-pass", from: "bolt", to: "pass", type: "influences" },
237255

238256
// Hat flow (left to right)
239257
{
@@ -246,7 +264,8 @@ export const diagramData: DiagramData = {
246264
{ id: "builder-reviewer", from: "builder", to: "reviewer", type: "flow" },
247265

248266
// Phases to hats (vertical influence)
249-
{ id: "unit-researcher", from: "unit", to: "researcher", type: "contains" },
267+
{ id: "pass-researcher", from: "pass", to: "researcher", type: "contains" },
268+
{ id: "unit-planner", from: "unit", to: "planner", type: "contains" },
250269
{ id: "bolt-builder", from: "bolt", to: "builder", type: "contains" },
251270

252271
// Operating modes influence hats

website/app/glossary/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { GlossaryContent } from "./GlossaryContent"
99
export const metadata: Metadata = {
1010
title: "Glossary",
1111
description:
12-
"Complete glossary of AI-DLC terminology - Intent, Unit, Bolt, HITL, OHOTL, AHOTL, Backpressure, and more.",
12+
"Complete glossary of AI-DLC terminology - Intent, Pass, Unit, Bolt, HITL, OHOTL, AHOTL, Backpressure, and more.",
1313
openGraph: {
1414
title: "AI-DLC Glossary",
1515
description:

website/app/start-here/page.tsx

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,32 @@ export default function StartHerePage() {
220220
</div>
221221
</div>
222222

223+
<div className="my-6 rounded-lg border border-gray-200 bg-gray-50 p-4 dark:border-gray-700 dark:bg-gray-800/50">
224+
<p className="mb-2 text-sm font-medium text-gray-700 dark:text-gray-300">
225+
Alternative: Download Plugin
226+
</p>
227+
<p className="mb-3 text-sm text-gray-600 dark:text-gray-400">
228+
Download the plugin zip, extract it into your project, and point Claude
229+
Code to it:
230+
</p>
231+
<div className="space-y-3">
232+
<a
233+
href="/ai-dlc-plugin.zip"
234+
download
235+
className="inline-flex items-center gap-2 rounded-lg border border-gray-300 bg-white px-4 py-2 text-sm font-medium text-gray-700 transition hover:bg-gray-50 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200 dark:hover:bg-gray-600"
236+
>
237+
<svg className="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true">
238+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4" />
239+
</svg>
240+
Download Plugin (.zip)
241+
</a>
242+
<div className="rounded-lg bg-gray-900 p-4 font-mono text-sm text-white dark:bg-gray-800">
243+
<div className="text-gray-400"># Extract and add to your project</div>
244+
<div>unzip ai-dlc-plugin.zip -d .claude</div>
245+
</div>
246+
</div>
247+
</div>
248+
223249
<div className="prose prose-gray dark:prose-invert max-w-none">
224250
<p>
225251
Need Han CLI for state management?{" "}

website/content/docs/concepts.md

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,38 @@ add-recommendation-engine/
5454
unit-04-frontend.md # Display recommendations
5555
```
5656

57+
### Pass
58+
59+
A **Pass** is a typed iteration through the standard AI-DLC loop (elaborate → units → construct → review) focused on a specific discipline. Passes enable cross-functional handoffs within a single intent.
60+
61+
**Pass Types:**
62+
63+
| Pass | Participants | Mode | Output |
64+
|------|-------------|------|--------|
65+
| `design` | Design + Product | OHOTL | High-fidelity design artifacts |
66+
| `product` | Product + Design | HITL | Behavioral specs, acceptance criteria |
67+
| `dev` | Dev + Product + Design | AHOTL/HITL | Working code |
68+
69+
**How it works:**
70+
71+
1. Each pass runs the full AI-DLC loop independently
72+
2. The output of one pass becomes input to the next
73+
3. Backward flow is expected -- dev discovering a constraint feeds back to product; product finding a design gap feeds back to design
74+
75+
**Configuration:**
76+
77+
Passes are optional. Single-pass (dev only) is the default. Add passes to an intent when cross-functional iteration is needed:
78+
79+
```yaml
80+
# intent.md frontmatter
81+
---
82+
passes: [design, product, dev]
83+
active_pass: "design"
84+
---
85+
```
86+
87+
When all units in a pass complete, the intent transitions to the next pass automatically. Units belong to a specific pass via their `pass:` frontmatter field.
88+
5789
### Unit Dependencies (DAG)
5890

5991
Units can declare dependencies, forming a Directed Acyclic Graph:
@@ -308,6 +340,34 @@ If you `/clear` without the stop hook:
308340
2. Ephemeral state persists in `han keep`
309341
3. Run `/construct` to continue
310342

343+
## Iteration Through Passes
344+
345+
AI-DLC treats iteration as the natural state of product development. The same State → Work → Feedback → Learn → Adjust pattern applies at every level:
346+
347+
```
348+
Product → Intent → Pass → Unit → Bolt
349+
```
350+
351+
Each level contains the same loop. Passes make the cross-functional iteration explicit rather than ad-hoc.
352+
353+
### When to Use Passes
354+
355+
- **Single-pass (default):** Most dev work. Skip passes entirely -- just elaborate and construct.
356+
- **Multi-pass:** When an intent needs design exploration, product specs, or other discipline-specific iteration before (or after) dev work.
357+
358+
### Backward Flow
359+
360+
Backward arrows between passes are expected, not failures:
361+
362+
```
363+
Design Pass → Product Pass → Dev Pass
364+
↑ ↑ │
365+
│ └─ constraint ─┘
366+
└──── design gap ─┘
367+
```
368+
369+
When dev discovers a technical constraint that changes the product spec, the intent moves back to the product pass. When product finds a design gap, it moves back to the design pass. This is normal iteration.
370+
311371
## Next Steps
312372

313373
- **[Workflows](/docs/workflows/)** - Learn the four named workflows

0 commit comments

Comments
 (0)