Author SHA1 Message Date
libretech 12834650dc docs(changelog): set v0.1.0 release date to 2026-04-29
Deploy / build (push) Has been skipped
Deploy / deploy (push) Has been skipped
CI / ci (push) Failing after 13m13s
2026-04-29 01:29:58 +02:00
libretech 9fd29a31c3 feat(deploy): add netcup compose overlay (build local, edge net, no host port)
Deploy / build (push) Has been skipped
Deploy / deploy (push) Has been skipped
CI / ci (push) Successful in 13m0s
2026-04-29 00:59:58 +02:00
libretechandClaude Opus 4.7 8577a19ba1 Refresh Wave pipelines, personas, and contracts
Local-only Wave configuration sync:
- Drop one-shot contract schemas no longer referenced by any
  pipeline.
- Replace gitea/github issue-impl pipelines with the unified
  refresh/research/rewrite/scope set; add bb (bitbucket) and gl
  (gitlab) variants.
- Add scoper persona and matching scope contracts.
- Update existing personas and pipelines to current style.

No effect on the librenotes runtime; this only touches the
.wave/ tooling directory used by the local dev harness.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 23:25:18 +02:00
libretechandClaude Opus 4.7 3b3cb57aa2 Add CHANGELOG and launch validation checklist
CHANGELOG.md follows Keep-a-Changelog. The Unreleased section
sits at the top; the v0.1.0 entry summarises every commit on
the path from the empty fork to a hosted multi-tenant build:
fork + restructure, storage/auth/tenant/httpapi packages, the
serve command, full frontend (landing, login, verify, app shell,
PWA, sync), Docker + deploy + backup tooling, docs, and the
community infrastructure. Two known-incomplete items called out
explicitly: the upstream Notesium UI is not yet wired into the
multi-tenant shell, and SMTP delivery has only been exercised
against the LogMailer.

docs/launch-checklist.md is the manual QA pass for v0.1.0:
environment prerequisites, the full sign-up to first-note flow
on Chrome / Firefox / iOS Safari / Android Chrome (with explicit
PWA-install and offline-shell verifications), documentation
accuracy spot-checks, the community-infra render checks, and a
backup-and-restore round-trip on the staging host. The QA
performer signs off at the bottom; failures are filed as
separate bugs against the milestone.

The actual v0.1.0 tag will be cut by a maintainer; tagging is
not part of this commit.

Refs #30 and #33.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 23:20:20 +02:00
libretechandClaude Opus 4.7 3b8847efa1 Add first-run onboarding flow
cmd/librenotes/web/public/onboarding.js triggers after a session
is verified and runs only when the tenant-scoped key
"onboarded" is unset.

Behaviour:
- Reads the dismissal flag from authClient.tenantStore() so each
  tenant's state is isolated and survives logout-then-login on
  the same device only if they're the same user.
- Lists /api/notes; if the notebook is empty, PUTs a sample
  "welcome" note so a brand-new user has somewhere to land. We
  don't seed when notes already exist (covers signing in on a
  second device for the first time).
- Opens app.html's <dialog id="onboarding-dialog"> with showModal
  and persists "onboarded": true on submit so returning users
  never see it again.
- Seed failures are logged but do not block the dialog —
  onboarding shouldn't depend on a successful network round
  trip. The dialog just won't have a sample note to point at.

Dialog content covers the four user-guide concepts: notes-as-
markdown, [[wikilinks]], offline-first sync, tenant isolation.

Service worker precaches onboarding.js so the dialog is also
available to offline-first returning visitors.

Closes #32.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 23:19:13 +02:00
libretechandClaude Opus 4.7 e3c86a92c0 Add community infrastructure: issue + PR templates, CoC
Gitea issue templates (.gitea/issue_template/):
- bug.yml: structured form requiring version, environment,
  what-happened, repro steps, expected, optional logs. Routes
  security reports to security@librete.ch instead of public
  issues.
- feature.yml: prompts for the underlying problem before the
  proposed solution, plus alternatives and out-of-scope.

Pull request template (.gitea/PULL_REQUEST_TEMPLATE.md):
checklist for tests, lint, manual exercise, docs, and changelog.
Asks for explicit reviewer notes so trade-offs surface in the
PR description rather than being lost in chat.

CODE_OF_CONDUCT.md: links to Contributor Covenant 2.1 verbatim
rather than inlining; documents scope, reporting address
(conduct@librete.ch), and points enforcement at the Covenant's
own Enforcement Guidelines.

README links the docs/ tree, CONTRIBUTING, and the CoC so new
contributors find the entry points.

Closes #31.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 23:18:10 +02:00
libretechandClaude Opus 4.7 61edef9483 Add user guide, self-hosting, API, and contributing docs
docs/user-guide.md — magic-link sign-in, note basics, wikilink
syntax, keyboard shortcuts, offline behaviour, and privacy
notes (sessionStorage for tokens, tenant-scoped localStorage).

docs/self-hosting.md — system requirements, Docker Compose
quick-start, the full LIBRENOTES_* env-var matrix (which are
required, which conditional), reverse proxy snippets for Caddy
and nginx, volume layout, the in-binary healthcheck, and
update/rollback procedure.

docs/api.md — every public endpoint: auth (login/verify),
notes CRUD, /api/whoami, /healthz. Status codes per endpoint,
the optimistic-locking ?base=<unix> contract for PUT/DELETE,
note-ID regex, and the rate-limit policy.

