diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index b80c693..02f225e 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -12,7 +12,7 @@ "name": "projectstore", "displayName": "projectstore", "description": "๐Ÿ“š Your project's knowledge base, written by your AI agent โ€” ADRs ยท epics ยท stories ยท runbooks ยท research. An Obsidian-friendly markdown vault, agent-maintained, you approve every write. Like Karpathy's LLM Wiki, but for engineering project artifacts.", - "version": "0.10.0", + "version": "0.11.0", "author": { "name": "Evgenii Konev", "email": "ekonev@smartandpoint.com", diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index a12ddb0..f3b8b83 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "projectstore", "displayName": "projectstore", - "version": "0.10.0", + "version": "0.11.0", "description": "Opinionated project-management paradigms (ADR / epics / stories / kanban / runbooks) for agentic development. Markdown-first, git-portable, human-readable.", "author": { "name": "Evgenii Konev @ SmartAndPoint", diff --git a/README.md b/README.md index bde81ae..58bf7df 100644 --- a/README.md +++ b/README.md @@ -158,7 +158,7 @@ PreCompact [...pre-compact.mjs] completed successfully: { The packet contains the vault path, the command list, the last 15 vault touches, and the newest in-flight ADR / epic / story / research. The post-compact agent picks up drafting from where the previous one left off, no manual rehydration. -## What's in the box (v0.10) +## What's in the box (v0.11) - **14 commands** โ€” `bind`, `scaffold`, `status`, `adr`, `epic`, `story`, `kanban`, `research`, `concept`, `meeting`, `runbook`, `search`, `review`, `statusline` - **3 passive skills** โ€” `decision-detector`, `story-completion`, `peer-reviewer`. They suggest commands; they never write directly. @@ -208,13 +208,13 @@ See the epic and story the agent is working on this session, right in Claude Cod ![projectstore status line: the ๐Ÿ“š epic โ€บ story line sitting above an existing oh-my-claudecode HUD](docs/images/statusline-hud.png) -**It does not overwrite your current status-line settings.** `statusLine` is a single slot and not plugin-declarable, so projectstore ships `scripts/statusline.mjs` plus a `/projectstore:statusline on|off` command that wires it into the project's `.claude/settings.local.json` (local scope, this-project-only, reverts cleanly; conventionally git-ignored). Rather than clobber your HUD, the script **composes**: it re-runs whatever base `statusLine` command you already have โ€” for example [oh-my-claudecode](https://github.com/Yeachan-Heo/oh-my-claudecode)'s HUD, read from `~/.claude/settings.json` โ€” prints its output verbatim, and adds the `๐Ÿ“š โ€บ ()` line above it (position via `projectstore.json` โ†’ `statusline.position`, default `above`). With no base command it renders a standalone line: ` ยท ยท โއ ยท ๐Ÿ“š โ€ฆ`. +**It does not overwrite your current status-line settings.** `statusLine` is a single slot and not plugin-declarable, so projectstore ships `scripts/statusline.mjs` plus a `/projectstore:statusline on|off` command. Enabling it just flips `statusline.enabled` in `.claude/projectstore.json`; the **SessionStart hook** then wires the project's `.claude/settings.local.json` (local scope, this-project-only, conventionally git-ignored) to the current plugin version's script โ€” re-derived on every session start, so it keeps working across plugin updates with no path to maintain by hand. Rather than clobber your HUD, the script **composes**: it re-runs whatever base `statusLine` command you already have โ€” for example [oh-my-claudecode](https://github.com/Yeachan-Heo/oh-my-claudecode)'s HUD, read from `~/.claude/settings.json` โ€” prints its output verbatim, and adds the `๐Ÿ“š โ€บ ()` line above it (position via `projectstore.json` โ†’ `statusline.position`, default `above`). With no base command it renders a standalone line: ` ยท ยท โއ ยท ๐Ÿ“š โ€ฆ`. So in a projectstore project you keep your full [oh-my-claudecode](https://github.com/Yeachan-Heo/oh-my-claudecode) context / rate-limit / session HUD **and** gain the current epic & story on top. The epic/story is derived from this session's `recent_activity` log โ€” it appears once you touch an epic or story, and stays transparent (base HUD only) otherwise. ``` -/projectstore:statusline on # wire it into this project (project-local) -/projectstore:statusline off # remove it +/projectstore:statusline on # enable (project-local); the hook wires + refreshes it +/projectstore:statusline off # disable it /projectstore:statusline status # current state + the base HUD it composes over ``` @@ -222,7 +222,8 @@ So in a projectstore project you keep your full [oh-my-claudecode](https://githu | Version | What ships | Status | |---|---|---| -| **v0.10** | Status line โ€” current epic & story in the HUD, composes with an existing status line | โœ… current | +| **v0.11** | Status line install simplified โ€” opt-in flag + self-healing SessionStart wiring | โœ… current | +| v0.10 | Status line โ€” current epic & story in the HUD, composes with an existing status line | โœ… | | v0.9 | Bundled review agents (`projectstore-critic`, `code-planner`, `code-reviewer`) | โœ… | | v0.8 | Russian (`ru`) templates | โœ… | | v0.7 | First-run welcome (SessionStart one-shot), auto-update follow-up in `/projectstore:bind` | โœ… | diff --git a/commands/statusline.md b/commands/statusline.md index 90772db..5911bfe 100644 --- a/commands/statusline.md +++ b/commands/statusline.md @@ -1,55 +1,42 @@ --- -description: Enable/disable the projectstore status line (current epic & story in the HUD). Composes above an existing status line (e.g. oh-my-claudecode) instead of replacing it. +description: Enable/disable the projectstore status line (current epic & story in the HUD). Flips a flag; the SessionStart hook does the wiring and keeps it current across plugin updates. argument-hint: "on | off | status" --- -You are configuring the projectstore status line for THIS project. It shows the epic & story the agent is touching this session, composed **above** any existing status line: `scripts/statusline.mjs` delegates to the base `statusLine` command in your `settings.json`, prints its output verbatim, and adds one `๐Ÿ“š โ€บ ` line. +You are toggling the projectstore status line for THIS project. When enabled, the **SessionStart hook** keeps the project's `.claude/settings.local.json` pointed at the current plugin version's `scripts/statusline.mjs` (it self-heals across plugin updates โ€” no machine/version-specific path to maintain by hand). The status line shows `๐Ÿ“š โ€บ ()` **composed above** any existing HUD (e.g. oh-my-claudecode), never replacing it. -`statusLine` is **not** plugin-declarable, so this writes a `statusLine` entry into the **project's `.claude/settings.local.json`** (local scope, highest precedence, conventionally git-ignored โ€” it overrides a global HUD ONLY in this project, and reverts cleanly). If the project tracks `.claude/settings.local.json` in git, tell the user (the baked absolute path is machine-specific and shouldn't be committed). +This command itself only flips a flag in `.claude/projectstore.json` โ€” it does **not** touch `settings.local.json`; the hook owns that file. -## 1. Parse `$ARGUMENTS` +## 1. Require a bound project -- `on` (or empty) โ€” install / refresh the status line. -- `off` โ€” remove it. -- `status` โ€” report current state; modify nothing. +Read `.claude/projectstore.json`. If missing โ†’ "No vault bound. Run `/projectstore:bind ` first." and stop. (The epic/story segment needs a vault.) -## 2. Resolve paths +## 2. Parse `$ARGUMENTS` -```bash -echo "SCRIPT=$CLAUDE_PLUGIN_ROOT/scripts/statusline.mjs" -echo "SETTINGS=${CLAUDE_PROJECT_DIR:-$PWD}/.claude/settings.local.json" -``` - -The `statusLine.command` MUST be a baked absolute path โ€” `${CLAUDE_PLUGIN_ROOT}` is not expanded in `statusLine.command` (unlike in hooks). Build the command as `node "