@a5c-ai/git-a5c 1.0.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 (99) hide show
  1. package/README.md +32 -0
  2. package/dist/args.d.ts +39 -0
  3. package/dist/args.d.ts.map +1 -0
  4. package/dist/args.js +79 -0
  5. package/dist/args.js.map +1 -0
  6. package/dist/bin/git-a5c.d.ts +3 -0
  7. package/dist/bin/git-a5c.d.ts.map +1 -0
  8. package/dist/bin/git-a5c.js +12 -0
  9. package/dist/bin/git-a5c.js.map +1 -0
  10. package/dist/commands/agent.d.ts +3 -0
  11. package/dist/commands/agent.d.ts.map +1 -0
  12. package/dist/commands/agent.js +61 -0
  13. package/dist/commands/agent.js.map +1 -0
  14. package/dist/commands/block.d.ts +3 -0
  15. package/dist/commands/block.d.ts.map +1 -0
  16. package/dist/commands/block.js +33 -0
  17. package/dist/commands/block.js.map +1 -0
  18. package/dist/commands/gate.d.ts +3 -0
  19. package/dist/commands/gate.d.ts.map +1 -0
  20. package/dist/commands/gate.js +31 -0
  21. package/dist/commands/gate.js.map +1 -0
  22. package/dist/commands/help.d.ts +3 -0
  23. package/dist/commands/help.d.ts.map +1 -0
  24. package/dist/commands/help.js +35 -0
  25. package/dist/commands/help.js.map +1 -0
  26. package/dist/commands/hooks.d.ts +3 -0
  27. package/dist/commands/hooks.d.ts.map +1 -0
  28. package/dist/commands/hooks.js +40 -0
  29. package/dist/commands/hooks.js.map +1 -0
  30. package/dist/commands/issue.d.ts +3 -0
  31. package/dist/commands/issue.d.ts.map +1 -0
  32. package/dist/commands/issue.js +134 -0
  33. package/dist/commands/issue.js.map +1 -0
  34. package/dist/commands/journal.d.ts +3 -0
  35. package/dist/commands/journal.d.ts.map +1 -0
  36. package/dist/commands/journal.js +78 -0
  37. package/dist/commands/journal.js.map +1 -0
  38. package/dist/commands/ops.d.ts +3 -0
  39. package/dist/commands/ops.d.ts.map +1 -0
  40. package/dist/commands/ops.js +39 -0
  41. package/dist/commands/ops.js.map +1 -0
  42. package/dist/commands/pr.d.ts +3 -0
  43. package/dist/commands/pr.d.ts.map +1 -0
  44. package/dist/commands/pr.js +136 -0
  45. package/dist/commands/pr.js.map +1 -0
  46. package/dist/commands/status.d.ts +3 -0
  47. package/dist/commands/status.d.ts.map +1 -0
  48. package/dist/commands/status.js +17 -0
  49. package/dist/commands/status.js.map +1 -0
  50. package/dist/commands/types.d.ts +17 -0
  51. package/dist/commands/types.d.ts.map +1 -0
  52. package/dist/commands/types.js +2 -0
  53. package/dist/commands/types.js.map +1 -0
  54. package/dist/commands/verify.d.ts +3 -0
  55. package/dist/commands/verify.d.ts.map +1 -0
  56. package/dist/commands/verify.js +20 -0
  57. package/dist/commands/verify.js.map +1 -0
  58. package/dist/commands/webhook.d.ts +3 -0
  59. package/dist/commands/webhook.d.ts.map +1 -0
  60. package/dist/commands/webhook.js +61 -0
  61. package/dist/commands/webhook.js.map +1 -0
  62. package/dist/git.d.ts +5 -0
  63. package/dist/git.d.ts.map +1 -0
  64. package/dist/git.js +35 -0
  65. package/dist/git.js.map +1 -0
  66. package/dist/run.d.ts +7 -0
  67. package/dist/run.d.ts.map +1 -0
  68. package/dist/run.js +83 -0
  69. package/dist/run.js.map +1 -0
  70. package/dist/time.d.ts +2 -0
  71. package/dist/time.d.ts.map +1 -0
  72. package/dist/time.js +16 -0
  73. package/dist/time.js.map +1 -0
  74. package/package.json +24 -0
  75. package/src/args.ts +87 -0
  76. package/src/bin/git-a5c.ts +14 -0
  77. package/src/commands/agent.ts +72 -0
  78. package/src/commands/block.ts +34 -0
  79. package/src/commands/gate.ts +32 -0
  80. package/src/commands/help.ts +38 -0
  81. package/src/commands/hooks.ts +40 -0
  82. package/src/commands/issue.ts +146 -0
  83. package/src/commands/journal.ts +75 -0
  84. package/src/commands/ops.ts +41 -0
  85. package/src/commands/pr.ts +147 -0
  86. package/src/commands/status.ts +18 -0
  87. package/src/commands/types.ts +20 -0
  88. package/src/commands/verify.ts +20 -0
  89. package/src/commands/webhook.ts +63 -0
  90. package/src/git.ts +38 -0
  91. package/src/run.ts +99 -0
  92. package/src/time.ts +16 -0
  93. package/test/_util.ts +88 -0
  94. package/test/cli.flow.integration.test.ts +86 -0
  95. package/test/cli.snapshots.test.ts +50 -0
  96. package/test/cli.webhook.integration.test.ts +62 -0
  97. package/test/cli.write.integration.test.ts +70 -0
  98. package/tsconfig.json +13 -0
  99. package/vitest.config.ts +20 -0
