From a607a1f20d0622b1f556c36cca155da68109fe25 Mon Sep 17 00:00:00 2001 From: Hare Date: Mon, 22 Jun 2026 01:41:16 +0900 Subject: [PATCH 01/15] ticket: defer repository pages behind sidebar --- .../artifacts/orchestration-plan.jsonl | 1 + .yoi/tickets/00001KVNGJPRG/item.md | 2 +- .yoi/tickets/00001KVNGJPRG/thread.md | 22 +++++++++++++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 .yoi/tickets/00001KVNGJPRG/artifacts/orchestration-plan.jsonl diff --git a/.yoi/tickets/00001KVNGJPRG/artifacts/orchestration-plan.jsonl b/.yoi/tickets/00001KVNGJPRG/artifacts/orchestration-plan.jsonl new file mode 100644 index 00000000..5f2c9ee2 --- /dev/null +++ b/.yoi/tickets/00001KVNGJPRG/artifacts/orchestration-plan.jsonl @@ -0,0 +1 @@ +{"id":"orch-plan-20260621-164056-1","ticket_id":"00001KVNGJPRG","kind":"do_not_parallelize","related_ticket":"00001KVNG9B9Z","note":"Repository/objective pages and sidebar navigation both modify the Workspace SPA navigation/layout surface, especially `web/workspace/src/routes/+page.svelte` and route/component structure. Start this Ticket after `00001KVNG9B9Z` lands or after its implementation diff is known enough to route a non-conflicting continuation.","author":"yoi-orchestrator","at":"2026-06-21T16:40:56Z"} diff --git a/.yoi/tickets/00001KVNGJPRG/item.md b/.yoi/tickets/00001KVNGJPRG/item.md index 5f95d343..797bd272 100644 --- a/.yoi/tickets/00001KVNGJPRG/item.md +++ b/.yoi/tickets/00001KVNGJPRG/item.md @@ -2,7 +2,7 @@ title: 'Workspace web: repository and objective pages' state: 'queued' created_at: '2026-06-21T16:35:19Z' -updated_at: '2026-06-21T16:40:35Z' +updated_at: '2026-06-21T16:41:09Z' assignee: null queued_by: 'workspace-panel' queued_at: '2026-06-21T16:40:35Z' diff --git a/.yoi/tickets/00001KVNGJPRG/thread.md b/.yoi/tickets/00001KVNGJPRG/thread.md index 626f5957..0122decf 100644 --- a/.yoi/tickets/00001KVNGJPRG/thread.md +++ b/.yoi/tickets/00001KVNGJPRG/thread.md @@ -30,4 +30,26 @@ Marked ready by `yoi ticket state`. Ticket を `workspace-panel` が queued にしました。 +--- + + + +## Decision + +Routing decision: `wait_do_not_parallelize_with_sidebar` + +Reason: +- Ticket body is implementation-ready in isolation, but it is directly coupled to the currently active sidebar navigation work `00001KVNG9B9Z`。 +- Relations show this Ticket is related to `00001KVNG9B9Z` with note: “Sidebar navigation should link to repository and objective pages”。 +- `00001KVNG9B9Z` is already `inprogress`, has a live Coder Pod, and is expected to change `web/workspace/src/routes/+page.svelte` / sidebar component structure。 +- Starting this Ticket in parallel now would likely produce overlapping route/layout/sidebar changes and non-trivial semantic merge work, rather than independent implementation。 +- Host/Worker API work `00001KVNEKH9Q` just landed, further increasing the need to base the page/navigation work on current SPA state。 + +Decision: +- Do not create a worktree or spawn Coder for `00001KVNGJPRG` yet。 +- Leave Ticket `queued` and record an orchestration `do_not_parallelize` note with `00001KVNG9B9Z`。 +- Re-route this Ticket after sidebar work lands, or if sidebar implementation report shows a stable component boundary that makes repository/objective pages non-conflicting。 + +No implementation side effects were performed for this Ticket。 + --- From d3b8bdfddc6b9b608f1169370ad29e566c5b9d15 Mon Sep 17 00:00:00 2001 From: Hare Date: Mon, 22 Jun 2026 01:45:46 +0900 Subject: [PATCH 02/15] feat: add workspace sidebar skeleton --- .../ObjectivesNavSection.svelte | 157 ++++++++++++++ .../RepositoriesNavSection.svelte | 106 ++++++++++ .../WorkersNavSection.svelte | 198 ++++++++++++++++++ .../workspace-sidebar/WorkspaceSidebar.svelte | 124 +++++++++++ .../src/lib/workspace-sidebar/types.ts | 38 ++++ web/workspace/src/routes/+page.svelte | 170 +++++++++------ 6 files changed, 727 insertions(+), 66 deletions(-) create mode 100644 web/workspace/src/lib/workspace-sidebar/ObjectivesNavSection.svelte create mode 100644 web/workspace/src/lib/workspace-sidebar/RepositoriesNavSection.svelte create mode 100644 web/workspace/src/lib/workspace-sidebar/WorkersNavSection.svelte create mode 100644 web/workspace/src/lib/workspace-sidebar/WorkspaceSidebar.svelte create mode 100644 web/workspace/src/lib/workspace-sidebar/types.ts diff --git a/web/workspace/src/lib/workspace-sidebar/ObjectivesNavSection.svelte b/web/workspace/src/lib/workspace-sidebar/ObjectivesNavSection.svelte new file mode 100644 index 00000000..e448e99e --- /dev/null +++ b/web/workspace/src/lib/workspace-sidebar/ObjectivesNavSection.svelte @@ -0,0 +1,157 @@ + + + + + diff --git a/web/workspace/src/lib/workspace-sidebar/RepositoriesNavSection.svelte b/web/workspace/src/lib/workspace-sidebar/RepositoriesNavSection.svelte new file mode 100644 index 00000000..759e8899 --- /dev/null +++ b/web/workspace/src/lib/workspace-sidebar/RepositoriesNavSection.svelte @@ -0,0 +1,106 @@ + + + + + diff --git a/web/workspace/src/lib/workspace-sidebar/WorkersNavSection.svelte b/web/workspace/src/lib/workspace-sidebar/WorkersNavSection.svelte new file mode 100644 index 00000000..90a7f19d --- /dev/null +++ b/web/workspace/src/lib/workspace-sidebar/WorkersNavSection.svelte @@ -0,0 +1,198 @@ + + + + + diff --git a/web/workspace/src/lib/workspace-sidebar/WorkspaceSidebar.svelte b/web/workspace/src/lib/workspace-sidebar/WorkspaceSidebar.svelte new file mode 100644 index 00000000..ecc85e69 --- /dev/null +++ b/web/workspace/src/lib/workspace-sidebar/WorkspaceSidebar.svelte @@ -0,0 +1,124 @@ + + + + + diff --git a/web/workspace/src/lib/workspace-sidebar/types.ts b/web/workspace/src/lib/workspace-sidebar/types.ts new file mode 100644 index 00000000..deaaddc9 --- /dev/null +++ b/web/workspace/src/lib/workspace-sidebar/types.ts @@ -0,0 +1,38 @@ +export type WorkspaceResponse = { + workspace_id: string; + display_name: string; + record_authority: string; + extension_points: { + event_stream: { status: string; note: string }; + runner_connection: { status: string; note: string }; + }; +}; + +export type ObjectiveSummary = { + id: string; + title: string; + state: string; + updated_at?: string | null; + linked_tickets?: string[]; + record_source?: string; +}; + +export type InvalidProjectRecord = { + label: string; + reason: string; +}; + +export type ObjectiveListResponse = { + workspace_id: string; + limit: number; + items: ObjectiveSummary[]; + invalid_records: InvalidProjectRecord[]; + record_authority: string; +}; + +export type WorkerSummary = { + id: string; + label: string; + status: string; + detail?: string | null; +}; diff --git a/web/workspace/src/routes/+page.svelte b/web/workspace/src/routes/+page.svelte index d905974c..c7a60db8 100644 --- a/web/workspace/src/routes/+page.svelte +++ b/web/workspace/src/routes/+page.svelte @@ -1,13 +1,6 @@ @@ -83,156 +190,170 @@

