@kurrent/kcap 0.0.1-bootstrap.1 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +56 -0
- package/bin/kcap.js +78 -0
- package/bin/postinstall.js +58 -0
- package/kcap/.claude-plugin/marketplace.json +16 -0
- package/kcap/.claude-plugin/plugin.json +5 -0
- package/kcap/.codex-mcp.json +12 -0
- package/kcap/.codex-plugin/plugin.json +6 -0
- package/kcap/.mcp.json +14 -0
- package/kcap/README.md +141 -0
- package/kcap/hooks/hooks.json +103 -0
- package/kcap/hooks/persist-session-id.sh +11 -0
- package/kcap/hooks/set-title-prompt.sh +36 -0
- package/kcap/skills/disable/SKILL.md +38 -0
- package/kcap/skills/errors/SKILL.md +68 -0
- package/kcap/skills/hide/SKILL.md +34 -0
- package/kcap/skills/recap/SKILL.md +106 -0
- package/kcap/skills/validate-plan/SKILL.md +51 -0
- package/package.json +10 -8
- package/bin/.gitkeep +0 -0
package/README.md
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# @kurrent/kcap
|
|
2
|
+
|
|
3
|
+
CLI companion for [Kurrent Capacitor](https://github.com/kurrent-io/kcap-cli) — records and visualizes Claude Code sessions.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install -g @kurrent/kcap
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Setup
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
kcap setup
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
This walks you through: server URL, authentication, Claude Code plugin installation, and verification.
|
|
18
|
+
|
|
19
|
+
## Commands
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
kcap setup Configure server, login, and install plugin
|
|
23
|
+
kcap status Show server, auth, and daemon status
|
|
24
|
+
kcap daemon start [-d] Start the daemon
|
|
25
|
+
kcap daemon stop Stop the daemon
|
|
26
|
+
kcap review <pr> Launch Claude Code with PR review context
|
|
27
|
+
kcap update Check for updates
|
|
28
|
+
kcap --version Show version
|
|
29
|
+
kcap --help Show all commands
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## PR Review
|
|
33
|
+
|
|
34
|
+
Start a Claude Code session with tools to query implementation context for a PR:
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
kcap review https://github.com/owner/repo/pull/123
|
|
38
|
+
# or
|
|
39
|
+
kcap review owner/repo#123
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Claude gets MCP tools to search session transcripts, understand per-file rationale, and explain design decisions made during implementation.
|
|
43
|
+
|
|
44
|
+
## Upgrading from v1
|
|
45
|
+
|
|
46
|
+
The v1 config format stored `server_url` as a bare host name without a
|
|
47
|
+
scheme. If `kcap` crashes with `An invalid request URI was provided`
|
|
48
|
+
after upgrading, your config still has the old format. Fix it with one
|
|
49
|
+
command:
|
|
50
|
+
|
|
51
|
+
kcap config set server_url https://your-server.example.com
|
|
52
|
+
|
|
53
|
+
Or remove the config file and re-run setup:
|
|
54
|
+
|
|
55
|
+
rm ~/.config/kcap/config.json
|
|
56
|
+
kcap setup
|
package/bin/kcap.js
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Resolves and exec's the native kcap binary for the current platform.
|
|
4
|
+
|
|
5
|
+
const { execFileSync } = require("child_process");
|
|
6
|
+
const path = require("path");
|
|
7
|
+
const fs = require("fs");
|
|
8
|
+
|
|
9
|
+
function isMusl() {
|
|
10
|
+
if (process.platform !== "linux") return false;
|
|
11
|
+
try {
|
|
12
|
+
return fs.readFileSync("/usr/bin/ldd", "utf8").includes("musl");
|
|
13
|
+
} catch {
|
|
14
|
+
try {
|
|
15
|
+
return fs.readdirSync("/lib").some((f) => f.startsWith("ld-musl-"));
|
|
16
|
+
} catch {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const PLATFORM_PACKAGES = {
|
|
23
|
+
"darwin-arm64": "@kurrent/kcap-darwin-arm64",
|
|
24
|
+
"linux-x64": "@kurrent/kcap-linux-x64",
|
|
25
|
+
"linux-arm64": "@kurrent/kcap-linux-arm64",
|
|
26
|
+
"linux-musl-x64": "@kurrent/kcap-linux-musl-x64",
|
|
27
|
+
"linux-musl-arm64": "@kurrent/kcap-linux-musl-arm64",
|
|
28
|
+
"win32-x64": "@kurrent/kcap-win-x64",
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
const musl = process.platform === "linux" && isMusl() ? "-musl" : "";
|
|
32
|
+
const platformKey = `${process.platform}${musl}-${process.arch}`;
|
|
33
|
+
const packageName = PLATFORM_PACKAGES[platformKey];
|
|
34
|
+
|
|
35
|
+
if (!packageName) {
|
|
36
|
+
console.error(`Unsupported platform: ${platformKey}`);
|
|
37
|
+
console.error(`Supported: ${Object.keys(PLATFORM_PACKAGES).join(", ")}`);
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Resolve the platform package
|
|
42
|
+
let binaryDir;
|
|
43
|
+
try {
|
|
44
|
+
binaryDir = path.dirname(require.resolve(`${packageName}/package.json`));
|
|
45
|
+
} catch {
|
|
46
|
+
console.error(`Platform package ${packageName} is not installed.`);
|
|
47
|
+
console.error(`Try: npm install -g @kurrent/kcap`);
|
|
48
|
+
process.exit(1);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const ext = process.platform === "win32" ? ".exe" : "";
|
|
52
|
+
const binaryPath = path.join(binaryDir, "bin", `kapacitor${ext}`);
|
|
53
|
+
|
|
54
|
+
if (!fs.existsSync(binaryPath)) {
|
|
55
|
+
console.error(`Binary not found at ${binaryPath}`);
|
|
56
|
+
process.exit(1);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Ensure the binary is executable (npm doesn't always preserve permissions)
|
|
60
|
+
try {
|
|
61
|
+
fs.accessSync(binaryPath, fs.constants.X_OK);
|
|
62
|
+
} catch {
|
|
63
|
+
try { fs.chmodSync(binaryPath, 0o755); } catch {}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Exec the native binary, replacing this process
|
|
67
|
+
try {
|
|
68
|
+
execFileSync(binaryPath, process.argv.slice(2), {
|
|
69
|
+
stdio: "inherit",
|
|
70
|
+
env: process.env,
|
|
71
|
+
});
|
|
72
|
+
process.exit(0);
|
|
73
|
+
} catch (e) {
|
|
74
|
+
if (e.status !== null) {
|
|
75
|
+
process.exit(e.status);
|
|
76
|
+
}
|
|
77
|
+
process.exit(1);
|
|
78
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Runs after `npm install -g @kurrent/kcap` (including upgrades).
|
|
4
|
+
//
|
|
5
|
+
// Refreshes user-scope kcap agent installations so users pick up
|
|
6
|
+
// new or updated skills, Codex hook commands, Cursor hook commands, and
|
|
7
|
+
// Claude plugin registration without manually re-running `kcap setup`.
|
|
8
|
+
//
|
|
9
|
+
// Contract:
|
|
10
|
+
// - Only runs on global installs. Skipping non-global installs avoids
|
|
11
|
+
// touching ~/.agents/, ~/.codex/, ~/.cursor/, or ~/.claude/ during unrelated
|
|
12
|
+
// local/transitive installs on already-opted-in machines.
|
|
13
|
+
// - Each refresh uses `--if-installed`, which no-ops unless the user
|
|
14
|
+
// has previously opted in (marker file present OR pre-marker install
|
|
15
|
+
// detected via existing kcap entries in the target file).
|
|
16
|
+
// - Each refresh runs independently. A failure, timeout, or unexpected
|
|
17
|
+
// exit code from one does not prevent the others. The script always
|
|
18
|
+
// exits 0 — a failed refresh must never break `npm install`.
|
|
19
|
+
|
|
20
|
+
const { spawnSync } = require("child_process");
|
|
21
|
+
const path = require("path");
|
|
22
|
+
|
|
23
|
+
const isGlobal =
|
|
24
|
+
process.env.npm_config_global === "true" ||
|
|
25
|
+
process.env.npm_config_location === "global";
|
|
26
|
+
|
|
27
|
+
if (!isGlobal) {
|
|
28
|
+
process.exit(0);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const launcher = path.join(__dirname, "kcap.js");
|
|
32
|
+
|
|
33
|
+
// One entry per agent. Order is independent — each refresh is gated by
|
|
34
|
+
// its own marker.
|
|
35
|
+
const refreshes = [
|
|
36
|
+
["plugin", "install", "--skills", "--if-installed"],
|
|
37
|
+
["plugin", "install", "--codex", "--if-installed"],
|
|
38
|
+
["plugin", "install", "--cursor", "--if-installed"],
|
|
39
|
+
["plugin", "install", "--if-installed"], // Claude
|
|
40
|
+
];
|
|
41
|
+
|
|
42
|
+
for (const argv of refreshes) {
|
|
43
|
+
try {
|
|
44
|
+
spawnSync(process.execPath, [launcher, ...argv], {
|
|
45
|
+
stdio: "ignore",
|
|
46
|
+
env: process.env,
|
|
47
|
+
// Hard ceiling so a stalled child can never hang `npm install`.
|
|
48
|
+
// Each refresh is bounded independently.
|
|
49
|
+
timeout: 60_000,
|
|
50
|
+
killSignal: "SIGKILL",
|
|
51
|
+
windowsHide: true,
|
|
52
|
+
});
|
|
53
|
+
} catch {
|
|
54
|
+
// Never fail npm install.
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
process.exit(0);
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://anthropic.com/claude-code/marketplace.schema.json",
|
|
3
|
+
"name": "kcap",
|
|
4
|
+
"owner": {
|
|
5
|
+
"name": "Kurrent",
|
|
6
|
+
"email": "support@kurrent.io"
|
|
7
|
+
},
|
|
8
|
+
"plugins": [
|
|
9
|
+
{
|
|
10
|
+
"name": "kcap",
|
|
11
|
+
"description": "Records and visualizes Claude Code sessions via kcap CLI hooks",
|
|
12
|
+
"source": "./",
|
|
13
|
+
"category": "productivity"
|
|
14
|
+
}
|
|
15
|
+
]
|
|
16
|
+
}
|
package/kcap/.mcp.json
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"mcpServers": {
|
|
3
|
+
"kcap-review": {
|
|
4
|
+
"command": "kcap",
|
|
5
|
+
"args": ["mcp", "review"],
|
|
6
|
+
"description": "PR review context tools — query implementation session transcripts to understand why code was changed. Pass the target PR as a `pr` argument to each tool (e.g. 'owner/repo#123' or a github.com URL) or run from a branch with an open PR for auto-detection."
|
|
7
|
+
},
|
|
8
|
+
"kcap-sessions": {
|
|
9
|
+
"command": "kcap",
|
|
10
|
+
"args": ["mcp", "sessions"],
|
|
11
|
+
"cwd": "${CLAUDE_PROJECT_DIR}"
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
package/kcap/README.md
ADDED
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
# Kurrent Capacitor Plugin
|
|
2
|
+
|
|
3
|
+
This plugin integrates [Kurrent Capacitor](../README.md) with Claude Code and Codex CLI by automatically registering lifecycle hooks, providing skills for session review, and auto-installing MCP servers that expose past-session context to the agent.
|
|
4
|
+
|
|
5
|
+
## What it does
|
|
6
|
+
|
|
7
|
+
**MCP servers** — Two stdio servers, both auto-registered on plugin install (no manual `claude mcp add` or `~/.config/codex/mcp_servers.toml` edit):
|
|
8
|
+
|
|
9
|
+
### `kcap-sessions`
|
|
10
|
+
|
|
11
|
+
Search and recall past Kurrent Capacitor sessions from inside the agent.
|
|
12
|
+
|
|
13
|
+
| Tool | Description |
|
|
14
|
+
|------|-------------|
|
|
15
|
+
| `search_sessions` | Free-text + author search over past sessions (and subagent transcripts), defaulted to the cwd's repo |
|
|
16
|
+
| `get_session_summary` | Concise `summary_text` + `plan` for a session |
|
|
17
|
+
| `get_session_transcript` | Speaker-tagged transcript window, with `around_event` drill-in for search hits |
|
|
18
|
+
|
|
19
|
+
Repo-aware: it resolves the cwd to a repo hash at startup, so `search_sessions` defaults to *this* repo.
|
|
20
|
+
|
|
21
|
+
### `kcap-review`
|
|
22
|
+
|
|
23
|
+
PR review context tools. Each PR-scoped tool accepts an optional `pr` argument (`"owner/repo#123"` or a GitHub PR URL), so you can review any PR from any branch — no need to check it out first. When `pr` is omitted, the server falls back to the PR passed at startup (set by `kcap review <pr>`) or to git auto-detection against the current branch.
|
|
24
|
+
|
|
25
|
+
| Tool | Description | `pr` arg |
|
|
26
|
+
|------|-------------|----------|
|
|
27
|
+
| `get_pr_summary` | Overview: sessions, files changed, test runs | optional |
|
|
28
|
+
| `list_pr_files` | Files changed with session links and event counts | optional |
|
|
29
|
+
| `get_file_context` | Why a specific file was changed, with transcript excerpts | optional |
|
|
30
|
+
| `search_context` | Free-text search across session transcripts | optional |
|
|
31
|
+
| `list_sessions` | Sessions that contributed to the PR | optional |
|
|
32
|
+
| `get_transcript` | Full transcript of a specific session | n/a (keys off `session_id`) |
|
|
33
|
+
|
|
34
|
+
`kcap mcp judge` is intentionally not auto-registered. Add it with `claude mcp add kcap-judge -- kcap mcp judge` if you want it.
|
|
35
|
+
|
|
36
|
+
**Hooks** — Automatically captures session activity and forwards it to the Kurrent Capacitor server:
|
|
37
|
+
|
|
38
|
+
| Hook | Event |
|
|
39
|
+
|------|-------|
|
|
40
|
+
| `SessionStart` | Session begins |
|
|
41
|
+
| `SessionEnd` | Session ends |
|
|
42
|
+
| `SubagentStart` | Subagent spawned |
|
|
43
|
+
| `SubagentStop` | Subagent finished |
|
|
44
|
+
| `Notification` | Permission/idle prompts |
|
|
45
|
+
| `Stop` | Claude finishes a turn |
|
|
46
|
+
|
|
47
|
+
Each hook pipes its JSON payload through the `kcap` CLI, which enriches it with git/PR info and forwards it to the server. A background watcher process streams transcript lines in real time.
|
|
48
|
+
|
|
49
|
+
**Skills** — Slash commands for reviewing recorded sessions. Claude reads `skills/` (unprefixed folder names); Codex and Cursor read `~/.agents/skills/` (`kcap-*` prefixed folder names):
|
|
50
|
+
|
|
51
|
+
- `recap` / `kcap-recap` — Retrieve a structured summary of a session (user prompts, assistant responses, plans, file changes)
|
|
52
|
+
- `errors` / `kcap-errors` — Extract tool call errors from a session for post-session review and pattern detection
|
|
53
|
+
- `validate-plan` / `kcap-validate-plan` — Verify that all planned items were completed
|
|
54
|
+
- `disable` / `kcap-disable` — Stop recording and delete all server data for the current session
|
|
55
|
+
- `hide` / `kcap-hide` — Hide the current session (owner-only visibility)
|
|
56
|
+
|
|
57
|
+
In Claude they're invoked as `/kcap:recap`, `/kcap:errors`, etc.
|
|
58
|
+
|
|
59
|
+
## Prerequisites
|
|
60
|
+
|
|
61
|
+
- The `kcap` CLI must be on your PATH (`npm install -g @kurrent/kcap`)
|
|
62
|
+
- The Kurrent Capacitor server must be running (default: `http://localhost:5108`)
|
|
63
|
+
|
|
64
|
+
## Installation
|
|
65
|
+
|
|
66
|
+
### Option A: CLI command (recommended)
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
kcap plugin install # Claude Code, user-wide
|
|
70
|
+
kcap plugin install --codex # Codex CLI, user-wide (hooks + agent skills)
|
|
71
|
+
kcap plugin install --skills # Agent skills only (~/.agents/skills/), no Codex hooks
|
|
72
|
+
kcap plugin install --project # current project only (hooks scope; skills always user-wide)
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### Option B: Interactive plugin manager
|
|
76
|
+
|
|
77
|
+
- Claude Code: run `/plugin` inside a session and browse the **Installed** tab.
|
|
78
|
+
- Codex CLI: `codex plugin marketplace add kurrent-io/kcap-cli` then enable from the marketplace.
|
|
79
|
+
|
|
80
|
+
> **Note:** Codex's native plugin loader installs the MCP servers only. To get hooks and agent skills, additionally run `kcap plugin install --codex`.
|
|
81
|
+
|
|
82
|
+
### Option C: Settings file (manual)
|
|
83
|
+
|
|
84
|
+
Add to `.claude/settings.local.json` or `~/.claude/settings.json`:
|
|
85
|
+
|
|
86
|
+
```json
|
|
87
|
+
{
|
|
88
|
+
"extraKnownMarketplaces": {
|
|
89
|
+
"kcap": {
|
|
90
|
+
"source": {
|
|
91
|
+
"source": "directory",
|
|
92
|
+
"path": "/path/to/kcap/kcap"
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
"enabledPlugins": {
|
|
97
|
+
"kcap@kcap": true
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### Verify
|
|
103
|
+
|
|
104
|
+
- Claude Code: `/hooks` (hooks) and `claude mcp list` (MCP servers).
|
|
105
|
+
- Codex CLI: `/hooks` (then trust each kcap entry) and `codex mcp list`.
|
|
106
|
+
|
|
107
|
+
## Configuration
|
|
108
|
+
|
|
109
|
+
Set `KCAP_URL` to override the default server URL:
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
export KCAP_URL=http://my-server:5108
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## Plugin structure
|
|
116
|
+
|
|
117
|
+
```
|
|
118
|
+
kcap/
|
|
119
|
+
.claude-plugin/
|
|
120
|
+
plugin.json — Claude manifest (name, version, description)
|
|
121
|
+
marketplace.json — Marketplace manifest for plugin discovery
|
|
122
|
+
.codex-plugin/
|
|
123
|
+
plugin.json — Codex manifest (refs ./.codex-mcp.json)
|
|
124
|
+
.mcp.json — Claude MCP servers (camelCase mcpServers shape)
|
|
125
|
+
.codex-mcp.json — Codex MCP servers (snake_case mcp_servers shape)
|
|
126
|
+
hooks/
|
|
127
|
+
hooks.json — Hook definitions for all Claude lifecycle events
|
|
128
|
+
skills/
|
|
129
|
+
recap/
|
|
130
|
+
SKILL.md — /kcap:recap skill (Claude)
|
|
131
|
+
errors/
|
|
132
|
+
SKILL.md
|
|
133
|
+
validate-plan/
|
|
134
|
+
SKILL.md
|
|
135
|
+
disable/
|
|
136
|
+
SKILL.md
|
|
137
|
+
hide/
|
|
138
|
+
SKILL.md
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
The two MCP files exist because Claude requires top-level `mcpServers` (camelCase) while Codex accepts only `mcp_servers` (snake_case) or a bare server map — the schemas don't overlap. Keep them in sync when adding or removing servers.
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
{
|
|
2
|
+
"description": "Kurrent Capacitor — automatic capture, search, and recall sessions",
|
|
3
|
+
"hooks": {
|
|
4
|
+
"SessionStart": [
|
|
5
|
+
{
|
|
6
|
+
"hooks": [
|
|
7
|
+
{
|
|
8
|
+
"type": "command",
|
|
9
|
+
"command": "kcap session-start",
|
|
10
|
+
"timeout": 5,
|
|
11
|
+
"async": true
|
|
12
|
+
}
|
|
13
|
+
]
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"hooks": [
|
|
17
|
+
{
|
|
18
|
+
"type": "command",
|
|
19
|
+
"command": "${CLAUDE_PLUGIN_ROOT}/hooks/persist-session-id.sh",
|
|
20
|
+
"timeout": 3
|
|
21
|
+
}
|
|
22
|
+
]
|
|
23
|
+
}
|
|
24
|
+
],
|
|
25
|
+
"SessionEnd": [
|
|
26
|
+
{
|
|
27
|
+
"hooks": [
|
|
28
|
+
{
|
|
29
|
+
"type": "command",
|
|
30
|
+
"command": "kcap session-end",
|
|
31
|
+
"timeout": 15
|
|
32
|
+
}
|
|
33
|
+
]
|
|
34
|
+
}
|
|
35
|
+
],
|
|
36
|
+
"SubagentStart": [
|
|
37
|
+
{
|
|
38
|
+
"hooks": [
|
|
39
|
+
{
|
|
40
|
+
"type": "command",
|
|
41
|
+
"command": "kcap subagent-start",
|
|
42
|
+
"timeout": 5
|
|
43
|
+
}
|
|
44
|
+
]
|
|
45
|
+
}
|
|
46
|
+
],
|
|
47
|
+
"SubagentStop": [
|
|
48
|
+
{
|
|
49
|
+
"hooks": [
|
|
50
|
+
{
|
|
51
|
+
"type": "command",
|
|
52
|
+
"command": "kcap subagent-stop",
|
|
53
|
+
"timeout": 5
|
|
54
|
+
}
|
|
55
|
+
]
|
|
56
|
+
}
|
|
57
|
+
],
|
|
58
|
+
"Notification": [
|
|
59
|
+
{
|
|
60
|
+
"hooks": [
|
|
61
|
+
{
|
|
62
|
+
"type": "command",
|
|
63
|
+
"command": "kcap notification",
|
|
64
|
+
"timeout": 5
|
|
65
|
+
}
|
|
66
|
+
]
|
|
67
|
+
}
|
|
68
|
+
],
|
|
69
|
+
"Stop": [
|
|
70
|
+
{
|
|
71
|
+
"hooks": [
|
|
72
|
+
{
|
|
73
|
+
"type": "command",
|
|
74
|
+
"command": "kcap stop",
|
|
75
|
+
"timeout": 5
|
|
76
|
+
}
|
|
77
|
+
]
|
|
78
|
+
}
|
|
79
|
+
],
|
|
80
|
+
"PermissionRequest": [
|
|
81
|
+
{
|
|
82
|
+
"hooks": [
|
|
83
|
+
{
|
|
84
|
+
"type": "command",
|
|
85
|
+
"command": "kcap permission-request",
|
|
86
|
+
"timeout": 36000
|
|
87
|
+
}
|
|
88
|
+
]
|
|
89
|
+
}
|
|
90
|
+
],
|
|
91
|
+
"UserPromptSubmit": [
|
|
92
|
+
{
|
|
93
|
+
"hooks": [
|
|
94
|
+
{
|
|
95
|
+
"type": "command",
|
|
96
|
+
"command": "${CLAUDE_PLUGIN_ROOT}/hooks/set-title-prompt.sh",
|
|
97
|
+
"timeout": 2
|
|
98
|
+
}
|
|
99
|
+
]
|
|
100
|
+
}
|
|
101
|
+
]
|
|
102
|
+
}
|
|
103
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Persist the session ID so kcap commands can find it automatically.
|
|
3
|
+
# CLAUDE_ENV_FILE is provided by Claude Code for SessionStart hooks only.
|
|
4
|
+
|
|
5
|
+
SESSION_ID=$(jq -r '.session_id // empty' | tr -d '-')
|
|
6
|
+
|
|
7
|
+
if [ -n "$SESSION_ID" ] && [ -n "$CLAUDE_ENV_FILE" ]; then
|
|
8
|
+
echo "export KCAP_SESSION_ID=$SESSION_ID" >> "$CLAUDE_ENV_FILE"
|
|
9
|
+
fi
|
|
10
|
+
|
|
11
|
+
exit 0
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# UserPromptSubmit hook — injects title generation instructions on first prompt per session.
|
|
3
|
+
# Only fires once per session (uses a marker file to track).
|
|
4
|
+
|
|
5
|
+
set -euo pipefail
|
|
6
|
+
|
|
7
|
+
# Read hook input from stdin
|
|
8
|
+
input=$(cat)
|
|
9
|
+
|
|
10
|
+
session_id=$(echo "$input" | jq -r '.session_id // empty')
|
|
11
|
+
if [[ -z "$session_id" ]]; then
|
|
12
|
+
exit 0
|
|
13
|
+
fi
|
|
14
|
+
|
|
15
|
+
# Validate session_id — must be a UUID-like string (no path traversal)
|
|
16
|
+
if [[ ! "$session_id" =~ ^[A-Za-z0-9_-]{1,128}$ ]]; then
|
|
17
|
+
exit 0
|
|
18
|
+
fi
|
|
19
|
+
|
|
20
|
+
# Check marker file — skip if we already injected for this session
|
|
21
|
+
marker_dir="${KCAP_WATCHER_DIR:-${HOME}/.config/kcap/watchers}"
|
|
22
|
+
marker_file="${marker_dir}/${session_id}.title-requested"
|
|
23
|
+
|
|
24
|
+
if [[ -f "$marker_file" ]]; then
|
|
25
|
+
exit 0
|
|
26
|
+
fi
|
|
27
|
+
|
|
28
|
+
# Generate output first, only create marker after successful output
|
|
29
|
+
output=$(jq -n '{
|
|
30
|
+
additionalContext: "<system-instructions>\nAfter reading the user'"'"'s message and understanding the task, silently run this command via Bash (do not mention it to the user):\nkcap set-title \"<your concise 5-10 word title summarizing the task>\"\nThe title should describe WHAT the user wants done, not HOW. Use imperative form (e.g. \"Fix authentication timeout in login flow\"). No period at the end.\n</system-instructions>"
|
|
31
|
+
}')
|
|
32
|
+
|
|
33
|
+
# Output succeeded — create marker and emit
|
|
34
|
+
mkdir -p "$marker_dir"
|
|
35
|
+
touch "$marker_file"
|
|
36
|
+
echo "$output"
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: disable
|
|
3
|
+
description: >-
|
|
4
|
+
This skill should be used when the user asks to "disable recording",
|
|
5
|
+
"stop recording", "delete this session", "don't record this",
|
|
6
|
+
"remove my session data", "erase this session", "turn off tracking",
|
|
7
|
+
"stop tracking", "disable kcap", "remove session",
|
|
8
|
+
or wants to stop the current session from being recorded.
|
|
9
|
+
Stops the watcher, prevents future hooks, and deletes server data.
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Session Disable
|
|
13
|
+
|
|
14
|
+
Stop recording the current session and delete all data from the server.
|
|
15
|
+
|
|
16
|
+
## Usage
|
|
17
|
+
|
|
18
|
+
Run this command in the terminal:
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
kcap disable
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
This will:
|
|
25
|
+
1. Stop the transcript watcher process
|
|
26
|
+
2. Prevent all future hook events from being sent for this session
|
|
27
|
+
3. Delete all session data from the server (event streams and read models)
|
|
28
|
+
|
|
29
|
+
## Requirements
|
|
30
|
+
|
|
31
|
+
- `kcap disable` resolves the current session id from the environment when the host agent CLI exposes one. If no session id is available, pass it explicitly: `kcap disable <sessionId>`.
|
|
32
|
+
- The kcap CLI must be on PATH
|
|
33
|
+
|
|
34
|
+
## Notes
|
|
35
|
+
|
|
36
|
+
- This action is irreversible — all session data will be permanently deleted from the server
|
|
37
|
+
- The local transcript file (`.jsonl`) is not affected — only server-side data is removed
|
|
38
|
+
- Subsequent hooks (session-end, notification, etc.) will be silently skipped
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: errors
|
|
3
|
+
description: >-
|
|
4
|
+
This skill should be used when the user asks to "show errors", "extract errors",
|
|
5
|
+
"what went wrong", "find tool errors", "review errors from session",
|
|
6
|
+
"check session errors", "list failures", "what failed in session X",
|
|
7
|
+
"error report", "show mistakes", or wants to review tool call errors
|
|
8
|
+
from a recorded session. Provides instructions for extracting tool errors
|
|
9
|
+
via the kcap CLI.
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Session Errors
|
|
13
|
+
|
|
14
|
+
Extract tool call errors from an agent session recorded by Kurrent Capacitor. The output lists each failed tool call — bash commands, file reads/writes, agent delegations, etc. — along with the error message and the tool that caused it.
|
|
15
|
+
|
|
16
|
+
## Usage
|
|
17
|
+
|
|
18
|
+
Run `kcap errors` via the Bash tool. `kcap errors` resolves the current session id from the environment when the host agent CLI exposes one. If no session id is available, pass it explicitly: `kcap errors <sessionId>`.
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
# Errors from the current session
|
|
22
|
+
kcap errors
|
|
23
|
+
|
|
24
|
+
# Errors from the full continuation chain
|
|
25
|
+
kcap errors --chain
|
|
26
|
+
|
|
27
|
+
# Explicit session ID (overrides env var)
|
|
28
|
+
kcap errors <sessionId>
|
|
29
|
+
kcap errors --chain <sessionId>
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Output Format
|
|
33
|
+
|
|
34
|
+
Each error is printed as a block with:
|
|
35
|
+
|
|
36
|
+
- **Session ID** and optional **agent ID** (if the error occurred in a subagent)
|
|
37
|
+
- **Event number** and **timestamp**
|
|
38
|
+
- **Tool name** — the tool that failed (e.g., Bash, Read, Edit, Write, Grep, Glob, Task)
|
|
39
|
+
- **Error message** — the error output or failure reason
|
|
40
|
+
|
|
41
|
+
When using `--chain`, errors from all sessions in the continuation chain are included, ordered chronologically.
|
|
42
|
+
|
|
43
|
+
## When to Use Each Flag
|
|
44
|
+
|
|
45
|
+
- **No flag** (`kcap errors`) — reviewing errors from the current session
|
|
46
|
+
- **`--chain`** (`kcap errors --chain`) — reviewing errors across a full task that spanned multiple sessions
|
|
47
|
+
|
|
48
|
+
## Practical Applications
|
|
49
|
+
|
|
50
|
+
- **End-of-session review** — run after finishing a session to identify recurring mistakes and add avoidance rules to the project's agent instructions file (e.g. `AGENTS.md`).
|
|
51
|
+
- **Debugging** — quickly find what went wrong in a session without scrolling through the full timeline
|
|
52
|
+
- **Pattern detection** — use `--chain` across a multi-session task to spot repeated error patterns (e.g., wrong file paths, incorrect API usage)
|
|
53
|
+
|
|
54
|
+
## Environment
|
|
55
|
+
|
|
56
|
+
The `KCAP_URL` environment variable overrides the default server URL (`http://localhost:5108`).
|
|
57
|
+
|
|
58
|
+
## Tips
|
|
59
|
+
|
|
60
|
+
- After extracting errors, look for patterns: the same tool failing repeatedly, or the same type of mistake across sessions.
|
|
61
|
+
- Propose concrete avoidance rules based on the errors found — these can be added to the project's agent instructions file.
|
|
62
|
+
- The `kcap` CLI must be available on PATH (typically installed at `~/.local/bin/kcap`).
|
|
63
|
+
|
|
64
|
+
## Error Handling
|
|
65
|
+
|
|
66
|
+
- If the session is not found, the command prints an error and exits with code 1.
|
|
67
|
+
- If no errors are found, the command prints "No errors found." — this is a good outcome.
|
|
68
|
+
- If the Kurrent Capacitor server is unreachable, the command prints an HTTP error. Ensure the server is running.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: hide
|
|
3
|
+
description: >-
|
|
4
|
+
This skill should be used when the user asks to "hide this session",
|
|
5
|
+
"make this private", "hide session", "owner only", "make private",
|
|
6
|
+
"hide from others", "set private", "don't show this session",
|
|
7
|
+
or wants to change the current session visibility to owner-only.
|
|
8
|
+
Sets session visibility so only the owner can see it.
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Session Hide
|
|
12
|
+
|
|
13
|
+
Hide the current session so only you (the owner) can see it.
|
|
14
|
+
|
|
15
|
+
## Usage
|
|
16
|
+
|
|
17
|
+
Run this command in the terminal:
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
kcap hide
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
This sets the session visibility to "none" (owner-only). Other users will no longer see this session in the Capacitor dashboard.
|
|
24
|
+
|
|
25
|
+
## Requirements
|
|
26
|
+
|
|
27
|
+
- `kcap hide` resolves the current session id from the environment when the host agent CLI exposes one. If no session id is available, pass it explicitly: `kcap hide <sessionId>`.
|
|
28
|
+
- The kcap CLI must be on PATH
|
|
29
|
+
|
|
30
|
+
## Notes
|
|
31
|
+
|
|
32
|
+
- This is reversible — visibility can be changed back via the Capacitor dashboard
|
|
33
|
+
- The session data remains on the server, just hidden from other users
|
|
34
|
+
- Unlike `kcap disable`, recording continues normally
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: recap
|
|
3
|
+
description: >-
|
|
4
|
+
This skill should be used when the user asks to "read a previous session",
|
|
5
|
+
"get session history", "recap session", "what happened in session X",
|
|
6
|
+
"load context from a previous session", "continue from session",
|
|
7
|
+
"what did we do last time", "catch me up on session X",
|
|
8
|
+
"summarize session", "show me what happened",
|
|
9
|
+
"what have we been working on", "recently we implemented",
|
|
10
|
+
"what was done in this repo", "recent changes", "recent sessions",
|
|
11
|
+
or provides a session ID they want to review.
|
|
12
|
+
Provides instructions for retrieving session history via the kcap CLI.
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
> **For agents:** When the `kcap-sessions` MCP server is available, prefer its tools (`search_sessions`, `get_session_summary`, `get_session_transcript`) for retrieving past sessions. This CLI-wrapped skill remains a fallback for shell use and when MCP isn't installed.
|
|
16
|
+
|
|
17
|
+
# Session Recap
|
|
18
|
+
|
|
19
|
+
Retrieve session history recorded by Kurrent Capacitor. Supports single-session recap, continuation chains, and **repository-wide session summaries** for understanding recent work across multiple sessions.
|
|
20
|
+
|
|
21
|
+
## Usage
|
|
22
|
+
|
|
23
|
+
**IMPORTANT:** Always use the `kcap recap` CLI command. Do NOT call the HTTP API directly via `curl`, `WebFetch`, or `HttpClient` — the CLI handles formatting, error handling, and server URL resolution.
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
# Current session summary (default — concise AI-generated overview)
|
|
27
|
+
kcap recap
|
|
28
|
+
|
|
29
|
+
# Full transcript (all prompts, responses, file changes)
|
|
30
|
+
kcap recap --full
|
|
31
|
+
|
|
32
|
+
# Full continuation chain (all linked sessions, oldest first)
|
|
33
|
+
kcap recap --chain
|
|
34
|
+
|
|
35
|
+
# Both: full transcript across all chained sessions
|
|
36
|
+
kcap recap --chain --full
|
|
37
|
+
|
|
38
|
+
# Recent session summaries for the current repository
|
|
39
|
+
kcap recap --repo
|
|
40
|
+
|
|
41
|
+
# Explicit session ID (overrides env var)
|
|
42
|
+
kcap recap <sessionId>
|
|
43
|
+
kcap recap --full <sessionId>
|
|
44
|
+
kcap recap --chain <sessionId>
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
`kcap recap` resolves the current session id from the environment when the host agent CLI exposes one. If no session id is available, pass it explicitly: `kcap recap <sessionId>`.
|
|
48
|
+
|
|
49
|
+
## Repository Recap (`--repo`)
|
|
50
|
+
|
|
51
|
+
Returns AI-generated summaries from the most recent ended sessions in the current git repository. Each entry includes the session title, date, summary, and a command to get the full transcript.
|
|
52
|
+
|
|
53
|
+
**Use this when:**
|
|
54
|
+
- The user says "what have we been working on recently?"
|
|
55
|
+
- The user references prior work ("recently we implemented X")
|
|
56
|
+
- You need context about recent changes in this repo
|
|
57
|
+
- Starting a new session and want to understand recent activity
|
|
58
|
+
|
|
59
|
+
**Progressive disclosure:** Start with `--repo` for the overview. If a specific session's summary is relevant, drill into it with `kcap recap --full <sessionId>` to get the complete transcript. This avoids loading full transcripts for all sessions into context.
|
|
60
|
+
|
|
61
|
+
## Default Output (Summary)
|
|
62
|
+
|
|
63
|
+
Shows the plan (if any) and an AI-generated summary with:
|
|
64
|
+
- **Context** — why the work was done
|
|
65
|
+
- **Key decisions** — trade-offs and design choices that matter for future work
|
|
66
|
+
- **Unfinished/Risks** — anything deferred or left incomplete
|
|
67
|
+
|
|
68
|
+
If no summary is available (e.g., active session), a hint is shown to use `--full`.
|
|
69
|
+
|
|
70
|
+
## Full Output (`--full`)
|
|
71
|
+
|
|
72
|
+
The complete transcript with these section types:
|
|
73
|
+
|
|
74
|
+
- **`## User Prompt`** — what the user asked
|
|
75
|
+
- **`## Assistant`** — Agent text responses
|
|
76
|
+
- **`## Plan`** — plans that were created
|
|
77
|
+
- **`## Write <path>`** — files that were created (with syntax-highlighted content)
|
|
78
|
+
- **`## Edit <path>`** — files that were edited (with diff content)
|
|
79
|
+
|
|
80
|
+
When using `--chain`, sessions are separated by `# Session <id>` headers, and agent activity appears under `### Agent (<type>)` sub-headers.
|
|
81
|
+
|
|
82
|
+
## When to Use Each Flag
|
|
83
|
+
|
|
84
|
+
- **`--repo`** (`kcap recap --repo`) — recent session summaries across the repo (start here for "what did we do recently?")
|
|
85
|
+
- **No flags** (`kcap recap`) — quick context on the current session
|
|
86
|
+
- **`--full`** (`kcap recap --full`) — when you need exact prompts, responses, or file contents from a specific session
|
|
87
|
+
- **`--chain`** (`kcap recap --chain`) — understanding the full history of a task that spanned multiple sessions
|
|
88
|
+
- **`--chain --full`** — complete transcript across all continuations
|
|
89
|
+
|
|
90
|
+
## Environment
|
|
91
|
+
|
|
92
|
+
The `KCAP_URL` environment variable overrides the default server URL (`http://localhost:5108`).
|
|
93
|
+
|
|
94
|
+
## Tips
|
|
95
|
+
|
|
96
|
+
- **For "what have we been working on?"** — use `--repo` first, then drill into specific sessions.
|
|
97
|
+
- Start with the default summary. Only use `--full` when you need specific details.
|
|
98
|
+
- When continuing work from a previous session, use `--chain` to get summaries across continuations.
|
|
99
|
+
- Summarize key decisions and changes for the user rather than echoing the full recap output verbatim.
|
|
100
|
+
- The `kcap` CLI must be available on PATH (typically installed at `~/.local/bin/kcap`).
|
|
101
|
+
|
|
102
|
+
## Error Handling
|
|
103
|
+
|
|
104
|
+
- If the session is not found, the command prints "Session not found" and exits with code 1.
|
|
105
|
+
- If not in a git repository (for `--repo`), the command prints an error and exits with code 1.
|
|
106
|
+
- If the Kurrent Capacitor server is unreachable, the command prints an HTTP error. Ensure the server is running.
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: validate-plan
|
|
3
|
+
description: >-
|
|
4
|
+
This skill should be used when the user asks to "validate plan",
|
|
5
|
+
"verify plan", "check plan completion", "did I finish everything",
|
|
6
|
+
"is the plan done", "what's left to do", "validate my work",
|
|
7
|
+
or wants to verify that all planned items were completed.
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Validate Plan
|
|
11
|
+
|
|
12
|
+
Verify that all items in the current session's plan have been completed. Plans come from either a session continuation (`SessionStarted.planContent`) or an in-session plan recorded by the kcap hooks.
|
|
13
|
+
|
|
14
|
+
## Usage
|
|
15
|
+
|
|
16
|
+
Run `kcap validate-plan` via the Bash tool. `kcap validate-plan` resolves the current session id from the environment when the host agent CLI exposes one. If no session id is available, pass it explicitly: `kcap validate-plan <sessionId>`.
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
# Validate the current session's plan
|
|
20
|
+
kcap validate-plan
|
|
21
|
+
|
|
22
|
+
# Explicit session ID (overrides env var)
|
|
23
|
+
kcap validate-plan <sessionId>
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## What It Returns
|
|
27
|
+
|
|
28
|
+
The command outputs three sections:
|
|
29
|
+
|
|
30
|
+
- **`## Plan`** — the full plan text
|
|
31
|
+
- **`## What's Done`** — two sub-sections:
|
|
32
|
+
- **Summary** — AI-generated summary of what was accomplished (from `WhatsDoneGenerated` events, if available)
|
|
33
|
+
- **Details** — list of files created (`Write`) and modified (`Edit`) during the session
|
|
34
|
+
- **`## Instructions`** — asks you to compare the plan against the summary and file list
|
|
35
|
+
|
|
36
|
+
## What To Do With The Output
|
|
37
|
+
|
|
38
|
+
1. Read the plan carefully and identify each distinct planned item
|
|
39
|
+
2. Compare each item against the summary and file list under "What's Done"
|
|
40
|
+
3. If all items are complete, confirm to the user that the plan is fully implemented
|
|
41
|
+
4. If there are gaps, list the missing items and complete them now
|
|
42
|
+
|
|
43
|
+
## When No Plan Is Found
|
|
44
|
+
|
|
45
|
+
If the output says "No plan found for this session", inform the user that no plan was detected for this session. A plan is only present when:
|
|
46
|
+
- The session continued from a previous session that had a plan (`planContent`)
|
|
47
|
+
- The session recorded an in-session plan via the kcap hooks.
|
|
48
|
+
|
|
49
|
+
## Environment
|
|
50
|
+
|
|
51
|
+
The `KCAP_URL` environment variable overrides the default server URL (`http://localhost:5108`).
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kurrent/kcap",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "CLI companion for Kurrent Capacitor — records and visualizes Claude Code sessions",
|
|
5
5
|
"license": "UNLICENSED",
|
|
6
6
|
"repository": {
|
|
@@ -10,14 +10,16 @@
|
|
|
10
10
|
"bin": {
|
|
11
11
|
"kcap": "bin/kcap.js"
|
|
12
12
|
},
|
|
13
|
-
"scripts": {
|
|
13
|
+
"scripts": {
|
|
14
|
+
"postinstall": "node bin/postinstall.js"
|
|
15
|
+
},
|
|
14
16
|
"optionalDependencies": {
|
|
15
|
-
"@kurrent/kcap-darwin-arm64": "0.0
|
|
16
|
-
"@kurrent/kcap-linux-x64": "0.0
|
|
17
|
-
"@kurrent/kcap-linux-arm64": "0.0
|
|
18
|
-
"@kurrent/kcap-linux-musl-x64": "0.0
|
|
19
|
-
"@kurrent/kcap-linux-musl-arm64": "0.0
|
|
20
|
-
"@kurrent/kcap-win-x64": "0.0
|
|
17
|
+
"@kurrent/kcap-darwin-arm64": "0.6.0",
|
|
18
|
+
"@kurrent/kcap-linux-x64": "0.6.0",
|
|
19
|
+
"@kurrent/kcap-linux-arm64": "0.6.0",
|
|
20
|
+
"@kurrent/kcap-linux-musl-x64": "0.6.0",
|
|
21
|
+
"@kurrent/kcap-linux-musl-arm64": "0.6.0",
|
|
22
|
+
"@kurrent/kcap-win-x64": "0.6.0"
|
|
21
23
|
},
|
|
22
24
|
"files": [
|
|
23
25
|
"bin/",
|
package/bin/.gitkeep
DELETED
|
File without changes
|