diff --git a/AGENTS.md b/AGENTS.md index df7a4af..0325836 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -12,6 +12,21 @@ bd close # Complete work bd sync # Sync with git ``` +## Commit Convention — Bead References + +**When a commit implements, fixes, or closes a bead, include the bead ID(s) in the commit message.** This creates traceability between git history and issue tracking. + +Format: ` []` or ` [, ]` + +``` +Add accelerator packages panel [cgm-2v9] +Fix switch lock stale errors [cgm-abc] +``` + +- Place bead ID(s) at the end of the first line in square brackets +- Use this for commits that directly address bead work — skip for unrelated housekeeping commits +- If a commit fully resolves a bead, also close it with `bd close` + ## Landing the Plane (Session Completion) **When ending a work session**, you MUST complete ALL steps below. Work is NOT complete until `git push` succeeds. diff --git a/CLAUDE.md b/CLAUDE.md index a50ae10..d0bbd32 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -84,6 +84,32 @@ We are still pre-customer - any unnecessary fallbacks, unnecessary versioning, t Simple, elegant, maintainable code is the goal. We DONT want any legacy or backwards compatible code. +## Issue Tracking (Beads) + +Uses beads (`bd`) with prefix **`cgm-`**. Use for multi-session or dependent work; skip for simple single-session fixes. + +```bash +bd ready # Find available work +bd show cgm-xxx # View issue details +bd close cgm-xxx # Complete work +bd sync # Sync with git +``` + +### Commit Convention — Bead References + +**When a commit implements, fixes, or closes a bead, include the bead ID(s) in the commit message.** This creates traceability between git history and issue tracking. + +Format: ` []` or ` [, ]` + +``` +Add accelerator packages panel [cgm-2v9] +Fix switch lock stale errors [cgm-abc] +``` + +- Place bead ID(s) at the end of the first line in square brackets +- Use this for commits that directly address bead work — skip for unrelated housekeeping commits +- If a commit fully resolves a bead, also close it with `bd close` + ## Cross-Platform Compatibility This codebase must run on **Windows, Linux, and macOS**. All engineering choices should consider cross-platform compatibility: - Use `pathlib.Path` instead of string concatenation for file paths diff --git a/frontend/src/components/MissingResourcesDetailModal.vue b/frontend/src/components/MissingResourcesDetailModal.vue index 450e8c6..c2f9ab1 100644 --- a/frontend/src/components/MissingResourcesDetailModal.vue +++ b/frontend/src/components/MissingResourcesDetailModal.vue @@ -29,9 +29,17 @@ Failed ⚠ Installed Queued - - {{ actionLabel }} - +
+ + {{ action.label }} + +
@@ -51,18 +59,25 @@ import { computed } from 'vue' import BaseModal from './base/BaseModal.vue' import BaseButton from './base/BaseButton.vue' +export interface ResourceAction { + key: string + label: string + variant?: 'primary' | 'secondary' | 'ghost' +} + export interface ResourceItem { id: string name: string subtitle?: string canAction: boolean actionDisabledReason?: string + actions?: ResourceAction[] } const props = defineProps<{ title: string items: ResourceItem[] - itemType: 'model' | 'package' + itemType: 'models' | 'packages' | 'community' queuedItems: Set installedItems?: Set failedItems?: Map @@ -71,12 +86,10 @@ const props = defineProps<{ const emit = defineEmits<{ close: [] - action: [item: ResourceItem] + action: [item: ResourceItem, actionKey?: string] 'bulk-action': [] }>() -const actionLabel = computed(() => props.itemType === 'model' ? 'Download' : 'Install') - const actionableItems = computed(() => props.items.filter(i => i.canAction)) const allDone = computed(() => { @@ -90,7 +103,7 @@ const allDone = computed(() => { const bulkActionLabel = computed(() => { if (allDone.value) return 'All Queued' - return props.itemType === 'model' ? 'Download All' : 'Install All' + return props.itemType === 'models' ? 'Download All' : 'Install All' }) function isQueued(item: ResourceItem): boolean { @@ -112,6 +125,18 @@ function isFailed(item: ResourceItem): boolean { function getFailureReason(item: ResourceItem): string { return props.failedItems?.get(item.id) || 'Unknown error' } + +function getItemActions(item: ResourceItem): ResourceAction[] { + if (item.actions && item.actions.length > 0) { + return item.actions + } + + return [{ + key: 'default', + label: props.itemType === 'models' ? 'Download' : 'Install', + variant: 'secondary' + }] +} diff --git a/frontend/src/components/StatusSection.vue b/frontend/src/components/StatusSection.vue index 932b8e1..90935c2 100644 --- a/frontend/src/components/StatusSection.vue +++ b/frontend/src/components/StatusSection.vue @@ -184,8 +184,8 @@ severity="error" icon="⚠" :title="`${allBrokenWorkflows.length} workflow${allBrokenWorkflows.length === 1 ? '' : 's'} can't run`" - description="These workflows have missing dependencies that must be resolved before they can run." - :items="allBrokenWorkflows.map(w => `${w.name} — ${w.issue_summary}`)" + :description="brokenWorkflowDescription" + :items="allBrokenWorkflows.map(formatBrokenWorkflowItem)" >