cngkit 1.1.18 → 1.1.20

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 (80) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +94 -19
  3. package/dist/chunk-CIZBVLN5.js +35 -0
  4. package/dist/chunk-CIZBVLN5.js.map +1 -0
  5. package/dist/{chunk-IB5B3BLY.js → chunk-E2GLGGKO.js} +16 -4
  6. package/dist/chunk-E2GLGGKO.js.map +1 -0
  7. package/dist/chunk-MRXGD6TC.js +42 -0
  8. package/dist/chunk-MRXGD6TC.js.map +1 -0
  9. package/dist/{chunk-ZA4YOWPB.js → chunk-NGEWD4BW.js} +2 -1
  10. package/dist/chunk-NODJM6SH.js +658 -0
  11. package/dist/chunk-NODJM6SH.js.map +1 -0
  12. package/dist/chunk-SKK2XLRZ.js +1590 -0
  13. package/dist/chunk-SKK2XLRZ.js.map +1 -0
  14. package/dist/chunk-SMTQ3W3F.js +271 -0
  15. package/dist/chunk-SMTQ3W3F.js.map +1 -0
  16. package/dist/{chunk-FJ34NVQ4.js → chunk-WDI43VPW.js} +578 -88
  17. package/dist/chunk-WDI43VPW.js.map +1 -0
  18. package/dist/cli.js +107 -27
  19. package/dist/cli.js.map +1 -1
  20. package/dist/commands/coderoom/index.js +6 -6
  21. package/dist/commands/coderoom/index.js.map +1 -1
  22. package/dist/commands/coderoom/join.js +5 -5
  23. package/dist/commands/coderoom/share.js +5 -5
  24. package/dist/commands/hookify/index.js +6 -6
  25. package/dist/commands/hookify/index.js.map +1 -1
  26. package/dist/commands/hookify/ingest.js +52 -13
  27. package/dist/commands/hookify/ingest.js.map +1 -1
  28. package/dist/commands/hooks/index.js +25 -0
  29. package/dist/commands/hooks/index.js.map +1 -0
  30. package/dist/commands/hooks/install.js +40 -0
  31. package/dist/commands/hooks/install.js.map +1 -0
  32. package/dist/commands/hooks/uninstall.js +40 -0
  33. package/dist/commands/hooks/uninstall.js.map +1 -0
  34. package/dist/commands/index.js +5 -5
  35. package/dist/commands/index.js.map +1 -1
  36. package/dist/commands/knowledges/audiences.js +6 -6
  37. package/dist/commands/knowledges/cat.js +31 -0
  38. package/dist/commands/knowledges/cat.js.map +1 -0
  39. package/dist/commands/knowledges/files.js +6 -6
  40. package/dist/commands/knowledges/find.js +66 -0
  41. package/dist/commands/knowledges/find.js.map +1 -0
  42. package/dist/commands/knowledges/glob.js +6 -6
  43. package/dist/commands/knowledges/grep.js +6 -6
  44. package/dist/commands/knowledges/head.js +41 -0
  45. package/dist/commands/knowledges/head.js.map +1 -0
  46. package/dist/commands/knowledges/index.js +6 -6
  47. package/dist/commands/knowledges/index.js.map +1 -1
  48. package/dist/commands/knowledges/list.js +7 -7
  49. package/dist/commands/knowledges/list.js.map +1 -1
  50. package/dist/commands/knowledges/ls.js +16 -7
  51. package/dist/commands/knowledges/ls.js.map +1 -1
  52. package/dist/commands/knowledges/read.js +6 -6
  53. package/dist/commands/knowledges/realpath.js +31 -0
  54. package/dist/commands/knowledges/realpath.js.map +1 -0
  55. package/dist/commands/knowledges/search.js +6 -6
  56. package/dist/commands/knowledges/stat.js +31 -0
  57. package/dist/commands/knowledges/stat.js.map +1 -0
  58. package/dist/commands/knowledges/status.js +6 -6
  59. package/dist/commands/knowledges/tail.js +41 -0
  60. package/dist/commands/knowledges/tail.js.map +1 -0
  61. package/dist/commands/knowledges/tree.js +46 -0
  62. package/dist/commands/knowledges/tree.js.map +1 -0
  63. package/dist/commands/login.js +4 -4
  64. package/dist/commands/login.js.map +1 -1
  65. package/dist/commands/scrub.js +38 -15
  66. package/dist/commands/scrub.js.map +1 -1
  67. package/dist/commands/transcripts.js +44 -24
  68. package/dist/commands/transcripts.js.map +1 -1
  69. package/package.json +3 -4
  70. package/dist/chunk-C7HFDK4S.js +0 -393
  71. package/dist/chunk-C7HFDK4S.js.map +0 -1
  72. package/dist/chunk-CBIVTEZP.js +0 -222
  73. package/dist/chunk-CBIVTEZP.js.map +0 -1
  74. package/dist/chunk-FJ34NVQ4.js.map +0 -1
  75. package/dist/chunk-IB5B3BLY.js.map +0 -1
  76. package/dist/chunk-KSW6QT5Q.js +0 -628
  77. package/dist/chunk-KSW6QT5Q.js.map +0 -1
  78. package/dist/chunk-TWQDLZ6F.js +0 -26
  79. package/dist/chunk-TWQDLZ6F.js.map +0 -1
  80. /package/dist/{chunk-ZA4YOWPB.js.map → chunk-NGEWD4BW.js.map} +0 -0
package/dist/cli.js CHANGED
@@ -1,31 +1,52 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
- formatCngkitHelp,
4
- formatKnowledgesHelp
5
- } from "./chunk-KSW6QT5Q.js";
3
+ renderCngkitHelp,
4
+ renderKnowledgesHelp
5
+ } from "./chunk-SKK2XLRZ.js";
6
6
  import {
7
- consoleOutput,
8
7
  formatError,
9
8
  packageVersion,
10
9
  parseOutputFormat
11
- } from "./chunk-CBIVTEZP.js";
10
+ } from "./chunk-WDI43VPW.js";
12
11
  import "./chunk-PZ5AY32C.js";
13
12
 
14
13
  // src/cli.ts
15
- import process from "process";
14
+ import process2 from "process";
15
+ import { createElement as createElement2 } from "react";
16
+ import { Text } from "ink";
16
17
  import Pastel from "pastel";
17
18
 
19
+ // src/cli/render-once.ts
20
+ import process from "process";
21
+ import { createElement, useEffect } from "react";
22
+ import { render, useApp } from "ink";
23
+ async function renderOnce(element, options) {
24
+ const instance = render(createElement(ExitAfterFirstRender, { element }), {
25
+ stdin: process.stdin,
26
+ stdout: options?.stdout ?? process.stdout,
27
+ stderr: process.stderr
28
+ });
29
+ await instance.waitUntilExit();
30
+ }
31
+ function ExitAfterFirstRender({ element }) {
32
+ const { exit } = useApp();
33
+ useEffect(() => {
34
+ queueMicrotask(() => exit());
35
+ }, [exit]);
36
+ return element;
37
+ }
38
+
18
39
  // src/cli/help.ts
