Skip to content

Commit 3531b98

Browse files
committed
Ship default action skills as first-party slash commands
Vanilla installs no longer need a sibling agents tree for default skills. Recipes spawn closed directors; convention skills stay use_skill-only.
1 parent fd9ac4e commit 3531b98

93 files changed

Lines changed: 5507 additions & 308 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ tmp/
1919
.tmp*
2020
worktree
2121
worktrees
22-
dispatch/
22+
/dispatch/
2323
evals/capability/results/*
2424
!evals/capability/results/baseline-0286.json
2525
evals/public/results/*

CHANGELOG.md

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,12 @@ parallel copies under `docs/` or `scripts/notes/`. At cut time: rename
2525

2626
### TUI
2727

28+
- **Model picker rows are model-first.** Each leaf is `model * [provider]`;
29+
`(current)` still marks the live session model. **Alt+D** persists the
30+
focused pair as the default (global `defaultProvider` + provider
31+
`defaultModel` + project-local selection) without switching the live
32+
session or closing the picker.
33+
2834
- **Settled permission and operator prompts no longer recap into the chat.**
2935
The overlay is the question; answering it used to leave a grey
3036
`permission` / `operator` card restating the same command and the chosen
@@ -44,6 +50,32 @@ parallel copies under `docs/` or `scripts/notes/`. At cut time: rename
4450
spawn catalog (`directorProfiles()`) lists the other 15 closed directors;
4551
the primary session is still Skywalker.
4652

53+
### Sub-agents
54+
55+
- **Tool-less mid-run narration is not a finished report.** A worker that
56+
stops tooling with Summary-only (or other incomplete) prose is not
57+
complete. The director injects one wrap-up nudge asking for the four
58+
headings (Summary / Findings / Blockers / Paths), then salvages as
59+
incomplete-report if the next tool-less turn is still missing the envelope.
60+
61+
### Plugins
62+
63+
- **First-party skills catalog is on out of the gate.** `corbits-skills`
64+
ships action slashes `/implement`, `/plan`, `/refactor`, `/review` (was
65+
`/code-review`), `/pull-request-review`, `/create-issue` (was
66+
`/linear-create`), `/scribe`, `/interview`, `/ast-grep`. Dispatch,
67+
git-rebase, linear-issue-workflow, style, philosophy, typescript, and
68+
opsh stay `use_skill` only (`user-invocable: false`). Draper and emil
69+
are not skills or slashes — closed directors via `task(agent=…)` only.
70+
`/plan` is the eng change-plan recipe (`task(agent="plan")`; does not
71+
implement or file tracker issues). `/create-issue` remains the tracker
72+
command: Linear MCP when available; otherwise `ask_operator` for the
73+
platform and persists `Preferred issue tracker` in `.corbits/MEMORY.md`
74+
(GitHub via `gh issue create`). Each recipe tells Skywalker to spawn
75+
closed directors — the operator types the slash; the primary does not
76+
do the work. Turn the catalog off in `/plugins` if you want those
77+
commands gone.
78+
4779
### Evals
4880

4981
- **Capability eval records `task` tool calls.** `taskToolCallCount` is derived
@@ -56,6 +88,14 @@ parallel copies under `docs/` or `scripts/notes/`. At cut time: rename
5688
baseline-0286 gate until a deliberate refreeze. Neither case proves
5789
compaction fired or that the primary skipped implementing the route.
5890

91+
### Session
92+
93+
- **Resume is keyed to this checkout's git toplevel.** Linked worktrees no
94+
longer share (or list) each other's sessions — `--git-common-dir` made
95+
every worktree show every other worktree's history. Sessions previously
96+
created from a worktree remain under the main checkout key; resume from
97+
the main path to recover them.
98+
5999
## [0.2.98] - 2026-08-17
60100

61101
Corrupt resume state no longer kills sessions, Codex quota errors name the

docs/ARCHITECTURE.md

Lines changed: 26 additions & 15 deletions
Large diffs are not rendered by default.

docs/IMPLEMENTATION.md

Lines changed: 16 additions & 14 deletions
Large diffs are not rendered by default.

docs/PLUGINS.md

Lines changed: 36 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
Status: **implemented** — the unified, manifest-driven system described below is
44
in place. Plugins self-describe with a `manifest` (`kind: web | command | tool`),
55
are auto-discovered (plus explicit `pluginPaths`), are wired in only when
6-
explicitly enabled, and are managed through the `/plugins` UI. The sections
6+
explicitly enabled (with one exception: a repo-origin plugin whose manifest
7+
sets `defaultEnabled: true` auto-enables when the settings key is missing),
8+
and are managed through the `/plugins` UI. The sections
79
below double as the reference for the system and the record of why it is shaped
810
this way. (The "Current state (the problem)" section is retained as the
911
historical motivation.)
@@ -17,7 +19,7 @@ registered in global settings (`pluginPaths`), so consent is global once granted
1719

1820
| Origin | Path | Auto-trusted? | Trust store |
1921
|---|---|---|---|
20-
| `repo` | Product-shipped `plugins/` next to the Corbits Code binary | Yes ||
22+
| `repo` | Product-shipped `plugins/` next to the source root, `dist/plugins`, or `dirname(execPath)/plugins` — never session cwd | Yes ||
2123
| `user` | `~/.corbits/plugins/` | Yes (user home) ||
2224
| `user` (Claude) | Absolute `installPath` under `~/.claude/plugins/` from `installed_plugins.json` when `settings.discoverClaudePlugins` is true | Yes (user home; still disabled until enable; data-only load only) ||
2325
| `project` | `<cwd>/.corbits/plugins/` | **No** — per working directory | `~/.corbits/trust/<cwd-hash>.json` |
@@ -152,7 +154,7 @@ A module with no valid manifest is ignored (not silently half-loaded).
152154

153155
```
154156
discoverPlugins(cwd) =
155-
repo plugins/ (built-in)
157+
repo plugins/ (built-in: source root / dist/plugins / dirname(execPath)/plugins — never session cwd)
156158
+ <cwd>/.corbits/plugins/
157159
+ ~/.corbits/plugins/
158160
+ settings.pluginPaths (explicit file/dir paths, added via /plugins)
@@ -223,8 +225,11 @@ shape.
223225
### Command plugins and enable gating
224226

225227
- `command` plugins (`commandPlugin` export) register their slash commands only
226-
when `settings.plugins[id].enabled` is true, via `registerCommandPlugins`
228+
when the plugin is enabled, via `registerCommandPlugins`
227229
(`src/plugins/register.ts`); enabling one in `/plugins` wires it in live.
230+
Enablement is `settings.plugins[id].enabled === true`, except the Decision 3
231+
repo-origin `defaultEnabled` case below (the first-party `corbits-skills`
232+
catalog auto-enables when the settings key is missing).
228233
- Commands may also be authored as data-only markdown (see below).
229234
- Legacy `settings.workflowPlugins` / `agentPlugins` specifier arrays and their
230235
loaders are removed; everything flows through discovery + `pluginPaths`.
@@ -297,17 +302,29 @@ shape.
297302
exist. So a marketplace plugin (e.g. `agents/plugins/gaas`) loads as-is via
298303
`/plugins` add-by-path: its `agents/*.md` wire as profiles and its
299304
`skills/*/SKILL.md` resolve through `use_skill` with no porting.
300-
- **Skill-commands.** Every skill in an enabled plugin is also surfaced as a
305+
- **Skill-commands.** Skills in an enabled plugin are also surfaced as a
301306
`/<skill-name> [args]` slash command that sends the skill body (plus args) to
302-
the agent. `loadSkillCommands` (`src/plugins/skill-commands.ts`) synthesizes
303-
them; they merge into the same `commandPlugin` as `commands/*.md`. Frontmatter
307+
the agent, unless frontmatter sets `user-invocable: false`. `loadSkillCommands`
308+
(`src/plugins/skill-commands.ts`) synthesizes them and skips that tag; they
309+
merge into the same `commandPlugin` as `commands/*.md`. Untagged skills still
310+
become slashes (marketplace backward compatibility). Frontmatter
304311
`argument-hint` is preserved so the TUI can show greyed arg guidance (e.g.
305-
`/linear-create``[description] [--from-doc]`). This is an additional
312+
`/create-issue``[description] [--from-doc]`). This is an additional
306313
surface: `discoverSkills` is unchanged, so the model can still auto-invoke any
307-
skill via `use_skill` — the slash command is a direct user entry point on top.
308-
(An earlier revision gated this on the `disable-model-invocation`/
309-
`user-invocable` frontmatter tags; that gate was dropped so untagged skills
310-
like `linear-create` are reachable too.)
314+
skill via `use_skill` — including first-party recipes that are not operator
315+
slashes (`dispatch`, `git-rebase`, `linear-issue-workflow`, `style`,
316+
`philosophy`, `typescript`, `opsh`). The slash command is a direct user entry
317+
point on top.
318+
- **First-party catalog.** `plugins/corbits-skills/` (id `corbits-skills`,
319+
kind `command`, `defaultEnabled: true`) is the bundled skill catalog. Origin
320+
`repo` is auto-trusted. Auto-enable applies only when `origin === "repo"` AND
321+
`manifest.defaultEnabled` AND the settings key is missing; an explicit
322+
`enabled: false` still disables. Marketplace `defaultEnabled` is ignored.
323+
The id is not `gaas`, so a later marketplace plugin named gaas cannot replace
324+
the module. Slash-command registration is first-wins (built-ins, then plugins
325+
in discovery order: repo before user/project/path), so `/implement` stays
326+
first-party when both the catalog and a marketplace plugin are enabled.
327+
`discoverSkills` is already first-wins (plugin dirs before project).
311328
- **Mixed plugins wire both sides.** A plugin contributing agents AND commands
312329
(the common marketplace shape) infers `kind: "agent"` so profiles wire, and
313330
`isEnabledCommandPlugin` (`src/plugins/register.ts`) also wires commands for
@@ -352,10 +369,13 @@ loaded via `pluginPaths`.
352369
`settings.pluginPaths`.
353370
2. **`settings.web` stays** as the only kind-selector for now; generalize to
354371
`settings.active[kind]` only if another kind needs "exactly one active."
355-
3. **Always explicit enable.** Every discovered plugin (built-in or user-added)
356-
starts disabled. Nothing is wired in until `settings.plugins[id].enabled` is
357-
true — set in `/plugins`. (Note: this changes today's behavior where repo
358-
command plugins auto-load; they must now be enabled.)
372+
3. **Explicit enable, with one repo-origin exception.** Every discovered plugin
373+
starts disabled unless all of the following hold: `origin === "repo"`,
374+
`manifest.defaultEnabled` is true, and `settings.plugins[id]` is missing.
375+
Then it auto-enables. An explicit `enabled: false` still disables. Marketplace
376+
(user / project / path / claude) `defaultEnabled` is ignored — those plugins
377+
stay opt-in via `/plugins`. The first-party catalog `plugins/corbits-skills/`
378+
(id `corbits-skills`) is the plugin this exception exists for.
359379
4. **Tool plugins require explicit consent.** Enabling a `kind: "tool"` plugin
360380
prompts a one-time confirmation in `/plugins` before its tools are wired in
361381
(they run in-process — the highest-trust surface). Consent is recorded in

0 commit comments

Comments
 (0)