archik 0.19.4 → 0.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/commands/trace.md DELETED
@@ -1,57 +0,0 @@
1
- ---
2
- description: Show the use case × slice × test × seq × ECB coverage matrix
3
- argument-hint: [filters — see notes]
4
- ---
5
-
6
- # /archik:trace — surface the Jacobson coverage matrix
7
-
8
- The user wants to see how completely the project's use cases are
9
- traced — for each slice: are tests declared, is a seq diagram
10
- realising it, are participants ECB-tagged. Optional filter args:
11
-
12
- **$ARGUMENTS**
13
-
14
- ## Steps
15
-
16
- 1. Run the trace CLI. If `$ARGUMENTS` is empty, full matrix:
17
- ```
18
- npx archik trace
19
- ```
20
- If the user passed a filter, pass it as a CLI flag — the flag form
21
- uses a SPACE, not `=`:
22
- ```
23
- npx archik trace --use-case <id>
24
- npx archik trace --actor <id>
25
- npx archik trace --status active|proposed|deprecated
26
- npx archik trace --coverage full|partial|none
27
- ```
28
-
29
- 2. **Read the totals row** at the bottom (`X full, Y partial, Z untraced`)
30
- and surface it in your reply as the headline answer:
31
- - **All full** → "✓ Every active slice is fully traced. Ready to ship."
32
- - **Any partial** → "◐ N partial slices — listed below; each is
33
- missing tests, a realisation seq, or full ECB tagging."
34
- - **Any untraced** → "○ N untraced slices — these slices declare
35
- neither tests nor a seq realisation. Address before milestone close."
36
-
37
- 3. **For each partial / untraced row**, narrate ONE concrete next
38
- action — e.g. "`pubmed-abstract-only` has tests but no seq —
39
- author `.archik/<slice>.archik.seq.yaml` with `realizes:
40
- { useCase: …, slice: pubmed-abstract-only }`".
41
- Don't dump raw rows; the user can read those in the CLI output if
42
- they want. Your job is to translate the matrix into actions.
43
-
44
- 4. **If everything is full**, also run `npx archik alpha show` and
45
- call out any alpha that's now eligible for promotion. The trace
46
- matrix is a major input to `requirements: addressed` and
47
- `softwareSystem: ready`.
48
-
49
- ## Notes
50
-
51
- - The matrix is also visible on screen via the **Use cases** toolbar
52
- badge (rolled-up, "am I done?" answer) and the dedicated
53
- `/__archik/usecases` page (per-slice breakdown). Mention this if
54
- the user wants visual context.
55
- - The check has CI teeth: `npx archik trace --fail-on partial`
56
- exits non-zero on any partial; `--fail-on none` exits non-zero on
57
- untraced only. Suggest the right flag for their CI gate if asked.
@@ -1,134 +0,0 @@
1
- ---
2
- description: Author a use case (actors + flows + slices + tests)
3
- argument-hint: <use case name or id>
4
- ---
5
-
6
- # /archik:usecase — author a `*.archik.uc.yaml`
7
-
8
- The user wants you to author a **use case** that captures user-visible
9
- behaviour as actors + flows + slices, with each active slice backed by
10
- test paths on disk. The user-facing description is:
11
-
12
- **$ARGUMENTS**
13
-
14
- This slash command IS the user's confirmation. Skip "want me to draft
15
- this?" and produce a use case file now.
16
-
17
- ## Direct-write — not the sidecar workflow
18
-
19
- Use case files are authored with `Write` directly (unlike structural
20
- sidecars which go through `suggest set`). After writing, validate via
21
- `npx archik validate`. If validation fails, fix and re-write.
22
-
23
- ## This is the DESIGN (b) handoff of the engineering loop
24
-
25
- The skill defines a 5-phase loop: **Discover → Design → Decide → Build
26
- → Verify**. This command covers Discover (ground in current actors and
27
- use cases) and the Design (b) Requirements step. The output is a
28
- reviewable artifact gated by **inline review** (you show the YAML in
29
- chat, the user confirms) — *not* the canvas gate (that's only for
30
- structural sidecars).
31
-
32
- ## Steps
33
-
34
- 0. **Frame + clarify.** Restate the user's intent in one sentence and
35
- ask 1–3 sharp clarifying questions if any of these are ambiguous in
36
- `$ARGUMENTS`:
37
- - **Primary actor** — who initiates this use case? (Will need to
38
- resolve in the actor index — check step 1 first.)
39
- - **Goal** — what does the actor want to accomplish in business
40
- terms (one sentence, observable outcome)?
41
- - **Pre / postconditions** — what must be true before/after? (Skip
42
- if obvious.)
43
- - **Slice scope** — happy path only, or also one or two alternates
44
- (e.g. payment-declined, validation-failed, retry)? Each slice =
45
- one flow subset + one test path.
46
-
47
- Skip questions `$ARGUMENTS` already answers. **Use judgment.**
48
-
49
- 1. **Ground in the current models.** Check who the actors are and
50
- what use cases exist already so you reuse rather than duplicate:
51
- ```
52
- npx archik q actors
53
- npx archik q usecases
54
- ```
55
- If the primary actor isn't in the actor index, STOP and tell the
56
- user — they need `/archik:actor <id>` first (or you offer to run
57
- it). Use cases without resolving actors fail validation.
58
-
59
- 2. **Lock in the schema:**
60
- ```
61
- npx archik schema uc
62
- ```
63
- Required fields: `id`, `name`, `primaryActor`, `goal`, `flows.basic`,
64
- at least one slice with `id`, `description`, `flows`, `tests`.
65
- Optional: `secondaryActors`, `preconditions`, `postconditions`,
66
- alternate flows, slice realization (`seqFile`).
67
-
68
- 3. **Write the file** to `.archik/usecases/<id>.archik.uc.yaml`. Use
69
- the `Write` tool — direct-write, no sidecar.
70
-
71
- **Slice test paths must exist on disk** for `status: active` slices.
72
- Validator rejects active slices whose test files are missing. If
73
- the test isn't written yet, mark the slice `status: proposed` —
74
- you'll flip it to `active` once the test lands in the BUILD phase.
75
-
76
- ```yaml
77
- version: "1.0"
78
- id: <kebab-id>
79
- name: <Human-readable name>
80
- primaryActor: <actor-id> # must resolve in actors index
81
- goal: One sentence describing the observable outcome.
82
- preconditions: [<…optional…>]
83
- postconditions: [<…optional…>]
84
- flows:
85
- basic:
86
- steps:
87
- - "Actor does X."
88
- - "System does Y."
89
- - "Actor receives Z."
90
- alternates:
91
- - id: <kebab-id>
92
- branchFrom: basic.<step-number>
93
- steps: ["…"]
94
- slices:
95
- - id: happy
96
- description: One-line slice summary.
97
- flows: [basic]
98
- tests: [<path/to/test/file.spec.ts>] # must exist OR slice must be `status: proposed`
99
- ```
100
-
101
- 4. **Validate:**
102
- ```
103
- npx archik validate
104
- ```
105
- Expect zero errors. If validation fails, the message names the
106
- field — fix and re-write. Common failures:
107
- - `primaryActor` doesn't resolve in actors index → ensure the
108
- actor file has that id
109
- - `flows.basic` missing → required by schema
110
- - `branchFrom` references unknown step → `basic.4` requires
111
- `flows.basic.steps` to have at least 4 entries
112
- - Slice tests path doesn't exist → either create the test file
113
- stub or mark the slice `status: proposed`
114
-
115
- 5. **Show inline + confirm.** Print the file's path and a short
116
- summary of what it covers (actor / number of flows / slice ids /
117
- test paths). Ask: "Looks right? Once you confirm, want me to
118
- stage the structural sidecar (`/archik:suggest`) for the nodes
119
- this use case implies?"
120
-
121
- Don't auto-proceed. The user's "looks good" IS the inline-review
122
- gate.
123
-
124
- ## Notes
125
-
126
- - If the use case implies new structural nodes (a new service, a new
127
- external integration), the next step is `/archik:suggest` — that
128
- gate is separate.
129
- - If the slice has non-trivial runtime branching, async fan-out, or
130
- cross-context interaction, plan for a `*.archik.seq.yaml` next that
131
- carries `realizes: { useCase: <id>, slice: <id> }` and binds
132
- participants to the structural nodes.
133
- - Actor must exist BEFORE the use case file is written. Use cases
134
- reference `primaryActor` by id; the validator rejects dangling refs.
package/dist/trace.d.ts DELETED
@@ -1,18 +0,0 @@
1
- export type TraceStepInput = {
2
- id?: string;
3
- from: string;
4
- to: string;
5
- label: string;
6
- in?: unknown;
7
- out?: unknown;
8
- status?: "ok" | "error";
9
- };
10
- export type TraceRecorder = {
11
- step(s: TraceStepInput): TraceRecorder;
12
- flush(): void;
13
- };
14
- export declare function trace(opts: {
15
- useCase: string;
16
- slice: string;
17
- seqFile?: string;
18
- }): TraceRecorder;
package/dist/trace.js DELETED
@@ -1,58 +0,0 @@
1
- // src/trace/recorder.ts
2
- import { existsSync, mkdirSync, writeFileSync } from "node:fs";
3
- import path from "node:path";
4
- function findProjectRoot(start) {
5
- let dir = start;
6
- for (let i = 0; i < 30; i++) {
7
- if (existsSync(path.join(dir, ".archik"))) return dir;
8
- const parent = path.dirname(dir);
9
- if (parent === dir) break;
10
- dir = parent;
11
- }
12
- return start;
13
- }
14
- function trace(opts) {
15
- const steps = [];
16
- let flushed = false;
17
- const onExit = () => recorder.flush();
18
- const recorder = {
19
- step(s) {
20
- const data = s.in !== void 0 || s.out !== void 0 ? {
21
- ...s.in !== void 0 ? { in: s.in } : {},
22
- ...s.out !== void 0 ? { out: s.out } : {}
23
- } : void 0;
24
- steps.push({
25
- ...s.id !== void 0 ? { id: s.id } : {},
26
- from: s.from,
27
- to: s.to,
28
- label: s.label,
29
- ...data !== void 0 ? { data } : {},
30
- status: s.status ?? "ok"
31
- });
32
- return recorder;
33
- },
34
- flush() {
35
- if (flushed) return;
36
- flushed = true;
37
- const root = findProjectRoot(process.cwd());
38
- const dir = path.join(root, ".archik", "traces");
39
- mkdirSync(dir, { recursive: true });
40
- const doc = {
41
- version: "1.0",
42
- useCase: opts.useCase,
43
- slice: opts.slice,
44
- ...opts.seqFile !== void 0 ? { seqFile: opts.seqFile } : {},
45
- recordedAt: (/* @__PURE__ */ new Date()).toISOString(),
46
- steps
47
- };
48
- const file = path.join(dir, `${opts.useCase}.${opts.slice}.archik.trace.json`);
49
- writeFileSync(file, JSON.stringify(doc, null, 2) + "\n", "utf-8");
50
- process.removeListener("exit", onExit);
51
- }
52
- };
53
- process.on("exit", onExit);
54
- return recorder;
55
- }
56
- export {
57
- trace
58
- };
@@ -1 +0,0 @@
1
- @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-rose-700:oklch(51.4% .222 16.935);--spacing:.25rem;--container-3xl:48rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--font-weight-semibold:600;--tracking-tight:-.025em;--radius-md:.375rem;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.z-50{z-index:50}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-auto{margin-top:auto}.ml-auto{margin-left:auto}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.h-dvh{height:100dvh}.h-full{height:100%}.h-screen{height:100vh}.min-h-0{min-height:calc(var(--spacing) * 0)}.w-72{width:calc(var(--spacing) * 72)}.w-full{width:100%}.max-w-3xl{max-width:var(--container-3xl)}.flex-1{flex:1}.grow{flex-grow:1}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.resize{resize:both}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.items-baseline{align-items:baseline}.items-center{align-items:center}.justify-center{justify-content:center}.gap-1{gap:calc(var(--spacing) * 1)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-md{border-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.p-1{padding:calc(var(--spacing) * 1)}.p-2{padding:calc(var(--spacing) * 2)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-4{padding-inline:calc(var(--spacing) * 4)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-4{padding-top:calc(var(--spacing) * 4)}.text-center{text-align:center}.text-left{text-align:left}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.whitespace-pre-wrap{white-space:pre-wrap}.text-rose-700{color:var(--color-rose-700)}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.italic{font-style:italic}.ordinal{--tw-ordinal:ordinal;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.underline{text-decoration-line:underline}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media(hover:hover){.hover\:no-underline:hover{text-decoration-line:none}}}:root,[data-theme=light]{--archik-canvas:#f8fafc;--archik-panel:#fff;--archik-surface:#f1f5f9;--archik-surface-hover:#e2e8f0;--archik-fg:#0f172a;--archik-fg-dim:#475569;--archik-fg-muted:#94a3b8;--archik-border:#e2e8f0;--archik-border-strong:#cbd5e1;--archik-accent:#2563eb;--archik-accent-bright:#3b82f6;--archik-magenta:#db2777;--archik-success:#10b981;--archik-warning:#d97706;--archik-danger:#e11d48;--archik-node-fill:#fff;--archik-node-fill-tinted:#f1f5f9;--archik-node-fill-frame:#fff;--archik-node-stroke:#0f172a;--archik-node-stroke-soft:#475569;--archik-container-border:#94a3b8;--archik-node-text:#0f172a;--archik-node-text-dim:#475569;--archik-node-caption:#64748b;--archik-node-chrome-dot:#cbd5f5;--archik-edge-filled:#0f172a;--archik-edge-open:#334155;--archik-edge-dim:#64748b;--archik-edge-async:#2563eb;--archik-grid-minor:#e2e8f0;--archik-grid-major:#cbd5e1;--archik-selected:#2563eb;--archik-selected-glow:#2563eb2e;--archik-status-proposed:#6366f1;--archik-status-deprecated:#d97706;--archik-stereotype-boundary:#0369a1;--archik-stereotype-control:#b45309;--archik-stereotype-entity:#15803d;color-scheme:light}[data-theme=dark]{--archik-canvas:#000;--archik-panel:#0a0a0a;--archik-surface:#161616;--archik-surface-hover:#222;--archik-fg:#fff;--archik-fg-dim:#c8c8c8;--archik-fg-muted:#9a9a9a;--archik-border:#262626;--archik-border-strong:#3d3d3d;--archik-accent:#22d3ee;--archik-accent-bright:#67e8f9;--archik-magenta:#f472b6;--archik-success:#34d399;--archik-warning:#fbbf24;--archik-danger:#fb7185;--archik-node-fill:#0c0c0c;--archik-node-fill-tinted:#181818;--archik-node-fill-frame:#101010;--archik-node-stroke:#3d3d3d;--archik-node-stroke-soft:#2a2a2a;--archik-container-border:#4a4a4a;--archik-node-text:#fff;--archik-node-text-dim:#d6d6d6;--archik-node-caption:#67e8f9;--archik-node-chrome-dot:#3a3a3a;--archik-edge-filled:#ededed;--archik-edge-open:#b0b0b0;--archik-edge-dim:#7a7a7a;--archik-edge-async:#67e8f9;--archik-grid-minor:#0f0f0f;--archik-grid-major:#1c1c1c;--archik-selected:#22d3ee;--archik-selected-glow:#22d3ee47;--archik-status-proposed:#818cf8;--archik-status-deprecated:#fbbf24;--archik-stereotype-boundary:#38bdf8;--archik-stereotype-control:#f59e0b;--archik-stereotype-entity:#22c55e;color-scheme:dark}html,body,#root{background:var(--archik-canvas);height:100%;color:var(--archik-fg);-webkit-font-smoothing:antialiased;margin:0;font-family:Inter,system-ui,sans-serif}.archik-panel{background:var(--archik-panel);border:1px solid var(--archik-border);border-radius:8px}.archik-input{background:var(--archik-surface);color:var(--archik-fg);border:1px solid var(--archik-border);font:inherit;border-radius:4px;outline:none;padding:4px 8px;font-size:12px;transition:border-color .12s,box-shadow .12s}.archik-input:focus{border-color:var(--archik-accent);box-shadow:0 0 0 3px var(--archik-selected-glow)}.archik-btn{background:var(--archik-surface);color:var(--archik-fg);border:1px solid var(--archik-border);cursor:pointer;border-radius:4px;align-items:center;gap:4px;padding:5px 10px;font-size:12px;font-weight:500;transition:background .12s,border-color .12s,color .12s;display:inline-flex}.archik-btn:hover{background:var(--archik-surface-hover);border-color:var(--archik-border-strong)}.archik-btn:disabled{opacity:.5;cursor:not-allowed}.archik-focus-step{width:22px;height:22px;color:var(--archik-fg-dim);cursor:pointer;background:0 0;border:none;border-radius:5px;justify-content:center;align-items:center;padding:0;transition:background .12s,color .12s;display:inline-flex}.archik-focus-step:hover:not(:disabled){background:var(--archik-accent)}@supports (color:color-mix(in lab,red,red)){.archik-focus-step:hover:not(:disabled){background:color-mix(in srgb,var(--archik-accent) 22%,transparent)}}.archik-focus-step:hover:not(:disabled){color:var(--archik-accent)}.archik-focus-step:focus-visible{outline:2px solid var(--archik-accent);outline-offset:1px}.archik-focus-step:disabled{opacity:.4;cursor:not-allowed}.archik-btn-primary{background:var(--archik-accent);border-color:var(--archik-accent);color:#000}.archik-btn-primary:hover{background:var(--archik-accent-bright);border-color:var(--archik-accent-bright)}[data-theme=light] .archik-btn-primary{color:#fff}.archik-btn-danger{color:var(--archik-danger);border-color:var(--archik-danger);background:0 0;border-style:dashed}.archik-btn-danger:hover{background:var(--archik-danger);color:#000;border-style:solid}.archik-pill{letter-spacing:.02em;border:1px solid #0000;border-radius:999px;align-items:center;gap:4px;padding:2px 8px;font-size:11px;display:inline-flex}.archik-pill--info{color:var(--archik-accent);border-color:var(--archik-border-strong);background:var(--archik-accent)}@supports (color:color-mix(in lab,red,red)){.archik-pill--info{background:color-mix(in oklab,var(--archik-accent) 8%,transparent)}}.archik-pill--success{color:var(--archik-success);background:var(--archik-success)}@supports (color:color-mix(in lab,red,red)){.archik-pill--success{background:color-mix(in oklab,var(--archik-success) 12%,transparent)}}.archik-pill--warning{color:var(--archik-warning);background:var(--archik-warning)}@supports (color:color-mix(in lab,red,red)){.archik-pill--warning{background:color-mix(in oklab,var(--archik-warning) 14%,transparent)}}.archik-pill--danger{color:var(--archik-danger);background:var(--archik-danger)}@supports (color:color-mix(in lab,red,red)){.archik-pill--danger{background:color-mix(in oklab,var(--archik-danger) 14%,transparent)}}.archik-label{letter-spacing:.12em;text-transform:uppercase;color:var(--archik-fg-muted);margin-bottom:4px;font-size:10px;display:block}.archik-mono{color:var(--archik-fg);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px}.archik-divider{border-top:1px solid var(--archik-border)}.archik-grid{background-color:var(--archik-canvas);background-image:radial-gradient(var(--archik-grid-minor) 1px,transparent 1px),radial-gradient(var(--archik-grid-major) 1px,transparent 1px);background-position:0 0,0 0;background-size:20px 20px,100px 100px}.archik-selected-glow{filter:drop-shadow(0 0 6px var(--archik-selected-glow)) drop-shadow(0 0 2px var(--archik-selected-glow));animation:1.8s ease-in-out infinite archikPulse}[data-archik-node-id][data-archik-status=proposed]{opacity:.82}[data-archik-node-id][data-archik-status=proposed] rect,[data-archik-node-id][data-archik-status=proposed] path,[data-archik-node-id][data-archik-status=proposed] ellipse,[data-archik-node-id][data-archik-status=proposed] line{stroke:var(--archik-status-proposed);stroke-dasharray:5 3}[data-archik-node-id][data-archik-status=deprecated]{opacity:.7}[data-archik-node-id][data-archik-status=deprecated] rect,[data-archik-node-id][data-archik-status=deprecated] path,[data-archik-node-id][data-archik-status=deprecated] ellipse,[data-archik-node-id][data-archik-status=deprecated] line{stroke:var(--archik-status-deprecated);stroke-dasharray:2 4}[data-archik-node-id][data-archik-status=deprecated] text{text-decoration:line-through;text-decoration-thickness:1px;-webkit-text-decoration-color:var(--archik-status-deprecated);text-decoration-color:var(--archik-status-deprecated)}.archik-stereotype-band{pointer-events:none}[data-archik-stereotype=boundary] .archik-stereotype-band{fill:var(--archik-stereotype-boundary)}[data-archik-stereotype=control] .archik-stereotype-band{fill:var(--archik-stereotype-control)}[data-archik-stereotype=entity] .archik-stereotype-band{fill:var(--archik-stereotype-entity)}.archik-stereotype-pill{letter-spacing:.08em;border:1px solid #0000;border-radius:10px;align-self:flex-start;align-items:center;padding:3px 10px;font-size:10px;font-weight:700;display:inline-flex}.archik-stereotype-pill[data-stereotype=boundary]{background:var(--archik-stereotype-boundary)}@supports (color:color-mix(in lab,red,red)){.archik-stereotype-pill[data-stereotype=boundary]{background:color-mix(in srgb,var(--archik-stereotype-boundary) 15%,transparent)}}.archik-stereotype-pill[data-stereotype=boundary]{border-color:var(--archik-stereotype-boundary);color:var(--archik-stereotype-boundary)}.archik-stereotype-pill[data-stereotype=control]{background:var(--archik-stereotype-control)}@supports (color:color-mix(in lab,red,red)){.archik-stereotype-pill[data-stereotype=control]{background:color-mix(in srgb,var(--archik-stereotype-control) 15%,transparent)}}.archik-stereotype-pill[data-stereotype=control]{border-color:var(--archik-stereotype-control);color:var(--archik-stereotype-control)}.archik-stereotype-pill[data-stereotype=entity]{background:var(--archik-stereotype-entity)}@supports (color:color-mix(in lab,red,red)){.archik-stereotype-pill[data-stereotype=entity]{background:color-mix(in srgb,var(--archik-stereotype-entity) 15%,transparent)}}.archik-stereotype-pill[data-stereotype=entity]{border-color:var(--archik-stereotype-entity);color:var(--archik-stereotype-entity)}@keyframes archikPulse{0%,to{filter:drop-shadow(0 0 4px var(--archik-selected-glow)) drop-shadow(0 0 1px var(--archik-selected-glow))}50%{filter:drop-shadow(0 0 12px var(--archik-selected-glow)) drop-shadow(0 0 3px var(--archik-selected-glow))}}.archik-modal-overlay{z-index:50;background:var(--archik-canvas);justify-content:center;align-items:center;display:flex;position:fixed;inset:0}@supports (color:color-mix(in lab,red,red)){.archik-modal-overlay{background:color-mix(in oklab,var(--archik-canvas) 70%,transparent)}}.archik-modal-overlay{-webkit-backdrop-filter:blur(4px);animation:.14s ease-out archikFadeIn}.archik-modal{background:var(--archik-panel);border:1px solid var(--archik-border);width:360px;max-width:calc(100vw - 32px);box-shadow:0 12px 40px #00000059,0 0 0 1px var(--archik-border-strong);border-radius:8px;padding:16px;animation:.2s cubic-bezier(.2,.8,.2,1) archikModalIn}.archik-selected-outline{fill:none;stroke:var(--archik-selected);stroke-width:2px;pointer-events:none}@keyframes archikEdgeFlow{0%{stroke-dashoffset:0}to{stroke-dashoffset:calc(-1 * var(--archik-dash-period,8) * 1px)}}.archik-edge-flowing{animation:1.4s linear infinite archikEdgeFlow}@media(prefers-reduced-motion:reduce){.archik-edge-flowing{animation:none}}.archik-popover{background:var(--archik-panel);border:1px solid var(--archik-border-strong);border-radius:6px;flex-direction:column;max-height:min(80vh,600px);padding:4px;animation:.16s cubic-bezier(.2,.8,.2,1) archikModalIn;display:flex;overflow:hidden;box-shadow:0 12px 32px #00000059}.archik-menu-item{width:100%;color:var(--archik-fg);cursor:pointer;text-align:left;background:0 0;border:0;border-radius:4px;align-items:center;gap:8px;padding:6px 10px;font-size:12px;display:flex}.archik-menu-item:hover{background:var(--archik-surface-hover)}.archik-menu-item--danger{color:var(--archik-danger)}@keyframes archikFadeIn{0%{opacity:0}to{opacity:1}}@keyframes archikModalIn{0%{opacity:0;transform:translateY(8px)scale(.98)}to{opacity:1;transform:none}}.archik-drawer-shell{flex-direction:column;min-width:0;transition:width .22s cubic-bezier(.2,.8,.2,1),opacity .2s,margin-left .22s cubic-bezier(.2,.8,.2,1);display:flex;overflow:hidden}.archik-drawer-shell--open{opacity:1;width:320px;margin-left:16px}.archik-drawer-shell--closed{opacity:0;pointer-events:none;width:0;margin-left:0}.archik-drawer-content{flex-shrink:0;width:320px;height:100%}.archik-drawer-fade{animation:.22s ease-out archikFadeIn}.archik-zoom-btn{min-width:28px;height:24px;padding:0 8px}.archik-sheet-handle{flex-shrink:0;justify-content:center;align-items:center;padding:10px 12px 2px;display:none;position:relative}.archik-sheet-grip{background:var(--archik-border-strong);border-radius:2px;width:36px;height:4px}.archik-sheet-close{width:32px;height:32px;color:var(--archik-fg-dim);cursor:pointer;background:0 0;border:none;border-radius:6px;justify-content:center;align-items:center;font-size:13px;display:flex;position:absolute;top:2px;right:8px}.archik-sheet-close:hover{background:var(--archik-surface-hover);color:var(--archik-fg)}@media(max-width:768px){.archik-main{padding:0!important}.archik-main>.archik-panel{border:0;border-radius:0}.archik-drawer-shell{z-index:40;margin-left:0;transition:transform .22s cubic-bezier(.2,.8,.2,1),opacity .2s;position:fixed;bottom:0;left:0;right:0}.archik-drawer-shell--open{width:auto;margin-left:0;transform:translateY(0)}.archik-drawer-shell--closed{width:auto;margin-left:0;transform:translateY(100%)}.archik-drawer-content{border-bottom:0;border-radius:14px 14px 0 0;flex-direction:column;width:100%;height:60dvh;display:flex}.archik-drawer-content>:not(.archik-sheet-handle){flex:1;min-height:0;height:auto!important}.archik-sheet-handle{display:flex}}@media(pointer:coarse){.archik-btn{min-height:36px;padding:8px 12px}.archik-zoom-btn{min-width:40px;height:40px;padding:0 10px}.archik-focus-step{width:32px;height:32px}}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}