diff --git a/assets/make-it-a-bit-better/icon.png b/assets/make-it-a-bit-better/icon.png new file mode 100644 index 00000000..89c91369 Binary files /dev/null and b/assets/make-it-a-bit-better/icon.png differ diff --git a/external_plugins/make-it-a-bit-better/.zcode-plugin/plugin.json b/external_plugins/make-it-a-bit-better/.zcode-plugin/plugin.json new file mode 100644 index 00000000..519dd440 --- /dev/null +++ b/external_plugins/make-it-a-bit-better/.zcode-plugin/plugin.json @@ -0,0 +1,25 @@ +{ + "name": "make-it-a-bit-better", + "version": "0.2.4", + "description": "An autonomous product-polish loop: every round opens a mandatory fresh brainstorm (3 perspective subagents), picks one small angle, implements, verifies and commits it, and logs it in a per-project ledger; oversized ideas go to an icebox. A bit better, round after round.", + "description_i18n": { + "en": "An autonomous product-polish loop: every round opens a mandatory fresh brainstorm (3 perspective subagents), picks one small angle, implements, verifies and commits it, and logs it in a per-project ledger; oversized ideas go to an icebox. A bit better, round after round.", + "zh-CN": "自主产品打磨循环:每轮强制开一场新头脑风暴(3 个视角子代理),择一个小角度实现、验证并提交,落账到项目级 ledger;超格好想法进 icebox。一轮好一点点,轮次积累成产品进步。" + }, + "author": { + "name": "Lumos-789", + "url": "https://github.com/Lumos-789" + }, + "homepage": "https://github.com/Lumos-789/make-it-a-bit-better", + "repository": "https://github.com/Lumos-789/make-it-a-bit-better", + "license": "MIT", + "keywords": [ + "polish", + "iteration", + "continuous-improvement", + "product", + "brainstorm", + "ux" + ], + "skills": "skills" +} diff --git a/external_plugins/make-it-a-bit-better/CHANGELOG.md b/external_plugins/make-it-a-bit-better/CHANGELOG.md new file mode 100644 index 00000000..32610761 --- /dev/null +++ b/external_plugins/make-it-a-bit-better/CHANGELOG.md @@ -0,0 +1,67 @@ +# Changelog + +## 0.2.4 + +- Quick start: the expectation line after the 5-round example says "up to N + committed small improvements" again (both languages) — it had drifted to + "up to 3" when the example was added, but each round lands at most one + improvement, so N rounds yield at most N (0.2.1 already said "up to N"). +- `.gitignore` drops `build/`, `__pycache__/` and `*.pyc` — template leftovers + from the initial commit; this is a pure-JS skill repo with no Python files + and no build step. + +## 0.2.3 + +- README 双语的 DSH 版本要求补上上界,改为 `>=0.2.1-rc.2 <0.3.0`,与 + `package.json` 的 `engines.dsh` 同口径:原文「0.2.1-rc.2 or newer / 或更新」 + 漏了 `<0.3.0` 上限,DSH 0.3.x 用户按文档以为兼容,实际会被安装闸挡下。 + +## 0.2.2 + +- The repo gate now requires `target` to be the repository root: a directory + nested inside another repository fails the gate and reports both paths, + instead of silently committing rounds into the parent repo. +- This changelog is the single release history: the README keeps one line of + news and points here (it had drifted — the README listed 0.2.1/0.2.0/0.1.0 + while this file only had 0.2.2). +- `package.json` declares `engines.dsh` and the skill-filesystem peer, so an + incompatible DSH blocks install and activation instead of failing at runtime. + +## 0.2.1 (2026-11-03) + +- The skill text carries a soft cap (150 lines): growth past the cap pays for + itself by distilling existing lines, so every round stays loadable for + small-context agents. +- README answers "why not just ask an agent to improve it?" up front — the three + structural guarantees an ad-hoc prompt can't give. +- Quick start expectations calibrated: up to N committed improvements; a + self-stop (`stalled` ledger line) or a reverted round (`failed, reverted`) is + the loop being honest, not broken. +- A round whose red check can't be fixed ships nothing, in exactly two commits — + the round's commit plus its revert; the failed diff and its failing evidence + stay in git history for the fix workflow. + +## 0.2.0 (2026-11-03) + +Protocol hardened by 13 self-hosted rounds (mabb polishing itself): + +- Verify honesty: a red check is fixed within the round cap or reverted with a + reversing commit and logged as `failed, reverted`; "verification pending" is + distinct from a missing toolchain; a repo with no verification surface gets a + manual smoke, never an invented check. +- Safety gates: non-git targets are rejected before any work; the ledger's + `.agents/` home is verified gitignored before recording; a repo without docs + grounds on entry-point code + tree, never an improvised summary. +- `focus` now shapes generation in every lens and ranks in-focus candidates + first — end to end, not just where the round grounds. +- Fixed-shape reporting: every round ends with the same six-field report, every + run closes with a four-field summary; the ledger carries a dimensions-coverage + view and next-round hint, and a self-stopped run leaves a dated `stalled` + marker. +- Icebox lifecycle: thin brainstorms promote a sliceable icebox idea instead of + stopping early; entries carry stable short ids (`IB-N`) and are deleted when + landed. + +## 0.1.0 + +Initial release: the 7-step round protocol, lens pool, ledger and icebox. diff --git a/external_plugins/make-it-a-bit-better/LICENSE b/external_plugins/make-it-a-bit-better/LICENSE new file mode 100644 index 00000000..b6c14d9c --- /dev/null +++ b/external_plugins/make-it-a-bit-better/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Lumos-789 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/external_plugins/make-it-a-bit-better/README.md b/external_plugins/make-it-a-bit-better/README.md new file mode 100644 index 00000000..2208ea50 --- /dev/null +++ b/external_plugins/make-it-a-bit-better/README.md @@ -0,0 +1,79 @@ +

