@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 +29 -5
- package/package.json +1 -1
- package/src/plugin-core.ts +30 -6
- package/vendor/commands/audit.md +2 -1
- package/vendor/commands/blocked.md +1 -1
- package/vendor/commands/close.md +1 -1
- package/vendor/commands/comments.md +1 -1
- package/vendor/commands/compact.md +1 -1
- package/vendor/commands/create.md +1 -1
- package/vendor/commands/decision.md +2 -2
- package/vendor/commands/delete.md +1 -1
- package/vendor/commands/dep.md +1 -1
- package/vendor/commands/epic.md +1 -4
- package/vendor/commands/export.md +2 -2
- package/vendor/commands/import.md +9 -75
- package/vendor/commands/init.md +1 -1
- package/vendor/commands/label.md +1 -1
- package/vendor/commands/list.md +1 -1
- package/vendor/commands/quickstart.md +2 -2
- package/vendor/commands/rename-prefix.md +2 -1
- package/vendor/commands/reopen.md +1 -1
- package/vendor/commands/restore.md +1 -1
- package/vendor/commands/search.md +1 -1
- package/vendor/commands/show.md +1 -1
- package/vendor/commands/sync.md +9 -101
- package/vendor/commands/update.md +1 -1
- package/vendor/manifest.json +47 -47
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.
|
|
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`
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
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",
|
package/src/plugin-core.ts
CHANGED
|
@@ -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
|
|
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
|
|
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.
|
|
325
|
-
.filter(
|
|
326
|
-
|
|
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
|
-
|
|
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
|
}
|
package/vendor/commands/audit.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Log and label agent interactions (append-only JSONL)
|
|
3
|
-
argument-hint:
|
|
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
|
+
|
package/vendor/commands/close.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Compact old closed issues using semantic summarization
|
|
3
|
-
argument-hint:
|
|
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: Record, list, and manage project decisions with rationale tracking
|
|
3
|
-
argument-hint:
|
|
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 (
|
|
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)
|
package/vendor/commands/dep.md
CHANGED
package/vendor/commands/epic.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Epic management commands
|
|
3
|
-
argument-hint:
|
|
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:
|
|
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
|
-
- **
|
|
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
|
|
3
|
-
argument-hint:
|
|
2
|
+
description: Import issues from JSONL format (removed)
|
|
3
|
+
argument-hint: (removed)
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
`bd import`
|
|
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
|
-
##
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
package/vendor/commands/init.md
CHANGED
package/vendor/commands/label.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Manage issue labels
|
|
3
|
-
argument-hint:
|
|
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).
|
package/vendor/commands/list.md
CHANGED
|
@@ -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://
|
|
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:
|
|
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-')
|
package/vendor/commands/show.md
CHANGED
package/vendor/commands/sync.md
CHANGED
|
@@ -1,109 +1,17 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: Synchronize issues
|
|
3
|
-
argument-hint:
|
|
2
|
+
description: Synchronize issues (deprecated — use bd dolt push/pull)
|
|
3
|
+
argument-hint: (deprecated)
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
`bd sync`
|
|
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
|
-
|
|
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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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
|
-
|
|
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.
|
package/vendor/manifest.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"repository": "https://github.com/gastownhall/beads.git",
|
|
4
|
-
"tag": "v1.2.
|
|
5
|
-
"commit": "
|
|
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":
|
|
25
|
-
"sha256": "
|
|
24
|
+
"bytes": 955,
|
|
25
|
+
"sha256": "8a7f942b3b94576f8503cba282c9144953991ab2a76926323ab6ee895d33b9c5"
|
|
26
26
|
},
|
|
27
27
|
{
|
|
28
28
|
"path": "commands/blocked.md",
|
|
29
29
|
"bytes": 561,
|
|
30
|
-
"sha256": "
|
|
30
|
+
"sha256": "14822b644bb93d9f038107aaccf1eb5112e3e0b1cb0b9c013cb6dffbfe570335"
|
|
31
31
|
},
|
|
32
32
|
{
|
|
33
33
|
"path": "commands/close.md",
|
|
34
|
-
"bytes":
|
|
35
|
-
"sha256": "
|
|
34
|
+
"bytes": 583,
|
|
35
|
+
"sha256": "413946f6210b743398e1510a9806ac1c51c6d6e994d020e7e122062cc69ffd97"
|
|
36
36
|
},
|
|
37
37
|
{
|
|
38
38
|
"path": "commands/comments.md",
|
|
39
|
-
"bytes":
|
|
40
|
-
"sha256": "
|
|
39
|
+
"bytes": 965,
|
|
40
|
+
"sha256": "9680911b297bdf24cb943c5dd7f71812cd60e0f9ef52a57bf1832110e02d5efc"
|
|
41
41
|
},
|
|
42
42
|
{
|
|
43
43
|
"path": "commands/compact.md",
|
|
44
|
-
"bytes":
|
|
45
|
-
"sha256": "
|
|
44
|
+
"bytes": 1081,
|
|
45
|
+
"sha256": "0fc6810f4e4da2d521d747c50c73e3a388bf16a94dc47ddf241a52826071d766"
|
|
46
46
|
},
|
|
47
47
|
{
|
|
48
48
|
"path": "commands/create.md",
|
|
49
|
-
"bytes":
|
|
50
|
-
"sha256": "
|
|
49
|
+
"bytes": 649,
|
|
50
|
+
"sha256": "f70104bd3792e5f005d0d7f2901c2b56da7f0136bf279f6d36e36d89b553bb93"
|
|
51
51
|
},
|
|
52
52
|
{
|
|
53
53
|
"path": "commands/decision.md",
|
|
54
|
-
"bytes":
|
|
55
|
-
"sha256": "
|
|
54
|
+
"bytes": 2662,
|
|
55
|
+
"sha256": "d62efc7e0d0bcd3a080e825b315acbf42c024d937382d8b8cf83b47016d4f908"
|
|
56
56
|
},
|
|
57
57
|
{
|
|
58
58
|
"path": "commands/delete.md",
|
|
59
|
-
"bytes":
|
|
60
|
-
"sha256": "
|
|
59
|
+
"bytes": 959,
|
|
60
|
+
"sha256": "90424c81aac3d2b12379820aa0b6f5e37a60a0da33474d28c66e0422b8361532"
|
|
61
61
|
},
|
|
62
62
|
{
|
|
63
63
|
"path": "commands/dep.md",
|
|
64
|
-
"bytes":
|
|
65
|
-
"sha256": "
|
|
64
|
+
"bytes": 3408,
|
|
65
|
+
"sha256": "2679ab80bfade1f6d4769ecef2575b196592c919cc36912e9fa8f29ab2a7d9f5"
|
|
66
66
|
},
|
|
67
67
|
{
|
|
68
68
|
"path": "commands/epic.md",
|
|
69
|
-
"bytes":
|
|
70
|
-
"sha256": "
|
|
69
|
+
"bytes": 858,
|
|
70
|
+
"sha256": "b31ffcfc2a423684f153042a0cb67b2d0472b63da594691b3c2656ed00cf2d6c"
|
|
71
71
|
},
|
|
72
72
|
{
|
|
73
73
|
"path": "commands/export.md",
|
|
74
|
-
"bytes":
|
|
75
|
-
"sha256": "
|
|
74
|
+
"bytes": 789,
|
|
75
|
+
"sha256": "dc021e36c11c3ad2724f3097c6f461221d77e5bd26296e6db65b8bd5f5190be0"
|
|
76
76
|
},
|
|
77
77
|
{
|
|
78
78
|
"path": "commands/import.md",
|
|
79
|
-
"bytes":
|
|
80
|
-
"sha256": "
|
|
79
|
+
"bytes": 401,
|
|
80
|
+
"sha256": "4f2b270a3f55d5b48f615864c07408bec3b339cd9ccab581e1e3c7c6ecd27e0e"
|
|
81
81
|
},
|
|
82
82
|
{
|
|
83
83
|
"path": "commands/init.md",
|
|
84
|
-
"bytes":
|
|
85
|
-
"sha256": "
|
|
84
|
+
"bytes": 751,
|
|
85
|
+
"sha256": "68413502bcb73f25cbf7505e3951967bffb8e125f6647e98018588558171abae"
|
|
86
86
|
},
|
|
87
87
|
{
|
|
88
88
|
"path": "commands/label.md",
|
|
89
|
-
"bytes":
|
|
90
|
-
"sha256": "
|
|
89
|
+
"bytes": 896,
|
|
90
|
+
"sha256": "82b702f10b31caf1c538119a5ae70603c88a7534de33bec2662b67a039a45572"
|
|
91
91
|
},
|
|
92
92
|
{
|
|
93
93
|
"path": "commands/list.md",
|
|
94
|
-
"bytes":
|
|
95
|
-
"sha256": "
|
|
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":
|
|
105
|
-
"sha256": "
|
|
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":
|
|
115
|
-
"sha256": "
|
|
114
|
+
"bytes": 599,
|
|
115
|
+
"sha256": "0315a4e4c8ddfd3ec6006f30f80de69c25d1cf3cab43d6bfa3d657b551437b60"
|
|
116
116
|
},
|
|
117
117
|
{
|
|
118
118
|
"path": "commands/reopen.md",
|
|
119
|
-
"bytes":
|
|
120
|
-
"sha256": "
|
|
119
|
+
"bytes": 593,
|
|
120
|
+
"sha256": "db2927072ffbc3dbde644a123f877e4cb9a46df87c1252ab1256f8fa1f75a41e"
|
|
121
121
|
},
|
|
122
122
|
{
|
|
123
123
|
"path": "commands/restore.md",
|
|
124
|
-
"bytes":
|
|
125
|
-
"sha256": "
|
|
124
|
+
"bytes": 712,
|
|
125
|
+
"sha256": "8cda7ebcaa572572cf55e4f1a2b15e028a01f7c373842c941c7f6fabbcecb4d2"
|
|
126
126
|
},
|
|
127
127
|
{
|
|
128
128
|
"path": "commands/search.md",
|
|
129
|
-
"bytes":
|
|
130
|
-
"sha256": "
|
|
129
|
+
"bytes": 3188,
|
|
130
|
+
"sha256": "5d07fd4bd26bd90a31f2d0c58b8e1245234f3a897c2d2fe326b5f372ea2a9ecd"
|
|
131
131
|
},
|
|
132
132
|
{
|
|
133
133
|
"path": "commands/show.md",
|
|
134
|
-
"bytes":
|
|
135
|
-
"sha256": "
|
|
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":
|
|
145
|
-
"sha256": "
|
|
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":
|
|
155
|
-
"sha256": "
|
|
154
|
+
"bytes": 868,
|
|
155
|
+
"sha256": "ff12a4ac6a686a11e2a029aac7070829051662027a868794717b1d3fee255d66"
|
|
156
156
|
},
|
|
157
157
|
{
|
|
158
158
|
"path": "commands/version.md",
|