Feat/claude plugin - #1188
Conversation
Signed-off-by: Kody <kaidi.shi.1121@gmail.com>
Signed-off-by: Kody <kaidi.shi.1121@gmail.com>
Signed-off-by: Kody <kaidi.shi.1121@gmail.com>
Extends the emit-plugin generator with emit_agents(), which renders the Claude-dialect Scout/Verify/Audit profiles via cbm_render_graph_profile and writes them verbatim to agents/<slug>.md. Signed-off-by: Kody <kaidi.shi.1121@gmail.com>
…failure) Signed-off-by: Kody <kaidi.shi.1121@gmail.com>
Signed-off-by: Kody <kaidi.shi.1121@gmail.com>
Signed-off-by: Kody <kaidi.shi.1121@gmail.com>
Signed-off-by: Kody <kaidi.shi.1121@gmail.com>
Signed-off-by: Kody <kaidi.shi.1121@gmail.com>
Signed-off-by: Kody <kaidi.shi.1121@gmail.com>
Signed-off-by: Kody <kaidi.shi.1121@gmail.com>
Signed-off-by: Kody <kaidi.shi.1121@gmail.com>
- rename local skills -> skill_list (was shadowing file-scope skills[]) - remove always-false !skills guard (cbm_get_skills never returns NULL) - clang-format-20 reflow of emit_agents/emit_mcp_json (no behavior change) Signed-off-by: Kody <kaidi.shi.1121@gmail.com>
POSIX mkdir(path, mode) is 2-arg; MinGW/clang mkdir is 1-arg, breaking the Windows build. Use cbm_mkdir_p (compat_fs) like the other tests; drop the now-unused <sys/stat.h>. Signed-off-by: Kody <kaidi.shi.1121@gmail.com>
|
Thanks for this, and sorry for the slow first response. Queued for review. MERGEABLE with 21 checks green, +747 across 18 files. Flagging one thing early so the review outcome is not a surprise: a new plugin surface is a public-interface addition rather than a bug fix, so beyond correctness there is a question of whether it fits the project direction. That is a maintainer call and not a comment on the implementation. Worth knowing before you invest more time on top of it. |
|
@DeusData Thanks for the heads-up. Appreciate the context—I'll wait for the review |
|
Thank you for this — it is carefully built, and I want to be specific about what I verified before explaining what is holding it. The security review came back clean, and I checked the thing that actually worried me. A PR shipping skill and agent markdown is content an AI agent will read and follow, so it gets scanned as adversarial input rather than as documentation. Result: every file under No new dependencies, the The engineering is genuinely good. Single source of truth with a drift gate enforcing it is the right architecture — it is what stops the committed tree and the C source from silently diverging, which is exactly how this class of feature usually rots. Roughly 40% of the diff is tests, the wipe guard has a marker check and a test for it, and you fixed the Windows What is holding it is a direction decision, and it is the maintainer's, not mine. One thing that is time-sensitive and worth fixing regardless of that decision. Four defects worth fixing while the direction question is open:
One design divergence worth an explicit answer from you, since you may have reasoned about it already: None of this is a rejection. The build quality is not in question — the question is whether we want a second channel at all, and that answer is above my pay grade. I will come back to you as soon as I have it. |
Signed-off-by: Kody <kaidi.shi.1121@gmail.com>
Signed-off-by: Kody <kaidi.shi.1121@gmail.com>
|
Thank you for the thorough review — especially the security/content verification and the clear separation between implementation quality and the direction decision. I agree that adopting a second distribution channel is a maintainer decision; this follow-up does not try to preempt it. Release coordination
A release PR that changes Defects
|
Signed-off-by: Kody <kaidi.shi.1121@gmail.com>
|
Thank you for the detailed follow-up and for working through the earlier concerns. I have recorded your notes about the narrowed release-risk changes and removal of unpinned execution. The next step is a full maintainer review of the current diff, including the remaining distribution-direction question. The queue is full, but this is back in the active review queue. |
Signed-off-by: Kody <kaidi.shi.1121@gmail.com>
Path.write_text is not atomic: open(..., "w") publishes a zero-byte file that a reader polling for existence can observe before the content lands at close. The parallel harness contract polls for "<suite>.ready" and then parses its content as the leader pid, so it could win that gap and hit ValueError: invalid literal for int() with base 10: ''. Windows CI hit this on the test-windows CLANG64 2/2 shard, which then produced no shard manifest and cascaded into shard-completeness and ci-ok. Write the barrier files to a same-directory temp path and os.replace() them onto the destination, which is atomic on POSIX and Windows. A reader now sees either no file or complete content. Signed-off-by: Kody <kaidi.shi.1121@gmail.com>
Signed-off-by: Kody <kaidi.shi.1121@gmail.com>
upstream/main quoted the emitted skill description so strict YAML readers accept it (DeusData#1554), but plugin/ only exists on this branch, so the committed copy kept the bare scalar and plugin-drift went red on the merge result. Regenerated with scripts/sync-plugin.sh 0.8.1. Signed-off-by: Kody <kaidi.shi.1121@gmail.com>
7837de8 to
c6dd905
Compare
|
Thank you again for the substantial work here, and for responding carefully to the earlier review. I need to correct the sequencing in our previous maintainer guidance: asking you to keep iterating on the whole diff before we established reviewable boundaries was not fair to you. The contribution currently combines several independently risky surfaces: the static plugin payload and MCP/skill core, agent and hook behavior, the CLI emitter with ownership safeguards, and CI/release drift plus version synchronization. We need those reviewed as atomic slices:
Please keep this PR as the umbrella ledger if that is useful, and open focused PRs for the slices in that order. Each slice should be independently understandable and testable. This is a request for a reviewable structure, not a promise that every slice will merge unchanged, but it will let us give the work the security and product review it deserves. Thank you for the patience and the amount of care already invested. |
|
The direction decision this work has been waiting on: yes — cbm will carry the Claude Code marketplace channel as a second distribution surface. The four-slice plan from 18 August now has a real merge path, and your slices are worth cutting. What decided it: the payload is manifest, markdown and JSON only — byte-identical to what Three conditions the slice reviews will hold, so you can build against them rather than discover them:
Related, decided in the same pass: a CLI-invocation skill variant (the #1215 concept) is also accepted in principle, as an install flag rather than a global content swap, and it belongs inside this same client-surface architecture — so when you cut slice 1 (static payload + skill core), design the skill content selection so a per-client variant can plug in without forking the payload. Nothing you need to build for it; just leave the seam. Slices in the 18 August order whenever you are ready — and thank you for the patience while the direction caught up with the work. |
|
@Geek0x0 — the direction answer stands, and this stays open as the umbrella ledger while the slices land. Posting some rebase intelligence you cannot see from your fork, because three of these would each fail a gate independently and I would rather you hit them here than one at a time in CI. 1. The language count is 161, not 159 — and the emitter must derive it, not restate it. There is a second, subtler half. Section 4 of 2. 3. The 4. The rebase is substantial, not mechanical. Since your last push (2026-08-13), One thing I checked expecting a problem and did not find one, so you needn't worry about it: widening And credit where it is due: the three agent definitions declare Take the slices in whatever order suits you, with the caveat in (2) about the release gate. Thanks for the patience on this one. |
|
Follow-up on the release-gate ordering, so slice 1 isn't blocked on it: slices 1–3 should omit the release gate entirely. The payload, the agent/hook behaviour and the CLI emitter are all useful without any release-pipeline gating, and decoupling them means the drift gate never exists in a state where it can brick a dispatch. Slice 4 then brings the gate and the version discipline together, which is the only combination that is safe on arrival. Separately, and so it stops being your problem: I'm fixing the Which means by the time slice 4 arrives, the landmine described in point 2 above should already be defused, and your drift gate will have correct metadata to check against rather than inheriting a nine-release-old lie. Take the slices in your own time. |
|
Apologies for the long silence — this has been open since 20 July with no reply, which is not acceptable and is on us. Our maintainer has now made a decision. Accepted in principle, with one required changeAccepted: the marketplace route is worth having. Required before merge: the generated hooks must not shell out to { "matcher": "Grep|Glob", "hooks": [ { "type": "command", "command": "npx",
"args": ["-y", "codebase-memory-mcp@0.8.1", "hook-augment"] } ] }
Adding an The wrinkle, which is yours to design rather than mine to dictate: the plugin's whole "no prior binary install" property comes from Keeping Also: Credit where it is dueTwo things here are better than the feature itself. Fix the hook invocation and the version pin, and I will review the rest properly and merge. |
This comment has been minimized.
This comment has been minimized.
Maintainer notice: please disregard comments from @adfjadfj16-a11y on this thread@adfjadfj16-a11y is not a maintainer of this project and does not speak for it. That account has posted replies on 17 threads here written in the project's voice — promising merges, announcing that a case has been "escalated to the development team", asking to close issues, and in some threads replying as though it were the author of someone else's pull request. None of those were maintainer decisions, and none of them carried any weight. @DeusData is the only account that gives a maintainer response on this repository. If a comment about the fate of your issue or pull request did not come from @DeusData, it is not a decision, however official it reads. If you were waiting on something because of one of those comments — a promised merge, a review "immediately", a request to close your ticket — I am sorry. That was noise you had no way to identify as noise, and it should not have been on your thread. Your issue or PR is judged on its own merits, and I will answer it here myself. Nothing in this notice reflects on your contribution. Thank you for your patience, and thank you for the work. |
What does this PR do?
What does this PR do?
Adds a Claude Code plugin for codebase-memory-mcp, distributed with this repo acting as its own plugin marketplace. Claude Code users install the full experience — MCP server, the codebase-memory skill, three graph agents (Scout/Verify/Audit), and the context hooks — in one step:
claude plugin marketplace add DeusData/codebase-memory-mcp
claude plugin install codebase-memory
Other clients (Codex, Gemini, Copilot, …) keep the existing codebase-memory-mcp install path unchanged; this is a Claude-Code-only additional distribution.
A new emit-plugin
[--version X] subcommand generates the whole plugin tree from the same embedded C strings the install subcommand already uses, so the plugin can never drift from the source of truth:.claude-plugin/marketplace.json is hand-written; the generated plugin/ tree is committed and regenerated idempotently. emit-plugin wholly owns out_dir (recursive clear + regenerate each run) and refuses to clear a directory that isn't already an emitted plugin tree, guarding against accidental data loss. scripts/check-plugin-drift.sh rebuilds, re-emits, and fails on any plugin/ difference (via git status --porcelain, catching new/untracked files too); it runs as a merge-gating plugin-drift job in .github/workflows/pr.yml. No new dependencies.
Checklist
git commit -s) — required, CI rejectsunsigned commits (DCO, see CONTRIBUTING.md)
make -f Makefile.cbm test)make -f Makefile.cbm lint-ci)