19
- function printMarkdownHelpIfRequested(argv, output = consoleOutput) {
40
+ async function printHelpIfRequested(argv, output) {
20
41
  const commandName = argv[2];
21
42
  if (commandName === void 0 || commandName === "--help" || commandName === "-h") {
22
- output.markdown(formatCngkitHelp());
43
+ await printHelpComponent(renderCngkitHelp(), output);
23
44
  return true;
24
45
  }
25
46
  if (commandName === "help") {
26
47
  const [topicName, subtopicName] = argv.slice(3);
27
- const topic = (topicName === "knowledges" || topicName === "coderoom" || topicName === "hookify") && subtopicName ? `${topicName}-${subtopicName}` : topicName;
28
- output.markdown(formatCngkitHelp(topic));
48
+ const topic = (topicName === "knowledges" || topicName === "coderoom" || topicName === "hookify" || topicName === "hooks") && subtopicName ? `${topicName}-${subtopicName}` : topicName;
49
+ await printHelpComponent(renderCngkitHelp(topic), output);
29
50
  return true;
30
51
  }
31
52
  const commandArgs = argv.slice(3);
@@ -37,44 +58,69 @@ function printMarkdownHelpIfRequested(argv, output = consoleOutput) {
37
58
  const topic = commandArgs.find(
38
59
  (argument, index) => index !== helpIndex && !argument.startsWith("-")
39
60
  );
40
- output.markdown(formatKnowledgesHelp(topic));
61
+ await printHelpComponent(renderKnowledgesHelp(topic), output);
41
62
  return true;
42
63
  }
43
64
  if (commandName === "coderoom") {
44
65
  const topic = commandArgs.find(
45
66
  (argument, index) => index !== helpIndex && !argument.startsWith("-")
46
67
  );
47
- output.markdown(formatCngkitHelp(topic ? `coderoom-${topic}` : "coderoom"));
68
+ await printHelpComponent(renderCngkitHelp(topic ? `coderoom-${topic}` : "coderoom"), output);
48
69
  return true;
49
70
  }
50
71
  if (commandName === "hookify") {
51
72
  const topic = commandArgs.find(
52
73
  (argument, index) => index !== helpIndex && !argument.startsWith("-")
53
74
  );
54
- output.markdown(formatCngkitHelp(topic ? `hookify-${topic}` : "hookify"));
75
+ await printHelpComponent(renderCngkitHelp(topic ? `hookify-${topic}` : "hookify"), output);
55
76
  return true;
56
77
  }
57
- output.markdown(formatCngkitHelp(commandName));
78
+ if (commandName === "hooks") {
79
+ const topic = commandArgs.find(
80
+ (argument, index) => index !== helpIndex && !argument.startsWith("-")
81
+ );
82
+ await printHelpComponent(renderCngkitHelp(topic ? `hooks-${topic}` : "hooks"), output);
83
+ return true;
84
+ }
85
+ await printHelpComponent(renderCngkitHelp(commandName), output);
58
86
  return true;
59
87
  }
88
+ async function printHelpComponent(element, output) {
89
+ if (output) {
90
+ output.component(element);
91
+ return;
92
+ }
93
+ await renderOnce(element);
94
+ }
60
95
 
61
96
  // src/cli.ts
62
97
  try {
63
- const normalizedArgv = normalizeGlobalOptions(process.argv);
64
- if (printMarkdownHelpIfRequested(normalizedArgv)) {
65
- process.exit(0);
98
+ const normalizedArgv = normalizeGlobalOptions(process2.argv);
99
+ if (await printHelpIfRequested(normalizedArgv)) {
100
+ process2.exit(0);
66
101
  }
67
102
  guardKnownCommand(normalizedArgv);
68
103
  const app = new Pastel({
69
104
  importMeta: import.meta,
70
105
  name: "cngkit",
71
106
  version: packageVersion,
72
- description: "Opinionated Curly.ng CLI kit for Coderoom collaboration and website tooling."
107
+ description: "Opinionated CNG CLI kit for Coderoom collaboration and operator workflows."
73
108
  });
74
109
  await app.run(normalizedArgv);
75
110
  } catch (error) {
76
- console.error(formatError(error));
77
- process.exitCode = 1;
111
+ await renderOnce(
112
+ createElement2(
113
+ Text,
114
+ {
115
+ bold: true,
116
+ color: "red",
117
+ wrap: "wrap"
118
+ },
119
+ formatError(error)
120
+ ),
121
+ { stdout: process2.stderr }
122
+ );
123
+ process2.exitCode = 1;
78
124
  }
79
125
  function normalizeGlobalOptions(argv) {
80
126
  const normalizedArgv = [...argv];
@@ -85,39 +131,58 @@ function normalizeGlobalOptions(argv) {
85
131
  if (!value || value.startsWith("-")) {
86
132
  throw new Error("Missing value for --format");
87
133
  }
88
- process.env.CNGKIT_FORMAT = parseOutputFormat(value);
134
+ process2.env.CNGKIT_FORMAT = parseOutputFormat(value);
89
135
  normalizedArgv.splice(index, 2);
90
136
  index -= 1;
91
137
  continue;
92
138
  }
93
139
  if (argument.startsWith("--format=")) {
94
- process.env.CNGKIT_FORMAT = parseOutputFormat(argument.slice("--format=".length));
140
+ process2.env.CNGKIT_FORMAT = parseOutputFormat(argument.slice("--format=".length));
95
141
  normalizedArgv.splice(index, 1);
96
142
  index -= 1;
97
143
  continue;
98
144
  }
99
145
  if (argument === "--no-color" || argument === "--no-colors") {
100
- process.env.CNGKIT_COLOR = "never";
101
- process.env.CNGKIT_NO_COLOR = "1";
146
+ process2.env.CNGKIT_COLOR = "never";
147
+ process2.env.CNGKIT_NO_COLOR = "1";
102
148
  normalizedArgv.splice(index, 1);
103
149
  index -= 1;
104
150
  continue;
105
151
  }
106
152
  if (argument === "--color") {
107
- process.env.CNGKIT_COLOR = "always";
153
+ process2.env.CNGKIT_COLOR = "always";
108
154
  normalizedArgv.splice(index, 1);
109
155
  index -= 1;
110
156
  continue;
111
157
  }
112
158
  if (argument.startsWith("--color=")) {
113
159
  const colorMode = argument.slice("--color=".length);
114
- process.env.CNGKIT_COLOR = colorMode === "false" || colorMode === "never" ? "never" : "always";
160
+ process2.env.CNGKIT_COLOR = colorMode === "false" || colorMode === "never" ? "never" : "always";
115
161
  normalizedArgv.splice(index, 1);
116
162
  index -= 1;
117
163
  }
118
164
  }
165
+ normalizeKnowledgesFindOptions(normalizedArgv);
119
166
  return normalizedArgv;
120
167
  }
168
+ function normalizeKnowledgesFindOptions(argv) {
169
+ if (argv[2] !== "knowledges" || argv[3] !== "find") {
170
+ return;
171
+ }
172
+ for (let index = 4; index < argv.length; index += 1) {
173
+ if (argv[index] === "-name") {
174
+ argv[index] = "--name";
175
+ continue;
176
+ }
177
+ if (argv[index] === "-type") {
178
+ argv[index] = "--type";
179
+ continue;
180
+ }
181
+ if (argv[index] === "-maxdepth") {
182
+ argv[index] = "--max-depth";
183
+ }
184
+ }
185
+ }
121
186
  function guardKnownCommand(argv) {
122
187
  const commandName = argv[2];
123
188
  if (commandName === void 0 || commandName.startsWith("-")) {
@@ -130,6 +195,7 @@ function guardKnownCommand(argv) {
130
195
  "scrub",
131
196
  "transcripts",
132
197
  "knowledges",
198
+ "hooks",
133
199
  "hookify"
134
200
  ]);
135
201
  if (!knownCommands.has(commandName)) {
@@ -156,13 +222,21 @@ function guardKnownSubcommand(commandName, commandArgs) {
156
222
  "list",
157
223
  "files",
158
224
  "read",
225
+ "cat",
226
+ "head",
227
+ "tail",
159
228
  "grep",
160
229
  "glob",
230
+ "ls",
231
+ "tree",
232
+ "find",
233
+ "stat",
234
+ "realpath",
161
235
  "help"
162
236
  ]);
163
237
  if (!knownKnowledgesSubcommands.has(subcommand)) {
164
238
  throw new Error(
165
- `Unknown knowledges command "${subcommand}". Use one of: status, audiences, search, list, files, read, grep, glob.`
239
+ `Unknown knowledges command "${subcommand}". Use one of: status, audiences, search, list, files, read, cat, head, tail, grep, glob, ls, tree, find, stat, realpath.`
166
240
  );
167
241
  }
168
242
  }
@@ -172,5 +246,11 @@ function guardKnownSubcommand(commandName, commandArgs) {
172
246
  throw new Error(`Unknown hookify command "${subcommand}". Use one of: ingest.`);
173
247
  }
174
248
  }
