diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 733314d..b80c693 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.9.0", + "version": "0.10.0", "author": { "name": "Evgenii Konev", "email": "ekonev@smartandpoint.com", diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index 57f5421..a12ddb0 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "projectstore", "displayName": "projectstore", - "version": "0.9.0", + "version": "0.10.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 d648259..bde81ae 100644 --- a/README.md +++ b/README.md @@ -158,14 +158,15 @@ 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.9) +## What's in the box (v0.10) -- **13 commands** โ€” `bind`, `scaffold`, `status`, `adr`, `epic`, `story`, `kanban`, `research`, `concept`, `meeting`, `runbook`, `search`, `review` +- **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. - **3 bundled agents** โ€” `projectstore-critic`, `code-planner`, `code-reviewer`. Opus, max-effort, read-only, independent fresh-context passes. See [Bundled agents](#bundled-agents). - **1 layout** โ€” `engineering` (`adr/`, `epics//stories/`, `research/`, `concepts/`, `meetings/`, `ops/`, `diagrams/`) - **9 templates** โ€” opinionated markdown with frontmatter (English + Russian variants) - **3 hooks** โ€” `SessionStart` (vault map + multi-session warning), `PreToolUse` (per-session activity log), `PreCompact` (survival packet) +- **1 status line** โ€” opt-in HUD line with the current epic & story, composed above an existing status line (e.g. oh-my-claudecode). See [Status line](#status-line). ## Philosophy @@ -201,11 +202,28 @@ For high-stakes artifacts (ADR / research / epic), `/projectstore:review ` `/projectstore:review` uses `projectstore-critic` as its default critic. Because plugin agents resolve at the **lowest** priority, a same-named agent in `.claude/agents/` (project) or `~/.claude/agents/` (user) transparently overrides the bundled one โ€” so your own tuned version always wins where you have one. +## Status line + +See the epic and story the agent is working on this session, right in Claude Code's status line โ€” composed **above** your existing HUD, not replacing it: + +![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: ` ยท ยท โއ ยท ๐Ÿ“š โ€ฆ`. + +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 status # current state + the base HUD it composes over +``` + ## Roadmap | Version | What ships | Status | |---|---|---| -| **v0.9** | Bundled review agents (`projectstore-critic`, `code-planner`, `code-reviewer`) | โœ… current | +| **v0.10** | Status line โ€” current epic & story in the HUD, composes with an existing status line | โœ… current | +| 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` | โœ… | | v0.6 | Session isolation (Claude `session_id`), safer rebind, PreCompact `systemMessage` | โœ… | diff --git a/commands/statusline.md b/commands/statusline.md new file mode 100644 index 0000000..90772db --- /dev/null +++ b/commands/statusline.md @@ -0,0 +1,55 @@ +--- +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. +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. + +`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). + +## 1. Parse `$ARGUMENTS` + +- `on` (or empty) โ€” install / refresh the status line. +- `off` โ€” remove it. +- `status` โ€” report current state; modify nothing. + +## 2. Resolve paths + +```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 "