lockwire 0.1.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.
Files changed (79) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +327 -0
  3. package/dist/actions.d.ts +67 -0
  4. package/dist/actions.d.ts.map +1 -0
  5. package/dist/actions.js +430 -0
  6. package/dist/actions.js.map +1 -0
  7. package/dist/actor.d.ts +4 -0
  8. package/dist/actor.d.ts.map +1 -0
  9. package/dist/actor.js +14 -0
  10. package/dist/actor.js.map +1 -0
  11. package/dist/cli.d.ts +3 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +192 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/config.d.ts +5 -0
  16. package/dist/config.d.ts.map +1 -0
  17. package/dist/config.js +27 -0
  18. package/dist/config.js.map +1 -0
  19. package/dist/extract.d.ts +16 -0
  20. package/dist/extract.d.ts.map +1 -0
  21. package/dist/extract.js +349 -0
  22. package/dist/extract.js.map +1 -0
  23. package/dist/format.d.ts +5 -0
  24. package/dist/format.d.ts.map +1 -0
  25. package/dist/format.js +65 -0
  26. package/dist/format.js.map +1 -0
  27. package/dist/grammar.d.ts +6 -0
  28. package/dist/grammar.d.ts.map +1 -0
  29. package/dist/grammar.js +45 -0
  30. package/dist/grammar.js.map +1 -0
  31. package/dist/hash.d.ts +12 -0
  32. package/dist/hash.d.ts.map +1 -0
  33. package/dist/hash.js +34 -0
  34. package/dist/hash.js.map +1 -0
  35. package/dist/hook-claude.d.ts +6 -0
  36. package/dist/hook-claude.d.ts.map +1 -0
  37. package/dist/hook-claude.js +50 -0
  38. package/dist/hook-claude.js.map +1 -0
  39. package/dist/hook-codex.d.ts +8 -0
  40. package/dist/hook-codex.d.ts.map +1 -0
  41. package/dist/hook-codex.js +52 -0
  42. package/dist/hook-codex.js.map +1 -0
  43. package/dist/hook-common.d.ts +23 -0
  44. package/dist/hook-common.d.ts.map +1 -0
  45. package/dist/hook-common.js +72 -0
  46. package/dist/hook-common.js.map +1 -0
  47. package/dist/index.d.ts +12 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +12 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/ledger.d.ts +13 -0
  52. package/dist/ledger.d.ts.map +1 -0
  53. package/dist/ledger.js +69 -0
  54. package/dist/ledger.js.map +1 -0
  55. package/dist/lockfile.d.ts +9 -0
  56. package/dist/lockfile.d.ts.map +1 -0
  57. package/dist/lockfile.js +40 -0
  58. package/dist/lockfile.js.map +1 -0
  59. package/dist/markers.d.ts +18 -0
  60. package/dist/markers.d.ts.map +1 -0
  61. package/dist/markers.js +89 -0
  62. package/dist/markers.js.map +1 -0
  63. package/dist/mcp-server.d.ts +2 -0
  64. package/dist/mcp-server.d.ts.map +1 -0
  65. package/dist/mcp-server.js +69 -0
  66. package/dist/mcp-server.js.map +1 -0
  67. package/dist/repo.d.ts +14 -0
  68. package/dist/repo.d.ts.map +1 -0
  69. package/dist/repo.js +75 -0
  70. package/dist/repo.js.map +1 -0
  71. package/dist/types.d.ts +100 -0
  72. package/dist/types.d.ts.map +1 -0
  73. package/dist/types.js +11 -0
  74. package/dist/types.js.map +1 -0
  75. package/grammars/tree-sitter-javascript.wasm +0 -0
  76. package/grammars/tree-sitter-python.wasm +0 -0
  77. package/grammars/tree-sitter-tsx.wasm +0 -0
  78. package/grammars/tree-sitter-typescript.wasm +0 -0
  79. package/package.json +75 -0