249
+ if (commandName === "hooks") {
250
+ const knownHooksSubcommands = /* @__PURE__ */ new Set(["install", "uninstall"]);
251
+ if (!knownHooksSubcommands.has(subcommand)) {
252
+ throw new Error(`Unknown hooks command "${subcommand}". Use one of: install, uninstall.`);
253
+ }
254
+ }
175
255
  }
176
256
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/cli/help.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport process from \"node:process\";\n\nimport Pastel from \"pastel\";\n\nimport { printMarkdownHelpIfRequested } from \"./cli/help.js\";\nimport { packageVersion, parseOutputFormat } from \"./shared/config.js\";\nimport { formatError } from \"./shared/output.js\";\n\ntry {\n const normalizedArgv = normalizeGlobalOptions(process.argv);\n\n if (printMarkdownHelpIfRequested(normalizedArgv)) {\n process.exit(0);\n }\n\n guardKnownCommand(normalizedArgv);\n\n const app = new Pastel({\n importMeta: import.meta,\n name: \"cngkit\",\n version: packageVersion,\n description: \"Opinionated Curly.ng CLI kit for Coderoom collaboration and website tooling.\",\n });\n\n await app.run(normalizedArgv);\n} catch (error) {\n console.error(formatError(error));\n process.exitCode = 1;\n}\n\nfunction normalizeGlobalOptions(argv: string[]): string[] {\n const normalizedArgv = [...argv];\n\n for (let index = 2; index < normalizedArgv.length; index += 1) {\n const argument = normalizedArgv[index];\n\n if (argument === \"--format\") {\n const value = normalizedArgv[index + 1];\n if (!value || value.startsWith(\"-\")) {\n throw new Error(\"Missing value for --format\");\n }\n\n process.env.CNGKIT_FORMAT = parseOutputFormat(value);\n normalizedArgv.splice(index, 2);\n index -= 1;\n continue;\n }\n\n if (argument.startsWith(\"--format=\")) {\n process.env.CNGKIT_FORMAT = parseOutputFormat(argument.slice(\"--format=\".length));\n normalizedArgv.splice(index, 1);\n index -= 1;\n continue;\n }\n\n if (argument === \"--no-color\" || argument === \"--no-colors\") {\n process.env.CNGKIT_COLOR = \"never\";\n process.env.CNGKIT_NO_COLOR = \"1\";\n normalizedArgv.splice(index, 1);\n index -= 1;\n continue;\n }\n\n if (argument === \"--color\") {\n process.env.CNGKIT_COLOR = \"always\";\n normalizedArgv.splice(index, 1);\n index -= 1;\n continue;\n }\n\n if (argument.startsWith(\"--color=\")) {\n const colorMode = argument.slice(\"--color=\".length);\n process.env.CNGKIT_COLOR =\n colorMode === \"false\" || colorMode === \"never\" ? \"never\" : \"always\";\n normalizedArgv.splice(index, 1);\n index -= 1;\n }\n }\n\n return normalizedArgv;\n}\n\nfunction guardKnownCommand(argv: string[]): void {\n const commandName = argv[2];\n if (commandName === undefined || commandName.startsWith(\"-\")) {\n return;\n }\n\n const knownCommands = new Set([\n \"help\",\n \"login\",\n \"coderoom\",\n \"scrub\",\n \"transcripts\",\n \"knowledges\",\n \"hookify\",\n ]);\n if (!knownCommands.has(commandName)) {\n throw new Error(`Unknown command \"${commandName}\". Run cngkit --help for available commands.`);\n }\n\n guardKnownSubcommand(commandName, argv.slice(3));\n}\n\nfunction guardKnownSubcommand(commandName: string, commandArgs: string[]): void {\n const subcommand = commandArgs.find((argument) => !argument.startsWith(\"-\"));\n if (!subcommand) {\n return;\n }\n\n if (commandName === \"coderoom\") {\n const knownCoderoomSubcommands = new Set([\"share\", \"join\"]);\n if (!knownCoderoomSubcommands.has(subcommand)) {\n throw new Error(`Unknown coderoom command \"${subcommand}\". Use one of: share, join.`);\n }\n }\n\n if (commandName === \"knowledges\") {\n const knownKnowledgesSubcommands = new Set([\n \"status\",\n \"audiences\",\n \"search\",\n \"list\",\n \"files\",\n \"read\",\n \"grep\",\n \"glob\",\n \"help\",\n ]);\n if (!knownKnowledgesSubcommands.has(subcommand)) {\n throw new Error(\n `Unknown knowledges command \"${subcommand}\". Use one of: status, audiences, search, list, files, read, grep, glob.`\n );\n }\n }\n\n if (commandName === \"hookify\") {\n const knownHookifySubcommands = new Set([\"ingest\"]);\n if (!knownHookifySubcommands.has(subcommand)) {\n throw new Error(`Unknown hookify command \"${subcommand}\". Use one of: ingest.`);\n }\n }\n}\n","import { formatCngkitHelp, formatKnowledgesHelp } from \"./help-specs.js\";\nimport { consoleOutput, type CommandOutput } from \"../shared/output.js\";\n\nexport function printMarkdownHelpIfRequested(\n argv: string[],\n output: CommandOutput = consoleOutput\n): boolean {\n const commandName = argv[2];\n\n if (commandName === undefined || commandName === \"--help\" || commandName === \"-h\") {\n output.markdown(formatCngkitHelp());\n return true;\n }\n\n if (commandName === \"help\") {\n const [topicName, subtopicName] = argv.slice(3);\n const topic =\n (topicName === \"knowledges\" || topicName === \"coderoom\" || topicName === \"hookify\") &&\n subtopicName\n ? `${topicName}-${subtopicName}`\n : topicName;\n output.markdown(formatCngkitHelp(topic));\n return true;\n }\n\n const commandArgs = argv.slice(3);\n const helpIndex = commandArgs.findIndex((argument) => argument === \"--help\" || argument === \"-h\");\n\n if (helpIndex < 0) {\n return false;\n }\n\n if (commandName === \"knowledges\") {\n const topic = commandArgs.find(\n (argument, index) => index !== helpIndex && !argument.startsWith(\"-\")\n );\n output.markdown(formatKnowledgesHelp(topic));\n return true;\n }\n\n if (commandName === \"coderoom\") {\n const topic = commandArgs.find(\n (argument, index) => index !== helpIndex && !argument.startsWith(\"-\")\n );\n output.markdown(formatCngkitHelp(topic ? `coderoom-${topic}` : \"coderoom\"));\n return true;\n }\n\n if (commandName === \"hookify\") {\n const topic = commandArgs.find(\n (argument, index) => index !== helpIndex && !argument.startsWith(\"-\")\n );\n output.markdown(formatCngkitHelp(topic ? `hookify-${topic}` : \"hookify\"));\n return true;\n }\n\n output.markdown(formatCngkitHelp(commandName));\n return true;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/cli/render-once.ts","../src/cli/help.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport process from \"node:process\";\nimport { createElement } from \"react\";\nimport { Text } from \"ink\";\n\nimport Pastel from \"pastel\";\n\nimport { printHelpIfRequested } from \"./cli/help.js\";\nimport { renderOnce } from \"./cli/render-once.js\";\nimport { packageVersion, parseOutputFormat } from \"./shared/config.js\";\nimport { formatError } from \"./shared/output.js\";\n\ntry {\n const normalizedArgv = normalizeGlobalOptions(process.argv);\n\n if (await printHelpIfRequested(normalizedArgv)) {\n process.exit(0);\n }\n\n guardKnownCommand(normalizedArgv);\n\n const app = new Pastel({\n importMeta: import.meta,\n name: \"cngkit\",\n version: packageVersion,\n description: \"Opinionated CNG CLI kit for Coderoom collaboration and operator workflows.\",\n });\n\n await app.run(normalizedArgv);\n} catch (error) {\n await renderOnce(\n createElement(\n Text,\n {\n bold: true,\n color: \"red\",\n wrap: \"wrap\",\n },\n formatError(error)\n ),\n { stdout: process.stderr }\n );\n process.exitCode = 1;\n}\n\nfunction normalizeGlobalOptions(argv: string[]): string[] {\n const normalizedArgv = [...argv];\n\n for (let index = 2; index < normalizedArgv.length; index += 1) {\n const argument = normalizedArgv[index];\n\n if (argument === \"--format\") {\n const value = normalizedArgv[index + 1];\n if (!value || value.startsWith(\"-\")) {\n throw new Error(\"Missing value for --format\");\n }\n\n process.env.CNGKIT_FORMAT = parseOutputFormat(value);\n normalizedArgv.splice(index, 2);\n index -= 1;\n continue;\n }\n\n if (argument.startsWith(\"--format=\")) {\n process.env.CNGKIT_FORMAT = parseOutputFormat(argument.slice(\"--format=\".length));\n normalizedArgv.splice(index, 1);\n index -= 1;\n continue;\n }\n\n if (argument === \"--no-color\" || argument === \"--no-colors\") {\n process.env.CNGKIT_COLOR = \"never\";\n process.env.CNGKIT_NO_COLOR = \"1\";\n normalizedArgv.splice(index, 1);\n index -= 1;\n continue;\n }\n\n if (argument === \"--color\") {\n process.env.CNGKIT_COLOR = \"always\";\n normalizedArgv.splice(index, 1);\n index -= 1;\n continue;\n }\n\n if (argument.startsWith(\"--color=\")) {\n const colorMode = argument.slice(\"--color=\".length);\n process.env.CNGKIT_COLOR =\n colorMode === \"false\" || colorMode === \"never\" ? \"never\" : \"always\";\n normalizedArgv.splice(index, 1);\n index -= 1;\n }\n }\n\n normalizeKnowledgesFindOptions(normalizedArgv);\n return normalizedArgv;\n}\n\nfunction normalizeKnowledgesFindOptions(argv: string[]): void {\n if (argv[2] !== \"knowledges\" || argv[3] !== \"find\") {\n return;\n }\n\n for (let index = 4; index < argv.length; index += 1) {\n if (argv[index] === \"-name\") {\n argv[index] = \"--name\";\n continue;\n }\n\n if (argv[index] === \"-type\") {\n argv[index] = \"--type\";\n continue;\n }\n\n if (argv[index] === \"-maxdepth\") {\n argv[index] = \"--max-depth\";\n }\n }\n}\n\nfunction guardKnownCommand(argv: string[]): void {\n const commandName = argv[2];\n if (commandName === undefined || commandName.startsWith(\"-\")) {\n return;\n }\n\n const knownCommands = new Set([\n \"help\",\n \"login\",\n \"coderoom\",\n \"scrub\",\n \"transcripts\",\n \"knowledges\",\n \"hooks\",\n \"hookify\",\n ]);\n if (!knownCommands.has(commandName)) {\n throw new Error(`Unknown command \"${commandName}\". Run cngkit --help for available commands.`);\n }\n\n guardKnownSubcommand(commandName, argv.slice(3));\n}\n\nfunction guardKnownSubcommand(commandName: string, commandArgs: string[]): void {\n const subcommand = commandArgs.find((argument) => !argument.startsWith(\"-\"));\n if (!subcommand) {\n return;\n }\n\n if (commandName === \"coderoom\") {\n const knownCoderoomSubcommands = new Set([\"share\", \"join\"]);\n if (!knownCoderoomSubcommands.has(subcommand)) {\n throw new Error(`Unknown coderoom command \"${subcommand}\". Use one of: share, join.`);\n }\n }\n\n if (commandName === \"knowledges\") {\n const knownKnowledgesSubcommands = new Set([\n \"status\",\n \"audiences\",\n \"search\",\n \"list\",\n \"files\",\n \"read\",\n \"cat\",\n \"head\",\n \"tail\",\n \"grep\",\n \"glob\",\n \"ls\",\n \"tree\",\n \"find\",\n \"stat\",\n \"realpath\",\n \"help\",\n ]);\n if (!knownKnowledgesSubcommands.has(subcommand)) {\n throw new Error(\n `Unknown knowledges command \"${subcommand}\". Use one of: status, audiences, search, list, files, read, cat, head, tail, grep, glob, ls, tree, find, stat, realpath.`\n );\n }\n }\n\n if (commandName === \"hookify\") {\n const knownHookifySubcommands = new Set([\"ingest\"]);\n if (!knownHookifySubcommands.has(subcommand)) {\n throw new Error(`Unknown hookify command \"${subcommand}\". Use one of: ingest.`);\n }\n }\n\n if (commandName === \"hooks\") {\n const knownHooksSubcommands = new Set([\"install\", \"uninstall\"]);\n if (!knownHooksSubcommands.has(subcommand)) {\n throw new Error(`Unknown hooks command \"${subcommand}\". Use one of: install, uninstall.`);\n }\n }\n}\n","import process from \"node:process\";\nimport { createElement, useEffect, type ReactElement } from \"react\";\nimport { render, useApp } from \"ink\";\n\ntype OutputStream = NodeJS.WriteStream;\n\nexport async function renderOnce(\n element: ReactElement,\n options?: {\n readonly stdout?: OutputStream;\n }\n): Promise<void> {\n const instance = render(createElement(ExitAfterFirstRender, { element }), {\n stdin: process.stdin,\n stdout: options?.stdout ?? process.stdout,\n stderr: process.stderr,\n });\n await instance.waitUntilExit();\n}\n\nfunction ExitAfterFirstRender({ element }: { readonly element: ReactElement }) {\n const { exit } = useApp();\n\n useEffect(() => {\n queueMicrotask(() => exit());\n }, [exit]);\n\n return element;\n}\n","import type { ReactElement } from \"react\";\n\nimport { renderCngkitHelp, renderKnowledgesHelp } from \"./help-specs.js\";\nimport { renderOnce } from \"./render-once.js\";\nimport type { CommandOutput } from \"../shared/output.js\";\n\nexport async function printHelpIfRequested(\n argv: string[],\n output?: CommandOutput\n): Promise<boolean> {\n const commandName = argv[2];\n\n if (commandName === undefined || commandName === \"--help\" || commandName === \"-h\") {\n await printHelpComponent(renderCngkitHelp(), output);\n return true;\n }\n\n if (commandName === \"help\") {\n const [topicName, subtopicName] = argv.slice(3);\n const topic =\n (topicName === \"knowledges\" ||\n topicName === \"coderoom\" ||\n topicName === \"hookify\" ||\n topicName === \"hooks\") &&\n subtopicName\n ? `${topicName}-${subtopicName}`\n : topicName;\n await printHelpComponent(renderCngkitHelp(topic), output);\n return true;\n }\n\n const commandArgs = argv.slice(3);\n const helpIndex = commandArgs.findIndex((argument) => argument === \"--help\" || argument === \"-h\");\n\n if (helpIndex < 0) {\n return false;\n }\n\n if (commandName === \"knowledges\") {\n const topic = commandArgs.find(\n (argument, index) => index !== helpIndex && !argument.startsWith(\"-\")\n );\n await printHelpComponent(renderKnowledgesHelp(topic), output);\n return true;\n }\n\n if (commandName === \"coderoom\") {\n const topic = commandArgs.find(\n (argument, index) => index !== helpIndex && !argument.startsWith(\"-\")\n );\n await printHelpComponent(renderCngkitHelp(topic ? `coderoom-${topic}` : \"coderoom\"), output);\n return true;\n }\n\n if (commandName === \"hookify\") {\n const topic = commandArgs.find(\n (argument, index) => index !== helpIndex && !argument.startsWith(\"-\")\n );\n await printHelpComponent(renderCngkitHelp(topic ? `hookify-${topic}` : \"hookify\"), output);\n return true;\n }\n\n if (commandName === \"hooks\") {\n const topic = commandArgs.find(\n (argument, index) => index !== helpIndex && !argument.startsWith(\"-\")\n );\n await printHelpComponent(renderCngkitHelp(topic ? `hooks-${topic}` : \"hooks\"), output);\n return true;\n }\n\n await printHelpComponent(renderCngkitHelp(commandName), output);\n return true;\n}\n\nasync function printHelpComponent(element: ReactElement, output: CommandOutput | undefined): Promise<void> {\n if (output) {\n output.component(element);\n return;\n }\n\n await renderOnce(element);\n}\n"],"mappings":"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","names":["process","createElement","process","createElement"]}
@@ -1,13 +1,13 @@
1
1
  import {
2
- formatCngkitHelp
3
- } from "../../chunk-KSW6QT5Q.js";
2
+ renderCngkitHelp
3
+ } from "../../chunk-SKK2XLRZ.js";
4
4
  import {
5
5
  GlobalOptionsSchema
6
- } from "../../chunk-ZA4YOWPB.js";
6
+ } from "../../chunk-NGEWD4BW.js";
7
7
  import {
8
8
  CommandRunner
9
- } from "../../chunk-TWQDLZ6F.js";
10
- import "../../chunk-CBIVTEZP.js";
9
+ } from "../../chunk-MRXGD6TC.js";
10
+ import "../../chunk-WDI43VPW.js";
11
11
  import "../../chunk-PZ5AY32C.js";
