@azure-id/orc 1.9.0 → 1.9.2

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.
Files changed (134) hide show
  1. package/CHANGELOG.md +202 -0
  2. package/README-id.md +57 -59
  3. package/README.md +53 -54
  4. package/bin/build-agents.js +109 -109
  5. package/bin/cli.js +262 -58
  6. package/bin/graph-audit.js +235 -0
  7. package/bin/graph-extract.js +308 -3
  8. package/bin/graph-gain.js +23 -3
  9. package/bin/graph-map.js +9 -1
  10. package/bin/graph-query.js +152 -10
  11. package/bin/graph-shard.js +6 -1
  12. package/bin/graph-signals.js +287 -4
  13. package/bin/graph.js +717 -658
  14. package/bin/onboarding-content.js +4 -4
  15. package/bin/pricing.json +207 -200
  16. package/bin/verify-contracts.js +117 -2
  17. package/bin/verify-package.js +11 -7
  18. package/bin/webui/css/04-motion.css +162 -152
  19. package/bin/webui/css/panels/knowledge.css +563 -116
  20. package/bin/webui/fixtures/extra.js +2036 -2036
  21. package/bin/webui/fixtures/hookui.js +5 -5
  22. package/bin/webui/fixtures/knowledge.js +21 -4
  23. package/bin/webui/fixtures/settings.js +305 -305
  24. package/bin/webui/i18n/en/knowledge.json +122 -4
  25. package/bin/webui/i18n/id/knowledge.json +122 -4
  26. package/bin/webui/js/panels/knowledge.js +573 -9
  27. package/bin/webui/js/panels/overview.js +13 -4
  28. package/mock-run/context-combiner.md +100 -100
  29. package/mock-run/orc-budget.md +534 -534
  30. package/mock-run/orc-challenge-council.md +262 -262
  31. package/mock-run/orc-ultra.md +103 -103
  32. package/package.json +1 -1
  33. package/templates/agents/MODEL-MAPPING.md +43 -43
  34. package/templates/agents/orc-advisor-opus-5-xhigh.md +56 -56
  35. package/templates/agents/orc-analyze-mini-opus-5-med.md +60 -60
  36. package/templates/agents/orc-analyze-mini-sonnet-5-high.md +58 -58
  37. package/templates/agents/orc-challenge-advisor-opus-5-med.md +75 -75
  38. package/templates/agents/orc-challenge-contrarian-opus-5-high.md +110 -110
  39. package/templates/agents/orc-challenge-executor-opus-5-med.md +114 -114
  40. package/templates/agents/orc-challenge-expansionist-opus-5-med.md +112 -112
  41. package/templates/agents/orc-challenge-judge-opus-5-high.md +132 -132
  42. package/templates/agents/orc-challenge-outsider-opus-5-low.md +109 -109
  43. package/templates/agents/orc-challenge-principles-opus-5-high.md +109 -109
  44. package/templates/agents/orc-challenge-reader-opus-5-low.md +90 -90
  45. package/templates/agents/orc-claude-writer-opus-5-med.md +55 -55
  46. package/templates/agents/orc-context-combiner-opus-5-high.md +88 -88
  47. package/templates/agents/orc-doc-checker-opus-5-low.md +108 -108
  48. package/templates/agents/orc-doc-writer-opus-5-med.md +134 -134
  49. package/templates/agents/orc-executor-haiku-4-5.md +2 -1
  50. package/templates/agents/orc-executor-opus-4-7-high.md +2 -1
  51. package/templates/agents/orc-executor-opus-4-7-med.md +2 -1
  52. package/templates/agents/orc-executor-opus-4-8-high.md +2 -1
  53. package/templates/agents/orc-executor-opus-5-high.md +4 -3
  54. package/templates/agents/orc-executor-opus-5-low.md +4 -3
  55. package/templates/agents/orc-executor-opus-5-med.md +4 -3
  56. package/templates/agents/orc-executor-sonnet-4-6-high.md +2 -1
  57. package/templates/agents/orc-executor-sonnet-4-6-med.md +2 -1
  58. package/templates/agents/orc-executor-sonnet-5-high.md +2 -1
  59. package/templates/agents/orc-graph-noter-sonnet-4-6-med.md +1 -1
  60. package/templates/agents/orc-judge-opus-5-xhigh.md +85 -85
  61. package/templates/agents/orc-learn-writer-opus-5-low.md +73 -73
  62. package/templates/agents/orc-pattern-codifier-opus-5-med.md +65 -65
  63. package/templates/agents/orc-planner-mini-opus-5-med.md +4 -4
  64. package/templates/agents/orc-planner-mini-sonnet-5-high.md +1 -1
  65. package/templates/agents/orc-planner-opus-5-med.md +160 -160
  66. package/templates/agents/orc-recon-opus-5-low.md +18 -8
  67. package/templates/agents/orc-recon-sonnet-4-6-med.md +15 -5
  68. package/templates/agents/orc-retro-opus-5-med.md +3 -3
  69. package/templates/agents/orc-reviewer-opus-5-med.md +60 -60
  70. package/templates/agents/orc-scout-opus-5-low.md +40 -40
  71. package/templates/agents/orc-system-analyst-opus-5-high.md +120 -120
  72. package/templates/agents/orc-test-author-opus-5-med.md +71 -71
  73. package/templates/agents/orc-test-designer-opus-5-high.md +158 -158
  74. package/templates/agents/orc-test-interpreter-opus-5-low.md +130 -130
  75. package/templates/agents/orc-verifier-opus-5-med.md +69 -69
  76. package/templates/agents/orc-wiki-scanner-opus-5-med.md +81 -81
  77. package/templates/commands/orc-ultra.md +17 -17
  78. package/templates/commands/orc-verify.md +11 -11
  79. package/templates/hooks/README.md +13 -3
  80. package/templates/hooks/orc-effort-guard.js +178 -178
  81. package/templates/hooks/orc-graph-hook.js +53 -7
  82. package/templates/hooks/orc-statusline.js +6 -6
  83. package/templates/skills/_shared/code-graph.md +57 -18
  84. package/templates/skills/_shared/config-precedence.md +198 -198
  85. package/templates/skills/_shared/extra-dispatch.md +1346 -1346
  86. package/templates/skills/_shared/opus5-only.md +8 -8
  87. package/templates/skills/_shared/phases/analyst-gates.md +136 -136
  88. package/templates/skills/_shared/phases/execution.md +4 -4
  89. package/templates/skills/_shared/phases/planning.md +3 -3
  90. package/templates/skills/_shared/phases/preflight.md +1 -1
  91. package/templates/skills/_shared/phases/review.md +4 -2
  92. package/templates/skills/_shared/phases/ship.md +1 -1
  93. package/templates/skills/_shared/phases/trace.md +3 -2
  94. package/templates/skills/_shared/read-ladder.md +14 -1
  95. package/templates/skills/_shared/return-validation.md +1 -1
  96. package/templates/skills/context-combiner/SKILL.md +1 -1
  97. package/templates/skills/context-combiner/schemas/combined-report.md +78 -78
  98. package/templates/skills/orc/README.md +2 -2
  99. package/templates/skills/orc/SKILL.md +8 -8
  100. package/templates/skills/orc/config.md +9 -9
  101. package/templates/skills/orc/examples/full-run-mock.md +73 -73
  102. package/templates/skills/orc/references/effort-and-mode.md +222 -222
  103. package/templates/skills/orc/references/preflight-report.md +2 -2
  104. package/templates/skills/orc/references/ultra-mode.md +3 -3
  105. package/templates/skills/orc/subskills/orc-planner/SKILL.md +2 -2
  106. package/templates/skills/orc/subskills/orc-planner-mini/SKILL.md +121 -121
  107. package/templates/skills/orc/subskills/orc-review-verify/SKILL.md +76 -76
  108. package/templates/skills/orc/subskills/orc-testgen/SKILL.md +45 -45
  109. package/templates/skills/orc-analyze/SKILL.md +2 -2
  110. package/templates/skills/orc-analyze/examples/analyze-mock.md +42 -42
  111. package/templates/skills/orc-analyze/schemas/report-audit.md +83 -83
  112. package/templates/skills/orc-analyze/schemas/report-prose.md +63 -63
  113. package/templates/skills/orc-analyze/schemas/report-requirement.md +78 -78
  114. package/templates/skills/orc-challenge/README.md +142 -142
  115. package/templates/skills/orc-challenge/examples/council-full-roster.md +273 -273
  116. package/templates/skills/orc-challenge/references/council.md +315 -315
  117. package/templates/skills/orc-challenge/references/intake.md +171 -171
  118. package/templates/skills/orc-claude/SKILL.md +14 -14
  119. package/templates/skills/orc-diy/README.md +143 -143
  120. package/templates/skills/orc-diy/references/flow-schema.md +1 -1
  121. package/templates/skills/orc-doc/README.md +229 -229
  122. package/templates/skills/orc-doc/examples/orc-doc-prd-run.md +325 -325
  123. package/templates/skills/orc-doc/references/chunking.md +527 -527
  124. package/templates/skills/orc-fast/SKILL.md +4 -4
  125. package/templates/skills/orc-learn/SKILL.md +14 -14
  126. package/templates/skills/orc-learn/examples/learn-run-mock.md +61 -61
  127. package/templates/skills/orc-mini/SKILL.md +16 -20
  128. package/templates/skills/orc-mini/references/complexity.md +25 -11
  129. package/templates/skills/orc-quick/SKILL.md +12 -13
  130. package/templates/skills/orc-quick/references/gh-mode.md +1 -1
  131. package/templates/skills/orc-quick/references/look.md +5 -5
  132. package/templates/skills/orc-verify/SKILL.md +15 -15
  133. package/templates/skills/orc-verify/examples/verify-mock.md +33 -33
  134. package/templates/skills/orc-wiki/references/extra.md +1 -1
