Commit Graph
17 Commits
Author SHA1 Message Date
jennyf19andCopilot f9061f6fcc fix(signals-dashboard): coerce untrusted signal fields, block cross-site POSTs, preserve focus
Second review round on the Cairn canvas extension:
- XSS via numeric fields: self-assessment scores, quality rating, and
  token counts are read from unvalidated agent JSON and interpolated
  into HTML/style/title. Coerce them at the source in scanSignals via
  toScore (clamped 0..5) and toCount (finite nonnegative int), and
  esc() the effort label, so a nonnumeric value can neither inject
  markup nor break layout/width.
- CSRF: /api/stash, /api/restore, /api/open are state-changing loopback
  POSTs that previously accepted any origin, so a web page that guessed
  the port could mutate .desk-stash.json. Add isCrossSiteRequest() and
  reject cross-site POST /api/* (Origin / Sec-Fetch-Site check), mirroring
  the loopback protection in connector-namespaces/server.mjs.
- Accessibility: the 5s auto-refresh replaced the whole #content subtree,
  dropping keyboard focus. Skip the swap when markup is unchanged and
  restore focus to the same desk/action button when it does change.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 26faf13e-639c-4a21-ac05-c0dc2bff7c62
2026-07-18 19:50:58 -07:00
jennyf19andCopilot 967f0d8ede fix(signals-dashboard): harden canvas against XSS, path traversal, and malformed signals
Address PR review findings on the Cairn canvas extension:
- XSS: replace inline onclick handlers (which used HTML-escape that
  does not escape single quotes) with event delegation via
  data-act/data-desk attributes and one document click listener that
  survives the innerHTML auto-refresh.
- Path traversal: add isValidDeskName() and enforce it in every HTTP
  and canvas-action handler that takes a desk name (reject empty, /,
  \\, null byte, '.' and '..').
- Crash safety: String()-coerce in esc()/truncate() and guard
  outcomeIssues with Array.isArray so a malformed signal cannot take
  down the whole dashboard render.
- Honest UI: the per-desk button no longer claims to 'open' a desk;
  it is relabeled 'path' and copies the desk's filesystem path to the
  clipboard with an accurate toast built via textContent (not innerHTML).
- Correctness: outcome signals only pair with a signal when emitted at
  or after it (within 1hr), and activeCount is computed by excluding
  stashed desks instead of subtracting counts (no longer goes negative).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 26faf13e-639c-4a21-ac05-c0dc2bff7c62
2026-07-18 19:44:45 -07:00
jennyf19andCopilot c33470a0b4 docs(the-workshop): install dashboard via awesome-copilot, not jennyf19 repo
The signals-dashboard canvas extension bundles with the-workshop
plugin (x-awesome-copilot.extensions), so installing the plugin from
awesome-copilot includes the dashboard. Drop the pointers telling
users to install from jennyf19/the-workshop.

Addresses PR review comments on README (Cairn Dashboard section),
signal-write SKILL note, and workshop-ta agent viewing-signals note.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 26faf13e-639c-4a21-ac05-c0dc2bff7c62
2026-07-18 19:36:20 -07:00
Jenny FerriesandCopilot 0f62533f11 fix(the-workshop): add signals-dashboard preview.png + logo so the canvas validates
The signals-dashboard extension was missing its required screenshot asset, so it failed awesome-copilot's validateExtensionManifest (logo must equal "assets/preview.png" and the file must exist) and never materialized -- meaning the Cairn canvas would not ship to the GHCP app. Adds the 1024x1024 preview.png and the convention logo field. Validated locally: node eng/validate-plugins.mjs -> extension signals-dashboard is valid; all 70 plugins + 19 extensions pass.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 26faf13e-639c-4a21-ac05-c0dc2bff7c62
2026-07-18 19:21:31 -07:00
Jenny FerriesandCopilot 9fc4032293 feat: add signals-dashboard canvas extension
The dashboard is the centerpiece — real-time agent coordination
view showing desk status, signal types, intent text, outcome
pairing with honesty gap, token usage, and stash/restore controls.

Includes all updates from the-workshop PRs #3-#7:
- Empty state guidance for new users
- Token usage display per desk
- TA partnership signals + Cairn awareness
- Intent-as-text (execution signals use descriptive text)
- Outcome signal pairing with honesty gap calibration
- Open desk button
- Subtype labels (done/checkpoint/blocked/hands-up)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 26faf13e-639c-4a21-ac05-c0dc2bff7c62
2026-07-18 19:04:34 -07:00
Jenny Ferries ffd294c1d1 Merge remote-tracking branch 'upstream/main' into add-the-workshop 2026-07-18 19:00:08 -07:00
Jenny FerriesandCopilot 5814c6eadb feat: add workshop-create skill — two paths, never nest repos
Syncs with jennyf19/the-workshop PR #8 (merged). Adds the
workshop-create skill with Path A (existing dir) and Path B
(new GitHub repo), explicit guard against repo-in-repo nesting.
TA agent updated with workshop-create section.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 26faf13e-639c-4a21-ac05-c0dc2bff7c62
2026-07-18 18:58:31 -07:00
Jenny FerriesandCopilot 92335e31aa fix: revert agent rename — validator requires .agent.md suffix
The awesome-copilot validator (eng/validate-plugins.mjs:107-148)
strips .md from the plugin.json path and appends .agent.md to
find the source file. The rename to workshop-ta.md broke this
convention. Reverting to workshop-ta.agent.md so validation,
materialization, and README generation all work correctly.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 26faf13e-639c-4a21-ac05-c0dc2bff7c62
2026-07-17 14:11:46 -07:00
Jenny FerriesandCopilot dc432dc001 fix: rename workshop-ta.agent.md → workshop-ta.md (clean component ID)
The .agent.md suffix leaked into the component ID registered
with the marketplace. Renaming gives a clean 'workshop-ta'
identifier while the frontmatter display name stays unchanged.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 26faf13e-639c-4a21-ac05-c0dc2bff7c62
2026-07-17 14:06:42 -07:00
Jenny FerriesandCopilot 633ce15e83 fix: rename 'The Forge' to 'Autonomous Desks' to avoid internal name overlap
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 26faf13e-639c-4a21-ac05-c0dc2bff7c62
2026-07-17 13:40:11 -07:00
Jenny FerriesandCopilot 7314b49f05 fix: desk-open step numbering (two step 3s → 3,4,5)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 26faf13e-639c-4a21-ac05-c0dc2bff7c62
2026-07-17 13:38:26 -07:00
Jenny FerriesandCopilot b116228751 fix: desk-open guards against overwriting existing desk state
Never initialize over existing journal.md — if the desk directory
already exists, resume it instead. Operator must explicitly rename
or archive before reusing a desk name.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 26faf13e-639c-4a21-ac05-c0dc2bff7c62
2026-07-17 13:06:09 -07:00
Jenny FerriesandCopilot d49dd48591 fix: desk session orientation + TA signal location
- desk-open: add 'Session orientation' section explaining the
  session→journal→signals lifecycle. Desks are long-running in
  state (journal), not runtime (each session is independent).
- workshop-ta: partnership signals write to desks/_ta/.signals/
  so they appear on the dashboard without replacing any desk's
  latest signal. TA uses the _ta prefix to indicate coordinator.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 26faf13e-639c-4a21-ac05-c0dc2bff7c62
2026-07-17 13:00:06 -07:00
Jenny FerriesandCopilot 1794cd1b38 fix: desk-open includes .signals/ dir, signal-write documents subtype contract
- desk-open: standard desk structure now creates .signals/ directory
  (prevents first signal-write from failing on missing parent dir)
- signal-write: note that dashboard reads subtype field, falls back
  to signal_type for backward compat

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 26faf13e-639c-4a21-ac05-c0dc2bff7c62
2026-07-17 12:46:31 -07:00
Jenny FerriesandCopilot 0673e59169 fix: address second review — agent path, display name, signal subtype
- plugin.json: use ./agents/workshop-ta.md path format (matches all other plugins)
- workshop-ta front matter: name 'Workshop TA' preserves acronym (was 'workshop-ta')
- signal-write: add subtype field (hands-up/blocked/done/checkpoint/partnership)
  so dashboard consumers can distinguish specific signal states
- npm run build: regenerated docs/README.agents.md

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 26faf13e-639c-4a21-ac05-c0dc2bff7c62
2026-07-17 11:38:08 -07:00
Jenny FerriesandCopilot 015abd15b1 fix: address all 8 review comments
- Add YAML front matter to workshop-ta agent (name + description)
- Fix agent path: use 'workshop-ta' not './agents/workshop-ta.agent.md'
- Sort skills alphabetically in plugin.json
- Make Cairn dashboard reference conditional (full plugin from source repo)
- Update signal-write: write JSON to .signals/ AND note in journal
- Add partnership signal type to signal-write skill
- Inline CAIRN disposition in agent (treat external CAIRN.md as optional)
- Run npm run build to regenerate marketplace.json and docs

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 26faf13e-639c-4a21-ac05-c0dc2bff7c62
2026-07-17 11:32:00 -07:00
Jenny FerriesandCopilot bb838b0463 feat: add the-workshop plugin — multi-agent coordination with persistent desks
The Workshop puts long-running AI agents (desks) in the same room,
on the same work, each with its own memory and history, sharing one
workspace so you direct the work instead of relaying it.

Components:
- Workshop TA agent (room coordinator)
- Skills: desk-open, desk-journal, signal-write, bench-read
- Marketplace entry for one-command install

Install: copilot plugin install the-workshop@awesome-copilot

Complements Ember (partnership for one agent) with coordination
for many agents. Install both for the full stack.

Source: https://github.com/jennyf19/the-workshop

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 26faf13e-639c-4a21-ac05-c0dc2bff7c62
2026-07-17 11:15:29 -07:00