12
12
 
13
13
  // src/commands/coderoom/index.tsx
@@ -15,7 +15,7 @@ import { jsx } from "react/jsx-runtime";
15
15
  var description = "Start or join a real-time repo sync room";
16
16
  var options = GlobalOptionsSchema;
17
17
  function CoderoomCommand() {
18
- return /* @__PURE__ */ jsx(CommandRunner, { run: async (output) => output.markdown(formatCngkitHelp("coderoom")) });
18
+ return /* @__PURE__ */ jsx(CommandRunner, { run: async (output) => output.component(renderCngkitHelp("coderoom")) });
19
19
  }
20
20
  export {
21
21
  CoderoomCommand as default,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/coderoom/index.tsx"],"sourcesContent":["import { GlobalOptionsSchema } from \"../../cli/options.js\";\nimport { formatCngkitHelp } from \"../../cli/help-specs.js\";\nimport { CommandRunner } from \"../../cli/command-runner.js\";\n\nexport const description = \"Start or join a real-time repo sync room\";\nexport const options = GlobalOptionsSchema;\n\nexport default function CoderoomCommand() {\n return <CommandRunner run={async (output) => output.markdown(formatCngkitHelp(\"coderoom\"))} />;\n}\n"],"mappings":";;;;;;;;;;;;;AAQS;AAJF,IAAM,cAAc;AACpB,IAAM,UAAU;AAER,SAAR,kBAAmC;AACxC,SAAO,oBAAC,iBAAc,KAAK,OAAO,WAAW,OAAO,SAAS,iBAAiB,UAAU,CAAC,GAAG;AAC9F;","names":[]}