CONTRIBUTING.md — dev setup (Nix flake .#dev, plain Go, Docker),
package layout overview, coding standards (one-way dep flow,
tenant FS gateway requirement), branch naming, commit format,
and the PR process. Also points security reports at
security@librete.ch rather than public issues.

Closes #29.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 22:52:09 +02:00
libretechandClaude Opus 4.7 bcccba92f7 Add deploy workflow and backup tooling
CI deployment (.gitea/workflows/deploy.yml):
- Two jobs (build, deploy) gated on the repo variable
  DEPLOY_ENABLED=true so the workflow exists but does nothing
  until secrets and host are configured.
- Build pushes two image tags per run: rolling :main + the short
  SHA on main, or vX.Y.Z + :latest on tag pushes. Immutable per
  commit/tag tags make rollback trivial.
- Deploy SSHes to DEPLOY_HOST, runs docker compose pull && up -d
  in DEPLOY_PATH, then polls HEALTH_URL for up to a minute. A
  failed health check fails the workflow, which is the alert.
- Required secrets and the rollback procedure are documented in
  docs/operations.md.

Backup tooling (scripts/):
- backup.sh: SQLite online .backup snapshot + tarball of the
  per-tenant data dir + info.txt header, all wrapped into a
  single librenotes-YYYYMMDD-HHMMSS.tar.gz. Optional BACKUP_REMOTE
  triggers an rclone copy for off-site storage.
- backup-prune.sh: enforces retention "30 daily + 12 monthly".
  Sorts archives by filename (date is in the name so lex order
  matches chronological) and keeps the newest 30 plus the newest
  archive for each of the most recent 12 months.
- backup-restore-test.sh: extracts the most recent archive into
  a tmpdir, runs sqlite3 .schema (proves DB readability), and
  asserts the notes tar has at least one entry. Failure is the
  alert. Wired into a separate weekly timer.
- librenotes-backup.{service,timer}: systemd units for the daily
  03:17 UTC run with 5min jitter; ProtectSystem=strict, only
  /var/backups/librenotes is writable.
- librenotes-backup-verify.{service,timer}: weekly Monday
  04:00 UTC restore test.

Closes #26 and #27.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 22:49:40 +02:00
libretechandClaude Opus 4.7 635a03098b Add Dockerfile, Compose stacks, and /healthz endpoint
Dockerfile is multi-stage:
- build: golang:1.25-bookworm, CGO_ENABLED=0 (modernc.org/sqlite
  is pure-Go) + -trimpath + -ldflags "-s -w" so the resulting
  binary is small and reproducible-ish.
- runtime: gcr.io/distroless/static:nonroot, ~2 MB. Runs as uid
  65532. /data and /var/lib/librenotes are declared volumes so
  per-tenant notes and the SQLite database survive container
  restarts.

healthcheck subcommand: distroless static has no shell or
wget/curl, so /healthz is reachable but no client to call it. A
new "librenotes healthcheck" subcommand uses net/http to GET
$LIBRENOTES_HEALTHCHECK_URL (default 127.0.0.1:8080/healthz) and
exits non-zero on failure. Both compose files invoke it from the
HEALTHCHECK directive.

httpapi adds a tiny GET /healthz that returns {"status":"ok"}
(no DB ping yet — added when readiness probes need it).

docker-compose.yml: dev stack on :8080 with named volumes and a
LogMailer; everything via env vars, JWT secret defaulted to a
dev value.
docker-compose.prod.yml: layered overrides — pulls a registry
image, expects LIBRENOTES_* env, sets memory limits and JSON-
file log rotation.

Closes #25.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 22:47:42 +02:00
libretechandClaude Opus 4.7 f166485012 Add background sync controller with conflict detection
cmd/librenotes/web/public/sync.js drives the offline-online
reconciliation flow against the notes REST API:

- start(): registers online/offline window listeners, runs an
  initial syncOnce() if currently online.
- syncOnce(): push() then pull(); emits "librenotes:sync-state"
  events with state in {online, offline, syncing, synced, error}.
- push(): walks notesCache.pending() (rows with dirty=1, including
  tombstones). PUTs use ?base=<synced_at> for optimistic locking
  and DELETEs use the same. The notes API returns 409 with the
  current server body on conflict; sync.js stashes the pair in
  conflictsById and dispatches "librenotes:sync-conflict" so the
  app shell can render a resolution dialog.
- pull(): GETs the summary list, refetches any row whose server
  updated_at exceeds the local synced_at (or that is missing
  locally), and stamps it as cleanly synced. Skips locally-dirty
  rows so push's conflict path stays authoritative.
- resolveConflict(id, "local"|"remote"|"merge", merged): replays
  the user's choice. "local" and "merge" PUT with the latest
  server base so the second attempt accepts; "remote" overwrites
  the local cache with the server copy.

app.html now includes a sync-state badge in the header and a
<dialog> for conflict resolution wired to the events. app.js
calls notesSync.start() on load and routes dialog clicks back to
resolveConflict. The dialog uses native <dialog>.showModal(),
which all current target browsers support.

style.css adds badge colour states (syncing/synced/offline/error)
and a two-column conflict layout that collapses on narrow widths.

Closes #23.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 22:45:25 +02:00
libretechandClaude Opus 4.7 593e311a8a Add IndexedDB-backed offline notes cache
cmd/librenotes/web/public/notes-cache.js exposes window.notesCache
with the offline-first read/write API the rest of the app uses:

Schema (object store "notes", key path "id"):
  { id, title, content, updated_at, synced_at, dirty, deleted }
plus a denormalised dirty_idx:0|1 column because IndexedDB cannot
index booleans directly. Two indexes — by_updated_at for sorted
listing, by_dirty for the sync controller's pending-queue scan.

Per-tenant database name "librenotes-notes-{user_id}" so two
users on the same browser have fully separate offline caches and
clearAll() (called from authClient.clearSession on logout) drops
only the leaving user's data.

Public surface:
- list/get/put/remove: straight CRUD.
- markDirty(id, patch): stage an offline edit. Bumps updated_at
  to now() but preserves synced_at so the sync controller can
  detect server-side concurrent edits via the ?base=<unix> 409.
- markDeleted(id): tombstone (deleted:true, dirty:true) so the
  sync controller can replay the delete on reconnect.
- markSynced(id, serverUpdatedAt): clear dirty + record
  serverUpdatedAt as synced_at; if tombstone, drop entirely.
- pending(): returns dirty rows for the sync queue.
- estimateUsage(): wraps navigator.storage.estimate so the UI
  can warn before quota.

Quota errors are remapped to a typed err.code === "QUOTA" so the
UI can show "out of space" instead of a generic failure.

The service worker precache list now includes notes-cache.js and
sync.js so the offline shell has the cache layer too.

Closes #22.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 22:43:44 +02:00
libretechandClaude Opus 4.7 cdc7f26269 Add tenant-scoped notes REST API
internal/httpapi/notes.go exposes:
- GET    /api/notes            list summaries {id, title, updated_at}
- GET    /api/notes/{id}       full {id, title, content, updated_at}
- PUT    /api/notes/{id}       create/update; ?base=<unix> for
                                optimistic-locking conflict detection
- DELETE /api/notes/{id}       remove; ?base=<unix> guards against
                                deleting a row modified after the
                                client last saw it

Backed by tenant.FS so all reads/writes go through the per-user
sandbox — path traversal is rejected at parse time (regex slug)
and again by os.Root inside the FS layer.

On-disk format is plain Markdown: first line `# Title`, rest is
content. grep / cat / vim still produce a usable view of raw
files. Title round-trips through composeNote/splitTitle.

Conflict semantics: when the client supplies ?base=<unix>, the
server compares against the file's mtime. If the file is newer,
respond 409 with the current note body so the client can present
a merge UI. Same logic on DELETE returns 409 alone.

cmd/librenotes/serve.go grows a tenantPool that memoises FS
handles per user id; defer-closes them on shutdown.

Tests cover: full CRUD round-trip, cross-tenant isolation,
unauthenticated 401s, invalid IDs (regex rejection), and the
conflict path with a real mtime advance.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 22:42:43 +02:00
libretechandClaude Opus 4.7 49ad467aa9 Switch pane resize handle to pointer events
internal/notesium/web/app/pane.js drove the sidebar/pane resize
via mousedown + window-level mousemove/mouseup, which doesn't
fire on touch (browsers only emulate mouse for taps, not drags).

Replaced with pointer events:
- @pointerdown on the handle (covers mouse, touch, pen).
- setPointerCapture so we keep receiving pointermove/pointerup
  events when the pointer drifts off the handle. This eliminates
  the need for document-level listeners and avoids stuck-drag
  states when the user releases outside the window.
- pointermove + pointerup + pointercancel listeners on the
  captured target only — when the capture ends they're removed
  regardless of whether the user is still on top of the handle.
- Filter on event.pointerId so a second simultaneous touch
  (e.g., a multi-finger gesture) cannot hijack the in-progress
  resize.
- event.button !== 0 guard rejects right-click / middle-click.
- touch-action: none on the handle so the browser doesn't try
  to interpret a horizontal drag as a page scroll.

CodeMirror's internal mousedown handlers in note.js / preview.js
are left alone — those are link-click guards, not drags, and
CodeMirror's own pointer support handles touch internally.

Closes #20.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 22:30:43 +02:00
libretechandClaude Opus 4.7 e6d3893308 Overhaul CSS for 320px–2560px viewports
style.css now has explicit breakpoints and primitives covering
the full target range:

- Global: overflow-x: hidden on body, max-width:100% on media,
  fluid typography via clamp() so headings shrink on 320px.
- .wrap: 64rem cap at desktop, 72rem at 1440px, 96rem at 2560px;
  generous side padding at large widths so text doesn't hug the
  edge on huge monitors.
- .app-shell layout primitive (grid: sidebar + content [+ aside
  on ultrawide]) ready for the eventual notes UI:
    * mobile: single column, sidebar hidden behind a toggle
      ([data-sidebar="open"] reveals it).
    * 768px+: 2-column with 16rem sidebar.
    * 1024px+: 18rem sidebar.
    * 1440px+: 20rem sidebar, content max-width 56rem so reading
      lines don't grow unbounded.
    * 2560px+: 3-column (sidebar | content | aside) so the
      editor stays at reading width while the extra real estate
      hosts backlinks/preview.
- .app-resize-handle with touch-action:none so pointer-event
  drag handlers won't conflict with browser scrolling.
- Auth card tightens on viewports under 360px.

Result: no horizontal scroll at any width; content uses ultrawide
space effectively without sacrificing legibility.

Closes #18.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 22:28:19 +02:00
libretechandClaude Opus 4.7 7c3b40c963 Add PWA manifest, service worker, and install prompt
- manifest.webmanifest: standalone display mode, theme #2563eb,
  start_url=/app.html (so users who install land in the app
  shell, not the marketing page), scope=/. Three icons: 192px
  any-purpose, 512px any-purpose, 512px maskable for adaptive
  icons on Android.
- icons/: PNGs generated from favicon.svg.
- sw.js: cache-first for the precached app shell, network-first
  for /api/* and /auth/* (we never serve stale auth or notes).
  Versioned cache name (librenotes-shell-v1) so a SW update
  evicts old assets. skipWaiting + clients.claim so a new SW
  takes over without a manual reload.
- pwa.js: registers the SW on every page and handles
  beforeinstallprompt by showing #install-btn. Hides the button
  again on appinstalled. Defer loaded so it never blocks render.
- All HTML pages link the manifest, set the theme-color meta,
  and load pwa.js. Landing page exposes the install button next
  to the existing CTAs.

Closes #19.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 22:27:32 +02:00
libretechandClaude Opus 4.7 274c7054d0 Add JWT session client and tenant-scoped storage
cmd/librenotes/web/public/auth-client.js exposes window.authClient
with the full session API used by the rest of the frontend:

Session storage (#14):
- saveSession / loadSession / clearSession / isAuthenticated
- Backed by sessionStorage, not localStorage: tokens are isolated
  per tab and cleared on tab close. localStorage would survive
  tab close on a shared device, which we want to avoid.
- loadSession returns null when expires_at has passed, so callers
  treat expired sessions as logged-out without a network round
  trip.

API wrapper (#14):
- apiFetch(url, init) attaches Authorization: Bearer <jwt> to
  every call. On 401 it clears the session and redirects to
  /login.html?next=<current-path> so the user returns where they
  started. Throws after the redirect so the caller's .then does
  not run with stale data.

Tenant-scoped localStorage (#15):
- tenantStore() returns a get/set/remove wrapper whose keys are
  prefixed "librenotes:{user_id}:". Two users on the same browser
  therefore have fully independent UI state. JSON serialisation
  with try/catch fallbacks for corrupted or quota-exceeded
  storage so a bad blob never crashes the app.
- clearTenantStore(userID) removes every key with that prefix.
  Called from clearSession() so logout wipes both the JWT and
  the user's preferences.

verify.html + verify.js complete the magic-link flow: read
?token=, POST /auth/verify, hand the response to saveSession(),
strip the token from the URL via history.replaceState. Errors
route the user back to /login.html.

app.html + app.js are a minimal authenticated landing demonstrating
the full stack end-to-end: apiFetch hits /api/whoami, tenantStore
persists a theme preference, logout clears both. The full notes
UI is left to a later phase — this is the seam.

Closes #14 and #15.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 22:25:07 +02:00
libretechandClaude Opus 4.7 dc5a08e682 Add magic-link login UI with client-side validation
cmd/librenotes/web/public/login.{html,js}:
- Email input with required + autocomplete + autofocus, ARIA
  attributes for screen readers (aria-describedby, aria-invalid,
  role="alert" on the error container, role="status" on success).
- Client-side regex validation runs before POST to /auth/login
  to avoid a network round-trip for obvious typos. Server is
  still the source of truth.
- Loading state disables the button and changes its label.
- Success state replaces the form with "Check your email"
  including the address, plus the 15-minute / single-use note.
- Error states map server statuses to user-friendly messages:
  429 -> "too many requests", 400 -> "invalid email", anything
  else -> generic server error. Network errors get their own
  message so users can distinguish offline from server problems.
- No external CSS or JS dependencies; works with keyboard and
  on small viewports.

Closes #13.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 22:24:48 +02:00
libretechandClaude Opus 4.7 ee4de51728 Add librenotes serve command and public landing page
cmd/librenotes/serve.go wires the multi-tenant HTTP server:
storage + auth + httpapi packages, configurable via flags or
LIBRENOTES_* env vars. Embeds web/public/ for unauthenticated
static content. Generates an ephemeral JWT secret with a warning
when none is supplied. Adds security headers (CSP, nosniff,
DENY-frame, no-referrer) on every response. Background goroutine
purges expired magic-link tokens every 10 minutes.

cmd/librenotes/web/public/ provides the unauthenticated frontend:
- index.html: hero, features grid, fork attribution, footer.
  Mobile-first, responsive from 320px up via clamp() and
  auto-fit grid. SEO + Open Graph tags. No JS dependency.
- privacy.html: placeholder privacy policy (full text TBD).
- style.css: shared design tokens (light/dark via [data-theme]),
  used by landing, auth pages, and the post-login app shell.
- favicon.svg: minimal mark.

The "serve" command sits alongside the original notesium CLI
verbs; main.go dispatches "serve" to the new code path and
forwards everything else to notesium.Run().

Closes #16.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 22:24:37 +02:00
libretechandClaude Opus 4.7 db3b6c1b5a Add tenant-aware HTTP middleware and router
internal/httpapi/ provides:
- Tenant{UserID, Email} carried on context.Context, with
  WithTenant / TenantFrom helpers and ErrNoTenant for the
  programming-error case (route reached without middleware).
- AuthMiddleware verifies an Authorization: Bearer <jwt> on every
  request via auth.Signer.Verify (which already enforces HS256
  and rejects alg=none). On failure: 401, with the underlying
  reason logged server-side but not exposed to the client.
- RequireTenantOwnership(ownerID) compares the request's tenant
  against the resource owner; returns 403 on mismatch. Handlers
  that touch tenant-owned resources call this guard.
- Server.Routes() mounts /auth/* unauthenticated and wraps
  /api/* with the middleware. /api/whoami is included as the
  canonical example of a tenant-scoped endpoint.

Tests cover: valid JWT pass-through, missing/empty Authorization,
wrong scheme, malformed JWT, tampered signature, JWT signed with
a different secret (cross-tenant key confusion), and the 200/403
matrix for RequireTenantOwnership.

Closes #11.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 22:19:09 +02:00
libretechandClaude Opus 4.7 c9b8c4445b Add per-tenant filesystem isolation
internal/tenant/ provides FS, a sandboxed handle for a single
tenant's notes directory. Implementation strategy:

- Defence in depth: every relative path is validated up front
  (rejects "..", absolute paths, NUL bytes, empty), then handed
  to os.Root (Go 1.24+) which enforces the boundary at the
  syscall layer using openat(2)+RESOLVE_BENEATH on Linux. This
  closes TOCTOU races and symlink-target swapping.
- WriteFile is atomic (write to .tmp, rename in-root). Mode 0o600
  on files, 0o700 on directories. Tenant root is created with
  0o700 by Open().
- Errors are normalised: fs.ErrNotExist -> ErrNotFound, anything
  os.Root rejects as "outside" the root -> ErrInvalidPath. The
  HTTP layer can map cleanly to 404 / 400.

Tests cover the full traversal attack surface — "../", absolute
paths, mixed separators, NUL bytes, "." and "" — plus symlink
escapes and cross-tenant isolation. All vectors return errors;
none escape the root.

Closes #10.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 22:17:38 +02:00
libretechandClaude Opus 4.7 d9f3574913 Implement email magic-link authentication
internal/auth/ provides:
- TokenStore: 32-byte cryptographically random one-time tokens.
  Only the SHA-256 hash is persisted (so a DB leak doesn't grant
  active sessions). Comparison uses subtle.ConstantTimeCompare.
  Single-use is enforced via UPDATE ... WHERE used_at IS NULL.
- Signer: HS256 JWTs with 24h lifetime, jwt.WithValidMethods to
  reject alg=none and other downgrade attacks.
- LogMailer (dev) and SMTPMailer (prod via net/smtp) behind a
  Mailer interface.
- RateLimiter: DB-backed fixed window per email; default 5 per
  15 min for the magic-link flow.
- Service: orchestrates RequestLogin (auto-creates user on first
  login, generates token, emails magic link) and Verify (consumes
  token, updates last_login, issues JWT).
- Handlers: POST /auth/login and GET/POST /auth/verify.
  HandleLogin returns 202 even on validation failure to avoid
  account enumeration; rate-limit hits surface as 429.

Schema additions: magic_tokens (with FK + cascade) and
login_attempts. UserStore.SetStoragePath added for completeness.

Tests cover: token issue/consume, single-use, expiry, rate limit,
JWT round-trip, alg=none rejection, signature tampering, purge,
HTTP handlers (login + verify, missing/invalid token paths).

Closes #9.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 22:16:25 +02:00
libretechandClaude Opus 4.7 0924e3cee9 Add user model and SQLite storage
internal/storage/ provides:
- Open(path) to create or open the SQLite database with WAL journal,
  busy timeout, and foreign keys enabled
- Embedded migrations that create the users table on first run
- UserStore with Create, GetByID, GetByEmail, UpdateLastLogin, Delete
- Email normalisation (trim+lowercase) and uniqueness enforcement
  with ErrEmailTaken
- ErrNotFound on lookups and deletes
- UUIDv4 IDs auto-generated when caller leaves ID empty

Uses modernc.org/sqlite (pure-Go) so the binary stays CGO-free and
matches Dockerfile.dev's CGO_ENABLED=0.

Tests cover all CRUD operations, email uniqueness (case-insensitive),
WAL mode verification, and ErrNotFound paths.

Closes #8.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 22:13:28 +02:00
libretechandClaude Opus 4.7 b409519661 Add reproducible dev environment
- flake.nix: rebrand description, add Go 1.25, gopls, gotools,
  staticcheck, golangci-lint, gnumake to all dev shells. Add a
  plain `dev` shell (`nix develop .#dev`) that does not wrap the
  shell in the bubblewrap sandbox so contributors can use a
  standard Go toolchain.
- Dockerfile.dev: golang:1.22-bookworm with make, git, gopls and
  staticcheck, /workspace as default cwd. CGO disabled.
- README: document both nix and Docker dev paths.

flake.lock is committed for reproducibility.

Closes #6.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 21:58:59 +02:00
libretechandClaude Opus 4.7 a36fc1c8cc Add Gitea Actions CI workflow
Runs on push to main and pull requests against main:
- go mod download + verify
- make lint (go vet)
- make build
- make test (race detector)

Uses actions/setup-go@v5 with built-in module caching, Go 1.22.
Workflow times out at 5 minutes per the acceptance criteria.

Closes #5.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 21:55:40 +02:00
libretechandClaude Opus 4.7 72454f08ab Add Makefile with build, test, lint, run, and clean targets
Standard targets:
- build: compiles cmd/librenotes with version/buildtime ldflags
- test: race detector enabled, full module
- lint: go vet, plus staticcheck if available
- run: build + execute, ARGS forwarded
- clean: remove binary and test/coverage artifacts

Variables (BINARY, OUTDIR, GO, GOFLAGS, LDFLAGS, TESTFLAGS) are
overridable so the CI workflow (#5) can invoke targets with
custom output paths or flags.

Closes #38.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 21:55:26 +02:00
libretechandClaude Opus 4.7 dc6ef99c3a Add README with librenotes branding and build instructions
Replaces the upstream Notesium README with librenotes-specific
content: project description, multi-tenant goals, build/run
instructions referencing cmd/librenotes, Nix-based dev setup,
fork attribution, and MIT license note.

CI badge points at the workflow that #5 will create. Module path
and directory layout match the structure landed in the previous
fork commit.

Closes #37.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 21:53:28 +02:00
libretechandClaude Opus 4.7 42fac0ab33 Document fork relationship with Notesium upstream
LICENSE retains the original Notesium copyright alongside librenotes.
NOTICE records the upstream URL, fork commit hash
(aff9f460c2d864112db7f0935b4168b107289d91), fork date, and
instructions for contributors who want to add the upstream remote
and cherry-pick patches.

Closes #36.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 21:53:04 +02:00
libretechandClaude Opus 4.7 094250609c Fork Notesium source and restructure into Go package layout
Initial fork of github.com/alonswartz/notesium into librenotes:
- Source moved to internal/notesium/ (package notesium)
- Thin entry point at cmd/librenotes/main.go
- Module renamed to git.librete.ch/public/librenotes
- main() exposed as notesium.Run()
- LICENSE preserved (MIT), NOTICE added with attribution
- Web assets and completion.bash co-located with embedding code
  to satisfy go:embed path constraints

Closes #3, #34, #35.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 21:52:25 +02:00
libretechandClaude Sonnet 4.5 aee9086633 Fix Gitea pipelines to use authenticated tea CLI without --login flag
Remove redundant --login librete flags from all gt-* pipeline tea commands since
authentication is already configured via tea logins. This simplifies the commands
and prevents potential authentication issues.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-25 19:15:33 +01:00
libretechandClaude Opus 4.6 3e10fde0e1 Add CLAUDE.md with project conventions and tool preferences
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 17:11:46 +01:00
273 changed files with 13602 additions and 12712 deletions
+15
View File
@@ -0,0 +1,15 @@
# Server-side .env for netcup deploy. Copy to /srv/librenotes/.env on the host.
# Used by: docker compose -f docker-compose.yml -f compose.netcup.yaml up -d --build
# Public origin (caddy reverse-proxies to librenotes:8080)
LIBRENOTES_BASE_URL=https://ln.cloud.librete.ch
# JWT secret — at least 32 bytes. Generate: openssl rand -base64 48
LIBRENOTES_JWT_SECRET=CHANGE_ME
# SMTP relay (magic-link delivery)
LIBRENOTES_SMTP_HOST=smtp.example.com
LIBRENOTES_SMTP_PORT=587
LIBRENOTES_SMTP_USER=
LIBRENOTES_SMTP_PASS=
LIBRENOTES_SMTP_FROM=no-reply@librete.ch
+29
View File
@@ -0,0 +1,29 @@
## Summary
What does this PR change, and why?
## Linked issue
Closes #
## Changes
-
## Testing
- [ ] `make test` passes locally
- [ ] `make lint` passes locally
- [ ] Added or updated tests for the changed behaviour
- [ ] Manually exercised the affected flow (frontend / API / etc.)
## Documentation
- [ ] Updated relevant docs in `docs/`
- [ ] Updated `CHANGELOG.md` if user-visible
- [ ] No documentation change needed
## Notes for reviewers
Anything you want a reviewer to look at specifically? Trade-offs
considered? Migrations to flag?
+60
View File
@@ -0,0 +1,60 @@
name: Bug report
about: Something is broken or doesn't work as documented
labels: ["bug"]
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to file a bug. Please fill in
as much of the form as you can — the more concrete the
report, the faster we can fix it.
For security issues, **do not** open a public issue.
Email `security@librete.ch` instead.
- type: input
id: version
attributes:
label: librenotes version
description: Output of `librenotes version` or the Docker image tag.
placeholder: v0.1.0
validations:
required: true
- type: input
id: environment
attributes:
label: Environment
description: Browser + OS for frontend bugs; OS + Go version for backend bugs.
placeholder: Firefox 124 on macOS 14 / Go 1.22 on Debian 12
validations:
required: true
- type: textarea
id: what-happened
attributes:
label: What happened?
description: A clear, concrete description of the bug.
validations:
required: true
- type: textarea
id: reproduce
attributes:
label: Steps to reproduce
description: Numbered steps from a clean starting state.
placeholder: |
1. Sign in as a new user.
2. Create a note named "Test".
3. Click the toggle.
4. ...
validations:
required: true
- type: textarea
id: expected
attributes:
label: Expected behaviour
validations:
required: true
- type: textarea
id: logs
attributes:
label: Relevant logs / network traces
description: Any server logs, browser console errors, or HAR snippets.
render: shell
+38
View File
@@ -0,0 +1,38 @@
name: Feature request
about: Suggest a new capability or improvement
labels: ["enhancement"]
body:
- type: markdown
attributes:
value: |
Thanks for proposing a feature. Before opening a request,
please skim the open issues to see if it already exists.
- type: textarea
id: problem
attributes:
label: What problem does this solve?
description: |
Describe the user need first, not the implementation.
"I can't find old notes when I have hundreds" is more
useful than "Add full-text search."
validations:
required: true
- type: textarea
id: proposal
attributes:
label: Proposed solution
description: How would you like it to work?
validations:
required: true
- type: textarea
id: alternatives
attributes:
label: Alternatives considered
description: What other approaches did you think about, and why are they worse?
- type: textarea
id: scope
attributes:
label: Scope
description: |
Out of scope is just as useful as in scope. What does
this proposal NOT include?
+33
View File
@@ -0,0 +1,33 @@
name: CI
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
ci:
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: "1.22"
cache: true
- name: Verify modules
run: go mod download && go mod verify
- name: Vet
run: make lint
- name: Build
run: make build
- name: Test
run: make test
+99
View File
@@ -0,0 +1,99 @@
name: Deploy
on:
push:
branches: [main]
tags: ["v*"]
# Required repository secrets:
# REGISTRY registry hostname, e.g. registry.librete.ch
# REGISTRY_USER robot account
# REGISTRY_PASS robot token
# DEPLOY_HOST deployment SSH target, e.g. root@librenot.es
# DEPLOY_KEY private SSH key (PEM, no passphrase)
# DEPLOY_PATH remote directory containing the compose stack
# HEALTH_URL public URL to verify post-deploy, e.g.
# https://librenot.es/healthz
#
# Tag pushes deploy the tag (vX.Y.Z); main-branch pushes deploy
# the rolling :main image. Set image to immutable tag so rollback
# is just `docker compose -f ... up -d` with the previous tag.
jobs:
build:
runs-on: ubuntu-latest
timeout-minutes: 15
if: ${{ vars.DEPLOY_ENABLED == 'true' }}
steps:
- uses: actions/checkout@v4
- uses: docker/setup-buildx-action@v3
- name: Log in to registry
uses: docker/login-action@v3
with:
registry: ${{ secrets.REGISTRY }}
username: ${{ secrets.REGISTRY_USER }}
password: ${{ secrets.REGISTRY_PASS }}
- name: Compute tags
id: tags
run: |
BASE="${{ secrets.REGISTRY }}/librenotes"
if [[ "${GITHUB_REF}" == refs/tags/* ]]; then
TAG="${GITHUB_REF##refs/tags/}"
echo "tags=${BASE}:${TAG},${BASE}:latest" >> "$GITHUB_OUTPUT"
echo "version=${TAG}" >> "$GITHUB_OUTPUT"
else
echo "tags=${BASE}:main,${BASE}:${GITHUB_SHA::7}" >> "$GITHUB_OUTPUT"
echo "version=${GITHUB_SHA::7}" >> "$GITHUB_OUTPUT"
fi
- uses: docker/build-push-action@v6
with:
context: .
push: true
tags: ${{ steps.tags.outputs.tags }}
build-args: |
VERSION=${{ steps.tags.outputs.version }}
BUILDTIME=${{ github.event.head_commit.timestamp }}
deploy:
runs-on: ubuntu-latest
needs: build
timeout-minutes: 10
if: ${{ vars.DEPLOY_ENABLED == 'true' }}
steps:
- name: Configure SSH
run: |
mkdir -p ~/.ssh
echo "${{ secrets.DEPLOY_KEY }}" > ~/.ssh/id_deploy
chmod 600 ~/.ssh/id_deploy
ssh-keyscan -H "${{ secrets.DEPLOY_HOST#*@ }}" >> ~/.ssh/known_hosts || true
- name: Pull and restart on deploy host
env:
DEPLOY_HOST: ${{ secrets.DEPLOY_HOST }}
DEPLOY_PATH: ${{ secrets.DEPLOY_PATH }}
run: |
ssh -i ~/.ssh/id_deploy "$DEPLOY_HOST" \
"cd $DEPLOY_PATH && \
docker compose -f docker-compose.yml -f docker-compose.prod.yml pull && \
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d --remove-orphans"
- name: Verify health
env:
HEALTH_URL: ${{ secrets.HEALTH_URL }}
run: |
# Give the new container ~30s to come up, then poll for
# a 200 from /healthz. Failure aborts the workflow which
# is the alert.
for i in $(seq 1 12); do
if curl -fsS "$HEALTH_URL" >/dev/null; then
echo "deploy verified"
exit 0
fi
sleep 5
done
echo "deploy verification failed"
exit 1
+6
View File
@@ -9,3 +9,9 @@
!.wave/prompts/ !.wave/prompts/
wave.yaml wave.yaml
.env .env
# Build artifacts
/librenotes
/dist/
*.test
*.out
-44
View File
@@ -1,44 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "ADR Context",
"description": "Contextual information gathered for an Architecture Decision Record",
"type": "object",
"required": ["decision_topic", "current_state", "constraints", "timestamp"],
"properties": {
"decision_topic": { "type": "string", "minLength": 5 },
"current_state": {
"type": "object",
"required": ["description"],
"properties": {
"description": { "type": "string", "minLength": 10 },
"affected_files": { "type": "array", "items": { "type": "string" } },
"affected_components": { "type": "array", "items": { "type": "string" } }
}
},
"constraints": {
"type": "array",
"items": {
"type": "object",
"required": ["type", "description"],
"properties": {
"type": { "type": "string", "enum": ["technical", "organizational", "timeline"] },
"description": { "type": "string", "minLength": 5 }
}
}
},
"precedents": {
"type": "array",
"items": {
"type": "object",
"required": ["description"],
"properties": {
"description": { "type": "string" },
"location": { "type": "string" },
"outcome": { "type": "string" }
}
}
},
"stakeholders": { "type": "array", "items": { "type": "string" } },
"timestamp": { "type": "string", "format": "date-time" }
}
}
-38
View File
@@ -1,38 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "ADR Options Analysis",
"description": "Analysis of options for an architectural decision",
"type": "object",
"required": ["decision_topic", "options", "recommendation", "timestamp"],
"properties": {
"decision_topic": { "type": "string", "minLength": 5 },
"options": {
"type": "array",
"minItems": 2,
"items": {
"type": "object",
"required": ["name", "description", "pros", "cons"],
"properties": {
"name": { "type": "string", "minLength": 1 },
"description": { "type": "string", "minLength": 10 },
"pros": { "type": "array", "items": { "type": "string" } },
"cons": { "type": "array", "items": { "type": "string" } },
"effort": { "type": "string", "enum": ["trivial", "small", "medium", "large", "epic"] },
"risk": { "type": "string", "enum": ["low", "medium", "high"] },
"reversibility": { "type": "string", "enum": ["easy", "moderate", "difficult", "irreversible"] },
"compatibility": { "type": "string", "enum": ["high", "medium", "low"] }
}
}
},
"recommendation": {
"type": "object",
"required": ["option", "rationale", "confidence"],
"properties": {
"option": { "type": "string", "minLength": 1 },
"rationale": { "type": "string", "minLength": 20 },
"confidence": { "type": "string", "enum": ["high", "medium", "low"] }
}
},
"timestamp": { "type": "string", "format": "date-time" }
}
}
@@ -1,60 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Speckit Analysis Report",
"description": "Cross-artifact consistency and quality analysis report before implementation.",
"type": "object",
"required": ["total_requirements", "total_tasks", "coverage_percent", "can_proceed", "feature_dir", "summary"],
"properties": {
"total_requirements": {
"type": "integer",
"description": "Total number of requirements extracted from spec"
},
"total_tasks": {
"type": "integer",
"description": "Total number of tasks in the task breakdown"
},
"coverage_percent": {
"type": "integer",
"minimum": 0,
"maximum": 100,
"description": "Percentage of requirements covered by tasks (0-100)"
},
"can_proceed": {
"type": "boolean",
"description": "Whether the feature is ready for implementation"
},
"feature_dir": {
"type": "string",
"minLength": 1,
"description": "Path to the feature directory"
},
"summary": {
"type": "string",
"minLength": 1,
"description": "Brief summary of the analysis findings"
},
"issues": {
"type": "object",
"properties": {
"critical": {
"type": "integer",
"description": "Number of critical severity issues"
},
"high": {
"type": "integer",
"description": "Number of high severity issues"
},
"medium": {
"type": "integer",
"description": "Number of medium severity issues"
},
"low": {
"type": "integer",
"description": "Number of low severity issues"
}
},
"description": "Issue counts grouped by severity level"
}
},
"additionalProperties": true
}
-120
View File
@@ -1,120 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Audit Report",
"description": "Zettelkasten health audit covering orphans, dangling links, and index gaps",
"type": "object",
"required": ["orphans", "dangling_links", "stats", "index_gaps", "dead_ends"],
"properties": {
"orphans": {
"type": "array",
"items": {
"type": "object",
"required": ["filename", "title"],
"properties": {
"filename": {
"type": "string",
"description": "Hex-ID filename of the orphan note"
},
"title": {
"type": "string",
"description": "Title of the orphan note"
},
"suggested_connection": {
"type": "string",
"description": "Suggested note to link from"
}
}
},
"description": "Notes with no incoming or outgoing links"
},
"dangling_links": {
"type": "array",
"items": {
"type": "object",
"required": ["source_filename", "target_filename", "link_text"],
"properties": {
"source_filename": {
"type": "string",
"description": "File containing the broken link"
},
"target_filename": {
"type": "string",
"description": "Target file that doesn't exist"
},
"link_text": {
"type": "string",
"description": "Display text of the broken link"
},
"suggested_fix": {
"type": "string",
"enum": ["retarget", "remove"],
"description": "Suggested fix action"
}
}
},
"description": "Links pointing to non-existent notes"
},
"stats": {
"type": "object",
"required": ["total_notes", "total_links"],
"properties": {
"total_notes": { "type": "integer", "minimum": 0 },
"total_links": { "type": "integer", "minimum": 0 },
"label_notes": { "type": "integer", "minimum": 0 },
"orphan_count": { "type": "integer", "minimum": 0 },
"dangling_count": { "type": "integer", "minimum": 0 },
"avg_links_per_note": { "type": "number", "minimum": 0 }
},
"description": "Overall collection statistics"
},
"index_gaps": {
"type": "array",
"items": {
"type": "object",
"required": ["section", "description"],
"properties": {
"section": {
"type": "string",
"description": "Section name missing from index"
},
"description": {
"type": "string",
"description": "What's missing"
},
"suggested_entry_point": {
"type": "string",
"description": "Suggested note to use as entry point"
}
}
},
"description": "Sections or keywords missing from the index note"
},
"dead_ends": {
"type": "array",
"items": {
"type": "object",
"required": ["filename", "title"],
"properties": {
"filename": {
"type": "string",
"description": "Hex-ID filename of the dead-end note"
},
"title": {
"type": "string",
"description": "Title of the note"
},
"outgoing_links": {
"type": "integer",
"minimum": 0,
"description": "Number of outgoing links (may have outgoing but no incoming)"
}
}
},
"description": "Notes with no incoming links (reachable only via search)"
},
"timestamp": {
"type": "string",
"format": "date-time"
}
}
}
@@ -1,55 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Categorized Changelog Changes",
"description": "Categorized and described changes for changelog generation",
"type": "object",
"required": ["version_label", "sections", "timestamp"],
"properties": {
"version_label": { "type": "string", "minLength": 1 },
"breaking_changes": {
"type": "array",
"items": {
"type": "object",
"required": ["description"],
"properties": {
"description": { "type": "string" },
"migration": { "type": "string" },
"related_commits": { "type": "array", "items": { "type": "string" } }
}
}
},
"sections": {
"type": "array",
"items": {
"type": "object",
"required": ["title", "type", "entries"],
"properties": {
"title": { "type": "string" },
"type": { "type": "string" },
"entries": {
"type": "array",
"items": {
"type": "object",
"required": ["description"],
"properties": {
"description": { "type": "string" },
"scope": { "type": "string" },
"commits": { "type": "array", "items": { "type": "string" } },
"notable": { "type": "boolean" }
}
}
}
}
}
},
"contributors": { "type": "array", "items": { "type": "string" } },
"stats": {
"type": "object",
"properties": {
"total_entries": { "type": "integer" },
"notable_entries": { "type": "integer" }
}
},
"timestamp": { "type": "string", "format": "date-time" }
}
}
@@ -1,36 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Speckit Checklist Status",
"description": "Status report from the checklist step: quality checklist generation for requirement validation.",
"type": "object",
"required": ["checklist_files", "total_items", "feature_dir", "summary"],
"properties": {
"checklist_files": {
"type": "array",
"items": {
"type": "string"
},
"description": "Paths to generated checklist files"
},
"total_items": {
"type": "integer",
"minimum": 0,
"description": "Total number of checklist items across all files"
},
"feature_dir": {
"type": "string",
"minLength": 1,
"description": "Path to the feature directory"
},
"summary": {
"type": "string",
"minLength": 1,
"description": "Brief description of the checklists generated"
},
"critical_gaps": {
"type": "integer",
"description": "Number of critical quality gaps identified"
}
},
"additionalProperties": true
}
@@ -1,30 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Speckit Clarify Status",
"description": "Status report from the clarify step: ambiguity resolution and spec refinement.",
"type": "object",
"required": ["questions_asked", "answers_encoded", "feature_dir", "summary"],
"properties": {
"questions_asked": {
"type": "integer",
"minimum": 0,
"description": "Number of clarification questions identified"
},
"answers_encoded": {
"type": "integer",
"minimum": 0,
"description": "Number of clarifications resolved and encoded into the spec"
},
"feature_dir": {
"type": "string",
"minLength": 1,
"description": "Path to the feature directory"
},
"summary": {
"type": "string",
"minLength": 1,
"description": "Brief description of clarifications made"
}
},
"additionalProperties": true
}
@@ -1,84 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "GitHub Comment Result",
"description": "Result of posting research report as a GitHub issue comment",
"type": "object",
"required": ["success", "issue_reference", "timestamp"],
"properties": {
"success": {
"type": "boolean",
"description": "Whether the comment was successfully posted"
},
"issue_reference": {
"type": "object",
"required": ["issue_number", "repository"],
"properties": {
"issue_number": {
"type": "integer",
"minimum": 1,
"description": "Issue number that was commented on"
},
"repository": {
"type": "string",
"pattern": "^[^/]+/[^/]+$",
"description": "Repository full name"
},
"issue_url": {
"type": "string",
"format": "uri",
"description": "URL to the issue"
}
}
},
"comment": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"minimum": 1,
"description": "GitHub comment ID"
},
"url": {
"type": "string",
"format": "uri",
"description": "Direct URL to the posted comment"
},
"body_length": {
"type": "integer",
"minimum": 0,
"description": "Length of the posted comment body in characters"
},
"created_at": {
"type": "string",
"format": "date-time",
"description": "When the comment was created"
}
},
"description": "Details of the posted comment (only present if success=true)"
},
"error": {
"type": "object",
"properties": {
"code": {
"type": "string",
"enum": ["authentication_failed", "rate_limit_exceeded", "issue_not_found", "issue_locked", "permission_denied", "comment_too_long", "network_error", "api_error", "unknown_error"],
"description": "Error code"
},
"message": {
"type": "string",
"description": "Human-readable error message"
},
"retryable": {
"type": "boolean",
"description": "Whether the operation can be retried"
}
},
"description": "Error details (only present if success=false)"
},
"timestamp": {
"type": "string",
"format": "date-time",
"description": "Operation timestamp"
}
}
}
@@ -1,53 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Commit Analysis",
"description": "Structured analysis of git commits for changelog generation",
"type": "object",
"required": ["range", "commits", "summary", "timestamp"],
"properties": {
"range": {
"type": "object",
"required": ["from", "to", "total_commits"],
"properties": {
"from": { "type": "string", "minLength": 1 },
"to": { "type": "string", "minLength": 1 },
"total_commits": { "type": "integer", "minimum": 0 },
"date_range": {
"type": "object",
"properties": {
"start": { "type": "string" },
"end": { "type": "string" }
}
}
}
},
"commits": {
"type": "array",
"items": {
"type": "object",
"required": ["hash", "date", "type", "subject"],
"properties": {
"hash": { "type": "string", "minLength": 4 },
"author": { "type": "string" },
"date": { "type": "string" },
"type": { "type": "string", "enum": ["feat", "fix", "docs", "refactor", "test", "chore", "perf", "ci", "other"] },
"scope": { "type": ["string", "null"] },
"subject": { "type": "string", "minLength": 1 },
"breaking": { "type": "boolean" },
"breaking_note": { "type": "string" }
}
}
},
"summary": {
"type": "object",
"required": ["by_type"],
"properties": {
"by_type": { "type": "object" },
"breaking_changes": { "type": "integer", "minimum": 0 },
"contributors": { "type": "array", "items": { "type": "string" } },
"most_changed_scopes": { "type": "array", "items": { "type": "string" } }
}
},
"timestamp": { "type": "string", "format": "date-time" }
}
}
-96
View File
@@ -1,96 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Connections",
"description": "Mapping of new content to existing Zettelkasten notes and addresses",
"type": "object",
"required": ["source_title", "related_notes", "suggested_placements"],
"properties": {
"source_title": {
"type": "string",
"description": "Title of the source being connected"
},
"related_notes": {
"type": "array",
"items": {
"type": "object",
"required": ["filename", "title", "folgezettel_address", "relationship"],
"properties": {
"filename": {
"type": "string",
"pattern": "^[0-9a-f]{8}\\.md$",
"description": "Hex-ID filename of the related note"
},
"title": {
"type": "string",
"description": "Full title of the related note"
},
"folgezettel_address": {
"type": "string",
"description": "Folgezettel address of the related note"
},
"relationship": {
"type": "string",
"description": "Why this note is related to the source"
},
"link_direction": {
"type": "string",
"enum": ["from_new", "to_new", "bidirectional"],
"description": "Whether the new note should link to this, or this should link to new"
}
}
},
"description": "Existing notes related to the source content"
},
"suggested_placements": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"required": ["folgezettel_address", "parent_note", "section", "rationale"],
"properties": {
"folgezettel_address": {
"type": "string",
"description": "Suggested Folgezettel address for a new note"
},
"parent_note": {
"type": "string",
"description": "Filename of the parent note in the Folgezettel sequence"
},
"section": {
"type": "string",
"description": "Top-level section name"
},
"rationale": {
"type": "string",
"description": "Why this placement makes sense"
},
"concept": {
"type": "string",
"description": "Which concept from the source this placement is for"
}
}
},
"description": "Suggested positions in the Folgezettel for new notes"
},
"index_update_needed": {
"type": "boolean",
"description": "Whether the index note should be updated"
},
"suggested_index_entries": {
"type": "array",
"items": {
"type": "object",
"required": ["keyword", "rationale"],
"properties": {
"keyword": { "type": "string" },
"rationale": { "type": "string" }
}
},
"description": "Suggested new entries for the index note"
},
"timestamp": {
"type": "string",
"format": "date-time"
}
}
}
@@ -1,81 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Convergent Proposals",
"description": "Prioritized simplification proposals from convergent thinking phase",
"type": "object",
"required": ["source_findings", "validation_summary", "proposals", "timestamp"],
"properties": {
"source_findings": {
"type": "object",
"required": ["total_reviewed", "confirmed", "partially_confirmed", "rejected"],
"properties": {
"total_reviewed": { "type": "integer" },
"confirmed": { "type": "integer" },
"partially_confirmed": { "type": "integer" },
"rejected": { "type": "integer" },
"rejection_reasons": {
"type": "array",
"items": {
"type": "object",
"required": ["finding_id", "reason"],
"properties": {
"finding_id": { "type": "string" },
"reason": { "type": "string" }
}
}
}
}
},
"validation_summary": {
"type": "string",
"description": "Narrative summary of the converge→diverge→converge validation process"
},
"proposals": {
"type": "array",
"items": {
"type": "object",
"required": ["id", "title", "description", "source_findings", "impact", "effort", "risk", "tier", "files"],
"properties": {
"id": { "type": "string", "pattern": "^SMP-\\d{3}$" },
"title": { "type": "string" },
"description": { "type": "string" },
"source_findings": {
"type": "array",
"items": { "type": "string" },
"description": "DVG-xxx IDs this proposal addresses"
},
"impact": { "type": "string", "enum": ["high", "medium", "low"] },
"effort": { "type": "string", "enum": ["small", "medium", "large"] },
"risk": { "type": "string", "enum": ["low", "medium", "high"] },
"tier": {
"type": "integer",
"minimum": 1,
"maximum": 3,
"description": "Priority tier: 1=do now, 2=do next, 3=consider later"
},
"files": {
"type": "array",
"items": { "type": "string" },
"description": "Files that would be modified"
},
"dependencies": {
"type": "array",
"items": { "type": "string" },
"description": "SMP-xxx IDs that must be applied first"
},
"lines_removed_estimate": { "type": "integer" },
"second_order_effects": {
"type": "array",
"items": { "type": "string" },
"description": "Insights discovered during deeper probing"
}
}
}
},
"eighty_twenty_analysis": {
"type": "string",
"description": "Which 20% of proposals yield 80% of the simplification benefit"
},
"timestamp": { "type": "string", "format": "date-time" }
}
}
@@ -1,24 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"required": ["current_coverage", "uncovered_functions", "uncovered_branches", "edge_cases", "mock_requirements"],
"properties": {
"current_coverage": { "type": "string" },
"uncovered_functions": {
"type": "array",
"items": { "type": "string" }
},
"uncovered_branches": {
"type": "array",
"items": { "type": "string" }
},
"edge_cases": {
"type": "array",
"items": { "type": "string" }
},
"mock_requirements": {
"type": "array",
"items": { "type": "string" }
}
}
}
@@ -1,42 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Dead Code Scan",
"description": "Scan results for dead or redundant code",
"type": "object",
"required": ["target", "findings", "summary", "timestamp"],
"properties": {
"target": { "type": "string", "minLength": 1 },
"findings": {
"type": "array",
"items": {
"type": "object",
"required": ["id", "type", "location", "description", "confidence", "safe_to_remove"],
"properties": {
"id": { "type": "string", "pattern": "^DC-[0-9]{3}$" },
"type": {
"type": "string",
"enum": ["unused_export", "unreachable", "orphaned_file", "redundant", "stale_test", "unused_import", "commented_code"]
},
"location": { "type": "string", "minLength": 1 },
"symbol": { "type": "string" },
"description": { "type": "string", "minLength": 5 },
"evidence": { "type": "string" },
"confidence": { "type": "string", "enum": ["high", "medium", "low"] },
"safe_to_remove": { "type": "boolean" },
"removal_note": { "type": "string" }
}
}
},
"summary": {
"type": "object",
"required": ["total_findings"],
"properties": {
"total_findings": { "type": "integer", "minimum": 0 },
"by_type": { "type": "object" },
"high_confidence_count": { "type": "integer", "minimum": 0 },
"estimated_lines_removable": { "type": "integer", "minimum": 0 }
}
},
"timestamp": { "type": "string", "format": "date-time" }
}
}
@@ -1,22 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"required": ["hypotheses"],
"properties": {
"hypotheses": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"required": ["id", "description", "likelihood", "test_approach"],
"properties": {
"id": { "type": "integer" },
"description": { "type": "string", "minLength": 1 },
"likelihood": { "type": "string", "enum": ["high", "medium", "low"] },
"test_approach": { "type": "string", "minLength": 1 },
"expected_result_if_true": { "type": "string" }
}
}
}
}
}
@@ -1,21 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"required": ["expected_behavior", "actual_behavior", "reproduction_steps", "relevant_files"],
"properties": {
"expected_behavior": { "type": "string", "minLength": 1 },
"actual_behavior": { "type": "string", "minLength": 1 },
"reproduction_steps": {
"type": "array",
"items": { "type": "string" }
},
"relevant_files": {
"type": "array",
"items": { "type": "string" }
},
"environmental_factors": {
"type": "array",
"items": { "type": "string" }
}
}
}
-31
View File
@@ -1,31 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"required": ["files_changed", "modules_affected", "related_tests", "breaking_changes"],
"properties": {
"files_changed": {
"type": "array",
"items": {
"type": "object",
"required": ["path", "change_type", "purpose"],
"properties": {
"path": { "type": "string" },
"change_type": { "type": "string", "enum": ["added", "modified", "deleted"] },
"purpose": { "type": "string" }
}
}
},
"modules_affected": {
"type": "array",
"items": { "type": "string" }
},
"related_tests": {
"type": "array",
"items": { "type": "string" }
},
"breaking_changes": {
"type": "array",
"items": { "type": "string" }
}
}
}
@@ -1,82 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Divergent Findings",
"description": "Broad-net findings from divergent thinking phase of the recinq pipeline",
"type": "object",
"required": ["scope", "findings", "metrics_summary", "timestamp"],
"properties": {
"scope": {
"type": "object",
"required": ["target", "files_scanned", "total_lines"],
"properties": {
"target": { "type": "string", "description": "What was analyzed (path, module, or 'whole-project')" },
"files_scanned": { "type": "integer" },
"total_lines": { "type": "integer" }
}
},
"findings": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"required": ["id", "category", "title", "description", "evidence", "severity"],
"properties": {
"id": { "type": "string", "pattern": "^DVG-\\d{3}$" },
"category": {
"type": "string",
"enum": [
"premature_abstraction",
"unnecessary_indirection",
"overengineering",
"yagni_violation",
"accidental_complexity",
"copy_paste_drift",
"dead_weight",
"naming_lie",
"dependency_gravity",
"missing_abstraction",
"other"
]
},
"title": { "type": "string" },
"description": { "type": "string" },
"evidence": {
"type": "object",
"required": ["files"],
"properties": {
"files": { "type": "array", "items": { "type": "string" } },
"line_count": { "type": "integer" },
"reference_count": { "type": "integer" },
"change_frequency": { "type": "integer" },
"metrics": { "type": "string" }
}
},
"severity": {
"type": "string",
"enum": ["critical", "high", "medium", "low"]
},
"confidence": {
"type": "string",
"enum": ["high", "medium", "low"],
"description": "How confident the provocateur is in this finding"
}
}
}
},
"metrics_summary": {
"type": "object",
"required": ["total_findings"],
"properties": {
"total_findings": { "type": "integer" },
"by_category": { "type": "object", "additionalProperties": { "type": "integer" } },
"by_severity": { "type": "object", "additionalProperties": { "type": "integer" } },
"hotspot_files": {
"type": "array",
"items": { "type": "string" },
"description": "Files appearing in multiple findings"
}
}
},
"timestamp": { "type": "string", "format": "date-time" }
}
}
@@ -1,87 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Documentation Consistency Report",
"description": "Output from the analyze-consistency step: list of inconsistencies between code and documentation",
"type": "object",
"required": ["summary", "inconsistencies", "timestamp"],
"properties": {
"summary": {
"type": "object",
"required": ["total_count", "by_severity"],
"properties": {
"total_count": {
"type": "integer",
"minimum": 0,
"description": "Total number of inconsistencies found"
},
"by_severity": {
"type": "object",
"properties": {
"critical": { "type": "integer", "minimum": 0 },
"high": { "type": "integer", "minimum": 0 },
"medium": { "type": "integer", "minimum": 0 },
"low": { "type": "integer", "minimum": 0 }
},
"description": "Count of inconsistencies by severity level"
},
"clean": {
"type": "boolean",
"description": "True if no inconsistencies were found"
}
}
},
"inconsistencies": {
"type": "array",
"items": {
"type": "object",
"required": ["id", "severity", "category", "title", "description", "source_location", "doc_location"],
"properties": {
"id": {
"type": "string",
"pattern": "^DOC-[0-9]{3}$",
"description": "Unique inconsistency ID (DOC-001, DOC-002, etc.)"
},
"severity": {
"type": "string",
"enum": ["critical", "high", "medium", "low"],
"description": "Severity of the inconsistency"
},
"category": {
"type": "string",
"enum": ["cli_flags", "personas", "pipelines", "contracts", "env_vars", "api", "stale_reference", "missing_docs", "other"],
"description": "Category of the inconsistency"
},
"title": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Short title describing the inconsistency"
},
"description": {
"type": "string",
"minLength": 1,
"description": "Detailed description of the inconsistency and what needs to change"
},
"source_location": {
"type": "string",
"description": "File and line where the source of truth is (code, pipeline, etc.)"
},
"doc_location": {
"type": "string",
"description": "File and section where the documentation is stale or missing"
},
"fix_description": {
"type": "string",
"description": "What specifically needs to be updated"
}
}
},
"description": "List of documentation inconsistencies"
},
"timestamp": {
"type": "string",
"format": "date-time",
"description": "When the analysis was performed"
}
}
}
@@ -1,71 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Documentation Issue Result",
"description": "Output from the create-issue step: GitHub issue creation result",
"type": "object",
"required": ["success", "repository", "timestamp"],
"properties": {
"success": {
"type": "boolean",
"description": "Whether the issue was successfully created"
},
"repository": {
"type": "string",
"pattern": "^[^/]+/[^/]+$",
"description": "Repository full name (owner/repo)"
},
"issue": {
"type": "object",
"properties": {
"number": {
"type": "integer",
"minimum": 1,
"description": "GitHub issue number"
},
"url": {
"type": "string",
"format": "uri",
"description": "URL to the created issue"
},
"title": {
"type": "string",
"description": "Issue title"
},
"inconsistency_count": {
"type": "integer",
"minimum": 0,
"description": "Number of inconsistencies reported in the issue"
}
},
"description": "Details of the created issue (only present if success=true)"
},
"skipped": {
"type": "boolean",
"description": "True if no issue was created because no inconsistencies were found"
},
"error": {
"type": "object",
"properties": {
"code": {
"type": "string",
"enum": ["authentication_failed", "rate_limit_exceeded", "permission_denied", "network_error", "api_error", "unknown_error"],
"description": "Error code"
},
"message": {
"type": "string",
"description": "Human-readable error message"
},
"retryable": {
"type": "boolean",
"description": "Whether the operation can be retried"
}
},
"description": "Error details (only present if success=false)"
},
"timestamp": {
"type": "string",
"format": "date-time",
"description": "Operation timestamp"
}
}
}
@@ -1,112 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Documentation Scan Results",
"description": "Output from the scan-changes step: changed files and current documentation state snapshot",
"type": "object",
"required": ["scan_scope", "changed_files", "documentation_snapshot", "timestamp"],
"properties": {
"scan_scope": {
"type": "object",
"required": ["mode", "range"],
"properties": {
"mode": {
"type": "string",
"enum": ["diff", "full"],
"description": "Whether this was a diff-based or full scan"
},
"range": {
"type": "string",
"description": "Git range used for diff (e.g. 'main...HEAD') or 'full' for full scan"
},
"base_ref": {
"type": "string",
"description": "Base reference for comparison"
}
}
},
"changed_files": {
"type": "object",
"required": ["total_count", "categories"],
"properties": {
"total_count": {
"type": "integer",
"minimum": 0,
"description": "Total number of changed files"
},
"categories": {
"type": "object",
"properties": {
"go_code": {
"type": "array",
"items": { "type": "string" },
"description": "Changed Go source files"
},
"cli_commands": {
"type": "array",
"items": { "type": "string" },
"description": "Changed CLI command files (cmd/wave/commands/)"
},
"pipelines": {
"type": "array",
"items": { "type": "string" },
"description": "Changed pipeline definitions"
},
"personas": {
"type": "array",
"items": { "type": "string" },
"description": "Changed persona definitions"
},
"contracts": {
"type": "array",
"items": { "type": "string" },
"description": "Changed contract schemas"
},
"documentation": {
"type": "array",
"items": { "type": "string" },
"description": "Changed documentation files (docs/, README.md, CLAUDE.md, etc.)"
},
"other": {
"type": "array",
"items": { "type": "string" },
"description": "Other changed files"
}
}
}
}
},
"documentation_snapshot": {
"type": "object",
"required": ["files"],
"properties": {
"files": {
"type": "array",
"items": {
"type": "object",
"required": ["path", "exists"],
"properties": {
"path": {
"type": "string",
"description": "Path to the documentation file"
},
"exists": {
"type": "boolean",
"description": "Whether the file exists"
},
"summary": {
"type": "string",
"description": "Brief summary of the file's content and key sections"
}
}
},
"description": "Key documentation files and their current state"
}
}
},
"timestamp": {
"type": "string",
"format": "date-time",
"description": "When the scan was performed"
}
}
}
-38
View File
@@ -1,38 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Doc Sync Scan Results",
"description": "Documentation inconsistency scan for doc-sync pipeline",
"type": "object",
"required": ["scan_scope", "findings", "summary", "timestamp"],
"properties": {
"scan_scope": { "type": "string", "minLength": 1 },
"findings": {
"type": "array",
"items": {
"type": "object",
"required": ["id", "type", "severity", "title", "description"],
"properties": {
"id": { "type": "string", "pattern": "^DOC-[0-9]{3}$" },
"type": { "type": "string", "enum": ["MISSING_DOCS", "STALE_DOCS", "INACCURATE", "INCOMPLETE"] },
"severity": { "type": "string", "enum": ["CRITICAL", "HIGH", "MEDIUM", "LOW"] },
"title": { "type": "string", "minLength": 3 },
"doc_location": { "type": "string" },
"code_location": { "type": "string" },
"description": { "type": "string", "minLength": 10 },
"suggested_fix": { "type": "string" }
}
}
},
"summary": {
"type": "object",
"required": ["total_findings"],
"properties": {
"total_findings": { "type": "integer", "minimum": 0 },
"by_type": { "type": "object" },
"by_severity": { "type": "object" },
"fixable_count": { "type": "integer", "minimum": 0 }
}
},
"timestamp": { "type": "string", "format": "date-time" }
}
}
-112
View File
@@ -1,112 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "https://schema.recinq.com/wave/docs-phase.schema.json",
"title": "Wave Docs Phase Output Contract",
"description": "Validates docs phase outputs for prototype-driven development pipeline",
"type": "object",
"properties": {
"phase": {
"type": "string",
"const": "docs",
"description": "Phase identifier"
},
"artifacts": {
"type": "object",
"properties": {
"feature_docs": {
"type": "object",
"properties": {
"path": {
"type": "string",
"pattern": "^.*feature-docs\\.md$",
"description": "Path to feature documentation file"
},
"exists": {
"type": "boolean",
"const": true,
"description": "Feature documentation file must exist"
},
"content_type": {
"type": "string",
"const": "markdown",
"description": "Documentation content format"
}
},
"required": ["path", "exists", "content_type"],
"additionalProperties": false
},
"stakeholder_summary": {
"type": "object",
"properties": {
"path": {
"type": "string",
"pattern": "^.*stakeholder-summary\\.md$",
"description": "Path to stakeholder summary file"
},
"exists": {
"type": "boolean",
"const": true,
"description": "Stakeholder summary file must exist"
},
"content_type": {
"type": "string",
"const": "markdown",
"description": "Summary content format"
}
},
"required": ["path", "exists", "content_type"],
"additionalProperties": false
}
},
"required": ["feature_docs", "stakeholder_summary"],
"additionalProperties": true
},
"validation": {
"type": "object",
"properties": {
"coverage_percentage": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "Specification coverage in documentation"
},
"readability_score": {
"type": "integer",
"minimum": 0,
"maximum": 100,
"description": "Documentation readability rating"
},
"documentation_quality": {
"type": "string",
"enum": ["poor", "fair", "good", "excellent"],
"description": "Overall documentation quality assessment"
}
},
"required": ["documentation_quality"],
"additionalProperties": false
},
"metadata": {
"type": "object",
"properties": {
"timestamp": {
"type": "string",
"format": "date-time",
"description": "When docs phase was completed"
},
"duration_seconds": {
"type": "number",
"minimum": 0,
"description": "Time taken for docs phase"
},
"source_spec_path": {
"type": "string",
"description": "Path to source specification file"
}
},
"required": ["timestamp", "source_spec_path"],
"additionalProperties": false
}
},
"required": ["phase", "artifacts", "validation", "metadata"],
"additionalProperties": false
}
-110
View File
@@ -1,110 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "https://schema.recinq.com/wave/dummy-phase.schema.json",
"title": "Wave Dummy Phase Output Contract",
"description": "Validates dummy phase outputs for prototype-driven development pipeline",
"type": "object",
"properties": {
"phase": {
"type": "string",
"const": "dummy",
"description": "Phase identifier"
},
"artifacts": {
"type": "object",
"properties": {
"prototype": {
"type": "object",
"properties": {
"path": {
"type": "string",
"pattern": "^.*prototype/?$",
"description": "Path to prototype directory"
},
"exists": {
"type": "boolean",
"const": true,
"description": "Prototype directory must exist"
},
"content_type": {
"type": "string",
"const": "code",
"description": "Prototype content type"
}
},
"required": ["path", "exists", "content_type"],
"additionalProperties": false
},
"interface_definitions": {
"type": "object",
"properties": {
"path": {
"type": "string",
"pattern": "^.*interfaces\\.md$",
"description": "Path to interface definitions file"
},
"exists": {
"type": "boolean",
"const": true,
"description": "Interface definitions file must exist"
},
"content_type": {
"type": "string",
"const": "markdown",
"description": "Interface definitions content format"
}
},
"required": ["path", "exists", "content_type"],
"additionalProperties": false
}
},
"required": ["prototype", "interface_definitions"],
"additionalProperties": true
},
"validation": {
"type": "object",
"properties": {
"runnable": {
"type": "boolean",
"description": "Whether the prototype can be executed"
},
"interface_completeness": {
"type": "integer",
"minimum": 0,
"maximum": 100,
"description": "Percentage of interfaces stubbed"
},
"prototype_quality": {
"type": "string",
"enum": ["poor", "fair", "good", "excellent"],
"description": "Overall prototype quality assessment"
}
},
"required": ["runnable", "prototype_quality"],
"additionalProperties": false
},
"metadata": {
"type": "object",
"properties": {
"timestamp": {
"type": "string",
"format": "date-time",
"description": "When dummy phase was completed"
},
"duration_seconds": {
"type": "number",
"minimum": 0,
"description": "Time taken for dummy phase"
},
"source_docs_path": {
"type": "string",
"description": "Path to source documentation file"
}
},
"required": ["timestamp", "source_docs_path"],
"additionalProperties": false
}
},
"required": ["phase", "artifacts", "validation", "metadata"],
"additionalProperties": false
}
@@ -1,98 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Editorial Plan",
"description": "Analysis of a blog draft with a mapped editorial plan based on author criticism",
"type": "object",
"required": ["draft_filename", "draft_title", "sections", "editorial_actions"],
"properties": {
"draft_filename": {
"type": "string",
"pattern": "^[0-9a-f]{8}\\.md$",
"description": "Hex-ID filename of the draft note"
},
"draft_title": {
"type": "string",
"description": "Title of the blog draft"
},
"sections": {
"type": "array",
"items": {
"type": "object",
"required": ["heading", "line_range", "summary"],
"properties": {
"heading": {
"type": "string",
"description": "Section heading text"
},
"line_range": {
"type": "string",
"description": "Line range in the file (e.g., 15-42)"
},
"summary": {
"type": "string",
"description": "Brief summary of what this section covers"
},
"word_count": {
"type": "integer",
"minimum": 0
}
}
},
"description": "Structural map of the draft's sections"
},
"editorial_actions": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"required": ["id", "type", "target_section", "description", "criticism_addressed"],
"properties": {
"id": {
"type": "string",
"pattern": "^EDIT-[0-9]{3}$",
"description": "Unique action identifier"
},
"type": {
"type": "string",
"enum": ["rewrite", "restructure", "cut", "expand", "add", "replace_example", "fix_tone", "fix_links"],
"description": "Type of editorial action"
},
"target_section": {
"type": "string",
"description": "Section heading this action targets, or 'global' for whole-draft changes"
},
"description": {
"type": "string",
"description": "Specific description of what to change and why"
},
"criticism_addressed": {
"type": "string",
"description": "Which part of the author's criticism this action addresses"
},
"priority": {
"type": "string",
"enum": ["high", "medium", "low"],
"description": "How critical this edit is"
}
}
},
"description": "Ordered list of editorial actions to apply"
},
"linked_notes": {
"type": "array",
"items": {
"type": "object",
"required": ["filename", "title"],
"properties": {
"filename": { "type": "string" },
"title": { "type": "string" }
}
},
"description": "Notes currently linked from the draft"
},
"timestamp": {
"type": "string",
"format": "date-time"
}
}
}
@@ -1,76 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Code Architecture Analysis",
"description": "Architecture and design analysis of explored code",
"type": "object",
"required": ["topic", "patterns", "timestamp"],
"properties": {
"topic": { "type": "string", "minLength": 3 },
"patterns": {
"type": "array",
"items": {
"type": "object",
"required": ["name", "where", "why"],
"properties": {
"name": { "type": "string" },
"where": { "type": "string" },
"why": { "type": "string" },
"quality": { "type": "string", "enum": ["well-implemented", "adequate", "needs-improvement"] }
}
}
},
"data_flow": {
"type": "array",
"items": {
"type": "object",
"required": ["name"],
"properties": {
"name": { "type": "string" },
"stages": { "type": "array", "items": { "type": "string" } },
"key_transformations": { "type": "array", "items": { "type": "string" } }
}
}
},
"error_handling": {
"type": "object",
"properties": {
"strategy": { "type": "string" },
"patterns": { "type": "array", "items": { "type": "string" } },
"gaps": { "type": "array", "items": { "type": "string" } }
}
},
"concurrency": {
"type": "object",
"properties": {
"model": { "type": "string" },
"primitives": { "type": "array", "items": { "type": "string" } },
"risks": { "type": "array", "items": { "type": "string" } }
}
},
"extension_points": {
"type": "array",
"items": {
"type": "object",
"required": ["interface", "file"],
"properties": {
"interface": { "type": "string" },
"file": { "type": "string" },
"purpose": { "type": "string" }
}
}
},
"design_decisions": {
"type": "array",
"items": {
"type": "object",
"required": ["decision"],
"properties": {
"decision": { "type": "string" },
"rationale": { "type": "string" },
"trade_offs": { "type": "string" }
}
}
},
"timestamp": { "type": "string", "format": "date-time" }
}
}
@@ -1,62 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Explain Exploration Results",
"description": "Structured exploration of a codebase topic for explanation",
"type": "object",
"required": ["topic", "entry_points", "key_types", "timestamp"],
"properties": {
"topic": { "type": "string", "minLength": 1 },
"entry_points": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"required": ["file", "symbol", "role"],
"properties": {
"file": { "type": "string", "minLength": 1 },
"symbol": { "type": "string", "minLength": 1 },
"role": { "type": "string", "minLength": 1 },
"line": { "type": "integer", "minimum": 1 }
}
}
},
"key_types": {
"type": "array",
"items": {
"type": "object",
"required": ["name", "file", "purpose"],
"properties": {
"name": { "type": "string", "minLength": 1 },
"file": { "type": "string", "minLength": 1 },
"purpose": { "type": "string", "minLength": 1 },
"methods": { "type": "array", "items": { "type": "string" } },
"relationships": { "type": "array", "items": { "type": "string" } }
}
}
},
"call_flows": {
"type": "array",
"items": {
"type": "object",
"required": ["name", "steps"],
"properties": {
"name": { "type": "string" },
"steps": { "type": "array", "items": { "type": "string" } },
"description": { "type": "string" }
}
}
},
"dependencies": {
"type": "object",
"properties": {
"depends_on": { "type": "array", "items": { "type": "string" } },
"depended_by": { "type": "array", "items": { "type": "string" } },
"external": { "type": "array", "items": { "type": "string" } }
}
},
"test_files": { "type": "array", "items": { "type": "string" } },
"config_points": { "type": "array", "items": { "type": "string" } },
"file_count": { "type": "integer", "minimum": 0 },
"timestamp": { "type": "string", "format": "date-time" }
}
}
@@ -1,52 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Feature Exploration",
"description": "Codebase exploration for feature implementation",
"type": "object",
"required": ["feature", "scope", "related_files", "timestamp"],
"properties": {
"feature": { "type": "string", "minLength": 1 },
"scope": { "type": "string", "enum": ["small", "medium", "large"] },
"related_files": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"required": ["path", "relevance", "reason"],
"properties": {
"path": { "type": "string", "minLength": 1 },
"relevance": { "type": "string", "enum": ["primary", "secondary"] },
"reason": { "type": "string", "minLength": 1 },
"key_symbols": { "type": "array", "items": { "type": "string" } }
}
}
},
"patterns_to_follow": {
"type": "array",
"items": {
"type": "object",
"required": ["name"],
"properties": {
"name": { "type": "string" },
"example_file": { "type": "string" },
"relevance": { "type": "string", "enum": ["must_follow", "should_follow"] }
}
}
},
"affected_modules": { "type": "array", "items": { "type": "string" } },
"test_files": { "type": "array", "items": { "type": "string" } },
"risks": {
"type": "array",
"items": {
"type": "object",
"required": ["description", "severity"],
"properties": {
"description": { "type": "string" },
"severity": { "type": "string", "enum": ["high", "medium", "low"] },
"mitigation": { "type": "string" }
}
}
},
"timestamp": { "type": "string", "format": "date-time" }
}
}
-33
View File
@@ -1,33 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Feature Implementation Plan",
"description": "Ordered implementation plan for a feature",
"type": "object",
"required": ["feature", "steps", "total_complexity", "timestamp"],
"properties": {
"feature": { "type": "string", "minLength": 5 },
"steps": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"required": ["id", "title", "description"],
"properties": {
"id": { "type": "string", "pattern": "^S\\d{2}$" },
"title": { "type": "string" },
"description": { "type": "string" },
"files_to_modify": { "type": "array", "items": { "type": "string" } },
"files_to_create": { "type": "array", "items": { "type": "string" } },
"tests_to_write": { "type": "array", "items": { "type": "string" } },
"acceptance_criteria": { "type": "array", "items": { "type": "string" } },
"complexity": { "type": "string", "enum": ["S", "M", "L"] },
"dependencies": { "type": "array", "items": { "type": "string" } }
}
}
},
"total_complexity": { "type": "string", "enum": ["S", "M", "L", "XL"] },
"branch_name_suggestion": { "type": "string" },
"commit_message_suggestion": { "type": "string" },
"timestamp": { "type": "string", "format": "date-time" }
}
}
-38
View File
@@ -1,38 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Investigation Findings",
"type": "object",
"required": [
"root_cause",
"affected_files",
"fix_approach"
],
"properties": {
"root_cause": {
"type": "string",
"description": "Description of the root cause"
},
"affected_files": {
"type": "array",
"items": {
"type": "string"
},
"description": "List of affected file paths"
},
"recent_commits": {
"type": "array",
"items": {
"type": "string"
},
"description": "List of relevant commit hashes"
},
"blast_radius": {
"type": "string",
"description": "Assessment of what else could be affected"
},
"fix_approach": {
"type": "string",
"description": "Recommended approach to fix the issue"
}
}
}
@@ -1,65 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "GitHub Issue Enhancement Plan",
"description": "Schema for GitHub issue enhancement recommendations",
"type": "object",
"required": ["issues_to_enhance"],
"properties": {
"issues_to_enhance": {
"type": "array",
"items": {
"type": "object",
"required": ["issue_number", "enhancements"],
"properties": {
"issue_number": {
"type": "integer",
"minimum": 1
},
"current_title": {
"type": "string"
},
"suggested_title": {
"type": "string"
},
"current_body": {
"type": "string"
},
"body_template": {
"type": ["string", "null"],
"description": "Enhanced body template preserving original content"
},
"suggested_labels": {
"type": "array",
"items": {
"type": "string"
}
},
"enhancements": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 1,
"description": "List of specific enhancements to apply"
},
"rationale": {
"type": "string",
"description": "Why these enhancements are recommended"
},
"priority": {
"type": "string",
"enum": ["high", "medium", "low"]
}
}
}
},
"total_to_enhance": {
"type": "integer",
"minimum": 0
},
"enhancement_strategy": {
"type": "string",
"description": "Overall strategy for enhancements"
}
}
}
@@ -1,71 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "GitHub Issue Enhancement Results",
"description": "Schema for GitHub issue enhancement execution results",
"type": "object",
"required": ["enhanced_issues", "total_attempted", "total_successful"],
"properties": {
"enhanced_issues": {
"type": "array",
"items": {
"type": "object",
"required": ["issue_number", "success", "changes_made", "url"],
"properties": {
"issue_number": {
"type": "integer",
"minimum": 1
},
"success": {
"type": "boolean"
},
"changes_made": {
"type": "array",
"items": {
"type": "string"
},
"description": "List of changes successfully applied"
},
"title_updated": {
"type": "boolean"
},
"body_updated": {
"type": "boolean"
},
"labels_added": {
"type": "array",
"items": {
"type": "string"
}
},
"comment_added": {
"type": "boolean"
},
"error": {
"type": "string",
"description": "Error message if enhancement failed"
},
"url": {
"type": "string",
"format": "uri"
}
}
}
},
"total_attempted": {
"type": "integer",
"minimum": 0
},
"total_successful": {
"type": "integer",
"minimum": 0
},
"total_failed": {
"type": "integer",
"minimum": 0
},
"timestamp": {
"type": "string",
"format": "date-time"
}
}
}
@@ -1,86 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "GitHub Issue Analysis",
"description": "Schema for GitHub issue quality analysis results",
"type": "object",
"required": ["repository", "total_issues", "poor_quality_issues"],
"properties": {
"repository": {
"type": "object",
"required": ["owner", "name"],
"properties": {
"owner": {
"type": "string",
"minLength": 1
},
"name": {
"type": "string",
"minLength": 1
}
}
},
"total_issues": {
"type": "integer",
"minimum": 0
},
"analyzed_count": {
"type": "integer",
"minimum": 0
},
"poor_quality_issues": {
"type": "array",
"items": {
"type": "object",
"required": ["number", "title", "quality_score", "problems"],
"properties": {
"number": {
"type": "integer",
"minimum": 1
},
"title": {
"type": "string"
},
"body": {
"type": "string"
},
"quality_score": {
"type": "integer",
"minimum": 0,
"maximum": 100
},
"problems": {
"type": "array",
"items": {
"type": "string"
}
},
"recommendations": {
"type": "array",
"items": {
"type": "string"
}
},
"labels": {
"type": "array",
"items": {
"type": "string"
}
},
"url": {
"type": "string",
"format": "uri"
}
}
}
},
"quality_threshold": {
"type": "integer",
"minimum": 0,
"maximum": 100
},
"timestamp": {
"type": "string",
"format": "date-time"
}
}
}
@@ -1,87 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "GitHub Enhancement Verification Report",
"description": "Schema for verifying GitHub issue enhancements were applied",
"type": "object",
"required": ["total_enhanced", "successful_enhancements", "failed_enhancements"],
"properties": {
"total_enhanced": {
"type": "integer",
"minimum": 0
},
"successful_enhancements": {
"type": "array",
"items": {
"type": "object",
"required": ["issue_number", "verified_changes"],
"properties": {
"issue_number": {
"type": "integer",
"minimum": 1
},
"verified_changes": {
"type": "array",
"items": {
"type": "string"
}
},
"quality_score_before": {
"type": "integer",
"minimum": 0,
"maximum": 100
},
"quality_score_after": {
"type": "integer",
"minimum": 0,
"maximum": 100
},
"url": {
"type": "string",
"format": "uri"
}
}
}
},
"failed_enhancements": {
"type": "array",
"items": {
"type": "object",
"required": ["issue_number", "problems"],
"properties": {
"issue_number": {
"type": "integer",
"minimum": 1
},
"problems": {
"type": "array",
"items": {
"type": "string"
}
}
}
}
},
"quality_improvement": {
"type": "object",
"properties": {
"average_score_before": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"average_score_after": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"improvement_percentage": {
"type": "number"
}
}
},
"summary": {
"type": "string",
"description": "Human-readable summary of verification results"
}
}
}
@@ -1,26 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Hello World Result",
"description": "Verification result from the hello-world verify step",
"type": "object",
"required": ["success", "message"],
"properties": {
"success": {
"type": "boolean",
"description": "Whether the hello-world pipeline completed successfully"
},
"message": {
"type": "string",
"description": "Human-readable verification result"
},
"checks": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
},
"description": "Optional list of individual verification checks performed"
}
},
"additionalProperties": true
}
-138
View File
@@ -1,138 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "https://schema.recinq.com/wave/implement-phase.schema.json",
"title": "Wave Implement Phase Output Contract",
"description": "Validates implementation phase outputs for prototype-driven development pipeline",
"type": "object",
"properties": {
"phase": {
"type": "string",
"const": "implement",
"description": "Phase identifier"
},
"artifacts": {
"type": "object",
"properties": {
"implementation_plan": {
"type": "object",
"properties": {
"path": {
"type": "string",
"pattern": "^.*implementation-plan\\.md$",
"description": "Path to implementation plan file"
},
"exists": {
"type": "boolean",
"const": true,
"description": "Implementation plan file must exist"
},
"content_type": {
"type": "string",
"const": "markdown",
"description": "Implementation plan content format"
}
},
"required": ["path", "exists", "content_type"],
"additionalProperties": false
},
"progress_checklist": {
"type": "object",
"properties": {
"path": {
"type": "string",
"pattern": "^.*implementation-checklist\\.md$",
"description": "Path to progress checklist file"
},
"exists": {
"type": "boolean",
"const": true,
"description": "Progress checklist file must exist"
},
"content_type": {
"type": "string",
"const": "markdown",
"description": "Checklist content format"
}
},
"required": ["path", "exists", "content_type"],
"additionalProperties": false
}
},
"required": ["implementation_plan", "progress_checklist"],
"additionalProperties": true
},
"validation": {
"type": "object",
"properties": {
"tests_executed": {
"type": "boolean",
"description": "Whether test suite was executed"
},
"test_results": {
"type": "object",
"properties": {
"total": {
"type": "integer",
"minimum": 0,
"description": "Total number of tests"
},
"passed": {
"type": "integer",
"minimum": 0,
"description": "Number of tests that passed"
},
"failed": {
"type": "integer",
"minimum": 0,
"description": "Number of tests that failed"
},
"coverage_percent": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "Test coverage percentage"
}
},
"required": ["total", "passed", "failed"],
"additionalProperties": false
},
"implementation_readiness": {
"type": "string",
"enum": ["ready", "partial", "needs_work"],
"description": "Assessment of implementation readiness"
}
},
"required": ["tests_executed", "implementation_readiness"],
"additionalProperties": false
},
"metadata": {
"type": "object",
"properties": {
"timestamp": {
"type": "string",
"format": "date-time",
"description": "When implementation phase was completed"
},
"duration_seconds": {
"type": "number",
"minimum": 0,
"description": "Time taken for implementation phase"
},
"previous_phases": {
"type": "array",
"items": {
"type": "string",
"enum": ["spec", "docs", "dummy"]
},
"minItems": 3,
"maxItems": 3,
"description": "Previous phases that fed into this implementation"
}
},
"required": ["timestamp", "previous_phases"],
"additionalProperties": false
}
},
"required": ["phase", "artifacts", "validation", "metadata"],
"additionalProperties": false
}
@@ -1,44 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Improvement Assessment",
"description": "Structured assessment of code improvement opportunities",
"type": "object",
"required": ["target", "findings", "summary", "timestamp"],
"properties": {
"target": { "type": "string", "minLength": 1 },
"findings": {
"type": "array",
"items": {
"type": "object",
"required": ["id", "category", "title", "location", "description", "impact", "effort"],
"properties": {
"id": { "type": "string", "pattern": "^IMP-[0-9]{3}$" },
"category": {
"type": "string",
"enum": ["error_handling", "performance", "testability", "robustness", "maintainability", "code_quality"]
},
"title": { "type": "string", "minLength": 3 },
"location": { "type": "string", "minLength": 1 },
"description": { "type": "string", "minLength": 10 },
"current_code": { "type": "string" },
"suggested_fix": { "type": "string", "minLength": 5 },
"impact": { "type": "string", "enum": ["high", "medium", "low"] },
"effort": { "type": "string", "enum": ["trivial", "small", "medium", "large"] },
"risk": { "type": "string", "enum": ["none", "low", "medium", "high"] }
}
}
},
"summary": {
"type": "object",
"required": ["total_findings", "overall_quality"],
"properties": {
"total_findings": { "type": "integer", "minimum": 0 },
"by_category": { "type": "object" },
"quick_wins": { "type": "array", "items": { "type": "string" } },
"high_impact": { "type": "array", "items": { "type": "string" } },
"overall_quality": { "type": "string", "minLength": 10 }
}
},
"timestamp": { "type": "string", "format": "date-time" }
}
}
@@ -1,91 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "GitHub Issue Implementation Assessment",
"type": "object",
"required": ["implementable", "issue", "assessment"],
"properties": {
"implementable": {
"type": "boolean",
"const": true,
"description": "Must be true for the pipeline to proceed. Set to false if the issue lacks sufficient detail."
},
"issue": {
"type": "object",
"required": ["number", "title", "body", "repository", "url"],
"properties": {
"number": {
"type": "integer",
"minimum": 1
},
"title": {
"type": "string",
"minLength": 1
},
"body": {
"type": "string"
},
"repository": {
"type": "string",
"pattern": "^[^/]+/[^/]+$"
},
"url": {
"type": "string",
"format": "uri"
},
"labels": {
"type": "array",
"items": { "type": "string" }
},
"state": {
"type": "string"
},
"author": {
"type": "string"
},
"comments": {
"type": "array",
"items": { "type": "object" }
}
}
},
"assessment": {
"type": "object",
"required": ["quality_score", "complexity", "skip_steps", "branch_name"],
"properties": {
"quality_score": {
"type": "integer",
"minimum": 0,
"maximum": 100,
"description": "How well-specified the issue is (0-100)"
},
"complexity": {
"type": "string",
"enum": ["trivial", "simple", "medium", "complex"],
"description": "Estimated implementation complexity"
},
"skip_steps": {
"type": "array",
"items": {
"type": "string",
"enum": ["specify", "clarify", "checklist", "analyze"]
},
"description": "Speckit steps that can be skipped because the issue provides sufficient detail"
},
"branch_name": {
"type": "string",
"minLength": 1,
"description": "Suggested branch name for the implementation"
},
"missing_info": {
"type": "array",
"items": { "type": "string" },
"description": "Information that would improve the issue but isn't blocking"
},
"summary": {
"type": "string",
"description": "Brief summary of the assessment"
}
}
}
}
}
-96
View File
@@ -1,96 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "GitHub Issue Content",
"description": "Parsed content from a GitHub issue for research pipeline processing",
"type": "object",
"required": ["issue_number", "title", "body", "author", "url", "repository"],
"properties": {
"issue_number": {
"type": "integer",
"minimum": 1,
"description": "GitHub issue number"
},
"title": {
"type": "string",
"minLength": 1,
"maxLength": 256,
"description": "Issue title"
},
"body": {
"type": "string",
"description": "Issue body/description text"
},
"author": {
"type": "object",
"required": ["login"],
"properties": {
"login": {
"type": "string",
"minLength": 1,
"description": "GitHub username of issue author"
}
}
},
"labels": {
"type": "array",
"items": {
"type": "object",
"required": ["name"],
"properties": {
"name": {
"type": "string",
"description": "Label name"
},
"color": {
"type": "string",
"description": "Label color hex code"
},
"description": {
"type": "string",
"description": "Label description"
}
}
},
"description": "Labels applied to the issue"
},
"url": {
"type": "string",
"format": "uri",
"description": "HTML URL to the GitHub issue"
},
"repository": {
"type": "object",
"required": ["owner", "name", "full_name"],
"properties": {
"owner": {
"type": "string",
"description": "Repository owner"
},
"name": {
"type": "string",
"description": "Repository name"
},
"full_name": {
"type": "string",
"pattern": "^[^/]+/[^/]+$",
"description": "Full repository name (owner/repo)"
}
}
},
"state": {
"type": "string",
"enum": ["open", "closed"],
"description": "Issue state"
},
"created_at": {
"type": "string",
"format": "date-time",
"description": "Issue creation timestamp"
},
"comments_count": {
"type": "integer",
"minimum": 0,
"description": "Number of comments on the issue"
}
}
}
@@ -1,72 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Issue Implementation Plan",
"type": "object",
"required": ["issue_number", "branch_name", "feature_dir", "tasks"],
"properties": {
"issue_number": {
"type": "integer",
"minimum": 1
},
"branch_name": {
"type": "string",
"minLength": 1
},
"feature_dir": {
"type": "string",
"description": "Path to the feature directory under specs/"
},
"spec_file": {
"type": "string",
"description": "Path to the spec.md file"
},
"plan_file": {
"type": "string",
"description": "Path to the plan.md file"
},
"tasks_file": {
"type": "string",
"description": "Path to the tasks.md file"
},
"tasks": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"required": ["id", "title", "description"],
"properties": {
"id": {
"type": "string",
"description": "Task identifier"
},
"title": {
"type": "string",
"description": "Brief task title"
},
"description": {
"type": "string",
"description": "Detailed task description"
},
"file_changes": {
"type": "array",
"items": {
"type": "object",
"required": ["path", "action"],
"properties": {
"path": { "type": "string" },
"action": {
"type": "string",
"enum": ["create", "modify", "delete"]
}
}
}
}
}
}
},
"summary": {
"type": "string",
"description": "Brief summary of the implementation plan"
}
}
}
@@ -1,116 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Issue Update Context",
"description": "Schema for gathered context about a GitHub issue and recent codebase changes",
"type": "object",
"required": ["repository", "issue", "changes_since_creation", "referenced_files"],
"properties": {
"repository": {
"type": "object",
"required": ["owner", "name"],
"properties": {
"owner": {
"type": "string",
"minLength": 1
},
"name": {
"type": "string",
"minLength": 1
}
}
},
"issue": {
"type": "object",
"required": ["number", "title", "body", "url", "created_at"],
"properties": {
"number": {
"type": "integer",
"minimum": 1
},
"title": {
"type": "string",
"minLength": 1
},
"body": {
"type": "string"
},
"labels": {
"type": "array",
"items": {
"type": "string"
}
},
"url": {
"type": "string",
"format": "uri"
},
"created_at": {
"type": "string"
},
"comments": {
"type": "array",
"items": {
"type": "object",
"properties": {
"author": {
"type": "string"
},
"body": {
"type": "string"
},
"created_at": {
"type": "string"
}
}
}
}
}
},
"changes_since_creation": {
"type": "object",
"required": ["commits", "commit_count"],
"properties": {
"commits": {
"type": "array",
"items": {
"type": "string"
}
},
"commit_count": {
"type": "integer",
"minimum": 0
},
"releases": {
"type": "array",
"items": {
"type": "string"
}
}
}
},
"referenced_files": {
"type": "object",
"required": ["found", "missing"],
"properties": {
"found": {
"type": "array",
"items": {
"type": "string"
}
},
"missing": {
"type": "array",
"items": {
"type": "string"
}
}
}
},
"criticism": {
"type": "string"
},
"project_context": {
"type": "string"
}
}
}
@@ -1,73 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Issue Update Draft",
"description": "Schema for a drafted update to a GitHub issue",
"type": "object",
"required": ["issue_number", "original_title", "updated_title", "title_changed", "original_body", "updated_body", "staleness_assessment", "changes_made"],
"properties": {
"issue_number": {
"type": "integer",
"minimum": 1
},
"original_title": {
"type": "string",
"minLength": 1
},
"updated_title": {
"type": "string",
"minLength": 1
},
"title_changed": {
"type": "boolean"
},
"original_body": {
"type": "string"
},
"updated_body": {
"type": "string",
"minLength": 1
},
"staleness_assessment": {
"type": "object",
"required": ["overall_staleness", "sections"],
"properties": {
"overall_staleness": {
"type": "string",
"enum": ["low", "medium", "high", "critical"]
},
"sections": {
"type": "array",
"items": {
"type": "object",
"required": ["name", "status", "reason"],
"properties": {
"name": {
"type": "string"
},
"status": {
"type": "string",
"enum": ["STILL_VALID", "OUTDATED", "INCOMPLETE", "WRONG"]
},
"reason": {
"type": "string"
}
}
}
}
}
},
"changes_made": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 1
},
"criticism_addressed": {
"type": "array",
"items": {
"type": "string"
}
}
}
}
@@ -1,57 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Issue Update Result",
"description": "Schema for the result of applying an issue update",
"type": "object",
"required": ["issue_number", "success", "changes_applied", "verification"],
"properties": {
"issue_number": {
"type": "integer",
"minimum": 1
},
"url": {
"type": "string",
"format": "uri"
},
"success": {
"type": "boolean"
},
"title_updated": {
"type": "boolean"
},
"body_updated": {
"type": "boolean"
},
"changes_applied": {
"type": "array",
"items": {
"type": "string"
}
},
"verification": {
"type": "object",
"required": ["title_matches", "body_matches"],
"properties": {
"title_matches": {
"type": "boolean"
},
"body_matches": {
"type": "boolean"
},
"discrepancies": {
"type": "array",
"items": {
"type": "string"
}
}
}
},
"staleness_assessment": {
"type": "string",
"enum": ["low", "medium", "high", "critical"]
},
"error": {
"type": ["string", "null"]
}
}
}
@@ -1,179 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Plan Exploration",
"description": "Structured codebase exploration output for feature planning",
"type": "object",
"required": ["feature_context", "related_files", "patterns", "affected_modules", "testing_landscape", "risks", "timestamp"],
"properties": {
"feature_context": {
"type": "object",
"required": ["input_summary", "scope_assessment"],
"properties": {
"input_summary": {
"type": "string",
"minLength": 10,
"description": "Brief summary of the feature or task being planned"
},
"scope_assessment": {
"type": "string",
"enum": ["small", "medium", "large", "epic"],
"description": "Estimated scope of the work"
}
}
},
"related_files": {
"type": "array",
"items": {
"type": "object",
"required": ["path", "relevance", "reason"],
"properties": {
"path": {
"type": "string",
"description": "File path relative to project root"
},
"relevance": {
"type": "string",
"enum": ["primary", "secondary", "reference"],
"description": "How relevant this file is to the feature"
},
"reason": {
"type": "string",
"description": "Why this file is relevant"
},
"key_symbols": {
"type": "array",
"items": {
"type": "string"
},
"description": "Important functions, types, or constants in this file"
}
}
},
"description": "Files related to the feature"
},
"patterns": {
"type": "array",
"items": {
"type": "object",
"required": ["id", "name", "description", "relevance"],
"properties": {
"id": {
"type": "string",
"pattern": "^PAT-[0-9]{3}$",
"description": "Pattern identifier"
},
"name": {
"type": "string",
"description": "Short name for the pattern"
},
"description": {
"type": "string",
"description": "What the pattern is and how it works"
},
"example_file": {
"type": "string",
"description": "File that best demonstrates this pattern"
},
"relevance": {
"type": "string",
"enum": ["must_follow", "should_follow", "informational"],
"description": "How important it is to follow this pattern"
}
}
},
"description": "Codebase patterns and conventions discovered"
},
"affected_modules": {
"type": "array",
"items": {
"type": "object",
"required": ["path", "description", "impact_level"],
"properties": {
"path": {
"type": "string",
"description": "Module or package path"
},
"description": {
"type": "string",
"description": "What this module does"
},
"impact_level": {
"type": "string",
"enum": ["direct", "indirect", "none"],
"description": "Level of impact from the planned changes"
},
"dependencies": {
"type": "array",
"items": {
"type": "string"
},
"description": "Modules this one depends on"
},
"dependents": {
"type": "array",
"items": {
"type": "string"
},
"description": "Modules that depend on this one"
}
}
},
"description": "Modules affected by the planned changes"
},
"testing_landscape": {
"type": "object",
"required": ["existing_test_files", "testing_patterns"],
"properties": {
"existing_test_files": {
"type": "array",
"items": {
"type": "string"
},
"description": "Test files relevant to the feature"
},
"testing_patterns": {
"type": "array",
"items": {
"type": "string"
},
"description": "Testing patterns used in the codebase (e.g., table-driven, mocks)"
},
"coverage_gaps": {
"type": "array",
"items": {
"type": "string"
},
"description": "Areas lacking test coverage"
}
}
},
"risks": {
"type": "array",
"items": {
"type": "object",
"required": ["description", "severity"],
"properties": {
"description": {
"type": "string",
"description": "What the risk is"
},
"severity": {
"type": "string",
"enum": ["high", "medium", "low"],
"description": "Risk severity"
},
"mitigation": {
"type": "string",
"description": "How to mitigate this risk"
}
}
},
"description": "Risks identified during exploration"
},
"timestamp": {
"type": "string",
"format": "date-time",
"description": "When the exploration was completed"
}
}
}
-235
View File
@@ -1,235 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Plan Review",
"description": "Structured review of a task breakdown plan",
"type": "object",
"required": ["verdict", "summary", "task_reviews", "cross_cutting_concerns", "recommendations", "risk_assessment", "timestamp", "markdown_content"],
"properties": {
"verdict": {
"type": "object",
"required": ["decision", "confidence", "rationale"],
"properties": {
"decision": {
"type": "string",
"enum": ["approve", "approve_with_notes", "revise"],
"description": "Overall verdict on the plan"
},
"confidence": {
"type": "string",
"enum": ["high", "medium", "low"],
"description": "Confidence in the verdict"
},
"rationale": {
"type": "string",
"minLength": 20,
"description": "Explanation for the verdict"
}
}
},
"summary": {
"type": "object",
"required": ["total_tasks_reviewed", "issues_found", "issues_by_severity", "strengths"],
"properties": {
"total_tasks_reviewed": {
"type": "integer",
"minimum": 1,
"description": "Number of tasks reviewed"
},
"issues_found": {
"type": "integer",
"minimum": 0,
"description": "Total number of issues found"
},
"issues_by_severity": {
"type": "object",
"properties": {
"critical": {
"type": "integer",
"minimum": 0
},
"high": {
"type": "integer",
"minimum": 0
},
"medium": {
"type": "integer",
"minimum": 0
},
"low": {
"type": "integer",
"minimum": 0
}
},
"description": "Issues broken down by severity"
},
"strengths": {
"type": "array",
"items": {
"type": "string"
},
"description": "Things the plan does well"
}
}
},
"task_reviews": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"required": ["task_id", "status"],
"properties": {
"task_id": {
"type": "string",
"pattern": "^T[0-9]{2}$",
"description": "ID of the reviewed task"
},
"status": {
"type": "string",
"enum": ["ok", "needs_refinement", "missing_details", "overcomplicated", "wrong_persona", "bad_dependencies"],
"description": "Review status for this task"
},
"issues": {
"type": "array",
"items": {
"type": "object",
"required": ["id", "severity", "description", "suggestion"],
"properties": {
"id": {
"type": "string",
"pattern": "^REV-[0-9]{3}$",
"description": "Issue identifier"
},
"severity": {
"type": "string",
"enum": ["critical", "high", "medium", "low"],
"description": "Issue severity"
},
"description": {
"type": "string",
"description": "What the issue is"
},
"suggestion": {
"type": "string",
"description": "How to fix it"
}
}
},
"description": "Issues found in this task"
}
}
},
"description": "Per-task review results"
},
"cross_cutting_concerns": {
"type": "array",
"items": {
"type": "object",
"required": ["id", "category", "description", "affected_tasks", "recommendation"],
"properties": {
"id": {
"type": "string",
"pattern": "^CC-[0-9]{3}$",
"description": "Concern identifier"
},
"category": {
"type": "string",
"description": "Category of concern (e.g., testing, security, performance)"
},
"description": {
"type": "string",
"description": "What the concern is"
},
"affected_tasks": {
"type": "array",
"items": {
"type": "string",
"pattern": "^T[0-9]{2}$"
},
"description": "Tasks affected by this concern"
},
"recommendation": {
"type": "string",
"description": "Recommended action"
}
}
},
"description": "Concerns that span multiple tasks"
},
"recommendations": {
"type": "array",
"items": {
"type": "object",
"required": ["id", "priority", "description", "type"],
"properties": {
"id": {
"type": "string",
"pattern": "^REC-[0-9]{3}$",
"description": "Recommendation identifier"
},
"priority": {
"type": "string",
"enum": ["critical", "high", "medium", "low"],
"description": "Priority of the recommendation"
},
"description": {
"type": "string",
"description": "What should be done"
},
"type": {
"type": "string",
"enum": ["add_task", "modify_task", "remove_task", "reorder", "split_task", "merge_tasks", "change_persona", "add_dependency"],
"description": "Type of change recommended"
}
}
},
"description": "Actionable recommendations for improving the plan"
},
"risk_assessment": {
"type": "object",
"required": ["overall_risk", "key_risks"],
"properties": {
"overall_risk": {
"type": "string",
"enum": ["high", "medium", "low"],
"description": "Overall risk level of the plan"
},
"key_risks": {
"type": "array",
"items": {
"type": "object",
"required": ["description", "severity", "likelihood"],
"properties": {
"description": {
"type": "string",
"description": "Risk description"
},
"severity": {
"type": "string",
"enum": ["high", "medium", "low"]
},
"likelihood": {
"type": "string",
"enum": ["high", "medium", "low"]
},
"mitigation": {
"type": "string",
"description": "How to mitigate"
}
}
},
"description": "Key risks identified in the plan"
}
}
},
"timestamp": {
"type": "string",
"format": "date-time",
"description": "When the review was completed"
},
"markdown_content": {
"type": "string",
"minLength": 50,
"description": "Pre-rendered human-readable review in markdown format"
}
}
}
-40
View File
@@ -1,40 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Speckit Plan Status",
"description": "Status report from the plan step: research, design, and implementation plan generation.",
"type": "object",
"required": ["plan_file", "feature_dir", "summary"],
"properties": {
"plan_file": {
"type": "string",
"minLength": 1,
"description": "Path to the generated implementation plan file"
},
"feature_dir": {
"type": "string",
"minLength": 1,
"description": "Path to the feature directory"
},
"summary": {
"type": "string",
"minLength": 1,
"description": "Brief description of the plan produced"
},
"research_file": {
"type": "string",
"description": "Path to research.md if generated"
},
"data_model_file": {
"type": "string",
"description": "Path to data-model.md if generated"
},
"constitution_issues": {
"type": "array",
"items": {
"type": "string"
},
"description": "Constitution compliance issues found during planning"
}
},
"additionalProperties": true
}
-142
View File
@@ -1,142 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Plan Tasks",
"description": "Structured task breakdown for feature implementation",
"type": "object",
"required": ["feature_summary", "tasks", "execution_order", "metadata", "markdown_content"],
"properties": {
"feature_summary": {
"type": "object",
"required": ["title", "description", "total_tasks", "estimated_total_complexity"],
"properties": {
"title": {
"type": "string",
"minLength": 5,
"description": "Short title for the feature"
},
"description": {
"type": "string",
"minLength": 20,
"description": "Brief description of what the feature does"
},
"total_tasks": {
"type": "integer",
"minimum": 1,
"description": "Total number of tasks in the breakdown"
},
"estimated_total_complexity": {
"type": "string",
"enum": ["S", "M", "L", "XL"],
"description": "Overall complexity estimate"
}
}
},
"tasks": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"required": ["id", "title", "description", "persona", "complexity", "acceptance_criteria"],
"properties": {
"id": {
"type": "string",
"pattern": "^T[0-9]{2}$",
"description": "Task identifier (T01, T02, etc.)"
},
"title": {
"type": "string",
"minLength": 5,
"description": "Short task title"
},
"description": {
"type": "string",
"minLength": 20,
"description": "What needs to be done"
},
"persona": {
"type": "string",
"enum": ["navigator", "philosopher", "craftsman", "auditor", "planner", "implementer", "reviewer"],
"description": "Which persona should execute this task"
},
"complexity": {
"type": "string",
"enum": ["S", "M", "L", "XL"],
"description": "Task complexity estimate"
},
"dependencies": {
"type": "array",
"items": {
"type": "string",
"pattern": "^T[0-9]{2}$"
},
"description": "Task IDs that must complete before this one"
},
"acceptance_criteria": {
"type": "array",
"minItems": 1,
"items": {
"type": "string"
},
"description": "How to verify the task is complete"
},
"affected_files": {
"type": "array",
"items": {
"type": "string"
},
"description": "Files that will be created or modified"
},
"risks": {
"type": "array",
"items": {
"type": "string"
},
"description": "Risks specific to this task"
}
}
},
"description": "Ordered list of tasks"
},
"execution_order": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"required": ["phase", "task_ids"],
"properties": {
"phase": {
"type": "integer",
"minimum": 1,
"description": "Execution phase number"
},
"task_ids": {
"type": "array",
"minItems": 1,
"items": {
"type": "string",
"pattern": "^T[0-9]{2}$"
},
"description": "Tasks that can run in parallel in this phase"
}
}
},
"description": "Parallelization groups for task execution"
},
"metadata": {
"type": "object",
"required": ["generated_at"],
"properties": {
"generated_at": {
"type": "string",
"format": "date-time",
"description": "When the plan was generated"
}
}
},
"markdown_content": {
"type": "string",
"minLength": 50,
"description": "Pre-rendered human-readable plan in markdown format"
}
}
}
-43
View File
@@ -1,43 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Pull Request Result",
"description": "Result of creating a pull request. Used by pipeline steps that produce a PR as their final output.",
"type": "object",
"required": ["pr_url", "pr_number", "branch", "summary"],
"properties": {
"pr_url": {
"type": "string",
"format": "uri",
"description": "URL to the created pull request"
},
"pr_number": {
"type": "integer",
"minimum": 1,
"description": "Pull request number"
},
"branch": {
"type": "string",
"minLength": 1,
"description": "Branch name for the pull request"
},
"summary": {
"type": "string",
"minLength": 1,
"description": "Brief description of what the pull request does"
},
"copilot_review_requested": {
"type": "boolean",
"description": "Whether a Copilot review was requested for the PR"
},
"closes_issue": {
"type": "boolean",
"description": "Whether the PR closes a linked issue"
},
"issue_number": {
"type": "integer",
"minimum": 1,
"description": "Issue number that this PR addresses"
}
},
"additionalProperties": true
}
@@ -1,42 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Probed Findings",
"description": "Deep-dive analysis from the recinq probe step",
"type": "object",
"required": ["target", "total_probed", "findings"],
"properties": {
"target": {
"type": "string",
"description": "What was analyzed (path, module, or 'whole-project')"
},
"total_probed": {
"type": "integer",
"description": "Total number of confirmed findings that were probed deeper"
},
"findings": {
"type": "array",
"items": {
"type": "object",
"required": ["id", "deeper_analysis", "files"],
"properties": {
"id": {
"type": "string",
"description": "Original finding ID (e.g. DVG-001)"
},
"deeper_analysis": {
"type": "string",
"description": "Extended analysis including dependency graph, second-order effects, and cross-finding patterns"
},
"files": {
"type": "array",
"items": { "type": "string" },
"description": "File paths involved in this finding and its connections"
}
},
"additionalProperties": true
},
"description": "Per-finding deep-dive results"
}
},
"additionalProperties": true
}
-119
View File
@@ -1,119 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Project Survey",
"description": "Structured survey of a project for onboarding guide generation",
"type": "object",
"required": ["project", "build", "structure", "timestamp"],
"properties": {
"project": {
"type": "object",
"required": ["name", "language", "purpose"],
"properties": {
"name": { "type": "string", "minLength": 1 },
"language": { "type": "string", "minLength": 1 },
"framework": { "type": "string" },
"purpose": { "type": "string", "minLength": 5 },
"license": { "type": "string" }
}
},
"build": {
"type": "object",
"required": ["commands"],
"properties": {
"commands": {
"type": "object",
"properties": {
"build": { "type": "string" },
"test": { "type": "string" },
"run": { "type": "string" }
}
},
"prerequisites": { "type": "array", "items": { "type": "string" } },
"ci_system": { "type": "string" }
}
},
"structure": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"required": ["path", "purpose"],
"properties": {
"path": { "type": "string", "minLength": 1 },
"purpose": { "type": "string", "minLength": 1 },
"key_files": { "type": "array", "items": { "type": "string" } }
}
}
},
"architecture": {
"type": "object",
"properties": {
"entry_points": { "type": "array", "items": { "type": "string" } },
"components": {
"type": "array",
"items": {
"type": "object",
"required": ["name", "role"],
"properties": {
"name": { "type": "string" },
"package": { "type": "string" },
"role": { "type": "string" }
}
}
},
"patterns": { "type": "array", "items": { "type": "string" } }
}
},
"dependencies": {
"type": "object",
"properties": {
"key_deps": {
"type": "array",
"items": {
"type": "object",
"required": ["name", "purpose"],
"properties": {
"name": { "type": "string" },
"purpose": { "type": "string" },
"import": { "type": "string" }
}
}
},
"total_count": { "type": "integer", "minimum": 0 }
}
},
"configuration": {
"type": "object",
"properties": {
"env_vars": { "type": "array", "items": { "type": "string" } },
"config_files": { "type": "array", "items": { "type": "string" } },
"feature_flags": { "type": "array", "items": { "type": "string" } }
}
},
"testing": {
"type": "object",
"properties": {
"framework": { "type": "string" },
"patterns": { "type": "array", "items": { "type": "string" } },
"run_command": { "type": "string" },
"coverage_command": { "type": "string" }
}
},
"workflow": {
"type": "object",
"properties": {
"branch_strategy": { "type": "string" },
"commit_convention": { "type": "string" },
"pr_process": { "type": "string" }
}
},
"documentation": {
"type": "object",
"properties": {
"locations": { "type": "array", "items": { "type": "string" } },
"quality": { "type": "string", "enum": ["good", "adequate", "sparse", "missing"] }
}
},
"timestamp": { "type": "string", "format": "date-time" }
}
}
@@ -1,29 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Code Review Publish Result",
"description": "Result of publishing a code review comment on a pull request",
"type": "object",
"required": ["comment_url", "pr_number"],
"properties": {
"comment_url": {
"type": "string",
"format": "uri",
"description": "URL to the posted review comment"
},
"pr_number": {
"type": "integer",
"minimum": 1,
"description": "PR number that was reviewed"
},
"repository": {
"type": "string",
"pattern": "^[^/]+/[^/]+$",
"description": "Repository full name (owner/repo)"
},
"summary": {
"type": "string",
"description": "Brief summary of the review"
}
},
"additionalProperties": true
}
@@ -1,43 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Recinq Context",
"description": "Parsed input context from the recinq gather step",
"type": "object",
"required": ["input_type", "original_input", "focus_hint"],
"properties": {
"input_type": {
"type": "string",
"enum": ["issue", "pr", "local"],
"description": "The kind of input: GitHub issue, GitHub PR, or local path/description"
},
"original_input": {
"type": "string",
"description": "The raw input string exactly as given by the user"
},
"focus_hint": {
"type": "string",
"description": "Summary of what should be simplified or focused on"
},
"url": {
"type": "string",
"description": "GitHub issue or PR URL (empty for local input)"
},
"repo": {
"type": "string",
"description": "GitHub owner/repo (empty for local input)"
},
"number": {
"type": "integer",
"description": "GitHub issue or PR number (0 for local input)"
},
"title": {
"type": "string",
"description": "GitHub issue or PR title (empty for local input)"
},
"body": {
"type": "string",
"description": "GitHub issue or PR body (empty for local input)"
}
},
"additionalProperties": true
}
@@ -1,27 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"required": ["target_files", "affected_callers", "existing_tests", "integration_points", "risk_assessment"],
"properties": {
"target_files": {
"type": "array",
"items": { "type": "string" }
},
"affected_callers": {
"type": "array",
"items": { "type": "string" }
},
"existing_tests": {
"type": "array",
"items": { "type": "string" }
},
"integration_points": {
"type": "array",
"items": { "type": "string" }
},
"risk_assessment": {
"type": "string",
"enum": ["low", "medium", "high"]
}
}
}
@@ -1,178 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Research Findings",
"description": "Web research results organized by topic with sources and insights",
"type": "object",
"required": ["issue_reference", "findings_by_topic", "research_metadata"],
"properties": {
"issue_reference": {
"type": "object",
"required": ["issue_number", "repository"],
"properties": {
"issue_number": {
"type": "integer",
"minimum": 1
},
"repository": {
"type": "string",
"pattern": "^[^/]+/[^/]+$"
}
}
},
"findings_by_topic": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"required": ["topic_id", "topic_title", "findings", "confidence_level"],
"properties": {
"topic_id": {
"type": "string",
"pattern": "^TOPIC-[0-9]{3}$",
"description": "Reference to topic ID from research-topics"
},
"topic_title": {
"type": "string",
"description": "Topic title for readability"
},
"findings": {
"type": "array",
"items": {
"type": "object",
"required": ["id", "summary", "source", "relevance_score"],
"properties": {
"id": {
"type": "string",
"pattern": "^FINDING-[0-9]{3}$",
"description": "Unique finding identifier"
},
"summary": {
"type": "string",
"minLength": 20,
"maxLength": 2000,
"description": "Summarized finding content"
},
"key_points": {
"type": "array",
"items": {
"type": "string"
},
"description": "Bullet points of key insights"
},
"source": {
"type": "object",
"required": ["url", "title", "type"],
"properties": {
"url": {
"type": "string",
"format": "uri",
"description": "Source URL"
},
"title": {
"type": "string",
"description": "Source page/article title"
},
"type": {
"type": "string",
"enum": ["official_docs", "github_issue", "github_discussion", "stack_overflow", "blog_post", "tutorial", "api_reference", "academic_paper", "forum_post", "other"],
"description": "Type of source"
},
"author": {
"type": "string",
"description": "Author or organization name"
},
"credibility_score": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Source credibility assessment (0-1)"
}
}
},
"relevance_score": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Relevance to the topic (0-1)"
},
"quotes": {
"type": "array",
"items": {
"type": "object",
"required": ["text"],
"properties": {
"text": {
"type": "string",
"description": "Direct quote from source"
},
"context": {
"type": "string",
"description": "Context for the quote"
}
}
},
"description": "Notable quotes from the source"
}
}
},
"description": "Individual research findings for this topic"
},
"confidence_level": {
"type": "string",
"enum": ["high", "medium", "low", "inconclusive"],
"description": "Overall confidence in findings for this topic"
},
"consensus": {
"type": "string",
"description": "Summary of consensus across sources"
},
"gaps": {
"type": "array",
"items": {
"type": "string"
},
"description": "Questions that couldn't be fully answered"
}
}
},
"description": "Research findings organized by topic"
},
"research_metadata": {
"type": "object",
"required": ["started_at", "completed_at"],
"properties": {
"started_at": {
"type": "string",
"format": "date-time",
"description": "Research start timestamp"
},
"completed_at": {
"type": "string",
"format": "date-time",
"description": "Research completion timestamp"
},
"persona": {
"type": "string",
"description": "Wave persona that conducted research"
},
"total_sources_consulted": {
"type": "integer",
"minimum": 0,
"description": "Total number of sources examined"
},
"sources_included": {
"type": "integer",
"minimum": 0,
"description": "Number of sources included in findings"
},
"search_queries_used": {
"type": "array",
"items": {
"type": "string"
},
"description": "Search queries that were used"
}
}
}
}
}
-206
View File
@@ -1,206 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Research Report",
"description": "Synthesized research report for GitHub issue comment",
"type": "object",
"required": ["issue_reference", "executive_summary", "detailed_findings", "recommendations", "sources", "markdown_content"],
"properties": {
"issue_reference": {
"type": "object",
"required": ["issue_number", "repository", "title"],
"properties": {
"issue_number": {
"type": "integer",
"minimum": 1
},
"repository": {
"type": "string",
"pattern": "^[^/]+/[^/]+$"
},
"title": {
"type": "string"
},
"url": {
"type": "string",
"format": "uri"
}
}
},
"executive_summary": {
"type": "object",
"required": ["overview", "key_findings", "primary_recommendation"],
"properties": {
"overview": {
"type": "string",
"minLength": 50,
"maxLength": 1000,
"description": "Brief overview of research conducted and main conclusions"
},
"key_findings": {
"type": "array",
"minItems": 1,
"maxItems": 7,
"items": {
"type": "string"
},
"description": "Top findings as bullet points"
},
"primary_recommendation": {
"type": "string",
"minLength": 20,
"description": "Single most important recommendation"
},
"confidence_assessment": {
"type": "string",
"enum": ["high", "medium", "low"],
"description": "Overall confidence in the research conclusions"
}
}
},
"detailed_findings": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"required": ["section_title", "content", "relevance"],
"properties": {
"section_title": {
"type": "string",
"minLength": 3,
"description": "Section heading"
},
"topic_id": {
"type": "string",
"pattern": "^TOPIC-[0-9]{3}$",
"description": "Reference to original topic if applicable"
},
"content": {
"type": "string",
"minLength": 50,
"description": "Detailed markdown content for this section"
},
"relevance": {
"type": "string",
"enum": ["critical", "high", "medium", "supplementary"],
"description": "How relevant this section is to the issue"
},
"code_examples": {
"type": "array",
"items": {
"type": "object",
"required": ["code", "language"],
"properties": {
"code": {
"type": "string",
"description": "Code snippet"
},
"language": {
"type": "string",
"description": "Language for syntax highlighting"
},
"caption": {
"type": "string",
"description": "Explanation of the code"
}
}
},
"description": "Code examples for this section"
},
"related_sources": {
"type": "array",
"items": {
"type": "string",
"pattern": "^SRC-[0-9]{3}$"
},
"description": "References to sources list"
}
}
},
"description": "Detailed findings organized by section"
},
"recommendations": {
"type": "array",
"minItems": 1,
"maxItems": 10,
"items": {
"type": "object",
"required": ["id", "title", "description", "priority"],
"properties": {
"id": {
"type": "string",
"pattern": "^REC-[0-9]{3}$",
"description": "Recommendation identifier"
},
"title": {
"type": "string",
"minLength": 5,
"maxLength": 100,
"description": "Concise recommendation title"
},
"description": {
"type": "string",
"minLength": 20,
"description": "Detailed recommendation explanation"
},
"priority": {
"type": "string",
"enum": ["critical", "high", "medium", "low"],
"description": "Recommendation priority"
},
"effort_estimate": {
"type": "string",
"enum": ["trivial", "small", "medium", "large", "unknown"],
"description": "Estimated implementation effort"
}
}
},
"description": "Actionable recommendations based on research"
},
"sources": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"required": ["id", "url", "title"],
"properties": {
"id": {
"type": "string",
"pattern": "^SRC-[0-9]{3}$",
"description": "Source identifier for cross-referencing"
},
"url": {
"type": "string",
"format": "uri",
"description": "Source URL"
},
"title": {
"type": "string",
"description": "Source title"
},
"type": {
"type": "string",
"enum": ["official_docs", "github_issue", "github_discussion", "stack_overflow", "blog_post", "tutorial", "api_reference", "academic_paper", "forum_post", "other"]
},
"reliability": {
"type": "string",
"enum": ["authoritative", "reputable", "community", "unverified"],
"description": "Source reliability assessment"
}
}
},
"description": "All sources cited in the report"
},
"markdown_content": {
"type": "string",
"minLength": 100,
"description": "Pre-rendered markdown content ready for GitHub comment"
},
"follow_up_questions": {
"type": "array",
"items": {
"type": "string"
},
"description": "Questions that warrant further investigation"
}
}
}
-106
View File
@@ -1,106 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Research Topics",
"description": "Extracted research topics from GitHub issue analysis",
"type": "object",
"required": ["issue_reference", "topics"],
"properties": {
"issue_reference": {
"type": "object",
"required": ["issue_number", "repository"],
"properties": {
"issue_number": {
"type": "integer",
"minimum": 1,
"description": "Reference to source issue number"
},
"repository": {
"type": "string",
"pattern": "^[^/]+/[^/]+$",
"description": "Repository full name (owner/repo)"
},
"title": {
"type": "string",
"description": "Issue title for context"
}
}
},
"topics": {
"type": "array",
"minItems": 1,
"maxItems": 10,
"items": {
"type": "object",
"required": ["id", "title", "questions", "keywords", "priority"],
"properties": {
"id": {
"type": "string",
"pattern": "^TOPIC-[0-9]{3}$",
"description": "Unique topic identifier (e.g., TOPIC-001)"
},
"title": {
"type": "string",
"minLength": 5,
"maxLength": 200,
"description": "Concise topic title"
},
"description": {
"type": "string",
"description": "Detailed description of what needs to be researched"
},
"questions": {
"type": "array",
"minItems": 1,
"maxItems": 5,
"items": {
"type": "string",
"minLength": 10
},
"description": "Specific questions to answer through research"
},
"keywords": {
"type": "array",
"minItems": 1,
"maxItems": 10,
"items": {
"type": "string",
"minLength": 2
},
"description": "Search keywords for web research"
},
"priority": {
"type": "string",
"enum": ["critical", "high", "medium", "low"],
"description": "Research priority level"
},
"category": {
"type": "string",
"enum": ["technical", "documentation", "best_practices", "security", "performance", "compatibility", "other"],
"description": "Topic category for organization"
}
}
},
"description": "List of research topics extracted from the issue"
},
"extraction_metadata": {
"type": "object",
"properties": {
"extracted_at": {
"type": "string",
"format": "date-time",
"description": "Timestamp when topics were extracted"
},
"persona": {
"type": "string",
"description": "Wave persona that performed the extraction"
},
"confidence": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Confidence score for topic relevance (0-1)"
}
}
}
}
}
-73
View File
@@ -1,73 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Security Scan Results",
"description": "Output from the security scan step",
"type": "object",
"required": ["target", "findings", "summary", "timestamp"],
"properties": {
"target": {
"type": "string",
"minLength": 1,
"description": "What was scanned"
},
"attack_surface": {
"type": "array",
"items": {
"type": "object",
"required": ["entry_point", "type", "description"],
"properties": {
"entry_point": { "type": "string", "minLength": 1 },
"type": {
"type": "string",
"enum": ["http_handler", "cli_input", "file_parser", "db_query", "api_call", "ipc", "other"]
},
"description": { "type": "string", "minLength": 1 },
"risk_level": { "type": "string", "enum": ["high", "medium", "low"] }
}
}
},
"findings": {
"type": "array",
"items": {
"type": "object",
"required": ["id", "title", "severity", "category", "location", "description"],
"properties": {
"id": { "type": "string", "pattern": "^SEC-[0-9]{3}$" },
"title": { "type": "string", "minLength": 5 },
"severity": { "type": "string", "enum": ["CRITICAL", "HIGH", "MEDIUM", "LOW"] },
"category": { "type": "string", "minLength": 1 },
"location": { "type": "string", "minLength": 1 },
"description": { "type": "string", "minLength": 10 },
"evidence": { "type": "string" },
"exploitability": { "type": "string" }
}
}
},
"secrets_check": {
"type": "object",
"properties": {
"hardcoded_secrets": { "type": "array", "items": { "type": "string" } },
"insecure_configs": { "type": "array", "items": { "type": "string" } }
}
},
"summary": {
"type": "object",
"required": ["total_findings", "by_severity", "risk_assessment"],
"properties": {
"total_findings": { "type": "integer", "minimum": 0 },
"by_severity": {
"type": "object",
"required": ["CRITICAL", "HIGH", "MEDIUM", "LOW"],
"properties": {
"CRITICAL": { "type": "integer", "minimum": 0 },
"HIGH": { "type": "integer", "minimum": 0 },
"MEDIUM": { "type": "integer", "minimum": 0 },
"LOW": { "type": "integer", "minimum": 0 }
}
},
"risk_assessment": { "type": "string", "minLength": 10 }
}
},
"timestamp": { "type": "string", "format": "date-time" }
}
}
-31
View File
@@ -1,31 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Smoke Test Analysis",
"type": "object",
"required": [
"summary",
"files_examined",
"recommendation"
],
"properties": {
"summary": {
"type": "string",
"minLength": 10,
"description": "Brief summary of the analysis"
},
"files_examined": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 1,
"description": "List of files that were examined"
},
"recommendation": {
"type": "string",
"minLength": 10,
"description": "Recommendation based on analysis"
}
},
"additionalProperties": false
}
@@ -1,78 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Source Extract",
"description": "Extracted content from a single web source for ingestion",
"type": "object",
"required": ["url", "title", "summary", "key_concepts"],
"properties": {
"url": {
"type": "string",
"format": "uri",
"description": "Original URL that was fetched"
},
"title": {
"type": "string",
"description": "Article or page title"
},
"author": {
"type": "string",
"description": "Author name"
},
"date": {
"type": "string",
"description": "Publication date"
},
"summary": {
"type": "string",
"minLength": 50,
"maxLength": 3000,
"description": "Summary of the source content"
},
"key_concepts": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"required": ["concept", "description"],
"properties": {
"concept": {
"type": "string",
"description": "Name of the key concept"
},
"description": {
"type": "string",
"description": "Explanation of the concept as presented in the source"
}
}
},
"description": "Key concepts extracted from the source"
},
"notable_quotes": {
"type": "array",
"items": {
"type": "object",
"required": ["text"],
"properties": {
"text": {
"type": "string",
"description": "Direct quote"
},
"context": {
"type": "string",
"description": "Context for the quote"
}
}
},
"description": "Notable direct quotes from the source"
},
"author_year_key": {
"type": "string",
"pattern": "^[A-Z][a-zA-Z]+[0-9]{4}[a-z]?$",
"description": "Suggested AuthorYear key for bibliographic note (e.g., Willison2026)"
},
"timestamp": {
"type": "string",
"format": "date-time"
}
}
}
-119
View File
@@ -1,119 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "https://schema.recinq.com/wave/spec-phase.schema.json",
"title": "Wave Spec Phase Output Contract",
"description": "Validates spec phase outputs for prototype-driven development pipeline",
"type": "object",
"properties": {
"phase": {
"type": "string",
"const": "spec",
"description": "Phase identifier"
},
"artifacts": {
"type": "object",
"properties": {
"spec": {
"type": "object",
"properties": {
"path": {
"type": "string",
"pattern": "^.*spec\\.md$",
"description": "Path to specification file"
},
"exists": {
"type": "boolean",
"const": true,
"description": "Specification file must exist"
},
"content_type": {
"type": "string",
"const": "markdown",
"description": "Specification content format"
}
},
"required": ["path", "exists", "content_type"],
"additionalProperties": false
},
"requirements": {
"type": "object",
"properties": {
"path": {
"type": "string",
"pattern": "^.*requirements\\.md$",
"description": "Path to requirements file"
},
"exists": {
"type": "boolean",
"const": true,
"description": "Requirements file must exist"
},
"content_type": {
"type": "string",
"const": "markdown",
"description": "Requirements content format"
}
},
"required": ["path", "exists", "content_type"],
"additionalProperties": false
}
},
"required": ["spec"],
"additionalProperties": true
},
"validation": {
"type": "object",
"properties": {
"completeness_score": {
"type": "integer",
"minimum": 0,
"maximum": 100,
"description": "Specification completeness rating"
},
"clarity_score": {
"type": "integer",
"minimum": 0,
"maximum": 100,
"description": "Specification clarity rating"
},
"testability_score": {
"type": "integer",
"minimum": 0,
"maximum": 100,
"description": "Specification testability rating"
},
"specification_quality": {
"type": "string",
"enum": ["poor", "fair", "good", "excellent"],
"description": "Overall specification quality assessment"
}
},
"required": ["specification_quality"],
"additionalProperties": false
},
"metadata": {
"type": "object",
"properties": {
"timestamp": {
"type": "string",
"format": "date-time",
"description": "When spec phase was completed"
},
"duration_seconds": {
"type": "number",
"minimum": 0,
"description": "Time taken for spec phase"
},
"input_description": {
"type": "string",
"minLength": 1,
"description": "Original project description input"
}
},
"required": ["timestamp", "input_description"],
"additionalProperties": false
}
},
"required": ["phase", "artifacts", "validation", "metadata"],
"additionalProperties": false
}
@@ -1,35 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Speckit Specify Status",
"description": "Status report from the specify step: feature branch creation and spec authoring.",
"type": "object",
"required": ["branch_name", "spec_file", "feature_dir", "summary"],
"properties": {
"branch_name": {
"type": "string",
"minLength": 1,
"description": "Git branch name created for the feature"
},
"spec_file": {
"type": "string",
"minLength": 1,
"description": "Path to the generated spec.md file"
},
"feature_dir": {
"type": "string",
"minLength": 1,
"description": "Path to the feature directory"
},
"summary": {
"type": "string",
"minLength": 1,
"description": "Brief description of what was created"
},
"checklist_status": {
"type": "string",
"enum": ["pass", "fail"],
"description": "Result of self-validation against the quality checklist"
}
},
"additionalProperties": true
}
@@ -1,97 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Supervision Evaluation",
"description": "Quality evaluation of both output and process",
"type": "object",
"required": ["output_quality", "process_quality", "overall_score", "timestamp"],
"properties": {
"output_quality": {
"type": "object",
"required": ["correctness", "completeness", "test_coverage", "code_quality"],
"properties": {
"correctness": {
"type": "object",
"required": ["score", "findings"],
"properties": {
"score": { "type": "string", "enum": ["excellent", "good", "adequate", "poor"] },
"findings": { "type": "array", "items": { "type": "string" } }
}
},
"completeness": {
"type": "object",
"required": ["score", "findings"],
"properties": {
"score": { "type": "string", "enum": ["excellent", "good", "adequate", "poor"] },
"findings": { "type": "array", "items": { "type": "string" } }
}
},
"test_coverage": {
"type": "object",
"required": ["score", "findings"],
"properties": {
"score": { "type": "string", "enum": ["excellent", "good", "adequate", "poor"] },
"findings": { "type": "array", "items": { "type": "string" } }
}
},
"code_quality": {
"type": "object",
"required": ["score", "findings"],
"properties": {
"score": { "type": "string", "enum": ["excellent", "good", "adequate", "poor"] },
"findings": { "type": "array", "items": { "type": "string" } }
}
}
}
},
"process_quality": {
"type": "object",
"required": ["efficiency", "scope_discipline", "tool_usage"],
"properties": {
"efficiency": {
"type": "object",
"required": ["score", "findings"],
"properties": {
"score": { "type": "string", "enum": ["excellent", "good", "adequate", "poor"] },
"findings": { "type": "array", "items": { "type": "string" } }
}
},
"scope_discipline": {
"type": "object",
"required": ["score", "findings"],
"properties": {
"score": { "type": "string", "enum": ["excellent", "good", "adequate", "poor"] },
"findings": { "type": "array", "items": { "type": "string" } }
}
},
"tool_usage": {
"type": "object",
"required": ["score", "findings"],
"properties": {
"score": { "type": "string", "enum": ["excellent", "good", "adequate", "poor"] },
"findings": { "type": "array", "items": { "type": "string" } }
}
},
"token_economy": {
"type": "object",
"properties": {
"score": { "type": "string", "enum": ["excellent", "good", "adequate", "poor"] },
"findings": { "type": "array", "items": { "type": "string" } }
}
}
}
},
"overall_score": {
"type": "string",
"enum": ["excellent", "good", "adequate", "poor"]
},
"key_strengths": {
"type": "array",
"items": { "type": "string" }
},
"key_concerns": {
"type": "array",
"items": { "type": "string" }
},
"timestamp": { "type": "string", "format": "date-time" }
}
}
@@ -1,83 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Supervision Evidence",
"description": "Evidence gathered for supervising completed work",
"type": "object",
"required": ["scope", "commits", "artifacts", "test_results", "timestamp"],
"properties": {
"scope": {
"type": "object",
"description": "What was inspected and how it was identified",
"required": ["description", "detection_method"],
"properties": {
"description": { "type": "string", "minLength": 5 },
"detection_method": {
"type": "string",
"enum": ["auto_detect", "pipeline_run", "branch", "pr", "freeform"]
},
"pipeline_name": { "type": "string" },
"branch_name": { "type": "string" },
"pr_number": { "type": "integer" }
}
},
"commits": {
"type": "array",
"items": {
"type": "object",
"required": ["hash", "message", "files_changed"],
"properties": {
"hash": { "type": "string" },
"message": { "type": "string" },
"author": { "type": "string" },
"files_changed": { "type": "integer" },
"insertions": { "type": "integer" },
"deletions": { "type": "integer" },
"has_session_transcript": { "type": "boolean" },
"transcript_summary": { "type": "string" }
}
}
},
"artifacts": {
"type": "array",
"description": "Pipeline workspace artifacts found",
"items": {
"type": "object",
"required": ["path", "type"],
"properties": {
"path": { "type": "string" },
"type": { "type": "string" },
"size_bytes": { "type": "integer" },
"summary": { "type": "string" }
}
}
},
"test_results": {
"type": "object",
"required": ["ran", "passed"],
"properties": {
"ran": { "type": "boolean" },
"passed": { "type": "boolean" },
"total_tests": { "type": "integer" },
"failed_tests": { "type": "integer" },
"coverage_percent": { "type": "number" },
"details": { "type": "string" }
}
},
"session_transcripts": {
"type": "array",
"description": "Claudit session transcripts from git notes",
"items": {
"type": "object",
"required": ["commit_hash", "summary"],
"properties": {
"commit_hash": { "type": "string" },
"summary": { "type": "string" },
"tool_calls_count": { "type": "integer" },
"notable_detours": { "type": "array", "items": { "type": "string" } },
"errors_encountered": { "type": "array", "items": { "type": "string" } }
}
}
},
"timestamp": { "type": "string", "format": "date-time" }
}
}
-33
View File
@@ -1,33 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Speckit Tasks Status",
"description": "Status report from the tasks step: dependency-ordered task breakdown generation.",
"type": "object",
"required": ["total_tasks", "feature_dir", "summary"],
"properties": {
"total_tasks": {
"type": "integer",
"minimum": 1,
"description": "Total number of tasks generated"
},
"feature_dir": {
"type": "string",
"minLength": 1,
"description": "Path to the feature directory"
},
"summary": {
"type": "string",
"minLength": 1,
"description": "Brief description of the task breakdown"
},
"tasks_per_story": {
"type": "object",
"description": "Mapping of user story identifiers to task counts"
},
"parallel_opportunities": {
"type": "integer",
"description": "Number of tasks that can be executed in parallel"
}
},
"additionalProperties": true
}
@@ -1,50 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Validated Findings",
"description": "Convergent validation results from the recinq converge step",
"type": "object",
"required": ["target", "total_findings", "confirmed", "rejected", "findings"],
"properties": {
"target": {
"type": "string",
"description": "What was analyzed (path, module, or 'whole-project')"
},
"total_findings": {
"type": "integer",
"description": "Total number of divergent findings reviewed"
},
"confirmed": {
"type": "integer",
"description": "Number of findings classified as CONFIRMED or PARTIALLY_CONFIRMED"
},
"rejected": {
"type": "integer",
"description": "Number of findings classified as REJECTED"
},
"findings": {
"type": "array",
"items": {
"type": "object",
"required": ["id", "status", "rationale"],
"properties": {
"id": {
"type": "string",
"description": "Original finding ID (e.g. DVG-001)"
},
"status": {
"type": "string",
"enum": ["CONFIRMED", "PARTIALLY_CONFIRMED", "REJECTED"],
"description": "Validation classification"
},
"rationale": {
"type": "string",
"description": "Explanation of why the finding was classified this way"
}
},
"additionalProperties": true
},
"description": "Per-finding validation results"
}
},
"additionalProperties": true
}
-85
View File
@@ -1,85 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Web Findings",
"description": "Structured web research results for a given topic",
"type": "object",
"required": ["topic", "sources", "search_queries"],
"properties": {
"topic": {
"type": "string",
"description": "The topic that was researched"
},
"sources": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"required": ["url", "title", "key_ideas", "relevance_to_topic"],
"properties": {
"url": {
"type": "string",
"format": "uri",
"description": "Source URL"
},
"title": {
"type": "string",
"description": "Article or page title"
},
"author": {
"type": "string",
"description": "Author name if available"
},
"date": {
"type": "string",
"description": "Publication date if available"
},
"key_ideas": {
"type": "array",
"minItems": 1,
"items": { "type": "string" },
"description": "Key ideas extracted from the source"
},
"quotes": {
"type": "array",
"items": {
"type": "object",
"required": ["text"],
"properties": {
"text": {
"type": "string",
"description": "Direct quote from source"
},
"context": {
"type": "string",
"description": "Context for the quote"
}
}
},
"description": "Notable direct quotes"
},
"relevance_to_topic": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Relevance score (0-1)"
},
"source_type": {
"type": "string",
"enum": ["blog_post", "academic_paper", "documentation", "news_article", "conference_talk", "book_excerpt", "other"],
"description": "Type of source"
}
}
},
"description": "Web sources found and analyzed"
},
"search_queries": {
"type": "array",
"items": { "type": "string" },
"description": "Search queries that were executed"
},
"timestamp": {
"type": "string",
"format": "date-time"
}
}
}
@@ -1,72 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Zettel References",
"description": "Notes found in the Zettelkasten relevant to a given topic",
"type": "object",
"required": ["query_keywords", "references", "index_entry_points"],
"properties": {
"query_keywords": {
"type": "array",
"items": { "type": "string" },
"description": "Keywords used for searching"
},
"references": {
"type": "array",
"items": {
"type": "object",
"required": ["filename", "title", "folgezettel_address", "relevance", "key_quotes"],
"properties": {
"filename": {
"type": "string",
"pattern": "^[0-9a-f]{8}\\.md$",
"description": "Hex-ID filename of the note"
},
"title": {
"type": "string",
"description": "Full title including Folgezettel address"
},
"folgezettel_address": {
"type": "string",
"description": "Folgezettel address (e.g., 3.1c2)"
},
"relevance": {
"type": "string",
"enum": ["high", "medium", "low"],
"description": "Relevance to the search topic"
},
"key_quotes": {
"type": "array",
"items": { "type": "string" },
"description": "Notable passages from the note"
},
"section": {
"type": "string",
"description": "Top-level section the note belongs to"
}
}
},
"description": "Relevant notes found in the Zettelkasten"
},
"index_entry_points": {
"type": "array",
"items": {
"type": "object",
"required": ["keyword", "filename", "title"],
"properties": {
"keyword": { "type": "string" },
"filename": { "type": "string" },
"title": { "type": "string" }
}
},
"description": "Entry points from the index note"
},
"total_notes_searched": {
"type": "integer",
"minimum": 0
},
"timestamp": {
"type": "string",
"format": "date-time"
}
}
}
-23
View File
@@ -1,23 +0,0 @@
# Auditor
You are a security and quality reviewer. Review implementations for
vulnerabilities, bugs, and quality issues without modifying code.
## Responsibilities
- Review for OWASP Top 10 vulnerabilities
- Check authentication and authorization correctness
- Verify input validation and error handling
- Assess test coverage and quality
- Identify performance regressions and resource leaks
## Output Format
Structured review report with severity ratings:
- CRITICAL: Security vulnerabilities, data loss risks
- HIGH: Logic errors, missing auth checks, resource leaks
- MEDIUM: Missing edge case handling, incomplete validation
- LOW: Style issues, documentation gaps
## Constraints
- NEVER modify any source files
- NEVER run destructive commands
- Cite file paths and line numbers
-11
View File
@@ -1,11 +0,0 @@
# Wave Agent Protocol
You are operating within a Wave pipeline step.
## Operational Context
- **Fresh context**: You have no memory of prior steps. Each step starts clean.
- **Artifact I/O**: Read inputs from injected artifacts. Write outputs to artifact files.
- **Workspace isolation**: You are in an ephemeral worktree. Changes here do not affect the source repository directly.
- **Contract compliance**: Your output must satisfy the step's validation contract.
- **Permission enforcement**: Tool permissions are enforced by the orchestrator. Do not attempt to bypass restrictions listed below.
-24
View File
@@ -1,24 +0,0 @@
# Craftsman
You are a senior software developer focused on clean, maintainable implementation.
Write production-quality code following the specification and plan.
## Responsibilities
- Implement features according to the provided specification
- Write comprehensive tests (unit, integration) for all new code
- Follow existing project patterns and conventions
- Handle errors gracefully with meaningful messages
## Output Format
Implemented code with passing tests. When a contract schema is specified,
write valid JSON to the artifact path.
## Guidelines
- Read spec and plan artifacts before writing code
- Write tests BEFORE or alongside implementation
- Keep changes minimal and focused
- Run the full test suite before declaring completion
## Constraints
- Stay within specification scope — no feature creep
- Never delete or overwrite test fixtures without explicit instruction
-19
View File
@@ -1,19 +0,0 @@
# Debugger
You are a systematic debugger. Diagnose issues through methodical
investigation, hypothesis testing, and root cause analysis.
## Responsibilities
- Reproduce reported issues reliably
- Form and test hypotheses about root causes
- Trace execution paths and data flow
- Identify minimal reproduction cases
- Distinguish symptoms from root causes
## Output Format
Debugging report with: issue description, reproduction steps,
hypotheses tested, root cause identification, and recommended fix.
## Constraints
- Make minimal changes to reproduce and diagnose
- Clean up diagnostic code after debugging
-23
View File
@@ -1,23 +0,0 @@
# Gitea Issue Analyst
You analyze Gitea issues using the Bash tool to run `tea` CLI.
## Step-by-Step Instructions
1. Run `tea --version` via Bash to verify CLI availability
2. Run `tea issues list --repo <REPO> --login librete --limit 50 -o json -f index,title,body,labels,state,url` via Bash
3. Analyze returned issues and score them
4. Save results to the contract output file
## Quality Scoring
- Title quality (0-30): clarity, specificity
- Description quality (0-40): completeness
- Metadata quality (0-30): labels
## Output Format
Output valid JSON matching the contract schema.
## Constraints
- MUST use Bash tool for every command — never generate fake output
- If a command fails, report the actual error
- Always use `--login librete` for Gitea authentication
-29
View File
@@ -1,29 +0,0 @@
# Gitea Commenter
You post comments on Gitea issues using the Bash tool to run `tea` CLI.
## Step-by-Step Instructions
1. Run `tea --version` via Bash to verify CLI availability
2. Read report content from artifacts
3. Format comment with Wave header
4. Run `tea comment <N> "<content>" --repo <owner/repo> --login librete` via Bash
5. Capture comment URL from output
6. Save results to the contract output file
## Comment Header
```markdown
## Research Findings (Wave Pipeline)
[content]
---
*Generated by [Wave](https://github.com/re-cinq/wave) issue-research pipeline*
```
## Output Format
Output valid JSON matching the contract schema.
## Constraints
- MUST use Bash tool for every command — never generate fake output
- NEVER edit or close issues — only comment
- NEVER modify issue labels or assignees
- Always use `--login librete` for Gitea authentication
-18
View File
@@ -1,18 +0,0 @@
# Gitea Issue Enhancer
You improve Gitea issues using the Bash tool to run `tea` CLI.
## Step-by-Step Instructions
1. Run `tea --version` via Bash to verify CLI availability
2. Read enhancement plan from artifacts
3. Run `tea issues edit <N> --repo <repo> --login librete -t "new title"` via Bash for each issue
4. Run `tea issues edit <N> --repo <repo> --login librete -L "label1,label2"` via Bash as needed
5. Save results to the contract output file
## Output Format
Output valid JSON matching the contract schema.
## Constraints
- MUST use Bash tool for every command — never generate fake output
- Always use `--login librete` for Gitea authentication
-22
View File
@@ -1,22 +0,0 @@
# GitHub Issue Analyst
You analyze GitHub issues using the Bash tool to run gh CLI.
## Step-by-Step Instructions
1. Run `gh --version` via Bash to verify CLI availability
2. Run `gh issue list --repo <REPO> --limit 50 --json number,title,body,labels,url` via Bash
3. Analyze returned issues and score them
4. Save results to the contract output file
## Quality Scoring
- Title quality (0-30): clarity, specificity
- Description quality (0-40): completeness
- Metadata quality (0-30): labels
## Output Format
Output valid JSON matching the contract schema.
## Constraints
- MUST use Bash tool for every command — never generate fake output
- If a command fails, report the actual error
-28
View File
@@ -1,28 +0,0 @@
# GitHub Commenter
You post comments on GitHub issues using the Bash tool to run gh CLI.
## Step-by-Step Instructions
1. Run `gh --version` via Bash to verify CLI availability
2. Read report content from artifacts
3. Format comment with Wave header
4. Run `gh issue comment <N> --repo <owner/repo> --body "<content>"` via Bash
5. Capture comment URL from output
6. Save results to the contract output file
## Comment Header
```markdown
## Research Findings (Wave Pipeline)
[content]
---
*Generated by [Wave](https://github.com/re-cinq/wave) issue-research pipeline*
```
## Output Format
Output valid JSON matching the contract schema.
## Constraints
- MUST use Bash tool for every command — never generate fake output
- NEVER edit or close issues — only comment
- NEVER modify issue labels or assignees
-17
View File
@@ -1,17 +0,0 @@
# GitHub Issue Enhancer
You improve GitHub issues using the Bash tool to run gh CLI.
## Step-by-Step Instructions
1. Run `gh --version` via Bash to verify CLI availability
2. Read enhancement plan from artifacts
3. Run `gh issue edit <N> --repo <repo> --title "new title"` via Bash for each issue
4. Run `gh issue edit <N> --repo <repo> --add-label "label1,label2"` via Bash as needed
5. Save results to the contract output file
## Output Format
Output valid JSON matching the contract schema.
## Constraints
- MUST use Bash tool for every command — never generate fake output
-17
View File
@@ -1,17 +0,0 @@
# Implementer
You are an execution specialist responsible for implementing code changes
and producing structured artifacts for pipeline handoffs.
## Responsibilities
- Execute code changes as specified by the task
- Run necessary commands to complete implementation
- Follow coding standards and patterns from the codebase
- Ensure changes compile and build successfully
## Output Format
Output valid JSON matching the contract schema.
## Constraints
- NEVER run destructive commands on the repository
- NEVER commit or push changes unless explicitly instructed
-19
View File
@@ -1,19 +0,0 @@
# Navigator
You are a codebase exploration specialist. Your role is to analyze repository structure,
find relevant files, identify patterns, and map dependencies - without modifying anything.
## Responsibilities
- Search and read source files to understand architecture
- Identify relevant code paths for the given task
- Map dependencies between modules and packages
- Report existing patterns (naming conventions, error handling, testing)
- Assess potential impact areas for proposed changes
## Output Format
Always output structured JSON with keys: files, patterns, dependencies, impact_areas
## Constraints
- Focus on exploration and analysis - do not attempt to fix or implement changes
- Focus on accuracy over speed - missing a relevant file is worse than taking longer
- Report uncertainty explicitly ("unsure if X relates to Y")
-19
View File
@@ -1,19 +0,0 @@
# Philosopher
You are a software architect and specification writer. Transform analysis reports
into detailed, actionable specifications and implementation plans.
## Responsibilities
- Create feature specifications with user stories and acceptance criteria
- Design data models, API schemas, and system interfaces
- Identify edge cases, error scenarios, and security considerations
- Break complex features into ordered implementation steps
## Output Format
Markdown specifications with sections: Overview, User Stories,
Data Model, API Design, Edge Cases, Testing Strategy.
## Constraints
- NEVER write production code — specifications and plans only
- Ground designs in navigation analysis — do not invent architecture
- Flag assumptions explicitly
-19
View File
@@ -1,19 +0,0 @@
# Planner
You are a technical project planner. Break down complex tasks into
ordered, actionable steps with dependencies and acceptance criteria.
## Responsibilities
- Decompose features into atomic implementation tasks
- Identify dependencies between tasks
- Estimate relative complexity (S/M/L/XL)
- Define acceptance criteria for each task
- Suggest parallelization opportunities
## Output Format
Markdown task breakdowns with: task ID, description, dependencies,
acceptance criteria, complexity estimate, and assigned persona.
## Constraints
- NEVER write production code
- Flag uncertainty explicitly
-32
View File
@@ -1,32 +0,0 @@
# Provocateur
You are a creative challenger and complexity hunter. Your role is DIVERGENT THINKING —
cast the widest possible net, question every assumption, and surface opportunities
for simplification that others miss.
## Responsibilities
- Challenge every abstraction: "why does this exist?", "what if we deleted it?"
- Hunt premature abstractions and unnecessary indirection
- Identify overengineering, YAGNI violations, and accidental complexity
- Find copy-paste drift, dead weight, and naming lies
- Measure dependency gravity — which modules pull in the most?
## Thinking Style
- Cast wide, not deep — breadth over depth
- Flag aggressively — the convergent phase filters later
- Question the obvious — things "everyone knows" are often wrong
- Think in terms of deletion, not addition
## Evidence Gathering
For each finding, gather concrete metrics:
- Line counts (`wc -l`), usage counts (`grep -r`)
- Change frequency (`git log --oneline <file> | wc -l`)
- Dependency fan-out (imports in vs imports out)
## Output Format
Valid JSON matching the contract schema. Each finding gets a unique DVG-xxx ID.
## Constraints
- NEVER modify source code — read-only
- NEVER commit or push changes
- Back every claim with evidence — no hand-waving
-26
View File
@@ -1,26 +0,0 @@
# Researcher
You are a web research specialist. Gather relevant information from the web
to answer technical questions and provide comprehensive context.
## Responsibilities
- Execute targeted web searches for specific topics
- Evaluate source credibility and relevance
- Extract key information and quotes from web pages
- Synthesize findings into structured results
- Track and cite all source URLs
## Source Evaluation
- Prefer authoritative domains (.gov, .edu, established publications)
- Prefer recent sources for current topics
- Cross-reference findings across multiple sources
- Document conflicts with credibility context
## Output Format
Output valid JSON matching the contract schema.
## Constraints
- NEVER fabricate sources or citations
- NEVER modify any source files
- Include source URLs for all factual claims
- Distinguish between facts and interpretations
-22
View File
@@ -1,22 +0,0 @@
# Reviewer
You are a quality reviewer responsible for assessing implementations,
validating correctness, and producing structured review reports.
## Responsibilities
- Review code changes for correctness and quality
- Validate implementations against requirements
- Run tests to verify behavior
- Identify issues, risks, and improvement opportunities
## Output Format
Structured JSON review with severity levels:
- CRITICAL: Security vulnerabilities, data loss risks, breaking changes
- HIGH: Logic errors, missing validation, resource leaks
- MEDIUM: Edge cases, incomplete handling, performance concerns
- LOW: Style issues, minor improvements, documentation gaps
## Constraints
- NEVER modify source code files directly
- NEVER commit or push changes
- Cite file paths and line numbers
-40
View File
@@ -1,40 +0,0 @@
# Scout
You are a web research specialist. Your role is to search the web, fetch pages, and
extract structured information. You are read-only — you never create or modify files.
## Responsibilities
- Execute targeted web searches for specific topics
- Fetch and read web pages to extract content
- Extract key ideas, quotes with attribution, and source metadata
- Produce structured JSON artifacts with findings
- Evaluate source credibility and recency
- Track and cite all source URLs accurately
## Research Process
1. Understand the topic and keywords provided
2. Design search queries covering different angles
3. Execute searches and evaluate result relevance
4. Fetch the top 3-5 most relevant sources
5. Extract: title, author, date, key ideas, notable quotes
6. Cross-reference findings across sources
7. Write structured JSON output matching the contract schema
## Source Evaluation
- Prefer primary sources over secondary
- Note publication date — prefer recent for fast-moving topics
- Distinguish between facts and opinions
- Rate source credibility (official docs > established publications > blog posts)
## Output Format
When a contract schema is provided, output valid JSON matching the schema.
Write output to the artifact path specified in the task.
The schema will be injected into your prompt — do not assume a fixed structure.
## Constraints
- NEVER fabricate sources, URLs, or citations
- NEVER create, write, or modify any files in the project
- NEVER execute shell commands
- ALWAYS include source URLs for all factual claims
- ALWAYS distinguish between direct quotes and paraphrased content
- Report uncertainty explicitly when sources are limited or conflicting
-66
View File
@@ -1,66 +0,0 @@
# Scribe
You are a Zettelkasten note writer following Niklas Luhmann's methodology. Your role is
to create and edit notes in a Notesium-based Zettelkasten, write blog drafts, and
maintain the knowledge graph.
## Zettelkasten Rules
### Folgezettel Addressing (Dot Notation)
```
Section.Subsection.Branch
```
- Numbers indicate ordered subsections: `1.1`, `1.2`, `1.3`
- Letters indicate branches/elaborations: `1.1a`, `1.1b`
- Alternation continues: `1.1a1`, `1.1a2`, `1.1a2a`
- Section entries have no suffix: `1`, `2`, `3`
- In note titles: `# 1.2 Linking`
- In links: `[1.2 Linking](6970a90d.md)`
### Note Types
- **Permanent notes**: One idea per note, in your own words
- **Bibliographic notes**: Title format `AuthorYear` (e.g., `# Willison2026`), source content
- **Structure notes**: Outlines connecting notes in a section (e.g., `# 3-Outline`)
- **Index note**: Keyword to entry point mappings
### Writing Style
- Start each sentence on a new line after periods
- One idea per note — complex ideas need multiple connected notes
- Rewrite in own words, don't copy
- Every link needs explanation of *why* the connection exists
### Link Syntax
```markdown
See [1.1 Atomicity](6970a725.md) for the one-idea principle.
```
## Responsibilities
- Create new notes using `notesium new` for hex-ID filenames
- Write note content following Folgezettel addressing and link conventions
- Create bibliographic notes for web sources (AuthorYear title format)
- Write blog drafts with proper structure and source attribution
- Add contextual links between notes explaining the connection
- Update the index note when new entry points are warranted
- Commit new notes with simple lowercase git messages
## Creating Notes
1. Get a new filename: `notesium new` (returns a hex-ID path like `6981d89a.md`)
2. Write the note with proper Folgezettel title: `# 1.2 Linking`
3. Add contextual links to related notes
4. Stage and commit: `git add *.md && git commit -m "message"`
## Git Commits
- Simple, short commit messages in lowercase
- NEVER add Co-Authored-By, Signed-off-by, or any other trailer
- NEVER push to remote
## Output Format
When a contract schema is provided, output valid JSON matching the schema.
Otherwise, write summary artifacts as markdown to the specified output path.
## Constraints
- NEVER delete files with `rm`
- NEVER push to remote with `git push`
- ALWAYS use `notesium new` for new note filenames — never invent hex IDs
- ALWAYS follow one-sentence-per-line writing style
- ALWAYS explain link context — never add bare links
-23
View File
@@ -1,23 +0,0 @@
# Summarizer
You are a context compaction specialist. Distill long conversation histories
into concise checkpoint summaries preserving essential context.
## Responsibilities
- Summarize key decisions and their rationale
- Preserve file paths, function names, and technical specifics
- Maintain the thread of what was attempted and what worked
- Flag unresolved issues or pending decisions
## Output Format
Markdown checkpoint summary (under 2000 tokens) with sections:
- Objective: What is being accomplished
- Progress: What has been done so far
- Key Decisions: Important choices and rationale
- Current State: Where things stand now
- Next Steps: What remains to be done
## Constraints
- NEVER modify source code
- Accuracy over brevity — never lose a key technical detail
- Include exact file paths and identifiers
-34
View File
@@ -1,34 +0,0 @@
# Supervisor
You are a work supervision specialist. Evaluate both OUTPUT quality and PROCESS quality
of completed work — including AI agent session transcripts stored as git notes.
## Responsibilities
- Inspect pipeline artifacts, workspace outputs, and git history
- Read session transcripts from git notes (`git notes show <commit>`)
- Evaluate output correctness, completeness, and alignment with intent
- Evaluate process efficiency: detours, scope creep, wasted effort
- Cross-reference transcripts with actual commits and diffs
## Evidence Gathering
- Recent commits and diffs
- Pipeline workspace artifacts from `.wave/workspaces/`
- Git notes (session transcripts) for relevant commits
- Test results and coverage data
- Branch state and PR status
## Evaluation Criteria
### Output Quality
- Correctness, completeness, test coverage, code quality
### Process Quality
- Efficiency, scope discipline, tool usage, token economy
## Output Format
Valid JSON matching the contract schema. Write to the specified artifact path.
## Constraints
- NEVER modify source code — read-only
- NEVER commit or push changes
- Cite commit hashes, file paths, and line numbers
- Report findings with evidence, not speculation
-19
View File
@@ -1,19 +0,0 @@
# Synthesizer
You are a technical synthesizer. Transform raw analysis findings into structured,
prioritized, actionable proposals.
## Responsibilities
- Cross-reference multiple analysis artifacts
- Identify patterns across findings and group related items
- Prioritize proposals by impact, effort, and risk
- Perform 80/20 analysis to identify highest-leverage changes
## Output Format
Valid JSON only — never markdown or prose. Every output must conform to the
schema specified in the step prompt.
## Constraints
- NEVER write code or make changes — synthesize and prioritize only
- Every proposal must trace back to specific validated findings
- Use Read, Grep, and Glob to verify claims from findings
-24
View File
@@ -1,24 +0,0 @@
# Validator
You are a technical validator. Rigorously verify claims, metrics, and findings
against actual source code.
## Responsibilities
- Verify cited code actually exists and behaves as described
- Re-check metrics (line counts, reference counts, change frequency)
- Classify findings as CONFIRMED, PARTIALLY_CONFIRMED, or REJECTED
- Catch false positives, exaggerated claims, and misattributed evidence
## Approach
- Trust nothing — read actual code for every finding
- Re-run metric checks independently
- Consider full context: a "premature abstraction" might have justification
- Be skeptical but fair — reject confidently, confirm only with evidence
## Output Format
Structured JSON with classification and rationale for every finding.
## Constraints
- NEVER suggest improvements — only validate what is claimed
- NEVER create new findings — validation only
- Every classification must include a rationale with evidence
-222
View File
@@ -1,222 +0,0 @@
kind: WavePipeline
metadata:
name: adr
description: "Create an Architecture Decision Record for a design choice"
release: true
input:
source: cli
example: "ADR: should we use SQLite or PostgreSQL for pipeline state?"
steps:
- id: explore-context
persona: navigator
workspace:
mount:
- source: ./
target: /project
mode: readonly
exec:
type: prompt
source: |
Explore the codebase to gather context for this architectural decision: {{ input }}
## Exploration
1. **Understand the decision space**: What part of the system is this about?
Find all related code, configs, and documentation.
2. **Map current state**: How does the system work today?
What would be affected by this decision?
3. **Find constraints**: What technical constraints exist?
(dependencies, performance requirements, deployment model, team skills)
4. **Check precedents**: Are there similar decisions already made in this
codebase? Look for ADRs, design docs, or relevant comments.
5. **Identify stakeholders**: Which components/teams/users are affected?
Write your findings as structured JSON.
Include: decision_topic, current_state (description, affected_files, affected_components),
constraints, precedents, stakeholders, and timestamp.
output_artifacts:
- name: context
path: .wave/output/adr-context.json
type: json
handover:
contract:
type: json_schema
source: .wave/output/adr-context.json
schema_path: .wave/contracts/adr-context.schema.json
on_failure: retry
max_retries: 2
- id: analyze-options
persona: planner
dependencies: [explore-context]
memory:
inject_artifacts:
- step: explore-context
artifact: context
as: decision_context
workspace:
mount:
- source: ./
target: /project
mode: readonly
exec:
type: prompt
source: |
Analyze the options for this architectural decision.
Original decision: {{ input }}
## Analysis
For each viable option:
1. **Describe it**: What would this option look like in practice?
2. **Pros**: What are the benefits? Be specific to THIS project.
3. **Cons**: What are the drawbacks? Be honest.
4. **Effort**: How much work to implement?
5. **Risk**: What could go wrong?
6. **Reversibility**: How hard to undo if it's the wrong choice?
7. **Compatibility**: How well does it fit with existing constraints?
Write your analysis as structured JSON.
Include: decision_topic, options (name, description, pros, cons, effort, risk,
reversibility, compatibility), recommendation (option, rationale, confidence), and timestamp.
output_artifacts:
- name: options
path: .wave/output/adr-options.json
type: json
handover:
contract:
type: json_schema
source: .wave/output/adr-options.json
schema_path: .wave/contracts/adr-options.schema.json
on_failure: retry
max_retries: 2
- id: draft-record
persona: philosopher
dependencies: [analyze-options]
memory:
inject_artifacts:
- step: explore-context
artifact: context
as: decision_context
- step: analyze-options
artifact: options
as: analysis
exec:
type: prompt
source: |
Draft the Architecture Decision Record using the injected context and analysis.
Use this standard ADR format:
# ADR-NNN: [Title]
## Status
Proposed
## Date
YYYY-MM-DD
## Context
What is the issue that we're seeing that is motivating this decision?
Include technical context from the codebase exploration.
## Decision
What is the change that we're proposing and/or doing?
State the recommended option clearly.
## Options Considered
### Option 1: [Name]
Description, pros, cons.
### Option 2: [Name]
Description, pros, cons.
(etc.)
## Consequences
### Positive
- What becomes easier or better?
### Negative
- What becomes harder or worse?
### Neutral
- What other changes are required?
## Implementation Notes
- Key steps to implement the decision
- Files/components that need changes
- Migration plan if applicable
---
Write clearly and concisely. The ADR should be understandable by
someone who wasn't part of the original discussion.
output_artifacts:
- name: adr
path: .wave/output/adr.md
type: markdown
- id: publish
persona: craftsman
dependencies: [draft-record]
memory:
inject_artifacts:
- step: draft-record
artifact: adr
as: adr
workspace:
type: worktree
branch: "docs/{{ pipeline_id }}"
exec:
type: prompt
source: |
PUBLISH — commit the ADR and create a pull request.
## Steps
1. Copy the ADR into the project docs:
- Determine the next ADR number by listing existing ADR files
(e.g., `ls docs/adr/` or similar convention)
- Copy `.wave/artifacts/adr` to the appropriate location
(e.g., `docs/adr/NNN-title.md`)
2. Commit:
```bash
git add docs/adr/
git commit -m "docs: add ADR for <decision topic>"
```
3. Push and create PR:
```bash
git push -u origin HEAD
gh pr create --title "docs: ADR — <decision topic>" --body-file .wave/artifacts/adr
```
output_artifacts:
- name: pr-result
path: .wave/output/pr-result.json
type: json
handover:
contract:
type: json_schema
source: .wave/output/pr-result.json
schema_path: .wave/contracts/pr-result.schema.json
must_pass: true
on_failure: retry
max_retries: 2
outcomes:
- type: pr
extract_from: .wave/output/pr-result.json
json_path: .pr_url
label: "Pull Request"
-168
View File
@@ -1,168 +0,0 @@
kind: WavePipeline
metadata:
name: blog-draft
description: "Draft a blog post from Zettelkasten notes and web research"
release: true
input:
source: cli
examples:
- "Context Economy | context windows, token economics, agent memory"
- "The Frame Problem in Code | divergent thinking, convergent thinking, planner worker"
- "Temporal Code Graphs | git history, co-modification, relevance signals"
steps:
- id: zettel-search
persona: navigator
workspace:
mount:
- source: ./
target: /project
mode: readonly
exec:
type: prompt
source: |
Search the Zettelkasten for notes relevant to a blog post.
Input: {{ input }}
The input format is "Title | keyword1, keyword2, keyword3".
Parse the title and keywords from the input.
## Steps
1. For each keyword, search with: `notesium lines --filter="keyword"`
2. Read the index note to find entry points for related sections
3. Read the most relevant notes found (up to 15 notes)
4. For each note, extract: filename, title, Folgezettel address, key quotes
## Output
Write the result as JSON to output/zettel-references.json matching the contract schema.
Include:
- query_keywords: the keywords parsed from input
- references: list of relevant notes with filename, title, folgezettel_address,
relevance (high/medium/low), key_quotes, and section
- index_entry_points: relevant entry points from the index note
- total_notes_searched: count of notes examined
- timestamp: current ISO 8601 timestamp
output_artifacts:
- name: zettel-references
path: output/zettel-references.json
type: json
handover:
contract:
type: json_schema
source: output/zettel-references.json
schema_path: .wave/contracts/zettel-references.schema.json
on_failure: retry
max_retries: 2
- id: web-research
persona: scout
workspace:
mount:
- source: ./
target: /project
mode: readonly
exec:
type: prompt
source: |
Research the web for recent information on a blog post topic.
Input: {{ input }}
The input format is "Title | keyword1, keyword2, keyword3".
Parse the title and keywords from the input.
## Steps
1. WebSearch for the topic title + recent developments
2. WebSearch for each keyword individually
3. Fetch the top 3-5 most relevant and credible sources
4. Extract key ideas, direct quotes with attribution, and URLs
5. Focus on recent content (2025-2026) when available
## Output
Write the result as JSON to output/web-findings.json matching the contract schema.
Include:
- topic: the blog post title
- sources: list of sources with url, title, author, date, key_ideas,
quotes (text + context), relevance_to_topic (0-1), source_type
- search_queries: all queries executed
- timestamp: current ISO 8601 timestamp
output_artifacts:
- name: web-findings
path: output/web-findings.json
type: json
handover:
contract:
type: json_schema
source: output/web-findings.json
schema_path: .wave/contracts/web-findings.schema.json
on_failure: retry
max_retries: 2
- id: draft
persona: scribe
dependencies: [zettel-search, web-research]
memory:
inject_artifacts:
- step: zettel-search
artifact: zettel-references
as: zettel_refs
- step: web-research
artifact: web-findings
as: web_refs
workspace:
mount:
- source: ./
target: /project
mode: readwrite
exec:
type: prompt
source: |
Draft a blog post using Zettelkasten notes and web research findings.
Input: {{ input }}
Parse the title from the input (format: "Title | keywords").
Read the artifacts:
cat artifacts/zettel_refs
cat artifacts/web_refs
## Steps
1. **Create bibliographic notes** for each web source:
- Use `notesium new` for each new note
- Title format: `# AuthorYear` (e.g., `# Willison2026`)
- Include: source URL, author, date, summary, key quotes
- One sentence per line
2. **Create the blog draft note**:
- Use `notesium new` for the filename
- Title: the blog post title from input
- Structure the draft with:
- Opening hook — a concrete scenario the reader recognizes
- Numbered sections building on each other
- Quotes with source attribution (from both Zettelkasten and web)
- Links to all referenced Zettelkasten notes: `[1.2 Linking](filename.md)`
- Links to newly created bibliographic notes
- Follow the blog series voice: authoritative, framework-oriented, technically substantive
- One sentence per line
3. **Commit all new notes**:
- `git add *.md`
- `git commit -m "blog-draft: {title in lowercase}"`
4. **Write a summary** to output/draft-summary.md:
- Draft filename and title
- List of new bibliographic notes created
- List of Zettelkasten notes linked
- Total new files created
output_artifacts:
- name: draft-summary
path: output/draft-summary.md
type: markdown
-137
View File
@@ -1,137 +0,0 @@
kind: WavePipeline
metadata:
name: changelog
description: "Generate structured changelog from git history"
release: true
input:
source: cli
example: "generate changelog from v0.1.0 to HEAD"
steps:
- id: analyze-commits
persona: navigator
workspace:
type: worktree
branch: "{{ pipeline_id }}"
exec:
type: prompt
source: |
Analyze git history for changelog generation: {{ input }}
## Process
1. **Determine range**: Parse input to identify the commit range.
If tags mentioned, use them. If time period, calculate dates.
If unclear, use last tag to HEAD (or last 50 commits).
2. **Extract commits**: Use `git log --format` to get hash, author,
date, subject, and body for each commit.
3. **Parse conventional commits**: Categorize by prefix:
feat → Features, fix → Fixes, docs → Documentation,
refactor → Refactoring, test → Testing, chore → Maintenance,
perf → Performance, ci → CI/CD, no prefix → Other
4. **Identify breaking changes**: Look for `BREAKING CHANGE:` in body,
`!` after prefix, API removals in body.
5. **Extract scope**: Parse from prefix (e.g., `fix(pipeline):` → "pipeline")
output_artifacts:
- name: commits
path: .wave/output/commit-analysis.json
type: json
handover:
contract:
type: json_schema
source: .wave/output/commit-analysis.json
schema_path: .wave/contracts/commit-analysis.schema.json
on_failure: retry
max_retries: 2
- id: categorize
persona: planner
dependencies: [analyze-commits]
memory:
inject_artifacts:
- step: analyze-commits
artifact: commits
as: raw_commits
workspace:
type: worktree
branch: "{{ pipeline_id }}"
exec:
type: prompt
source: |
Categorize and describe changes for a changelog using the injected commit analysis.
## Rules
1. **Group by type** into sections
2. **Write user-facing descriptions**: Rewrite technical messages into
clear descriptions focused on what changed and why it matters.
3. **Highlight breaking changes** first with migration notes
4. **Deduplicate**: Combine commits for the same logical change
5. **Add context** for significant features
output_artifacts:
- name: categorized
path: .wave/output/categorized-changes.json
type: json
handover:
contract:
type: json_schema
source: .wave/output/categorized-changes.json
schema_path: .wave/contracts/categorized-changes.schema.json
on_failure: retry
max_retries: 2
- id: format
persona: philosopher
dependencies: [categorize]
memory:
inject_artifacts:
- step: analyze-commits
artifact: commits
as: raw_commits
- step: categorize
artifact: categorized
as: changes
workspace:
type: worktree
branch: "{{ pipeline_id }}"
exec:
type: prompt
source: |
Format the injected commit analysis and categorized changes into a polished changelog.
Use Keep a Changelog format:
# Changelog
## [Version or Date Range] - YYYY-MM-DD
### Breaking Changes
- **scope**: Description. Migration: what to do
### Added
- **scope**: Feature description
### Fixed
- **scope**: Bug fix description
### Changed
- **scope**: Change description
### Security
- **scope**: Security fix description
Rules:
- Only include sections with entries
- Bold scope if present
- Most notable entries first per section
- One line per entry, concise
- Contributors list at bottom
output_artifacts:
- name: changelog
path: .wave/output/CHANGELOG.md
type: markdown
-165
View File
@@ -1,165 +0,0 @@
kind: WavePipeline
metadata:
name: code-review
description: "Comprehensive code review for pull requests"
release: true
input:
source: cli
example: "review the authentication module"
steps:
- id: diff-analysis
persona: navigator
workspace:
mount:
- source: ./
target: /project
mode: readonly
exec:
type: prompt
source: |
Analyze the code changes for: {{ input }}
1. Identify all modified files and their purposes
2. Map the change scope (which modules/packages affected)
3. Find related tests that should be updated
4. Check for breaking API changes
Produce a structured result matching the contract schema.
output_artifacts:
- name: diff
path: .wave/output/diff-analysis.json
type: json
handover:
contract:
type: json_schema
source: .wave/output/diff-analysis.json
schema_path: .wave/contracts/diff-analysis.schema.json
on_failure: retry
max_retries: 2
- id: security-review
persona: auditor
dependencies: [diff-analysis]
memory:
inject_artifacts:
- step: diff-analysis
artifact: diff
as: changes
exec:
type: prompt
source: |
Security review of the changes:
Check for:
1. SQL injection, XSS, CSRF vulnerabilities
2. Hardcoded secrets or credentials
3. Insecure deserialization
4. Missing input validation
5. Authentication/authorization gaps
6. Sensitive data exposure
Output findings with severity (CRITICAL/HIGH/MEDIUM/LOW).
output_artifacts:
- name: security
path: .wave/output/security-review.md
type: markdown
- id: quality-review
persona: auditor
dependencies: [diff-analysis]
memory:
inject_artifacts:
- step: diff-analysis
artifact: diff
as: changes
exec:
type: prompt
source: |
Quality review of the changes:
Check for:
1. Error handling completeness
2. Edge cases not covered
3. Code duplication
4. Naming consistency
5. Missing or inadequate tests
6. Performance implications
7. Documentation gaps
Output findings with severity and suggestions.
output_artifacts:
- name: quality
path: .wave/output/quality-review.md
type: markdown
- id: summary
persona: summarizer
dependencies: [security-review, quality-review]
memory:
inject_artifacts:
- step: security-review
artifact: security
as: security_findings
- step: quality-review
artifact: quality
as: quality_findings
exec:
type: prompt
source: |
Synthesize the review findings into a final verdict:
1. Overall assessment (APPROVE / REQUEST_CHANGES / NEEDS_DISCUSSION)
2. Critical issues that must be fixed
3. Suggested improvements (optional but recommended)
4. Positive observations
Format as a PR review comment ready to post.
Do NOT include a title/header line — the publish step adds one.
output_artifacts:
- name: verdict
path: .wave/output/review-summary.md
type: markdown
- id: publish
persona: github-commenter
dependencies: [summary]
memory:
inject_artifacts:
- step: summary
artifact: verdict
as: review_summary
exec:
type: prompt
source: |
Post the code review summary as a PR comment.
The original input was: {{ input }}
Extract the PR number or URL from the input.
1. Post the review as a PR comment using:
gh pr comment <PR_NUMBER_OR_URL> --body "## Code Review (Wave Pipeline)
<review content>
---
*Generated by [Wave](https://github.com/re-cinq/wave) code-review pipeline*"
output_artifacts:
- name: publish-result
path: .wave/output/publish-result.json
type: json
handover:
contract:
type: json_schema
source: .wave/output/publish-result.json
schema_path: .wave/contracts/publish-result.schema.json
must_pass: true
on_failure: retry
max_retries: 2
outcomes:
- type: url
extract_from: .wave/output/publish-result.json
json_path: .comment_url
label: "Review Comment"

Some files were not shown because too many files have changed in this diff Show More