391 Commits

Author SHA1 Message Date
Michael Ramos b2b8ce8090 chore: bump version to 0.19.27
For provenance purposes, this commit was AI assisted.
2026-06-03 14:32:40 -07:00
Michael Ramos ac2630078f feat: add PLANNOTATOR_GLIMPSE env var to disable Glimpse native window
Add glimpse config option to PlannotatorConfig and resolveUseGlimpse()
resolver. Wire into both Bun and Pi browser-opening paths. Document
PLANNOTATOR_GLIMPSE, PLANNOTATOR_GLIMPSE_WIDTH, and
PLANNOTATOR_GLIMPSE_HEIGHT in env var reference and AGENTS.md.

For provenance purposes, this commit was AI assisted.
2026-06-03 14:19:31 -07:00
Michael Ramos 33907d3c59 feat(marketing): add Kiro CLI to homepage agent selector
For provenance purposes, this commit was AI assisted.
2026-06-03 14:09:13 -07:00
Graham Lipsman be2c81fa3b annotate-last: pick which message to annotate (fixes #800) (#809)
* feat: message picker for annotate-last (#800)

When running /plannotator-last after /rewind, the newest transcript
entry is no longer the message the user intended to annotate, and there
was no affordance to pick a different one.

Adds a picker UI that surfaces the recent assistant messages so the
user can choose which one to annotate:

- A "Message N of M" button in the Viewer's sticky-top action bar
  (alongside Copy / Global comment / Attachments), so it stays
  accessible while scrolling.
- A "Messages" tab in the left sidebar with the full list
  (newest-first, preview + timestamp, default ★), mirroring the
  existing Files / Versions / Archive tab pattern.

Wired for Claude Code, Codex, and Droid (all share apps/hook/server).
OpenCode, Pi, and Copilot still get the original single-message
behavior — they don't emit recentMessages, so the picker affordances
hide cleanly.

Default selection (index 0) matches today's "last message" behavior,
so users who don't interact with the picker see no change.

* feat: extend annotate-last picker to Copilot and OpenCode

The picker UI from #800 was wired for Claude / Codex / Droid only. Pull
Copilot and OpenCode onto the same shape so users on those harnesses
also get the recent-messages picker when annotating the last assistant
message.

- Copilot: replace getLastCopilotMessage with getRecentCopilotMessages,
  walking events.jsonl newest-first up to 25 assistant.message events.
- OpenCode: rewrite the session walk to collect up to 25 messages
  (newest first) instead of bailing on the first hit; normalize the SDK
  time.created (ms epoch) to ISO to match the shared picker contract.
- Both pass recentMessages to startAnnotateServer only when length > 1,
  matching the existing Claude/Codex/Droid behavior.

Also trims a leftover narrating comment in MessagesBrowser and refreshes
the stale Copilot session-parser header.

Pi parity follows in the next commit (needs round-trip of the picker
selection through /api/feedback so its post-submit anchoring quotes the
right message).

* feat(pi): wire annotate-last picker with feedback round-trip

Extends the picker UI (#800) to Pi and fixes a Pi-specific anchoring bug
the picker would otherwise introduce.

Picker plumbing
- assistant-message: getRecentAssistantMessages walks the active branch
  newest-first, returning { messageId, text, timestamp? } in the same
  shape the other harnesses produce.
- Plumbed through plannotator-browser / plannotator-events so the Bun
  server's recentMessages option is populated when the branch has more
  than one assistant message.

Anchoring fix
- Pi quotes the targeted assistant message back to the agent because its
  UX is async — the conversation may have moved on by feedback time.
  With the picker, that target is no longer guaranteed to be the
  snapshot taken when the UI opened. The editor now sends the user's
  selectedMessageId with /api/feedback; Pi looks it up in the current
  branch via findAssistantMessageByEntryId and quotes that message
  instead. Falls back to the original snapshot if the entry is gone.
- The round-trip field is optional and only meaningful in annotate-last
  mode; other harnesses (and other modes) ignore it.

Timestamp safety
- Pi's SDK currently types SessionEntryBase.timestamp as string, but the
  picker contract everywhere else is ISO. Treat the value as unknown and
  normalize string/number(ms)/Date to ISO; drop anything else, rather
  than blind-casting and risking silent drift if the SDK changes.

* chore: strip issue-number references from comments

Comments shouldn't rely on external references — issue numbers age out
of context, link rot is a thing, and a reader shouldn't need to open
GitHub to understand why a line exists. Strip the `(#800)` and `(#570)`
parentheticals from comments and doc strings across the picker and
review-gate code; the surrounding "why" content is preserved.

* fix: prevent removeChild crash when switching annotate-last messages

Switching the picked message remounted nothing, so React reconciled new
content against DOM that web-highlighter had mutated with <mark> nodes,
throwing removeChild. Drive the Viewer key (and StickyHeaderLane's
remount token) off a shared viewerContentKey so a message switch fully
remounts the Viewer and re-anchors the sticky-header observer.

Also cap MessagesBrowser row previews via previewText() and drop the
redundant 'block' class that was overriding line-clamp-2.

* feat: persist annotate-last feedback across messages

---------

Co-authored-by: Michael Ramos <mdramos8@gmail.com>
2026-06-03 13:01:36 -07:00
Benjamin Jesuiter 96aad592af Open Plannotator in Glimpse when available (#840)
* feat: open plannotator in glimpse

* fix: harden Glimpse browser integration

* chore: refresh lockfile after rebase

---------

Co-authored-by: Michael Ramos <mdramos8@gmail.com>
2026-06-03 12:17:11 -07:00
Xiangzhe 3c2f520c93 fix(pi-extension): avoid visible approval follow-up queue (#843) 2026-06-03 08:45:37 -07:00
dgrissen2 a6fb2f5459 feat(setup-goal): opt-in "grill first" interview step in Phase 1 (#839) 2026-06-02 17:38:12 -07:00
Ashwin John Chempolil 6a7fd415a7 Add Kiro CLI integration (skills + custom agent, cross-platform installers) (#837)
Universal, auto-detected Kiro CLI support — no flag, no separate installer.
When ~/.kiro exists (or kiro-cli is on PATH), the installer copies Plannotator
skills and a custom agent into ~/.kiro, the same convention used for Codex and
Gemini.

- packages/shared: add the kiro-cli agent origin (badge, prompt runtime,
  PLAN_TOOL_NAMES). Origin is cosmetic for Kiro (no dedicated AI provider).
- apps/kiro-cli: 3 origin-baked skills (review/annotate/archive) + an example
  custom agent that wires every skill via skill:// resources and a
  plannotator-scoped shell tool. setup-goal + visual-explainer install from
  apps/skills (no content duplication).
- scripts/install.sh: auto-detect ~/.kiro, sparse-checkout apps/kiro-cli,
  install 3 kiro + 2 shared skills + the agent (never clobbering an existing
  one); covered by scripts/install.test.ts.
- scripts/install.ps1 + install.cmd: Windows parity mirroring the Codex
  pattern. Statically verified only; not yet runtime-tested on Windows.
- docs: installation + Kiro guides, AGENTS.md, env-var reference updated.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-02 11:04:18 -07:00
Michael Ramos d8e0b86f96 chore: bump version to 0.19.26
For provenance purposes, this commit was AI assisted.
2026-05-31 20:12:19 -07:00
Michael Ramos 3638190844 chore: bump version to 0.19.25
For provenance purposes, this commit was AI assisted.
2026-05-31 19:19:56 -07:00
Michael Ramos 0d86d0ee41 Fix Amp plugin Bun env leak (#812) 2026-05-28 08:11:21 -07:00
Michael Ramos 791c46d78f Resolve Amp workspace cwd (#811) 2026-05-27 23:01:10 -07:00
Michael Ramos e6e0d87883 Fix Amp plugin binary resolution (#810) 2026-05-27 22:49:53 -07:00
Michael Ramos d479106038 chore: bump version to 0.19.24
For provenance purposes, this commit was AI assisted.
2026-05-27 22:22:49 -07:00
Michael Ramos 8c947c5419 Add Amp plugin integration (#803)
* Add Amp plugin integration

* Use official Amp logo on landing page

* Tighten landing agent selector

* Default landing selector to Claude Code

* Stabilize server ready handoff test

* Create ready handoff directory before writing

* Stabilize server ready handoff tests

* Fix Amp command cancellation and cwd

* Preserve Plannotator browser handling for Amp

* Fix Amp review edge cases

* Add PowerShell installer smoke coverage
2026-05-27 21:49:30 -07:00
Xiangzhe 9b545d12ab fix(pi-extension): queue plan approval continuation (#805) 2026-05-27 20:21:20 -07:00
Michael Ramos cee93b8685 Switch /workspaces/ dark palette to Plandromeda theme (#802)
Replace the warm-hue (55) walnut dark palette with the Plandromeda
palette — Andromeda's soft darkness at oklch hue 260. Brighter
primaries, richer accents, consistent blue undertone across the page.
Light mode unchanged (already identical to Plandromeda light).
2026-05-27 16:32:47 -07:00
Hrand Liu e0aee7451b feat: add PLANNOTATOR_DATA_DIR env var to customize data directory (#795)
* feat: add PLANNOTATOR_DATA_DIR env var to customize data directory

* fix: update missed hardcoded paths to use PLANNOTATOR_DATA_DIR

OpenCode plugin and VS Code extension still used hardcoded
~/.plannotator paths, causing the IPC registry and plan backing
file to diverge from the server when PLANNOTATOR_DATA_DIR is set.

Also exports data-dir from @plannotator/shared and documents the
new env var in AGENTS.md.

Co-authored-by: Chris Werner Rau <14326070+cwrau@users.noreply.github.com>
Co-authored-by: João O. Santos <34689526+Joao-O-Santos@users.noreply.github.com>

* fix: vendor data-dir.ts into Pi extension and rewrite imports

The Pi extension copies shared/server modules into generated/ at
build time. Without vendoring data-dir.ts and rewriting the
parent-relative imports, typecheck fails on all generated files
that import getPlannotatorDataDir.

* refactor: eliminate duplicated data-dir logic and clean up call sites

- VS Code extension: replace inlined getPlannotatorDataDir() copy with
  import from the canonical packages/shared/data-dir.ts (esbuild bundles
  it, so no runtime dependency needed)
- storage.ts: hoist repeated getPlannotatorDataDir() calls to a
  module-level DATA_DIR constant, matching the pattern config.ts uses
- data-dir.ts: remove inaccurate docstring claim about relative path
  resolution (the code does not call resolve())
- improvement-hooks.ts: hoist to DATA_DIR constant, clarify comments
  on the two-level hook lookup (hooks/ subdir vs root fallback)

* fix: resolve relative PLANNOTATOR_DATA_DIR to absolute path

A relative value like ./data would break readArchivedPlan's path
traversal guard, which compares a resolve()'d absolute path against
the still-relative planDir prefix. Always return an absolute path
so all callers get consistent path shapes.

* fix: use @plannotator/shared/data-dir imports in server package

Switch from relative ../shared/data-dir imports to the package
export, matching the convention every other server file follows.
Update Pi vendor script sed rules to match the new import style.

* fix: use package imports in server and respect data dir in compound skill

Server modules: switch from relative ../shared/data-dir imports to
@plannotator/shared/data-dir, matching the convention every other
server file follows. Update Pi vendor script sed rules to match.

Compound skill: update hardcoded ~/.plannotator paths to check
PLANNOTATOR_DATA_DIR first, so the skill reads plans and writes
the improvement hook to the correct location when users set a
custom data directory.

Co-authored-by: Chris Werner Rau <14326070+cwrau@users.noreply.github.com>
Co-authored-by: João O. Santos <34689526+Joao-O-Santos@users.noreply.github.com>

* fix: remove remaining hardcoded ~/.plannotator assumptions

- Settings UI: replace hardcoded path in label and placeholder with
  generic text that doesn't assume a specific data directory
- quickLabels: update agent tip to reference PLANNOTATOR_DATA_DIR
  so the agent checks the correct plans directory
- codex-review: hoist getPlannotatorDataDir() to module-level DATA_DIR
  constant, eliminating redundant per-call resolution in debugLog()
- Tests: make submit-plan and storage tests resilient to
  PLANNOTATOR_DATA_DIR being set in the environment
- Install scripts (sh, ps1, cmd): check PLANNOTATOR_DATA_DIR before
  falling back to ~/.plannotator for config.json attestation lookup

* fix: expand tilde in install script and update test assertions

install.sh: PLANNOTATOR_DATA_DIR set to ~/... stays literal inside
double quotes, so the config file check silently failed. Add case
statement to expand ~ the same way the runtime data-dir.ts does.

install.test.ts: update three assertions that checked for hardcoded
~/.plannotator paths — now verify PLANNOTATOR_DATA_DIR awareness
instead.

* docs: add PLANNOTATOR_DATA_DIR to env var reference with VS Code note

Document the new env var on the marketing site's environment
variables reference page. Include a footnote about ensuring
VS Code inherits the variable when launched from the Dock.

---------

Co-authored-by: Michael Ramos <mdramos8@gmail.com>
Co-authored-by: Chris Werner Rau <14326070+cwrau@users.noreply.github.com>
Co-authored-by: João O. Santos <34689526+Joao-O-Santos@users.noreply.github.com>
2026-05-26 14:56:07 -07:00
Michael Ramos 17c808cdca chore: bump version to 0.19.23
For provenance purposes, this commit was AI assisted.
2026-05-25 12:29:50 -07:00
Michael Ramos 7db5e9b8d9 Fix Windows Pi shim spawning (#792)
* Fix Windows Pi shim spawning

* Fix Pi smoke process cleanup

* Kill Windows Pi process trees
2026-05-25 11:50:50 -07:00
Michael Ramos 4de62e83e1 Add Droid slash-command integration (#787)
* feat: add Droid slash-command integration

* fix: restore Droid command launcher behavior

* chore: remove archive command from homepage

* fix(droid): tighten last-message session resolution
2026-05-24 09:29:13 -07:00
Michael Ramos 127f6c2ccc Make /workspaces/ system-themed with a custom dark palette (#788)
* Make /workspaces/ system-themed with a custom dark palette

Until now the page force-pinned the light tokens regardless of the
visitor's actual theme preference, which is rough at night.

Two changes:

1. The wrapper class is renamed `ws-force-light` → `ws-page-scope` and
   now defines two token sets:
   - default (no `.light` on <html>): a near-neutral, very-dark-gray
     palette specific to this page
   - `html.light .ws-page-scope`: the existing light palette, unchanged

   The page now follows whatever theme the global Nav toggle has set,
   the same way every other marketing page does.

2. The dark palette is intentionally NOT the global Plannotator dark
   theme. It uses near-zero chroma (`oklch(0.X 0 0)`) for surfaces
   (background 0.13, card 0.17, muted 0.22, border 0.27) so the
   landing page reads as a clean dark-gray sheet — Linear/Vercel
   energy rather than the warmer blue-tinted dark used in the docs
   and the editor. Primary stays violet (oklch(0.75 0.18 280)) so the
   OSS-commitment stamp and submit button still pop.

Every existing rule on the page already uses var(--background),
var(--card), var(--border), etc., plus relative-color tweaks like
`oklch(from var(--primary) l c h / 0.5)` — so they automatically
pick up the right values in both modes with no further changes.

Generated with [Devin](https://cli.devin.ai/docs)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>

* Warm up the dark palette and tone down the green/violet

Three follow-ups based on visual review of the new dark mode:

- Bg/card/muted/border ladder lifted ~2 L-points and given a touch
  of warm chroma (0.01 at hue 55) — page reads as dark walnut /
  leather instead of stark neutral charcoal.
- --secondary (Today / Next / Compound labels) dropped from
  oklch(0.70 0.15 180) to oklch(0.62 0.08 180) — same teal hue,
  desaturated and slightly dimmer so the row recedes.
- --primary (Join button, OSS contributor stamp, focus ring)
  dropped from oklch(0.75 0.18 280) to oklch(0.65 0.10 280) —
  same violet hue, dialed down to a dusty plum.

Light mode is unchanged — still inheriting .theme-plannotator.light.

Generated with [Devin](https://cli.devin.ai/docs)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>

---------

Co-authored-by: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-05-24 00:08:22 -07:00
Michael Ramos 6254a3c181 chore: bump version to 0.19.22
For provenance purposes, this commit was AI assisted.
2026-05-23 23:30:57 -07:00
Michael Ramos 5438f66456 fix: honor CLAUDE_CONFIG_DIR in session log discovery (#786)
Resolve DEFAULT_SESSIONS_DIR and DEFAULT_PROJECTS_DIR from
CLAUDE_CONFIG_DIR when set, falling back to ~/.claude.
Add projectsDirOverride param to findSessionLogsByAncestorWalk
so all four resolution tiers respect custom config paths.

Closes #783
2026-05-23 19:19:06 -07:00
Michael Ramos abca636889 Tighten Nav for mobile (#782)
Three changes that reclaim horizontal room on narrow viewports so the
Docs link stops drifting into the logo:

- Nav side padding 24px -> 16px on mobile (px-4 sm:px-6)
- Link group gap 8px -> 6px on mobile (gap-1.5 sm:gap-2)
- Hide the theme toggle on mobile (the React island lives in a
  hidden sm:flex wrapper); mode is still respected from cookies and
  the toggle is back at sm+

Generated with [Devin](https://cli.devin.ai/docs)

Co-authored-by: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-05-22 18:27:29 -07:00
Michael Ramos 647802117f Hide Blog link in Nav on mobile (#781)
Mobile screens were running out of horizontal room and the Docs link
was overlapping the Plannotator logo. Hiding Blog (and the separator
before it) on screens narrower than sm reclaims that space — Docs
shifts into where Blog used to be, no overlap.

Blog stays visible at sm+ where the full row fits comfortably.

Generated with [Devin](https://cli.devin.ai/docs)

Co-authored-by: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-05-22 18:24:44 -07:00
Michael Ramos ed994f3a3b Make Company optional in the UI (frontend-only) (#780)
Form labels Company 'optional', client validation no longer flags it
as Required when blank, and the submit handler stubs '(not provided)'
into the payload when the user leaves it empty so the worker's
existing 'company required' contract stays untouched.

Worker, schema, and DB are not changed.

Generated with [Devin](https://cli.devin.ai/docs)

Co-authored-by: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-05-22 18:14:06 -07:00
Michael Ramos c4590d7cee Drop redundant 'engineering knowledge base' tagline (#779)
The strong heading already says 'Collaborative knowledge base for
agent artifacts'; trailing 'Craft your shared engineering knowledge
base.' was just restating it.

Generated with [Devin](https://cli.devin.ai/docs)

Co-authored-by: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-05-22 18:06:13 -07:00
Michael Ramos c74b3a9b2e Add 'Versioned and accessible' to Next phase (#778)
* Add 'Versioned and accessible' to the Next phase copy

Tail clause notes that the standards extracted from artifacts and
reviews aren't a one-shot output — they're versioned over time and
visible to both your agents and your teammates.

Generated with [Devin](https://cli.devin.ai/docs)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>

* Drop 'product' from Compound phase copy

'faster product verification' → 'faster verification'.

Generated with [Devin](https://cli.devin.ai/docs)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>

---------

Co-authored-by: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-05-22 18:04:05 -07:00
Michael Ramos 0dc7a0c5ac Move Turnstile widget below the submit button (#777)
Re-applied on top of post-#776 main.
2026-05-22 18:01:39 -07:00
Michael Ramos e7e81aa9f2 Always show OSS contributor checkbox (revert progressive disclosure) (#776)
Removes the "show only when team-size = Just me" behavior added in
PR #773. The checkbox + lifetime-free-access note are now visible to
every visitor regardless of team size.

Reverts the wrapper div, the setContributorVisibility() helper + its
call site in the pill picker, and the .ws-contrib-block CSS.

Generated with [Devin](https://cli.devin.ai/docs)

Co-authored-by: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-05-22 18:00:20 -07:00
Michael Ramos d90e4f814d Reword the Compound phase copy (#775)
Tighten the first sentence (drop "during generation, in review, and"
which was redundant with "before and after code lands"), then add
the gating + quality/speed payoff as the second beat.

Generated with [Devin](https://cli.devin.ai/docs)

Co-authored-by: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-05-22 18:00:07 -07:00
Michael Ramos fc6d175c67 Soften workspaces page-title (#774)
"From review surfaces to integrated verification systems" reads like a
slide title. Replacing with "From review surfaces to standards your
agents learn from" which still captures both ideas (verification +
agents that improve from the team's reviews) but drops the corporate
phrasing.

Generated with [Devin](https://cli.devin.ai/docs)

Co-authored-by: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-05-22 17:51:53 -07:00
Michael Ramos 35e572a385 Progressive disclosure for the OSS contributor checkbox (#773)
The OSS-contributor claim is personal-scope (one human attesting they
contributed), so it only makes sense for individual signups. Hide the
checkbox + helper note until the user picks "Just me" on team size.
Switching to any non-solo size hides it again and resets the state to
false so team signups can't accidentally carry is_contributor=true.

Small fade-in animation on reveal so the layout shift doesn't feel
abrupt.

Generated with [Devin](https://cli.devin.ai/docs)

Co-authored-by: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-05-22 17:35:13 -07:00
Michael Ramos d9832b761c Pin light theme inside .ws-force-light on /workspaces/ (#772)
The earlier force-light approach (adding the `.light` class to <html>
from a head script) gets undone the moment the React ModeToggleIsland
hydrates: its mount effect always calls `classList.remove('light')`
before re-applying based on the saved cookie. If the visitor's saved
theme is dark, the page flashes light then flips to dark.

Inline the light theme tokens inside `.ws-force-light` instead. The
toggle component can still flip the global `.light` class on/off, but
the workspaces page's tokens are pinned at the wrapper scope and
unaffected. Result: deterministic light mode regardless of the
visitor's saved preference.

Generated with [Devin](https://cli.devin.ai/docs)

Co-authored-by: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-05-22 15:29:55 -07:00
Michael Ramos 93e8b5dfcf Add Plannotator Workspaces waitlist (page + worker + CI) (#771)
* Add Plannotator Workspaces waitlist (page + worker + CI)

Marketing
- New /workspaces/ page: hero+form sibling layout on desktop; mobile
  reorders to hero -> form -> info -> banners so the CTA is reachable
  on the first scroll. Uses the marketing site tokens/fonts and the
  existing border-x editorial column. Theme-aware via the cookie.
- Adds a "head" slot to Base.astro for per-page <head> additions.
- Nav: new "Workspaces" link with a "soon" pill.
- Landing: small Workspaces CTA band before the final install CTA.

Waitlist worker (apps/waitlist-service)
- Cloudflare Worker + D1 (SQLite). Mirrors the paste-service layout.
- Endpoints: POST /signup (Turnstile-protected, rate-limited, honeypot),
  GET /health, GET /admin/count, GET /admin/list gated by Bearer
  ADMIN_TOKEN.
- Validation: required email + company + team_size; optional note +
  is_contributor; honeypot field; freemail-aware company auto-inference.
- D1 schema includes a non-destructive 001 migration that adds note
  and is_contributor columns. 19/19 validation unit tests pass; tsc
  clean.

CI
- Adds a deploy-waitlist job to .github/workflows/deploy.yml mirroring
  paste-service. Uses the existing CLOUDFLARE_API_TOKEN and
  CLOUDFLARE_ACCOUNT_ID secrets, so no new repo config is required.

Generated with [Devin](https://cli.devin.ai/docs)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>

* Force light mode on /workspaces/

The page is designed and signed off in light. Override the saved theme
cookie via a head-slot inline script that adds the `.light` class
before paint. Base.astro's cookie reader only adds the class (never
removes), so any saved-dark preference can't undo this.

Generated with [Devin](https://cli.devin.ai/docs)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>

---------

Co-authored-by: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-05-22 15:01:43 -07:00
Michael Ramos 4db7fcc5da chore: bump version to 0.19.21
For provenance purposes, this commit was AI assisted.
2026-05-21 01:56:04 -07:00
Michael Ramos 2a5528693f Add Ask AI to plan and annotate reviews (#763)
* Add Ask AI to plan and annotate reviews

- mount shared AI runtime on plan, annotate, review, and Pi servers

- add shared document chat UI and comment-popover Ask AI entry point

- default providers from detected agent origin and document first-run announcement

- reuse shared code-review AI hook and document setup/docs

* Address Ask AI review followups

Stabilize AI chat session resets and callbacks, preserve per-origin provider defaults, share AI chat formatting utilities, and avoid blocking startup on model discovery.

* Fix AI permission details and Pi CLI lookup

Show formatted tool input in document AI permission cards and make Pi AI provider CLI detection work on Windows.

* Fix Pi model discovery in AI capabilities

Keep AI runtime startup non-blocking while making the capabilities endpoint await pending Pi/OpenCode model discovery before returning provider metadata.
2026-05-21 01:32:17 -07:00
Michael Ramos fa4482d7d5 chore: bump version to 0.19.20
For provenance purposes, this commit was AI assisted.
2026-05-19 08:30:48 -07:00
Robert Dailey 29390c9e71 fix(opencode): store active plan backing file outside workspace (#743)
The backing file used for edit-based plan submission was stored at
.opencode/plans/_active-plan.md inside the workspace, causing it to
appear in git status and editor file trees. It is now stored at
~/.plannotator/active/{project}/_active-plan.md alongside the version
history.

- Move getPlanBackingPath to derive path from project name under
  ~/.plannotator/active/
- Derive project name from ctx.directory basename via sanitizeTag at
  call site
- Delete backing file on approval since it is no longer needed after the
  session ends
- Update tests to reflect new path contract
2026-05-18 17:17:48 -07:00
Robert Dailey b3f1deb8d3 fix(opencode): skip end bounds check on empty file in validateEdits (#752)
When a file has no content (lineCount === 0), any edit is a pure insert
and the end field is semantically irrelevant. The previous check
rejected payloads where end was present on an empty file because end >
lineCount always evaluated true, breaking first-call submit_plan
invocations from agents or frameworks that include end unconditionally.

- Skip end > lineCount validation when lineCount === 0; applyEdits
  handles it via splice clamping
- Add applyEdits test: edit on empty file with start=1, end=1 produces
  correct output
- Add validateEdits test: passes for empty file with start=1 and end=1

Fixes #742
2026-05-18 17:17:09 -07:00
Michael Ramos 82636e1286 Add interactive goal setup UI (#731)
* Add interactive goal setup UI

* Refine goal interview skip and question flow

* Fix review findings: recommendation combo, option-only recs, single deselect

* Persist goal setup working JSON files

* Refine goal setup copy and facts controls

* Remove generated goal package from PR

* Address goal setup review issues

* Remove goal setup slash command adapters

* Disable fact comment attachments

* Fix goal setup fact comment state

* Address goal setup review cleanup

* Fix goal setup fact submission edge cases
2026-05-18 08:39:29 -07:00
Michael Ramos f471ebf99e chore: bump version to 0.19.18
For provenance purposes, this commit was AI assisted.
2026-05-17 23:53:11 -07:00
Michael Ramos 76eeea840e fix(docs): update stale Pi URLs from badlogic to earendil-works
For provenance purposes, this commit was AI assisted.
2026-05-17 23:53:07 -07:00
Muhammad Hashmi 9873cdb3f6 Fix Codex annotate-last message selection (#740) 2026-05-17 20:45:10 -07:00
Robert Dailey 807cc5f09b feat(submit-plan): replace dual-mode with edit-based interface (#730)
* feat(submit-plan): replace text/file-path mode with edit-based interface

Switches the OpenCode submit_plan tool from a dual-mode interface
(inline text or file path) to an edit-based one. The plugin now owns a
backing file at .opencode/plans/_active-plan.md; the agent never reads
or writes it directly. On denial, the response includes the current plan
with line numbers so the agent can apply surgical edits instead of
resubmitting the entire document, reducing token waste on iterative
revisions.

- Add applyEdits, validateEdits, formatWithLineNumbers, and
  getPlanBackingPath helpers to the plugin
- Validate edit ranges (bounds, overlap, size limit) before mutating the
  backing file
- Return line-numbered plan in denial responses to anchor targeted edits
- Remove getPlanDirectory, validatePlanPath, and file-path auto-
  detection from plan-mode.ts
- Replace plan-mode.test.ts path-validation coverage with submit-
  plan.test.ts for the edit engine
- Update custom-feedback.md and opencode.md docs for edit-based
  semantics

Refs #365

* chore(opencode): drop unused buildPlanFileRule import

Removed in PR #730 deny path along with the only call site, but the
import was left behind.

---------

Co-authored-by: Michael Ramos <mdramos8@gmail.com>
2026-05-15 09:54:04 -07:00
roman 57fa1c6e03 migrate pi extension from mariozechner to earendil-works (#729)
* fix(pi): move to earendil-works packages and links

* fix(docs): close markdown link for earendil pi URL

---------

Co-authored-by: Michael Ramos <mdramos8@gmail.com>
2026-05-15 09:48:16 -07:00
Michael Ramos 9fed785141 chore: bump version to 0.19.17
For provenance purposes, this commit was AI assisted.
2026-05-14 17:36:52 -07:00
Michael Ramos 934b1705c5 Revise fact definition for clarity and testability
Clarified the definition of a fact in the context of goal outcomes, emphasizing testability and simplicity.
2026-05-14 14:55:37 -07:00
Michael Ramos 0454db0aa4 Clarify description of facts in SKILL.md 2026-05-14 14:54:13 -07:00