@@ -1,116 +1,563 @@
1
- /* panels/knowledge.css — the Knowledge panel (v0.49.1).
2
-
3
- Five tabs' worth of surface. Loaded by app.html in the order its <link> sits
4
- in that manifest, and for CSS the load order IS the cascade order — which is
5
- why 06-responsive and 04-motion come after every panel sheet.
6
-
7
- NO COLOUR TOKEN IS DEFINED HERE. Every one of them is declared once, on bare
8
- :root, in 00-tokens.css. */
9
-
10
- /* --- the header strip (v0.49.1) ------------------------------------------ */
11
- /* Above the tabs, on every one of them: what ORC knows about this repo, in one
12
- line. A `—` means the CLI could not compute it, and that is an ANSWER. */
13
- .kn-strip {
14
- display: flex;
15
- flex-wrap: wrap;
16
- gap: var(--sp-4);
17
- padding: var(--sp-3);
18
- border: 1px solid var(--line-soft);
19
- border-radius: var(--radius-sm);
20
- margin-bottom: var(--sp-3);
21
- }
22
- .kn-strip-item { display: grid; gap: 2px; }
23
- .kn-strip-value { font-size: 18px; font-weight: 600; font-variant-numeric: tabular-nums; }
24
- .kn-strip-label { font-size: 11px; color: var(--text-faint); text-transform: uppercase; letter-spacing: .04em; }
25
-
26
- /* --- the per-doc tier bar + the coverage bar ------------------------------ */
27
- .kn-tierbar {
28
- display: flex;
29
- height: 8px;
30
- min-width: 120px;
31
- flex: 1;
32
- border-radius: 4px;
33
- overflow: hidden;
34
- background: var(--line-soft);
35
- }
36
- .kn-tierbar-seg { width: var(--w); }
37
- .kn-tier-ok { background: var(--ok); }
38
- .kn-tier-warn { background: var(--warn); }
39
- .kn-tier-bad { background: var(--bad); }
40
- .kn-tier-idle { background: var(--idle); }
41
-
42
- .kn-coverage { display: flex; align-items: baseline; gap: var(--sp-3); margin-bottom: var(--sp-2); }
43
- .kn-coverage-num { font-size: 34px; font-weight: 600; font-variant-numeric: tabular-nums; }
44
-
45
- /* --- rows that expand IN PLACE ------------------------------------------- */
46
- /* One at a time, detail fetched on first open, and NO detail box below the
47
- table — the Runs-row rule. */
48
- .kn-doc-row { cursor: pointer; }
49
- .kn-doc-row:hover td { background: var(--surface-2); }
50
- .kn-doc-row.open td { background: var(--surface-2); }
51
- .kn-doc-detail > td { background: var(--surface-2); padding: var(--sp-3); }
52
-
53
- /* --- revealed prose ------------------------------------------------------- */
54
- /* Rendered as DOM by renderMd, never as HTML. It scrolls INSIDE itself; the page
55
- body never scrolls horizontally. */
56
- .kn-body {
57
- margin-top: var(--sp-2);
58
- max-height: 420px;
59
- overflow: auto;
60
- padding: var(--sp-3);
61
- border: 1px solid var(--line-soft);
62
- border-radius: var(--radius-sm);
63
- scrollbar-width: thin;
64
- scrollbar-color: var(--line) transparent;
65
- }
66
- .kn-body::-webkit-scrollbar { width: 8px; height: 8px; }
67
- .kn-body::-webkit-scrollbar-track { background: transparent; }
68
- .kn-body::-webkit-scrollbar-thumb { background: var(--line); border-radius: 4px; }
69
-
70
- /* --- patterns ------------------------------------------------------------- */
71
- .kn-pattern {
72
- border: 1px solid var(--line-soft);
73
- border-radius: var(--radius-sm);
74
- padding: var(--sp-3);
75
- margin-top: var(--sp-2);
76
- display: grid;
77
- gap: var(--sp-2);
78
- }
79
- /* The most decision-shaped thing in a pattern file, and until now invisible
80
- outside it. */
81
- .kn-conflicts { border-left: 3px solid var(--warn); padding-left: var(--sp-3); display: grid; gap: 4px; }
82
- .kn-conflicts-head { font-weight: 600; font-size: 13px; }
83
-
84
- /* --- preview-then-apply --------------------------------------------------- */
85
- .kn-prune { margin-top: var(--sp-3); display: grid; gap: var(--sp-2); }
86
- .kn-prune-head { font-weight: 600; font-size: 13px; }
87
-
88
- /* ── one doc at a time (v1.7.0) ───────────────────────────────────────────── */
89
- /* The resolver and the derived-reference sweep. Both are probes, so the card is
90
- read-shaped: a row of results, and a command where a lane would have to run. */
91
- .kn-one-topic { flex: 1 1 260px; min-width: 0; }
92
- .kn-one-out { margin-top: var(--sp-2); display: flex; flex-direction: column; gap: 4px; }
93
- .kn-one-cand {
94
- display: flex;
95
- flex-wrap: wrap;
96
- gap: var(--sp-1) var(--sp-2);
97
- align-items: baseline;
98
- padding-left: var(--sp-2);
99
- }
100
- .kn-one-sweep {
101
- margin-top: var(--sp-3);
102
- border-top: 1px solid var(--line-soft);
103
- padding-top: var(--sp-2);
104
- }
105
- .kn-one-ref {
106
- display: flex;
107
- flex-wrap: wrap;
108
- gap: var(--sp-1) var(--sp-2);
109
- align-items: baseline;
110
- padding: 3px 0;
111
- }
112
- .kn-one-fix { padding-left: var(--sp-4); }
113
-
114
- @media (max-width: 720px) {
115
- .kn-one-ref, .kn-one-cand { flex-direction: column; align-items: flex-start; gap: 2px; }
116
- }
1
+ /* panels/knowledge.css — the Knowledge panel (v0.49.1).
2
+
3
+ Five tabs' worth of surface. Loaded by app.html in the order its <link> sits
4
+ in that manifest, and for CSS the load order IS the cascade order — which is
5
+ why 06-responsive and 04-motion come after every panel sheet.
6
+
7
+ NO COLOUR TOKEN IS DEFINED HERE. Every one of them is declared once, on bare
8
+ :root, in 00-tokens.css. */
9
+
10
+ /* --- the header strip (v0.49.1) ------------------------------------------ */
11
+ /* Above the tabs, on every one of them: what ORC knows about this repo, in one
12
+ line. A `—` means the CLI could not compute it, and that is an ANSWER. */
13
+ .kn-strip {
14
+ display: flex;
15
+ flex-wrap: wrap;
16
+ gap: var(--sp-4);
17
+ padding: var(--sp-3);
18
+ border: 1px solid var(--line-soft);
19
+ border-radius: var(--radius-sm);
20
+ margin-bottom: var(--sp-3);
21
+ }
22
+ .kn-strip-item { display: grid; gap: 2px; }
23
+ .kn-strip-value { font-size: 18px; font-weight: 600; font-variant-numeric: tabular-nums; }
24
+ .kn-strip-label { font-size: 11px; color: var(--text-faint); text-transform: uppercase; letter-spacing: .04em; }
25
+
26
+ /* --- the per-doc tier bar + the coverage bar ------------------------------ */
27
+ .kn-tierbar {
28
+ display: flex;
29
+ height: 8px;
30
+ min-width: 120px;
31
+ flex: 1;
32
+ border-radius: 4px;
33
+ overflow: hidden;
34
+ background: var(--line-soft);
35
+ }
36
+ .kn-tierbar-seg { width: var(--w); }
37
+ .kn-tier-ok { background: var(--ok); }
38
+ .kn-tier-warn { background: var(--warn); }
39
+ .kn-tier-bad { background: var(--bad); }
40
+ .kn-tier-idle { background: var(--idle); }
41
+
42
+ .kn-coverage { display: flex; align-items: baseline; gap: var(--sp-3); margin-bottom: var(--sp-2); }
43
+ .kn-coverage-num { font-size: 34px; font-weight: 600; font-variant-numeric: tabular-nums; }
44
+
45
+ /* --- rows that expand IN PLACE ------------------------------------------- */
46
+ /* One at a time, detail fetched on first open, and NO detail box below the
47
+ table — the Runs-row rule. */
48
+ .kn-doc-row { cursor: pointer; }
49
+ .kn-doc-row:hover td { background: var(--surface-2); }
50
+ .kn-doc-row.open td { background: var(--surface-2); }
51
+ .kn-doc-detail > td { background: var(--surface-2); padding: var(--sp-3); }
52
+
53
+ /* --- revealed prose ------------------------------------------------------- */
54
+ /* Rendered as DOM by renderMd, never as HTML. It scrolls INSIDE itself; the page
55
+ body never scrolls horizontally. */
56
+ .kn-body {
57
+ margin-top: var(--sp-2);
58
+ max-height: 420px;
59
+ overflow: auto;
60
+ padding: var(--sp-3);
61
+ border: 1px solid var(--line-soft);
62
+ border-radius: var(--radius-sm);
63
+ scrollbar-width: thin;
64
+ scrollbar-color: var(--line) transparent;
65
+ }
66
+ .kn-body::-webkit-scrollbar { width: 8px; height: 8px; }
67
+ .kn-body::-webkit-scrollbar-track { background: transparent; }
68
+ .kn-body::-webkit-scrollbar-thumb { background: var(--line); border-radius: 4px; }
69
+
70
+ /* --- patterns ------------------------------------------------------------- */
71
+ .kn-pattern {
72
+ border: 1px solid var(--line-soft);
73
+ border-radius: var(--radius-sm);
74
+ padding: var(--sp-3);
75
+ margin-top: var(--sp-2);
76
+ display: grid;
77
+ gap: var(--sp-2);
78
+ }
79
+ /* The most decision-shaped thing in a pattern file, and until now invisible
80
+ outside it. */
81
+ .kn-conflicts { border-left: 3px solid var(--warn); padding-left: var(--sp-3); display: grid; gap: 4px; }
82
+ .kn-conflicts-head { font-weight: 600; font-size: 13px; }
83
+
84
+ /* --- preview-then-apply --------------------------------------------------- */
85
+ .kn-prune { margin-top: var(--sp-3); display: grid; gap: var(--sp-2); }
86
+ .kn-prune-head { font-weight: 600; font-size: 13px; }
87
+
88
+ /* ── one doc at a time (v1.7.0) ───────────────────────────────────────────── */
89
+ /* The resolver and the derived-reference sweep. Both are probes, so the card is
90
+ read-shaped: a row of results, and a command where a lane would have to run. */
91
+ .kn-one-topic { flex: 1 1 260px; min-width: 0; }
92
+ .kn-one-out { margin-top: var(--sp-2); display: flex; flex-direction: column; gap: 4px; }
93
+ .kn-one-cand {
94
+ display: flex;
95
+ flex-wrap: wrap;
96
+ gap: var(--sp-1) var(--sp-2);
97
+ align-items: baseline;
98
+ padding-left: var(--sp-2);
99
+ }
100
+ .kn-one-sweep {
101
+ margin-top: var(--sp-3);
102
+ border-top: 1px solid var(--line-soft);
103
+ padding-top: var(--sp-2);
104
+ }
105
+ .kn-one-ref {
106
+ display: flex;
107
+ flex-wrap: wrap;
108
+ gap: var(--sp-1) var(--sp-2);
109
+ align-items: baseline;
110
+ padding: 3px 0;
111
+ }
112
+ .kn-one-fix { padding-left: var(--sp-4); }
113
+
114
+ @media (max-width: 720px) {
115
+ .kn-one-ref, .kn-one-cand { flex-direction: column; align-items: flex-start; gap: 2px; }
116
+ }
117
+
118
+ /* ── the Code graph tab (v1.9.2) ──────────────────────────────────────────── */
119
+ /* Six cards: the state ladder, the pipeline, an example graph, the numbers, the
120
+ cost bars and the glossary. Every moving part is listed again in the ONE
121
+ reduced-motion block in 04-motion.css. The three INFINITE ones — the ladder
122
+ beacon, the pipeline dots and the edge pulses — are removed there with
123
+ `display: none`, because a capped infinite animation freezes mid-cycle. */
124
+
125
+ .cg-sub {
126
+ margin-top: var(--sp-4);
127
+ margin-bottom: var(--sp-2);
128
+ font-size: 11px;
129
+ font-weight: 600;
130
+ color: var(--text-faint);
131
+ text-transform: uppercase;
132
+ letter-spacing: .06em;
133
+ }
134
+ @keyframes cg-rise {
135
+ from { opacity: 0; transform: translateY(10px); }
136
+ to { opacity: 1; transform: none; }
137
+ }
138
+ @keyframes cg-pop {
139
+ 0% { opacity: 0; transform: scale(.6); }
140
+ 70% { opacity: 1; transform: scale(1.08); }
141
+ 100% { opacity: 1; transform: none; }
142
+ }
143
+
144
+ /* --- 1. the state ladder -------------------------------------------------- */
145
+ .cg-ladder {
146
+ display: grid;
147
+ grid-template-columns: minmax(0, 1fr) repeat(3, minmax(70px, .6fr) minmax(0, 1fr));
148
+ align-items: stretch;
149
+ margin-top: var(--sp-3);
150
+ }
151
+ .cg-step {
152
+ --c: var(--idle);
153
+ position: relative;
154
+ display: flex;
155
+ flex-direction: column;
156
+ align-items: center;
157
+ text-align: center;
158
+ gap: 6px;
159
+ padding: var(--sp-3) var(--sp-2);
160
+ border: 1px solid var(--line-soft);
161
+ border-radius: var(--radius);
162
+ background: var(--surface);
163
+ opacity: .62;
164
+ animation: cg-rise 420ms var(--ease) calc(var(--i, 0) * 110ms) backwards;
165
+ transition: opacity var(--dur) var(--ease), border-color var(--dur) var(--ease);
166
+ }
167
+ .cg-step:hover { opacity: 1; }
168
+ .cg-step-none { --c: var(--accent); }
169
+ .cg-step-fresh { --c: var(--ok); }
170
+ .cg-step-drifted { --c: var(--warn); }
171
+ .cg-step-now {
172
+ opacity: 1;
173
+ border-color: var(--c);
174
+ background: linear-gradient(180deg, var(--surface-2), var(--surface));
175
+ box-shadow: 0 0 0 1px var(--c) inset;
176
+ }
177
+ .cg-step-dot {
178
+ position: relative;
179
+ width: 14px;
180
+ height: 14px;
181
+ border-radius: 50%;
182
+ background: var(--c);
183
+ }
184
+ /* The current state sends a ring outward — the first INFINITE animation. */
185
+ .cg-beacon {
186
+ position: absolute;
187
+ inset: -2px;
188
+ border-radius: 50%;
189
+ border: 2px solid var(--c);
190
+ animation: cg-ping 2.2s var(--ease) infinite;
191
+ }
192
+ @keyframes cg-ping {
193
+ 0% { transform: scale(1); opacity: .9; }
194
+ 80% { transform: scale(2.6); opacity: 0; }
195
+ 100% { transform: scale(2.6); opacity: 0; }
196
+ }
197
+ .cg-step-word { font-family: var(--mono); font-weight: 700; font-size: 13px; letter-spacing: .06em; color: var(--c); }
198
+ .cg-step-what { font-size: 12px; color: var(--text-dim); line-height: 1.4; }
199
+ .cg-step-here {
200
+ margin-top: 2px;
201
+ font-size: 10px;
202
+ font-weight: 700;
203
+ text-transform: uppercase;
204
+ letter-spacing: .08em;
205
+ padding: 2px 8px;
206
+ border-radius: 999px;
207
+ color: var(--bg);
208
+ background: var(--c);
209
+ }
210
+ .cg-step-link {
211
+ display: flex;
212
+ flex-direction: column;
213
+ align-items: center;
214
+ justify-content: center;
215
+ gap: 6px;
216
+ padding: 0 4px;
217
+ }
218
+ .cg-step-line {
219
+ display: block;
220
+ width: 100%;
221
+ height: 2px;
222
+ border-radius: 1px;
223
+ background: linear-gradient(90deg, var(--line), var(--text-faint));
224
+ transform-origin: left center;
225
+ animation: cg-draw-x 380ms var(--ease) calc(var(--i, 0) * 110ms + 220ms) backwards;
226
+ }
227
+ @keyframes cg-draw-x { from { transform: scaleX(0); } }
228
+ @keyframes cg-draw-y { from { transform: scaleY(0); } }
229
+ .cg-step-next { font-size: 11px; color: var(--text-faint); text-align: center; line-height: 1.3; }
230
+ .cg-loop {
231
+ margin-top: var(--sp-2);
232
+ text-align: right;
233
+ font-size: 12px;
234
+ color: var(--text-dim);
235
+ }
236
+ .cg-now {
237
+ display: flex;
238
+ flex-wrap: wrap;
239
+ align-items: center;
240
+ gap: var(--sp-2) var(--sp-3);
241
+ margin-top: var(--sp-3);
242
+ padding: var(--sp-3);
243
+ border-radius: var(--radius-sm);
244
+ border-left: 3px solid var(--idle);
245
+ background: var(--idle-wash);
246
+ }
247
+ .cg-now > div { flex: 1 1 260px; }
248
+ .cg-now .cmd { margin: 0; }
249
+ .cg-now-fresh { border-left-color: var(--ok); background: var(--ok-wash); }
250
+ .cg-now-drifted { border-left-color: var(--warn); background: var(--warn-wash); }
251
+ .cg-now-none { border-left-color: var(--accent); background: var(--accent-wash); }
252
+ .cg-line { white-space: pre-wrap; word-break: break-word; }
253
+
254
+ /* --- 2. the pipeline ------------------------------------------------------ */
255
+ .cg-flow {
256
+ display: grid;
257
+ grid-template-columns: minmax(0, 1fr) repeat(4, 34px minmax(0, 1fr));
258
+ align-items: stretch;
259
+ margin-top: var(--sp-3);
260
+ }
261
+ .cg-station {
262
+ --c: var(--accent);
263
+ position: relative;
264
+ display: flex;
265
+ flex-direction: column;
266
+ gap: 4px;
267
+ padding: var(--sp-3);
268
+ border: 1px solid var(--line-soft);
269
+ border-top: 3px solid var(--c);
270
+ border-radius: var(--radius);
271
+ background: var(--surface);
272
+ animation: cg-rise 460ms var(--ease) calc(var(--i, 0) * 140ms) backwards;
273
+ transition: transform var(--dur) var(--ease), border-color var(--dur) var(--ease);
274
+ }
275
+ .cg-station:hover { transform: translateY(-3px); border-color: var(--c); }
276
+ .cg-cost-free { --c: var(--ok); }
277
+ .cg-cost-paid { --c: var(--warn); }
278
+ .cg-station-num {
279
+ position: absolute;
280
+ top: 8px;
281
+ right: 10px;
282
+ font-size: 11px;
283
+ font-weight: 700;
284
+ color: var(--text-faint);
285
+ font-variant-numeric: tabular-nums;
286
+ }
287
+ .cg-station-glyph {
288
+ display: inline-grid;
289
+ place-items: center;
290
+ width: 44px;
291
+ height: 34px;
292
+ border-radius: var(--radius-sm);
293
+ font-family: var(--mono);
294
+ font-weight: 700;
295
+ font-size: 14px;
296
+ color: var(--c);
297
+ background: var(--surface-2);
298
+ border: 1px solid var(--line-soft);
299
+ }
300
+ .cg-station-name { font-weight: 600; font-size: 14px; }
301
+ .cg-station-what { font-size: 12px; color: var(--text-dim); line-height: 1.45; }
302
+ .cg-station-value {
303
+ margin-top: auto;
304
+ padding-top: 4px;
305
+ font-family: var(--mono);
306
+ font-size: 12px;
307
+ color: var(--c);
308
+ }
309
+ .cg-link { position: relative; align-self: center; height: 2px; margin: 0 4px; background: var(--line); }
310
+ /* Three dots run station to station — the second INFINITE animation. */
311
+ .cg-link-dot {
312
+ position: absolute;
313
+ top: -3px;
314
+ left: 0;
315
+ width: 8px;
316
+ height: 8px;
317
+ border-radius: 50%;
318
+ background: var(--accent);
319
+ box-shadow: 0 0 8px var(--accent);
320
+ opacity: 0;
321
+ animation: cg-travel-x 1.8s linear calc(var(--i, 1) * 180ms + var(--k, 0) * 600ms) infinite;
322
+ }
323
+ @keyframes cg-travel-x {
324
+ 0% { left: -4px; opacity: 0; }
325
+ 15% { opacity: 1; }
326
+ 85% { opacity: 1; }
327
+ 100% { left: calc(100% - 4px); opacity: 0; }
328
+ }
329
+ @keyframes cg-travel-y {
330
+ 0% { top: -4px; opacity: 0; }
331
+ 15% { opacity: 1; }
332
+ 85% { opacity: 1; }
333
+ 100% { top: calc(100% - 4px); opacity: 0; }
334
+ }
335
+ .cg-notes-layer {
336
+ display: flex;
337
+ flex-wrap: wrap;
338
+ align-items: baseline;
339
+ gap: var(--sp-2);
340
+ margin-top: var(--sp-3);
341
+ padding: var(--sp-2) var(--sp-3);
342
+ border: 1px dashed var(--line);
343
+ border-radius: var(--radius-sm);
344
+ font-size: 13px;
345
+ color: var(--text-dim);
346
+ }
347
+ .cg-notes-tag {
348
+ font-size: 10px;
349
+ font-weight: 700;
350
+ text-transform: uppercase;
351
+ letter-spacing: .08em;
352
+ padding: 2px 8px;
353
+ border-radius: 999px;
354
+ color: var(--warn);
355
+ background: var(--warn-wash);
356
+ }
357
+
358
+ /* --- 3. the example graph ------------------------------------------------- */
359
+ .cg-anatomy { display: grid; grid-template-columns: minmax(0, 1fr) 260px; gap: var(--sp-3) var(--sp-4); margin-top: var(--sp-3); }
360
+ .cg-anatomy-scroll { grid-column: 1; grid-row: 1; }
361
+ .cg-caption { grid-column: 1; grid-row: 2; }
362
+ .cg-legend { grid-column: 2; grid-row: 1 / span 2; }
363
+ .cg-svg {
364
+ display: block;
365
+ width: 100%;
366
+ min-width: 560px;
367
+ height: auto;
368
+ border: 1px solid var(--line-soft);
369
+ border-radius: var(--radius);
370
+ background: radial-gradient(circle at 50% 40%, var(--surface-2) 0%, var(--surface) 70%);
371
+ }
372
+ .cg-file { animation: cg-fade 480ms var(--ease) var(--d, 0ms) backwards; }
373
+ .cg-file rect { fill: var(--surface-2); stroke: var(--line); stroke-width: 1; }
374
+ .cg-file-name { fill: var(--text-faint); font-family: var(--mono); font-size: 11px; }
375
+ .cg-edge { transition: opacity var(--dur) var(--ease); }
376
+ .cg-edge-line { fill: none; stroke-width: 1.6; }
377
+ .cg-edge-call .cg-edge-line {
378
+ stroke: var(--accent-dim);
379
+ stroke-dasharray: 1;
380
+ animation: cg-edge-draw 620ms var(--ease) var(--d, 0ms) backwards;
381
+ }
382
+ .cg-edge-ref .cg-edge-line { stroke: var(--warn); stroke-dasharray: 5 4; animation: cg-fade 500ms var(--ease) var(--d, 0ms) backwards; }
383
+ .cg-edge-import .cg-edge-line { stroke: var(--text-faint); stroke-dasharray: 1.5 4; stroke-linecap: round; animation: cg-fade 500ms var(--ease) var(--d, 0ms) backwards; }
384
+ @keyframes cg-edge-draw { from { stroke-dashoffset: 1; opacity: 0; } to { stroke-dashoffset: 0; opacity: 1; } }
385
+ @keyframes cg-fade { from { opacity: 0; } }
386
+ .cg-head-call { fill: var(--accent-dim); }
387
+ .cg-head-ref { fill: var(--warn); }
388
+ /* A short bright dash runs along every call, caller to callee — the third
389
+ INFINITE animation. */
390
+ .cg-pulse {
391
+ fill: none;
392
+ stroke: var(--accent);
393
+ stroke-width: 3.5;
394
+ stroke-linecap: round;
395
+ stroke-dasharray: .06 .94;
396
+ animation: cg-run 2.6s linear var(--d, 0ms) infinite backwards;
397
+ }
398
+ @keyframes cg-run {
399
+ 0% { stroke-dashoffset: 1; opacity: 0; }
400
+ 10% { opacity: 1; }
401
+ 90% { opacity: 1; }
402
+ 100% { stroke-dashoffset: 0; opacity: 0; }
403
+ }
404
+ .cg-sym { cursor: pointer; outline: none; transform-box: fill-box; transform-origin: center; animation: cg-pop 480ms var(--ease) var(--d, 0ms) backwards; }
405
+ .cg-sym-halo { fill: var(--accent-wash); stroke: var(--accent); stroke-width: 1; opacity: 0; transition: opacity var(--dur) var(--ease); }
406
+ .cg-sym-dot { fill: var(--accent); stroke: var(--surface); stroke-width: 2.5; transition: fill var(--dur) var(--ease); }
407
+ .cg-sym-name { fill: var(--text); font-family: var(--mono); font-size: 12px; font-weight: 600; pointer-events: none; }
408
+ .cg-sym:hover .cg-sym-halo, .cg-sym:focus-visible .cg-sym-halo, .cg-sym-hi .cg-sym-halo { opacity: 1; }
409
+ .cg-sym:focus-visible .cg-sym-dot { stroke: var(--text); }
410
+ /* Point at a dot: its edges light up and every other edge steps back. */
411
+ .cg-focus .cg-edge { opacity: .18; }
412
+ .cg-focus .cg-edge.cg-edge-hi { opacity: 1; }
413
+ .cg-edge-hi .cg-edge-line { stroke-width: 2.6; }
414
+ .cg-caption {
415
+ display: flex;
416
+ flex-wrap: wrap;
417
+ align-items: baseline;
418
+ gap: var(--sp-1) var(--sp-3);
419
+ min-height: 46px;
420
+ padding: var(--sp-2) var(--sp-3);
421
+ border-radius: var(--radius-sm);
422
+ background: var(--surface-2);
423
+ font-size: 13px;
424
+ }
425
+ .cg-caption-hint { color: var(--text-faint); }
426
+ .cg-caption-sym { color: var(--accent); font-weight: 700; }
427
+ .cg-caption-text { flex: 1 1 240px; }
428
+ .cg-caption-cmd { color: var(--text-faint); font-size: 12px; }
429
+ .cg-legend { display: grid; gap: var(--sp-2); align-content: start; }
430
+ .cg-legend-row { display: grid; grid-template-columns: 36px minmax(0, 1fr); gap: var(--sp-2); align-items: start; }
431
+ .cg-legend-text { display: grid; gap: 2px; font-size: 13px; }
432
+ .cg-lg { display: block; margin-top: 4px; width: 32px; height: 16px; }
433
+ .cg-lg-file { border: 1px solid var(--line); background: var(--surface-2); border-radius: 4px; }
434
+ .cg-lg-sym { width: 14px; height: 14px; margin-left: 9px; border-radius: 50%; background: var(--accent); }
435
+ .cg-lg-call { height: 0; margin-top: 11px; border-top: 2px solid var(--accent-dim); }
436
+ .cg-lg-ref { height: 0; margin-top: 11px; border-top: 2px dashed var(--warn); }
437
+ .cg-lg-import { height: 0; margin-top: 11px; border-top: 2px dotted var(--text-faint); }
438
+
439
+ /* --- 4. the numbers ------------------------------------------------------- */
440
+ .cg-tiles { display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); gap: var(--sp-3); }
441
+ .cg-tile {
442
+ display: grid;
443
+ gap: 2px;
444
+ padding: var(--sp-3) var(--sp-4);
445
+ border: 1px solid var(--line-soft);
446
+ border-radius: var(--radius);
447
+ background: linear-gradient(160deg, var(--surface-2), var(--surface));
448
+ animation: cg-rise 440ms var(--ease) calc(var(--i, 0) * 100ms) backwards;
449
+ }
450
+ .cg-tile-value { font-size: 30px; font-weight: 700; font-variant-numeric: tabular-nums; line-height: 1.1; }
451
+ .cg-tile-label { font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: .05em; color: var(--text-faint); }
452
+ .cg-tile-what { font-size: 12px; color: var(--text-dim); line-height: 1.4; }
453
+ .cg-behind { display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-2); margin-top: var(--sp-3); }
454
+ .cg-behind-label { font-size: 13px; color: var(--text-dim); margin-right: var(--sp-1); }
455
+ .cg-bchip {
456
+ --c: var(--ok);
457
+ display: inline-flex;
458
+ align-items: baseline;
459
+ gap: 6px;
460
+ padding: 4px 10px;
461
+ border-radius: 999px;
462
+ border: 1px solid var(--c);
463
+ font-size: 12px;
464
+ animation: cg-pop 420ms var(--ease) 300ms backwards;
465
+ }
466
+ .cg-bchip strong { color: var(--c); font-family: var(--mono); }
467
+ .cg-b-chg { --c: var(--warn); }
468
+ .cg-b-del { --c: var(--bad); }
469
+ .cg-b-zero { --c: var(--line); color: var(--text-faint); }
470
+ .cg-bar {
471
+ display: flex;
472
+ height: 12px;
473
+ border-radius: 6px;
474
+ overflow: hidden;
475
+ background: var(--line-soft);
476
+ }
477
+ .cg-bar-sm { height: 8px; border-radius: 4px; }
478
+ .cg-bar-lg { height: 18px; border-radius: 9px; }
479
+ .cg-seg { width: var(--w); flex: none; animation: cg-grow 900ms var(--ease) 200ms backwards; }
480
+ @keyframes cg-grow { from { width: 0; } }
481
+ .cg-seg-ok { background: var(--ok); }
482
+ .cg-seg-empty { background: repeating-linear-gradient(135deg, var(--warn) 0 6px, var(--warn-wash) 6px 10px); }
483
+ .cg-seg-card { background: var(--accent); }
484
+ .cg-seg-source { background: var(--accent-dim); }
485
+ .cg-seg-hints { background: var(--warn); }
486
+ .cg-seg-env { background: var(--idle); }
487
+ .cg-seg-low { background: var(--ok); }
488
+ .cg-seg-range { background: repeating-linear-gradient(135deg, var(--ok) 0 6px, var(--ok-wash) 6px 12px); }
489
+ .cg-seg-read { background: linear-gradient(90deg, var(--accent-dim), var(--accent)); }
490
+ .cg-bar-key { display: flex; flex-wrap: wrap; gap: var(--sp-1) var(--sp-4); margin-top: var(--sp-2); font-size: 12px; color: var(--text-dim); }
491
+ .cg-key { display: inline-flex; align-items: center; gap: 6px; }
492
+ .cg-key::before { content: ""; width: 10px; height: 10px; border-radius: 3px; background: var(--kc, var(--idle)); }
493
+ .cg-key-ok { --kc: var(--ok); }
494
+ .cg-key-empty { --kc: var(--warn); }
495
+ .cg-key-card { --kc: var(--accent); }
496
+ .cg-key-source { --kc: var(--accent-dim); }
497
+ .cg-key-hints { --kc: var(--warn); }
498
+ .cg-key-env { --kc: var(--idle); }
499
+ .cg-key-range::before { background: repeating-linear-gradient(135deg, var(--ok) 0 3px, var(--ok-wash) 3px 6px); }
500
+ .cg-langs { display: grid; gap: var(--sp-2); margin-top: var(--sp-3); }
501
+ .cg-lang {
502
+ display: grid;
503
+ grid-template-columns: 70px minmax(0, 1fr) minmax(0, 240px);
504
+ gap: var(--sp-3);
505
+ align-items: center;
506
+ animation: cg-rise 380ms var(--ease) calc(var(--i, 0) * 90ms + 200ms) backwards;
507
+ }
508
+ .cg-lang-name { font-weight: 600; }
509
+ .cg-lang-nums { font-size: 12px; color: var(--text-dim); }
510
+
511
+ /* --- 5. cost and savings -------------------------------------------------- */
512
+ .cg-gain { display: grid; gap: var(--sp-3); margin-top: var(--sp-3); }
513
+ .cg-gain-row { display: grid; grid-template-columns: 190px minmax(0, 1fr) minmax(90px, auto); gap: var(--sp-3); align-items: center; }
514
+ .cg-gain-name { font-size: 13px; font-weight: 600; }
515
+ .cg-gain-val { font-family: var(--mono); font-size: 13px; text-align: right; }
516
+ .cg-reads { display: grid; gap: 6px; }
517
+ .cg-read {
518
+ display: grid;
519
+ grid-template-columns: 90px minmax(80px, 1fr) 90px minmax(0, 2fr);
520
+ gap: var(--sp-3);
521
+ align-items: center;
522
+ padding: 4px 0;
523
+ animation: cg-rise 360ms var(--ease) calc(var(--i, 0) * 60ms + 200ms) backwards;
524
+ }
525
+ .cg-read-cmd { font-weight: 700; color: var(--accent); }
526
+ .cg-read-n { font-family: var(--mono); font-size: 12px; text-align: right; }
527
+ .cg-read-what { font-size: 12px; color: var(--text-dim); }
528
+ .cg-read-never .cg-read-cmd, .cg-read-never .cg-read-n { color: var(--text-faint); }
529
+ .cg-read-never .cg-read-n { font-family: var(--font); font-style: italic; }
530
+
531
+ /* --- 6. the glossary ------------------------------------------------------ */
532
+ .cg-gloss { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: var(--sp-3); margin-top: var(--sp-3); }
533
+ .cg-gloss-group {
534
+ padding: var(--sp-3);
535
+ border: 1px solid var(--line-soft);
536
+ border-radius: var(--radius);
537
+ background: var(--surface);
538
+ animation: cg-rise 420ms var(--ease) calc(var(--i, 0) * 110ms) backwards;
539
+ }
540
+ .cg-gloss-head { font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: .06em; color: var(--accent); margin-bottom: var(--sp-2); }
541
+ .cg-gloss-list { display: grid; gap: 8px; margin: 0; }
542
+ .cg-gloss-list dt { font-weight: 600; font-size: 13px; }
543
+ .cg-gloss-list dd { margin: 0; font-size: 12px; color: var(--text-dim); line-height: 1.45; }
544
+
545
+ /* --- narrow screens ------------------------------------------------------- */
546
+ @media (max-width: 900px) {
547
+ .cg-ladder, .cg-flow { grid-template-columns: minmax(0, 1fr); }
548
+ .cg-step-link { flex-direction: row; min-height: 34px; }
549
+ .cg-step-line { width: 2px; height: 22px; transform-origin: center top; animation-name: cg-draw-y; }
550
+ .cg-link { width: 2px; height: 28px; margin: 4px auto; }
551
+ .cg-link-dot { top: 0; left: -3px; animation-name: cg-travel-y; }
552
+ .cg-anatomy { grid-template-columns: minmax(0, 1fr); }
553
+ .cg-legend { grid-column: 1; grid-row: auto; }
554
+ .cg-loop { text-align: left; }
555
+ }
556
+ @media (max-width: 720px) {
557
+ .cg-gain-row { grid-template-columns: minmax(0, 1fr); gap: 4px; }
558
+ .cg-gain-val { text-align: left; }
559
+ .cg-read { grid-template-columns: 80px minmax(0, 1fr) 70px; }
560
+ .cg-read-what { grid-column: 1 / -1; }
561
+ .cg-lang { grid-template-columns: 56px minmax(0, 1fr); }
562
+ .cg-lang-nums { grid-column: 1 / -1; }
563
+ }