feat: add repository objective pages

This commit is contained in:
2026-06-22 02:21:51 +09:00
parent 0f7e78c164
commit ceb1ee3b56
8 changed files with 1227 additions and 141 deletions
@@ -56,10 +56,18 @@
<p class="section-state">No objectives found.</p>
{:else}
<ul class="nav-list" aria-label="Objectives">
<li>
<a class="nav-item active" href="#/objectives">
<span class="item-title">All objectives</span>
<span class="item-meta">read-only list</span>
</a>
</li>
{#each objectives as objective (objective.id)}
<li class="nav-item">
<span class="item-title">{objective.title}</span>
<span class="item-meta">{objective.state}</span>
<li>
<a class="nav-item" href={`#/objectives/${objective.id}`}>
<span class="item-title">{objective.title}</span>
<span class="item-meta">{objective.state}</span>
</a>
</li>
{/each}
</ul>
@@ -117,6 +125,8 @@
background: rgba(15, 23, 42, 0.64);
padding: 10px 12px;
min-width: 0;
color: inherit;
text-decoration: none;
}
.item-title,
@@ -15,15 +15,16 @@
</div>
<ul class="nav-list" aria-label="Repositories">
<li class="nav-item active">
<span class="item-title">{workspace?.display_name ?? 'local workspace'}</span>
<span class="item-meta">local project records</span>
<li>
<a class="nav-item active" href="#/repositories/local">
<span class="item-title">{workspace?.display_name ?? 'local workspace'}</span>
<span class="item-meta">local repository · read-only</span>
</a>
</li>
</ul>
<p class="section-note">
Repository API is not wired yet; this placeholder keeps the navigation seam
ready without adding repository authority.
Repository authority remains the current workspace root and canonical project records.
</p>
</section>
@@ -74,6 +75,8 @@
background: rgba(15, 23, 42, 0.64);
padding: 10px 12px;
min-width: 0;
color: inherit;
text-decoration: none;
}
.nav-item.active {
@@ -59,11 +59,87 @@ export type ListResponse<T> = {
diagnostics: Diagnostic[];
};
export type RepositorySummary = {
id: string;
display_name: string;
kind: string;
workspace_root: string;
record_authority: string;
git: GitRepositorySummary;
};
export type GitRepositorySummary = {
status: string;
root?: string | null;
branch?: string | null;
head?: string | null;
dirty?: boolean | null;
dirty_scope: string;
remote?: GitRemoteSummary | null;
diagnostics: Diagnostic[];
};
export type GitRemoteSummary = {
name: string;
url: string;
redacted: boolean;
};
export type GitCommitSummary = {
hash: string;
subject: string;
author_name: string;
author_email: string;
timestamp: string;
};
export type RepositoryDetailResponse = {
workspace_id: string;
item: RepositorySummary;
source: string;
};
export type RepositoryLogResponse = {
workspace_id: string;
repository_id: string;
limit: number;
items: GitCommitSummary[];
diagnostics: Diagnostic[];
};
export type TicketSummary = {
id: string;
title: string;
state: string;
priority?: string | null;
updated_at?: string | null;
queued_by?: string | null;
queued_at?: string | null;
record_source?: string;
};
export type TicketKanbanColumn = {
state: string;
items: TicketSummary[];
};
export type RepositoryTicketsResponse = {
workspace_id: string;
repository_id: string;
limit: number;
columns: TicketKanbanColumn[];
invalid_records: InvalidProjectRecord[];
record_authority: string;
source: string;
diagnostics: Diagnostic[];
};
export type ObjectiveSummary = {
id: string;
title: string;
state: string;
updated_at?: string | null;
summary: string;
linked_tickets?: string[];
record_source?: string;
};