@12ui/design 0.2.16 → 0.2.17

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 (105) hide show
  1. package/README.md +22 -0
  2. package/dist/branch-client.d.ts +6 -1
  3. package/dist/branch-client.d.ts.map +1 -1
  4. package/dist/branch-client.js +6 -1
  5. package/dist/branch-client.js.map +1 -1
  6. package/dist/branch-status.d.ts.map +1 -1
  7. package/dist/branch-status.js +3 -2
  8. package/dist/branch-status.js.map +1 -1
  9. package/dist/branch-winner.d.ts +31 -0
  10. package/dist/branch-winner.d.ts.map +1 -0
  11. package/dist/branch-winner.js +121 -0
  12. package/dist/branch-winner.js.map +1 -0
  13. package/dist/cli-arguments.d.ts +1 -0
  14. package/dist/cli-arguments.d.ts.map +1 -1
  15. package/dist/cli-arguments.js +4 -3
  16. package/dist/cli-arguments.js.map +1 -1
  17. package/dist/cli-branch-command.d.ts +3 -0
  18. package/dist/cli-branch-command.d.ts.map +1 -1
  19. package/dist/cli-branch-command.js +66 -98
  20. package/dist/cli-branch-command.js.map +1 -1
  21. package/dist/cli-capabilities.d.ts +18 -0
  22. package/dist/cli-capabilities.d.ts.map +1 -1
  23. package/dist/cli-capabilities.js +23 -0
  24. package/dist/cli-capabilities.js.map +1 -1
  25. package/dist/cli-convert-command.d.ts +10 -0
  26. package/dist/cli-convert-command.d.ts.map +1 -0
  27. package/dist/cli-convert-command.js +307 -0
  28. package/dist/cli-convert-command.js.map +1 -0
  29. package/dist/cli-corpus-command.d.ts +6 -1
  30. package/dist/cli-corpus-command.d.ts.map +1 -1
  31. package/dist/cli-corpus-command.js +17 -21
  32. package/dist/cli-corpus-command.js.map +1 -1
  33. package/dist/cli-create-command.d.ts +5 -1
  34. package/dist/cli-create-command.d.ts.map +1 -1
  35. package/dist/cli-create-command.js +28 -12
  36. package/dist/cli-create-command.js.map +1 -1
  37. package/dist/cli-detach.d.ts.map +1 -1
  38. package/dist/cli-detach.js +10 -2
  39. package/dist/cli-detach.js.map +1 -1
  40. package/dist/cli-draft-command.d.ts +7 -0
  41. package/dist/cli-draft-command.d.ts.map +1 -1
  42. package/dist/cli-draft-command.js +6 -4
  43. package/dist/cli-draft-command.js.map +1 -1
  44. package/dist/cli-export-command.d.ts +24 -1
  45. package/dist/cli-export-command.d.ts.map +1 -1
  46. package/dist/cli-export-command.js +6 -3
  47. package/dist/cli-export-command.js.map +1 -1
  48. package/dist/cli-image-batch-command.d.ts +8 -2
  49. package/dist/cli-image-batch-command.d.ts.map +1 -1
  50. package/dist/cli-image-batch-command.js +15 -11
  51. package/dist/cli-image-batch-command.js.map +1 -1
  52. package/dist/cli-image-batch-resume.d.ts +3 -1
  53. package/dist/cli-image-batch-resume.d.ts.map +1 -1
  54. package/dist/cli-image-batch-resume.js +1 -0
  55. package/dist/cli-image-batch-resume.js.map +1 -1
  56. package/dist/cli-image-command.d.ts +3 -1
  57. package/dist/cli-image-command.d.ts.map +1 -1
  58. package/dist/cli-image-command.js +4 -2
  59. package/dist/cli-image-command.js.map +1 -1
  60. package/dist/cli-package-command.d.ts.map +1 -1
  61. package/dist/cli-package-command.js +4 -3
  62. package/dist/cli-package-command.js.map +1 -1
  63. package/dist/cli-refusal.d.ts +20 -0
  64. package/dist/cli-refusal.d.ts.map +1 -0
  65. package/dist/cli-refusal.js +29 -0
  66. package/dist/cli-refusal.js.map +1 -0
  67. package/dist/cli-run.d.ts +4 -0
  68. package/dist/cli-run.d.ts.map +1 -0
  69. package/dist/cli-run.js +215 -0
  70. package/dist/cli-run.js.map +1 -0
  71. package/dist/cli-select-command.d.ts +6 -1
  72. package/dist/cli-select-command.d.ts.map +1 -1
  73. package/dist/cli-select-command.js +9 -7
  74. package/dist/cli-select-command.js.map +1 -1
  75. package/dist/cli-usage.d.ts +17 -0
  76. package/dist/cli-usage.d.ts.map +1 -0
  77. package/dist/cli-usage.js +69 -0
  78. package/dist/cli-usage.js.map +1 -0
  79. package/dist/cli-version.d.ts +2 -0
  80. package/dist/cli-version.d.ts.map +1 -0
  81. package/dist/cli-version.js +8 -0
  82. package/dist/cli-version.js.map +1 -0
  83. package/dist/cli.js +9 -491
  84. package/dist/cli.js.map +1 -1
  85. package/dist/concept-input.d.ts +34 -0
  86. package/dist/concept-input.d.ts.map +1 -0
  87. package/dist/concept-input.js +41 -0
  88. package/dist/concept-input.js.map +1 -0
  89. package/dist/index.d.ts +6 -0
  90. package/dist/index.d.ts.map +1 -1
  91. package/dist/index.js +6 -0
  92. package/dist/index.js.map +1 -1
  93. package/dist/package-client.d.ts +13 -0
  94. package/dist/package-client.d.ts.map +1 -1
  95. package/dist/package-client.js +32 -0
  96. package/dist/package-client.js.map +1 -1
  97. package/dist/run-journal-commands.d.ts +54 -0
  98. package/dist/run-journal-commands.d.ts.map +1 -0
  99. package/dist/run-journal-commands.js +258 -0
  100. package/dist/run-journal-commands.js.map +1 -0
  101. package/dist/run-journal.d.ts +231 -0
  102. package/dist/run-journal.d.ts.map +1 -0
  103. package/dist/run-journal.js +453 -0
  104. package/dist/run-journal.js.map +1 -0
  105. package/package.json +1 -1
