whodecided 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 (96) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +84 -0
  3. package/dist/checks/gate.d.ts +10 -0
  4. package/dist/checks/gate.js +19 -0
  5. package/dist/checks/gate.js.map +1 -0
  6. package/dist/cli.d.ts +2 -0
  7. package/dist/cli.js +79 -0
  8. package/dist/cli.js.map +1 -0
  9. package/dist/commands/apply.d.ts +1 -0
  10. package/dist/commands/apply.js +68 -0
  11. package/dist/commands/apply.js.map +1 -0
  12. package/dist/commands/board.d.ts +6 -0
  13. package/dist/commands/board.js +57 -0
  14. package/dist/commands/board.js.map +1 -0
  15. package/dist/commands/distill.d.ts +18 -0
  16. package/dist/commands/distill.js +116 -0
  17. package/dist/commands/distill.js.map +1 -0
  18. package/dist/commands/gate.d.ts +2 -0
  19. package/dist/commands/gate.js +27 -0
  20. package/dist/commands/gate.js.map +1 -0
  21. package/dist/commands/hook.d.ts +1 -0
  22. package/dist/commands/hook.js +189 -0
  23. package/dist/commands/hook.js.map +1 -0
  24. package/dist/commands/recall.d.ts +19 -0
  25. package/dist/commands/recall.js +58 -0
  26. package/dist/commands/recall.js.map +1 -0
  27. package/dist/commands/report.d.ts +1 -0
  28. package/dist/commands/report.js +18 -0
  29. package/dist/commands/report.js.map +1 -0
  30. package/dist/commands/review.d.ts +1 -0
  31. package/dist/commands/review.js +211 -0
  32. package/dist/commands/review.js.map +1 -0
  33. package/dist/commands/scope.d.ts +17 -0
  34. package/dist/commands/scope.js +51 -0
  35. package/dist/commands/scope.js.map +1 -0
  36. package/dist/commands/share.d.ts +6 -0
  37. package/dist/commands/share.js +73 -0
  38. package/dist/commands/share.js.map +1 -0
  39. package/dist/commands/sync.d.ts +23 -0
  40. package/dist/commands/sync.js +214 -0
  41. package/dist/commands/sync.js.map +1 -0
  42. package/dist/config.d.ts +28 -0
  43. package/dist/config.js +80 -0
  44. package/dist/config.js.map +1 -0
  45. package/dist/distill/distiller.d.ts +15 -0
  46. package/dist/distill/distiller.js +92 -0
  47. package/dist/distill/distiller.js.map +1 -0
  48. package/dist/distill/prompt.d.ts +18 -0
  49. package/dist/distill/prompt.js +53 -0
  50. package/dist/distill/prompt.js.map +1 -0
  51. package/dist/distill/watermark.d.ts +5 -0
  52. package/dist/distill/watermark.js +22 -0
  53. package/dist/distill/watermark.js.map +1 -0
  54. package/dist/extract/candidates.d.ts +25 -0
  55. package/dist/extract/candidates.js +136 -0
  56. package/dist/extract/candidates.js.map +1 -0
  57. package/dist/git.d.ts +22 -0
  58. package/dist/git.js +78 -0
  59. package/dist/git.js.map +1 -0
  60. package/dist/jsonl.d.ts +14 -0
  61. package/dist/jsonl.js +30 -0
  62. package/dist/jsonl.js.map +1 -0
  63. package/dist/ledger/io.d.ts +30 -0
  64. package/dist/ledger/io.js +85 -0
  65. package/dist/ledger/io.js.map +1 -0
  66. package/dist/ledger/schema.d.ts +31 -0
  67. package/dist/ledger/schema.js +57 -0
  68. package/dist/ledger/schema.js.map +1 -0
  69. package/dist/patch/apply.d.ts +15 -0
  70. package/dist/patch/apply.js +63 -0
  71. package/dist/patch/apply.js.map +1 -0
  72. package/dist/patch/schema.d.ts +11 -0
  73. package/dist/patch/schema.js +21 -0
  74. package/dist/patch/schema.js.map +1 -0
  75. package/dist/render/html.d.ts +33 -0
  76. package/dist/render/html.js +593 -0
  77. package/dist/render/html.js.map +1 -0
  78. package/dist/render/md.d.ts +3 -0
  79. package/dist/render/md.js +39 -0
  80. package/dist/render/md.js.map +1 -0
  81. package/dist/render/term.d.ts +2 -0
  82. package/dist/render/term.js +40 -0
  83. package/dist/render/term.js.map +1 -0
  84. package/dist/trace/schema.d.ts +14 -0
  85. package/dist/trace/schema.js +25 -0
  86. package/dist/trace/schema.js.map +1 -0
  87. package/dist/transcript/locate.d.ts +10 -0
  88. package/dist/transcript/locate.js +30 -0
  89. package/dist/transcript/locate.js.map +1 -0
  90. package/dist/transcript/parser.d.ts +18 -0
  91. package/dist/transcript/parser.js +130 -0
  92. package/dist/transcript/parser.js.map +1 -0
  93. package/dist/validate.d.ts +4 -0
  94. package/dist/validate.js +13 -0
  95. package/dist/validate.js.map +1 -0
  96. package/package.json +48 -0
