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/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -5
- package/README.md +23 -28
- package/commands/accept.md +7 -47
- package/commands/bootstrap.md +25 -28
- package/commands/evolve.md +12 -50
- package/commands/migrate.md +35 -59
- package/commands/self-evolving.md +6 -6
- package/commands/spawn.md +10 -37
- package/commands/suggest.md +0 -42
- package/dist/cli/archik.mjs +453 -585
- package/dist/ui/assets/index-Bn3qR7Cx.js +223 -0
- package/dist/ui/assets/index-DUgLHSFs.css +1 -0
- package/dist/ui/index.html +2 -2
- package/docs/templates/CLAUDE.md +55 -148
- package/docs/templates/principles/functional.md +2 -3
- package/docs/templates/principles/oop.md +3 -4
- package/docs/templates/superpowers.md +4 -4
- package/package.json +1 -7
- package/skills/archik/SKILL.md +19 -304
- package/commands/actor.md +0 -89
- package/commands/alpha.md +0 -73
- package/commands/trace.md +0 -57
- package/commands/usecase.md +0 -134
- package/dist/trace.d.ts +0 -18
- package/dist/trace.js +0 -58
- package/dist/ui/assets/index-BrvxaIkh.css +0 -1
- package/dist/ui/assets/index-DIOFE2Wo.js +0 -226
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.
|
package/commands/usecase.md
DELETED
|
@@ -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}
|