make-it-a-bit-better icon

+ +

make-it-a-bit-better

+ +

A bit better, round after round.

+ +A skill plugin that runs an autonomous product-polish loop. Every round opens a **mandatory fresh brainstorm** (3 perspective-forced subagents), picks **one small angle**, implements, verifies and commits it, and logs the round in a per-project ledger. Good ideas that are too big for one round go to an **icebox** instead of being forced in. The philosophy is the name: no rewrites — a bit better, accumulated round after round. + +## Why not just ask an agent to "improve it"? + +An ad-hoc prompt can produce a change; it can't produce this loop's three structural guarantees: + +- **A fresh brainstorm every round** — 3 forced perspectives regenerate candidates outside the last round's frame, deduped against the ledger. An ad-hoc prompt re-cooks whatever the model already said. +- **One small, verified change** — ≤3 files / ≈100 lines, a real check must pass, and a red check is reverted rather than shipped. An ad-hoc prompt optimizes for looking done. +- **Memory across rounds** — the ledger records dimensions touched and parks oversized ideas in the icebox, so round 17 doesn't repeat round 3. An ad-hoc prompt restarts from zero every time. + +## Inputs + +| input | default | what it does | +|-------|---------|--------------| +| `target` | current working directory | repo path to polish. Must be the root of a git repository: a non-git target, or one nested inside another repo, is rejected before any work starts. | +| `rounds N` | 1 | how many rounds to run ("N rounds" or "keep going"). With N given, all N run without asking; after two consecutive thin brainstorms the loop stops itself early. | +| `focus` | none | a feature/path to spotlight (e.g. a just-shipped feature). Shapes generation in every lens and ranks in-focus candidates first — not just where the round grounds. | + +## What a round looks like + +1. **Ground** — read the product, recent commits and the ledger; dimensions never touched get priority. A non-git target is rejected up front, before any work is done. A repo with no README/docs grounds on entry-point code + tree instead — and says so in the round report, never improvising a product summary. +2. **Brainstorm (mandatory)** — 3 fresh subagents, each wearing a different lens (first-time user, picky daily user, maintainer-in-six-months, auditor, automation caller, …), each returning candidate angles; deduped against the ledger so nothing gets re-cooked. Without a subagent tool it falls back to three in-session, lens-forced passes. A run with `focus` spotlights that area in every lens's grounding. Still thin after widening the lenses? A good icebox idea that slices into the round cap gets promoted instead of letting the run stop early. +3. **Select one** — felt-impact × freshness ÷ cost, capped at ≤3 files / ≈100 lines per round. Bigger ideas → icebox. With `focus`, in-focus candidates rank first. +4. **Implement** — target-repo conventions, complete changes only, no TODO/mock leftovers. +5. **Verify** — the repo's own tests / build / lint / smoke; honest "verification pending" if the toolchain is missing; a repo with no verification surface at all gets a minimal manual smoke of the changed path (real command + observed output as evidence), or an honest `verification pending (no runnable surface)` when nothing can run; a red check gets fixed within the round cap or the round ships nothing: it is committed as `mabb #N: ` and immediately reversed by a second `mabb #N: revert` commit (never discarded — the failed diff stays in history), logged as failed — never shipped unverified. +6. **Record** — one commit per round (`mabb #N: `) plus a ledger entry (dimension, angle, who feels it, evidence). Before writing the ledger, its `.agents/` home is verified gitignored (`git check-ignore`; a missing rule is appended within the round), so agent working state never leaks into the commit. +7. **Loop** — ask-to-continue by default, N rounds on request; stops itself after two consecutive thin brainstorms rather than forcing weak changes. Every round closes with the same six-field report (angle / who feels it / what changed / evidence / icebox additions / next-round hint; empty fields say `none`), so rounds and repos stay comparable. When a run ends — N done, declined, or self-stopped — a four-field run summary closes it (`rounds:` / `changes:` / `icebox added:` / `leftovers:`), so a 5-round batch ends with totals instead of trailing off. A self-stop also overwrites the ledger's next-round hint with a dated `stalled` line (why it went thin, what to widen next) — the stop survives the conversation, and a later session can tell a stalled run from a finished one. + +## The ledger + +`.agents/mabb/ledger.md` in the target repo is the loop's memory. It prevents repeating old angles and carries a coverage view that keeps steering the brainstorm toward untouched dimensions. The icebox holds good-but-too-big ideas until you promote them to real projects — a round that lands one deletes its entry, so the icebox always lists what is still pending. Icebox entries carry short ids (`IB-1`, `IB-2`, …, stable once assigned), so reports, next-round hints and promotions cite an entry exactly instead of describing it. + +## Side effects (disclosed for review) + +- **Model calls**: each round spawns 3 short-lived brainstorm subagents (falls back to three in-session passes when the client has no subagent tool) — N rounds means ≈3N such calls. +- **Files**: writes the improvement itself in the target repo, plus the local ledger under `/.agents/mabb/`. +- **Git**: one local commit per round in the target repo (exactly two when a round fails: the round's commit, then its revert — the failed diff stays in history, nothing ships unverified). Shared/team repos get a branch proposal first — never a direct main commit. **Never pushes** to any remote unless you explicitly say push. +- **Network**: none beyond the model API. +- **Context**: the skill text is loaded whole by the executor every round, so it carries a soft cap (150 lines) — growth past the cap pays for itself by distilling existing lines, keeping rounds loadable for small-context agents. + +## Install + +**DSH** — this repo is a DSH bundle: one package mounts the `make-it-a-bit-better` skill (pure skill — no MCP server, no runtime dependencies). Requires DSH `>=0.2.1-rc.2 <0.3.0`. + +```bash +# From a checkout +dsh plugin add /path/to/make-it-a-bit-better + +# Once published +dsh plugin add make-it-a-bit-better +``` + +**ZCode** — the same repo doubles as a ZCode plugin (`.zcode-plugin/plugin.json` + `skills/`): install it from any marketplace that lists it — for a local tryout, a dev marketplace pointing at a checkout works. + +## Quick start + +With the plugin installed: + +> Run 3 rounds of make it a bit better on /path/to/repo + +Or with the steering wheel: point it at a repo, ask for N rounds, spotlight one area: + +> Run 5 rounds of make it a bit better on /path/to/repo, focusing on the checkout flow + +Expect: a ledger row per round and up to N committed small improvements — *up to*, because the loop self-stops after two consecutive thin brainstorms (the ledger gets a dated `stalled` line) and a red check it can't fix is reverted (a `failed, reverted` row, nothing shipped). Fewer commits than N is the loop being honest, not broken. An icebox appears only when the brainstorm produced ideas too big for one round. + +## What's new + +**0.2.4** — quick-start expectation corrected back to "up to N committed small improvements"; `.gitignore` template leftovers dropped. Full history: [CHANGELOG.md](CHANGELOG.md). + +## License + +MIT © Lumos-789 diff --git a/external_plugins/make-it-a-bit-better/README_CN.md b/external_plugins/make-it-a-bit-better/README_CN.md new file mode 100644 index 00000000..1e02da76 --- /dev/null +++ b/external_plugins/make-it-a-bit-better/README_CN.md @@ -0,0 +1,79 @@ +