@@ -0,0 +1,15 @@
1
+ import type { PatchOp } from "./schema.js";
2
+ export interface ApplyResult {
3
+ applied: number;
4
+ skipped: number;
5
+ overturned: number;
6
+ synced: string[];
7
+ commit?: string;
8
+ uncommitted?: boolean;
9
+ }
10
+ /**
11
+ * The single write path for rulings: validate all ops against the ledger,
12
+ * all-or-nothing, then append ratify lines and commit. Terminal review and
13
+ * the HTML workbench both land here.
14
+ */
15
+ export declare function applyOps(repoRoot: string, ops: PatchOp[]): ApplyResult | string;
@@ -0,0 +1,63 @@
1
+ import { relative } from "node:path";
2
+ import { loadConfig } from "../config.js";
3
+ import { commitFiles } from "../git.js";
4
+ import { appendLedgerLines, isPinned, ledgerPath, noteOf, readLedger, verdictOf } from "../ledger/io.js";
5
+ import { refreshSync } from "../commands/sync.js";
6
+ /**
7
+ * The single write path for rulings: validate all ops against the ledger,
8
+ * all-or-nothing, then append ratify lines and commit. Terminal review and
9
+ * the HTML workbench both land here.
10
+ */
11
+ export function applyOps(repoRoot, ops) {
12
+ const file = ledgerPath(repoRoot);
13
+ const { entries, ratifies } = readLedger(file);
14
+ const known = new Set(entries.map((e) => e.id));
15
+ const lines = [];
16
+ let skipped = 0;
17
+ for (const op of ops) {
18
+ if (!known.has(op.target))
19
+ return `unknown decision id: ${op.target}`;
20
+ // Latest ratify wins (verdictOf), so changing your mind or refining the
21
+ // note/pin just appends a new line - the ledger keeps the full history.
22
+ // Skip only when nothing actually changed (idempotent re-apply).
23
+ const unchanged = verdictOf(ratifies, op.target) === op.verdict &&
24
+ noteOf(ratifies, op.target) === op.note &&
25
+ isPinned(ratifies, op.target) === (op.pin === true);
26
+ if (unchanged) {
27
+ skipped++;
28
+ continue;
29
+ }
30
+ lines.push({
31
+ type: "ratify",
32
+ target: op.target,
33
+ verdict: op.verdict,
34
+ t: new Date().toISOString(),
35
+ ...(op.note !== undefined ? { note: op.note } : {}),
36
+ ...(op.pin !== undefined ? { pin: op.pin } : {}),
37
+ });
38
+ }
39
+ appendLedgerLines(file, lines);
40
+ // Keep the agent-memory precedent digest current if the user opted in.
41
+ const digestPaths = lines.length > 0 ? refreshSync(repoRoot) : [];
42
+ const cfg = loadConfig(repoRoot);
43
+ const paths = [relative(repoRoot, file), ...digestPaths];
44
+ // Commit only when the user asked for it (commit: on). Otherwise the files
45
+ // are written and left for the user to commit — we never touch their history.
46
+ const commit = lines.length > 0 && cfg.share === "repo" && cfg.commit === "on"
47
+ ? commitFiles(repoRoot, paths, ratifyMessage(lines))
48
+ : undefined;
49
+ return {
50
+ applied: lines.length,
51
+ skipped,
52
+ overturned: lines.filter((l) => l.verdict === "reject").length,
53
+ synced: digestPaths,
54
+ ...(commit?.sha ? { commit: commit.sha } : {}),
55
+ ...(commit?.ignored ? { uncommitted: true } : {}),
56
+ };
57
+ }
58
+ function ratifyMessage(lines) {
59
+ const accepts = lines.filter((l) => l.verdict === "accept").length;
60
+ const rejects = lines.length - accepts;
61
+ return `wdd ratify: ${accepts} accept, ${rejects} reject`;
62
+ }
63
+ //# sourceMappingURL=apply.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply.js","sourceRoot":"","sources":["../../src/patch/apply.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { type JsonlResult } from "../jsonl.js";
2
+ export interface RatifyOp {
3
+ op: "ratify";
4
+ target: string;
5
+ verdict: "accept" | "reject";
6
+ note?: string;
7
+ pin?: boolean;
8
+ }
9
+ export type PatchOp = RatifyOp;
10
+ export declare function parsePatchOp(value: unknown): PatchOp | string;
11
+ export declare function parsePatch(text: string): JsonlResult<PatchOp>;
@@ -0,0 +1,21 @@
1
+ import { parseJsonl } from "../jsonl.js";
2
+ import { isNonEmptyString, isOptionalString, isRecord } from "../validate.js";
3
+ export function parsePatchOp(value) {
4
+ if (!isRecord(value))
5
+ return "not an object";
6
+ if (value.op !== "ratify")
7
+ return `unknown op: ${String(value.op)}`;
8
+ if (!isNonEmptyString(value.target))
9
+ return "target: non-empty string required";
10
+ if (value.verdict !== "accept" && value.verdict !== "reject")
11
+ return 'verdict: "accept" or "reject" required';
12
+ if (!isOptionalString(value.note))
13
+ return "note: string expected";
14
+ if (value.pin !== undefined && typeof value.pin !== "boolean")
15
+ return "pin: boolean expected";
16
+ return value;
17
+ }
18
+ export function parsePatch(text) {
19
+ return parseJsonl(text, parsePatchOp);
20
+ }
21
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/patch/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAoB,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAY9E,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,eAAe,CAAC;IAC7C,IAAI,KAAK,CAAC,EAAE,KAAK,QAAQ;QAAE,OAAO,eAAe,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;IACpE,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC;QAAE,OAAO,mCAAmC,CAAC;IAChF,IAAI,KAAK,CAAC,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,KAAK,QAAQ;QAAE,OAAO,wCAAwC,CAAC;IAC9G,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC;QAAE,OAAO,uBAAuB,CAAC;IAClE,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,GAAG,KAAK,SAAS;QAAE,OAAO,uBAAuB,CAAC;IAC9F,OAAO,KAA4B,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,UAAU,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;AACxC,CAAC"}
@@ -0,0 +1,33 @@
1
+ import type { DecisionEntry } from "../ledger/schema.js";
2
+ import type { TraceEvent } from "../trace/schema.js";
3
+ import type { GateStatus } from "../checks/gate.js";
4
+ export interface WorkbenchEntry extends DecisionEntry {
5
+ verdict?: "accept" | "reject" | undefined;
6
+ ruleNote?: string;
7
+ pinned?: boolean;
8
+ }
9
+ export interface RepoView {
10
+ repo: string;
11
+ root: string;
12
+ branch?: string | undefined;
13
+ entries: WorkbenchEntry[];
14
+ traces: TraceEvent[];
15
+ slices: Record<string, string>;
16
+ gate?: GateStatus | undefined;
17
+ }
18
+ export interface WorkbenchOptions {
19
+ title: string;
20
+ interactive: boolean;
21
+ live?: boolean;
22
+ memory?: string[];
23
+ repos: RepoView[];
24
+ }
25
+ /**
26
+ * Single-file page: embedded JSON, vanilla JS. Served live by `wdd review`'s
27
+ * ephemeral local server (rulings POST to /apply and land immediately), or
28
+ * written as a static archive/board snapshot (rulings export as patch.jsonl
29
+ * for `wdd apply`). English chrome; ledger content stays in whatever language
30
+ * it was distilled. Grouped repo -> worktree, decisions and traces on a
31
+ * timeline; a decision opens a right-side detail drawer. Theme follows system.
32
+ */
33
+ export declare function renderWorkbench(opts: WorkbenchOptions): string;