Local / single-workspace bootstrap

Yoi Workspace Control Plane

- Static SPA shell for reading canonical .yoi project records - and the local Host / Worker execution view through bounded backend APIs. - Ticket and Objective lifecycle authority stays in the existing local record - workflow. + Static SPA shell for reading canonical .yoi project records, + bounded local Repository summaries, and the local Host / Worker execution + view. Ticket and Objective lifecycle authority stays in the existing local + record workflow. +

+ -
-

Workspace

- {#if workspace} -
-
-
ID
-
{workspace.workspace_id}
-
-
-
Name
-
{workspace.display_name}
-
-
-
Record authority
-
{workspace.record_authority}
-
-
-
Host / Worker bridge
-
{workspace.extension_points.host_worker_bridge.status}
-
-
- {:else if workspaceError} -

{workspaceError}

- {:else} -

Waiting for /api/workspace

- {/if} -
- -
-
-

Read API surface

-
    - {#each endpoints as endpoint} -
  • {endpoint.path} — {endpoint.label}
  • - {/each} -
-
- -
-

Reserved seams

-

- Event streams remain represented as extension-point state in the backend - response. Hosts and Workers are read-only local observations; no - scheduler, lifecycle control, or hosted multi-tenant behavior is - implemented in this slice. -

-
-
- -
-
-

Hosts

- {#if hosts} - {#if hosts.items.length === 0} -

No local Hosts are visible.

+ {#if route.page === 'repository'} +
+
+

Repository summary

+ {#if repository} +
+
+
ID
+
{repository.id}
+
+
+
Kind
+
{repository.kind}
+
+
+
Workspace root
+
{repository.workspace_root}
+
+
+
Record authority
+
{repository.record_authority}
+
+
+
Git
+
{repository.git.status}
+
+
+ {:else if repositoryError} +

{repositoryError}

{:else} -
- {#each hosts.items as host} -
-
- {host.label} - {host.status} -
-
-
-
ID
-
{host.host_id}
-
-
-
Kind
-
{host.kind}
-
-
-
Local inspection
-
{host.capabilities.local_pod_inspection}
-
-
-
Platform
-
{host.capabilities.os} / {host.capabilities.arch}
-
-
-
- {/each} -
+

Waiting for /api/repositories/local

{/if} - {:else if hostsError} -

{hostsError}

- {:else} -

Waiting for /api/hosts

- {/if} -
+
-
-

Workers

- {#if workers} - {#if workers.items.length === 0} -

No local Workers are visible.

+
+

Git summary

+ {#if repository} + {#if repository.git.status === 'available'} +
+
+
Root
+
{repository.git.root ?? 'unknown'}
+
+
+
Branch
+
{repository.git.branch ?? 'unknown'}
+
+
+
HEAD
+
{shortHash(repository.git.head)}
+
+
+
Dirty
+
{repository.git.dirty === null || repository.git.dirty === undefined ? 'unknown' : repository.git.dirty ? 'yes' : 'no'} {repository.git.dirty_scope}
+
+
+
Remote
+
+ {#if repository.git.remote} + {repository.git.remote.name} · {repository.git.remote.url} + {#if repository.git.remote.redacted}credentials redacted{/if} + {:else} + not configured + {/if} +
+
+
+ {:else} +

Git metadata is unavailable for this local Repository.

+ {/if} + {:else if repositoryError} +

{repositoryError}

+ {:else} +

Waiting for Git summary…

+ {/if} +
+
+ +
+

Recent Git log

+ {#if repositoryLog} + {#if repositoryLog.items.length === 0} +

No recent commits are available from the bounded Git log API.

{:else}
- - - - - + + + + - {#each workers.items as worker} + {#each repositoryLog.items as commit (commit.hash)} - - - - - + + + + {/each}
WorkerHostStateWorkspaceImplementationCommitSubjectAuthorTimestamp
- {worker.label} - {#if worker.role || worker.profile} - {worker.role ?? 'role unknown'} / {worker.profile ?? 'profile unknown'} - {/if} - {worker.host_id}{worker.state} · {worker.status}{worker.workspace_root ?? 'unknown'}{worker.implementation.kind}{shortHash(commit.hash)}{commit.subject}{commit.author_name} {commit.author_email}{commit.timestamp}
{/if} - {:else if workersError} -

{workersError}

+ {:else if repositoryLogError} +

{repositoryLogError}

{:else} -

Waiting for /api/workers

+

Waiting for /api/repositories/local/log

{/if} - -
+ - {#if hosts || workers} - {@const diagnostics = diagnosticsFor(hosts?.diagnostics, workers?.diagnostics)} - {#if diagnostics.length > 0} +
+

Repository Ticket Kanban

+

+ Read-only grouping of canonical Ticket records. No drag/drop or lifecycle mutation is exposed. +

+ {#if repositoryTickets} +
+ {#each repositoryTickets.columns as column (column.state)} +
+

{column.state} {column.items.length}

+ {#if column.items.length === 0} +

No tickets.

+ {:else} +
    + {#each column.items as ticket (ticket.id)} +
  • + {ticket.title} + {ticket.id} · updated {formatDate(ticket.updated_at)} +
  • + {/each} +
+ {/if} +
+ {/each} +
+ {:else if repositoryTicketsError} +

{repositoryTicketsError}

+ {:else} +

Waiting for /api/repositories/local/tickets

+ {/if} +
+ + {@const repositoryDiagnostics = diagnosticsFor(repository?.git.diagnostics, repositoryLog?.diagnostics, repositoryTickets?.diagnostics)} + {#if repositoryDiagnostics.length > 0}
-

Diagnostics

+

Repository diagnostics

    - {#each diagnostics as diagnostic} + {#each repositoryDiagnostics as diagnostic}
  • {diagnostic.severity} {diagnostic.code} @@ -242,6 +363,216 @@
{/if} + {:else if route.page === 'objectives'} +
+

Objectives

+

+ Objectives are read from canonical filesystem records through /api/objectives. +

+ {#if objectives} + {#if objectives.items.length === 0} +

No Objective records are present.

+ {:else} +
+ {#each objectives.items as objective (objective.id)} +
+
+ {objective.title} + {objective.state} +
+

{objective.summary || 'No summary text is available.'}

+
+
+
ID
+
{objective.id}
+
+
+
Updated
+
{formatDate(objective.updated_at)}
+
+
+
Linked tickets
+
{objective.linked_tickets?.length ? objective.linked_tickets.join(', ') : 'none'}
+
+
+

Detail placeholder

+
+ {/each} +
+ {/if} + {#if objectives.invalid_records.length > 0} +

{objectives.invalid_records.length} invalid objective record(s) hidden.

+ {/if} + {:else if objectivesError} +

{objectivesError}

+ {:else} +

Waiting for /api/objectives

+ {/if} +
+ + {#if route.objectiveId} +
+

Objective detail

+

+ Selected Objective {route.objectiveId}. This slice keeps detail navigation as a + static SPA placeholder; canonical Objective content remains in the filesystem record. +

+
+ {/if} + {:else} +
+

Workspace

+ {#if workspace} +
+
+
ID
+
{workspace.workspace_id}
+
+
+
Name
+
{workspace.display_name}
+
+
+
Record authority
+
{workspace.record_authority}
+
+
+
Host / Worker bridge
+
{workspace.extension_points.host_worker_bridge.status}
+
+
+ {:else if workspaceError} +

{workspaceError}

+ {:else} +

Waiting for /api/workspace

+ {/if} +
+ +
+
+

Read API surface

+
    + {#each endpoints as endpoint} +
  • {endpoint.path} — {endpoint.label}
  • + {/each} +
+
+ +
+

Reserved seams

+

+ Event streams remain represented as extension-point state in the backend + response. Hosts and Workers are read-only local observations; no + scheduler, lifecycle control, or hosted multi-tenant behavior is + implemented in this slice. +

+
+
+ +
+
+

Hosts

+ {#if hosts} + {#if hosts.items.length === 0} +

No local Hosts are visible.

+ {:else} +
+ {#each hosts.items as host} +
+
+ {host.label} + {host.status} +
+
+
+
ID
+
{host.host_id}
+
+
+
Kind
+
{host.kind}
+
+
+
Local inspection
+
{host.capabilities.local_pod_inspection}
+
+
+
Platform
+
{host.capabilities.os} / {host.capabilities.arch}
+
+
+
+ {/each} +
+ {/if} + {:else if hostsError} +

{hostsError}

+ {:else} +

Waiting for /api/hosts

+ {/if} +
+ +
+

Workers

+ {#if workers} + {#if workers.items.length === 0} +

No local Workers are visible.

+ {:else} +
+ + + + + + + + + + + + {#each workers.items as worker} + + + + + + + + {/each} + +
WorkerHostStateWorkspaceImplementation
+ {worker.label} + {#if worker.role || worker.profile} + {worker.role ?? 'role unknown'} / {worker.profile ?? 'profile unknown'} + {/if} + {worker.host_id}{worker.state} · {worker.status}{worker.workspace_root ?? 'unknown'}{worker.implementation.kind}
+
+ {/if} + {:else if workersError} +

{workersError}

+ {:else} +

Waiting for /api/workers

+ {/if} +
+
+ + {#if hosts || workers} + {@const diagnostics = diagnosticsFor(hosts?.diagnostics, workers?.diagnostics)} + {#if diagnostics.length > 0} +
+

Diagnostics

+
    + {#each diagnostics as diagnostic} +
  • + {diagnostic.severity} + {diagnostic.code} + {diagnostic.message} +
  • + {/each} +
+
+ {/if} + {/if} {/if} @@ -283,6 +614,24 @@ max-width: 68ch; } + .page-links { + display: flex; + flex-wrap: wrap; + gap: 10px; + } + + .page-links a, + .card a { + color: #7dd3fc; + } + + .page-links a { + border: 1px solid rgba(125, 211, 252, 0.28); + border-radius: 999px; + padding: 6px 12px; + text-decoration: none; + } + .eyebrow { color: #38bdf8; font-weight: 700; @@ -297,7 +646,8 @@ overflow-wrap: anywhere; } - h2 { + h2, + h3 { margin-top: 0; } @@ -331,18 +681,29 @@ min-width: 0; } + .section-note, + .muted { + color: #94a3b8; + } + .stack { display: grid; gap: 12px; } - .runtime-card { + .runtime-card, + .kanban-column { border: 1px solid rgba(148, 163, 184, 0.18); border-radius: 16px; padding: 16px; background: rgba(15, 23, 42, 0.55); } + .selected-card.selected { + border-color: rgba(56, 189, 248, 0.5); + background: rgba(14, 165, 233, 0.1); + } + .runtime-heading { display: flex; justify-content: space-between; @@ -403,6 +764,36 @@ margin-top: 4px; } + .kanban { + display: grid; + gap: 14px; + grid-template-columns: repeat(auto-fit, minmax(min(190px, 100%), 1fr)); + margin-top: 16px; + } + + .kanban-column h3 { + display: flex; + justify-content: space-between; + gap: 10px; + color: #cbd5e1; + font-size: 0.95rem; + text-transform: uppercase; + } + + .kanban-column ul { + display: grid; + gap: 10px; + margin: 0; + padding: 0; + list-style: none; + } + + .kanban-column li { + border-radius: 12px; + background: rgba(30, 41, 59, 0.72); + padding: 10px; + } + .diagnostics { margin-top: 16px; } @@ -413,6 +804,10 @@ margin-bottom: 12px; } + .detail-placeholder { + border-style: dashed; + } + .error { color: #fca5a5; } From 2c766751107f3458f791c5a10f64295241ce0114 Mon Sep 17 00:00:00 2001 From: Hare Date: Mon, 22 Jun 2026 02:23:23 +0900 Subject: [PATCH 11/15] ticket: record repository objective implementation --- .yoi/tickets/00001KVNGJPRG/item.md | 2 +- .yoi/tickets/00001KVNGJPRG/thread.md | 55 ++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/.yoi/tickets/00001KVNGJPRG/item.md b/.yoi/tickets/00001KVNGJPRG/item.md index bc77f30d..97b833e9 100644 --- a/.yoi/tickets/00001KVNGJPRG/item.md +++ b/.yoi/tickets/00001KVNGJPRG/item.md @@ -2,7 +2,7 @@ title: 'Workspace web: repository and objective pages' state: 'inprogress' created_at: '2026-06-21T16:35:19Z' -updated_at: '2026-06-21T17:03:39Z' +updated_at: '2026-06-21T17:23:16Z' assignee: null queued_by: 'workspace-panel' queued_at: '2026-06-21T16:40:35Z' diff --git a/.yoi/tickets/00001KVNGJPRG/thread.md b/.yoi/tickets/00001KVNGJPRG/thread.md index bae0ec1c..3ba7f440 100644 --- a/.yoi/tickets/00001KVNGJPRG/thread.md +++ b/.yoi/tickets/00001KVNGJPRG/thread.md @@ -150,3 +150,58 @@ Next action: - Wait for Coder implementation report, then spawn Reviewer read-only for the implementation diff。 --- + + + +## Implementation report + +Coder implementation report received from `yoi-coder-00001KVNGJPRG`. + +Implementation commit: +- `ceb1ee3b feat: add repository objective pages` + +Changed areas: +- Backend repository read APIs: + - Added `crates/workspace-server/src/repositories.rs`。 + - Added bounded local repository/Git summary and log reader。 + - Added endpoints: + - `/api/repositories` + - `/api/repositories/local` + - `/api/repositories/local/log` + - `/api/repositories/local/tickets` + - Added read-only Ticket Kanban grouping by Ticket state with workspace-local fallback diagnostic。 + - Added Objective list summaries from existing filesystem Objective records。 +- Frontend Workspace SPA: + - Added hash-navigation pages for Repository and Objectives。 + - Wired sidebar Repository/Objectives links to the new pages。 + - Added Repository summary, Git summary/log, diagnostics, and read-only Ticket Kanban UI。 + - Added Objective list with title/state/updated_at/summary and detail placeholder links。 +- Tests: + - Extended workspace-server API tests for repository endpoints and Objective summary。 + - Added Git URL sanitization/log parsing unit tests。 + +Coder validation reported: +- `cargo fmt --all`: passed +- `cargo fmt --check`: passed +- `cargo test -p yoi-workspace-server`: passed +- `cargo check -p yoi-workspace-server`: passed +- `cd web/workspace && deno task check`: passed +- `cd web/workspace && deno task build`: passed +- `git diff --check`: passed +- `cargo run -p yoi -- ticket doctor`: passed +- `nix build .#yoi --no-link`: passed after staging newly added `repositories.rs` so Git-backed flake source filtering included it。 + +Generated artifact cleanup: +- Coder removed `web/workspace/build` and `web/workspace/.svelte-kit`。 +- Orchestrator additionally removed ignored `web/workspace/node_modules/` before Reviewer routing。 + +Orchestrator evidence checked: +- Worktree clean on `impl/00001KVNGJPRG-repository-objective-pages` at `ceb1ee3b`。 +- Diff `0f7e78c1..HEAD` touches 8 expected backend/frontend files, about 1228 insertions / 142 deletions。 +- `git diff --check 0f7e78c1..HEAD`: passed。 +- No generated frontend artifacts remain in child worktree status。 + +Next action: +- Route to read-only Reviewer Pod for acceptance review。 + +--- From 076c504640d59677e1fe041b0c4e9df4871d4d8c Mon Sep 17 00:00:00 2001 From: Hare Date: Mon, 22 Jun 2026 02:24:06 +0900 Subject: [PATCH 12/15] ticket: start repository objective review --- .yoi/tickets/00001KVNGJPRG/item.md | 2 +- .yoi/tickets/00001KVNGJPRG/thread.md | 33 ++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/.yoi/tickets/00001KVNGJPRG/item.md b/.yoi/tickets/00001KVNGJPRG/item.md index 97b833e9..c333dc48 100644 --- a/.yoi/tickets/00001KVNGJPRG/item.md +++ b/.yoi/tickets/00001KVNGJPRG/item.md @@ -2,7 +2,7 @@ title: 'Workspace web: repository and objective pages' state: 'inprogress' created_at: '2026-06-21T16:35:19Z' -updated_at: '2026-06-21T17:23:16Z' +updated_at: '2026-06-21T17:23:58Z' assignee: null queued_by: 'workspace-panel' queued_at: '2026-06-21T16:40:35Z' diff --git a/.yoi/tickets/00001KVNGJPRG/thread.md b/.yoi/tickets/00001KVNGJPRG/thread.md index 3ba7f440..5ed27f8e 100644 --- a/.yoi/tickets/00001KVNGJPRG/thread.md +++ b/.yoi/tickets/00001KVNGJPRG/thread.md @@ -205,3 +205,36 @@ Next action: - Route to read-only Reviewer Pod for acceptance review。 --- + + + +## Comment + +Review routing: + +Spawned read-only Reviewer Pod: +- `yoi-reviewer-00001KVNGJPRG-r1` + +Review target: +- Worktree: `/home/hare/Projects/yoi/.worktree/00001KVNGJPRG-repository-objective-pages` +- Branch: `impl/00001KVNGJPRG-repository-objective-pages` +- Baseline: `0f7e78c1` +- Implementation commit: `ceb1ee3b feat: add repository objective pages` +- Diff: `0f7e78c1..ceb1ee3b` + +Reviewer scope: +- read-only `/home/hare/Projects/yoi` + +Reviewer focus: +- Read-only bounded Repository APIs and Git summaries。 +- No diffs/file contents/blame/secret-like config exposure。 +- Sanitized remote URL summary。 +- Non-Git degradation。 +- Read-only Ticket Kanban grouped by state。 +- Objective list uses filesystem read-through records。 +- Static SPA navigation/pages and section-local error handling。 +- Generated artifact / Nix source filtering hygiene。 + +Orchestrator will wait for reviewer verdict before integration。 + +--- From 680b2a4160bfd75ca56a72f661e7f87b14fde7de Mon Sep 17 00:00:00 2001 From: Hare Date: Mon, 22 Jun 2026 02:30:17 +0900 Subject: [PATCH 13/15] ticket: approve repository objective pages --- .yoi/tickets/00001KVNGJPRG/item.md | 2 +- .yoi/tickets/00001KVNGJPRG/thread.md | 66 ++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+), 1 deletion(-) diff --git a/.yoi/tickets/00001KVNGJPRG/item.md b/.yoi/tickets/00001KVNGJPRG/item.md index c333dc48..2b1b2963 100644 --- a/.yoi/tickets/00001KVNGJPRG/item.md +++ b/.yoi/tickets/00001KVNGJPRG/item.md @@ -2,7 +2,7 @@ title: 'Workspace web: repository and objective pages' state: 'inprogress' created_at: '2026-06-21T16:35:19Z' -updated_at: '2026-06-21T17:23:58Z' +updated_at: '2026-06-21T17:30:09Z' assignee: null queued_by: 'workspace-panel' queued_at: '2026-06-21T16:40:35Z' diff --git a/.yoi/tickets/00001KVNGJPRG/thread.md b/.yoi/tickets/00001KVNGJPRG/thread.md index 5ed27f8e..e7540269 100644 --- a/.yoi/tickets/00001KVNGJPRG/thread.md +++ b/.yoi/tickets/00001KVNGJPRG/thread.md @@ -238,3 +238,69 @@ Reviewer focus: Orchestrator will wait for reviewer verdict before integration。 --- + + + +## Review: approve + +Verdict: `approve` + +確認範囲: +- Ticket authority: + - `.yoi/tickets/00001KVNGJPRG/item.md` + - `.yoi/tickets/00001KVNGJPRG/thread.md` +- Diff `0f7e78c1..ceb1ee3b`: + - `crates/workspace-server/src/lib.rs` + - `crates/workspace-server/src/records.rs` + - `crates/workspace-server/src/repositories.rs` + - `crates/workspace-server/src/server.rs` + - `web/workspace/src/lib/workspace-sidebar/ObjectivesNavSection.svelte` + - `web/workspace/src/lib/workspace-sidebar/RepositoriesNavSection.svelte` + - `web/workspace/src/lib/workspace-sidebar/types.ts` + - `web/workspace/src/routes/+page.svelte` + +Blocking issues: +- None found。 + +Acceptance verification: +- Repository APIs are read-only `GET` routes only。 +- Git commands use fixed argument vectors through `Command::new("git").arg("-C").arg(workspace_root).args(args)`; no shell interpolation。 +- Git summary/log is bounded: + - log limit clamps to `1..=50` + - command output capped at `4096` + - fields capped at `240`, hash at `40` + - no diff/patch/file content/blame/config commands are used。 +- Remote URL summary strips URL-scheme userinfo and marks `redacted`。 +- Non-Git workspaces return `git.status = "unavailable"` plus diagnostics rather than failing the Repository page model。 +- Ticket Kanban reads filesystem Ticket summaries and groups by state; no Ticket mutation route/UI was added。 +- Objective list continues to use filesystem read-through `/api/objectives`; no Objective mutation/API authority added。 +- Frontend remains static SPA/hash navigation; no SSR/business authority introduced。 +- Nix build succeeds with the new Rust source file。 + +Non-blocking concerns: +- `ObjectivesNavSection.svelte` only shows the “All objectives” sidebar link when objectives are successfully loaded and non-empty. In an empty/error state, the page is still reachable from hero links, but the sidebar itself does not provide a stable top-level Objectives link. Consider keeping `#/objectives` visible in all non-loading states in a follow-up。 +- Remote sanitization removes URL-scheme userinfo, but does not attempt query-param or SCP-like token redaction. Acceptable for the initial bounded summary, but worth tightening if remote URLs may include local secret-bearing config。 + +Reviewer validation: +- `cargo fmt --check`: passed +- `git diff --check 0f7e78c1..HEAD`: passed +- `cargo test -p yoi-workspace-server`: passed (`8 passed`) +- `cargo check -p yoi-workspace-server`: passed +- `cd web/workspace && deno task check`: passed (`svelte-check found 0 errors and 0 warnings`) +- `cd web/workspace && deno task build`: passed +- `cargo run -p yoi -- ticket doctor`: passed (`doctor: ok`) +- `nix build .#yoi --no-link`: passed + +Generated artifacts: +- Reviewer did not clean generated ignored artifacts after validation。 +- Ignored generated artifacts present: + - `target/` + - `web/workspace/.svelte-kit/` + - `web/workspace/build/` + - `web/workspace/node_modules/` +- No untracked non-ignored files。 + +Worktree status: +- Clean tracked/non-ignored state on `impl/00001KVNGJPRG-repository-objective-pages` at `ceb1ee3b`。 + +--- From 4b1f1e593dbe246c2291fba3253dc8b34b9b3238 Mon Sep 17 00:00:00 2001 From: Hare Date: Mon, 22 Jun 2026 02:31:21 +0900 Subject: [PATCH 14/15] ticket: complete repository objective pages --- .yoi/tickets/00001KVNGJPRG/item.md | 4 +- .yoi/tickets/00001KVNGJPRG/resolution.md | 30 +++++++++ .yoi/tickets/00001KVNGJPRG/thread.md | 85 ++++++++++++++++++++++++ 3 files changed, 117 insertions(+), 2 deletions(-) create mode 100644 .yoi/tickets/00001KVNGJPRG/resolution.md diff --git a/.yoi/tickets/00001KVNGJPRG/item.md b/.yoi/tickets/00001KVNGJPRG/item.md index 2b1b2963..f98ec857 100644 --- a/.yoi/tickets/00001KVNGJPRG/item.md +++ b/.yoi/tickets/00001KVNGJPRG/item.md @@ -1,8 +1,8 @@ --- title: 'Workspace web: repository and objective pages' -state: 'inprogress' +state: 'closed' created_at: '2026-06-21T16:35:19Z' -updated_at: '2026-06-21T17:30:09Z' +updated_at: '2026-06-21T17:31:14Z' assignee: null queued_by: 'workspace-panel' queued_at: '2026-06-21T16:40:35Z' diff --git a/.yoi/tickets/00001KVNGJPRG/resolution.md b/.yoi/tickets/00001KVNGJPRG/resolution.md new file mode 100644 index 00000000..fa57085a --- /dev/null +++ b/.yoi/tickets/00001KVNGJPRG/resolution.md @@ -0,0 +1,30 @@ +Workspace web に Repository / Objective pages を追加し、Orchestrator worktree の `orchestration` branch に統合した。 + +主な成果: +- Read-only Repository backend APIs を追加: + - `/api/repositories` + - `/api/repositories/local` + - `/api/repositories/local/log` + - `/api/repositories/local/tickets` +- Current workspace root を local Repository として扱う bounded repository summary を追加。 +- Git repository では bounded branch/head/root/dirty/remote/recent log summary を返す。 +- Non-Git workspace では `git.status = unavailable` と bounded diagnostics に degrade。 +- Git log summary は recent commit hash/subject/author/timestamp に限定し、diff/patch/file content/blame/config は読まない。 +- Remote URL summary は URL-scheme userinfo を redact。 +- Read-only Ticket Kanban を Ticket state ごとに grouping し、workspace-local Ticket fallback diagnostic を含めた。 +- Objective list summaries を filesystem Objective records から追加。 +- Static SPA に hash-navigation Repository / Objectives pages を追加。 +- Sidebar Repository/Objectives links を新 pages に接続。 +- Repository page に summary, Git summary/log, diagnostics, read-only Ticket Kanban を表示。 +- Objective page に title/state/updated_at/summary と detail placeholder links を表示。 +- Ticket / Objective canonical authority remains filesystem read-through records; mutation API / DB canonical migration は追加していない。 + +統合・検証: +- Merge commit: `7ee702b1 merge: repository objective pages` +- Implementation commit: `ceb1ee3b feat: add repository objective pages` +- Reviewer final verdict: approve +- Validation passed: `cargo fmt --check`, `git diff --check HEAD^1..HEAD`, `cargo test -p yoi-workspace-server`, `cargo check -p yoi-workspace-server`, `deno task check`, `deno task build`, `cargo run -p yoi -- ticket doctor`, and `nix build .#yoi --no-link`。 + +範囲外 / follow-up notes: +- Repository CRUD/API, Objective edit/detail mutation, full Git browser/diff/file views, drag/drop Kanban, and write APIs were not implemented。 +- Reviewer noted possible follow-ups: keep `#/objectives` sidebar link visible even on objective empty/error states, and further tighten remote URL sanitization for query-param or SCP-like token forms if needed。 \ No newline at end of file diff --git a/.yoi/tickets/00001KVNGJPRG/thread.md b/.yoi/tickets/00001KVNGJPRG/thread.md index e7540269..c0df1b57 100644 --- a/.yoi/tickets/00001KVNGJPRG/thread.md +++ b/.yoi/tickets/00001KVNGJPRG/thread.md @@ -304,3 +304,88 @@ Worktree status: - Clean tracked/non-ignored state on `impl/00001KVNGJPRG-repository-objective-pages` at `ceb1ee3b`。 --- + + + +## Implementation report + +Reviewer r1 approvalを受けて、実装ブランチを Orchestrator worktree の `orchestration` branch に統合した。 + +統合: +- Merge commit: `7ee702b1 merge: repository objective pages` +- Merged branch: `impl/00001KVNGJPRG-repository-objective-pages` +- Implementation commit: + - `ceb1ee3b feat: add repository objective pages` + +Orchestrator worktree validation: +- `cargo fmt --check`: passed +- `git diff --check HEAD^1..HEAD`: passed +- `cargo test -p yoi-workspace-server`: passed (`8 passed`) +- `cargo check -p yoi-workspace-server`: passed +- `cd web/workspace && rm -rf node_modules .svelte-kit build && deno task check`: passed (`svelte-check found 0 errors and 0 warnings`) +- `cd web/workspace && deno task build`: passed +- `cargo run -p yoi -- ticket doctor`: passed (`doctor: ok`) +- `nix build .#yoi --no-link`: passed + +Validation generated ignored frontend artifacts in Orchestrator worktree: +- `web/workspace/node_modules/` +- `web/workspace/.svelte-kit/` +- `web/workspace/build/` + +These were removed after validation. Final Orchestrator worktree status after validation cleanup is clean on `orchestration` at `7ee702b1`。 + +--- + + + +## State changed + +Reviewer approval、Orchestrator worktree への統合、workspace-server tests/check、Deno check/build、Ticket doctor、Nix build が完了したため `done` に遷移する。 + +--- + + + +## State changed + +Ticket を closed にしました。 + + +--- + + + +## 完了 + +Workspace web に Repository / Objective pages を追加し、Orchestrator worktree の `orchestration` branch に統合した。 + +主な成果: +- Read-only Repository backend APIs を追加: + - `/api/repositories` + - `/api/repositories/local` + - `/api/repositories/local/log` + - `/api/repositories/local/tickets` +- Current workspace root を local Repository として扱う bounded repository summary を追加。 +- Git repository では bounded branch/head/root/dirty/remote/recent log summary を返す。 +- Non-Git workspace では `git.status = unavailable` と bounded diagnostics に degrade。 +- Git log summary は recent commit hash/subject/author/timestamp に限定し、diff/patch/file content/blame/config は読まない。 +- Remote URL summary は URL-scheme userinfo を redact。 +- Read-only Ticket Kanban を Ticket state ごとに grouping し、workspace-local Ticket fallback diagnostic を含めた。 +- Objective list summaries を filesystem Objective records から追加。 +- Static SPA に hash-navigation Repository / Objectives pages を追加。 +- Sidebar Repository/Objectives links を新 pages に接続。 +- Repository page に summary, Git summary/log, diagnostics, read-only Ticket Kanban を表示。 +- Objective page に title/state/updated_at/summary と detail placeholder links を表示。 +- Ticket / Objective canonical authority remains filesystem read-through records; mutation API / DB canonical migration は追加していない。 + +統合・検証: +- Merge commit: `7ee702b1 merge: repository objective pages` +- Implementation commit: `ceb1ee3b feat: add repository objective pages` +- Reviewer final verdict: approve +- Validation passed: `cargo fmt --check`, `git diff --check HEAD^1..HEAD`, `cargo test -p yoi-workspace-server`, `cargo check -p yoi-workspace-server`, `deno task check`, `deno task build`, `cargo run -p yoi -- ticket doctor`, and `nix build .#yoi --no-link`。 + +範囲外 / follow-up notes: +- Repository CRUD/API, Objective edit/detail mutation, full Git browser/diff/file views, drag/drop Kanban, and write APIs were not implemented。 +- Reviewer noted possible follow-ups: keep `#/objectives` sidebar link visible even on objective empty/error states, and further tighten remote URL sanitization for query-param or SCP-like token forms if needed。 + +--- From b7c890d3f680867b3d580bd45e82a74dd1ff9d93 Mon Sep 17 00:00:00 2001 From: Hare Date: Mon, 22 Jun 2026 02:31:56 +0900 Subject: [PATCH 15/15] ticket: record repository objective cleanup --- .yoi/tickets/00001KVNGJPRG/item.md | 2 +- .yoi/tickets/00001KVNGJPRG/thread.md | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/.yoi/tickets/00001KVNGJPRG/item.md b/.yoi/tickets/00001KVNGJPRG/item.md index f98ec857..1cd7f9ec 100644 --- a/.yoi/tickets/00001KVNGJPRG/item.md +++ b/.yoi/tickets/00001KVNGJPRG/item.md @@ -2,7 +2,7 @@ title: 'Workspace web: repository and objective pages' state: 'closed' created_at: '2026-06-21T16:35:19Z' -updated_at: '2026-06-21T17:31:14Z' +updated_at: '2026-06-21T17:31:43Z' assignee: null queued_by: 'workspace-panel' queued_at: '2026-06-21T16:40:35Z' diff --git a/.yoi/tickets/00001KVNGJPRG/thread.md b/.yoi/tickets/00001KVNGJPRG/thread.md index c0df1b57..71349bb6 100644 --- a/.yoi/tickets/00001KVNGJPRG/thread.md +++ b/.yoi/tickets/00001KVNGJPRG/thread.md @@ -389,3 +389,26 @@ Workspace web に Repository / Objective pages を追加し、Orchestrator workt - Reviewer noted possible follow-ups: keep `#/objectives` sidebar link visible even on objective empty/error states, and further tighten remote URL sanitization for query-param or SCP-like token forms if needed。 --- + + + +## Implementation report + +Post-close cleanup completed。 + +- Stopped child Pods and reclaimed scope: + - `yoi-coder-00001KVNGJPRG` + - `yoi-reviewer-00001KVNGJPRG-r1` +- Removed ignored frontend validation artifacts from child worktree before worktree removal: + - `web/workspace/node_modules/` + - `web/workspace/.svelte-kit/` + - `web/workspace/build/` +- Removed implementation worktree: + - `/home/hare/Projects/yoi/.worktree/00001KVNGJPRG-repository-objective-pages` +- Deleted implementation branch: + - `impl/00001KVNGJPRG-repository-objective-pages` +- Orchestrator worktree remains clean on `orchestration` at `4b1f1e59`。 + +Root/original workspace was not used for merge/validation/cleanup operations。 + +---