package/README.md ADDED
@@ -0,0 +1,32 @@
1
+ # @a5cforge/cli
2
+
3
+ CLI for reading and writing a5cforge events.
4
+
5
+ ## Usage
6
+ Installed as a `git` subcommand binary (`git-a5c`), so you can run:
7
+
8
+ - `git a5c status`
9
+ - `git a5c issue list`
10
+ - `git a5c issue show <id>`
11
+ - `git a5c pr list`
12
+ - `git a5c pr show <prKey>`
13
+ - `git a5c verify`
14
+ - `git a5c journal`
15
+
16
+ Common flags:
17
+ - `--repo <path>`: override repo detection
18
+ - `--treeish <ref>`: load snapshot from a commit/ref (default: `HEAD`)
19
+ - `--inbox-ref <ref>`: include events from an inbox ref (repeatable)
20
+ - `--json`: JSON output
21
+
22
+ ## Local install from this monorepo
23
+
24
+ From the repo root:
25
+
26
+ ```bash
27
+ pnpm -C packages/cli build
28
+ pnpm -C packages/cli link --global
29
+ git a5c help
30
+ ```
31
+
32
+
package/dist/args.d.ts ADDED
@@ -0,0 +1,39 @@
1
+ export type ParsedArgs = {
2
+ flags: {
3
+ repo?: string;
4
+ treeish?: string;
5
+ json?: boolean;
6
+ inboxRefs?: string[];
7
+ since?: string;
8
+ limit?: number;
9
+ types?: string[];
10
+ entity?: string;
11
+ active?: boolean;
12
+ stageOnly?: boolean;
13
+ commit?: boolean;
14
+ message?: string;
15
+ title?: string;
16
+ body?: string;
17
+ id?: string;
18
+ commentId?: string;
19
+ reason?: string;
20
+ base?: string;
21
+ head?: string;
22
+ headRef?: string;
23
+ topic?: string;
24
+ by?: string;
25
+ op?: string;
26
+ agentId?: string;
27
+ ttlSeconds?: number;
28
+ task?: string;
29
+ env?: string;
30
+ rev?: string;
31
+ artifact?: string;
32
+ dispatchId?: string;
33
+ url?: string;
34
+ type?: string;
35
+ };
36
+ positionals: string[];
37
+ };
38
+ export declare function parseArgs(argv: string[]): ParsedArgs;
39
+ //# sourceMappingURL=args.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE;QACL,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;QACrB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IACF,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB,CAAC;AAEF,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CA8CpD"}
package/dist/args.js ADDED
@@ -0,0 +1,79 @@
1
+ export function parseArgs(argv) {
2
+ const args = [...argv];
3
+ const flags = {};
4
+ const positionals = [];
5
+ while (args.length) {
6
+ const a = args.shift();
7
+ if (a === "--repo")
8
+ flags.repo = args.shift();
9
+ else if (a === "--treeish")
10
+ flags.treeish = args.shift();
11
+ else if (a === "--json")
12
+ flags.json = true;
13
+ else if (a === "--inbox-ref") {
14
+ const v = args.shift();
15
+ flags.inboxRefs ??= [];
16
+ flags.inboxRefs.push(v);
17
+ }
18
+ else if (a === "--since")
19
+ flags.since = args.shift();
20
+ else if (a === "--limit")
21
+ flags.limit = Number(args.shift());
22
+ else if (a === "--types")
23
+ flags.types = args.shift().split(",").map((s) => s.trim()).filter(Boolean);
24
+ else if (a === "--entity")
25
+ flags.entity = args.shift();
26
+ else if (a === "--active")
27
+ flags.active = true;
28
+ else if (a === "--stage-only")
29
+ flags.stageOnly = true;
30
+ else if (a === "--commit")
31
+ flags.commit = true;
32
+ else if (a === "--message" || a === "-m")
33
+ flags.message = args.shift();
34
+ else if (a === "--title")
35
+ flags.title = args.shift();
36
+ else if (a === "--body")
37
+ flags.body = args.shift();
38
+ else if (a === "--id")
39
+ flags.id = args.shift();
40
+ else if (a === "--comment-id")
41
+ flags.commentId = args.shift();
42
+ else if (a === "--reason")
43
+ flags.reason = args.shift();
44
+ else if (a === "--base")
45
+ flags.base = args.shift();
46
+ else if (a === "--head")
47
+ flags.head = args.shift();
48
+ else if (a === "--head-ref")
49
+ flags.headRef = args.shift();
50
+ else if (a === "--topic")
51
+ flags.topic = args.shift();
52
+ else if (a === "--by")
53
+ flags.by = args.shift();
54
+ else if (a === "--op")
55
+ flags.op = args.shift();
56
+ else if (a === "--agent-id")
57
+ flags.agentId = args.shift();
58
+ else if (a === "--ttl-seconds")
59
+ flags.ttlSeconds = Number(args.shift());
60
+ else if (a === "--task")
61
+ flags.task = args.shift();
62
+ else if (a === "--env")
63
+ flags.env = args.shift();
64
+ else if (a === "--rev")
65
+ flags.rev = args.shift();
66
+ else if (a === "--artifact")
67
+ flags.artifact = args.shift();
68
+ else if (a === "--dispatch-id")
69
+ flags.dispatchId = args.shift();
70
+ else if (a === "--url")
71
+ flags.url = args.shift();
72
+ else if (a === "--type")
73
+ flags.type = args.shift();
74
+ else
75
+ positionals.push(a);
76
+ }
77
+ return { flags, positionals };
78
+ }
79
+ //# sourceMappingURL=args.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=git-a5c.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-a5c.d.ts","sourceRoot":"","sources":["../../src/bin/git-a5c.ts"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ import { runCli } from "../run.js";
3
+ runCli(process.argv.slice(2))
4
+ .then((code) => {
5
+ process.exitCode = code;
6
+ })
7
+ .catch((e) => {
8
+ // Keep output minimal and deterministic.
9
+ process.stderr.write(String(e?.message ?? e) + "\n");
10
+ process.exitCode = 1;
11
+ });
12
+ //# sourceMappingURL=git-a5c.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-a5c.js","sourceRoot":"","sources":["../../src/bin/git-a5c.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAEnC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;KAC1B,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;IACb,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;AAC1B,CAAC,CAAC;KACD,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;IACX,yCAAyC;IACzC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACrD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { CommandArgs } from "./types.js";
2
+ export declare function handleAgent(args: CommandArgs): Promise<number | undefined>;
3
+ //# sourceMappingURL=agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/commands/agent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAY9C,wBAAsB,WAAW,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAyDhF"}
@@ -0,0 +1,61 @@
1
+ import { git, gitConfigGet } from "../git.js";
2
+ import { HlcClock, UlidGenerator, loadHlcState, saveHlcState, stageFiles, writeAgentHeartbeat, writeAgentDispatchCreated } from "@a5cforge/sdk";
3
+ export async function handleAgent(args) {
4
+ if (args.positionals[0] !== "agent")
5
+ return;
6
+ const sub = args.positionals[1];
7
+ const actor = process.env.A5C_ACTOR ?? (await gitConfigGet(args.repoRoot, "user.name")) ?? "unknown";
8
+ const persisted = (await loadHlcState(actor)) ?? { wallMs: 0, counter: 0 };
9
+ const clock = new HlcClock(persisted);
10
+ let nonce = 0;
11
+ const ctx = { repoRoot: args.repoRoot, actor, clock, nextNonce: () => String(++nonce).padStart(4, "0") };
12
+ if (sub === "heartbeat") {
13
+ const agentId = args.flags.agentId ?? actor;
14
+ const ttlSeconds = args.flags.ttlSeconds ?? 120;
15
+ const time = new Date(args.nowMs()).toISOString();
16
+ const status = args.flags.message ?? undefined;
17
+ const entityId = args.flags.entity;
18
+ const entity = entityId ? { type: entityId.startsWith("pr-") ? "pr" : "issue", id: entityId } : undefined;
19
+ const res = await writeAgentHeartbeat(ctx, { agentId, ttlSeconds, status, entity, time });
20
+ await saveHlcState(actor, clock.now());
21
+ if (args.flags.stageOnly || args.flags.commit)
22
+ await stageFiles(args.repoRoot, [res.path]);
23
+ if (args.flags.commit) {
24
+ const msg = args.flags.message ?? `a5c: agent heartbeat ${agentId}`;
25
+ await git(["-c", "user.name=a5c", "-c", "user.email=a5c@example.invalid", "commit", "-m", msg], args.repoRoot);
26
+ }
27
+ args.io.writeLine(args.io.out, res.path);
28
+ return 0;
29
+ }
30
+ if (sub === "dispatch") {
31
+ const entityId = args.flags.entity;
32
+ if (!entityId) {
33
+ args.io.writeLine(args.io.err, "usage: git a5c agent dispatch --entity <issueId|prKey> [--dispatch-id ...] [--task ...]");
34
+ return 2;
35
+ }
36
+ const dispatchId = args.flags.dispatchId ?? `d-${new UlidGenerator().generate()}`;
37
+ const time = new Date(args.nowMs()).toISOString();
38
+ const entity = { type: entityId.startsWith("pr-") ? "pr" : "issue", id: entityId };
39
+ const agentId = args.flags.agentId ?? actor;
40
+ const res = await writeAgentDispatchCreated(ctx, {
41
+ dispatchId,
42
+ agentId,
43
+ entity,
44
+ task: args.flags.task,
45
+ params: undefined,
46
+ time
47
+ });
48
+ await saveHlcState(actor, clock.now());
49
+ if (args.flags.stageOnly || args.flags.commit)
50
+ await stageFiles(args.repoRoot, [res.path]);
51
+ if (args.flags.commit) {
52
+ const msg = args.flags.message ?? `a5c: agent dispatch ${dispatchId}`;
53
+ await git(["-c", "user.name=a5c", "-c", "user.email=a5c@example.invalid", "commit", "-m", msg], args.repoRoot);
54
+ }
55
+ args.io.writeLine(args.io.out, res.path);
56
+ return 0;
57
+ }
58
+ args.io.writeLine(args.io.err, "usage: git a5c agent heartbeat|dispatch ...");
59
+ return 2;
60
+ }
61
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/commands/agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { CommandArgs } from "./types.js";
2
+ export declare function handleBlock(args: CommandArgs): Promise<number | undefined>;
3
+ //# sourceMappingURL=block.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block.d.ts","sourceRoot":"","sources":["../../src/commands/block.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAI9C,wBAAsB,WAAW,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CA2BhF"}
@@ -0,0 +1,33 @@
1
+ import { git, gitConfigGet } from "../git.js";
2
+ import { HlcClock, loadHlcState, saveHlcState, stageFiles, writeDepChanged } from "@a5cforge/sdk";
3
+ export async function handleBlock(args) {
4
+ if (args.positionals[0] !== "block")
5
+ return;
6
+ // git a5c block <entityId> --by <issueOrPrId> [--op add|remove]
7
+ const entityId = args.positionals[1];
8
+ const byId = args.flags.by;
9
+ const op = args.flags.op ?? "add";
10
+ if (!entityId || !byId) {
11
+ args.io.writeLine(args.io.err, "usage: git a5c block <entityId> --by <issue|pr> [--op add|remove]");
12
+ return 2;
13
+ }
14
+ const entity = { type: entityId.startsWith("pr-") ? "pr" : "issue", id: entityId };
15
+ const by = { type: byId.startsWith("pr-") ? "pr" : "issue", id: byId };
16
+ const actor = process.env.A5C_ACTOR ?? (await gitConfigGet(args.repoRoot, "user.name")) ?? "unknown";
17
+ const time = new Date(args.nowMs()).toISOString();
18
+ const persisted = (await loadHlcState(actor)) ?? { wallMs: 0, counter: 0 };
19
+ const clock = new HlcClock(persisted);
20
+ let nonce = 0;
21
+ const ctx = { repoRoot: args.repoRoot, actor, clock, nextNonce: () => String(++nonce).padStart(4, "0") };
22
+ const res = await writeDepChanged(ctx, { entity, op, by, note: args.flags.message, time });
23
+ await saveHlcState(actor, clock.now());
24
+ if (args.flags.stageOnly || args.flags.commit)
25
+ await stageFiles(args.repoRoot, [res.path]);
26
+ if (args.flags.commit) {
27
+ const msg = args.flags.message ?? `a5c: dep ${op} ${entityId}`;
28
+ await git(["-c", "user.name=a5c", "-c", "user.email=a5c@example.invalid", "commit", "-m", msg], args.repoRoot);
29
+ }
30
+ args.io.writeLine(args.io.out, res.path);
31
+ return 0;
32
+ }
33
+ //# sourceMappingURL=block.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block.js","sourceRoot":"","sources":["../../src/commands/block.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { CommandArgs } from "./types.js";
2
+ export declare function handleGate(args: CommandArgs): Promise<number | undefined>;
3
+ //# sourceMappingURL=gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate.d.ts","sourceRoot":"","sources":["../../src/commands/gate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAI9C,wBAAsB,UAAU,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAyB/E"}
@@ -0,0 +1,31 @@
1
+ import { git, gitConfigGet } from "../git.js";
2
+ import { HlcClock, loadHlcState, saveHlcState, stageFiles, writeGateChanged } from "@a5cforge/sdk";
3
+ export async function handleGate(args) {
4
+ if (args.positionals[0] !== "gate")
5
+ return;
6
+ const sub = args.positionals[1];
7
+ const entityId = args.positionals[2];
8
+ if (!sub || !entityId) {
9
+ args.io.writeLine(args.io.err, "usage: git a5c gate needs-human|clear <entityId> [--topic t] [-m msg]");
10
+ return 2;
11
+ }
12
+ const entity = { type: entityId.startsWith("pr-") ? "pr" : "issue", id: entityId };
13
+ const needsHuman = sub === "needs-human";
14
+ const actor = process.env.A5C_ACTOR ?? (await gitConfigGet(args.repoRoot, "user.name")) ?? "unknown";
15
+ const time = new Date(args.nowMs()).toISOString();
16
+ const persisted = (await loadHlcState(actor)) ?? { wallMs: 0, counter: 0 };
17
+ const clock = new HlcClock(persisted);
18
+ let nonce = 0;
19
+ const ctx = { repoRoot: args.repoRoot, actor, clock, nextNonce: () => String(++nonce).padStart(4, "0") };
20
+ const res = await writeGateChanged(ctx, { entity, needsHuman, topic: args.flags.topic, message: args.flags.message, time });
21
+ await saveHlcState(actor, clock.now());
22
+ if (args.flags.stageOnly || args.flags.commit)
23
+ await stageFiles(args.repoRoot, [res.path]);
24
+ if (args.flags.commit) {
25
+ const msg = args.flags.message ?? `a5c: gate ${sub} ${entityId}`;
26
+ await git(["-c", "user.name=a5c", "-c", "user.email=a5c@example.invalid", "commit", "-m", msg], args.repoRoot);
27
+ }
28
+ args.io.writeLine(args.io.out, res.path);
29
+ return 0;
30
+ }
31
+ //# sourceMappingURL=gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate.js","sourceRoot":"","sources":["../../src/commands/gate.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEnG,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAiB;IAChD,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,MAAM;QAAE,OAAO;IAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IACrC,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QACtB,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,uEAAuE,CAAC,CAAC;QACxG,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAW,CAAC;IAC5F,MAAM,UAAU,GAAG,GAAG,KAAK,aAAa,CAAC;IACzC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,MAAM,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,IAAI,SAAS,CAAC;IACrG,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAClD,MAAM,SAAS,GAAG,CAAC,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IAC3E,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,SAAS,CAAC,CAAC;IACtC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,MAAM,GAAG,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;IACzG,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAc,EAAE,IAAI,EAAE,CAAC,CAAC;IACnI,MAAM,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;IACvC,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM;QAAE,MAAM,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3F,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,aAAa,GAAG,IAAI,QAAQ,EAAE,CAAC;QACjE,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,gCAAgC,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjH,CAAC;IACD,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;IACzC,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { CommandArgs } from "./types.js";
2
+ export declare function handleHelp(args: CommandArgs): number | undefined;
3
+ //# sourceMappingURL=help.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../src/commands/help.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,wBAAgB,UAAU,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS,CAiChE"}
@@ -0,0 +1,35 @@
1
+ export function handleHelp(args) {
2
+ const cmd = args.positionals[0] ?? "help";
3
+ if (cmd !== "help" && cmd !== "--help" && cmd !== "-h")
4
+ return;
5
+ const { writeLine } = args.io;
6
+ const out = args.io.out;
7
+ writeLine(out, "git a5c <command> [--json] [--treeish <ref>] [--repo <path>] [--inbox-ref <ref>...]");
8
+ writeLine(out, "");
9
+ writeLine(out, "Commands:");
10
+ writeLine(out, " status");
11
+ writeLine(out, " issue list");
12
+ writeLine(out, " issue show <id>");
13
+ writeLine(out, " issue new --title <t> [--body <b>] [--stage-only|--commit]");
14
+ writeLine(out, " issue comment <id> -m <text> [--comment-id <id>] [--stage-only|--commit]");
15
+ writeLine(out, " issue edit-comment <commentId> --id <issueId> -m <text> [--stage-only|--commit]");
16
+ writeLine(out, " issue redact-comment <commentId> --id <issueId> [--reason <r>] [--stage-only|--commit]");
17
+ writeLine(out, " pr list");
18
+ writeLine(out, " pr show <prKey>");
19
+ writeLine(out, " pr propose --base <ref> --head <ref> --title <t> [--body <b>] [--stage-only|--commit]");
20
+ writeLine(out, " pr request --base <ref> --title <t> [--body <b>] [--stage-only|--commit]");
21
+ writeLine(out, " pr claim <prKey> --head-ref <ref> [-m <msg>] [--stage-only|--commit]");
22
+ writeLine(out, " pr bind-head <prKey> --head-ref <ref> [-m <msg>] [--stage-only|--commit]");
23
+ writeLine(out, " block <entityId> --by <issue|pr> [--op add|remove] [-m <note>] [--stage-only|--commit]");
24
+ writeLine(out, " gate needs-human <entityId> [--topic <t>] [-m <msg>] [--stage-only|--commit]");
25
+ writeLine(out, " gate clear <entityId> [-m <msg>] [--stage-only|--commit]");
26
+ writeLine(out, " agent heartbeat [--agent-id <id>] [--ttl-seconds N] [--entity <id>] [-m <status>] [--stage-only|--commit]");
27
+ writeLine(out, " ops deploy --entity <id> [--artifact <uri>] [-m <status>] [--stage-only|--commit]");
28
+ writeLine(out, " verify");
29
+ writeLine(out, " journal [--since <2h|2025-...>] [--limit N] [--types a,b] [--entity <id>] [--active]");
30
+ writeLine(out, " hooks install|uninstall");
31
+ writeLine(out, " webhook status");
32
+ writeLine(out, " webhook test --url <url> [--type <type>]");
33
+ return 0;
34
+ }
35
+ //# sourceMappingURL=help.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/commands/help.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,UAAU,CAAC,IAAiB;IAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;IAC1C,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO;IAE/D,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;IAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC;IACxB,SAAS,CAAC,GAAG,EAAE,qFAAqF,CAAC,CAAC;IACtG,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACnB,SAAS,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAC5B,SAAS,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IAC3B,SAAS,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAC/B,SAAS,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;IACpC,SAAS,CAAC,GAAG,EAAE,8DAA8D,CAAC,CAAC;IAC/E,SAAS,CAAC,GAAG,EAAE,4EAA4E,CAAC,CAAC;IAC7F,SAAS,CAAC,GAAG,EAAE,mFAAmF,CAAC,CAAC;IACpG,SAAS,CAAC,GAAG,EAAE,0FAA0F,CAAC,CAAC;IAC3G,SAAS,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAC5B,SAAS,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;IACpC,SAAS,CAAC,GAAG,EAAE,yFAAyF,CAAC,CAAC;IAC1G,SAAS,CAAC,GAAG,EAAE,4EAA4E,CAAC,CAAC;IAC7F,SAAS,CAAC,GAAG,EAAE,wEAAwE,CAAC,CAAC;IACzF,SAAS,CAAC,GAAG,EAAE,4EAA4E,CAAC,CAAC;IAC7F,SAAS,CAAC,GAAG,EAAE,0FAA0F,CAAC,CAAC;IAC3G,SAAS,CAAC,GAAG,EAAE,gFAAgF,CAAC,CAAC;IACjG,SAAS,CAAC,GAAG,EAAE,4DAA4D,CAAC,CAAC;IAC7E,SAAS,CAAC,GAAG,EAAE,6GAA6G,CAAC,CAAC;IAC9H,SAAS,CAAC,GAAG,EAAE,qFAAqF,CAAC,CAAC;IACtG,SAAS,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IAC3B,SAAS,CAAC,GAAG,EAAE,wFAAwF,CAAC,CAAC;IACzG,SAAS,CAAC,GAAG,EAAE,2BAA2B,CAAC,CAAC;IAC5C,SAAS,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;IACnC,SAAS,CAAC,GAAG,EAAE,4CAA4C,CAAC,CAAC;IAC7D,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { CommandArgs } from "./types.js";
2
+ export declare function handleHooks(args: CommandArgs): Promise<number | undefined>;
3
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/commands/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAI9C,wBAAsB,WAAW,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAiChF"}
@@ -0,0 +1,40 @@
1
+ import fs from "node:fs/promises";
2
+ import { gitPath } from "../git.js";
3
+ export async function handleHooks(args) {
4
+ if (args.positionals[0] !== "hooks")
5
+ return;
6
+ const sub = args.positionals[1];
7
+ if (sub !== "install" && sub !== "uninstall") {
8
+ args.io.writeLine(args.io.err, "usage: git a5c hooks install|uninstall");
9
+ return 2;
10
+ }
11
+ const hooksDir = await gitPath(args.repoRoot, "hooks");
12
+ const hookFiles = ["post-commit", "post-merge"];
13
+ if (sub === "uninstall") {
14
+ for (const f of hookFiles) {
15
+ try {
16
+ const p = `${hooksDir}/${f}`;
17
+ const cur = await fs.readFile(p, "utf8");
18
+ if (cur.includes("A5C-HOOK-MANAGED: yes")) {
19
+ await fs.unlink(p);
20
+ }
21
+ }
22
+ catch { }
23
+ }
24
+ args.io.writeLine(args.io.out, "ok");
25
+ return 0;
26
+ }
27
+ const script = `#!/bin/sh\n# a5cforge hook (generated)\n# A5C-HOOK-MANAGED: yes\n# Keep it quiet; write last journal to .git\nif command -v git >/dev/null 2>&1; then\n git a5c journal --since 2h --limit 20 --json > "$(git rev-parse --git-path a5c-last-journal.json)" 2>/dev/null || true\nfi\nexit 0\n`;
28
+ await fs.mkdir(hooksDir, { recursive: true });
29
+ for (const f of hookFiles) {
30
+ const p = `${hooksDir}/${f}`;
31
+ await fs.writeFile(p, script, "utf8");
32
+ try {
33
+ await fs.chmod(p, 0o755);
34
+ }
35
+ catch { }
36
+ }
37
+ args.io.writeLine(args.io.out, "ok");
38
+ return 0;
39
+ }
40
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/commands/hooks.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAiB;IACjD,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,OAAO;QAAE,OAAO;IAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAChC,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;QAC7C,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,wCAAwC,CAAC,CAAC;QACzE,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACvD,MAAM,SAAS,GAAG,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;IAChD,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;QACxB,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACH,MAAM,CAAC,GAAG,GAAG,QAAQ,IAAI,CAAC,EAAE,CAAC;gBAC7B,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;gBACzC,IAAI,GAAG,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,CAAC;oBAC1C,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBACrB,CAAC;YACH,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;QACZ,CAAC;QACD,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACrC,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,MAAM,GAAG,+RAA+R,CAAC;IAC/S,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,MAAM,CAAC,GAAG,GAAG,QAAQ,IAAI,CAAC,EAAE,CAAC;QAC7B,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QACtC,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC;IACD,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACrC,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { CommandArgs } from "./types.js";
2
+ export declare function handleIssue(args: CommandArgs): Promise<number | undefined>;
3
+ //# sourceMappingURL=issue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue.d.ts","sourceRoot":"","sources":["../../src/commands/issue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAgB9C,wBAAsB,WAAW,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CA+HhF"}
@@ -0,0 +1,134 @@
1
+ import { git, gitConfigGet } from "../git.js";
2
+ import { HlcClock, UlidGenerator, loadHlcState, saveHlcState, stageFiles, listIssues, renderIssue, writeIssueCreated, writeCommentCreated, writeCommentEdited, writeCommentRedacted } from "@a5cforge/sdk";
3
+ export async function handleIssue(args) {
4
+ if (args.positionals[0] !== "issue")
5
+ return;
6
+ const sub = args.positionals[1];
7
+ if (sub === "list") {
8
+ const ids = listIssues(args.snap);
9
+ if (args.flags.json)
10
+ args.io.writeLine(args.io.out, JSON.stringify(ids, null, 2));
11
+ else
12
+ ids.forEach((id) => args.io.writeLine(args.io.out, id));
13
+ return 0;
14
+ }
15
+ if (sub === "show") {
16
+ const id = args.positionals[2];
17
+ if (!id)
18
+ throw new Error("missing issue id");
19
+ const issue = renderIssue(args.snap, id);
20
+ if (!issue) {
21
+ args.io.writeLine(args.io.err, `not found: ${id}`);
22
+ return 2;
23
+ }
24
+ if (args.flags.json)
25
+ args.io.writeLine(args.io.out, JSON.stringify(issue, null, 2));
26
+ else {
27
+ args.io.writeLine(args.io.out, `${issue.issueId}: ${issue.title}`);
28
+ if (issue.body)
29
+ args.io.writeLine(args.io.out, issue.body);
30
+ args.io.writeLine(args.io.out, `comments: ${issue.comments.length}`);
31
+ }
32
+ return 0;
33
+ }
34
+ if (sub === "new") {
35
+ const title = args.flags.title;
36
+ if (!title) {
37
+ args.io.writeLine(args.io.err, "missing --title");
38
+ return 2;
39
+ }
40
+ const actor = process.env.A5C_ACTOR ?? (await gitConfigGet(args.repoRoot, "user.name")) ?? "unknown";
41
+ const issueId = args.flags.id ?? `issue-${new UlidGenerator().generate()}`;
42
+ const time = new Date(args.nowMs()).toISOString();
43
+ const persisted = (await loadHlcState(actor)) ?? { wallMs: 0, counter: 0 };
44
+ const clock = new HlcClock(persisted);
45
+ let nonce = 0;
46
+ const ctx = { repoRoot: args.repoRoot, actor, clock, nextNonce: () => String(++nonce).padStart(4, "0") };
47
+ const res = await writeIssueCreated(ctx, { issueId, title, body: args.flags.body, time });
48
+ await saveHlcState(actor, clock.now());
49
+ if (args.flags.stageOnly || args.flags.commit)
50
+ await stageFiles(args.repoRoot, [res.path]);
51
+ if (args.flags.commit) {
52
+ const msg = args.flags.message ?? `a5c: issue new ${issueId}`;
53
+ await git(["-c", "user.name=a5c", "-c", "user.email=a5c@example.invalid", "commit", "-m", msg], args.repoRoot);
54
+ }
55
+ args.io.writeLine(args.io.out, issueId);
56
+ return 0;
57
+ }
58
+ if (sub === "comment") {
59
+ const id = args.positionals[2];
60
+ const body = args.flags.message ?? args.flags.body;
61
+ if (!id || !body) {
62
+ args.io.writeLine(args.io.err, "usage: git a5c issue comment <id> -m <text>");
63
+ return 2;
64
+ }
65
+ const actor = process.env.A5C_ACTOR ?? (await gitConfigGet(args.repoRoot, "user.name")) ?? "unknown";
66
+ const commentId = args.flags.commentId ?? `c-${new UlidGenerator().generate()}`;
67
+ const time = new Date(args.nowMs()).toISOString();
68
+ const persisted = (await loadHlcState(actor)) ?? { wallMs: 0, counter: 0 };
69
+ const clock = new HlcClock(persisted);
70
+ let nonce = 0;
71
+ const ctx = { repoRoot: args.repoRoot, actor, clock, nextNonce: () => String(++nonce).padStart(4, "0") };
72
+ const res = await writeCommentCreated(ctx, { entity: { type: "issue", id }, commentId, body: String(body), time });
73
+ await saveHlcState(actor, clock.now());
74
+ if (args.flags.stageOnly || args.flags.commit)
75
+ await stageFiles(args.repoRoot, [res.path]);
76
+ if (args.flags.commit) {
77
+ const msg = args.flags.message ?? `a5c: issue comment ${id}`;
78
+ await git(["-c", "user.name=a5c", "-c", "user.email=a5c@example.invalid", "commit", "-m", msg], args.repoRoot);
79
+ }
80
+ args.io.writeLine(args.io.out, commentId);
81
+ return 0;
82
+ }
83
+ if (sub === "edit-comment") {
84
+ const commentId = args.positionals[2] ?? args.flags.commentId;
85
+ const body = args.flags.message ?? args.flags.body;
86
+ const id = args.flags.id; // entity id required for now
87
+ if (!commentId || !body || !id) {
88
+ args.io.writeLine(args.io.err, "usage: git a5c issue edit-comment <commentId> --id <issueId> -m <text>");
89
+ return 2;
90
+ }
91
+ const actor = process.env.A5C_ACTOR ?? (await gitConfigGet(args.repoRoot, "user.name")) ?? "unknown";
92
+ const time = new Date(args.nowMs()).toISOString();
93
+ const persisted = (await loadHlcState(actor)) ?? { wallMs: 0, counter: 0 };
94
+ const clock = new HlcClock(persisted);
95
+ let nonce = 0;
96
+ const ctx = { repoRoot: args.repoRoot, actor, clock, nextNonce: () => String(++nonce).padStart(4, "0") };
97
+ const res = await writeCommentEdited(ctx, { entity: { type: "issue", id }, commentId, body: String(body), time });
98
+ await saveHlcState(actor, clock.now());
99
+ if (args.flags.stageOnly || args.flags.commit)
100
+ await stageFiles(args.repoRoot, [res.path]);
101
+ if (args.flags.commit) {
102
+ const msg = args.flags.message ?? `a5c: issue edit-comment ${id} ${commentId}`;
103
+ await git(["-c", "user.name=a5c", "-c", "user.email=a5c@example.invalid", "commit", "-m", msg], args.repoRoot);
104
+ }
105
+ args.io.writeLine(args.io.out, res.path);
106
+ return 0;
107
+ }
108
+ if (sub === "redact-comment") {
109
+ const commentId = args.positionals[2] ?? args.flags.commentId;
110
+ const id = args.flags.id;
111
+ if (!commentId || !id) {
112
+ args.io.writeLine(args.io.err, "usage: git a5c issue redact-comment <commentId> --id <issueId> [--reason ...]");
113
+ return 2;
114
+ }
115
+ const actor = process.env.A5C_ACTOR ?? (await gitConfigGet(args.repoRoot, "user.name")) ?? "unknown";
116
+ const time = new Date(args.nowMs()).toISOString();
117
+ const persisted = (await loadHlcState(actor)) ?? { wallMs: 0, counter: 0 };
118
+ const clock = new HlcClock(persisted);
119
+ let nonce = 0;
120
+ const ctx = { repoRoot: args.repoRoot, actor, clock, nextNonce: () => String(++nonce).padStart(4, "0") };
121
+ const res = await writeCommentRedacted(ctx, { entity: { type: "issue", id }, commentId, reason: args.flags.reason, time });
122
+ await saveHlcState(actor, clock.now());
123
+ if (args.flags.stageOnly || args.flags.commit)
124
+ await stageFiles(args.repoRoot, [res.path]);
125
+ if (args.flags.commit) {
126
+ const msg = args.flags.message ?? `a5c: issue redact-comment ${id} ${commentId}`;
127
+ await git(["-c", "user.name=a5c", "-c", "user.email=a5c@example.invalid", "commit", "-m", msg], args.repoRoot);
128
+ }
129
+ args.io.writeLine(args.io.out, res.path);
130
+ return 0;
131
+ }
132
+ return;
133
+ }
134
+ //# sourceMappingURL=issue.js.map