1
+ {"version":3,"sources":["../../../src/commands/coderoom/index.tsx"],"sourcesContent":["import { GlobalOptionsSchema } from \"../../cli/options.js\";\nimport { renderCngkitHelp } from \"../../cli/help-specs.js\";\nimport { CommandRunner } from \"../../cli/command-runner.js\";\n\nexport const description = \"Start or join a real-time repo sync room\";\nexport const options = GlobalOptionsSchema;\n\nexport default function CoderoomCommand() {\n return <CommandRunner run={async (output) => output.component(renderCngkitHelp(\"coderoom\"))} />;\n}\n"],"mappings":";;;;;;;;;;;;;AAQS;AAJF,IAAM,cAAc;AACpB,IAAM,UAAU;AAER,SAAR,kBAAmC;AACxC,SAAO,oBAAC,iBAAc,KAAK,OAAO,WAAW,OAAO,UAAU,iBAAiB,UAAU,CAAC,GAAG;AAC/F;","names":[]}
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  runJoinCommand
3
- } from "../../chunk-IB5B3BLY.js";
4
- import "../../chunk-FJ34NVQ4.js";
3
+ } from "../../chunk-E2GLGGKO.js";
4
+ import "../../chunk-CIZBVLN5.js";
5
5
  import {
6
6
  GlobalOptionsSchema,
7
7
  RequiredRoomCodeArgsSchema
8
- } from "../../chunk-ZA4YOWPB.js";
8
+ } from "../../chunk-NGEWD4BW.js";
9
9
  import {
10
10
  CommandRunner
11
- } from "../../chunk-TWQDLZ6F.js";
12
- import "../../chunk-CBIVTEZP.js";
11
+ } from "../../chunk-MRXGD6TC.js";
12
+ import "../../chunk-WDI43VPW.js";
13
13
  import "../../chunk-PZ5AY32C.js";
14
14
 
15
15
  // src/commands/coderoom/join.tsx
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  runShareCommand
3
- } from "../../chunk-IB5B3BLY.js";
4
- import "../../chunk-FJ34NVQ4.js";
3
+ } from "../../chunk-E2GLGGKO.js";
4
+ import "../../chunk-CIZBVLN5.js";
5
5
  import {
6
6
  GlobalOptionsSchema,
7
7
  OptionalRoomCodeArgsSchema
8
- } from "../../chunk-ZA4YOWPB.js";
8
+ } from "../../chunk-NGEWD4BW.js";
9
9
  import {
10
10
  CommandRunner
11
- } from "../../chunk-TWQDLZ6F.js";
12
- import "../../chunk-CBIVTEZP.js";
11
+ } from "../../chunk-MRXGD6TC.js";
12
+ import "../../chunk-WDI43VPW.js";
13
13
  import "../../chunk-PZ5AY32C.js";
14
14
 
15
15
  // src/commands/coderoom/share.tsx
@@ -1,13 +1,13 @@
1
1
  import {
2
- formatCngkitHelp
3
- } from "../../chunk-KSW6QT5Q.js";
2
+ renderCngkitHelp
3
+ } from "../../chunk-SKK2XLRZ.js";
4
4
  import {
5
5
  GlobalOptionsSchema
6
- } from "../../chunk-ZA4YOWPB.js";
6
+ } from "../../chunk-NGEWD4BW.js";
7
7
  import {
8
8
  CommandRunner
9
- } from "../../chunk-TWQDLZ6F.js";
10
- import "../../chunk-CBIVTEZP.js";
9
+ } from "../../chunk-MRXGD6TC.js";
10
+ import "../../chunk-WDI43VPW.js";
11
11
  import "../../chunk-PZ5AY32C.js";
12
12
 
13
13
  // src/commands/hookify/index.tsx
@@ -15,7 +15,7 @@ import { jsx } from "react/jsx-runtime";
15
15
  var description = "Forward hook events to Hookify";
16
16
  var options = GlobalOptionsSchema;
17
17
  function HookifyCommand() {
18
- return /* @__PURE__ */ jsx(CommandRunner, { run: async (output) => output.markdown(formatCngkitHelp("hookify")) });
18
+ return /* @__PURE__ */ jsx(CommandRunner, { run: async (output) => output.component(renderCngkitHelp("hookify")) });
19
19
  }
