@snarkipus/opencode-beads 0.9.3 → 0.10.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/README.md CHANGED
@@ -30,17 +30,21 @@ Add the version-pinned plugin to `~/.config/opencode/opencode.json`:
30
30
 
31
31
  ```json
32
32
  {
33
- "plugin": ["@snarkipus/opencode-beads@0.9.3"]
33
+ "plugin": ["@snarkipus/opencode-beads@0.10.0"]
34
34
  }
35
35
  ```
36
36
 
37
37
  Restart OpenCode. Update the pin explicitly when upgrading; an unpinned package entry is less reproducible.
38
38
 
39
+ ### 0.9.3 recovery notice
40
+
41
+ Version 0.9.3 contained command guidance from the withdrawn upstream Beads v1.2.1 release. This plugin did not bundle the `bd` binary or implement database migrations, but it could invoke a consumer-installed v1.2.1 binary through `bd prime`. Even one v1.2.1 execution could migrate the database. Upgrade the plugin package to 0.9.4 or later; if v1.2.1 was installed and may have run, also follow the [upstream database recovery guidance](https://github.com/gastownhall/beads/blob/v1.2.2/docs/RECOVERY-1.2.1.md).
42
+
39
43
  ## Context injection
40
44
 
41
45
  The plugin runs full `bd prime` when a primary-agent session first receives a message and after compaction. Prime supplies the canonical current workflow, command guidance, and persistent memories; the plugin adds only compact OpenCode-specific safety and delegation guidance.
42
46
 
43
- Known regular subagents remain excluded, including `explore` and `general`, while `beads-task-agent` remains eligible. If agent lookup fails, context injection fails open to preserve compatibility with unknown custom primary agents.
47
+ Known regular subagents remain excluded, including `explore` and `general`, while `beads-task-agent` and `beads-task-agent-luna` remain eligible. If agent lookup fails, context injection fails open to preserve compatibility with unknown custom primary agents.
44
48
 
45
49
  If `bd` is unavailable, the project is uninitialized, or prime fails or returns no content, injection is silently skipped and remains retryable. Vendored commands stay available, and the task agent retains a bounded standalone quick reference for `ready`, `show`, atomic claim, discovered follow-up, validate before closure, and close.
46
50
 
@@ -48,7 +52,7 @@ If `bd` is unavailable, the project is uninitialized, or prime fails or returns
48
52
 
49
53
  Vendored workflows are registered under `/beads:*`, including `/beads:ready`, `/beads:create`, and `/beads:show`. The plugin does not generate a command for every `bd` subcommand; use the CLI and the generated [Beads CLI reference](https://beads.gascity.com/cli-reference/index) for the complete surface.
50
54
 
51
- Explicit command and agent definitions in OpenCode configuration take precedence over plugin definitions with the same name. Exact `beads:*` or `beads-task-agent` collisions produce a grouped, rate-limited warning without preventing non-conflicting definitions from loading.
55
+ Explicit command definitions in OpenCode configuration replace plugin commands with the same name. Task-agent overrides merge field-by-field over plugin defaults, so a partial override does not discard the bounded prompt or subagent mode. Explicit fields (including `prompt`, `permission`, `tools`, `model`, `variant`, and `disable`) win; nested fields are replaced, not deep-merged. Conflicting `beads:*` commands or either named task-agent profile produce a grouped, rate-limited warning without preventing definitions from loading. An empty profile opt-in does not warn.
52
56
 
53
57
  ## Task agent
54
58
 
@@ -56,6 +60,26 @@ Explicit command and agent definitions in OpenCode configuration take precedence
56
60
 
57
61
  Its runtime prompt is a fork-owned bounded OpenCode adaptation. The vendored upstream task-agent artifact supplies metadata, provenance, and compatibility validation; it is not executed as upstream's autonomous multi-task loop.
58
62
 
63
+ ### Opt-in Luna Max profile
64
+
65
+ The default `beads-task-agent` leaves model and reasoning variant unset, preserving OpenCode's caller inheritance. To add the named Luna Max profile, merge this entry into your project `opencode.json` alongside the plugin entry:
66
+
67
+ ```json
68
+ {
69
+ "agent": {
70
+ "beads-task-agent-luna": {}
71
+ }
72
+ }
73
+ ```
74
+
75
+ The plugin fills this profile with `model: "openai/gpt-5.6-luna"` and `variant: "max"`, using exactly the same shared prompt, subagent mode, and inherited permissions/tools as the vanilla agent. Per-agent overrides remain independent: customizations to `beads-task-agent` are not copied to Luna. Both profiles get full prime context at startup and after compaction and retain the same exact-one-Bead workflow.
76
+
77
+ Choose `beads-task-agent-luna` explicitly as the task tool's `subagent_type` (or ask the primary agent to delegate to that name). Default delegation guidance still names `beads-task-agent`; enabling Luna does not reroute existing calls or change the primary agent's model/variant. No extra orchestrator or plugin-specific config file is involved.
78
+
79
+ Omit the Luna entry from the effective configuration to keep it unregistered; set `"disable": true` inside the entry to disable it using OpenCode's normal agent configuration. To undo the opt-in, remove the entry at its source and restart OpenCode; omission in a child project does not remove an ancestor/global entry. Explicit routing or prompt overrides are honored, so changing those fields opts out of the corresponding profile defaults.
80
+
81
+ Luna requires access to `openai/gpt-5.6-luna` and its `max` variant in your OpenCode provider setup. The plugin does not install models, configure authentication, or silently fall back to another model. Native Luna Max routing was verified on OpenCode 1.18.29; the plugin's general compatibility range is not a guarantee that every provider account exposes this model.
82
+
59
83
  ## Vendored content
60
84
 
61
85
  [`scripts/sync-beads.sh`](scripts/sync-beads.sh) copies the reviewed upstream command templates and task-agent artifact into `vendor/`. [`vendor/manifest.json`](vendor/manifest.json) pins the upstream tag and commit and records source paths, sorted inventory, byte lengths, and SHA-256 checksums. A deterministic adaptation layer translates reviewed host-specific instructions to OpenCode's CLI-only model.
@@ -67,10 +91,10 @@ Do not edit vendored files directly. Sync and package validation reject provenan
67
91
  | Component | Expected range | Validated baseline |
68
92
  | --- | --- | --- |
69
93
  | OpenCode | 1.18.3 through 1.x | 1.18.15 |
70
- | `bd` CLI | 1.0.5 through 1.x | 1.1.2 |
94
+ | `bd` CLI | 1.0.5 through 1.x | 1.2.2 |
71
95
  | Bun | >=1.3.14 | 1.3.14 |
72
96
 
73
- The adapter builds against paired `@opencode-ai/plugin` and `@opencode-ai/sdk` 1.18.15 releases and declares compatible optional peers from 1.18.3 through stable 1.x. Command and agent provenance is synced from Beads v1.2.1.
97
+ The adapter builds against paired `@opencode-ai/plugin` and `@opencode-ai/sdk` 1.18.15 releases and declares compatible optional peers from 1.18.3 through stable 1.x. Command and agent provenance is synced from Beads v1.2.2 at commit `6c124203e771433a3550c348771a5b5e27fd3c21`.
74
98
 
75
99
  ## Troubleshooting
76
100
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@snarkipus/opencode-beads",
3
- "version": "0.9.3",
3
+ "version": "0.10.0",
4
4
  "type": "module",
5
5
  "description": "A maintained OpenCode integration for the Beads issue tracker, including context injection, vendored workflows, and a task agent.",
6
6
  "author": "Matt Jackson",
@@ -1,4 +1,5 @@
1
1
  import type { Hooks } from "@opencode-ai/plugin";
2
+ import type { AgentConfig as AgentConfigV2 } from "@opencode-ai/sdk/v2";
2
3
  import type {
3
4
  Agent,
4
5
  SessionMessagesResponse,
@@ -11,6 +12,12 @@ import { PrimeTimeoutError } from "./prime";
11
12
  import { beadsGuidance, loadAgent, loadCommands } from "./vendor";
12
13
 
13
14
  const BEADS_TASK_AGENT = "beads-task-agent";
15
+ const BEADS_TASK_AGENT_LUNA = "beads-task-agent-luna";
16
+
17
+ /** Both named profiles use the same bounded task-agent context. */
18
+ function isBeadsTaskAgent(name: string | undefined): boolean {
19
+ return name === BEADS_TASK_AGENT || name === BEADS_TASK_AGENT_LUNA;
20
+ }
14
21
 
15
22
  type ChatMessageInput = Parameters<NonNullable<Hooks["chat.message"]>>[0];
16
23
  type SessionMessageResponse = SessionMessagesResponse[number];
@@ -99,7 +106,7 @@ function beadsContextAudience(text: string): InjectionAudience | undefined {
99
106
  }
100
107
 
101
108
  function injectionAudience(agentName: string | undefined): InjectionAudience {
102
- return agentName === BEADS_TASK_AGENT ? "task-agent" : "primary";
109
+ return isBeadsTaskAgent(agentName) ? "task-agent" : "primary";
103
110
  }
104
111
 
105
112
  /** Resolve OpenCode project scope without falling back to the process directory. */
@@ -160,7 +167,7 @@ export async function createBeadsController(
160
167
  agentName: string | undefined,
161
168
  sessionID: string
162
169
  ): Promise<boolean> {
163
- if (!agentName || agentName === BEADS_TASK_AGENT) return true;
170
+ if (!agentName || isBeadsTaskAgent(agentName)) return true;
164
171
 
165
172
  const availableAgents = await runtime.getAgents(directory).catch(async () => {
166
173
  await diagnoseSession("agents_lookup_failed", sessionID);
@@ -315,16 +322,29 @@ export async function createBeadsController(
315
322
  },
316
323
 
317
324
  async configure(config) {
325
+ // A named config entry opts in without another plugin option or config file.
326
+ const configuredAgents = { ...agents };
327
+ if (Object.hasOwn(config.agent ?? {}, BEADS_TASK_AGENT_LUNA)) {
328
+ configuredAgents[BEADS_TASK_AGENT_LUNA] = {
329
+ ...agents[BEADS_TASK_AGENT],
330
+ model: "openai/gpt-5.6-luna",
331
+ variant: "max",
332
+ } satisfies AgentConfigV2;
333
+ }
318
334
  const commandCollisions = Object.keys(config.command ?? {})
319
335
  .filter(
320
336
  (name) =>
321
337
  Object.hasOwn(commands, name) && config.command?.[name] !== commands[name]
322
338
  )
323
339
  .sort();
324
- const agentCollisions = Object.keys(config.agent ?? {})
325
- .filter(
326
- (name) => Object.hasOwn(agents, name) && config.agent?.[name] !== agents[name]
340
+ const agentCollisions = Object.entries(configuredAgents)
341
+ .filter(([name, defaults]) =>
342
+ defaults !== undefined &&
343
+ Object.entries(config.agent?.[name] ?? {}).some(
344
+ ([key, value]) => value !== defaults[key]
345
+ )
327
346
  )
347
+ .map(([name]) => name)
328
348
  .sort();
329
349
 
330
350
  await Promise.all(
@@ -341,7 +361,11 @@ export async function createBeadsController(
341
361
  );
342
362
 
343
363
  config.command = { ...commands, ...config.command };
344
- config.agent = { ...agents, ...config.agent };
364
+ const mergedAgents = { ...config.agent };
365
+ for (const [name, defaults] of Object.entries(configuredAgents)) {
366
+ mergedAgents[name] = { ...defaults, ...config.agent?.[name] };
367
+ }
368
+ config.agent = mergedAgents;
345
369
  },
346
370
  };
347
371
  }
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Log and label agent interactions (append-only JSONL)
3
- argument-hint: "record|label"
3
+ argument-hint: record|label
4
4
  ---
5
5
 
6
6
  Append-only audit logging for agent interactions (prompts, responses, tool calls) in `.beads/interactions.jsonl`.
@@ -25,3 +25,4 @@ Each line is one event. Labeling is done by appending a new `"label"` event refe
25
25
  - Audit entries are **append-only** (no in-place edits).
26
26
  - `bd dolt push` includes `.beads/interactions.jsonl` in the commit allowlist.
27
27
 
28
+
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Show blocked issues
3
- argument-hint: ""
3
+ argument-hint: []
4
4
  ---
5
5
 
6
6
  Show all issues that are blocked by dependencies.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Close a completed issue
3
- argument-hint: "[issue-id] [reason]"
3
+ argument-hint: [issue-id] [reason]
4
4
  ---
5
5
 
6
6
  Close a beads issue that's been completed.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: View or manage comments on an issue
3
- argument-hint: "[issue-id]"
3
+ argument-hint: [issue-id]
4
4
  ---
5
5
 
6
6
  View or add comments to a beads issue.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Compact old closed issues using semantic summarization
3
- argument-hint: "[--all] [--id issue-id] [--dry-run]"
3
+ argument-hint: [--all] [--id issue-id] [--dry-run]
4
4
  ---
5
5
 
6
6
  Reduce database size by summarizing closed issues no longer actively referenced.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Create a new issue interactively
3
- argument-hint: "[title] [type] [priority]"
3
+ argument-hint: [title] [type] [priority]
4
4
  ---
5
5
 
6
6
  Create a new beads issue. If arguments are provided:
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Record, list, and manage project decisions with rationale tracking
3
- argument-hint: "record|list|show|supersede"
3
+ argument-hint: record|list|show|supersede
4
4
  ---
5
5
 
6
6
  Record and track project decisions as beads issues with structured rationale, alternatives considered, and links to affected work.
@@ -9,7 +9,7 @@ Decisions use `--type decision`. The description field holds the structured deci
9
9
 
10
10
  ## Record a Decision
11
11
 
12
- When the user wants to record a decision (i.e. the `record` action of this command):
12
+ When the user wants to record a decision (or you invoke `bd decision record`):
13
13
 
14
14
  1. Gather the following (ask if not provided):
15
15
  - **Title**: Short summary of what was decided (required)
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Delete issues and clean up references
3
- argument-hint: "[issue-ids...] [--force]"
3
+ argument-hint: [issue-ids...] [--force]
4
4
  ---
5
5
 
6
6
  Delete one or more issues and clean up all references.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Manage dependencies between issues
3
- argument-hint: "[command] [from-id] [to-id]"
3
+ argument-hint: [command] [from-id] [to-id]
4
4
  ---
5
5
 
6
6
  Manage dependencies between beads issues.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Epic management commands
3
- argument-hint: "[command]"
3
+ argument-hint: [command]
4
4
  ---
5
5
 
6
6
  Manage epics (large features composed of multiple issues).
@@ -21,9 +21,6 @@ Manage epics (large features composed of multiple issues).
21
21
  1. Create epic: `bd create "Large Feature" -t epic -p 1`
22
22
  2. Link subtasks: `bd dep add bd-20 bd-10 --type parent-child` (task bd-20 is child of epic bd-10)
23
23
  - Or at creation: `bd create "Subtask title" -t task --parent bd-10`
24
- - Children inherit parent labels by default. If the epic uses size/effort
25
- labels and children should have their own, add `--no-inherit-labels`
26
- (GH#4562).
27
24
  3. Track progress: `bd epic status`
28
25
  4. Auto-close when done: `bd epic close-eligible`
29
26
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Export issues to JSONL format
3
- argument-hint: "[-o output-file]"
3
+ argument-hint: [-o output-file]
4
4
  ---
5
5
 
6
6
  Export all issues to JSON Lines format (one JSON object per line).
@@ -9,7 +9,7 @@ Export all issues to JSON Lines format (one JSON object per line).
9
9
 
10
10
  - **To stdout**: `bd export`
11
11
  - **To file**: `bd export -o issues.jsonl`
12
- - **Include all records**: `bd export --all -o full.jsonl`
12
+ - **Filter by status**: `bd export --status open`
13
13
 
14
14
  Issues are sorted by ID for consistent diffs, making git diffs readable.
15
15
 
@@ -1,84 +1,18 @@
1
1
  ---
2
- description: Import issues and memories from JSONL
3
- argument-hint: "[file|-] [--input file] [--dry-run] [--dedup] [--allow-stale]"
2
+ description: Import issues from JSONL format (removed)
3
+ argument-hint: (removed)
4
4
  ---
5
5
 
6
- `bd import` imports newline-delimited JSON into an existing Beads database.
7
- Issues with new IDs are created and existing IDs use guarded upsert semantics.
8
- The command is not supported in proxied-server mode.
6
+ `bd import` has been **removed**.
9
7
 
10
- ## Usage
8
+ ## Migration
9
+
10
+ If you need to import issues from a JSONL file, use `bd init` with the `--from-jsonl` flag:
11
11
 
12
12
  ```bash
13
- bd import # Read .beads/<import.path>
14
- bd import backup.jsonl # Read a specific file
15
- bd import --input backup.jsonl # Same as -i backup.jsonl
16
- bd import - # Read JSONL from stdin
17
- bd export --include-memories | bd import - # Round-trip issues and memories
18
- bd import --dry-run backup.jsonl # Parse and report without writing
19
- bd import --json backup.jsonl # Return a structured result
13
+ bd init <prefix> --from-jsonl issues.jsonl
20
14
  ```
21
15
 
22
- With no file argument, the source is the `import.path` file under `.beads/`;
23
- `import.path` defaults to `issues.jsonl`. Use either a positional file or
24
- `--input`/`-i`, not both. The special path `-` reads stdin. With `--global` and
25
- no file, the source is `global-issues.jsonl` in the active Beads directory.
26
-
27
- Each non-empty line must be a JSON object. Issue records accept the schema
28
- emitted by `bd export`; `title` is the only required issue field. Records with
29
- `"_type":"memory"` and non-empty `key` and `value` fields are imported as
30
- persistent memories. Optional export header records are ignored, and tombstone
31
- rows are skipped. `bd export` omits memories by default; add
32
- `--include-memories` or `--all` when they should be carried into an import.
33
-
34
- ## Merge and Safety Semantics
35
-
36
- For records that supply `updated_at`, an incoming row rewrites an existing
37
- issue only when its timestamp is strictly newer. Older records are skipped
38
- wholesale, including their labels, comments, and dependencies. When timestamps
39
- are equal, the local issue row wins, while those auxiliary records still merge.
40
- The stale check is repeated inside the upsert so a concurrent newer local update
41
- is not overwritten.
42
-
43
- If `updated_at` is omitted, the importer fills it with the current time during
44
- the write. A record naming an existing ID can therefore overwrite local state;
45
- include the exported timestamp when stale protection matters.
46
-
47
- Use `--allow-stale` only when deliberately restoring an older snapshot: it
48
- disables that guard and can overwrite newer local issue state. Imports are
49
- upserts, and labels, comments, and dependencies are deduplicated. Re-running
50
- canonical export data or other input with stable issue IDs and preserved
51
- `updated_at` values is safe and converges. Without a preserved timestamp, each
52
- run can appear newer and rewrite the row. An issue record without an ID is
53
- assigned one; re-importing it can create another issue instead of targeting the
54
- first.
55
-
56
- Large issue imports use bounded SQL transaction chunks. If one fails, the
57
- command exits nonzero and keeps the already committed prefix in the Dolt working
58
- set; no final import-summary Dolt commit is created. Re-run stable-ID input to
59
- resume only when its `updated_at` values are also preserved.
60
-
61
- After a successful non-dry import with accepted issue or memory records, the
62
- command calls `store.Commit` with an import summary regardless of the
63
- `dolt.auto-commit` policy. That commit can include unrelated pending working-set
64
- changes; in direct server mode, config (including memories) is excluded from
65
- this commit. When commit isolation matters, run `bd doctor` before importing and
66
- proceed only when its Dolt Status check reports a clean working set.
67
-
68
- The database must already exist; initialize or bootstrap it before importing.
69
- Use `--dry-run` to parse the input, apply optional title deduplication, and
70
- report issue and memory counts without writing. It does not run write-time field
71
- validation or predict stale skips and updates.
72
-
73
- ## Flags
16
+ ## Note
74
17
 
75
- - `--input`, `-i <file>`: read a specific file instead of a positional path.
76
- - `--dry-run`: report parsed record counts without writing.
77
- - `--dedup`: skip an input issue whose title exactly matches, ignoring case, an
78
- existing non-closed issue. Input rows are not compared with one another; if
79
- the existing-issue search fails, title filtering is skipped.
80
- - `--allow-stale`: import older rows too, allowing newer local state to be
81
- overwritten.
82
- - `--json`: use global JSON-output mode for structured counts and IDs. The
83
- `created` count is accepted issue rows, including existing rows, not only new
84
- inserts.
18
+ Dolt is the primary storage backend. Manual JSONL import is no longer supported as a standalone command.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Initialize beads in the current project
3
- argument-hint: "[prefix]"
3
+ argument-hint: [prefix]
4
4
  ---
5
5
 
6
6
  Initialize beads issue tracking in the current directory.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Manage issue labels
3
- argument-hint: "[command] [issue-id] [label]"
3
+ argument-hint: [command] [issue-id] [label]
4
4
  ---
5
5
 
6
6
  Manage labels on beads issues. Labels provide flexible cross-cutting metadata beyond structured fields (status, priority, type).
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: List issues with optional filters
3
- argument-hint: "[--status] [--priority] [--type] [--assignee] [--label]"
3
+ argument-hint: [--status] [--priority] [--type] [--assignee] [--label]
4
4
  ---
5
5
 
6
6
  List beads issues with optional filtering.
@@ -1,9 +1,9 @@
1
1
  ---
2
2
  description: Quick start guide for bd workflows (deprecated)
3
- argument-hint: ""
3
+ argument-hint: []
4
4
  ---
5
5
 
6
- **Note:** The `bd quickstart` command is deprecated. See the [Quick Start](https://beads.gascity.com/getting-started/quickstart) on the documentation site, or the in-repo source [docs/getting-started/quickstart.md](https://github.com/gastownhall/beads/blob/main/docs/getting-started/quickstart.md).
6
+ **Note:** The `bd quickstart` command is deprecated. See the [Quick Start](https://gastownhall.github.io/beads/getting-started/quickstart) on the documentation site, or the repo pointer [docs/QUICKSTART.md](../docs/QUICKSTART.md).
7
7
 
8
8
  The quickstart documentation covers:
9
9
  - Getting started with bd
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Rename the issue prefix for all issues
3
- argument-hint: "<new-prefix> [--dry-run]"
3
+ argument-hint: <new-prefix> [--dry-run]
4
4
  ---
5
5
 
6
6
  Rename the issue prefix for all issues in the database.
@@ -9,6 +9,7 @@ Updates all issue IDs and all text references across all fields.
9
9
 
10
10
  ## Prefix Rules
11
11
 
12
+ - Max length: 8 characters
12
13
  - Allowed: lowercase letters, numbers, hyphens
13
14
  - Must start with a letter
14
15
  - Must end with a hyphen (e.g., 'kw-', 'work-')
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Reopen closed issues
3
- argument-hint: "[issue-ids...] [--reason]"
3
+ argument-hint: [issue-ids...] [--reason]
4
4
  ---
5
5
 
6
6
  Reopen one or more closed issues.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Restore full history of compacted issue from git
3
- argument-hint: "<issue-id>"
3
+ argument-hint: <issue-id>
4
4
  ---
5
5
 
6
6
  Restore full history of a compacted issue from git version control.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Search issues by text query
3
- argument-hint: "<query> [--status] [--label] [--assignee]"
3
+ argument-hint: <query> [--status] [--label] [--assignee]
4
4
  ---
5
5
 
6
6
  Search issues across title, description, and ID with a simple text query.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Show detailed information about an issue
3
- argument-hint: "[issue-id]"
3
+ argument-hint: [issue-id]
4
4
  ---
5
5
 
6
6
  Display detailed information about a beads issue.
@@ -1,109 +1,17 @@
1
1
  ---
2
- description: Synchronize issues with a configured Dolt remote
3
- argument-hint: ""
2
+ description: Synchronize issues (deprecated — use bd dolt push/pull)
3
+ argument-hint: (deprecated)
4
4
  ---
5
5
 
6
- `bd sync` runs one full synchronization cycle against the configured Dolt
7
- remote: pull, check for merge conflicts, recompute the denormalized
8
- `is_blocked` flag, then push — retrying a bounded number of times when another
9
- replica wins the push race. It is the loop a multi-machine deployment otherwise
10
- hand-rolls in shell, and it is the verb to reach for on a sync timer.
6
+ `bd sync` is **deprecated** and is now a no-op.
11
7
 
12
- (This is not the old JSONL-era `bd sync`, which was removed in v0.51. Nested
13
- commands such as `bd backup sync` and the tracker-specific sync commands are
14
- separate commands and are unaffected.)
8
+ ## Use Dolt commands instead
15
9
 
16
- ```bash
17
- bd sync # sync with the default remote
18
- bd sync --remote mini # sync with a specific named remote
19
- bd sync --attempts 5 # allow more push-race retries (default 3)
20
- bd sync --json # machine-parseable outcome
21
- ```
22
-
23
- Exit codes are the machine contract, so a timer can branch on them without
24
- parsing output:
25
-
26
- | Code | Meaning |
27
- |------|---------|
28
- | `0` | Synced, or nothing to do |
29
- | `1` | Error (transport, auth, storage) |
30
- | `2` | Merge conflict — halted, nothing pushed; resolve it by hand |
31
- | `3` | Push-race retries exhausted — transient, retry on the next tick |
32
-
33
- Two properties are the point of the verb. Conflicts are detected **positively**,
34
- from the merge's own conflict rows and from Dolt's conflict tables — never
35
- inferred from the pull's exit status, which is untrustworthy in both directions.
36
- And a conflict sync cannot settle is **never** resolved by picking a side: it
37
- halts before recomputing or pushing, and keeps halting the same way until an
38
- operator resolves the divergence. (The pull underneath still auto-settles the
39
- convergent conflict classes it always has — machine-local metadata rows,
40
- audit-only dependency rows, last-write-wins on issue cells. Anything past those
41
- halts here.)
42
-
43
- The halt message says which state the halt left behind, because it depends on
44
- the pull route and both are real: the SQL route aborts the conflicted merge and
45
- restores the working set, while the CLI/git-protocol route leaves the conflict
46
- rows **live** for you. A conflict that was already live when sync started — from
47
- an earlier halted sync or a hand-run merge — halts before the pull instead, and
48
- says that too.
49
-
50
- The recompute between pull and push is not bookkeeping either — `is_blocked` is
51
- denormalized, so a dependency edge merged in from another replica leaves
52
- `bd ready` stale until it runs. It runs on every attempt, unconditionally:
53
- `bd recompute-blocked`'s full pass is specifically the repair that does *not*
54
- depend on a merge advancing HEAD, so it is what recovers a column left stale by
55
- a conflicted pull you resolved by hand — a state sync itself creates by exiting
56
- 2. Gating it on "did this tick merge anything" would mean that repair never runs
57
- again while every tick reports success.
58
-
59
- This is not `bd federation sync`, which syncs with named peer towns and takes a
60
- `--strategy ours|theirs` to resolve whatever conflicts it meets. `bd sync`
61
- targets the configured remote and has no such switch.
62
-
63
- `--json` reports `{"status", "attempts", "conflicts", "conflicts_live",
64
- "rows_corrected", "pushed"}` on every non-error exit; exit 1 emits bd's standard
65
- `{"error": ...}` envelope instead, so a timer reading `.status` must treat
66
- `null` as the error case (or just branch on the exit code, which is the point).
67
- A rig with no remote configured exits 0 with setup guidance; `dolt.local-only`
68
- and the `no-push` config flag are honored.
69
-
70
- ## The equivalent by hand
71
-
72
- ```bash
73
- # Before starting work or consuming changes from another clone
74
- bd dolt pull
75
-
76
- # After local issue updates and before handoff: commit, integrate, then publish
77
- bd dolt commit
78
- bd dolt pull
79
- bd dolt push
80
- ```
81
-
82
- `bd dolt commit` creates an explicit commit boundary when auto-commit is off or
83
- in batch mode; it is a safe no-op when there is nothing pending. The following
84
- pull integrates remote changes before the final push. The pull steps require a
85
- configured remote; use the one-time setup below first when needed.
86
-
87
- Inspect the configured Dolt remotes with:
88
-
89
- ```bash
90
- bd dolt remote list
91
- ```
92
-
93
- If no Dolt remote exists, the project has a Git origin, and remote sync is
94
- enabled, `bd dolt push` automatically adopts that origin; do not add the
95
- matching URL manually. To use a distinct custom Dolt remote, first confirm that
96
- the chosen name is absent, then add it explicitly:
97
-
98
- ```bash
99
- bd dolt remote add origin <distinct-dolt-remote-url>
100
- ```
10
+ - **Push to remote**: `bd dolt push`
11
+ - **Pull from remote**: `bd dolt pull`
12
+ - **Commit pending changes**: `bd dolt commit`
13
+ - **Check connection**: `bd dolt show`
101
14
 
102
15
  ## Note
103
16
 
104
- When enabled, `dolt.auto-commit` records successful writes in local Dolt
105
- history; it does not push them to a remote. Remote auto-push is a separate,
106
- opt-in setting and is disabled by default. Auto-push publishes committed HEAD
107
- only; it does not commit pending working-set writes when auto-commit is off or
108
- in batch mode. Keep an explicit commit boundary before handoff unless the
109
- project has a coordinated policy that provides one.
17
+ Most users should rely on the Dolt server's automatic sync (with `dolt.auto-commit` enabled) instead of running manual sync commands.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Update an issue's status, priority, or other fields
3
- argument-hint: "[issue-id] [status]"
3
+ argument-hint: [issue-id] [status]
4
4
  ---
5
5
 
6
6
  Update a beads issue.
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "repository": "https://github.com/gastownhall/beads.git",
4
- "tag": "v1.2.1",
5
- "commit": "634cbbc4bc580fa5124f63fdf65d137a46d5b4ff",
4
+ "tag": "v1.2.2",
5
+ "commit": "6c124203e771433a3550c348771a5b5e27fd3c21",
6
6
  "sources": [
7
7
  {
8
8
  "source": "plugins/beads/agents/task-agent.md",
@@ -21,78 +21,78 @@
21
21
  },
22
22
  {
23
23
  "path": "commands/audit.md",
24
- "bytes": 956,
25
- "sha256": "bf941ae72f3dfad0e5a0997c8afa1647d6ce17934692efa30e9fe4da98e39de8"
24
+ "bytes": 955,
25
+ "sha256": "8a7f942b3b94576f8503cba282c9144953991ab2a76926323ab6ee895d33b9c5"
26
26
  },
27
27
  {
28
28
  "path": "commands/blocked.md",
29
29
  "bytes": 561,
30
- "sha256": "30181c3645b5e233005facde694a3bb001c5935258745ae976abfe7b93eec346"
30
+ "sha256": "14822b644bb93d9f038107aaccf1eb5112e3e0b1cb0b9c013cb6dffbfe570335"
31
31
  },
32
32
  {
33
33
  "path": "commands/close.md",
34
- "bytes": 585,
35
- "sha256": "ef43e31c9f86082a6192ca131c175c55ee37dc115f4781413be11f1e85274b58"
34
+ "bytes": 583,
35
+ "sha256": "413946f6210b743398e1510a9806ac1c51c6d6e994d020e7e122062cc69ffd97"
36
36
  },
37
37
  {
38
38
  "path": "commands/comments.md",
39
- "bytes": 967,
40
- "sha256": "cad54141ee590be3b8d07878bb3ea34c252466bbb00a9b95d7d521303a8e3b83"
39
+ "bytes": 965,
40
+ "sha256": "9680911b297bdf24cb943c5dd7f71812cd60e0f9ef52a57bf1832110e02d5efc"
41
41
  },
42
42
  {
43
43
  "path": "commands/compact.md",
44
- "bytes": 1083,
45
- "sha256": "5204417505320501e2c5a529da6c670826ef5b62feab708a33b7452dfd6a80c4"
44
+ "bytes": 1081,
45
+ "sha256": "0fc6810f4e4da2d521d747c50c73e3a388bf16a94dc47ddf241a52826071d766"
46
46
  },
47
47
  {
48
48
  "path": "commands/create.md",
49
- "bytes": 651,
50
- "sha256": "1e27f3ff4f3ae041f6896b5181f0b0399ff80d52cd415dfd8cf6584a218736d3"
49
+ "bytes": 649,
50
+ "sha256": "f70104bd3792e5f005d0d7f2901c2b56da7f0136bf279f6d36e36d89b553bb93"
51
51
  },
52
52
  {
53
53
  "path": "commands/decision.md",
54
- "bytes": 2670,
55
- "sha256": "78c0de4a0979502cb553c2ad49df32cc1e6a7cb3eec25dc41f60290ad4fbbe36"
54
+ "bytes": 2662,
55
+ "sha256": "d62efc7e0d0bcd3a080e825b315acbf42c024d937382d8b8cf83b47016d4f908"
56
56
  },
57
57
  {
58
58
  "path": "commands/delete.md",
59
- "bytes": 961,
60
- "sha256": "a6a5e943cccc75c27820548ec4a810894be646604b98821822968c7cb55552eb"
59
+ "bytes": 959,
60
+ "sha256": "90424c81aac3d2b12379820aa0b6f5e37a60a0da33474d28c66e0422b8361532"
61
61
  },
62
62
  {
63
63
  "path": "commands/dep.md",
64
- "bytes": 3410,
65
- "sha256": "2d50ea5c65e0ce27bc076e77de5ea32de7086b34c6f49736e71517548cfe4b76"
64
+ "bytes": 3408,
65
+ "sha256": "2679ab80bfade1f6d4769ecef2575b196592c919cc36912e9fa8f29ab2a7d9f5"
66
66
  },
67
67
  {
68
68
  "path": "commands/epic.md",
69
- "bytes": 1027,
70
- "sha256": "174f54e3092e5a4b2f4c010e95418b13f1d910e185349ba0e131b04cf5783b8b"
69
+ "bytes": 858,
70
+ "sha256": "b31ffcfc2a423684f153042a0cb67b2d0472b63da594691b3c2656ed00cf2d6c"
71
71
  },
72
72
  {
73
73
  "path": "commands/export.md",
74
- "bytes": 800,
75
- "sha256": "5c8e9c9b4df71c804f489fa5785d607be971b7f62c836ad531f11e8b105ee47a"
74
+ "bytes": 789,
75
+ "sha256": "dc021e36c11c3ad2724f3097c6f461221d77e5bd26296e6db65b8bd5f5190be0"
76
76
  },
77
77
  {
78
78
  "path": "commands/import.md",
79
- "bytes": 4433,
80
- "sha256": "604e48e6d093d9a93f28a3a5ed7dd7946b10e7a4897bec8a88eefc5b6c9c776e"
79
+ "bytes": 401,
80
+ "sha256": "4f2b270a3f55d5b48f615864c07408bec3b339cd9ccab581e1e3c7c6ecd27e0e"
81
81
  },
82
82
  {
83
83
  "path": "commands/init.md",
84
- "bytes": 753,
85
- "sha256": "975759ee3d7ac6611fa54ae27c277a2995288a8fd089e6b46b791f73f3322177"
84
+ "bytes": 751,
85
+ "sha256": "68413502bcb73f25cbf7505e3951967bffb8e125f6647e98018588558171abae"
86
86
  },
87
87
  {
88
88
  "path": "commands/label.md",
89
- "bytes": 898,
90
- "sha256": "45f0422cce8764a19158a98e95b6b3c790e7a01b3438d9b5471ddb5f8c544129"
89
+ "bytes": 896,
90
+ "sha256": "82b702f10b31caf1c538119a5ae70603c88a7534de33bec2662b67a039a45572"
91
91
  },
92
92
  {
93
93
  "path": "commands/list.md",
94
- "bytes": 2628,
95
- "sha256": "990a0e6ef5af6a6ec596df32590750efd27fd231a44a0882d3f900dc71a4380f"
94
+ "bytes": 2626,
95
+ "sha256": "a986fdc0400c5e637f9e2103775f6b0c0297e48f96b0d2d1f8ecd15f14b7c524"
96
96
  },
97
97
  {
98
98
  "path": "commands/prime.md",
@@ -101,8 +101,8 @@
101
101
  },
102
102
  {
103
103
  "path": "commands/quickstart.md",
104
- "bytes": 537,
105
- "sha256": "de372b2dac3b1786ee383e8295bca781d6ce890db0daa09efa4d044325b80bbc"
104
+ "bytes": 469,
105
+ "sha256": "ee1d55aad65e7f5d293a394517964719b1bff1e4d7c92ccf55e2125608473bee"
106
106
  },
107
107
  {
108
108
  "path": "commands/ready.md",
@@ -111,28 +111,28 @@
111
111
  },
112
112
  {
113
113
  "path": "commands/rename-prefix.md",
114
- "bytes": 574,
115
- "sha256": "2e6a457dfe58a855daecc0581433584073d7b52565a9bdb85131d1b4a3d920e8"
114
+ "bytes": 599,
115
+ "sha256": "0315a4e4c8ddfd3ec6006f30f80de69c25d1cf3cab43d6bfa3d657b551437b60"
116
116
  },
117
117
  {
118
118
  "path": "commands/reopen.md",
119
- "bytes": 595,
120
- "sha256": "ea5535f0004d3137f05b6fc81cff1ecc670d918465b7d878eb6cb01d2427578c"
119
+ "bytes": 593,
120
+ "sha256": "db2927072ffbc3dbde644a123f877e4cb9a46df87c1252ab1256f8fa1f75a41e"
121
121
  },
122
122
  {
123
123
  "path": "commands/restore.md",
124
- "bytes": 714,
125
- "sha256": "94928e7b5d8ca1da80571e56685020f31eba6ce8fd38100cba09f00a051e164e"
124
+ "bytes": 712,
125
+ "sha256": "8cda7ebcaa572572cf55e4f1a2b15e028a01f7c373842c941c7f6fabbcecb4d2"
126
126
  },
127
127
  {
128
128
  "path": "commands/search.md",
129
- "bytes": 3190,
130
- "sha256": "2295d2cf34f0d7c3a74fab86f73aa312435870c97aa71d8c965486a450310085"
129
+ "bytes": 3188,
130
+ "sha256": "5d07fd4bd26bd90a31f2d0c58b8e1245234f3a897c2d2fe326b5f372ea2a9ecd"
131
131
  },
132
132
  {
133
133
  "path": "commands/show.md",
134
- "bytes": 563,
135
- "sha256": "51aa4b5a5bebeb9f1027f5a31a3de307dd8116052471f40272f0b2c980c720af"
134
+ "bytes": 561,
135
+ "sha256": "e170d3d532954aeea5c20eb2b1ea96625f17069d2cd6f9ff81317c05c13dda80"
136
136
  },
137
137
  {
138
138
  "path": "commands/stats.md",
@@ -141,8 +141,8 @@
141
141
  },
142
142
  {
143
143
  "path": "commands/sync.md",
144
- "bytes": 4964,
145
- "sha256": "09d999165b93ea183e5828c94d45498503ed179211db5f68b3c32f372ade9ac7"
144
+ "bytes": 493,
145
+ "sha256": "7ac9938d0e5ec0514edefc240971b4a0aade61cffca75efefac4011117d53ebb"
146
146
  },
147
147
  {
148
148
  "path": "commands/template.md",
@@ -151,8 +151,8 @@
151
151
  },
152
152
  {
153
153
  "path": "commands/update.md",
154
- "bytes": 870,
155
- "sha256": "34896bde7871805fb1941afd81a25ebc2ce1030090b8ce96afc63763bd2bd108"
154
+ "bytes": 868,
155
+ "sha256": "ff12a4ac6a686a11e2a029aac7070829051662027a868794717b1d3fee255d66"
156
156
  },
157
157
  {
158
158
  "path": "commands/version.md",