@@ -0,0 +1,430 @@
1
+ import { existsSync } from "node:fs";
2
+ import { readFile, writeFile } from "node:fs/promises";
3
+ import { computeWholeFileTiers, extractFileSymbols, fileExportsFingerprint } from "./extract.js";
4
+ import { langForPath, parserFor } from "./grammar.js";
5
+ import { fingerprint, fingerprintSet } from "./hash.js";
6
+ import { appendEvent, historyFor, readLedger } from "./ledger.js";
7
+ import { anchorsForPath, newAnchorId, readLockfile, removeAnchor, upsertAnchor, writeLockfile, } from "./lockfile.js";
8
+ import { scanMarkers, stampMarkerLine } from "./markers.js";
9
+ import { globToRegExp, matchesAny, toRepoRelative, walkFiles } from "./repo.js";
10
+ import { ALL_TIERS } from "./types.js";
11
+ /** Recomputes all four tier fingerprints for a target, or reports it unresolved (file/symbol not found). */
12
+ export async function resolveTarget(repoRoot, target, config) {
13
+ const absPath = `${repoRoot}/${target.path}`;
14
+ if (!existsSync(absPath))
15
+ return null;
16
+ const lang = langForPath(target.path);
17
+ if (!lang)
18
+ throw new Error(`lockwire supports TypeScript, TSX, JavaScript, and Python in P0 — "${target.path}" is none of these`);
19
+ const content = await readFile(absPath, "utf8");
20
+ const parser = await parserFor(lang);
21
+ const tree = parser.parse(content);
22
+ if (!tree)
23
+ throw new Error(`failed to parse ${target.path}`);
24
+ const root = tree.rootNode;
25
+ const symbols = extractFileSymbols(root, lang, config.normalizeLocals);
26
+ const pathFp = fingerprint(target.path);
27
+ if (target.symbol) {
28
+ const symbol = symbols.bySymbolPath.get(target.symbol);
29
+ if (!symbol)
30
+ return { found: false, fingerprints: { path: pathFp, sig: "", body: "", deps: "" }, symbols };
31
+ return {
32
+ found: true,
33
+ fingerprints: {
34
+ path: pathFp,
35
+ sig: fingerprint(symbol.sigTokens),
36
+ body: fingerprint(symbol.bodyNormalized),
37
+ deps: fingerprintSet(symbol.deps),
38
+ },
39
+ symbols,
40
+ };
41
+ }
42
+ const whole = computeWholeFileTiers(root, lang, config.normalizeLocals);
43
+ return {
44
+ found: true,
45
+ fingerprints: {
46
+ path: pathFp,
47
+ sig: fileExportsFingerprint(symbols),
48
+ body: fingerprint(whole.bodyNormalized),
49
+ deps: fingerprintSet(whole.deps),
50
+ },
51
+ symbols,
52
+ };
53
+ }
54
+ /** Same-file rename detection: if a symbol vanished but exactly one other symbol in the file shares its `sig` fingerprint, relink to it. Cross-file relocation (the symbol moved to a different file) is not attempted in P0 — see docs/concepts.md limitations. */
55
+ export function findRelocationCandidate(symbols, missingSigFp) {
56
+ const candidates = [];
57
+ for (const [path, symbol] of symbols.bySymbolPath) {
58
+ if (fingerprint(symbol.sigTokens) === missingSigFp)
59
+ candidates.push(path);
60
+ }
61
+ return candidates.length === 1 ? candidates[0] : null;
62
+ }
63
+ /** Scans a markdown doc for `<!-- lockwire ... -->` markers and creates/refreshes their anchors. */
64
+ export async function linkDoc(repoRoot, docPath, config, actor, opts = {}) {
65
+ const absDoc = `${repoRoot}/${docPath}`;
66
+ const text = await readFile(absDoc, "utf8");
67
+ const markers = scanMarkers(text);
68
+ const lockfile = await readLockfile(repoRoot);
69
+ const result = { created: 0, refreshed: 0, skipped: [] };
70
+ const lines = text.split(/\r?\n/);
71
+ let docChanged = false;
72
+ let current = lockfile;
73
+ for (const marker of markers) {
74
+ const existing = marker.id ? current.anchors.find((a) => a.id === marker.id) : undefined;
75
+ if (existing?.status === "drifted" && !opts.reviewed) {
76
+ result.skipped.push({
77
+ reason: "drifted anchor needs --reviewed to re-stamp",
78
+ target: marker.target.path,
79
+ });
80
+ continue;
81
+ }
82
+ const resolved = await resolveTarget(repoRoot, marker.target, config);
83
+ if (!resolved || !resolved.found) {
84
+ result.skipped.push({
85
+ reason: "target not found",
86
+ target: `${marker.target.path}${marker.target.symbol ? `#${marker.target.symbol}` : ""}`,
87
+ });
88
+ continue;
89
+ }
90
+ const tiers = marker.tiers ?? (marker.target.symbol ? ["sig"] : ["path", "body"]);
91
+ const id = marker.id ?? newAnchorId();
92
+ const anchor = {
93
+ id,
94
+ doc: docPath,
95
+ claim: { line: marker.claimLine, hash: marker.claimHash, excerpt: marker.claimExcerpt },
96
+ target: marker.target,
97
+ tiers,
98
+ fingerprints: resolved.fingerprints,
99
+ linked: { at: new Date().toISOString(), commit: opts.commit ?? null, by: actor },
100
+ status: "fresh",
101
+ waiver: null,
102
+ };
103
+ current = upsertAnchor(current, anchor);
104
+ if (!marker.id) {
105
+ const lineIdx = marker.line - 1;
106
+ const original = lines[lineIdx];
107
+ if (original !== undefined) {
108
+ lines[lineIdx] = stampMarkerLine(original, id);
109
+ docChanged = true;
110
+ }
111
+ result.created++;
112
+ await appendEvent(repoRoot, {
113
+ ts: anchor.linked.at,
114
+ event: "anchor.created",
115
+ anchor: id,
116
+ actor,
117
+ commit: opts.commit ?? null,
118
+ });
119
+ }
120
+ else {
121
+ result.refreshed++;
122
+ await appendEvent(repoRoot, {
123
+ ts: anchor.linked.at,
124
+ event: "anchor.resolved",
125
+ anchor: id,
126
+ actor,
127
+ commit: opts.commit ?? null,
128
+ note: "re-stamped via link",
129
+ });
130
+ }
131
+ }
132
+ await writeLockfile(repoRoot, current);
133
+ if (docChanged)
134
+ await writeFile(absDoc, lines.join("\n"), "utf8");
135
+ return result;
136
+ }
137
+ /** `lockwire link <doc> <target>` — a lockfile-only anchor with no inline marker, for whole-doc-to-file bindings. */
138
+ export async function linkLockfileOnly(repoRoot, docPath, target, tiers, config, actor) {
139
+ const resolved = await resolveTarget(repoRoot, target, config);
140
+ if (!resolved || !resolved.found)
141
+ throw new Error(`target not found: ${target.path}${target.symbol ? `#${target.symbol}` : ""}`);
142
+ const lockfile = await readLockfile(repoRoot);
143
+ const anchor = {
144
+ id: newAnchorId(),
145
+ doc: docPath,
146
+ claim: null,
147
+ target,
148
+ tiers,
149
+ fingerprints: resolved.fingerprints,
150
+ linked: { at: new Date().toISOString(), commit: null, by: actor },
151
+ status: "fresh",
152
+ waiver: null,
153
+ };
154
+ await writeLockfile(repoRoot, upsertAnchor(lockfile, anchor));
155
+ await appendEvent(repoRoot, {
156
+ ts: anchor.linked.at,
157
+ event: "anchor.created",
158
+ anchor: anchor.id,
159
+ actor,
160
+ commit: null,
161
+ });
162
+ return anchor;
163
+ }
164
+ export async function check(repoRoot, config, onlyPaths) {
165
+ const lockfile = await readLockfile(repoRoot);
166
+ const now = new Date().toISOString();
167
+ const results = [];
168
+ let current = lockfile;
169
+ for (const anchor of lockfile.anchors) {
170
+ if (onlyPaths && !onlyPaths.includes(anchor.target.path)) {
171
+ results.push({ anchor, status: anchor.status, driftedTiers: [], singleHashWouldFlag: false });
172
+ continue;
173
+ }
174
+ if (anchor.status === "waived" && anchor.waiver) {
175
+ if (anchor.waiver.expires < now) {
176
+ await appendEvent(repoRoot, {
177
+ ts: now,
178
+ event: "waiver.expired",
179
+ anchor: anchor.id,
180
+ actor: { type: "unknown" },
181
+ commit: null,
182
+ });
183
+ const reverted = { ...anchor, status: "drifted", waiver: null };
184
+ current = upsertAnchor(current, reverted);
185
+ results.push({
186
+ anchor: reverted,
187
+ status: "drifted",
188
+ driftedTiers: anchor.tiers,
189
+ singleHashWouldFlag: true,
190
+ });
191
+ }
192
+ else {
193
+ results.push({ anchor, status: "waived", driftedTiers: [], singleHashWouldFlag: false });
194
+ }
195
+ continue;
196
+ }
197
+ if (anchor.status === "superseded") {
198
+ results.push({ anchor, status: "superseded", driftedTiers: [], singleHashWouldFlag: false });
199
+ continue;
200
+ }
201
+ let resolved;
202
+ try {
203
+ resolved = await resolveTarget(repoRoot, anchor.target, config);
204
+ }
205
+ catch {
206
+ resolved = null;
207
+ }
208
+ if (!resolved) {
209
+ const orphaned = { ...anchor, status: "orphaned" };
210
+ if (anchor.status !== "orphaned") {
211
+ current = upsertAnchor(current, orphaned);
212
+ await appendEvent(repoRoot, {
213
+ ts: now,
214
+ event: "anchor.orphaned",
215
+ anchor: anchor.id,
216
+ actor: { type: "unknown" },
217
+ commit: null,
218
+ note: "file not found",
219
+ });
220
+ }
221
+ results.push({
222
+ anchor: orphaned,
223
+ status: "orphaned",
224
+ driftedTiers: [],
225
+ singleHashWouldFlag: true,
226
+ });
227
+ continue;
228
+ }
229
+ if (!resolved.found && anchor.target.symbol) {
230
+ const relocatedTo = resolved.symbols
231
+ ? findRelocationCandidate(resolved.symbols, anchor.fingerprints.sig)
232
+ : null;
233
+ if (relocatedTo) {
234
+ const reResolved = await resolveTarget(repoRoot, { path: anchor.target.path, symbol: relocatedTo }, config);
235
+ const relocated = {
236
+ ...anchor,
237
+ target: { path: anchor.target.path, symbol: relocatedTo },
238
+ fingerprints: reResolved?.fingerprints ?? anchor.fingerprints,
239
+ status: "fresh",
240
+ };
241
+ current = upsertAnchor(current, relocated);
242
+ await appendEvent(repoRoot, {
243
+ ts: now,
244
+ event: "anchor.relocated",
245
+ anchor: anchor.id,
246
+ actor: { type: "unknown" },
247
+ commit: null,
248
+ note: `${anchor.target.symbol} -> ${relocatedTo}`,
249
+ });
250
+ results.push({
251
+ anchor: relocated,
252
+ status: "fresh",
253
+ driftedTiers: [],
254
+ singleHashWouldFlag: true,
255
+ });
256
+ }
257
+ else {
258
+ const orphaned = { ...anchor, status: "orphaned" };
259
+ if (anchor.status !== "orphaned") {
260
+ current = upsertAnchor(current, orphaned);
261
+ await appendEvent(repoRoot, {
262
+ ts: now,
263
+ event: "anchor.orphaned",
264
+ anchor: anchor.id,
265
+ actor: { type: "unknown" },
266
+ commit: null,
267
+ note: "symbol not found",
268
+ });
269
+ }
270
+ results.push({
271
+ anchor: orphaned,
272
+ status: "orphaned",
273
+ driftedTiers: [],
274
+ singleHashWouldFlag: true,
275
+ });
276
+ }
277
+ continue;
278
+ }
279
+ const driftedTiers = anchor.tiers.filter((t) => resolved.fingerprints[t] !== anchor.fingerprints[t]);
280
+ const anyTierChanged = ALL_TIERS.filter((t) => resolved.fingerprints[t] !== anchor.fingerprints[t]);
281
+ if (driftedTiers.length > 0) {
282
+ const drifted = { ...anchor, status: "drifted" };
283
+ if (anchor.status !== "drifted") {
284
+ current = upsertAnchor(current, drifted);
285
+ for (const tier of driftedTiers) {
286
+ await appendEvent(repoRoot, {
287
+ ts: now,
288
+ event: "anchor.drifted",
289
+ anchor: anchor.id,
290
+ actor: { type: "unknown" },
291
+ commit: null,
292
+ tier,
293
+ from: anchor.fingerprints[tier],
294
+ to: resolved.fingerprints[tier],
295
+ });
296
+ }
297
+ }
298
+ results.push({
299
+ anchor: drifted,
300
+ status: "drifted",
301
+ driftedTiers,
302
+ singleHashWouldFlag: anyTierChanged.length > 0,
303
+ });
304
+ }
305
+ else {
306
+ if (anchor.status === "drifted" && anyTierChanged.length === 0) {
307
+ const resolvedAnchor = { ...anchor, status: "fresh" };
308
+ current = upsertAnchor(current, resolvedAnchor);
309
+ await appendEvent(repoRoot, {
310
+ ts: now,
311
+ event: "anchor.resolved",
312
+ anchor: anchor.id,
313
+ actor: { type: "unknown" },
314
+ commit: null,
315
+ });
316
+ results.push({
317
+ anchor: resolvedAnchor,
318
+ status: "fresh",
319
+ driftedTiers: [],
320
+ singleHashWouldFlag: false,
321
+ });
322
+ }
323
+ else {
324
+ results.push({
325
+ anchor,
326
+ status: anchor.status,
327
+ driftedTiers: [],
328
+ singleHashWouldFlag: anyTierChanged.length > 0,
329
+ });
330
+ }
331
+ }
332
+ }
333
+ await writeLockfile(repoRoot, current);
334
+ const singleHashWouldFlag = results.filter((r) => r.singleHashWouldFlag).length;
335
+ const tieredFlagged = results.filter((r) => r.status === "drifted" || r.status === "orphaned").length;
336
+ const reductionPercent = singleHashWouldFlag === 0
337
+ ? 0
338
+ : Math.round(((singleHashWouldFlag - tieredFlagged) / singleHashWouldFlag) * 1000) / 10;
339
+ const summary = {
340
+ anchors: results.length,
341
+ fresh: results.filter((r) => r.status === "fresh").length,
342
+ drifted: results.filter((r) => r.status === "drifted").length,
343
+ relocated: 0,
344
+ orphaned: results.filter((r) => r.status === "orphaned").length,
345
+ waived: results.filter((r) => r.status === "waived").length,
346
+ superseded: results.filter((r) => r.status === "superseded").length,
347
+ noise: { singleHashWouldFlag, tieredFlagged, reductionPercent },
348
+ };
349
+ return { summary, results };
350
+ }
351
+ export async function discoverDocs(repoRoot, config) {
352
+ return walkFiles(repoRoot, config.exclude).filter((p) => matchesAny(p, config.docs));
353
+ }
354
+ export async function ack(repoRoot, anchorId, resolution, note, actor, config) {
355
+ const lockfile = await readLockfile(repoRoot);
356
+ const anchor = lockfile.anchors.find((a) => a.id === anchorId);
357
+ if (!anchor)
358
+ throw new Error(`no anchor ${anchorId}`);
359
+ let updated = anchor;
360
+ if (resolution === "superseded") {
361
+ updated = { ...anchor, status: "superseded" };
362
+ }
363
+ else {
364
+ const resolved = await resolveTarget(repoRoot, anchor.target, config);
365
+ updated = {
366
+ ...anchor,
367
+ status: "fresh",
368
+ fingerprints: resolved?.fingerprints ?? anchor.fingerprints,
369
+ };
370
+ }
371
+ await writeLockfile(repoRoot, upsertAnchor(lockfile, updated));
372
+ await appendEvent(repoRoot, {
373
+ ts: new Date().toISOString(),
374
+ event: "anchor.acknowledged",
375
+ anchor: anchorId,
376
+ actor,
377
+ commit: null,
378
+ note: note ?? resolution,
379
+ });
380
+ return updated;
381
+ }
382
+ export async function waive(repoRoot, anchorId, reason, expires, actor) {
383
+ const lockfile = await readLockfile(repoRoot);
384
+ const anchor = lockfile.anchors.find((a) => a.id === anchorId);
385
+ if (!anchor)
386
+ throw new Error(`no anchor ${anchorId}`);
387
+ const updated = { ...anchor, status: "waived", waiver: { reason, expires, by: actor } };
388
+ await writeLockfile(repoRoot, upsertAnchor(lockfile, updated));
389
+ await appendEvent(repoRoot, {
390
+ ts: new Date().toISOString(),
391
+ event: "waiver.granted",
392
+ anchor: anchorId,
393
+ actor,
394
+ commit: null,
395
+ note: reason,
396
+ });
397
+ return updated;
398
+ }
399
+ export async function unlink(repoRoot, anchorId) {
400
+ const lockfile = await readLockfile(repoRoot);
401
+ await writeLockfile(repoRoot, removeAnchor(lockfile, anchorId));
402
+ }
403
+ export async function refs(repoRoot, path, symbol) {
404
+ const lockfile = await readLockfile(repoRoot);
405
+ return anchorsForPath(lockfile, path).filter((a) => !symbol || a.target.symbol === symbol);
406
+ }
407
+ export async function status(repoRoot, scope) {
408
+ const lockfile = await readLockfile(repoRoot);
409
+ if (!scope)
410
+ return lockfile.anchors;
411
+ const re = globToRegExp(scope);
412
+ return lockfile.anchors.filter((a) => re.test(a.target.path) || (a.doc && re.test(a.doc)));
413
+ }
414
+ export async function history(repoRoot, ref) {
415
+ const lockfile = await readLockfile(repoRoot);
416
+ const records = await readLedger(repoRoot);
417
+ const byId = lockfile.anchors.find((a) => a.id === ref);
418
+ if (byId)
419
+ return { anchors: [byId], events: historyFor(records, byId.id) };
420
+ if (ref.includes("#") || !ref.endsWith(".md")) {
421
+ const [path, symbol] = ref.split("#");
422
+ const matches = lockfile.anchors.filter((a) => a.target.path === path && (!symbol || a.target.symbol === symbol));
423
+ const events = matches.flatMap((a) => historyFor(records, a.id));
424
+ return { anchors: matches, events: events.sort((a, b) => a.ts.localeCompare(b.ts)) };
425
+ }
426
+ const matches = lockfile.anchors.filter((a) => a.doc === ref);
427
+ const events = matches.flatMap((a) => historyFor(records, a.id));
428
+ return { anchors: matches, events: events.sort((a, b) => a.ts.localeCompare(b.ts)) };
429
+ }
430
+ //# sourceMappingURL=actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.js","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Actor } from "./types.js";
2
+ /** Best-effort actor detection for CLI invocations (hooks build their own Actor from stdin JSON instead). */
3
+ export declare function cliActor(): Actor;
4
+ //# sourceMappingURL=actor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actor.d.ts","sourceRoot":"","sources":["../src/actor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,6GAA6G;AAC7G,wBAAgB,QAAQ,IAAI,KAAK,CAWhC"}
package/dist/actor.js ADDED
@@ -0,0 +1,14 @@
1
+ /** Best-effort actor detection for CLI invocations (hooks build their own Actor from stdin JSON instead). */
2
+ export function cliActor() {
3
+ if (process.env.CLAUDE_CODE_ENTRYPOINT || process.env.CLAUDECODE) {
4
+ return { type: "ai", tool: { name: "claude-code" } };
5
+ }
6
+ if (process.env.CODEX_SANDBOX || process.env.CODEX_HOME) {
7
+ return { type: "ai", tool: { name: "codex" } };
8
+ }
9
+ if (process.env.CI) {
10
+ return { type: "unknown", tool: { name: "ci" } };
11
+ }
12
+ return { type: "human" };
13
+ }
14
+ //# sourceMappingURL=actor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actor.js","sourceRoot":"","sources":["../src/actor.ts"],"names":[],"mappings":"AAEA,6GAA6G;AAC7G,MAAM,UAAU,QAAQ;IACtB,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;QACjE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,CAAC;IACvD,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;QACxD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC;IACjD,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACnB,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;IACnD,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC3B,CAAC"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}