@@ -0,0 +1,231 @@
1
+ /**
2
+ * The CLI run journal — the durable record of what the CLI actually did.
3
+ *
4
+ * WHY THIS EXISTS. The product left the shell: `12ui draft` collapsed three
5
+ * commands into one, `branch execute` detaches into its own process group, and
6
+ * a fused convert exports alongside itself. Every measurement pass since has
7
+ * made the same mistake in a new costume — the absence of a command in a shell
8
+ * transcript was read as the absence of work. It is not: the work moved into
9
+ * the CLI, and the shell stopped being able to see it. So the CLI writes down
10
+ * what it did, in the workspace the work belongs to, and that record — not a
11
+ * transcript, not narration — is what a reader scores.
12
+ *
13
+ * WHERE. `<workspace>/journal.jsonl`, one JSON object per line, where the
14
+ * workspace is the durable directory the command operates on: a draft run
15
+ * directory, a branch out-dir, a convert or export output directory. Commands
16
+ * with no workspace (`auth status`, `capabilities`, `create claim`, `mcp`) do
17
+ * not journal — see `run-journal-commands.ts`, which enumerates the whole
18
+ * surface and states a reason for every command that skips.
19
+ *
20
+ * ORDER AND DURABILITY.
21
+ * - Append-only. A line, once written, is never rewritten or removed.
22
+ * - Every append is ONE `write(2)` of a complete line under
23
+ * {@link RUN_JOURNAL_MAX_LINE_BYTES} to a descriptor opened `O_APPEND`, so
24
+ * concurrent appenders — the detached `branch execute` worker and the parent
25
+ * that spawned it share one file — never interleave mid-line.
26
+ * - Appends are synchronous so a line survives `process.exit` and so an exit
27
+ * backstop can close an unfinished command's record.
28
+ * - A reader must tolerate a torn final line: a writer can be interrupted
29
+ * between the append and the newline. {@link readRunJournal} reports it
30
+ * rather than throwing.
31
+ * - The journal never creates a directory. A workspace that never came into
32
+ * existence has no journal, which is the truthful record — nothing durable
33
+ * happened. Lines written before the workspace exists are held and flushed
34
+ * the moment it does.
35
+ *
36
+ * LINE SCHEMA v1. Field order below is the serialized order; readers must not
37
+ * depend on it.
38
+ *
39
+ * v always 1. A reader that does not know a version SKIPS the
40
+ * line and counts it, rather than guessing.
41
+ * ts ISO-8601 UTC, taken when the EVENT happened, which may be
42
+ * earlier than the append if the workspace appeared late.
43
+ * Wall clocks across processes are not ordered; file order
44
+ * is. Read order from the file, never from `ts`.
45
+ * cmd canonical command name: `branch execute`, `convert`,
46
+ * `convert package`, `draft status`. Never raw argv.
47
+ * args_digest sha256 of the normalized argv (positional order kept,
48
+ * flags sorted, values of sensitive flags replaced before
49
+ * hashing so the digest is stable across key rotation).
50
+ * Argv itself is never written down.
51
+ * run_id the service-side identity this command operates on, when
52
+ * it has one: a branch/create run id, a conversion id.
53
+ * idempotency_key the key that makes the paid call replayable.
54
+ * paid whether this command CAN spend money. A property of the
55
+ * command, not of the outcome.
56
+ * event "start" at command begin, "end" at exit.
57
+ * outcome end lines only: "ok" | "refused" | "error". A refusal is
58
+ * the CLI declining with nothing started (see
59
+ * `cli-refusal.ts`); an error is a failure.
60
+ * error_class end lines only, and only when not "ok". A closed
61
+ * vocabulary slug — never message text, never a path or an
62
+ * id. See {@link classifyRunJournalError}.
63
+ * artifacts paths this command produced. The AUTHORITATIVE records
64
+ * (a completion sentinel, a manifest, the written output),
65
+ * not every file: the records name the rest, and the line
66
+ * has a byte budget.
67
+ * purchased ids of anything bought — conversion ids, run ids, package
68
+ * ids.
69
+ * terminal whether the RUN this workspace holds is in a terminal
70
+ * state after this event, as best this command knows. A
71
+ * start line is never terminal. A dispatcher that detached
72
+ * is never terminal — its worker owns the answer.
73
+ * detached whether this process handed the run to a background
74
+ * worker and returned before the work finished. The worker
75
+ * appends its own start/end pair to the same file with
76
+ * `detached: false` and its own `pid`; the two are told
77
+ * apart by `pid` and by the worker's argv digest, which
78
+ * covers the `--wait` the dispatcher appended.
79
+ * pid the appending process.
80
+ *
81
+ * FORWARD COMPATIBILITY. Fields are added, never repurposed or removed, and a
82
+ * new field is always optional. Readers ignore fields they do not know, skip
83
+ * lines whose `v` they do not know, and tolerate a torn final line. Anything
84
+ * that changes the meaning of an existing field takes `v: 2`, and this header
85
+ * is where that is written down.
86
+ */
87
+ export declare const RUN_JOURNAL_VERSION = 1;
88
+ export declare const RUN_JOURNAL_FILENAME = "journal.jsonl";
89
+ /**
90
+ * A single small append cannot be split by the kernel, which is what keeps
91
+ * concurrent appenders from interleaving. 4 KiB is the conventional page-sized
92
+ * budget and is far more than a line of identities needs.
93
+ */
94
+ export declare const RUN_JOURNAL_MAX_LINE_BYTES = 4096;
95
+ /** How many entries `artifacts` and `purchased` carry before they are trimmed. */
96
+ export declare const RUN_JOURNAL_MAX_LIST_ENTRIES = 16;
97
+ /**
98
+ * The last element of a list that did not fit. Trimming is visible rather than
99
+ * silent: a journal that names fewer paths is recoverable, a journal that
100
+ * failed to append is not.
101
+ */
102
+ export declare const RUN_JOURNAL_TRUNCATION_MARKER = "<truncated>";
103
+ /** Written in place of a sensitive flag's value before the digest is taken. */
104
+ export declare const RUN_JOURNAL_REDACTED = "<redacted>";
105
+ export type RunJournalEventKind = 'start' | 'end';
106
+ export type RunJournalOutcome = 'ok' | 'refused' | 'error';
107
+ export type RunJournalEntry = {
108
+ v: typeof RUN_JOURNAL_VERSION;
109
+ ts: string;
110
+ cmd: string;
111
+ args_digest: string;
112
+ run_id?: string;
113
+ idempotency_key?: string;
114
+ paid: boolean;
115
+ event: RunJournalEventKind;
116
+ outcome?: RunJournalOutcome;
117
+ error_class?: string;
118
+ artifacts?: string[];
119
+ purchased?: string[];
120
+ terminal: boolean;
121
+ detached: boolean;
122
+ pid: number;
123
+ };
124
+ /**
125
+ * Credentials are redacted before the digest is taken so two runs of the same
126
+ * command share a digest across a key rotation, and so no secret is ever inside
127
+ * a hash the journal publishes. Identities that are not secrets —
128
+ * `--idempotency-key` above all — are deliberately NOT redacted: they are what
129
+ * ties a line to a paid call.
130
+ */
131
+ export declare const isSensitiveFlagName: (name: string) => boolean;
132
+ export type NormalizedArgv = {
133
+ command: string[];
134
+ flags: [string, string | true][];
135
+ };
136
+ /**
137
+ * Tolerant on purpose. The digest is taken before anything is validated, so an
138
+ * argv the real parser would reject still produces a stable digest instead of
139
+ * throwing inside the instrument.
140
+ */
141
+ export declare const normalizeArgv: (argv: readonly string[]) => NormalizedArgv;
142
+ export declare const argsDigest: (argv: readonly string[]) => string;
143
+ /**
144
+ * The line as it goes to disk: lists trimmed to the entry cap, then trimmed
145
+ * again — visibly — until the whole line fits the single-write budget.
146
+ */
147
+ export declare const buildRunJournalLine: (entry: RunJournalEntry) => string;
148
+ /**
149
+ * ONE `write(2)` of the whole line to an `O_APPEND` descriptor. Everything
150
+ * about concurrent appenders rests on this staying a single write: a loop that
151
+ * retried a short write would be exactly the tear this prevents.
152
+ */
153
+ export declare const appendRunJournalLine: (file: string, line: string) => void;
154
+ export declare const runJournalPath: (workspace: string) => string;
155
+ export type RunJournalLineResult = {
156
+ ok: true;
157
+ entry: RunJournalEntry;
158
+ } | {
159
+ ok: false;
160
+ reason: 'malformed' | 'unsupported-version';
161
+ };
162
+ export declare const parseRunJournalLine: (line: string) => RunJournalLineResult;
163
+ export type RunJournalReadResult = {
164
+ entries: RunJournalEntry[];
165
+ /** The file did not end in a newline: a writer was cut mid-append. */
166
+ torn: boolean;
167
+ /** Lines a v1 reader could not use, kept as a count rather than dropped. */
168
+ skipped: {
169
+ line: number;
170
+ reason: 'malformed' | 'unsupported-version';
171
+ }[];
172
+ };
173
+ export declare const parseRunJournal: (contents: string) => RunJournalReadResult;
174
+ export declare const readRunJournal: (target: {
175
+ workspace: string;
176
+ } | {
177
+ file: string;
178
+ }) => Promise<RunJournalReadResult>;
179
+ /**
180
+ * A closed vocabulary, so a reader can bucket without reading prose and so no
181
+ * path, id, or user text ever reaches the journal through an error message.
182
+ * Refusals carry their own declared code; everything else lands on a shape.
183
+ */
184
+ export declare const classifyRunJournalError: (error: unknown) => {
185
+ outcome: Exclude<RunJournalOutcome, "ok">;
186
+ errorClass: string;
187
+ };
188
+ /** What a command tells the journal while it runs. */
189
+ export type RunJournalFacts = {
190
+ /** Bind a workspace that only existed once the command created it. */
191
+ workspace?: string;
192
+ runId?: string;
193
+ idempotencyKey?: string;
194
+ artifacts?: readonly string[];
195
+ purchased?: readonly string[];
196
+ /** The run's state as this command observed it. */
197
+ terminal?: boolean;
198
+ };
199
+ export type RunJournalNotes = {
200
+ note: (facts: RunJournalFacts) => void;
201
+ };
202
+ export type RunJournalPlan = {
203
+ cmd: string;
204
+ argv: readonly string[];
205
+ paid: boolean;
206
+ detached: boolean;
207
+ /** Absolute, when the workspace is known before the command runs. */
208
+ workspace?: string;
209
+ runId?: string;
210
+ idempotencyKey?: string;
211
+ /** Whether a successful run of this command leaves the run terminal. */
212
+ terminalOnSuccess: boolean;
213
+ };
214
+ export type RunJournalSession = RunJournalNotes & {
215
+ end: (result: {
216
+ outcome: RunJournalOutcome;
217
+ error?: unknown;
218
+ }) => void;
219
+ };
220
+ /**
221
+ * Opens the record for one command: writes (or holds) the start line now and
222
+ * owns the end line, including the backstop for a command that leaves through
223
+ * `process.exit` instead of returning.
224
+ */
225
+ export declare const openRunJournal: (plan: RunJournalPlan) => RunJournalSession;
226
+ /**
227
+ * Run one command inside its journal. A command with no workspace runs against
228
+ * a no-op session, so the caller never branches on whether it journals.
229
+ */
230
+ export declare const withRunJournal: <T>(plan: RunJournalPlan | null, run: (journal: RunJournalNotes) => Promise<T>) => Promise<T>;
231
+ //# sourceMappingURL=run-journal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-journal.d.ts","sourceRoot":"","sources":["../src/run-journal.ts"],"names":[],"mappings":"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"}