20
20
  export {
21
21
  HookifyCommand as default,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/hookify/index.tsx"],"sourcesContent":["import { GlobalOptionsSchema } from \"../../cli/options.js\";\nimport { formatCngkitHelp } from \"../../cli/help-specs.js\";\nimport { CommandRunner } from \"../../cli/command-runner.js\";\n\nexport const description = \"Forward hook events to Hookify\";\nexport const options = GlobalOptionsSchema;\n\nexport default function HookifyCommand() {\n return <CommandRunner run={async (output) => output.markdown(formatCngkitHelp(\"hookify\"))} />;\n}\n"],"mappings":";;;;;;;;;;;;;AAQS;AAJF,IAAM,cAAc;AACpB,IAAM,UAAU;AAER,SAAR,iBAAkC;AACvC,SAAO,oBAAC,iBAAc,KAAK,OAAO,WAAW,OAAO,SAAS,iBAAiB,SAAS,CAAC,GAAG;AAC7F;","names":[]}
1
+ {"version":3,"sources":["../../../src/commands/hookify/index.tsx"],"sourcesContent":["import { GlobalOptionsSchema } from \"../../cli/options.js\";\nimport { renderCngkitHelp } from \"../../cli/help-specs.js\";\nimport { CommandRunner } from \"../../cli/command-runner.js\";\n\nexport const description = \"Forward hook events to Hookify\";\nexport const options = GlobalOptionsSchema;\n\nexport default function HookifyCommand() {\n return <CommandRunner run={async (output) => output.component(renderCngkitHelp(\"hookify\"))} />;\n}\n"],"mappings":";;;;;;;;;;;;;AAQS;AAJF,IAAM,cAAc;AACpB,IAAM,UAAU;AAER,SAAR,iBAAkC;AACvC,SAAO,oBAAC,iBAAc,KAAK,OAAO,WAAW,OAAO,UAAU,iBAAiB,SAAS,CAAC,GAAG;AAC9F;","names":[]}
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  createCngApiClient
3
- } from "../../chunk-FJ34NVQ4.js";
3
+ } from "../../chunk-CIZBVLN5.js";
4
4
  import {
5
5
  GlobalOptionsSchema
6
- } from "../../chunk-ZA4YOWPB.js";
6
+ } from "../../chunk-NGEWD4BW.js";
7
7
  import {
8
8
  CommandRunner
9
- } from "../../chunk-TWQDLZ6F.js";
10
- import "../../chunk-CBIVTEZP.js";
9
+ } from "../../chunk-MRXGD6TC.js";
10
+ import "../../chunk-WDI43VPW.js";
11
11
  import "../../chunk-PZ5AY32C.js";
12
12
 
13
13
  // src/commands/hookify/ingest.tsx
@@ -16,23 +16,28 @@ import { z } from "zod";
16
16
 
17
17
  // src/features/hookify/run-hookify-command.ts
18
18
  import process from "process";
