CI & Build / Python lint (push) Successful in 3s
CI & Build / Plugin hooks (push) Successful in 8s
CI & Build / integration (push) Successful in 21s
CI & Build / TypeScript typecheck (push) Successful in 34s
CI & Build / Python tests (push) Failing after 42s
CI & Build / Build & push image (push) Skipped
- components/InceptionCard.vue: the one form, two homes — mode="create" in the New-project modal's second step (emits the choices; the create carries `inception`), mode="decide" on ProjectView for the owner of an undecided project (loads that project's defaults, records the decision). Always-on rulebooks listed checked (uncheck = exclude), others unchecked (check = subscribe), design system select, seed-Systems toggle (disabled once the project has Systems). Tokens only; modal canon (#2855); .btn-* canon. - ProjectView: the card while undecided, one "Inheritance decided <date> via … · …" line after; onDecided refreshes the project. - ProjectRulesTab: "Excluded always-on rulebooks" section with include-back. - api/inception.ts (types, fetchInceptionDefaults, decideInception); api/rulebooks.ts: ApplicableRules.excluded_always_on, exclude/include wrappers; REST POST/DELETE /api/projects/<id>/exclusions/rulebooks/<rb>. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
43 lines
1.5 KiB
TypeScript
43 lines
1.5 KiB
TypeScript
/** Project inception (milestone 297): what a project was decided to inherit. */
|
|
import { apiGet, apiPost } from "@/api/client";
|
|
|
|
export interface InceptionChoices {
|
|
exclude_always_on_rulebooks: number[];
|
|
subscribe_rulebooks: number[];
|
|
design_system_id: number | null;
|
|
seed_systems: boolean;
|
|
}
|
|
|
|
export interface InceptionRecord {
|
|
decided_at: string;
|
|
decided_by: number | null;
|
|
via: "mcp" | "ui" | "legacy";
|
|
choices: InceptionChoices;
|
|
}
|
|
|
|
export interface InceptionDefaults {
|
|
always_on_rulebooks: { id: number; title: string }[];
|
|
other_rulebooks: { id: number; title: string }[];
|
|
excluded_always_on: { id: number; title: string }[];
|
|
subscribed_rulebooks: { id: number; title: string }[];
|
|
design_system_id: number | null;
|
|
design_systems: { id: number; title: string }[];
|
|
systems: number;
|
|
}
|
|
|
|
export interface InceptionDecision {
|
|
project_id: number;
|
|
inception: InceptionRecord;
|
|
effects: { excluded: number[]; subscribed: number[]; design_system_id: number | null; systems_seeded: string[] };
|
|
}
|
|
|
|
export const emptyChoices = (): InceptionChoices => ({
|
|
exclude_always_on_rulebooks: [], subscribe_rulebooks: [], design_system_id: null, seed_systems: false,
|
|
});
|
|
|
|
export const fetchInceptionDefaults = (projectId: number) =>
|
|
apiGet<InceptionDefaults>(`/api/projects/${projectId}/inception/defaults`);
|
|
|
|
export const decideInception = (projectId: number, choices: InceptionChoices) =>
|
|
apiPost<InceptionDecision>(`/api/projects/${projectId}/inception`, { choices });
|