@lineman-io/mcp 2.1.1 → 2.3.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/CHANGELOG.md ADDED
@@ -0,0 +1,76 @@
1
+ # Changelog
2
+
3
+ ## 2.2.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#418](https://github.com/lineman-io/lineman-mono/pull/418) [`3b3620a`](https://github.com/lineman-io/lineman-mono/commit/3b3620a9329622533a9dcb0a551cb82f876ca7df) Thanks [@grant-unwin](https://github.com/grant-unwin)! - Add `/lineman:auth` slash command for in-session authentication.
8
+
9
+ Wraps the existing device-code flow (`apps/lineman/mcp/src/auth.ts`) as a Claude Code skill so users no longer need to drop to a shell and run `npx lineman-mcp auth` to get a token. The new `auth` MCP tool is intentionally not auth-gated — it's the way users acquire auth.
10
+
11
+ Two-phase flow driven by the model's skill loop: first call returns the verification URL + user code + device code; subsequent calls with the device code poll the token endpoint and either return `pending`, `complete` (writes token to `~/.goodex/lineman.json`), or `expired`. Subsequent `assist` / `edit_file` tool calls pick up the token automatically without restarting the MCP server.
12
+
13
+ Companion to LIN-321 (Lineman Site homepage rewrite onto the plugin install path). The CLI `npx lineman-mcp auth` entry point remains for headless / scripted setups.
14
+
15
+ ## 2.1.1
16
+
17
+ ### Patch Changes
18
+
19
+ - [#324](https://github.com/lineman-io/lineman-mono/pull/324) [`6b318a8`](https://github.com/lineman-io/lineman-mono/commit/6b318a82c15f83042d1932d12c5efa546245f0e6) Thanks [@grant-unwin](https://github.com/grant-unwin)! - Plugin marketplace install path now resolves through npm rather than a github-clone of `lineman-io/lineman-mono`.
20
+
21
+ `/plugin install lineman@lineman` previously cloned the repo and ran the committed `apps/lineman/mcp/dist/main.js`. The marketplace entry now points at the published `@lineman-io/mcp` package via the npm-source schema, so Claude Code installs the plugin straight from the npm registry. The npm tarball contents are unchanged from prior releases — this release exists so the install-path flip can be exercised end-to-end against a tagged version.
22
+
23
+ The accompanying repo cleanup retires `apps/lineman/mcp/dist/` git tracking and the `lineman-plugin-bundle.yml` workflow; one distribution surface (npm) is now authoritative.
24
+
25
+ Pre-launch posture is preserved: the package remains `access: "restricted"` on npm. Public-access flip is tracked separately under the **npm public flip** project (LIN-16, etc.).
26
+
27
+ ## 2.1.0
28
+
29
+ ### Minor Changes
30
+
31
+ - [#295](https://github.com/lineman-io/lineman-mono/pull/295) [`b7f908f`](https://github.com/lineman-io/lineman-mono/commit/b7f908f3842f1da21f8d2f8781dded1b1d177ce4) Thanks [@grant-unwin](https://github.com/grant-unwin)! - Make the plugin survive a marketplace install with no `node_modules/`, and remove the dead channels feature scaffolding.
32
+
33
+ - **Hooks no longer crash on missing `@sentry/node`.** `hooks/sentry-hook.mjs` now loads Sentry via top-level dynamic import + try/catch, falling back to a no-op when the package isn't present. Was the static import that crashed every hook on every invocation under marketplace-install conditions.
34
+ - **MCP server no longer crashes on missing `@sentry/node`.** `src/sentry.ts` mirrors the same pattern with a no-op shim, so `Sentry.captureException(...)`, `Sentry.startSpan(...)`, and the other 14+ callsites in `src/server.ts` keep working without per-callsite null checks.
35
+ - **Plugin version is inlined at build time** via tsup's `define` instead of a runtime `package.json` read.
36
+ - **Channels feature removed.** The `claude/channel` capability declaration, the pending-prompt poller, the one-time channel tip, and the `checkChannelsCapability` doctor check have all been removed. The writer side of the pipeline was never built and the compression was a stub. Design intent + revisit conditions captured in `docs/claude/roadmap.md` under FA-P18 for when channels gets re-engaged.
37
+
38
+ Marketplace install requires `zod` to be available at runtime — solved by distributing this version via npm (which installs it as a normal dependency). Distribution from a github source remains broken pre-flip-to-public; FA-P19 in the roadmap captures the public-flip checklist.
39
+
40
+ ### Patch Changes
41
+
42
+ - [#298](https://github.com/lineman-io/lineman-mono/pull/298) [`8d2381b`](https://github.com/lineman-io/lineman-mono/commit/8d2381b85bf129f8a88d3c6aa3143695ebfc2a7b) Thanks [@grant-unwin](https://github.com/grant-unwin)! - Fix runtime crash on `tools/list` after marketplace install: the MCP server bundled `@modelcontextprotocol/sdk` (with its transitive `zod` inlined) while our source's `zod` import resolved externally to `node_modules/zod`. Two distinct zod realms — schemas built with one couldn't pass MCP SDK's `instanceof ZodObject` checks, surfaced as `Cannot read properties of undefined (reading 'typeName')` from the `tools/list` handler.
43
+
44
+ Revert tsup's `noExternal` to workspace deps only (`@goodex/agent-core`, `@goodex/shared`); every npm dep stays external. Marketplace install brings deps via `npm install` once the package is distributed via npm (FA-P19). Verified locally: spawn `node start.mjs` against staging, `tools/list` returns `assist` + `edit_file` cleanly.
45
+
46
+ ## [Unreleased]
47
+
48
+ ### Removed
49
+
50
+ - Channels feature scaffolding (`claude/channel` capability advertisement, `lineman-pending-prompt.json` poller in `src/main.ts`, `lineman-no-channels` first-call tip in `src/server.ts`, `checkChannelsCapability()` from `src/handlers/doctor.ts` and its tests). The writer side of the pipeline was never built and the compression was a stub, so the feature was inert. Design intent preserved in `docs/claude/roadmap.md` under FA-P18 for a future revisit.
51
+
52
+ ### Changed
53
+
54
+ - `src/sentry.ts` and `hooks/sentry-hook.mjs` now load `@sentry/node` via dynamic import + try/catch and fall back to a no-op shim when the package is absent. Lets the plugin survive a marketplace install with no `node_modules/` (Sentry observability degrades silently instead of crashing every hook + the MCP server boot).
55
+ - Plugin version is now inlined at build time via tsup's `define` (replaces the runtime `import.meta.dirname → package.json` lookup that wouldn't survive a CJS retarget).
56
+
57
+ ## [2.0.0] - 2026-04-23
58
+
59
+ ### Breaking
60
+
61
+ - Package now ships as a Claude Code plugin. Install via `/plugin install lineman@lineman` instead of `claude mcp add`. See `MIGRATION.md` for upgrade steps.
62
+ - MCP tool renamed from `lineman` to `assist`; full plugin-scoped name is `mcp__plugin_lineman_core__assist`.
63
+ - Runtime files (`lineman-no-channels`, `lineman-pending-prompt.json`, `lineman-metrics.jsonl`) moved from `~/.goodex/` to `$CLAUDE_PLUGIN_DATA/`. Runtime state is now scoped to the plugin install; user config at `~/.goodex/lineman.json` is unchanged.
64
+
65
+ ### Added
66
+
67
+ - `/lineman:doctor` slash command — diagnostic checklist (MCP reachable, token valid, tier recognized, hooks installed, channels capability, last-call latency).
68
+ - `/lineman:stats` slash command — session token-savings stats with a by-task-type breakdown.
69
+ - Auto-triggered `lineman` skill with trigger phrases for data-heavy tasks (large-file reads, error classification, build/test output triage, log analysis, grep ranking, diff summaries).
70
+ - Core hook helpers under `apps/lineman/mcp/hooks/core/` (`routing.mjs`, `stdin.mjs`, `mcp-ready.mjs`, `tool-naming.mjs`).
71
+
72
+ ### Removed
73
+
74
+ - `autoInstallHooks()` startup call and `install_hooks` MCP tool (`handleInstallHooks`). Hooks are now registered by the plugin from `hooks/hooks.json`.
75
+ - Shell alias auto-injection into `~/.zshrc` / `~/.bashrc`.
76
+ - `~/.goodex/lineman-hooks.json` sentinel — hooks use static constants.
package/README.md CHANGED
@@ -10,15 +10,12 @@ The plugin bundles the MCP server, lifecycle hooks, and skills as a single unit:
10
10
  /plugin marketplace add lineman-io/lineman-mono
11
11
  /plugin install lineman@lineman
12
12
  /reload-plugins
13
+ /lineman:auth
13
14
  ```
14
15
 
15
- Verify the install:
16
+ `/lineman:auth` runs the device-code flow inside the Claude Code session — opens a browser, waits for confirmation, writes the token to `~/.goodex/lineman.json`. No shell drop required. The `npx lineman-mcp auth` CLI entry point still exists for headless / scripted setups.
16
17
 
17
- ```
18
- /lineman:doctor
19
- ```
20
-
21
- All checks should be green. If any fail, the command prints the remediation step inline (usually: run `npx lineman-mcp auth` to set an API token).
18
+ Once authenticated, `/lineman:doctor` runs a diagnostic checklist (MCP reachable, token valid, tier recognised, hooks installed, last-call latency). Tracked separately as LIN-320 — the doctor + stats MCP tools were dropped in the 2026-04-25 context-mode revert and are pending reactivation.
22
19
 
23
20
  ## Install (alternative — MCP only)
24
21
 
@@ -39,12 +36,13 @@ This gives you a callable tool but no automatic routing — you must invoke Line
39
36
 
40
37
  Once the plugin is installed, the `lineman` skill auto-loads when your prompt matches a data-heavy trigger ("read the file", "classify error", "summarize build output", etc.) and routes the work through `mcp__plugin_lineman_core__assist`. Results come back tagged `[[LM_SUMMARY]]` / `[[LM_VERBATIM]]` / `[[LM_CONTEXT]]` / `[[LM_RESULT]]` and should be treated as authoritative.
41
38
 
42
- Two user-invocable slash commands:
39
+ User-invocable slash commands:
43
40
 
44
41
  | Command | Purpose |
45
42
  |---------|---------|
46
- | `/lineman:doctor` | Diagnostic checklist MCP reachable, token valid, tier recognized, hooks installed, channels capability, last-call latency. |
47
- | `/lineman:stats` | Session metricstotal `assist` calls, input tokens saved, output tokens consumed, average latency, savings ratio, and a by-task-type breakdown. |
43
+ | `/lineman:auth` | Run the device-code flow to acquire and save an API token. Required once per machine before `assist` / `edit_file` will work. |
44
+ | `/lineman:doctor` | Diagnostic checklistMCP reachable, token valid, tier recognized, hooks installed, channels capability, last-call latency. *Pending reactivation, see LIN-320.* |
45
+ | `/lineman:stats` | Session metrics — total `assist` calls, input tokens saved, output tokens consumed, average latency, savings ratio, and a by-task-type breakdown. *Pending reactivation, see LIN-320.* |
48
46
 
49
47
  ## Configuration
50
48
 
@@ -68,10 +66,38 @@ Environment variables take precedence:
68
66
 
69
67
  ### Auth at use time
70
68
 
71
- Lineman MCP tools (`assist`, `edit_file`) always register, even before authentication. Tool calls return a structured `not_authenticated` error envelope (`{ error: { reason: "not_authenticated", message, auth_url } }`) until `LINEMAN_API_TOKEN` is set (or `apiToken` is written to `~/.goodex/lineman.json` via `npx lineman-mcp auth`). This means a fresh `claude --plugin-dir apps/lineman-mcp` session always sees the tools listed — the model gets a clear, actionable error pointing at the auth flow rather than silently missing tools — and the moment the env var lands, subsequent tool calls succeed without restarting the MCP server.
69
+ Lineman MCP tools (`assist`, `edit_file`) always register, even before authentication. Tool calls return a structured `not_authenticated` error envelope (`{ error: { reason: "not_authenticated", message, auth_url } }`) until `LINEMAN_API_TOKEN` is set (or `apiToken` is written to `~/.goodex/lineman.json` via `npx lineman-mcp auth`). This means a fresh `claude --plugin-dir apps/lineman/mcp` session always sees the tools listed — the model gets a clear, actionable error pointing at the auth flow rather than silently missing tools — and the moment the env var lands, subsequent tool calls succeed without restarting the MCP server.
72
70
 
73
71
  Runtime state (metrics, sentinels, pending prompts) is written to `$CLAUDE_PLUGIN_DATA/` by the plugin — not to `~/.goodex/`. In dev / tests without Claude Code present, it falls back to `$TMPDIR/lineman/`.
74
72
 
73
+ ## Telemetry
74
+
75
+ Lineman MCP sends a small, anonymous stream of operational telemetry to Sentry so we can detect outages, fix bugs, and measure activation. We **never** send raw prompts, source code, file contents, or environment variable values.
76
+
77
+ What we do send:
78
+
79
+ - A stable per-machine UUID (`lineman_install_id`) generated on first launch. Not tied to your identity until you authenticate.
80
+ - After authentication, your Lineman user id (`user_id` from the signed claim).
81
+ - Tool-call telemetry: tool name, task type, latency, byte counts, savings estimates, error class.
82
+ - Activation events: `mcp.first_run`, `mcp.auth_link_clicked`, `mcp.auth_completed`, `mcp.upgraded`.
83
+ - Operating system, Node version, MCP version, runtime host (claude-code / aider / continue / unknown).
84
+
85
+ What we strip before send:
86
+
87
+ - All absolute file paths are rewritten — `/Users/<you>/...` and `/home/<you>/...` are replaced with `~`.
88
+ - Stack-frame variables named `prompt`, `content`, `code`, `summary`, `messages`, `body`, `input`, or anything matching `KEY|TOKEN|SECRET|PASSWORD|API|AUTH|CREDENTIAL` are blanked.
89
+ - HTTP request bodies are blanked wholesale.
90
+
91
+ ### Disabling telemetry
92
+
93
+ Set `LINEMAN_TELEMETRY=off` (or `0` / `false` / `no`) in your shell environment. The MCP will skip Sentry initialisation entirely — no SDK loaded, no events emitted, no install_id sent.
94
+
95
+ ```sh
96
+ export LINEMAN_TELEMETRY=off
97
+ ```
98
+
99
+ A first-class plugin setting + slash command for this is tracked in LIN-524.
100
+
75
101
  ## Troubleshooting
76
102
 
77
103
  Run `/lineman:doctor`. It probes the MCP server, the API token, the configured tier, hook installation, channels capability, and last-call latency, and prints `fail` entries with actionable details (e.g. "no API token in ~/.goodex/lineman.json"). If everything is green but results look wrong, check `$CLAUDE_PLUGIN_DATA/lineman-metrics.jsonl` for per-call records.