make-it-a-bit-better 图标

+ +

make-it-a-bit-better(好一点点)

+ +

一轮好一点点,轮次积累成产品进步。

+ +一个跑自主产品打磨循环的 skill 插件。每轮**强制开一场新头脑风暴**(3 个视角强制的子代理),**择一个小角度**,实现、验证并提交,落账到项目级 ledger。一轮装不下的好想法进 **icebox**,不硬塞。哲学就是名字本身:不做重写——一轮好一点点,轮次积累成产品进步。 + +## 为什么不直接让 agent「优化一下」? + +即兴 prompt 也能改出一段代码,但给不了这个循环的三个结构保证: + +- **每轮强制新风暴** — 3 个强制视角在上一轮的框架之外重新生成候选,再按账本去重;即兴 prompt 只会重炒模型上次说过的话。 +- **一个小而验证过的改动** — ≤3 文件 / ≈100 行,真实检查必须通过,检查红了就回滚而不是带伤提交;即兴 prompt 优化的是「看起来做完了」。 +- **跨轮记忆** — 账本记录碰过的维度、把超格想法停在冰柜,第 17 轮不会重复第 3 轮;即兴 prompt 每次从零开始。 + +## 输入 + +| 输入 | 默认 | 作用 | +|------|------|------| +| `target` | 当前工作目录 | 要打磨的仓路径。必须是 git 仓的根目录——非 git 目标、或嵌在别人的仓里的子目录,动工前就被拦下。 | +| `rounds N` | 1 | 跑几轮(说「N 轮」或「继续」皆可)。给了 N 就连跑满 N 轮不再询问;连续两轮风暴出不了合格候选会提前自停。 | +| `focus` | 无 | 要聚光的功能/路径(如刚上线的功能)。贯穿每个视角的风暴生成,区内候选排序优先——不只是接地时看一眼。 | + +## 一轮长什么样 + +1. **接地** — 读产品、最近提交和账本;从没碰过的维度本轮优先。非 git 目标仓在动工前就被拦下。目标仓没有 README/文档时,接地降级为入口代码 + 目录树,并在轮报里说明——绝不凭空即兴编一段产品摘要。 +2. **风暴(强制)** — 3 个新上下文子代理各戴一个视角镜头(初见用户、挑剔的日常用户、半年后的维护者、审查者、脚本调用方……),各自产出候选角度;按账本去重,不炒冷饭。客户端没有子代理工具时,退化为会话内三趟视角强制风暴。带 `focus` 的运行,每个视角的接地摘要都聚光该区。宽想之后还是瘦?冰柜里能切成单轮上限的好想法会被晋升落地,而不是让运行提前自停。 +3. **择一** — 按感知面 × 新鲜度 ÷ 成本排序,单轮硬上限 ≤3 文件 / ≈100 行;超格好想法进 icebox。带 `focus` 时区内候选优先。 +4. **落地** — 遵守目标仓自身规范,只留完整改动,不留 TODO / mock。 +5. **验证** — 用目标仓自己的测试 / 构建 / lint / 冒烟;工具链缺失时如实报「验证待补」,不谎报;目标仓压根没有验证面(区别于工具链缺失)时,最低手动冒烟改动路径(真实命令 + 实际输出作为证据),实在无可执行对象(纯文档/文案改动)就如实落 `verification pending(无可执行验证面)`;检查红了先在单轮上限内修,修不好就零带伤离场:先以 `mabb #N: <角度>` 提交本轮改动,再以第二个 `mabb #N: revert` commit 原地反转(绝不 discard——失败 diff 留在历史里),落一条 failed 账——失败轮恰好两个 commit,绝不带伤提交。 +6. **落账** — 一轮一 commit(`mabb #N: <角度>`)+ 一条账本记录(维度、角度、谁会感知、证据)。写账前用 `git check-ignore` 核实账本的 `.agents/` 位置已被忽略,缺规则就当轮补上(计入文件上限),agent 工作态绝不混进轮次 commit。 +7. **续轮** — 默认问一次是否继续,给了 N 就连跑;连续两轮风暴出不了合格候选就自停,不硬凑弱改动。每轮以同构的 6 字段轮报收尾(角度 / 谁感受到 / 改了什么 / 证据 / icebox 新增 / 下轮提示;空字段写 `none` 不缺行),跨轮跨仓可比较。整场运行收尾(N 轮跑满、用户不续或自停)再以 4 字段运行总结块落幕(`rounds:` / `changes:` / `icebox added:` / `leftovers:`)——5 轮批量跑完有底线汇总,而非不了了之。自停时账本的「下轮提示」也会被改写为一行带日期的 `stalled`(为何贫瘠、下轮先宽想什么)——自停事实留档在对话之外,后续会话能区分「贫瘠自停」与「正常跑完」。 + +## 账本 + +目标仓的 `.agents/mabb/ledger.md` 是循环的记忆:防重复旧角度,覆盖视图逼着风暴往没碰过的维度去。icebox 存好但超格的想法,等你拍板升级成正式需求——某轮落地即销账,冰柜永远只列还没做的。冰柜条目带短 id(`IB-1`、`IB-2`……一旦分配不再变),轮报、下轮提示与晋升引用精确到条,不再靠描述性指认。 + +## 副作用披露(供评审) + +- **模型调用**:每轮派 3 个短命头脑风暴子代理(无子代理工具的客户端退化为会话内三趟)——N 轮约 3N 次这样的调用。 +- **文件**:在目标仓写改动本身,外加本地账本 `/.agents/mabb/`。 +- **Git**:每轮在目标仓落一个本地 commit(失败轮恰好两个:本轮 commit + 其 revert——失败 diff 留在历史,零带伤提交);多人协作仓先提分支方案再动,绝不直提主干;**绝不 push**,除非你当次明说。 +- **网络**:除模型 API 外无任何访问。 +- **上下文**:技能文本每轮被执行 agent 整读,故带软顶(150 行)——超顶的增长须以蒸馏现有行来抵偿,小上下文 agent 永远装得下一轮。 + +## 安装 + +**DSH**——本仓即 DSH bundle:一个包挂载 `make-it-a-bit-better` 技能(纯技能——无 MCP server、无运行时依赖)。需要 DSH `>=0.2.1-rc.2 <0.3.0`。 + +```bash +# 从 checkout 安装 +dsh plugin add /path/to/make-it-a-bit-better + +# 发布后 +dsh plugin add make-it-a-bit-better +``` + +**ZCode**——同一仓库兼作 ZCode 插件(`.zcode-plugin/plugin.json` + `skills/`):从任一收录它的插件市场安装;本地试用可让 dev 市场指向一份 checkout。 + +## 快速开始 + +装好插件后: + +> 对 /path/to/repo 跑 3 轮 make it a bit better + +也可以带上方向盘:指定仓、要 N 轮、聚光一个区域: + +> 对 /path/to/repo 跑 5 轮 make it a bit better,focus 在结账流程 + +预期:每轮一条账本记录,最多 N 个已提交的小改进——说「最多」是因为连续两轮风暴贫瘠会自停(账本留一行带日期的 `stalled`),检查红了修不好就整轮回滚(落一条 `failed, reverted`,零带伤提交)。commit 数少于 N 是循环在诚实,不是坏了。只有风暴产出超格想法时才会出现 icebox。 + +## 版本历史 + +**0.2.4** — 快速开始预期改回「最多 N 个已提交的小改进」;删除 `.gitignore` 模板残留。完整历史见 [CHANGELOG.md](CHANGELOG.md)。 + +## 许可 + +MIT © Lumos-789 diff --git a/external_plugins/make-it-a-bit-better/assets/make-it-a-bit-better/icon.png b/external_plugins/make-it-a-bit-better/assets/make-it-a-bit-better/icon.png new file mode 100644 index 00000000..89c91369 Binary files /dev/null and b/external_plugins/make-it-a-bit-better/assets/make-it-a-bit-better/icon.png differ diff --git a/external_plugins/make-it-a-bit-better/assets/make-it-a-bit-better/icon.svg b/external_plugins/make-it-a-bit-better/assets/make-it-a-bit-better/icon.svg new file mode 100644 index 00000000..04820f36 --- /dev/null +++ b/external_plugins/make-it-a-bit-better/assets/make-it-a-bit-better/icon.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/external_plugins/make-it-a-bit-better/cordis.patch.yml b/external_plugins/make-it-a-bit-better/cordis.patch.yml new file mode 100644 index 00000000..b5a4b848 --- /dev/null +++ b/external_plugins/make-it-a-bit-better/cordis.patch.yml @@ -0,0 +1,3 @@ +- insert: + - id: make-it-a-bit-better + name: make-it-a-bit-better diff --git a/external_plugins/make-it-a-bit-better/index.js b/external_plugins/make-it-a-bit-better/index.js new file mode 100644 index 00000000..9fee05fd --- /dev/null +++ b/external_plugins/make-it-a-bit-better/index.js @@ -0,0 +1,17 @@ +import { fileURLToPath } from "node:url"; +import { apply as applySkillFilesystem } from "@deepseek-ai/dsh-skill-filesystem"; + +const skillsRoot = fileURLToPath(new URL("./skills/", import.meta.url)); + +export const name = "make-it-a-bit-better"; +export const inject = ["skills"]; + +export function apply(ctx) { + applySkillFilesystem(ctx, { + providerName: name, + includeDefaultRoots: false, + bundledSkillDir: skillsRoot, + watch: false, + }); + return ctx; +} diff --git a/external_plugins/make-it-a-bit-better/skills/make-it-a-bit-better/SKILL.md b/external_plugins/make-it-a-bit-better/skills/make-it-a-bit-better/SKILL.md new file mode 100644 index 00000000..f7ec00d2 --- /dev/null +++ b/external_plugins/make-it-a-bit-better/skills/make-it-a-bit-better/SKILL.md @@ -0,0 +1,117 @@ +--- +name: make-it-a-bit-better +description: Autonomous product-polish loop. Every round MUST open a fresh brainstorm, pick ONE small angle that makes the product a bit better, implement, verify and commit it, then log the round in a per-project ledger. Use when the user says "make it a bit better", "polish it", "iterate a few rounds", "打磨", "好一点点", "让它好一点", "持续改进", "再优化几轮", or asks to iteratively improve a product or feature one small step at a time. +metadata: + short-description: One small brainstormed improvement per round, committed and logged +--- + +# Make It a Bit Better (mabb) + +An incremental product-polish loop. Each round: **brainstorm → pick ONE small angle → implement → verify → commit → log**. No rewrites, no big-bang redesigns — a product gets better one small, felt improvement at a time, round after round. + +## Inputs + +- **target** — repo path (default: current working directory) +- **rounds N** — how many rounds to run (default 1; the user may say "N rounds" or "keep going") +- **focus** — optional feature/path to examine (e.g. a just-shipped feature) + +## Round protocol — run every step, in order, every round + +### 1. Ground + +- Read the product's README/docs entry, `git log --oneline -15`, and a quick tree overview. With `focus` given, ground mainly on that area. +- No README/docs entry at all (scripts, small tools — common)? Degrade grounding to the entry-point code (main/module entry) plus the directory tree, and say so in that round's report — grounding degrades honestly; a product summary improvised from nothing is fabrication, not grounding. +- Read the ledger at `/.agents/mabb/ledger.md` if it exists; its `Dimensions touched` line and `Next round` hint (either may be absent in older ledgers — reconcile from the table then) steer this round, and dimensions never touched get brainstorm priority. No ledger yet → this is round 1; otherwise the round number is the ledger's max `#` + 1. +- Repo gate (fail-loud): confirm `` is the root of a git repository — `git -C rev-parse --show-toplevel` must resolve to `` itself, not to a parent. A target nested inside someone else's repo fails the gate: stop before any work, report both paths (`` and the resolved top level), and ask which one the round should run in. mabb records rounds as commits, so a non-git target cannot be recorded; never `git init` on the user's behalf or drift to a nearby directory that does have `.git`. +- Repo safety: if the target is a shared/team repo (protected main, MR flow), propose a branch and get the user's confirmation before the first commit. Never commit to main directly in such repos. + +### 2. Brainstorm (mandatory — never skip, never thin) + +- Draw **3 lenses** from the lens pool below; exclude lenses used in the previous round (the ledger records them). +- Spawn **3 fresh subagents in parallel**, one per lens. Each receives: a 5–10 line product grounding summary, the ledger's past angles, the dimension seeds, and its lens. Each returns **3–5 candidates**, one line each: + `angle — who feels it (persona + moment) — one-line rationale — cost S/M/L` +- Merge in-session; drop anything already in the ledger or icebox; you may add your own candidates. +- With `focus` given: spotlight that area in each lens's grounding summary, and ask every lens for ≥1 in-focus candidate — focus must shape generation, not just Ground. +- If the client has no subagent tool: still brainstorm — write three separate passes, one per lens, each yielding ≥3 candidates. Perspective-forced fresh generation every round is the point. +- Fewer than 6 distinct surviving candidates → widen the lenses and go again. Never select from a thin list. Still thin after widening → before heading for the early stop, check the ledger's icebox for a good idea that slices into the round cap (≤3 files / ≈100 lines); promoting a slice keeps the round real, and nothing slice-able leaves the honest stop standing. + +### 3. Select ONE + +- Rank by felt-impact × freshness ÷ cost. Take the top. +- With `focus` given, rank in-focus candidates first; pick out-of-focus only when no in-focus candidate survived, and say so in the round report. +- **"A bit better" cap**: one round changes ≤3 files or ≈100 lines, whichever binds first (docs/copy-only rounds may exceed with one stated sentence of reason). If the top candidate exceeds the cap, move it to the ledger's **icebox** and take the next. +- The chosen angle must name a concrete "who feels it". If it can't, it is probably a refactor in disguise — icebox it. + +### 4. Implement + +- Follow the target repo's conventions and instruction files (AGENTS.md / CLAUDE.md / CONTRIBUTING). +- Read every file before editing. Complete changes only — no TODO, mock, placeholder or "temporary path". + +### 5. Verify + +- Use the repo's own verification surface: tests, build, lint, type-check, or a real smoke run. At least one real check must pass. +- If the toolchain is unavailable, report "verification pending" honestly in the round report — never claim verified. +- No verification surface at all (the repo simply has no tests/build/lint — distinct from a missing toolchain)? Smoke the changed path by hand: run the real command and record it plus the observed output as evidence. Nothing runnable (e.g. a pure docs/copy change) → log `verification pending (no runnable surface)` and say so — still never claim verified. +- Check failed after implementing? Fix it within the round's ≤3-file/≈100-line cap. Still failing: ship nothing — commit the round's change as `mabb #N: `, then a second commit `mabb #N: revert` reversing it (at this point nothing is committed yet, so an uncommitted change gives a "reversing commit" nothing to reverse and discarding is forbidden — commit-then-revert keeps the failed diff and its failing check in history for the fix workflow; a failed round is exactly two commits). Log a normal ledger row citing the revert commit, change = `failed, reverted`, evidence = the failing check, and say so in the round report — shipping nothing beats shipping unverified. + +### 6. Record + +- Commit the change alone: `mabb #N: `, body line = who feels it + evidence. (A failed round commits nothing here — its round + revert commits were made in Verify; this step only writes its ledger row.) +- Update `/.agents/mabb/ledger.md` (create on first record): + +```markdown +# mabb ledger — + +| # | date | dimension | angle | who feels it | change | commit | evidence | +|---|------|-----------|-------|--------------|--------|--------|----------| +| 1 | 2026-11-03 | error-messages | ... | ... | ... | abc1234 | pytest 41 green | + +## Dimensions touched +- error-messages, microcopy — steer the next brainstorm toward untouched ones (accessibility, cost, …) + +## Next round +- + +## Icebox (good, too big for one round; a round that lands an entry deletes it) +- IB-1 (dimension) idea — why it matters — rough size M/L + +## Lenses used +- #1: first-time-user, auditor, automation-caller +``` + +- While recording, append this round's dimension to `Dimensions touched` and overwrite `Next round` with the current round report's hint — both are what the next round's Ground reads. +- A round that lands a promoted icebox idea deletes that entry in the same ledger update: the icebox is a pending list, and a landed idea's permanent record is its ledger row — an entry left behind reads as still-to-do and invites a duplicate round later. +- Icebox entries carry short ids: `IB-1`, `IB-2`, … — a new entry takes the next free id (current max + 1); ids are stable once assigned (never renumbered, never reused), and the round report, `Next round` hint and a promotion's ledger row cite entries by id instead of describing them. Ledgers started before ids keep working: id-less entries stay valid until they are edited or landed. +- Before writing the ledger, make sure it cannot leak into git history: `git -C check-ignore .agents/mabb/ledger.md` must exit 0 — if not, append a `.agents/` line to the target's `.gitignore` within this round (counts toward the ≤3-file cap). Never let a repo-convention `git add -A` sweep the untracked ledger into the round commit. +- The ledger is local working state by default; a team that wants shared history can deliberately un-ignore it — say so to the user once. + +### 7. Loop + +- End every round with a one-block round report of exactly six labeled fields, always this order, one per line: `angle:` / `who feels it:` / `what changed:` / `evidence:` / `icebox additions:` / `next-round hint:` — an empty field is written `none`, never dropped; `icebox additions:` lists each new entry as `IB-N (dimension) short name`. The fixed shape keeps reports comparable across rounds and repos, and lets an outer orchestrator parse them. +- Default: ask once "continue?". With N given: run all N. Stop early when 2 consecutive brainstorms yield no qualifying candidate — report "nothing worth a round right now" instead of forcing a weak change. That self-stop is itself recorded: overwrite the ledger's `## Next round` with a dated line `- stalled : two consecutive thin brainstorms, icebox held no slice — ` (no round row — nothing shipped), so a later Ground reads a stalled run as stalled instead of re-running the same doomed brainstorm. +- When a run ends — all N rounds done, the user declines to continue, or the loop self-stops after two consecutive thin brainstorms — close the whole run with a one-block run summary of exactly four labeled fields, always this order, one per line: `rounds:` (e.g. `3 run`, or `2 of 5 run, stopped after two consecutive thin brainstorms`) / `changes:` (commits and files across the run, e.g. `3 commits, 7 files`; a reverted round shows as `1 failed, reverted`) / `icebox added:` (count plus short names, or `none`) / `leftovers:` (the strongest thread worth a future round, or `none`). Empty fields are written `none`, never dropped. Same fixed-shape rationale as the round report: run totals stay comparable across runs and parseable by an outer orchestrator. +- Never push to any remote unless the user explicitly said push in this run. + +## Lens pool (draw 3, rotate) + +first-time user (day one) · picky daily user · maintainer in six months · competitor migrant · constrained user (weak network / old device / small screen) · auditor (security, privacy, compliance) · accessibility user · automation/script caller + +## Dimension seeds (ammunition, not a checklist) + +first-run & empty states · error messages & failure paths · microcopy (labels, buttons, tooltips) · defaults · speed, felt and real · feedback (loading, progress, confirmation) · consistency (terms, visuals, interactions) · discoverability · edge cases & input boundaries · undo & safety nets · docs & examples · trust & transparency (logs, observability) · cost (time, tokens, API calls) · accessibility · keyboard & power users · install & onboarding + +Free-form candidates that fit no seed are welcome — seeds steer coverage, they do not fence it. + +## Red lines + +- A rewrite or big refactor is not mabb — icebox it. +- Fixing an already-reported bug belongs to a fix workflow, not a round (an unreported rough edge is fair game). +- Pure reformatting / renames never count as a round. +- Every round must answer: **who feels this bit of better?** +- Shared/team repos: no direct commits to main; confirm branch strategy first. +- No unbounded loops: N rounds or an explicit "keep going" only. +- The skill text stays lean — executors load SKILL.md whole every round. Past the soft cap (150 lines), added lines must pay for themselves: distill or merge existing ones in the same commit, or the addition waits in the icebox. + +## Trial + +Suggested first prompt: *对 /path/to/repo 跑 2 轮 make it a bit better*, or in English *run 2 rounds of make it a bit better on /path/to/repo* — expect two brainstormed, small, verified, committed improvements and a ledger with 2 entries. diff --git a/marketplace.json b/marketplace.json index c7f09a06..7d1bc544 100644 --- a/marketplace.json +++ b/marketplace.json @@ -10,7 +10,10 @@ "url": "https://z.ai" }, "unlistedPlugins": [ - { "name": "openpencil", "source": "./external_plugins/openpencil" } + { + "name": "openpencil", + "source": "./external_plugins/openpencil" + } ], "plugins": [ { @@ -827,7 +830,9 @@ }, { "name": "excalidraw", - "componentTypes": ["ui"], + "componentTypes": [ + "ui" + ], "displayName": "Excalidraw", "displayName_i18n": { "en": "Excalidraw", @@ -850,7 +855,9 @@ "name": "photocraft", "icon": "https://cdn-zcode.z.ai/zcode/official-plugin/assets/photocraft/icon.png", "source": "./external_plugins/photocraft", - "componentTypes": ["ui"], + "componentTypes": [ + "ui" + ], "displayName": "PhotoCraft", "displayName_i18n": { "en": "PhotoCraft", @@ -877,7 +884,9 @@ "name": "vectorcraft", "icon": "https://cdn-zcode.z.ai/zcode/official-plugin/assets/vectorcraft/icon.png", "source": "./external_plugins/vectorcraft", - "componentTypes": ["ui"], + "componentTypes": [ + "ui" + ], "displayName": "VectorCraft", "displayName_i18n": { "en": "VectorCraft", @@ -904,7 +913,9 @@ "name": "pdfcraft", "icon": "https://cdn-zcode.z.ai/zcode/official-plugin/assets/pdfcraft/icon.png", "source": "./external_plugins/pdfcraft", - "componentTypes": ["ui"], + "componentTypes": [ + "ui" + ], "displayName": "PdfCraft", "displayName_i18n": { "en": "PdfCraft", @@ -931,7 +942,9 @@ "name": "designcraft", "icon": "https://cdn-zcode.z.ai/zcode/official-plugin/assets/designcraft/icon.png", "source": "./external_plugins/designcraft", - "componentTypes": ["ui"], + "componentTypes": [ + "ui" + ], "displayName": "DesignCraft", "displayName_i18n": { "en": "DesignCraft", @@ -958,7 +971,9 @@ "name": "wordcraft", "icon": "https://cdn-zcode.z.ai/zcode/official-plugin/assets/wordcraft/icon.png", "source": "./external_plugins/wordcraft", - "componentTypes": ["ui"], + "componentTypes": [ + "ui" + ], "displayName": "WordCraft", "displayName_i18n": { "en": "WordCraft", @@ -985,7 +1000,9 @@ "name": "gridcraft", "icon": "https://cdn-zcode.z.ai/zcode/official-plugin/assets/gridcraft/icon.png", "source": "./external_plugins/gridcraft", - "componentTypes": ["ui"], + "componentTypes": [ + "ui" + ], "displayName": "GridCraft", "displayName_i18n": { "en": "GridCraft", @@ -1012,7 +1029,9 @@ "name": "deckcraft", "icon": "https://cdn-zcode.z.ai/zcode/official-plugin/assets/deckcraft/icon.png", "source": "./external_plugins/deckcraft", - "componentTypes": ["ui"], + "componentTypes": [ + "ui" + ], "displayName": "DeckCraft", "displayName_i18n": { "en": "DeckCraft", @@ -1039,7 +1058,9 @@ "name": "cadcraft", "icon": "https://cdn-zcode.z.ai/zcode/official-plugin/assets/cadcraft/icon.png", "source": "./external_plugins/cadcraft", - "componentTypes": ["ui"], + "componentTypes": [ + "ui" + ], "displayName": "CADCraft", "displayName_i18n": { "en": "CADCraft", @@ -1066,7 +1087,9 @@ "name": "soundcraft", "icon": "https://cdn-zcode.z.ai/zcode/official-plugin/assets/soundcraft/icon.png", "source": "./external_plugins/soundcraft", - "componentTypes": ["ui"], + "componentTypes": [ + "ui" + ], "displayName": "SoundCraft", "displayName_i18n": { "en": "SoundCraft", @@ -1149,7 +1172,9 @@ }, "category": "developer-tools", "icon": "https://cdn-zcode.z.ai/zcode/official-plugin/assets/kicad/icon.png", - "componentTypes": ["ui"], + "componentTypes": [ + "ui" + ], "displayName": "KiCad", "displayName_i18n": { "en": "KiCad", @@ -1443,6 +1468,36 @@ "mcp", "verification" ] + }, + { + "name": "make-it-a-bit-better", + "source": "./external_plugins/make-it-a-bit-better", + "icon": "https://cdn-zcode.z.ai/zcode/official-plugin/assets/make-it-a-bit-better/icon.png", + "description": "An autonomous product-polish loop: every round opens a mandatory fresh brainstorm (3 perspective subagents), picks one small angle, implements, verifies and commits it, and logs it in a per-project ledger; oversized ideas go to an icebox. A bit better, round after round.", + "description_i18n": { + "en": "An autonomous product-polish loop: every round opens a mandatory fresh brainstorm (3 perspective subagents), picks one small angle, implements, verifies and commits it, and logs it in a per-project ledger; oversized ideas go to an icebox. A bit better, round after round.", + "zh-CN": "自主产品打磨循环:每轮强制开一场新头脑风暴(3 个视角子代理),择一个小角度实现、验证并提交,落账到项目级 ledger;超格好想法进 icebox。一轮好一点点,轮次积累成产品进步。" + }, + "version": "0.2.4", + "author": { + "name": "Lumos-789", + "url": "https://github.com/Lumos-789" + }, + "category": "productivity", + "keywords": [ + "polish", + "iteration", + "continuous-improvement", + "product", + "brainstorm", + "ux" + ], + "examplePrompts": [], + "examplePrompts_i18n": {}, + "displayName": "Make It a Bit Better", + "displayName_i18n": { + "zh-CN": "好一点点" + } } ] -} \ No newline at end of file +}