feat(ultraplan-local): M0 — profile foundation, no behaviour change

Introduces a profile-loader infrastructure for runtime-instantiable
ultraplan variants (depth × domain × goal axes). M0 ships only the
`default` profile, which mirrors the current hardcoded Phase 5/9 agent
set — so existing flows are unaffected.

What lands:
- profiles/default.yaml — schema v1, lists current 8 exploration agents
  + 2 review agents, captures today's adversarial regime
- scripts/profile-loader.mjs — null-deps Node loader with limited-subset
  YAML parser, listProfiles(), loadProfile(), validateProfile() that
  cross-checks every referenced agent exists in agents/
- scripts/profile-loader.test.mjs — 26 node:test cases (parser, validation,
  loader, integration with built-in default.yaml)
- commands/ultraplan-local.md — Phase 1 gains a "Resolve the profile"
  step (--profile flag → brief.recommended_profile → default fallback)
  and prints profile + source in the mode report. Phase 5/9 unchanged.
- README.md, CLAUDE.md, marketplace README — documentation of the M0
  foundation, the universal-brief design principle, and the M1/M2/M3
  milestones to come.

M1 (next) wires profile recommendation into ultrabrief Phase 4. M2
ships the additional built-in profiles (quick, bugfix, feature, refactor,
security-deep, research-heavy) and replaces the hardcoded Phase 5 agent
table with profile-driven selection. M3 adds user-extensible profiles.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Kjell Tore Guttormsen 2026-04-30 14:14:20 +02:00
commit 0b28f008ae
7 changed files with 989 additions and 1 deletions

View file

@ -266,11 +266,39 @@ Output:
| **Research-enriched** | `/ultraplan-local --project <dir> --research <brief>` | Add extra research briefs beyond what is in `research/` |
| **Foreground** | `/ultraplan-local --project <dir> --fg` | No-op alias (foreground is default since v2.4.0) |
| **Quick** | `/ultraplan-local --project <dir> --quick` | No agent swarm, lightweight scan only |
| **Profile** | `/ultraplan-local --project <dir> --profile <name>` | Explicit profile override (overrides `recommended_profile` in brief) |
| **Decompose** | `/ultraplan-local --decompose plan.md` | Split plan into headless session specs |
| **Export** | `/ultraplan-local --export pr plan.md` | PR description, issue comment, or clean markdown |
`--brief` or `--project` is **required**. `/ultraplan-local` with no brief exits with an error and a pointer to `/ultrabrief-local`.
#### Profiles (M0 — foundation)
A *profile* describes which exploration/review agents to spawn, which
catalog filter to apply, and which adversarial regime to use. Profiles
live in `profiles/*.yaml` and are loaded via
`scripts/profile-loader.mjs` (null-deps Node, limited-subset YAML
parser, validates that every referenced agent exists).
M0 ships only the `default` profile, which mirrors the current
hardcoded Phase 5/9 agent set — so existing flows are unaffected. M1
(coming next) lets `/ultrabrief-local` recommend a profile based on
brief content; M2 ships additional built-in profiles (`quick`,
`bugfix`, `feature`, `refactor`, `security-deep`, `research-heavy`)
and replaces the hardcoded Phase 5 agent table. M3 adds
user-extensible profiles in `.claude/ultraplan-profiles/`.
```bash
# Inspect available profiles
node plugins/ultraplan-local/scripts/profile-loader.mjs list
# Load a specific profile (JSON output)
node plugins/ultraplan-local/scripts/profile-loader.mjs load default
# Validate a profile YAML
node plugins/ultraplan-local/scripts/profile-loader.mjs validate path/to/profile.yaml
```
### What the plan contains
Every plan includes: