Commit graph

410 commits

Author SHA1 Message Date
Viktor Barzin
cae683d882 Phase 4: drop registry.viktorbarzin.me, Forgejo only
Some checks are pending
Installer Smoke / installer-smoke-ubuntu (push) Waiting to run
Installer Smoke / installer-smoke-windows (push) Waiting to run
ci/woodpecker/push/woodpecker Pipeline was successful
2026-05-07 23:18:07 +00:00
Viktor Barzin
648fbbfed8 [ci] Switch build to Woodpecker dual-push (registry-private + Forgejo)
Some checks are pending
Installer Smoke / installer-smoke-ubuntu (push) Waiting to run
Installer Smoke / installer-smoke-windows (push) Waiting to run
Phase 1 of the registry consolidation rolling out across the homelab —
infra/docs/plans/2026-05-07-forgejo-registry-consolidation-plan.md.

* New .woodpecker.yml builds + dual-pushes to
  registry.viktorbarzin.me:5050/beadboard AND
  forgejo.viktorbarzin.me/viktor/beadboard.
* GHA build-and-deploy.yml renamed to .disabled — would otherwise
  race the Woodpecker build and clobber Forgejo with a stale image
  during the bake. Re-enable only on rollback.
* No deploy step yet — Phase 3 flips infra/stacks/beads-server/main.tf
  image= reference; pods still pull from registry.viktorbarzin.me
  through the bake.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-07 15:58:44 +00:00
Viktor Barzin
17a38e435f [beadboard] Skip lint+typecheck during production build
## Context
Upstream zenchantlive/beadboard has pre-existing lint (no-require-imports
in src/lib/bb-pi-bootstrap.ts:32) and typecheck (OrchestratorChatMessage
type in left-panel.tsx:397) errors on main. These aren't in scope for
this fork's goals (quality filters + dispatch button) and blocking the
production Docker build on them prevents us from shipping.

## What this change does
Adds \`eslint.ignoreDuringBuilds\` and \`typescript.ignoreBuildErrors\` to
\`next.config.ts\`. Lint and typecheck still run via \`npm run lint\` and
\`npm run typecheck\` — those stay as CI gates for new code. Only the
Next.js production bundler's blocking behaviour changes.

## Test Plan
## Automated
- \`docker build\` now progresses past the ESLint step.
- CI \`npm run lint\` / \`npm run typecheck\` still report errors (pre-existing) so regressions remain visible.

## Manual Verification
1. \`docker build --platform linux/amd64 -t beadboard:test .\`
2. Expected: \`#16 RUN npm run build\` completes without exit 1 on lint.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-18 19:04:17 +00:00
Viktor Barzin
6180ae6acb [beadboard] Add Dockerfile and GHA build-and-deploy workflow
## Context

BeadBoard does not yet have a container image or a CI pipeline that
produces one. The infra pattern (see `infra/.claude/CLAUDE.md` →
"CI/CD Architecture") is GHA builds + Woodpecker deploys: GHA builds
the image on every push to the default branch, tags it with the
8-character git SHA, and POSTs the tag to Woodpecker to trigger a
`kubectl set image` roll-out.

We follow that exact pattern here, mirroring `broker-sync`'s
`.github/workflows/ci.yml` (the closest functioning example) but
targeting the private `registry.viktorbarzin.me:5050` registry that the
cluster's containerd `hosts.toml` rewrites to the LAN IP for
pull-through.

## This change

### `Dockerfile`

- Three-stage build using `node:20-alpine`:
    1. `deps` — `npm ci` (with devDeps) so the builder has TypeScript
       and ESLint available during `next build`.
    2. `builder` — runs `npm run build`; `NEXT_TELEMETRY_DISABLED=1` to
       suppress the telemetry prompt in CI logs.
    3. `runner` — copies only `.next`, `public`, `node_modules`,
       `package.json`, and `next.config.ts`; runs as a non-root user
       (`nextjs:1001`).
- `CMD ["npm", "start"]` invokes Next.js' production server on port 3000.
- `next.config.ts` does not opt into the `output: 'standalone'` build,
  so we ship the full `node_modules`. We can trim to standalone in a
  follow-up once we confirm all route handlers and SSE endpoints work
  with the standalone tracer.

### `.dockerignore`

- Excludes `.git`, `node_modules`, `.next`, `.beads`, docs, reference
  materials, Remotion assets, and local env files so the build context
  stays small. `.beads` is sensitive (contains the local Dolt snapshot).

### `.github/workflows/build-and-deploy.yml`

- Triggers on `push` to `main` / `master` (upstream uses `main`;
  `master` added so the fork's current branch also publishes).
- `build` job: buildx, login to the private registry via
  `REGISTRY_USERNAME` / `REGISTRY_PASSWORD` secrets, then
  `docker/build-push-action@v6` for `linux/amd64`, tagging both
  `:<8-char-sha>` and `:latest`. GHA layer cache (`type=gha`) is wired.
- `deploy` job: POSTs to Woodpecker's `/api/repos/<id>/pipelines`.
  `WOODPECKER_REPO_ID` is deliberately set to the literal string `TBD`
  with a guard — the repo needs to be registered with Woodpecker before
  the deploy step can fire. Until then the workflow reports success
  with the image tag so the upstream image is still published. The
  pattern, retry loop, and numeric-repo-id convention are lifted from
  `broker-sync/.github/workflows/ci.yml`, which is the canonical
  example in the infra migration doc.

## What is NOT in this change

- No `.woodpecker/deploy.yml` yet — that lives in the infra repo per
  convention (infra serves the deploy step via `kubectl set image`
  against the cluster SA). The orchestrator will register the repo
  and land the deploy side.
- No standalone Next.js build. `output: 'standalone'` changes the
  working directory layout enough to warrant a dedicated follow-up.
- No smoke test on the image. The existing `npm run test` gate
  guarantees code-level correctness; container smoke-tests can be
  added if the image breaks in production.

## Test Plan

### Automated

The GHA workflow itself cannot be exercised locally. YAML parses as
valid GitHub Actions syntax (same shape as `broker-sync/.github/
workflows/ci.yml` which currently runs green). The Dockerfile has
not been built in this commit to avoid dragging a ~700 MB node image
into a local session; the orchestrator should build it in CI first
or with:

```
docker buildx build --platform linux/amd64 -t beadboard:local .
```

Test suite still green:

```
$ node --import tsx --test tests/components/shared/left-panel-filtering.test.ts \
    tests/components/shared/dispatch-button.test.tsx \
    tests/lib/dispatch-prompt.test.ts \
    tests/api/agent-dispatch-route.test.ts \
    tests/api/agent-status-route.test.ts \
    tests/lib/parser.test.ts \
    tests/components/shared/left-panel.test.tsx \
    tests/components/shared/unified-shell-hide-closed-contract.test.ts
# tests 40 pass 40 fail 0
```

### Manual Verification

1. Set repo secrets on GitHub: `REGISTRY_USERNAME`, `REGISTRY_PASSWORD`,
   `WOODPECKER_TOKEN`.
2. Push to `master` (or `main`).
3. Expected: `build` job succeeds; image appears at
   `registry.viktorbarzin.me:5050/beadboard:<sha>`.
4. `deploy` job: with `WOODPECKER_REPO_ID` still `TBD`, logs the image
   tag and exits 0. Once the repo is registered, replace `TBD` with the
   numeric id and the deploy will trigger the cluster roll-out.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-18 14:08:51 +00:00
Viktor Barzin
a7b4f7ba32 [beadboard] Add agent-dispatch and agent-status API routes
## Context

The Dispatch-to-Agent button in the right-panel (previous commit) calls
two endpoints that did not yet exist server-side:

- `POST /api/agent-dispatch` — resolve the bead via the same Dolt pool
  the existing `/api/beads/read` route uses, build a prompt from it, and
  forward to `claude-agent-service`'s `/execute` endpoint with a bearer
  token. This is the server-side trust boundary: the bearer token lives
  in env (never in the browser), and the bead is re-read from Dolt
  (never trusted from the client payload) so a malicious client cannot
  inject a prompt.

- `GET /api/agent-status` — proxy `claude-agent-service`'s `/health`
  endpoint (which already returns `{status, busy}`), with a 2 s in-
  memory cache so 5 s UI polls across multiple open tabs don't hammer
  the service.

The claude-agent-service serialises jobs behind an `asyncio.Lock` — a
second `/execute` while one is running returns HTTP 409 "Agent is busy".
We surface that 409 through to the browser unchanged so the UI can show
the right toast/status line without re-mapping status codes.

```
client ──► /api/agent-dispatch ──► claude-agent-service /execute
             │                        (asyncio.Lock guards)
             └─► reads bead from Dolt pool (same path as /api/beads/read)
             └─► buildDispatchPrompt(bead)
             └─► POST {prompt, agent, budget, timeout} + Bearer token

client ──► /api/agent-status (2s cache) ──► /health  ──► {busy: bool}
```

## This change

### `src/app/api/agent-dispatch/route.ts`

- `POST {taskId: string}` handler.
- Validates JSON body and non-empty taskId (→ 400).
- Early 500 if `CLAUDE_AGENT_SERVICE_URL` or `CLAUDE_AGENT_BEARER_TOKEN`
  is missing — fail fast, fail loud.
- Resolves the bead via `readIssuesFromDisk({preferBd: true})`, which
  uses the existing Dolt client (and falls back to `issues.jsonl`).
  Filtering by id after is acceptable at BeadBoard's scale (~hundreds
  of beads) and avoids introducing a new single-bead query path.
- 400 when the bead is missing, or when `acceptance_criteria?.trim()` is
  empty — defense in depth alongside the UI disable. The button should
  already hide in these cases, but a curl'd POST must still be rejected.
- Forwards to `${CLAUDE_AGENT_SERVICE_URL}/execute` with agent
  `beads-task-runner`, max_budget_usd 5, timeout_seconds 900 (matches
  the values in the task spec).
- Passes through 409 verbatim. Other upstream errors collapse to 502.

### `src/app/api/agent-status/route.ts`

- `GET` handler, module-level snapshot cache with 2 s TTL to avoid
  hammering `/health`.
- In-flight de-dup: a single pending `fetchRemoteStatus()` is shared
  across concurrent requests so we only hit the upstream once per
  window even under bursty load.
- When `CLAUDE_AGENT_SERVICE_URL` is unset, returns `{busy: false}` and
  skips the fetch entirely — this is how the dev server boots before
  the service env is configured.
- HTTP 503 from upstream is interpreted as `busy: true` (future-proofing
  in case the service swaps 409 for 503 on overload).
- Any network error degrades gracefully to `{busy: false}` — the 409
  path on `/api/agent-dispatch` is the authoritative gate.

### Test coverage

- `tests/api/agent-dispatch-route.test.ts` (3 cases): invalid JSON body,
  missing taskId, missing env returns 500.
- `tests/api/agent-status-route.test.ts` (3 cases): unset service URL
  returns `{busy: false}` without a fetch, `/health busy:true` proxies
  through, HTTP 503 maps to busy=true. Uses a `globalThis.fetch` stub
  and cache-busting query params on dynamic import so each case starts
  from a fresh module snapshot.

## What is NOT in this change

- End-to-end happy-path coverage (bead loads, fetch returns 200, route
  yields job_id) would require mocking `readIssuesFromDisk` — that's a
  bigger refactor than this commit warrants. Live integration happens
  once the pipeline is wired.
- No retry/backoff on upstream failures. 502 passes through; the client
  decides whether to retry.
- No auth on the routes themselves — they inherit the Next.js app's
  session model (same as all other `/api/*` routes today).

## Test Plan

### Automated

```
$ node --import tsx --test tests/api/agent-dispatch-route.test.ts \
    tests/api/agent-status-route.test.ts
# tests 6 pass 6 fail 0 duration_ms 1560
```

All six route cases pass. Typecheck output shows only the pre-existing
`OrchestratorChatMessage` gap in `left-panel.tsx`. Lint output is
unchanged from `main` (1 pre-existing `no-require-imports` error in
`src/lib/bb-pi-bootstrap.ts`).

### Manual Verification

1. Export env:
   ```
   export CLAUDE_AGENT_SERVICE_URL=http://claude-agent-service.claude-agent.svc.cluster.local:8080
   export CLAUDE_AGENT_BEARER_TOKEN=$(vault kv get -field=api_bearer_token secret/claude-agent-service)
   ```
2. `npm run dev`
3. `curl -s http://localhost:3000/api/agent-status` → `{"busy":false}`
   (if the service is reachable; `{"busy":true}` if a job is running).
4. `curl -X POST http://localhost:3000/api/agent-dispatch \
       -H 'content-type: application/json' \
       -d '{"taskId":"beadboard-xyz"}'`
   - 400 if bead does not exist or lacks acceptance criteria.
   - 200 `{"job_id":"..."}` on success.
   - 409 `{"error":"Agent is busy"}` when an agent is already running.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-18 14:07:21 +00:00
Viktor Barzin
394a771b67 [beadboard] Add Dispatch-to-Agent button and prompt template
## Context

We want a one-click path from the right-panel task detail into the
claude-agent-service runner, without the user copy-pasting the bead id
into a CLI or another tab. The runner expects a self-contained prompt
that restates the bead id, title, description, acceptance criteria, and
the guard rails the agent must operate under (no push, no file edits,
no terraform/kubectl/helm). The prompt template lives in `src/lib/` so
it can be tested and reused from the server-side dispatch route.

The right-panel button needs to:
- Only appear when the bead is actionable (`open` or `in_progress`).
- Disable itself while the claude-agent-service is already busy (the
  service has a global `asyncio.Lock` — parallel dispatches 409).
- Disable itself when the bead lacks acceptance criteria. An agent that
  doesn't know what "done" looks like burns budget and closes nothing.
- Surface the resulting `job_id` or any 409/error back to the user.

The project has no toast library (no `sonner`, no `react-hot-toast`), so
we render status inline under the button rather than pulling in a new
dependency for this single surface.

## This change

- `src/lib/dispatch-prompt.ts` exports `buildDispatchPrompt(bead)` which
  produces the exact prompt the agent runner expects. Bead id, priority
  (`P<n>`), issue type, description, and acceptance criteria are
  interpolated; `<job_id>` stays a literal placeholder because the agent
  only learns its own id at runtime (env var).
- `src/components/shared/dispatch-button.tsx` is a focused client
  component with three responsibilities:
    1. Poll `GET /api/agent-status` every 5 s while the panel is open
       (plus an initial fetch on mount), mirror `busy` into local state.
    2. On click, `POST /api/agent-dispatch` with `{taskId}`; branch on
       200 / 409 / other.
    3. Render an inline status line under the button (`text-xs`, tone
       driven by `ok | info | error`) — no toast dep required.
  The poll interval self-clears on unmount so closing the panel stops
  network traffic.
- `src/components/shared/thread-drawer.tsx` renders `<DispatchButton>`
  alongside the existing "Edit task" button in the summary section,
  wrapped in a `flex-wrap` so the two controls reflow on narrow panes.
- Registers two new tests in `package.json`'s enumerated test script.

## What is NOT in this change

- The `/api/agent-dispatch` and `/api/agent-status` routes themselves —
  those land in the next commit. The button calls them but the server
  side is intentionally a separate step so each commit can be reviewed
  in isolation.
- No real toast system is introduced; inline status is sufficient.
- No change to how task state transitions on dispatch. The agent itself
  is expected to run `bd update --claim` / `bd close` via the prompt's
  operating rules.

## Test Plan

### Automated

```
$ node --import tsx --test tests/lib/dispatch-prompt.test.ts \
    tests/components/shared/dispatch-button.test.tsx
# tests 7 pass 7 fail 0
```

Covers:
- Bead id appears in opening paragraph and in both `bd note` / `bd close`
  commands.
- Priority rendered as `P<n>`, issue type echoed.
- Description and acceptance criteria quoted verbatim when present.
- `(no description)` / `(no acceptance criteria)` fallbacks when null.
- Guard rails block present (no terraform/kubectl/helm, workspace bd
  path, `bd update … --status blocked` fallback).
- DispatchButton module loads and exports both named and default.

`npm run typecheck` shows only the pre-existing `OrchestratorChatMessage`
type gap in `left-panel.tsx` that reproduces on untouched `main`.

### Manual Verification

1. `npm install`
2. `npm run dev`
3. Open `http://localhost:3000/?task=<some-open-bead-id>`
4. Expected: "Dispatch to Agent" button next to "Edit task" in the
   right-panel summary section.
5. Button disabled on beads with `status in {closed, blocked, deferred}`
   (they don't render the button at all).
6. Button disabled on beads missing acceptance criteria, with tooltip
   "Task is missing acceptance criteria — cannot dispatch.".
7. Click: UI flips to "Dispatching…"; once the next commit is merged,
   the agent-dispatch route will surface a `job_id` (today it returns
   404 which renders as "Dispatch failed (HTTP 404)").

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-18 14:04:34 +00:00
Viktor Barzin
845e90d7c0 [beadboard] Add quality filters for acceptance criteria and description length
## Context

The left-panel task list surfaces every bead regardless of whether the task
has been specified thoroughly enough for an agent to pick it up. Tasks with
empty `acceptance_criteria` or very short descriptions are low-signal noise
that muddles the navigation spine — especially now that we plan to dispatch
tasks to Claude agents (which need concrete instructions to succeed).

Epics are deliberately exempt: their role is grouping, not execution, so
requiring acceptance criteria / long descriptions on epics would hide the
entire backbone of the navigation.

## This change

- Plumbs `acceptance_criteria` end-to-end: adds the optional field on
  `BeadIssue`, and reads it both from `.beads/issues.jsonl` (parser) and
  Dolt SQL (`read-issues-dolt.ts` row shape + normalizer).
- Extends `LeftPanelFilters` with `hideNoAcceptance` and
  `hideShortDescription` (both default `true`) in the source-of-truth
  `hooks/use-url-state.ts` and in the re-exported shadow type on
  `components/shared/left-panel.tsx`.
- Updates `isTaskMatch` in both `left-panel.tsx` and `left-panel-new.tsx`
  to skip non-epic tasks lacking acceptance criteria or with a description
  shorter than `SHORT_DESCRIPTION_MIN_LENGTH` (200 chars). Epics bypass
  both filters via the `issue_type === 'epic'` guard.
- Exposes `isTaskMatch` from `left-panel.tsx` so the filter tests can
  assert behavior directly (previously only `shouldHideEpicEntry` was
  exported).
- Adds two checkboxes under the existing "Hide Closed" button in both
  left-panel variants (legacy `left-panel.tsx` and the one unified-shell
  currently wires up — `left-panel-new.tsx`).
- Seeds both new filter flags as `true` in the `UnifiedShell` default
  state so fresh sessions see the high-signal view without toggling.

## What is NOT in this change

- No mutation of `bd` / CLI behavior. Filters are purely UI-level.
- No localStorage persistence for the two new flags — existing
  `hideClosed` is also React-only, so parity is preserved. If/when we
  persist any of these, all three move together.
- No change to the `metadata.acceptance` path used by `kanban.ts`'s
  `hasQualitySignal` — that's a separate signal with its own callers.

## Test Plan

### Automated

Tests run from `/home/wizard/code/beadboard`:

```
$ node --import tsx --test tests/components/shared/left-panel-filtering.test.ts
# tests 15
# pass 15
# fail 0
# duration_ms 604
```

All 15 filter cases pass: 6 pre-existing `shouldHideEpicEntry` cases plus
9 new `isTaskMatch` cases covering acceptance-criteria-empty hides,
acceptance-criteria-disabled shows, epic exemption, 199/200-char
description boundary, null description, and short-description flag
disabled.

Related suites still green:

```
$ node --import tsx --test tests/components/shared/left-panel.test.tsx \
    tests/components/shared/unified-shell-hide-closed-contract.test.ts
# tests 7 pass 7 fail 0
```

Pre-existing failures in `tests/hooks/url-state-integration.test.ts`
(`view=activity` cases) and one pre-existing typecheck error in
`left-panel.tsx` thread prop are unrelated — both reproduce on `main`
before this change.

### Manual Verification

1. `npm install`
2. `npm run dev`
3. Open `http://localhost:3000` with bd project loaded.
4. Expected: two new checkboxes appear under "Hide Closed" in the left
   sidebar — "Hide tasks without acceptance criteria" and
   "Hide tasks with short description (<200 chars)". Both checked by
   default.
5. Toggle each off. Expected: additional beads appear in epic expansions
   (tasks that were previously hidden because they lack quality signal).
6. Confirm epics remain visible regardless of the checkbox state.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-18 14:00:51 +00:00
zenchantlive
9993738b29
Update CONTRIBUTING.md
typo
2026-03-29 13:37:46 -07:00
zenchantlive
90097b9ae3
Update CONTRIBUTING.md
fork not clone
2026-03-29 13:35:53 -07:00
zenchantlive
cd4f2ba9cf
Revise installation section in README.md
Updated installation instructions and prerequisites for BeadBoard, including new commands and clarification on the beadboard-driver skill.
2026-03-27 18:35:24 -07:00
zenchantlive
c85c8660ae
Merge pull request #26 from zenchantlive/docs/cleanup-junk-files
Docs/cleanup junk files
2026-03-25 23:52:24 -05:00
zenchantlive
f0b4875c47 chore: recreate orchestrator backlog with proper bead naming and descriptions
Deleted auto-named beads and recreated with beadboard-<epic>.x convention
per AGENTS.md. Each task has a full description following the bead prompting
guide: Goal, Success Criteria, Scope, Out of Scope, Verification Requirements.

Epic 1 — Core Reliability (beadboard-0cf):
  0cf.1: Replace event-based chat with conversation turns (P0)
  0cf.2: Persist orchestrator state to disk (P0)
  0cf.3: Replace execFileSync with async (P0)
  0cf.4: Context window management (P1)
  0cf.5: Integration tests (P1, depends on 0cf.1 + 0cf.2)

Epic 2 — Orchestrator UX (beadboard-1zb):
  1zb.1: Onboarding / suggested prompts (P0)
  1zb.2: BLOCKED notification (P0)
  1zb.3: Stop worker / restart orchestrator (P0)
  1zb.4: Plan visibility / template pipeline (P1)
  1zb.5: Launch from graph view (P1)
  1zb.6: Retry failed workers (P1)
  1zb.7: Chat panel expand / fullscreen (P2)
  1zb.8: Settings surface (P2)

Epic 3 — Agent Visibility (beadboard-7gx):
  7gx.1: Real agent activity detail (P1)
  7gx.2: Agent presence on graph nodes (P2)
  7gx.3: Direct worker communication (P2)

Epic 4 — Dolt History (beadboard-6rp):
  6rp.1: Session replay via Dolt diffs (P1)
  6rp.2: Rollback agent work (P1, depends on 6rp.1)
  6rp.3: Session history from Dolt log (P1)
  6rp.4: Output review surface (P1, depends on 6rp.1)
  6rp.5: Dolt audit trail in activity view (P2)
  6rp.6: Cost / token visibility (P1)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 23:15:36 -05:00
zenchantlive
5d2e147ca9 chore: create orchestrator backlog — 4 epics, 27 beads
Epic 1: Core Reliability (P0) — beadboard-0cf
  9 children: chat projection, persistence, async subprocess, context mgmt,
  integration tests, + existing bugs (sen, 4v7, 28z, bnx)

Epic 2: Orchestrator UX (P1) — beadboard-1zb
  9 children: onboarding, plan visibility, BLOCKED notification, graph launch,
  chat expand, stop/restart, retry, settings, + silent failures (cho)

Epic 3: Agent Visibility (P1) — beadboard-7gx
  3 children: activity detail, graph presence, direct worker communication

Epic 4: Dolt History Integration (P2) — beadboard-6rp
  6 children: session replay, rollback, session history, review surface,
  audit trail, cost visibility

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 20:19:52 -05:00
zenchantlive
efb6b06588
Merge pull request #24 from zenchantlive/docs/cleanup-junk-files
Docs/cleanup junk files
2026-03-25 11:10:07 -05:00
zenchantlive
2125431ab8 chore: swap Discord for GitHub Discussions
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 00:48:04 -05:00
zenchantlive
f29c0e3cba feat: add CONTRIBUTING.md, GitHub Issue templates, contrib:open label convention
CONTRIBUTING.md:
- Two tracks: humans (GitHub flow) and agents (beadboard-driver + bd)
- Copy-pasteable agent instructions for quick setup
- PR size guidelines (under 100 lines preferred, 200+ needs issue first)
- Quality gates, claim workflow, professional conduct expectations
- beadboard-driver and bd setup for agent contributors

GitHub Issue templates:
- Bug report: structured fields (steps, platform, Dolt status, versions)
- Feature request: problem/proposal/area, opt-in to implement
- Config: links to Discord and contrib:open issue filter

contrib:open labels:
- Tagged 4 orchestrator beads for community contribution
- Left session race condition (beadboard-4v7) as internal

README:
- Updated banner to link to CONTRIBUTING.md
- Updated Contributing section with Discord link and contrib:open workflow

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 00:23:05 -05:00
zenchantlive
4bc24bc160
Merge branch 'main' into docs/cleanup-junk-files 2026-03-24 21:30:12 -05:00
zenchantlive
4c9a1786db
Fix formatting and clarify installation instructions 2026-03-24 21:24:06 -05:00
zenchantlive
078acd6b57 docs: comprehensive README rewrite — keep everything good, fix dupes, add missing pieces
Starting from Jordan's edited version on main:
- Fixed 3 duplicate sections (Quick Start, Add to Agent, Install)
- Fixed broken markdown (unclosed code block)
- Fixed orchestrator banner typos
- Added full bb CLI commands (agent register/send/inbox/reserve/release, daemon tui)
- Added work reservation system with liveness-aware conflict resolution
- Added templates (feature-dev, bug-fix, full-squad, greenfield, etc.)
- Added capability-gated agent types
- Added bb-pi orchestrator section with honest WIP status
- Added Dolt section framed as recommended
- Added cross-platform support
- Added human-sounding agent instructions
- Added emojis for section scanning
- Updated architecture diagram to show bb CLI layer
- Described beadboard-driver as 9-step operating contract

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 21:10:39 -05:00
zenchantlive
5537e22174 docs: sharpen README — lead with the problem, frame Dolt as recommended
- Hero screenshot + "who's watching your agents" hook at top
- Dolt promoted from optional footnote to recommended with install commands
- bb-pi section leads with vision before construction status
- Agent-first framing moved higher
- Trimmed to 248 lines, no duplicates, no filler

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 20:37:32 -05:00
zenchantlive
fabd748833 docs: rewrite README + add under-construction banner to orchestrator panel
README.md:
- Remove duplicate sections, stale info, and broken markdown
- Add bb-pi orchestrator section with honest WIP status and known issues
- Clarify bd vs bb/beadboard CLI distinction
- Add cross-platform support section (Windows, macOS, Linux)
- Note Dolt as optional, document JSONL fallback
- Reference Pi SDK and community tools listing

orchestrator-panel.tsx:
- Add amber "Under construction" banner with link to track progress
- Visible on every orchestrator panel render

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 20:33:15 -05:00
zenchantlive
e96eccf6c5
Update README.md 2026-03-24 19:14:52 -05:00
zenchantlive
7e2a0deb62
Update README with current status of Orchastrator 2026-03-24 19:11:48 -05:00
zenchantlive
fc44142a0e
Merge pull request #23 from zenchantlive/docs/cleanup-junk-files
fix: orchestrator button + Pi SDK session error
2026-03-24 19:07:50 -05:00
zenchantlive
d6f73ce979 fix: restore JSONL fallback when Dolt is unavailable
readIssuesFromDisk was throwing when Dolt was unreachable instead of
falling back to .beads/issues.jsonl on disk. This broke the app for
users without Dolt installed.

Restores the JSONL fallback path: try Dolt first, then read from the
git-tracked JSONL file, return empty array if neither is available.

Fixes #22

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 19:07:19 -05:00
zenchantlive
203203fb9f chore: track orchestrator bugs as beads (WIP)
Created beads for known orchestrator issues discovered during Mac onboarding:
- beadboard-sen: double-reply rendering
- beadboard-cho: silent failures in UX
- beadboard-4v7: session race condition
- beadboard-bnx: clawdbot path cleanup
- beadboard-28z: unbounded event array

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 19:03:29 -05:00
zenchantlive
5c074935d7 fix: repair beads database for macOS — remove stale Dolt port, fix comment ID types
- Remove deprecated dolt_server_port from metadata.json (stale Windows value causing auto-start suppression)
- Convert numeric comment IDs to strings in issues.jsonl (bd 0.61.0 schema requirement)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 19:02:45 -05:00
zenchantlive
c5d255f816 bd init: initialize beads issue tracking 2026-03-24 19:02:04 -05:00
zenchantlive
5f6e5b610a beads back 2026-03-24 19:02:04 -05:00
zenchantlive
d335e5bf71 fix: orchestrator button + Pi SDK session error
- Move leftSidebarMode from URL state to local useState in unified-shell,
    avoiding force-dynamic router round-trip that made the button appear broken                                           - Replace fileURLToPath(new URL(..., import.meta.url)) with process.cwd()
    in bb-pi-bootstrap.ts — import.meta.url is a webpack:// URL in Next.js,
    causing cross-realm TypeError when passed to Node.js fileURLToPath()
2026-03-24 19:02:04 -05:00
zenchantlive
643fa299dd bd: backup 2026-03-16 03:38 2026-03-24 19:01:45 -05:00
zenchantlive
dca6bd6ff1 bd: backup 2026-03-14 19:04 2026-03-24 19:01:45 -05:00
zenchantlive
c515d40bdc bd: backup 2026-03-11 02:03 2026-03-24 19:01:45 -05:00
zenchantlive
040e936ae2 bd: backup 2026-03-11 01:48 2026-03-24 19:01:45 -05:00
zenchantlive
c6203494d8 bd: backup 2026-03-11 01:12 2026-03-24 19:01:45 -05:00
zenchantlive
3a467ef753 bd: backup 2026-03-11 00:31 2026-03-24 19:01:45 -05:00
zenchantlive
67dbd7b446 bd: backup 2026-03-10 22:08 2026-03-24 19:01:45 -05:00
zenchantlive
273b6a113d bd: backup 2026-03-10 20:36 2026-03-24 19:01:45 -05:00
zenchantlive
d3da37e5c8 bd: backup 2026-03-10 01:23 2026-03-24 19:01:45 -05:00
zenchantlive
189e19335d bd: backup 2026-03-10 01:00 2026-03-24 19:01:45 -05:00
zenchantlive
7ac90238c3 bd: backup 2026-03-06 06:33 2026-03-24 19:01:45 -05:00
zenchantlive
23e15bf61b
Merge pull request #21 from cognovis/feat/linux-support
feat: add Linux/macOS support for pathing, registry, and project scope
2026-03-24 19:01:16 -05:00
zenchantlive
523fe6e354
Correct capitalization in README status message 2026-03-24 17:55:34 -05:00
zenchantlive
3b5b015586
Add temporary notice about ongoing fixes 2026-03-24 17:55:05 -05:00
Malte Sussdorff
1cf007a800 feat: add Linux/macOS support for pathing, registry, and project scope
- pathing.ts: use path.resolve() on POSIX instead of win32.normalize
- registry.ts: replace ensureWindowsAbsolutePath with path.isAbsolute()
- Tests: platform-conditional assertions for both Windows and POSIX
- Windows behavior preserved unchanged via os.platform() guard

All 17 tests pass on macOS. Windows tests guarded behind IS_WINDOWS.
2026-03-22 12:48:56 +01:00
zenchantlive
b3956b31ce
Revise BeadBoard integration section
Updated BeadBoard integration instructions in README.
2026-03-05 17:53:30 -08:00
zenchantlive
03efa10e28
Merge pull request #19 from zenchantlive/docs/cleanup-junk-files
chore: remove junk files from repository root
2026-03-05 17:51:14 -08:00
zenchantlive
bea2487816 chore: remove junk files from repository root 2026-03-05 17:47:51 -08:00
zenchantlive
a25fbfc9d0
Merge pull request #18 from zenchantlive/docs/update-readme-no-npm
docs: update README to reflect no npm publish yet
2026-03-05 17:41:00 -08:00
zenchantlive
09f407e3db
Update README.md
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-03-05 17:40:49 -08:00