cc-os/openspec/changes/add-os-status-plugin/tasks.md

61 lines
3.2 KiB
Markdown

# Tasks: add-os-status-plugin
## 1. Plugin scaffold
- [x] 1.1 Create `plugins/os-status/` with `.claude-plugin/plugin.json` (name `os-status`, per
naming convention; no `name:` in any SKILL.md — no skills in this change anyway)
- [x] 1.2 Add `hooks/hooks.json` registering SessionStart → `session_start.py` via
`${CLAUDE_PLUGIN_ROOT}` (5s timeout, matching os-adr's pattern)
- [x] 1.3 Write shared modules in Sandi-Metz-lean Python matching os-vault's style:
`hooks/checks.py` (CheckResult, registry, the three checks), `hooks/state.py`
(`.cc-os/` snooze/suppress, git-project detection), thin `hooks/session_start.py`
entry point (run checks, aggregate, print)
## 2. Checks
- [x] 2.1 `subagent_model_env_override`: env var + `~/.claude/settings.json` `env` block scan;
runs outside git projects too
- [x] 2.2 `adr_system_present`: port logic from `plugins/os-adr/hooks/session_start.py`
PRESENT_NOTE wording byte-identical (copy, don't paraphrase); absent-path once-per-day
snooze honoring existing `.os-adr/suppress`
- [x] 2.3 `vault_hub_note_present`: config-first hub lookup (`.cc-os/config` hub slug), else
`project/<name>` facet-tag scan of the vault; missing → warn naming the corrective skill
## 3. Tests + invariants
- [x] 3.1 `tests/hook_test.py`-style model-free Python tests: contract (ok/note/warn routing,
failure isolation, exit-0 envelope), each check against fixture dirs/fake settings.json,
snooze/suppress state transitions, non-git-cwd behavior
- [x] 3.2 `invariants.md`: single-banner, note-not-suppressed, exit-0-always,
state-only-in-.cc-os, PRESENT_NOTE byte-identical to os-adr's tuned wording
## 4. os-adr cutover (atomic)
- [x] 4.1 Remove the SessionStart entry from `plugins/os-adr/hooks/hooks.json` (keep the
script file until archive; it is the wording source of record for 2.2)
- [x] 4.2 Confirm os-adr's tests still pass (hook_test.py may need pruning of
SessionStart-registration assertions)
## 5. Install + verify
- [x] 5.1 Add `os-status` to `~/.claude/plugins/.claude-plugin/marketplace.json`;
`claude plugin marketplace update local-plugins`; `claude plugin install
os-status@local-plugins`
- [x] 5.2 `bin/refresh-plugins`; `claude plugin details os-status@local-plugins` (hook
registered) and `claude plugin details os-adr@local-plugins` (SessionStart gone from
resolved cache)
- [x] 5.3 Fresh-session smoke test in cc-os (expect: ADR note once, hub-note ok once hub
exists, no env warn) and in a project without `docs/adr/` (expect: one banner)
- [x] 5.4 Regression canary: export `CLAUDE_CODE_SUBAGENT_MODEL=haiku` in a test shell,
fresh session, expect the override warn
## 6. Documentation
- [x] 6.1 ADR in `docs/memory-system/03-architecture-decisions.md`: status-check convention,
in-process code-location decision (Options A/B rejected with the perspective-review
reasoning), deferred items (context field, state-dir consolidation, Phase 2)
- [x] 6.2 Update cc-os `CLAUDE.md`: Implemented Components entry for os-status; note os-adr's
SessionStart behavior moved
- [x] 6.3 Mark WS3 plan doc (`docs/plans/ws3-status-convention-plugin.md`) as superseded by
this change (pointer, status line)