v0.13.0#77
Merged
Merged
Conversation
All 44 tools now ship a 3-sentence description hitting the six Glama
Tool Definition Quality Score dimensions (purpose, when-to-use vs.
siblings, side-effects/audit/network, parameter semantics, conciseness,
returns). Common parameter schemas (`scope`, `projectPath`, `env`,
`teamId`, `orgId`) and per-tool Zod `.describe()` strings now include
formats, defaults, and concrete examples to lift the per-tool minimum
score that dominates the server-level grade (60% mean / 40% min).
- src/mcp/tools/_shared.ts: enriched commonSchemas describe() strings
- src/mcp/tools/{secrets,project,tunnel,teleport,audit,validation,hooks,
tooling,agent,policy}.ts: 44 tool descriptions rewritten + parameter
describe() strings tightened
- README.md: MCP tables resynced with new one-liners
- CHANGELOG.md: 0.11.7 entry
- package.json / server.json / plugin.json / marketplace.json: 0.11.7
No runtime / MCP wire-format changes — agents will see longer, clearer
tool descriptions on next tools/list refresh; tool names, parameters,
and return shapes are unchanged.
Test plan:
- pnpm run typecheck ✓
- pnpm run lint ✓ (max-warnings 0)
- pnpm run build ✓
- pnpm run test:ci ✓ (24 files / 164 tests)
Made-with: Cursor
feat: v0.11.7 — Glama TDQS overhaul for all 44 MCP tools
…patches (#58) * feat: v0.12.0 — security hardening, dashboard rebuild, dependency patches Security - export_secrets now honors the requiresApproval gate on bulk reads (was bypassable over MCP); skips protected keys lacking a valid grant. - Governance policy is anchored to the MCP server's launch CWD (setPolicyRoot) so an agent can't escape .q-ring.json restrictions via a crafted projectPath. - import_dotenv treats input as literal content for MCP/agent/api callers (file-path convenience is CLI-only), closing a local-file-read vector. - SSRF protection re-validates the resolved IP at connect time (guardedLookup), closing the DNS-rebinding TOCTOU window. - Teleport PBKDF2 raised 100k -> 210k (SHA-512, OWASP); bundles record `iter` so legacy bundles still decrypt. - Status dashboard endpoints require a per-launch, timing-safe token. - Hardened exec network detection (basename) and checkExecPolicy (token/path boundary, not substring); policy cache invalidates on .q-ring.json mtime. - Fixed dotenv inline-comment parsing and the password class guarantee. - New regression tests (176 total). Dashboard - Rebuilt the live status dashboard on Preact + htm with VDOM diffing, so the SSE stream updates data in place: entrance animations run once instead of replaying every 5s (the flicker/"reload" bug), and focus/scroll are preserved. - Still a single self-contained, offline, CSP-clean page: the runtime + app are esbuild-bundled (src/dashboard-client/main.js -> src/core/dashboard-client.ts via scripts/build-dashboard-client.mjs, run by `build`) and inlined. Dependencies - Cleared 23 Dependabot alerts via pnpm overrides (hono, qs, ip-address, fast-uri, esbuild, postcss) + vite pinned as a devDependency. - Added preact/htm/esbuild as devDependencies only; no new runtime deps. Breaking - Dashboard returns 403 without the token; use the printed tokenized URL. - Single MCP server spanning multiple project roots now applies only the launch directory's policy. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * fix(ci): pin pnpm, trim bleeding-edge deps to satisfy lockfile policy CI ran pnpm@latest (v11), which ships a default minimumReleaseAge supply-chain policy and no longer reads `pnpm.overrides` from package.json — diverging from the local pnpm 10 and failing `--frozen-lockfile` on 18 freshly-published lockfile entries. - Pin pnpm via `packageManager: pnpm@10.32.1`; CI reads it (drop `version: latest`) so resolution matches local exactly. Add pnpm cache to setup-node. - Pin `vite` to 8.0.16 (was floating to 8.1.0, which drags in the just- published rolldown 1.1.3 native-binary stack); 8.0.16 uses aged rolldown 1.0.3 and still fixes the vite advisory. - Pin the `qs` override to 6.15.2 (the patched, aged release) instead of floating to the same-day 6.15.3. - Regenerate a lean lockfile from the develop baseline (no --force churn). Local parity with CI: install --frozen-lockfile, audit --audit-level=high (0; 2 dev-only moderates remain), typecheck, lint, build, 176 tests — all green. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * ci: cancel superseded runs on the same ref Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
- Dependabot: weekly npm + github-actions updates; minor/patch grouped into prod/dev batches to cut PR noise, majors/security stay individual. - PR template with type + verification checklist matching CI gates. Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
…Manager) (#65) pnpm/action-setup errors when both a `version` input and the package.json `packageManager` field are set. ci.yml was already fixed; do the same here so the release publish workflow can run. Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
The v0.12.0 npm publish succeeded, but the MCP Registry step failed with 'cannot publish duplicate version' because server.json was still at 0.11.7 — sync-versions never updated it. - Bump server.json to 0.12.0 (top-level + npm package entry). - Teach sync-versions to keep server.json in lockstep going forward. - Make the npm-publish step skip when the version already exists, so the release workflow is safe to re-run (e.g. after the MCP step fails). Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
…tion (#74) * ci: harden workflows — smoke tests, non-blocking audit, pinned mcp-publisher, brew test fix - CI: smoke-test the built qring CLI (--version/--help) and the MCP server (initialize handshake) after build; move pnpm audit to a separate non-blocking job so new upstream advisories don't fail unrelated PRs - CodeQL: also scan direct pushes to main - publish: trigger on release published (not created — drafts no longer publish), pin mcp-publisher to v1.7.9, add concurrency guard, enable pnpm cache (pnpm setup moved before setup-node) - update-homebrew: formula test now asserts the version string (qring --version prints the bare version, so asserting "qring" failed every brew test), guard tarball download with curl -f + sha check, skip commit when formula is unchanged, add concurrency guard - bug template: version placeholder 0.2.9 → 0.12.0 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(claude-plugin): make the Claude Code plugin actually installable Add claude-code-plugin/.claude-plugin/plugin.json and a repo-root .claude-plugin/marketplace.json so the plugin installs via /plugin marketplace add I4cTime/quantum_ring + /plugin install qring@q-ring instead of file copying. Components (agents/commands/skills/hooks) move from .claude/ to the plugin root to match the Claude Code plugin format; hooks get a plugin-format hooks/hooks.json using ${CLAUDE_PLUGIN_ROOT}. The project-scoped sync path still works: plugin-sync-claude.mjs maps the new layout back under .claude/ (skipping the plugin-only hooks.json) and keeps wiring hooks via settings.json. sync-versions.mjs now stamps both new manifests so the Claude plugin is version-tracked like Cursor's. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(cli): central error handler, qring has, non-TTY stdin for set - Wrap program.parseAsync() in a central handler: errors thrown by any command (policy denials, keyring backend failures) print as a one-line red message with exit code 1 instead of a raw Node stack trace; QRING_DEBUG=1 restores the full stack for bug reports - Add qring has <key>: decay-aware existence check, exit 0/1, --quiet for exit-code-only scripting, honors --json — closes the last MCP→CLI parity gap (has_secret) - promptSecret reads stdin to EOF when it isn't a TTY, so echo "$VALUE" | qring set KEY works instead of hanging forever; empty piped input errors cleanly Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix(dashboard): enforce security headers, test the auth path The dashboard was documented as CSP-clean but never sent a policy. Every response now carries Content-Security-Policy (default-deny; inline script/style + same-origin SSE only, frame-ancestors 'none'), X-Frame-Options: DENY, X-Content-Type-Options: nosniff, Referrer-Policy: no-referrer (keeps the ?token= URL out of Referer headers), and Cache-Control: no-store (the HTML embeds the launch token). Adds the first dashboard server tests: missing/wrong token → 403, valid token → 200, and the security headers on both paths. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs: Docker install section, CONTRIBUTING.md, changelog for unreleased changes - README: document the Dockerfile/mcp-proxy container path (previously only discoverable via docs/publishing-log.md) with a note on the no-OS-keychain limitation; add qring has example; link CONTRIBUTING.md - CONTRIBUTING.md: dev environment, branch/commit conventions, and the keep-in-sync list (parity doc, plugin manifests, dashboard bundle) - CHANGELOG: record all unreleased changes from this branch Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(cli): universal --json output and destructive-op confirmations --json (global or per-command) now works on ~20 more commands — list, inspect, delete, import, audit, audit:verify, health, analyze, recall, check, env, validate (single/--all/--list-providers), rotate, tunnel list, hook list, approvals, scan, lint — all emitting { ok: true, data } via a shared emitJson helper. Previously only 4 of ~40 commands honored the advertised flag. JSON output never includes secret values. Destructive operations now confirm before proceeding: delete, forget --all, teleport unpack (when it would overwrite existing keys), wizard (when its generated keys already exist), and env:generate -o (when the output file exists). -y/--yes skips the prompt; non-TTY use without --yes is an error, never a silent yes. BREAKING for scripts that relied on unconfirmed delete/forget --all — add --yes. Also narrows teleport unpack's catch so confirm/import errors are no longer misreported as "wrong passphrase", and scan/lint/check/ audit:verify set exit code 1 on findings in JSON mode to stay script-friendly. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(plugins): generate skills from single source + parity check script cursor-plugin/skills/*/SKILL.md is now the canonical source; a new scripts/plugin-generate-skills.mjs derives the Claude Code skills (verbatim) and Kiro steering files (manual-inclusion transform with #qring-<slug> chat tags) — pnpm run plugin:gen-skills. The regenerated files in this commit reconcile the cosmetic drift (heading case, arrows) that hand-copying had accumulated across the three plugins. scripts/check-plugin-parity.mjs (pnpm run check:parity) fails when: - the plugins' command/agent/skill sets diverge - doc'd MCP tool counts don't match the registered count (44 today, verified against server.tool( registrations in src/mcp/tools) - plugin manifest versions drift from package.json - generated skill files are stale (--check mode of the generator) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * ci: plugin-parity job and cross-platform compat matrix parity job: runs check:parity (plugin sync, tool counts, versions, generated skills) and verifies the committed dashboard client bundle matches a fresh build:dashboard. compat matrix (experimental, continue-on-error until proven green): macOS + Windows on Node 22 exercise the per-OS keyring backends for the first time; ubuntu Node 24 covers the publish toolchain; a Node 18 engines-floor leg does build + CLI smoke only (vitest 4 requires Node 20+). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs: changelog + contributing notes for Phase 2 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(cli): qring doctor self-check and shell completions qring doctor diagnoses the install in one shot: keyring-backend write/read/delete probe (isolated service, never touches real secrets — this is the check that catches headless Linux without a Secret Service), audit-dir writability + hash-chain integrity, .q-ring.json validity, active policy summary, and qring-mcp resolvable on PATH (with per-OS extension handling for Windows). --json supported; exit 1 on any fail, warnings don't fail. qring completion bash|zsh|fish prints completion scripts generated by walking the live commander program — command names, aliases, subcommands, and long flags can never drift from the actual CLI. bash/zsh output passes bash -n / zsh -n. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(dashboard): entanglement graph and audit-chain integrity badge The snapshot now carries auditChain (same data as qring audit:verify), recomputed each 5s tick; the Audit Log card renders it as a live badge — green "chain intact · N events verified", red with the break position when tampered. Entangled secrets render as an SVG node/edge graph on a circular layout (nodes are unique keys, one edge per pair, labels anchored outward with full-name tooltips) instead of the flat pair list the CHANGELOG had been advertising as a graph. Falls back to the list beyond 14 keys. Styled via theme variables, aria-labelled, no new dependencies — the committed client bundle is regenerated. Tests: snapshot includes auditChain, and the served page contains the graph/badge styles and rendered badge markup. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(release): tag-driven release automation pnpm run release:prepare <patch|minor|major|x.y.z> stages a release: bumps package.json, runs sync-versions across every manifest, rolls the CHANGELOG [Unreleased] section into [x.y.z] — date (failing if empty), runs the plugin-parity guard, and prints the commit/tag/push steps. Verified end-to-end against a repo copy. Pushing the v* tag runs the new release.yml: creates the GitHub Release idempotently with notes extracted from that version's CHANGELOG section (fails loudly if the section is missing), then chains publish.yml and update-homebrew.yml via workflow_call. The explicit chaining exists because GITHUB_TOKEN-created releases emit no events, so the release:published triggers can't fire on this path; they remain for releases created manually in the UI, and every downstream step is idempotent with a shared publish concurrency group. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs: troubleshooting guide, per-editor quickstarts, releasing guide - docs/troubleshooting.md: qring doctor first, keyring backends (headless Linux/CI), MCP-not-connecting per editor with a manual handshake probe, approval gate, 0.12.0 policy-root pinning, audit log, scripting gotchas (--yes, --json, --raw, has --quiet), AGPL FAQ - docs/quickstart-{claude-code,cursor,kiro}.md: five-minute setups with example prompts per editor (the "prompt cookbooks" the README promises) - docs/releasing.md: the tag-driven flow and failure recovery - README: docs index section, doctor + completion in Quick Start - parity check now also guards the tool-count claims in the quickstarts Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix: track exec-with-secrets cursor skill; fix approval test on Windows Two bugs the new CI jobs caught on their first run: - The blanket *secret* pattern in .gitignore silently kept cursor-plugin/skills/exec-with-secrets/SKILL.md out of git — the canonical source for a shipped skill existed only on the maintainer's machine. Extend the gitignore allow-list to cover it and modernize the Claude plugin entries to the new plugin-root layout (the old .claude/skills paths no longer exist). Caught by the parity job. - approval.test.ts redirected the approval store via $HOME, but os.homedir() reads USERPROFILE on Windows, so the store went to the runner's real profile while the test read the temp dir (3 ENOENT failures). Set and restore both variables. Caught by the compat matrix — which otherwise passed everywhere, including the Windows and macOS keyring backends (179/182 on first-ever Windows run). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* chore(deps): in-range updates, vite 8.1.4, fix js-yaml advisory pnpm update across in-range deps (mcp sdk, zod, eslint 9.x line, vitest, tsup, etc.), vite pin bumped 8.0.16 -> 8.1.4 (both the explicit devDependency and the pnpm override), and a js-yaml >=4.2.0 override resolving GHSA-h67p-54hq-rp68 (quadratic-complexity DoS in merge key handling; dev-scope via eslint) — js-yaml now resolves to 4.3.0. Covers Dependabot PRs #69 and #70. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * chore(deps-dev): @types/node 25 -> 26 Typecheck and build clean. Covers Dependabot PR #73. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * chore(deps-dev): eslint 9 -> 10, fix findings from newly-default rules Flat config works unchanged. ESLint 10 enables no-useless-assignment and preserve-caught-error, which found three real issues — fixed the code instead of disabling the rules: - envelope.ts: timeRemaining was assigned null then unconditionally reassigned on every path; initialize with the fallback instead - provision.ts (x2): rethrown provision errors now attach the original error as { cause } so the underlying AWS/HTTP failure isn't lost Covers Dependabot PR #72. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * chore(deps): commander 14 -> 15 Typecheck, build, all 182 tests, and a live smoke pass: grouped help renderer, set/get/has/delete roundtrip, completion generation (bash -n clean), doctor, and unknown-command error handling all behave identically on v15. Covers Dependabot PR #71. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * ci(deps): bump action majors — checkout v7, setup-node v6, pnpm/action-setup v6, codeql-action v4 Applied across all five workflows (including the ones PR #74 added, so the Dependabot PRs against the old files would have conflicted). Clears the Node 20 deprecation warnings the v4-generation actions emit on current runners. Covers Dependabot PRs #60, #61, #62, #63. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs: changelog for dependency + security updates Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Version 0.13.0 staged via pnpm run release:prepare minor — package.json, plugin manifests, server.json, SECURITY.md bumped in lockstep; CHANGELOG [Unreleased] rolled into [0.13.0] — 2026-07-11. Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Conflicts in publish.yml, CHANGELOG.md, sync-versions.mjs, and the dashboard files came from fixes that were landed twice (#65/#66, #67/#68) plus the v0.12.0 squash. develop is the source of truth — the merged tree is exactly develop's (verified: empty diff). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Brings develop to main for the v0.13.0 release: the full hardening pass (#74), the dependency/security updates (#75), and the release prep (#76).
Merge-conflict note: main carried duplicate fixes (#66/#68 mirror develop's #65/#67) plus the v0.12.0 squash, which conflicted in 6 files. Resolved by taking develop's tree wholesale — verified byte-identical to
origin/develop.After squash-merging this: tag the squash commit
v0.13.0and push the tag. That triggersrelease.yml→ GitHub Release (CHANGELOG notes) → npm + MCP Registry publish → Homebrew tap update.Type
Checklist
pnpm run typecheckpassespnpm run lintpassespnpm run buildpassespnpm run test:cipasses (182 tests)CHANGELOG.mdrolled to[0.13.0] — 2026-07-11Breaking changes
Scripts running
qring delete/qring forget --allnon-interactively must add--yes(documented in the 0.13.0 CHANGELOG section).🤖 Generated with Claude Code