19
+ var defaultPollAfterMs = 1e3;
20
+ var minimumPollAfterMs = 25;
21
+ var maximumPollAfterMs = 5e3;
22
+ var pollTimeoutMs = 12e4;
19
23
  async function runHookifyIngestCommand(options2) {
20
24
  const payload = await readStdinBuffer();
21
25
  try {
22
- const response = await forwardHookifyPayload(payload, options2);
23
- if (response.stdout.length > 0) {
24
- process.stdout.write(response.stdout);
26
+ const client = createCngApiClient(options2);
27
+ const response = await forwardHookifyPayload(client, payload, options2);
28
+ const result = await resolveHookifyResult(client, response);
29
+ if (result.stdout.length > 0) {
30
+ process.stdout.write(result.stdout);
25
31
  }
26
- if (response.stderr.length > 0) {
27
- process.stderr.write(response.stderr);
32
+ if (result.stderr.length > 0) {
33
+ process.stderr.write(result.stderr);
28
34
  }
29
- process.exitCode = response.exitCode;
35
+ process.exitCode = result.exitCode;
30
36
  } catch {
31
37
  process.exitCode = 0;
32
38
  }
33
39
  }
34
- async function forwardHookifyPayload(payload, options2) {
35
- const client = createCngApiClient(options2);
40
+ async function forwardHookifyPayload(client, payload, options2) {
36
41
  return client.hookify.ingestHookifyHook(
37
42
  {
38
43
  data: payload,
@@ -45,6 +50,40 @@ async function forwardHookifyPayload(payload, options2) {
45
50
  }
46
51
  );
47
52
  }
53
+ async function resolveHookifyResult(client, response) {
54
+ if (response.status === "completed") {
55
+ return completedHookifyResult(response);
56
+ }
57
+ return pollHookifyRequest(client, response.requestId, response.pollAfterMs);
58
+ }
59
+ async function pollHookifyRequest(client, requestId, initialPollAfterMs) {
60
+ let pollAfterMs = initialPollAfterMs ?? defaultPollAfterMs;
61
+ const deadlineAt = Date.now() + pollTimeoutMs;
62
+ while (Date.now() < deadlineAt) {
63
+ await sleep(clampPollAfterMs(pollAfterMs));
64
+ const response = await client.hookify.getHookifyRequest({ requestId });
65
+ if (response.status === "completed") {
66
+ return completedHookifyResult(response);
67
+ }
68
+ pollAfterMs = response.pollAfterMs ?? defaultPollAfterMs;
69
+ }
70
+ throw new Error("Timed out while polling Hookify request");
71
+ }
72
+ function completedHookifyResult(response) {
73
+ return {
74
+ stdout: response.stdout ?? "",
75
+ stderr: response.stderr ?? "",
76
+ exitCode: response.exitCode ?? 0
77
+ };
78
+ }
79
+ function clampPollAfterMs(pollAfterMs) {
80
+ return Math.min(Math.max(pollAfterMs, minimumPollAfterMs), maximumPollAfterMs);
81
+ }
82
+ function sleep(milliseconds) {
83
+ return new Promise((resolve) => {
84
+ setTimeout(resolve, milliseconds);
85
+ });
86
+ }
48
87
  async function readStdinBuffer() {
49
88
  const chunks = [];
50
89
  for await (const chunk of process.stdin) {
@@ -67,7 +106,7 @@ var description = "Read a hook payload from stdin and forward it to Hookify";
67
106
  var options = GlobalOptionsSchema.extend({
68
107
  async: z.boolean().optional().describe(
69
108
  option({
70
- description: "Accept hook payload asynchronously and return immediately"
109
+ description: "Allow server workflow processing; poll until the hook result is ready"
71
110
  })
72
111
  ),
73
112
  event: z.string().optional().describe(
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/hookify/ingest.tsx","../../../src/features/hookify/run-hookify-command.ts"],"sourcesContent":["import { option } from \"pastel\";\nimport { z } from \"zod\";\n\nimport { GlobalOptionsSchema } from \"../../cli/options.js\";\nimport { CommandRunner } from \"../../cli/command-runner.js\";\nimport {\n runHookifyIngestCommand,\n type HookifyIngestCommandOptions,\n} from \"../../features/hookify/run-hookify-command.js\";\n\nexport const description = \"Read a hook payload from stdin and forward it to Hookify\";\nexport const options = GlobalOptionsSchema.extend({\n async: z\n .boolean()\n .optional()\n .describe(\n option({\n description: \"Accept hook payload asynchronously and return immediately\",\n })\n ),\n event: z\n .string()\n .optional()\n .describe(\n option({\n description: \"Optional hook event label\",\n valueDescription: \"name\",\n })\n ),\n});\n\ntype HookifyIngestCommandProps = {\n readonly options: HookifyIngestCommandOptions;\n};\n\nexport default function HookifyIngestCommand({ options }: HookifyIngestCommandProps) {\n return <CommandRunner run={() => runHookifyIngestCommand(options)} />;\n}\n","import process from \"node:process\";\nimport type { CngApi } from \"@cng/client\";\n\nimport { createCngApiClient } from \"../../shared/api-client.js\";\nimport type { GlobalCommandOptions } from \"../../shared/config.js\";\n\nexport type HookifyIngestCommandOptions = GlobalCommandOptions & {\n readonly async?: boolean;\n readonly event?: string;\n};\n\nexport async function runHookifyIngestCommand(options: HookifyIngestCommandOptions): Promise<void> {\n const payload = await readStdinBuffer();\n\n try {\n const response = await forwardHookifyPayload(payload, options);\n if (response.stdout.length > 0) {\n process.stdout.write(response.stdout);\n }\n if (response.stderr.length > 0) {\n process.stderr.write(response.stderr);\n }\n process.exitCode = response.exitCode;\n } catch {\n process.exitCode = 0;\n }\n}\n\nasync function forwardHookifyPayload(\n payload: Buffer,\n options: HookifyIngestCommandOptions\n): Promise<CngApi.HookifyIngestResponse> {\n const client = createCngApiClient(options);\n return client.hookify.ingestHookifyHook(\n {\n data: payload,\n contentType: \"application/octet-stream\",\n contentLength: payload.byteLength,\n },\n {\n mode: options.async === true ? \"async\" : \"sync\",\n event: options.event,\n }\n );\n}\n\nasync function readStdinBuffer(): Promise<Buffer> {\n const chunks: Uint8Array[] = [];\n\n for await (const chunk of process.stdin) {\n if (typeof chunk === \"string\") {\n chunks.push(Buffer.from(chunk));\n continue;\n }\n\n if (chunk instanceof Uint8Array) {\n chunks.push(chunk);\n continue;\n }\n\n chunks.push(Buffer.from(String(chunk)));\n }\n\n return Buffer.concat(chunks);\n}\n"],"mappings":";;;;;;;;;;;;;AAAA,SAAS,cAAc;AACvB,SAAS,SAAS;;;ACDlB,OAAO,aAAa;AAWpB,eAAsB,wBAAwBA,UAAqD;AACjG,QAAM,UAAU,MAAM,gBAAgB;AAEtC,MAAI;AACF,UAAM,WAAW,MAAM,sBAAsB,SAASA,QAAO;AAC7D,QAAI,SAAS,OAAO,SAAS,GAAG;AAC9B,cAAQ,OAAO,MAAM,SAAS,MAAM;AAAA,IACtC;AACA,QAAI,SAAS,OAAO,SAAS,GAAG;AAC9B,cAAQ,OAAO,MAAM,SAAS,MAAM;AAAA,IACtC;AACA,YAAQ,WAAW,SAAS;AAAA,EAC9B,QAAQ;AACN,YAAQ,WAAW;AAAA,EACrB;AACF;AAEA,eAAe,sBACb,SACAA,UACuC;AACvC,QAAM,SAAS,mBAAmBA,QAAO;AACzC,SAAO,OAAO,QAAQ;AAAA,IACpB;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,eAAe,QAAQ;AAAA,IACzB;AAAA,IACA;AAAA,MACE,MAAMA,SAAQ,UAAU,OAAO,UAAU;AAAA,MACzC,OAAOA,SAAQ;AAAA,IACjB;AAAA,EACF;AACF;AAEA,eAAe,kBAAmC;AAChD,QAAM,SAAuB,CAAC;AAE9B,mBAAiB,SAAS,QAAQ,OAAO;AACvC,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO,KAAK,OAAO,KAAK,KAAK,CAAC;AAC9B;AAAA,IACF;AAEA,QAAI,iBAAiB,YAAY;AAC/B,aAAO,KAAK,KAAK;AACjB;AAAA,IACF;AAEA,WAAO,KAAK,OAAO,KAAK,OAAO,KAAK,CAAC,CAAC;AAAA,EACxC;AAEA,SAAO,OAAO,OAAO,MAAM;AAC7B;;;AD5BS;AA1BF,IAAM,cAAc;AACpB,IAAM,UAAU,oBAAoB,OAAO;AAAA,EAChD,OAAO,EACJ,QAAQ,EACR,SAAS,EACT;AAAA,IACC,OAAO;AAAA,MACL,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AAAA,EACF,OAAO,EACJ,OAAO,EACP,SAAS,EACT;AAAA,IACC,OAAO;AAAA,MACL,aAAa;AAAA,MACb,kBAAkB;AAAA,IACpB,CAAC;AAAA,EACH;AACJ,CAAC;AAMc,SAAR,qBAAsC,EAAE,SAAAC,SAAQ,GAA8B;AACnF,SAAO,oBAAC,iBAAc,KAAK,MAAM,wBAAwBA,QAAO,GAAG;AACrE;","names":["options","options"]}
1
+ {"version":3,"sources":["../../../src/commands/hookify/ingest.tsx","../../../src/features/hookify/run-hookify-command.ts"],"sourcesContent":["import { option } from \"pastel\";\nimport { z } from \"zod\";\n\nimport { GlobalOptionsSchema } from \"../../cli/options.js\";\nimport { CommandRunner } from \"../../cli/command-runner.js\";\nimport {\n runHookifyIngestCommand,\n type HookifyIngestCommandOptions,\n} from \"../../features/hookify/run-hookify-command.js\";\n\nexport const description = \"Read a hook payload from stdin and forward it to Hookify\";\nexport const options = GlobalOptionsSchema.extend({\n async: z\n .boolean()\n .optional()\n .describe(\n option({\n description: \"Allow server workflow processing; poll until the hook result is ready\",\n })\n ),\n event: z\n .string()\n .optional()\n .describe(\n option({\n description: \"Optional hook event label\",\n valueDescription: \"name\",\n })\n ),\n});\n\ntype HookifyIngestCommandProps = {\n readonly options: HookifyIngestCommandOptions;\n};\n\nexport default function HookifyIngestCommand({ options }: HookifyIngestCommandProps) {\n return <CommandRunner run={() => runHookifyIngestCommand(options)} />;\n}\n","import process from \"node:process\";\nimport type { CngApi } from \"@cng/client\";\n\nimport { createCngApiClient } from \"../../shared/api-client.js\";\nimport type { GlobalCommandOptions } from \"../../shared/config.js\";\n\nexport type HookifyIngestCommandOptions = GlobalCommandOptions & {\n readonly async?: boolean;\n readonly event?: string;\n};\n\ntype HookifyCompletedResult = {\n readonly stdout: string;\n readonly stderr: string;\n readonly exitCode: number;\n};\n\ntype HookifyClient = ReturnType<typeof createCngApiClient>;\ntype HookifyResponse = CngApi.HookifyIngestResponse | CngApi.HookifyRequestResponse;\n\nconst defaultPollAfterMs = 1000;\nconst minimumPollAfterMs = 25;\nconst maximumPollAfterMs = 5000;\nconst pollTimeoutMs = 120_000;\n\nexport async function runHookifyIngestCommand(options: HookifyIngestCommandOptions): Promise<void> {\n const payload = await readStdinBuffer();\n\n try {\n const client = createCngApiClient(options);\n const response = await forwardHookifyPayload(client, payload, options);\n const result = await resolveHookifyResult(client, response);\n if (result.stdout.length > 0) {\n process.stdout.write(result.stdout);\n }\n if (result.stderr.length > 0) {\n process.stderr.write(result.stderr);\n }\n process.exitCode = result.exitCode;\n } catch {\n process.exitCode = 0;\n }\n}\n\nasync function forwardHookifyPayload(\n client: HookifyClient,\n payload: Buffer,\n options: HookifyIngestCommandOptions\n): Promise<CngApi.HookifyIngestResponse> {\n return client.hookify.ingestHookifyHook(\n {\n data: payload,\n contentType: \"application/octet-stream\",\n contentLength: payload.byteLength,\n },\n {\n mode: options.async === true ? \"async\" : \"sync\",\n event: options.event,\n }\n );\n}\n\nasync function resolveHookifyResult(\n client: HookifyClient,\n response: CngApi.HookifyIngestResponse\n): Promise<HookifyCompletedResult> {\n if (response.status === \"completed\") {\n return completedHookifyResult(response);\n }\n\n return pollHookifyRequest(client, response.requestId, response.pollAfterMs);\n}\n\nasync function pollHookifyRequest(\n client: HookifyClient,\n requestId: string,\n initialPollAfterMs: number | undefined\n): Promise<HookifyCompletedResult> {\n let pollAfterMs = initialPollAfterMs ?? defaultPollAfterMs;\n const deadlineAt = Date.now() + pollTimeoutMs;\n\n while (Date.now() < deadlineAt) {\n await sleep(clampPollAfterMs(pollAfterMs));\n const response = await client.hookify.getHookifyRequest({ requestId });\n\n if (response.status === \"completed\") {\n return completedHookifyResult(response);\n }\n\n pollAfterMs = response.pollAfterMs ?? defaultPollAfterMs;\n }\n\n throw new Error(\"Timed out while polling Hookify request\");\n}\n\nfunction completedHookifyResult(response: HookifyResponse): HookifyCompletedResult {\n return {\n stdout: response.stdout ?? \"\",\n stderr: response.stderr ?? \"\",\n exitCode: response.exitCode ?? 0,\n };\n}\n\nfunction clampPollAfterMs(pollAfterMs: number): number {\n return Math.min(Math.max(pollAfterMs, minimumPollAfterMs), maximumPollAfterMs);\n}\n\nfunction sleep(milliseconds: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, milliseconds);\n });\n}\n\nasync function readStdinBuffer(): Promise<Buffer> {\n const chunks: Uint8Array[] = [];\n\n for await (const chunk of process.stdin) {\n if (typeof chunk === \"string\") {\n chunks.push(Buffer.from(chunk));\n continue;\n }\n\n if (chunk instanceof Uint8Array) {\n chunks.push(chunk);\n continue;\n }\n\n chunks.push(Buffer.from(String(chunk)));\n }\n\n return Buffer.concat(chunks);\n}\n"],"mappings":"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","names":["options","options"]}
@@ -0,0 +1,25 @@
1
+ import {
2
+ renderCngkitHelp
3
+ } from "../../chunk-SKK2XLRZ.js";
4
+ import {
5
+ GlobalOptionsSchema
6
+ } from "../../chunk-NGEWD4BW.js";
7
+ import {
8
+ CommandRunner
9
+ } from "../../chunk-MRXGD6TC.js";
10
+ import "../../chunk-WDI43VPW.js";
11
+ import "../../chunk-PZ5AY32C.js";
12
+
13
+ // src/commands/hooks/index.tsx
14
+ import { jsx } from "react/jsx-runtime";
15
+ var description = "Install cngkit hooks into supported AI coding tools";
16
+ var options = GlobalOptionsSchema;
17
+ function HooksCommand() {
18
+ return /* @__PURE__ */ jsx(CommandRunner, { run: async (output) => output.component(renderCngkitHelp("hooks")) });
19
+ }
20
+ export {
21
+ HooksCommand as default,
22
+ description,
23
+ options
24
+ };
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/commands/hooks/index.tsx"],"sourcesContent":["import { GlobalOptionsSchema } from \"../../cli/options.js\";\nimport { renderCngkitHelp } from \"../../cli/help-specs.js\";\nimport { CommandRunner } from \"../../cli/command-runner.js\";\n\nexport const description = \"Install cngkit hooks into supported AI coding tools\";\nexport const options = GlobalOptionsSchema;\n\nexport default function HooksCommand() {\n return <CommandRunner run={async (output) => output.component(renderCngkitHelp(\"hooks\"))} />;\n}\n"],"mappings":";;;;;;;;;;;;;AAQS;AAJF,IAAM,cAAc;AACpB,IAAM,UAAU;AAER,SAAR,eAAgC;AACrC,SAAO,oBAAC,iBAAc,KAAK,OAAO,WAAW,OAAO,UAAU,iBAAiB,OAAO,CAAC,GAAG;AAC5F;","names":[]}
@@ -0,0 +1,40 @@
1
+ import {
2
+ hookToolIds,
3
+ runHooksInstallCommand
4
+ } from "../../chunk-SMTQ3W3F.js";
5
+ import {
6
+ GlobalOptionsSchema
7
+ } from "../../chunk-NGEWD4BW.js";
8
+ import {
9
+ CommandRunner
10
+ } from "../../chunk-MRXGD6TC.js";
11
+ import "../../chunk-WDI43VPW.js";
12
+ import "../../chunk-PZ5AY32C.js";
13
+
14
+ // src/commands/hooks/install.tsx
15
+ import { option } from "pastel";
16
+ import { z } from "zod";
17
+ import { jsx } from "react/jsx-runtime";
18
+ var description = "Install Hookify forwarding hooks for supported AI coding tools";
19
+ var options = GlobalOptionsSchema.extend({
20
+ dryRun: z.boolean().optional().describe(
21
+ option({
22
+ description: "Print what would be installed without writing files"
23
+ })
24
+ ),
25
+ tool: z.enum(hookToolIds).optional().describe(
26
+ option({
27
+ description: "Tool to configure",
28
+ valueDescription: "all|claude|codex"
29
+ })
30
+ )
31
+ });
32
+ function HooksInstallCommand({ options: options2 }) {
33
+ return /* @__PURE__ */ jsx(CommandRunner, { run: (output) => runHooksInstallCommand(options2, output) });
34
+ }
35
+ export {
36
+ HooksInstallCommand as default,
37
+ description,
38
+ options
39
+ };
40
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/commands/hooks/install.tsx"],"sourcesContent":["import { option } from \"pastel\";\nimport { z } from \"zod\";\n\nimport { GlobalOptionsSchema } from \"../../cli/options.js\";\nimport { CommandRunner } from \"../../cli/command-runner.js\";\nimport {\n hookToolIds,\n runHooksInstallCommand,\n type HookToolId,\n type HooksInstallCommandOptions,\n} from \"../../features/hooks/run-hooks-install-command.js\";\n\nexport const description = \"Install Hookify forwarding hooks for supported AI coding tools\";\nexport const options = GlobalOptionsSchema.extend({\n dryRun: z\n .boolean()\n .optional()\n .describe(\n option({\n description: \"Print what would be installed without writing files\",\n })\n ),\n tool: z\n .enum(hookToolIds)\n .optional()\n .describe(\n option({\n description: \"Tool to configure\",\n valueDescription: \"all|claude|codex\",\n })\n ),\n});\n\ntype HooksInstallCommandProps = {\n readonly options: HooksInstallCommandOptions & {\n readonly tool?: HookToolId;\n };\n};\n\nexport default function HooksInstallCommand({ options }: HooksInstallCommandProps) {\n return <CommandRunner run={(output) => runHooksInstallCommand(options, output)} />;\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA,SAAS,cAAc;AACvB,SAAS,SAAS;AAuCT;AA5BF,IAAM,cAAc;AACpB,IAAM,UAAU,oBAAoB,OAAO;AAAA,EAChD,QAAQ,EACL,QAAQ,EACR,SAAS,EACT;AAAA,IACC,OAAO;AAAA,MACL,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AAAA,EACF,MAAM,EACH,KAAK,WAAW,EAChB,SAAS,EACT;AAAA,IACC,OAAO;AAAA,MACL,aAAa;AAAA,MACb,kBAAkB;AAAA,IACpB,CAAC;AAAA,EACH;AACJ,CAAC;AAQc,SAAR,oBAAqC,EAAE,SAAAA,SAAQ,GAA6B;AACjF,SAAO,oBAAC,iBAAc,KAAK,CAAC,WAAW,uBAAuBA,UAAS,MAAM,GAAG;AAClF;","names":["options"]}