cngkit 1.1.16 → 1.1.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/README.md +4 -16
  2. package/dist/{chunk-F7ZOO3P5.js → chunk-5ZNV3FDG.js} +3 -3
  3. package/dist/{chunk-GZ2DPIU6.js → chunk-BL3XMLIH.js} +2 -10
  4. package/dist/chunk-BL3XMLIH.js.map +1 -0
  5. package/dist/{chunk-W7X6HWP5.js → chunk-GT2MTS6E.js} +2 -2
  6. package/dist/{chunk-MJVMVXV5.js → chunk-HRFI2IEP.js} +2 -2
  7. package/dist/{chunk-NRWEU6YQ.js → chunk-K36DKQWH.js} +3 -3
  8. package/dist/{chunk-MLKBG5YJ.js → chunk-VCWNKNUE.js} +2 -9
  9. package/dist/chunk-VCWNKNUE.js.map +1 -0
  10. package/dist/{chunk-7KQBSEQV.js → chunk-WYJTGGMN.js} +33 -60
  11. package/dist/chunk-WYJTGGMN.js.map +1 -0
  12. package/dist/cli.js +2 -18
  13. package/dist/cli.js.map +1 -1
  14. package/dist/commands/coderoom/index.js +4 -4
  15. package/dist/commands/coderoom/join.js +5 -5
  16. package/dist/commands/coderoom/share.js +5 -5
  17. package/dist/commands/index.js +3 -3
  18. package/dist/commands/knowledges/audiences.js +6 -6
  19. package/dist/commands/knowledges/files.js +6 -6
  20. package/dist/commands/knowledges/glob.js +6 -6
  21. package/dist/commands/knowledges/grep.js +6 -6
  22. package/dist/commands/knowledges/index.js +4 -4
  23. package/dist/commands/knowledges/list.js +6 -6
  24. package/dist/commands/knowledges/read.js +6 -6
  25. package/dist/commands/knowledges/search.js +6 -6
  26. package/dist/commands/knowledges/status.js +6 -6
  27. package/dist/commands/login.js +3 -3
  28. package/dist/commands/scrub.js +3 -3
  29. package/dist/commands/transcripts.js +4 -4
  30. package/package.json +2 -4
  31. package/dist/chunk-7KQBSEQV.js.map +0 -1
  32. package/dist/chunk-GZ2DPIU6.js.map +0 -1
  33. package/dist/chunk-MLKBG5YJ.js.map +0 -1
  34. /package/dist/{chunk-F7ZOO3P5.js.map → chunk-5ZNV3FDG.js.map} +0 -0
  35. /package/dist/{chunk-W7X6HWP5.js.map → chunk-GT2MTS6E.js.map} +0 -0
  36. /package/dist/{chunk-MJVMVXV5.js.map → chunk-HRFI2IEP.js.map} +0 -0
  37. /package/dist/{chunk-NRWEU6YQ.js.map → chunk-K36DKQWH.js.map} +0 -0
package/README.md CHANGED
@@ -199,26 +199,14 @@ Transcript commands are local-only. They do not upload transcript content to Cur
199
199
  By default, they print user and assistant text and skip internal prompt, hook, and tool noise.
200
200
  Use `--include-internal` when debugging transcript plumbing.
201
201
 
202
- ## Backend Selection
202
+ ## Backend
203
203
 
204
- By default, `cngkit` talks to:
204
+ `cngkit` always talks to:
205
205
 
206
206
  ```text
207
207
  https://curly.ng
208
208
  ```
209
209
 
210
- Override the backend for one command:
211
-
212
- ```bash
213
- cngkit --api-base-url https://curly.ng knowledges status
214
- ```
215
-
216
- Or with an environment variable:
217
-
218
- ```bash
219
- CNGKIT_API_BASE_URL=https://curly.ng cngkit knowledges status
220
- ```
221
-
222
210
  ## Output Format
223
211
 
224
212
  Human-facing output renders as structured terminal text by default, including help
@@ -261,7 +249,7 @@ that does not report itself as a TTY.
261
249
 
262
250
  - **Pastel** owns command and subcommand routing through files under `src/commands/`.
263
251
  - **Ink** owns terminal rendering through built-in components such as `<Text>`.
264
- - **marked-terminal** owns terminal Markdown rendering for help screens.
252
+ - **@inkkit/ink-markdown** owns terminal Markdown rendering for help screens and Markdown catalog reads.
265
253
  - **Chalk** owns the cngkit color theme passed into the Markdown renderer.
266
254
  - **Zod** owns option and argument schemas for each route.
267
255
 
@@ -281,7 +269,7 @@ src/commands/
281
269
 
282
270
  The CLI does not hand-roll ANSI escape codes. Status styles go through Ink's built-in
283
271
  `<Text color="..." bold dimColor>` support, and help screens render through
284
- `marked-terminal` with a shared Chalk-backed theme. Commands that return parse-oriented
272
+ `@inkkit/ink-markdown` with a shared Chalk-backed theme. Commands that return parse-oriented
285
273
  content for agents or shell pipelines write clean lines instead.
286
274
 
287
275
  ## For Contributors
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  readBackendHealth
3
- } from "./chunk-MJVMVXV5.js";
3
+ } from "./chunk-HRFI2IEP.js";
4
4
  import {
5
5
  createPeerId,
6
6
  createRoomCode,
7
7
  resolveApiBaseUrl
8
- } from "./chunk-7KQBSEQV.js";
8
+ } from "./chunk-WYJTGGMN.js";
9
9
 
10
10
  // src/features/coderoom/run-coderoom-command.ts
11
11
  import process2 from "process";
@@ -412,4 +412,4 @@ export {
412
412
  runShareCommand,
413
413
  runJoinCommand
414
414
  };
415
- //# sourceMappingURL=chunk-F7ZOO3P5.js.map
415
+ //# sourceMappingURL=chunk-5ZNV3FDG.js.map
@@ -46,7 +46,6 @@ cngkit <command> [options]
46
46
  \`\`\`bash
47
47
  cngkit --format text|json|markdown ...
48
48
  cngkit --no-color ...
49
- cngkit --api-base-url <url> ...
50
49
  \`\`\`
51
50
 
52
51
  ## Commands
@@ -75,14 +74,7 @@ cngkit knowledges <subcommand> --help
75
74
 
76
75
  ## Backend
77
76
 
78
- Default API: \`https://curly.ng\`
79
-
80
- Override with:
81
-
82
- \`\`\`bash
83
- cngkit --api-base-url <url> ...
84
- CNGKIT_API_BASE_URL=<url> cngkit ...
85
- \`\`\`
77
+ API: \`https://curly.ng\`
86
78
  `
87
79
  },
88
80
  {
@@ -578,4 +570,4 @@ export {
578
570
  formatCngkitHelp,
579
571
  formatKnowledgesHelp
580
572
  };
581
- //# sourceMappingURL=chunk-GZ2DPIU6.js.map
573
+ //# sourceMappingURL=chunk-BL3XMLIH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/help-specs.ts"],"sourcesContent":["type HelpTopic = {\n title: string;\n aliases: string[];\n body: string;\n};\n\nconst commandList = [\n \"- `cngkit login` - open Curly.ng login, or print the URL in headless shells.\",\n \"- `cngkit coderoom ...` - share or join a live developer room for a working tree.\",\n \"- `cngkit scrub [path]` - scan for secrets; rewrite only when `--yes` is passed.\",\n \"- `cngkit transcripts ...` - list, read, and grep local Claude/Codex transcripts.\",\n \"- `cngkit knowledges ...` - search and read the hosted Harness knowledge catalog.\",\n].join(\"\\n\");\n\nconst coderoomCommandList = [\n \"- `share [room-code]` - start a live room from the current directory.\",\n \"- `join <room-code>` - join another developer's live room from the current directory.\",\n].join(\"\\n\");\n\nconst knowledgesCommandList = [\n \"- `status` - print remote catalog state.\",\n \"- `audiences` - list valid audience filters.\",\n \"- `search <query>` - search over Postgres-backed knowledges records.\",\n \"- `list [query]` - list known subskills.\",\n \"- `files [query]` - list uploaded catalog files.\",\n \"- `read <file-path>` - Claude-style file read.\",\n \"- `grep <pattern>` - Claude-style content search.\",\n \"- `glob [pattern]` - Claude-style file discovery.\",\n].join(\"\\n\");\n\nconst helpTopics: HelpTopic[] = [\n {\n title: \"cngkit\",\n aliases: [\"\", \"overview\", \"help\"],\n body: `# cngkit\n\nCurly.ng operator CLI for shared code rooms, safe local cleanup, local agent transcripts, and hosted Harness knowledges.\n\n## Run Now\n\n\\`\\`\\`bash\nnpx --yes cngkit@latest --help\nnpx --yes cngkit@latest knowledges search Cloudflare --limit 3\n\\`\\`\\`\n\n## Installed Usage\n\n\\`\\`\\`bash\ncngkit <command> [options]\n\\`\\`\\`\n\n## Global Options\n\n\\`\\`\\`bash\ncngkit --format text|json|markdown ...\ncngkit --no-color ...\n\\`\\`\\`\n\n## Commands\n\n${commandList}\n\n## Help Map\n\n\\`\\`\\`bash\ncngkit help <topic>\ncngkit <command> --help\ncngkit coderoom --help\ncngkit coderoom <subcommand> --help\ncngkit transcripts --help\ncngkit knowledges --help\ncngkit knowledges <subcommand> --help\n\\`\\`\\`\n\n## AI And Scripts\n\n- Help renders as structured terminal text by default, even in pipes.\n- Use \\`--format json\\` or \\`--json\\` on read-only data commands for typed payloads.\n- Use \\`--format markdown\\` only when raw Markdown source is intentional.\n- Use \\`--no-color\\` or \\`CNGKIT_COLOR=never\\` for logs, screenshots, and strict plain text.\n- Use \\`npm_config_progress=false npx --yes cngkit@latest ...\\` for clean one-shot npx captures.\n\n## Backend\n\nAPI: \\`https://curly.ng\\`\n`,\n },\n {\n title: \"login\",\n aliases: [\"login\"],\n body: `# cngkit login\n\nOpen Curly.ng login in a browser. In headless shells, print the URL so an agent can show it to the operator.\n\n## Usage\n\n\\`\\`\\`bash\nnpx --yes cngkit@latest login\ncngkit login\n\\`\\`\\`\n\n## Output\n\n- First line names the login URL being opened.\n- If no browser opener exists, the CLI prints a direct URL.\n- No credentials are printed or persisted by this command.\n`,\n },\n {\n title: \"transcripts\",\n aliases: [\"transcripts\", \"transcript\"],\n body: `# cngkit transcripts\n\nRead local Claude and Codex transcript JSONL files.\n\nThis is local-only operator tooling. It does not call Curly.ng and it does not upload transcript content.\n\n## Usage\n\n\\`\\`\\`bash\ncngkit transcripts list [--source all|codex|claude] [--limit <n>] [--json|--format json]\ncngkit transcripts read <path-or-session-id> [--source all|codex|claude] [--limit <n>] [--include-internal] [--json|--format json]\ncngkit transcripts grep <query> [--source all|codex|claude] [--limit <n>] [--file-limit <n>] [--include-internal] [--json|--format json]\n\\`\\`\\`\n\n## Sources\n\n- \\`~/.codex/sessions\\`\n- \\`~/.codex/archived_sessions\\`\n- \\`~/.claude/projects\\`\n- \\`~/.claude/history.jsonl\\`\n\n## Defaults\n\n- \\`list\\`: newest 12 transcript files.\n- \\`read\\`: newest 80 user/assistant entries from the selected file.\n- \\`grep\\`: first 80 matching user/assistant entries from the newest 60 files.\n- \\`--source\\`: \\`all\\`.\n\n## Output\n\n- Text mode prints source, role, timestamp when available, and extracted message text.\n- Internal developer/system payloads and hook/tool noise are skipped unless \\`--include-internal\\` is passed.\n- Direct file paths, home-relative paths, and partial session ids are accepted by \\`read\\`.\n`,\n },\n {\n title: \"coderoom\",\n aliases: [\"coderoom\", \"code-room\", \"repo-sync\"],\n body: `# cngkit coderoom\n\nCreate or join a temporary live room for sharing a working tree over the Curly backend.\n\n## Usage\n\n\\`\\`\\`bash\ncngkit coderoom <subcommand> [options]\n\\`\\`\\`\n\n## Subcommands\n\n${coderoomCommandList}\n\n## Common Flow\n\n\\`\\`\\`bash\nnpx --yes cngkit@latest coderoom share\nnpx --yes cngkit@latest coderoom join <room-code>\n\\`\\`\\`\n\n## Behavior\n\n- Connects to \\`/api/cng/sync/:roomCode\\` on the configured Curly backend.\n- Uses WebSocket transport backed by the \\`CngSyncRoom\\` Durable Object.\n- Sends an initial snapshot, then file and delete events.\n- Last received change wins.\n- Current rooms are live relays, not durable cloud storage.\n`,\n },\n {\n title: \"coderoom share\",\n aliases: [\"coderoom-share\"],\n body: `# cngkit coderoom share\n\nStart a live repository sync room from the current directory.\n\n## Usage\n\n\\`\\`\\`bash\ncngkit coderoom share [room-code]\n\\`\\`\\`\n\n## Behavior\n\n- Connects to \\`/api/cng/sync/:roomCode\\` on the configured Curly backend.\n- Uses WebSocket transport backed by the \\`CngSyncRoom\\` Durable Object.\n- Sends an initial snapshot, then file and delete events.\n- Last received change wins.\n\n## Filesystem Contract\n\n- Preserves \\`.git/\\`.\n- Preserves files ignored by the repo's \\`.gitignore\\`.\n- Sends regular files as base64 payloads in the sync protocol.\n\n## Output\n\n- Prints room code, repo root, peer id, backend health, and concise sync events.\n- Keeps running until the socket closes or the process receives a termination signal.\n`,\n },\n {\n title: \"coderoom join\",\n aliases: [\"coderoom-join\"],\n body: `# cngkit coderoom join\n\nJoin an existing live repository sync room from the current directory.\n\n## Usage\n\n\\`\\`\\`bash\ncngkit coderoom join <room-code>\n\\`\\`\\`\n\n## Behavior\n\nSame transport and filesystem contract as \\`cngkit coderoom share\\`. The supplied room code selects the Durable Object room.\n\n## Output\n\n- Prints backend health, room code, repo root, peer id, and concise sync events.\n- Missing room code exits with a usage error.\n`,\n },\n {\n title: \"scrub\",\n aliases: [\"scrub\"],\n body: `# cngkit scrub\n\nScan a file or directory for secrets with TruffleHog. Report-only is the default.\n\n## Usage\n\n\\`\\`\\`bash\ncngkit scrub [path]\ncngkit scrub [path] --yes\n\\`\\`\\`\n\n## Safety\n\n- Default mode does not rewrite files.\n- Inline masking rewrites files and requires \\`--yes\\`.\n- Raw and redacted secret values are never printed.\n\n## Requirements\n\n- \\`trufflehog\\` must be available on \\`PATH\\`.\n\n## Mask Format\n\n\\`\\`\\`text\n[CNGKIT_SECRET:<detector>:<verified|unverified>]\n\\`\\`\\`\n`,\n },\n {\n title: \"knowledges\",\n aliases: [\"knowledges\", \"knowledge\"],\n body: `# cngkit knowledges\n\nSearch and read the hosted Harness knowledges catalog from the Curly backend.\n\n## Usage\n\n\\`\\`\\`bash\ncngkit knowledges <subcommand> [options]\n\\`\\`\\`\n\n## Subcommands\n\n${knowledgesCommandList}\n\n## Progressive Help\n\n\\`\\`\\`bash\ncngkit help knowledges <subcommand>\ncngkit knowledges <subcommand> --help\ncngkit knowledges read --help\ncngkit knowledges grep --help\ncngkit knowledges glob --help\n\\`\\`\\`\n\n## Common Examples\n\n\\`\\`\\`bash\nnpx --yes cngkit@latest knowledges search Cloudflare --limit 3\nnpx --yes cngkit@latest knowledges read /libraries/lib-cloudflare/SUBSKILL.md --limit 80\nnpx --yes cngkit@latest knowledges grep Cloudflare --path /libraries/lib-cloudflare --output-mode files_with_matches\nnpx --yes cngkit@latest knowledges glob \"**/*.md\" --path /libraries/lib-cloudflare\n\\`\\`\\`\n\n## AI-Friendly Output\n\n- Default output is structured text intended to be directly usable by people and agents.\n- \\`read\\` renders Markdown files by default and prints exact source with \\`--format markdown\\`.\n- \\`grep --output-mode content\\` prints \\`path:line\\` blocks.\n- \\`grep --output-mode files_with_matches\\` and \\`glob\\` print one path per line.\n- \\`--format json\\` and \\`--json\\` print typed backend payloads for machine consumption.\n`,\n },\n {\n title: \"knowledges status\",\n aliases: [\"knowledges-status\", \"status\"],\n body: `# cngkit knowledges status\n\nPrint remote Harness catalog state.\n\n## Usage\n\n\\`\\`\\`bash\ncngkit knowledges status [--json|--format json]\n\\`\\`\\`\n\n## Output\n\n- Text mode prints catalog name, file count, blob count, database binding, and latest run when present.\n- \\`--format json\\` and \\`--json\\` print the backend data payload.\n`,\n },\n {\n title: \"knowledges audiences\",\n aliases: [\"knowledges-audiences\", \"audiences\"],\n body: `# cngkit knowledges audiences\n\nList valid audience filters for catalog browsing.\n\n## Usage\n\n\\`\\`\\`bash\ncngkit knowledges audiences [--json|--format json]\n\\`\\`\\`\n\n## Use When\n\nRun this before \\`cngkit knowledges files --audience <id>\\`.\n`,\n },\n {\n title: \"knowledges search\",\n aliases: [\"knowledges-search\", \"search\"],\n body: `# cngkit knowledges search\n\nSearch the hosted Harness index for relevant skills and subskills.\n\n## Usage\n\n\\`\\`\\`bash\ncngkit knowledges search <query> [--limit <n>] [--json|--format json]\n\\`\\`\\`\n\n## Defaults\n\n- \\`--limit\\`: \\`5\\`\n\n## Example\n\n\\`\\`\\`bash\nnpx --yes cngkit@latest knowledges search Cloudflare --limit 3\n\\`\\`\\`\n`,\n },\n {\n title: \"knowledges list\",\n aliases: [\"knowledges-list\", \"list\"],\n body: `# cngkit knowledges list\n\nList hosted Harness subskills, optionally filtered by query.\n\n## Usage\n\n\\`\\`\\`bash\ncngkit knowledges list [query] [--limit <n>] [--json|--format json]\n\\`\\`\\`\n\n## Defaults\n\n- \\`--limit\\`: \\`25\\`\n\n## Example\n\n\\`\\`\\`bash\ncngkit knowledges list cloudflare --limit 10\n\\`\\`\\`\n`,\n },\n {\n title: \"knowledges files\",\n aliases: [\"knowledges-files\", \"files\"],\n body: `# cngkit knowledges files\n\nList uploaded Harness catalog files, optionally filtered by query or audience.\n\n## Usage\n\n\\`\\`\\`bash\ncngkit knowledges files [query] [--audience <id>] [--limit <n>] [--json|--format json]\n\\`\\`\\`\n\n## Defaults\n\n- \\`--limit\\`: \\`25\\`\n- \\`--audience\\`: omitted\n\n## Example\n\n\\`\\`\\`bash\ncngkit knowledges files cloudflare --limit 10\ncngkit knowledges files \"vector search\" --audience builders\n\\`\\`\\`\n`,\n },\n {\n title: \"knowledges read\",\n aliases: [\"knowledges-read\", \"read\"],\n body: `# cngkit knowledges read\n\nRead a hosted Harness catalog file by path.\n\n## Usage\n\n\\`\\`\\`bash\ncngkit knowledges read <file-path> [--offset <n>] [--limit <n>] [--json|--format json|--format markdown]\n\\`\\`\\`\n\n## Inputs\n\n- \\`file-path\\`: normalized catalog path. Shorthand paths such as \\`/libraries/lib-cloudflare/SUBSKILL.md\\` are expanded to \\`skills/knowledges/subskills/libraries/lib-cloudflare/SUBSKILL.md\\`.\n- \\`--offset\\`: zero-based starting line. Default: \\`0\\`.\n- \\`--limit\\`: maximum lines. Default in CLI: \\`200\\`. Backend max: \\`2000\\`.\n\n## Output\n\n- Text mode renders Markdown files for terminal reading.\n- \\`--format markdown\\` prints the exact returned file content.\n- If truncated, a final bracketed truncation note is printed after the content.\n- \\`--format json\\` and \\`--json\\` print \\`{ file_path, content, total_lines, offset, limit, truncated }\\`.\n\n## Example\n\n\\`\\`\\`bash\nnpx --yes cngkit@latest knowledges read /libraries/lib-cloudflare/SUBSKILL.md --limit 80\n\\`\\`\\`\n`,\n },\n {\n title: \"knowledges grep\",\n aliases: [\"knowledges-grep\", \"grep\"],\n body: `# cngkit knowledges grep\n\nSearch inside hosted Harness catalog files with a JavaScript regular expression.\n\n## Usage\n\n\\`\\`\\`bash\ncngkit knowledges grep <pattern> [--path <path>] [--include <glob>] [--output-mode <mode>] [--context <n>] [--case-insensitive] [--json|--format json]\n\\`\\`\\`\n\n## Inputs\n\n- \\`pattern\\`: JavaScript regular expression source.\n- \\`--path\\`: catalog path prefix. Default: \\`skills\\`.\n- \\`--include\\`: filename include filter. Default: \\`*\\`.\n- Modes: content, files_with_matches, or count.\n- \\`--output-mode\\`: \\`content\\`, \\`files_with_matches\\`, or \\`count\\`. Default: \\`content\\`.\n- \\`--context\\`: context lines around content matches. Default: \\`0\\`. Backend max: \\`20\\`.\n- \\`--case-insensitive\\`: maps to backend \\`case_insensitive=true\\`.\n\n## Output\n\n- \\`content\\`: prints blocks as \\`file_path:line_number\\`, optional context lines, then \\`> matching line\\`.\n- \\`files_with_matches\\`: prints one matching file path per line.\n- \\`count\\`: prints \\`file_path: match_count\\` lines.\n- \\`--format json\\` and \\`--json\\` print the typed backend response union.\n\n## Examples\n\n\\`\\`\\`bash\nnpx --yes cngkit@latest knowledges grep Cloudflare --path /libraries/lib-cloudflare --output-mode files_with_matches\nnpx --yes cngkit@latest knowledges grep \"Postgres|Hyperdrive\" --path /libraries/lib-cloudflare --context 2\n\\`\\`\\`\n`,\n },\n {\n title: \"knowledges glob\",\n aliases: [\"knowledges-glob\", \"glob\"],\n body: `# cngkit knowledges glob\n\nFind hosted Harness catalog files by glob pattern.\n\n## Usage\n\n\\`\\`\\`bash\ncngkit knowledges glob [pattern] [--path <path>] [--json|--format json]\n\\`\\`\\`\n\n## Inputs\n\n- \\`pattern\\`: supported glob pattern. CLI default: \\`**/*.md\\`.\n- \\`--path\\`: catalog path prefix. Default: \\`skills\\`.\n\n## Supported Patterns\n\n- \\`**/*.md\\`\n- \\`**/*.SUBSKILL.md\\`\n- \\`**/SKILL.md\\`\n- \\`*.md\\`\n- \\`*.SUBSKILL.md\\`\n- \\`SKILL.md\\`\n\n## Output\n\n- Text mode prints one file path per line.\n- If truncated, a final bracketed truncation note is printed.\n- \\`--format json\\` and \\`--json\\` print \\`{ files, total_files, truncated }\\`.\n\n## Example\n\n\\`\\`\\`bash\nnpx --yes cngkit@latest knowledges glob \"**/*.md\" --path /libraries/lib-cloudflare\n\\`\\`\\`\n`,\n },\n];\n\nconst helpTopicNames = helpTopics\n .filter((topic) => topic.title !== \"cngkit\")\n .map((topic) => topic.title)\n .sort();\n\nconst helpTopicByAlias = new Map<string, HelpTopic>();\n\nfor (const topic of helpTopics) {\n for (const alias of topic.aliases) {\n helpTopicByAlias.set(alias, topic);\n }\n}\n\nexport function formatCngkitHelp(topicName?: string): string {\n const normalizedTopicName = normalizeHelpTopicName(topicName);\n const topic = helpTopicByAlias.get(normalizedTopicName);\n\n if (topic) {\n return topic.body.trim();\n }\n\n if (normalizedTopicName === \"\") {\n return helpTopicByAlias.get(\"\")?.body.trim() ?? \"\";\n }\n\n return formatUnknownHelpTopic(normalizedTopicName);\n}\n\nexport function formatKnowledgesHelp(topicName?: string): string {\n const normalizedTopicName = normalizeHelpTopicName(topicName);\n const topicKey = normalizedTopicName ? `knowledges-${normalizedTopicName}` : \"knowledges\";\n return formatCngkitHelp(topicKey);\n}\n\nfunction normalizeHelpTopicName(value: string | undefined): string {\n return value?.trim().toLowerCase().replace(/\\s+/g, \"-\") ?? \"\";\n}\n\nfunction formatUnknownHelpTopic(topicName: string): string {\n return `# cngkit help\n\nNo help topic named \\`${topicName}\\`.\n\n## Available Topics\n\n${helpTopicNames.map((name) => `- \\`${name}\\``).join(\"\\n\")}\n\n## Usage\n\n\\`\\`\\`bash\ncngkit help <topic>\ncngkit <command> --help\n\\`\\`\\``;\n}\n"],"mappings":";AAMA,IAAM,cAAc;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,IAAI;AAEX,IAAM,sBAAsB;AAAA,EAC1B;AAAA,EACA;AACF,EAAE,KAAK,IAAI;AAEX,IAAM,wBAAwB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,IAAI;AAEX,IAAM,aAA0B;AAAA,EAC9B;AAAA,IACE,OAAO;AAAA,IACP,SAAS,CAAC,IAAI,YAAY,MAAM;AAAA,IAChC,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0BR,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0BX;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,SAAS,CAAC,OAAO;AAAA,IACjB,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBR;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,SAAS,CAAC,eAAe,YAAY;AAAA,IACrC,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkCR;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,SAAS,CAAC,YAAY,aAAa,WAAW;AAAA,IAC9C,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYR,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBnB;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,SAAS,CAAC,gBAAgB;AAAA,IAC1B,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA4BR;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,SAAS,CAAC,eAAe;AAAA,IACzB,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBR;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,SAAS,CAAC,OAAO;AAAA,IACjB,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA2BR;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,SAAS,CAAC,cAAc,WAAW;AAAA,IACnC,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYR,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA6BrB;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,SAAS,CAAC,qBAAqB,QAAQ;AAAA,IACvC,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeR;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,SAAS,CAAC,wBAAwB,WAAW;AAAA,IAC7C,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcR;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,SAAS,CAAC,qBAAqB,QAAQ;AAAA,IACvC,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBR;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,SAAS,CAAC,mBAAmB,MAAM;AAAA,IACnC,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBR;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,SAAS,CAAC,oBAAoB,OAAO;AAAA,IACrC,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBR;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,SAAS,CAAC,mBAAmB,MAAM;AAAA,IACnC,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA6BR;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,SAAS,CAAC,mBAAmB,MAAM;AAAA,IACnC,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkCR;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,SAAS,CAAC,mBAAmB,MAAM;AAAA,IACnC,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoCR;AACF;AAEA,IAAM,iBAAiB,WACpB,OAAO,CAAC,UAAU,MAAM,UAAU,QAAQ,EAC1C,IAAI,CAAC,UAAU,MAAM,KAAK,EAC1B,KAAK;AAER,IAAM,mBAAmB,oBAAI,IAAuB;AAEpD,WAAW,SAAS,YAAY;AAC9B,aAAW,SAAS,MAAM,SAAS;AACjC,qBAAiB,IAAI,OAAO,KAAK;AAAA,EACnC;AACF;AAEO,SAAS,iBAAiB,WAA4B;AAC3D,QAAM,sBAAsB,uBAAuB,SAAS;AAC5D,QAAM,QAAQ,iBAAiB,IAAI,mBAAmB;AAEtD,MAAI,OAAO;AACT,WAAO,MAAM,KAAK,KAAK;AAAA,EACzB;AAEA,MAAI,wBAAwB,IAAI;AAC9B,WAAO,iBAAiB,IAAI,EAAE,GAAG,KAAK,KAAK,KAAK;AAAA,EAClD;AAEA,SAAO,uBAAuB,mBAAmB;AACnD;AAEO,SAAS,qBAAqB,WAA4B;AAC/D,QAAM,sBAAsB,uBAAuB,SAAS;AAC5D,QAAM,WAAW,sBAAsB,cAAc,mBAAmB,KAAK;AAC7E,SAAO,iBAAiB,QAAQ;AAClC;AAEA,SAAS,uBAAuB,OAAmC;AACjE,SAAO,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,QAAQ,GAAG,KAAK;AAC7D;AAEA,SAAS,uBAAuB,WAA2B;AACzD,SAAO;AAAA;AAAA,wBAEe,SAAS;AAAA;AAAA;AAAA;AAAA,EAI/B,eAAe,IAAI,CAAC,SAAS,OAAO,IAAI,IAAI,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQ1D;","names":[]}
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createCommandOutput,
3
3
  formatError
4
- } from "./chunk-7KQBSEQV.js";
4
+ } from "./chunk-WYJTGGMN.js";
5
5
 
6
6
  // src/cli/command-runner.tsx
7
7
  import { useEffect } from "react";
@@ -23,4 +23,4 @@ function CommandRunner({ run }) {
23
23
  export {
24
24
  CommandRunner
25
25
  };
26
- //# sourceMappingURL=chunk-W7X6HWP5.js.map
26
+ //# sourceMappingURL=chunk-GT2MTS6E.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  resolveApiBaseUrl
3
- } from "./chunk-7KQBSEQV.js";
3
+ } from "./chunk-WYJTGGMN.js";
4
4
  import {
5
5
  __export
6
6
  } from "./chunk-PZ5AY32C.js";
@@ -3231,4 +3231,4 @@ export {
3231
3231
  createCngApiClient,
3232
3232
  readBackendHealth
3233
3233
  };
3234
- //# sourceMappingURL=chunk-MJVMVXV5.js.map
3234
+ //# sourceMappingURL=chunk-HRFI2IEP.js.map
@@ -7,10 +7,10 @@ import {
7
7
  } from "./chunk-XQGLUQFM.js";
8
8
  import {
9
9
  createCngApiClient
10
- } from "./chunk-MJVMVXV5.js";
10
+ } from "./chunk-HRFI2IEP.js";
11
11
  import {
12
12
  resolveOutputFormat
13
- } from "./chunk-7KQBSEQV.js";
13
+ } from "./chunk-WYJTGGMN.js";
14
14
 
15
15
  // src/features/knowledges/knowledges-api.ts
16
16
  function createKnowledgesApi(options) {
@@ -324,4 +324,4 @@ export {
324
324
  runKnowGrepCommand,
325
325
  runKnowGlobCommand
326
326
  };
327
- //# sourceMappingURL=chunk-NRWEU6YQ.js.map
327
+ //# sourceMappingURL=chunk-K36DKQWH.js.map
@@ -1,14 +1,7 @@
1
1
  // src/cli/options.ts
2
2
  import { argument, option } from "pastel";
3
3
  import { z } from "zod";
4
- var GlobalOptionsSchema = z.object({
5
- apiBaseUrl: z.string().optional().describe(
6
- option({
7
- description: "Curly API base URL. Default: CNGKIT_API_BASE_URL or https://curly.ng",
8
- valueDescription: "url"
9
- })
10
- )
11
- });
4
+ var GlobalOptionsSchema = z.object({});
12
5
  var JsonOutputOptionsSchema = GlobalOptionsSchema.extend({
13
6
  json: z.boolean().optional().describe(
14
7
  option({
@@ -111,4 +104,4 @@ export {
111
104
  LimitOptionsSchema,
112
105
  TranscriptArgsSchema
113
106
  };
114
- //# sourceMappingURL=chunk-MLKBG5YJ.js.map
107
+ //# sourceMappingURL=chunk-VCWNKNUE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/options.ts"],"sourcesContent":["import { argument, option } from \"pastel\";\nimport { z } from \"zod\";\n\nexport const GlobalOptionsSchema = z.object({});\n\nexport const JsonOutputOptionsSchema = GlobalOptionsSchema.extend({\n json: z\n .boolean()\n .optional()\n .describe(\n option({\n description: \"Print raw JSON\",\n })\n ),\n});\n\nexport const OptionalPathArgsSchema = z.tuple([\n z\n .string()\n .optional()\n .describe(\n argument({\n name: \"path\",\n description: \"Path to scan\",\n })\n ),\n]);\n\nexport const OptionalRoomCodeArgsSchema = z.tuple([\n z\n .string()\n .optional()\n .describe(\n argument({\n name: \"room-code\",\n description: \"Room code\",\n })\n ),\n]);\n\nexport const RequiredRoomCodeArgsSchema = z.tuple([\n z.string().describe(\n argument({\n name: \"room-code\",\n description: \"Room code\",\n })\n ),\n]);\n\nexport const OptionalQueryArgsSchema = z.tuple([\n z\n .string()\n .optional()\n .describe(\n argument({\n name: \"query\",\n description: \"Optional query\",\n })\n ),\n]);\n\nexport const RequiredQueryArgsSchema = z.array(\n z.string().describe(\n argument({\n name: \"query\",\n description: \"Search query\",\n })\n )\n);\n\nexport const RequiredFilePathArgsSchema = z.tuple([\n z.string().describe(\n argument({\n name: \"file-path\",\n description: \"Catalog file path\",\n })\n ),\n]);\n\nexport const RequiredPatternArgsSchema = z.array(\n z.string().describe(\n argument({\n name: \"pattern\",\n description: \"Search pattern\",\n })\n )\n);\n\nexport const OptionalGlobPatternArgsSchema = z.array(\n z.string().describe(\n argument({\n name: \"pattern\",\n description: \"Glob pattern\",\n })\n )\n);\n\nexport const LimitOptionsSchema = JsonOutputOptionsSchema.extend({\n limit: z\n .number()\n .optional()\n .describe(\n option({\n description: \"Maximum results\",\n valueDescription: \"n\",\n })\n ),\n});\n\nexport const TranscriptArgsSchema = z.array(\n z.string().describe(\n argument({\n name: \"transcript-args\",\n description: \"Transcript action and arguments\",\n })\n )\n);\n"],"mappings":";AAAA,SAAS,UAAU,cAAc;AACjC,SAAS,SAAS;AAEX,IAAM,sBAAsB,EAAE,OAAO,CAAC,CAAC;AAEvC,IAAM,0BAA0B,oBAAoB,OAAO;AAAA,EAChE,MAAM,EACH,QAAQ,EACR,SAAS,EACT;AAAA,IACC,OAAO;AAAA,MACL,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AACJ,CAAC;AAEM,IAAM,yBAAyB,EAAE,MAAM;AAAA,EAC5C,EACG,OAAO,EACP,SAAS,EACT;AAAA,IACC,SAAS;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AACJ,CAAC;AAEM,IAAM,6BAA6B,EAAE,MAAM;AAAA,EAChD,EACG,OAAO,EACP,SAAS,EACT;AAAA,IACC,SAAS;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AACJ,CAAC;AAEM,IAAM,6BAA6B,EAAE,MAAM;AAAA,EAChD,EAAE,OAAO,EAAE;AAAA,IACT,SAAS;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AACF,CAAC;AAEM,IAAM,0BAA0B,EAAE,MAAM;AAAA,EAC7C,EACG,OAAO,EACP,SAAS,EACT;AAAA,IACC,SAAS;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AACJ,CAAC;AAEM,IAAM,0BAA0B,EAAE;AAAA,EACvC,EAAE,OAAO,EAAE;AAAA,IACT,SAAS;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AACF;AAEO,IAAM,6BAA6B,EAAE,MAAM;AAAA,EAChD,EAAE,OAAO,EAAE;AAAA,IACT,SAAS;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AACF,CAAC;AAEM,IAAM,4BAA4B,EAAE;AAAA,EACzC,EAAE,OAAO,EAAE;AAAA,IACT,SAAS;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AACF;AAEO,IAAM,gCAAgC,EAAE;AAAA,EAC7C,EAAE,OAAO,EAAE;AAAA,IACT,SAAS;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AACF;AAEO,IAAM,qBAAqB,wBAAwB,OAAO;AAAA,EAC/D,OAAO,EACJ,OAAO,EACP,SAAS,EACT;AAAA,IACC,OAAO;AAAA,MACL,aAAa;AAAA,MACb,kBAAkB;AAAA,IACpB,CAAC;AAAA,EACH;AACJ,CAAC;AAEM,IAAM,uBAAuB,EAAE;AAAA,EACpC,EAAE,OAAO,EAAE;AAAA,IACT,SAAS;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AACF;","names":[]}
@@ -1,10 +1,11 @@
1
1
  // src/shared/config.ts
2
2
  import { randomBytes, randomUUID } from "crypto";
3
3
  import process from "process";
4
- var packageVersion = "1.1.16";
4
+ var packageVersion = "1.1.17";
5
5
  var defaultApiBaseUrl = "https://curly.ng";
6
6
  function resolveApiBaseUrl(options) {
7
- return options.apiBaseUrl ?? process.env.CNGKIT_API_BASE_URL ?? defaultApiBaseUrl;
7
+ void options;
8
+ return defaultApiBaseUrl;
8
9
  }
9
10
  function resolveOutputFormat() {
10
11
  const value = process.env.CNGKIT_FORMAT?.toLowerCase();
@@ -29,15 +30,13 @@ function createPeerId() {
29
30
 
30
31
  // src/shared/output.ts
31
32
  import process2 from "process";
32
- import { Marked } from "marked";
33
- import { markedTerminal } from "marked-terminal";
34
33
  import { createElement } from "react";
35
34
  import { renderToString, Text } from "ink";
36
- import stripAnsi2 from "strip-ansi";
35
+ import Markdown from "@inkkit/ink-markdown";
36
+ import stripAnsi from "strip-ansi";
37
37
 
38
38
  // src/shared/theme.ts
39
39
  import { Chalk } from "chalk";
40
- import stripAnsi from "strip-ansi";
41
40
  var statusStylePropsByOutputStyle = {
42
41
  info: {
43
42
  color: "cyan"
@@ -78,40 +77,13 @@ function createMarkdownTheme(useColor) {
78
77
  link: chalk.blueBright,
79
78
  href: chalk.blue.underline,
80
79
  text: identity,
81
- showSectionPrefix: true,
80
+ showSectionPrefix: false,
82
81
  reflowText: true,
83
82
  unescape: true,
84
83
  emoji: false,
85
84
  tab: 2
86
85
  };
87
86
  }
88
- function decorateMarkdownOutput(output) {
89
- const chalk = new Chalk({ level: 1 });
90
- const decoratedLines = output.split("\n").map((line) => {
91
- const plainLine = stripAnsi(line);
92
- if (plainLine.startsWith("# ")) {
93
- return chalk.magentaBright.bold(plainLine);
94
- }
95
- if (plainLine.startsWith("## ")) {
96
- return chalk.blueBright.bold(plainLine);
97
- }
98
- return line;
99
- }).join("\n");
100
- return decoratedLines.replace(/`([^`\n]+)`/g, (_match, value) => chalk.cyanBright(value)).replace(/(^|\s)(--[a-z][a-z0-9-]*)/g, (_match, prefix, flag) => {
101
- return `${prefix}${chalk.yellow(flag)}`;
102
- }).replace(/(https?:\/\/[^\s)]+)/g, (url) => chalk.blueBright.underline(url)).replace(/^(\s*)\*\s+/gm, (_match, prefix) => {
103
- return `${prefix}${chalk.magentaBright("-")} `;
104
- });
105
- }
106
- function normalizeRenderedMarkdownOutput(output) {
107
- return output.split("\n").map((line) => {
108
- const headingMatch = line.match(/^(\s*)#{1,6}\s+(.+)$/);
109
- if (headingMatch) {
110
- return `${headingMatch[1]}${headingMatch[2]}`;
111
- }
112
- return line.replace(/^(\s*)\*\s+/, "$1- ");
113
- }).join("\n").replace(/`([^`\n]+)`/g, "$1");
114
- }
115
87
 
116
88
  // src/shared/output.ts
117
89
  var consoleOutput = createCommandOutput(process2.stdout, process2.stderr);
@@ -173,47 +145,45 @@ function formatMarkdownMessage(stream, markdown) {
173
145
  }
174
146
  const useColor = shouldRenderColor(stream);
175
147
  const markdownWidth = clampMarkdownWidth(stream.columns);
176
- const parser = new Marked();
177
- parser.use(
178
- markedTerminal({
179
- ...createMarkdownTheme(false),
180
- width: markdownWidth
181
- })
182
- );
183
148
  const preparedMarkdown = prepareMarkdownForTerminal(markdown);
184
- const renderedMarkdown = normalizeRenderedMarkdownOutput(
185
- `${preparedMarkdown.prefix}${String(parser.parse(preparedMarkdown.body)).trimEnd()}`
149
+ const renderedMarkdown = renderToString(
150
+ createElement(
151
+ Markdown,
152
+ {
153
+ ...createMarkdownTheme(useColor),
154
+ children: preparedMarkdown,
155
+ width: markdownWidth
156
+ }
157
+ ),
158
+ {
159
+ columns: markdownWidth
160
+ }
186
161
  );
187
- return useColor ? decorateMarkdownOutput(renderedMarkdown) : stripAnsi2(renderedMarkdown);
162
+ return useColor ? renderedMarkdown.trimEnd() : stripAnsi(renderedMarkdown).trimEnd();
188
163
  }
189
164
  function prepareMarkdownForTerminal(markdown) {
190
165
  if (!markdown.startsWith("---\n")) {
191
- return { prefix: "", body: markdown };
166
+ return markdown;
192
167
  }
193
168
  const frontmatterEndIndex = markdown.indexOf("\n---", 4);
194
169
  if (frontmatterEndIndex < 0) {
195
- return {
196
- prefix: formatFrontmatterForTerminal(markdown.slice(4).trimEnd()),
197
- body: ""
198
- };
170
+ return formatFrontmatterForTerminal(markdown.slice(4).trimEnd());
199
171
  }
200
172
  const frontmatter = markdown.slice(4, frontmatterEndIndex).trimEnd();
201
173
  const body = markdown.slice(frontmatterEndIndex + "\n---".length).replace(/^\n+/, "");
202
- return {
203
- prefix: formatFrontmatterForTerminal(frontmatter),
204
- body
205
- };
174
+ return `${formatFrontmatterForTerminal(frontmatter)}
175
+
176
+ ${body}`;
206
177
  }
207
178
  function formatFrontmatterForTerminal(frontmatter) {
208
- const formattedFrontmatter = frontmatter.split("\n").map((line) => ` ${line}`).join("\n");
209
- return `Metadata
210
-
211
- ${formattedFrontmatter}
179
+ return `## Metadata
212
180
 
213
- `;
181
+ \`\`\`yaml
182
+ ${frontmatter}
183
+ \`\`\``;
214
184
  }
215
185
  function shouldRenderColor(stream) {
216
- if (process2.env.NO_COLOR !== void 0 || process2.env.CNGKIT_NO_COLOR === "1") {
186
+ if (process2.env.CNGKIT_NO_COLOR === "1") {
217
187
  return false;
218
188
  }
219
189
  const colorMode = process2.env.CNGKIT_COLOR?.toLowerCase();
@@ -226,6 +196,9 @@ function shouldRenderColor(stream) {
226
196
  if (process2.env.FORCE_COLOR !== void 0 && process2.env.FORCE_COLOR !== "0") {
227
197
  return true;
228
198
  }
199
+ if (process2.env.NO_COLOR !== void 0) {
200
+ return false;
201
+ }
229
202
  return stream.isTTY === true;
230
203
  }
231
204
  function clampMarkdownWidth(columns) {
@@ -246,4 +219,4 @@ export {
246
219
  createCommandOutput,
247
220
  formatError
248
221
  };
249
- //# sourceMappingURL=chunk-7KQBSEQV.js.map
222
+ //# sourceMappingURL=chunk-WYJTGGMN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/shared/config.ts","../src/shared/output.ts","../src/shared/theme.ts"],"sourcesContent":["import { randomBytes, randomUUID } from \"node:crypto\";\nimport process from \"node:process\";\n\nexport const packageVersion = \"1.1.17\";\nexport const defaultApiBaseUrl = \"https://curly.ng\";\nexport const outputFormats = [\"text\", \"json\", \"markdown\"] as const;\n\nexport type OutputFormat = (typeof outputFormats)[number];\n\nexport type GlobalCommandOptions = {\n readonly apiBaseUrl?: never;\n};\n\nexport function resolveApiBaseUrl(options: GlobalCommandOptions): string {\n void options;\n return defaultApiBaseUrl;\n}\n\nexport function resolveOutputFormat(): OutputFormat {\n const value = process.env.CNGKIT_FORMAT?.toLowerCase();\n if (value === \"json\" || value === \"markdown\") {\n return value;\n }\n\n return \"text\";\n}\n\nexport function parseOutputFormat(value: string): OutputFormat {\n const normalizedValue = value.toLowerCase();\n if (normalizedValue === \"text\" || normalizedValue === \"json\" || normalizedValue === \"markdown\") {\n return normalizedValue;\n }\n\n throw new Error(\"Unknown --format value. Use one of: text, json, markdown.\");\n}\n\nexport function createRoomCode(): string {\n return randomBytes(4).toString(\"hex\").toUpperCase();\n}\n\nexport function createPeerId(): string {\n return randomUUID();\n}\n","import process from \"node:process\";\nimport { createElement } from \"react\";\nimport { renderToString, Text } from \"ink\";\nimport Markdown from \"@inkkit/ink-markdown\";\nimport stripAnsi from \"strip-ansi\";\nimport {\n createMarkdownTheme,\n statusStylePropsByOutputStyle,\n type OutputStyle,\n} from \"./theme.js\";\nimport { resolveOutputFormat } from \"./config.js\";\n\ntype OutputStream = NodeJS.WriteStream & {\n isTTY?: boolean;\n columns?: number;\n};\n\nexport type CommandOutput = {\n info(message: string): void;\n success(message: string): void;\n warning(message: string): void;\n muted(message: string): void;\n markdown(message: string): void;\n raw(message: string): void;\n error(message: string): void;\n};\n\nexport const consoleOutput = createCommandOutput(process.stdout, process.stderr);\n\nexport function createCommandOutput(stdout: OutputStream, stderr: OutputStream): CommandOutput {\n return {\n info(message) {\n writeStyledMessage(stdout, \"info\", message);\n },\n success(message) {\n writeStyledMessage(stdout, \"success\", message);\n },\n warning(message) {\n writeStyledMessage(stdout, \"warning\", message);\n },\n muted(message) {\n writeStyledMessage(stdout, \"muted\", message);\n },\n markdown(message) {\n stdout.write(`${formatMarkdownMessage(stdout, message)}\\n`);\n },\n raw(message) {\n stdout.write(`${message}\\n`);\n },\n error(message) {\n writeStyledMessage(stderr, \"error\", message);\n },\n };\n}\n\nexport function formatError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction writeStyledMessage(stream: OutputStream, style: OutputStyle, message: string): void {\n stream.write(`${formatStyledMessage(stream, style, message)}\\n`);\n}\n\nfunction formatStyledMessage(stream: OutputStream, style: OutputStyle, message: string): string {\n if (!shouldRenderColor(stream)) {\n return message;\n }\n\n return renderToString(\n createElement(\n Text,\n {\n ...statusStylePropsByOutputStyle[style],\n wrap: \"wrap\",\n },\n message\n ),\n {\n columns: 10_000,\n }\n );\n}\n\nfunction formatMarkdownMessage(stream: OutputStream, markdown: string): string {\n if (resolveOutputFormat() === \"markdown\") {\n return markdown;\n }\n\n const useColor = shouldRenderColor(stream);\n const markdownWidth = clampMarkdownWidth(stream.columns);\n const preparedMarkdown = prepareMarkdownForTerminal(markdown);\n const renderedMarkdown = renderToString(\n createElement(\n Markdown,\n {\n ...createMarkdownTheme(useColor),\n children: preparedMarkdown,\n width: markdownWidth,\n }\n ),\n {\n columns: markdownWidth,\n }\n );\n\n return useColor ? renderedMarkdown.trimEnd() : stripAnsi(renderedMarkdown).trimEnd();\n}\n\nfunction prepareMarkdownForTerminal(markdown: string): string {\n if (!markdown.startsWith(\"---\\n\")) {\n return markdown;\n }\n\n const frontmatterEndIndex = markdown.indexOf(\"\\n---\", 4);\n if (frontmatterEndIndex < 0) {\n return formatFrontmatterForTerminal(markdown.slice(4).trimEnd());\n }\n\n const frontmatter = markdown.slice(4, frontmatterEndIndex).trimEnd();\n const body = markdown.slice(frontmatterEndIndex + \"\\n---\".length).replace(/^\\n+/, \"\");\n\n return `${formatFrontmatterForTerminal(frontmatter)}\\n\\n${body}`;\n}\n\nfunction formatFrontmatterForTerminal(frontmatter: string): string {\n return `## Metadata\\n\\n\\`\\`\\`yaml\\n${frontmatter}\\n\\`\\`\\``;\n}\n\nfunction shouldRenderColor(stream: OutputStream): boolean {\n if (process.env.CNGKIT_NO_COLOR === \"1\") {\n return false;\n }\n\n const colorMode = process.env.CNGKIT_COLOR?.toLowerCase();\n\n if (colorMode === \"never\" || colorMode === \"0\" || colorMode === \"false\") {\n return false;\n }\n\n if (colorMode === \"always\" || colorMode === \"1\" || colorMode === \"true\") {\n return true;\n }\n\n if (process.env.FORCE_COLOR !== undefined && process.env.FORCE_COLOR !== \"0\") {\n return true;\n }\n\n if (process.env.NO_COLOR !== undefined) {\n return false;\n }\n\n return stream.isTTY === true;\n}\n\nfunction clampMarkdownWidth(columns: number | undefined): number {\n if (columns === undefined) {\n return 100;\n }\n\n return Math.max(72, Math.min(columns, 120));\n}\n","import { Chalk } from \"chalk\";\nimport type { TextProps } from \"ink\";\n\nexport type OutputStyle = \"info\" | \"success\" | \"warning\" | \"muted\" | \"error\";\n\nexport const statusStylePropsByOutputStyle = {\n info: {\n color: \"cyan\",\n },\n success: {\n color: \"green\",\n bold: true,\n },\n warning: {\n color: \"yellow\",\n bold: true,\n },\n muted: {\n dimColor: true,\n },\n error: {\n color: \"red\",\n bold: true,\n },\n} satisfies Record<OutputStyle, TextProps>;\n\nexport function createMarkdownTheme(useColor: boolean) {\n const chalk = new Chalk({ level: useColor ? 1 : 0 });\n const identity = (value: string) => value;\n\n return {\n code: chalk.green,\n blockquote: chalk.dim.italic,\n html: chalk.gray,\n heading: chalk.blueBright.bold,\n firstHeading: chalk.magentaBright.bold,\n hr: chalk.gray,\n listitem: identity,\n table: identity,\n paragraph: identity,\n strong: chalk.bold,\n em: chalk.italic,\n codespan: chalk.cyanBright,\n del: chalk.dim.strikethrough,\n link: chalk.blueBright,\n href: chalk.blue.underline,\n text: identity,\n showSectionPrefix: false,\n reflowText: true,\n unescape: true,\n emoji: false,\n tab: 2,\n };\n}\n"],"mappings":"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","names":["process","process"]}
package/dist/cli.js CHANGED
@@ -2,13 +2,13 @@
2
2
  import {
3
3
  formatCngkitHelp,
4
4
  formatKnowledgesHelp
5
- } from "./chunk-GZ2DPIU6.js";
5
+ } from "./chunk-BL3XMLIH.js";
6
6
  import {
7
7
  consoleOutput,
8
8
  formatError,
9
9
  packageVersion,
10
10
  parseOutputFormat
11
- } from "./chunk-7KQBSEQV.js";
11
+ } from "./chunk-WYJTGGMN.js";
12
12
  import "./chunk-PZ5AY32C.js";
13
13
 
14
14
  // src/cli.ts
@@ -69,22 +69,6 @@ function normalizeGlobalOptions(argv) {
69
69
  const normalizedArgv = [...argv];
70
70
  for (let index = 2; index < normalizedArgv.length; index += 1) {
71
71
  const argument = normalizedArgv[index];
72
- if (argument === "--api-base-url") {
73
- const value = normalizedArgv[index + 1];
74
- if (!value || value.startsWith("-")) {
75
- throw new Error("Missing value for --api-base-url");
76
- }
77
- process.env.CNGKIT_API_BASE_URL = value;
78
- normalizedArgv.splice(index, 2);
79
- index -= 1;
80
- continue;
81
- }
82
- if (argument.startsWith("--api-base-url=")) {
83
- process.env.CNGKIT_API_BASE_URL = argument.slice("--api-base-url=".length);
84
- normalizedArgv.splice(index, 1);
85
- index -= 1;
86
- continue;
87
- }
88
72
  if (argument === "--format") {
89
73
  const value = normalizedArgv[index + 1];
90
74
  if (!value || value.startsWith("-")) {
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 === \"--api-base-url\") {\n const value = normalizedArgv[index + 1];\n if (!value || value.startsWith(\"-\")) {\n throw new Error(\"Missing value for --api-base-url\");\n }\n\n process.env.CNGKIT_API_BASE_URL = value;\n normalizedArgv.splice(index, 2);\n index -= 1;\n continue;\n }\n\n if (argument.startsWith(\"--api-base-url=\")) {\n process.env.CNGKIT_API_BASE_URL = argument.slice(\"--api-base-url=\".length);\n normalizedArgv.splice(index, 1);\n index -= 1;\n continue;\n }\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 = 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([\"help\", \"login\", \"coderoom\", \"scrub\", \"transcripts\", \"knowledges\"]);\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","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\") && 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((argument, index) => index !== helpIndex && !argument.startsWith(\"-\"));\n output.markdown(formatKnowledgesHelp(topic));\n return true;\n }\n\n if (commandName === \"coderoom\") {\n const topic = commandArgs.find((argument, index) => index !== helpIndex && !argument.startsWith(\"-\"));\n output.markdown(formatCngkitHelp(topic ? `coderoom-${topic}` : \"coderoom\"));\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/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 = 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([\"help\", \"login\", \"coderoom\", \"scrub\", \"transcripts\", \"knowledges\"]);\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","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\") && 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((argument, index) => index !== helpIndex && !argument.startsWith(\"-\"));\n output.markdown(formatKnowledgesHelp(topic));\n return true;\n }\n\n if (commandName === \"coderoom\") {\n const topic = commandArgs.find((argument, index) => index !== helpIndex && !argument.startsWith(\"-\"));\n output.markdown(formatCngkitHelp(topic ? `coderoom-${topic}` : \"coderoom\"));\n return true;\n }\n\n output.markdown(formatCngkitHelp(commandName));\n return true;\n}\n"],"mappings":"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","names":[]}
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  formatCngkitHelp
3
- } from "../../chunk-GZ2DPIU6.js";
3
+ } from "../../chunk-BL3XMLIH.js";
4
4
  import {
5
5
  GlobalOptionsSchema
6
- } from "../../chunk-MLKBG5YJ.js";
6
+ } from "../../chunk-VCWNKNUE.js";
7
7
  import {
8
8
  CommandRunner
9
- } from "../../chunk-W7X6HWP5.js";
10
- import "../../chunk-7KQBSEQV.js";
9
+ } from "../../chunk-GT2MTS6E.js";
10
+ import "../../chunk-WYJTGGMN.js";
11
11
  import "../../chunk-PZ5AY32C.js";
12
12
 
13
13
  // src/commands/coderoom/index.tsx
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  runJoinCommand
3
- } from "../../chunk-F7ZOO3P5.js";
4
- import "../../chunk-MJVMVXV5.js";
3
+ } from "../../chunk-5ZNV3FDG.js";
4
+ import "../../chunk-HRFI2IEP.js";
5
5
  import {
6
6
  GlobalOptionsSchema,
7
7
  RequiredRoomCodeArgsSchema
8
- } from "../../chunk-MLKBG5YJ.js";
8
+ } from "../../chunk-VCWNKNUE.js";
9
9
  import {
10
10
  CommandRunner
11
- } from "../../chunk-W7X6HWP5.js";
12
- import "../../chunk-7KQBSEQV.js";
11
+ } from "../../chunk-GT2MTS6E.js";
12
+ import "../../chunk-WYJTGGMN.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-F7ZOO3P5.js";
4
- import "../../chunk-MJVMVXV5.js";
3
+ } from "../../chunk-5ZNV3FDG.js";
4
+ import "../../chunk-HRFI2IEP.js";
5
5
  import {
6
6
  GlobalOptionsSchema,
7
7
  OptionalRoomCodeArgsSchema
8
- } from "../../chunk-MLKBG5YJ.js";
8
+ } from "../../chunk-VCWNKNUE.js";
9
9
  import {
10
10
  CommandRunner
11
- } from "../../chunk-W7X6HWP5.js";
12
- import "../../chunk-7KQBSEQV.js";
11
+ } from "../../chunk-GT2MTS6E.js";
12
+ import "../../chunk-WYJTGGMN.js";
13
13
  import "../../chunk-PZ5AY32C.js";
14
14
 
15
15
  // src/commands/coderoom/share.tsx
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  formatCngkitHelp
3
- } from "../chunk-GZ2DPIU6.js";
3
+ } from "../chunk-BL3XMLIH.js";
4
4
  import {
5
5
  CommandRunner
6
- } from "../chunk-W7X6HWP5.js";
7
- import "../chunk-7KQBSEQV.js";
6
+ } from "../chunk-GT2MTS6E.js";
7
+ import "../chunk-WYJTGGMN.js";
8
8
  import "../chunk-PZ5AY32C.js";
9
9
 
10
10
  // src/commands/index.tsx
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  runKnowAudiencesCommand
3
- } from "../../chunk-NRWEU6YQ.js";
3
+ } from "../../chunk-K36DKQWH.js";
4
4
  import "../../chunk-XQGLUQFM.js";
5
- import "../../chunk-GZ2DPIU6.js";
6
- import "../../chunk-MJVMVXV5.js";
5
+ import "../../chunk-BL3XMLIH.js";
6
+ import "../../chunk-HRFI2IEP.js";
7
7
  import {
8
8
  JsonOutputOptionsSchema
9
- } from "../../chunk-MLKBG5YJ.js";
9
+ } from "../../chunk-VCWNKNUE.js";
10
10
  import {
11
11
  CommandRunner
12
- } from "../../chunk-W7X6HWP5.js";
13
- import "../../chunk-7KQBSEQV.js";
12
+ } from "../../chunk-GT2MTS6E.js";
13
+ import "../../chunk-WYJTGGMN.js";
14
14
  import "../../chunk-PZ5AY32C.js";
15
15
 
16
16
  // src/commands/knowledges/audiences.tsx
@@ -1,17 +1,17 @@
1
1
  import {
2
2
  runKnowFilesCommand
3
- } from "../../chunk-NRWEU6YQ.js";
3
+ } from "../../chunk-K36DKQWH.js";
4
4
  import "../../chunk-XQGLUQFM.js";
5
- import "../../chunk-GZ2DPIU6.js";
6
- import "../../chunk-MJVMVXV5.js";
5
+ import "../../chunk-BL3XMLIH.js";
6
+ import "../../chunk-HRFI2IEP.js";
7
7
  import {
8
8
  JsonOutputOptionsSchema,
9
9
  OptionalQueryArgsSchema
10
- } from "../../chunk-MLKBG5YJ.js";
10
+ } from "../../chunk-VCWNKNUE.js";
11
11
  import {
12
12
  CommandRunner
13
- } from "../../chunk-W7X6HWP5.js";
14
- import "../../chunk-7KQBSEQV.js";
13
+ } from "../../chunk-GT2MTS6E.js";
14
+ import "../../chunk-WYJTGGMN.js";
15
15
  import "../../chunk-PZ5AY32C.js";
16
16
 
17
17
  // src/commands/knowledges/files.tsx
@@ -1,17 +1,17 @@
1
1
  import {
2
2
  runKnowGlobCommand
3
- } from "../../chunk-NRWEU6YQ.js";
3
+ } from "../../chunk-K36DKQWH.js";
4
4
  import "../../chunk-XQGLUQFM.js";
5
- import "../../chunk-GZ2DPIU6.js";
6
- import "../../chunk-MJVMVXV5.js";
5
+ import "../../chunk-BL3XMLIH.js";
6
+ import "../../chunk-HRFI2IEP.js";
7
7
  import {
8
8
  LimitOptionsSchema,
9
9
  OptionalGlobPatternArgsSchema
10
- } from "../../chunk-MLKBG5YJ.js";
10
+ } from "../../chunk-VCWNKNUE.js";
11
11
  import {
12
12
  CommandRunner
13
- } from "../../chunk-W7X6HWP5.js";
14
- import "../../chunk-7KQBSEQV.js";
13
+ } from "../../chunk-GT2MTS6E.js";
14
+ import "../../chunk-WYJTGGMN.js";
15
15
  import "../../chunk-PZ5AY32C.js";
16
16
 
17
17
  // src/commands/knowledges/glob.tsx
@@ -1,17 +1,17 @@
1
1
  import {
2
2
  runKnowGrepCommand
3
- } from "../../chunk-NRWEU6YQ.js";
3
+ } from "../../chunk-K36DKQWH.js";
4
4
  import "../../chunk-XQGLUQFM.js";
5
- import "../../chunk-GZ2DPIU6.js";
6
- import "../../chunk-MJVMVXV5.js";
5
+ import "../../chunk-BL3XMLIH.js";
6
+ import "../../chunk-HRFI2IEP.js";
7
7
  import {
8
8
  LimitOptionsSchema,
9
9
  RequiredPatternArgsSchema
10
- } from "../../chunk-MLKBG5YJ.js";
10
+ } from "../../chunk-VCWNKNUE.js";
11
11
  import {
12
12
  CommandRunner
13
- } from "../../chunk-W7X6HWP5.js";
14
- import "../../chunk-7KQBSEQV.js";
13
+ } from "../../chunk-GT2MTS6E.js";
14
+ import "../../chunk-WYJTGGMN.js";
15
15
  import "../../chunk-PZ5AY32C.js";
16
16
 
17
17
  // src/commands/knowledges/grep.tsx
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  formatKnowledgesHelp
3
- } from "../../chunk-GZ2DPIU6.js";
3
+ } from "../../chunk-BL3XMLIH.js";
4
4
  import {
5
5
  GlobalOptionsSchema
6
- } from "../../chunk-MLKBG5YJ.js";
6
+ } from "../../chunk-VCWNKNUE.js";
7
7
  import {
8
8
  CommandRunner
9
- } from "../../chunk-W7X6HWP5.js";
10
- import "../../chunk-7KQBSEQV.js";
9
+ } from "../../chunk-GT2MTS6E.js";
10
+ import "../../chunk-WYJTGGMN.js";
11
11
  import "../../chunk-PZ5AY32C.js";
12
12
 
13
13
  // src/commands/knowledges/index.tsx
@@ -1,17 +1,17 @@
1
1
  import {
2
2
  runKnowListCommand
3
- } from "../../chunk-NRWEU6YQ.js";
3
+ } from "../../chunk-K36DKQWH.js";
4
4
  import "../../chunk-XQGLUQFM.js";
5
- import "../../chunk-GZ2DPIU6.js";
6
- import "../../chunk-MJVMVXV5.js";
5
+ import "../../chunk-BL3XMLIH.js";
6
+ import "../../chunk-HRFI2IEP.js";
7
7
  import {
8
8
  LimitOptionsSchema,
9
9
  OptionalQueryArgsSchema
10
- } from "../../chunk-MLKBG5YJ.js";
10
+ } from "../../chunk-VCWNKNUE.js";
11
11
  import {
12
12
  CommandRunner
13
- } from "../../chunk-W7X6HWP5.js";
14
- import "../../chunk-7KQBSEQV.js";
13
+ } from "../../chunk-GT2MTS6E.js";
14
+ import "../../chunk-WYJTGGMN.js";
15
15
  import "../../chunk-PZ5AY32C.js";
16
16
 
17
17
  // src/commands/knowledges/list.tsx
@@ -1,17 +1,17 @@
1
1
  import {
2
2
  runKnowReadCommand
3
- } from "../../chunk-NRWEU6YQ.js";
3
+ } from "../../chunk-K36DKQWH.js";
4
4
  import "../../chunk-XQGLUQFM.js";
5
- import "../../chunk-GZ2DPIU6.js";
6
- import "../../chunk-MJVMVXV5.js";
5
+ import "../../chunk-BL3XMLIH.js";
6
+ import "../../chunk-HRFI2IEP.js";
7
7
  import {
8
8
  JsonOutputOptionsSchema,
9
9
  RequiredFilePathArgsSchema
10
- } from "../../chunk-MLKBG5YJ.js";
10
+ } from "../../chunk-VCWNKNUE.js";
11
11
  import {
12
12
  CommandRunner
13
- } from "../../chunk-W7X6HWP5.js";
14
- import "../../chunk-7KQBSEQV.js";
13
+ } from "../../chunk-GT2MTS6E.js";
14
+ import "../../chunk-WYJTGGMN.js";
15
15
  import "../../chunk-PZ5AY32C.js";
16
16
 
17
17
  // src/commands/knowledges/read.tsx
@@ -1,17 +1,17 @@
1
1
  import {
2
2
  runKnowSearchCommand
3
- } from "../../chunk-NRWEU6YQ.js";
3
+ } from "../../chunk-K36DKQWH.js";
4
4
  import "../../chunk-XQGLUQFM.js";
5
- import "../../chunk-GZ2DPIU6.js";
6
- import "../../chunk-MJVMVXV5.js";
5
+ import "../../chunk-BL3XMLIH.js";
6
+ import "../../chunk-HRFI2IEP.js";
7
7
  import {
8
8
  LimitOptionsSchema,
9
9
  RequiredQueryArgsSchema
10
- } from "../../chunk-MLKBG5YJ.js";
10
+ } from "../../chunk-VCWNKNUE.js";
11
11
  import {
12
12
  CommandRunner
13
- } from "../../chunk-W7X6HWP5.js";
14
- import "../../chunk-7KQBSEQV.js";
13
+ } from "../../chunk-GT2MTS6E.js";
14
+ import "../../chunk-WYJTGGMN.js";
15
15
  import "../../chunk-PZ5AY32C.js";
16
16
 
17
17
  // src/commands/knowledges/search.tsx
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  runKnowStatusCommand
3
- } from "../../chunk-NRWEU6YQ.js";
3
+ } from "../../chunk-K36DKQWH.js";
4
4
  import "../../chunk-XQGLUQFM.js";
5
- import "../../chunk-GZ2DPIU6.js";
6
- import "../../chunk-MJVMVXV5.js";
5
+ import "../../chunk-BL3XMLIH.js";
6
+ import "../../chunk-HRFI2IEP.js";
7
7
  import {
8
8
  JsonOutputOptionsSchema
9
- } from "../../chunk-MLKBG5YJ.js";
9
+ } from "../../chunk-VCWNKNUE.js";
10
10
  import {
11
11
  CommandRunner
12
- } from "../../chunk-W7X6HWP5.js";
13
- import "../../chunk-7KQBSEQV.js";
12
+ } from "../../chunk-GT2MTS6E.js";
13
+ import "../../chunk-WYJTGGMN.js";
14
14
  import "../../chunk-PZ5AY32C.js";
15
15
 
16
16
  // src/commands/knowledges/status.tsx
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  GlobalOptionsSchema
3
- } from "../chunk-MLKBG5YJ.js";
3
+ } from "../chunk-VCWNKNUE.js";
4
4
  import {
5
5
  CommandRunner
6
- } from "../chunk-W7X6HWP5.js";
6
+ } from "../chunk-GT2MTS6E.js";
7
7
  import {
8
8
  resolveApiBaseUrl
9
- } from "../chunk-7KQBSEQV.js";
9
+ } from "../chunk-WYJTGGMN.js";
10
10
  import "../chunk-PZ5AY32C.js";
11
11
 
12
12
  // src/shared/browser.ts
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  GlobalOptionsSchema,
3
3
  OptionalPathArgsSchema
4
- } from "../chunk-MLKBG5YJ.js";
4
+ } from "../chunk-VCWNKNUE.js";
5
5
  import {
6
6
  CommandRunner
7
- } from "../chunk-W7X6HWP5.js";
8
- import "../chunk-7KQBSEQV.js";
7
+ } from "../chunk-GT2MTS6E.js";
8
+ import "../chunk-WYJTGGMN.js";
9
9
  import "../chunk-PZ5AY32C.js";
10
10
 
11
11
  // src/commands/scrub.tsx
@@ -7,15 +7,15 @@ import {
7
7
  } from "../chunk-XQGLUQFM.js";
8
8
  import {
9
9
  formatCngkitHelp
10
- } from "../chunk-GZ2DPIU6.js";
10
+ } from "../chunk-BL3XMLIH.js";
11
11
  import {
12
12
  GlobalOptionsSchema,
13
13
  TranscriptArgsSchema
14
- } from "../chunk-MLKBG5YJ.js";
14
+ } from "../chunk-VCWNKNUE.js";
15
15
  import {
16
16
  CommandRunner
17
- } from "../chunk-W7X6HWP5.js";
18
- import "../chunk-7KQBSEQV.js";
17
+ } from "../chunk-GT2MTS6E.js";
18
+ import "../chunk-WYJTGGMN.js";
19
19
  import "../chunk-PZ5AY32C.js";
20
20
 
21
21
  // src/commands/transcripts.tsx
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cngkit",
3
- "version": "1.1.16",
3
+ "version": "1.1.17",
4
4
  "description": "Opinionated Curly.ng CLI kit for Coderoom collaboration and website tooling.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -37,11 +37,10 @@
37
37
  },
38
38
  "license": "Beerware",
39
39
  "dependencies": {
40
+ "@inkkit/ink-markdown": "1.0.0",
40
41
  "chalk": "5.6.2",
41
42
  "chokidar": "^4.0.3",
42
43
  "ink": "^6.8.0",
43
- "marked": "15.0.12",
44
- "marked-terminal": "7.3.0",
45
44
  "pastel": "^4.0.1",
46
45
  "react": "^19.2.7",
47
46
  "react-devtools-core": "^6.1.5",
@@ -51,7 +50,6 @@
51
50
  },
52
51
  "devDependencies": {
53
52
  "@cng/client": "workspace:*",
54
- "@types/marked-terminal": "6.1.1",
55
53
  "@types/node": "^20",
56
54
  "@types/react": "^19.2.17",
57
55
  "@types/ws": "^8.18.1",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/shared/config.ts","../src/shared/output.ts","../src/shared/theme.ts"],"sourcesContent":["import { randomBytes, randomUUID } from \"node:crypto\";\nimport process from \"node:process\";\n\nexport const packageVersion = \"1.1.16\";\nexport const defaultApiBaseUrl = \"https://curly.ng\";\nexport const outputFormats = [\"text\", \"json\", \"markdown\"] as const;\n\nexport type OutputFormat = (typeof outputFormats)[number];\n\nexport type GlobalCommandOptions = {\n apiBaseUrl?: string;\n};\n\nexport function resolveApiBaseUrl(options: GlobalCommandOptions): string {\n return options.apiBaseUrl ?? process.env.CNGKIT_API_BASE_URL ?? defaultApiBaseUrl;\n}\n\nexport function resolveOutputFormat(): OutputFormat {\n const value = process.env.CNGKIT_FORMAT?.toLowerCase();\n if (value === \"json\" || value === \"markdown\") {\n return value;\n }\n\n return \"text\";\n}\n\nexport function parseOutputFormat(value: string): OutputFormat {\n const normalizedValue = value.toLowerCase();\n if (normalizedValue === \"text\" || normalizedValue === \"json\" || normalizedValue === \"markdown\") {\n return normalizedValue;\n }\n\n throw new Error(\"Unknown --format value. Use one of: text, json, markdown.\");\n}\n\nexport function createRoomCode(): string {\n return randomBytes(4).toString(\"hex\").toUpperCase();\n}\n\nexport function createPeerId(): string {\n return randomUUID();\n}\n","import process from \"node:process\";\nimport { Marked, type MarkedExtension } from \"marked\";\nimport { markedTerminal } from \"marked-terminal\";\nimport { createElement } from \"react\";\nimport { renderToString, Text } from \"ink\";\nimport stripAnsi from \"strip-ansi\";\nimport {\n createMarkdownTheme,\n decorateMarkdownOutput,\n normalizeRenderedMarkdownOutput,\n statusStylePropsByOutputStyle,\n type OutputStyle,\n} from \"./theme.js\";\nimport { resolveOutputFormat } from \"./config.js\";\n\ntype OutputStream = NodeJS.WriteStream & {\n isTTY?: boolean;\n columns?: number;\n};\n\nexport type CommandOutput = {\n info(message: string): void;\n success(message: string): void;\n warning(message: string): void;\n muted(message: string): void;\n markdown(message: string): void;\n raw(message: string): void;\n error(message: string): void;\n};\n\nexport const consoleOutput = createCommandOutput(process.stdout, process.stderr);\n\nexport function createCommandOutput(stdout: OutputStream, stderr: OutputStream): CommandOutput {\n return {\n info(message) {\n writeStyledMessage(stdout, \"info\", message);\n },\n success(message) {\n writeStyledMessage(stdout, \"success\", message);\n },\n warning(message) {\n writeStyledMessage(stdout, \"warning\", message);\n },\n muted(message) {\n writeStyledMessage(stdout, \"muted\", message);\n },\n markdown(message) {\n stdout.write(`${formatMarkdownMessage(stdout, message)}\\n`);\n },\n raw(message) {\n stdout.write(`${message}\\n`);\n },\n error(message) {\n writeStyledMessage(stderr, \"error\", message);\n },\n };\n}\n\nexport function formatError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction writeStyledMessage(stream: OutputStream, style: OutputStyle, message: string): void {\n stream.write(`${formatStyledMessage(stream, style, message)}\\n`);\n}\n\nfunction formatStyledMessage(stream: OutputStream, style: OutputStyle, message: string): string {\n if (!shouldRenderColor(stream)) {\n return message;\n }\n\n return renderToString(\n createElement(\n Text,\n {\n ...statusStylePropsByOutputStyle[style],\n wrap: \"wrap\",\n },\n message\n ),\n {\n columns: 10_000,\n }\n );\n}\n\nfunction formatMarkdownMessage(stream: OutputStream, markdown: string): string {\n if (resolveOutputFormat() === \"markdown\") {\n return markdown;\n }\n\n const useColor = shouldRenderColor(stream);\n const markdownWidth = clampMarkdownWidth(stream.columns);\n const parser = new Marked();\n parser.use(\n markedTerminal({\n ...createMarkdownTheme(false),\n width: markdownWidth,\n }) as unknown as MarkedExtension\n );\n\n const preparedMarkdown = prepareMarkdownForTerminal(markdown);\n const renderedMarkdown = normalizeRenderedMarkdownOutput(\n `${preparedMarkdown.prefix}${String(parser.parse(preparedMarkdown.body)).trimEnd()}`\n );\n\n return useColor ? decorateMarkdownOutput(renderedMarkdown) : stripAnsi(renderedMarkdown);\n}\n\nfunction prepareMarkdownForTerminal(markdown: string): { prefix: string; body: string } {\n if (!markdown.startsWith(\"---\\n\")) {\n return { prefix: \"\", body: markdown };\n }\n\n const frontmatterEndIndex = markdown.indexOf(\"\\n---\", 4);\n if (frontmatterEndIndex < 0) {\n return {\n prefix: formatFrontmatterForTerminal(markdown.slice(4).trimEnd()),\n body: \"\",\n };\n }\n\n const frontmatter = markdown.slice(4, frontmatterEndIndex).trimEnd();\n const body = markdown.slice(frontmatterEndIndex + \"\\n---\".length).replace(/^\\n+/, \"\");\n\n return {\n prefix: formatFrontmatterForTerminal(frontmatter),\n body,\n };\n}\n\nfunction formatFrontmatterForTerminal(frontmatter: string): string {\n const formattedFrontmatter = frontmatter\n .split(\"\\n\")\n .map((line) => ` ${line}`)\n .join(\"\\n\");\n\n return `Metadata\\n\\n${formattedFrontmatter}\\n\\n`;\n}\n\nfunction shouldRenderColor(stream: OutputStream): boolean {\n if (process.env.NO_COLOR !== undefined || process.env.CNGKIT_NO_COLOR === \"1\") {\n return false;\n }\n\n const colorMode = process.env.CNGKIT_COLOR?.toLowerCase();\n\n if (colorMode === \"never\" || colorMode === \"0\" || colorMode === \"false\") {\n return false;\n }\n\n if (colorMode === \"always\" || colorMode === \"1\" || colorMode === \"true\") {\n return true;\n }\n\n if (process.env.FORCE_COLOR !== undefined && process.env.FORCE_COLOR !== \"0\") {\n return true;\n }\n\n return stream.isTTY === true;\n}\n\nfunction clampMarkdownWidth(columns: number | undefined): number {\n if (columns === undefined) {\n return 100;\n }\n\n return Math.max(72, Math.min(columns, 120));\n}\n","import { Chalk } from \"chalk\";\nimport type { TextProps } from \"ink\";\nimport stripAnsi from \"strip-ansi\";\n\nexport type OutputStyle = \"info\" | \"success\" | \"warning\" | \"muted\" | \"error\";\n\nexport const statusStylePropsByOutputStyle = {\n info: {\n color: \"cyan\",\n },\n success: {\n color: \"green\",\n bold: true,\n },\n warning: {\n color: \"yellow\",\n bold: true,\n },\n muted: {\n dimColor: true,\n },\n error: {\n color: \"red\",\n bold: true,\n },\n} satisfies Record<OutputStyle, TextProps>;\n\nexport function createMarkdownTheme(useColor: boolean) {\n const chalk = new Chalk({ level: useColor ? 1 : 0 });\n const identity = (value: string) => value;\n\n return {\n code: chalk.green,\n blockquote: chalk.dim.italic,\n html: chalk.gray,\n heading: chalk.blueBright.bold,\n firstHeading: chalk.magentaBright.bold,\n hr: chalk.gray,\n listitem: identity,\n table: identity,\n paragraph: identity,\n strong: chalk.bold,\n em: chalk.italic,\n codespan: chalk.cyanBright,\n del: chalk.dim.strikethrough,\n link: chalk.blueBright,\n href: chalk.blue.underline,\n text: identity,\n showSectionPrefix: true,\n reflowText: true,\n unescape: true,\n emoji: false,\n tab: 2,\n };\n}\n\nexport function decorateMarkdownOutput(output: string): string {\n const chalk = new Chalk({ level: 1 });\n\n const decoratedLines = output\n .split(\"\\n\")\n .map((line) => {\n const plainLine = stripAnsi(line);\n\n if (plainLine.startsWith(\"# \")) {\n return chalk.magentaBright.bold(plainLine);\n }\n\n if (plainLine.startsWith(\"## \")) {\n return chalk.blueBright.bold(plainLine);\n }\n\n return line;\n })\n .join(\"\\n\");\n\n return decoratedLines\n .replace(/`([^`\\n]+)`/g, (_match, value: string) => chalk.cyanBright(value))\n .replace(/(^|\\s)(--[a-z][a-z0-9-]*)/g, (_match, prefix: string, flag: string) => {\n return `${prefix}${chalk.yellow(flag)}`;\n })\n .replace(/(https?:\\/\\/[^\\s)]+)/g, (url: string) => chalk.blueBright.underline(url))\n .replace(/^(\\s*)\\*\\s+/gm, (_match, prefix: string) => {\n return `${prefix}${chalk.magentaBright(\"-\")} `;\n });\n}\n\nexport function normalizeRenderedMarkdownOutput(output: string): string {\n return output\n .split(\"\\n\")\n .map((line) => {\n const headingMatch = line.match(/^(\\s*)#{1,6}\\s+(.+)$/);\n if (headingMatch) {\n return `${headingMatch[1]}${headingMatch[2]}`;\n }\n\n return line.replace(/^(\\s*)\\*\\s+/, \"$1- \");\n })\n .join(\"\\n\")\n .replace(/`([^`\\n]+)`/g, \"$1\");\n}\n"],"mappings":"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","names":["process","stripAnsi","process","stripAnsi"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli/help-specs.ts"],"sourcesContent":["type HelpTopic = {\n title: string;\n aliases: string[];\n body: string;\n};\n\nconst commandList = [\n \"- `cngkit login` - open Curly.ng login, or print the URL in headless shells.\",\n \"- `cngkit coderoom ...` - share or join a live developer room for a working tree.\",\n \"- `cngkit scrub [path]` - scan for secrets; rewrite only when `--yes` is passed.\",\n \"- `cngkit transcripts ...` - list, read, and grep local Claude/Codex transcripts.\",\n \"- `cngkit knowledges ...` - search and read the hosted Harness knowledge catalog.\",\n].join(\"\\n\");\n\nconst coderoomCommandList = [\n \"- `share [room-code]` - start a live room from the current directory.\",\n \"- `join <room-code>` - join another developer's live room from the current directory.\",\n].join(\"\\n\");\n\nconst knowledgesCommandList = [\n \"- `status` - print remote catalog state.\",\n \"- `audiences` - list valid audience filters.\",\n \"- `search <query>` - search over Postgres-backed knowledges records.\",\n \"- `list [query]` - list known subskills.\",\n \"- `files [query]` - list uploaded catalog files.\",\n \"- `read <file-path>` - Claude-style file read.\",\n \"- `grep <pattern>` - Claude-style content search.\",\n \"- `glob [pattern]` - Claude-style file discovery.\",\n].join(\"\\n\");\n\nconst helpTopics: HelpTopic[] = [\n {\n title: \"cngkit\",\n aliases: [\"\", \"overview\", \"help\"],\n body: `# cngkit\n\nCurly.ng operator CLI for shared code rooms, safe local cleanup, local agent transcripts, and hosted Harness knowledges.\n\n## Run Now\n\n\\`\\`\\`bash\nnpx --yes cngkit@latest --help\nnpx --yes cngkit@latest knowledges search Cloudflare --limit 3\n\\`\\`\\`\n\n## Installed Usage\n\n\\`\\`\\`bash\ncngkit <command> [options]\n\\`\\`\\`\n\n## Global Options\n\n\\`\\`\\`bash\ncngkit --format text|json|markdown ...\ncngkit --no-color ...\ncngkit --api-base-url <url> ...\n\\`\\`\\`\n\n## Commands\n\n${commandList}\n\n## Help Map\n\n\\`\\`\\`bash\ncngkit help <topic>\ncngkit <command> --help\ncngkit coderoom --help\ncngkit coderoom <subcommand> --help\ncngkit transcripts --help\ncngkit knowledges --help\ncngkit knowledges <subcommand> --help\n\\`\\`\\`\n\n## AI And Scripts\n\n- Help renders as structured terminal text by default, even in pipes.\n- Use \\`--format json\\` or \\`--json\\` on read-only data commands for typed payloads.\n- Use \\`--format markdown\\` only when raw Markdown source is intentional.\n- Use \\`--no-color\\` or \\`CNGKIT_COLOR=never\\` for logs, screenshots, and strict plain text.\n- Use \\`npm_config_progress=false npx --yes cngkit@latest ...\\` for clean one-shot npx captures.\n\n## Backend\n\nDefault API: \\`https://curly.ng\\`\n\nOverride with:\n\n\\`\\`\\`bash\ncngkit --api-base-url <url> ...\nCNGKIT_API_BASE_URL=<url> cngkit ...\n\\`\\`\\`\n`,\n },\n {\n title: \"login\",\n aliases: [\"login\"],\n body: `# cngkit login\n\nOpen Curly.ng login in a browser. In headless shells, print the URL so an agent can show it to the operator.\n\n## Usage\n\n\\`\\`\\`bash\nnpx --yes cngkit@latest login\ncngkit login\n\\`\\`\\`\n\n## Output\n\n- First line names the login URL being opened.\n- If no browser opener exists, the CLI prints a direct URL.\n- No credentials are printed or persisted by this command.\n`,\n },\n {\n title: \"transcripts\",\n aliases: [\"transcripts\", \"transcript\"],\n body: `# cngkit transcripts\n\nRead local Claude and Codex transcript JSONL files.\n\nThis is local-only operator tooling. It does not call Curly.ng and it does not upload transcript content.\n\n## Usage\n\n\\`\\`\\`bash\ncngkit transcripts list [--source all|codex|claude] [--limit <n>] [--json|--format json]\ncngkit transcripts read <path-or-session-id> [--source all|codex|claude] [--limit <n>] [--include-internal] [--json|--format json]\ncngkit transcripts grep <query> [--source all|codex|claude] [--limit <n>] [--file-limit <n>] [--include-internal] [--json|--format json]\n\\`\\`\\`\n\n## Sources\n\n- \\`~/.codex/sessions\\`\n- \\`~/.codex/archived_sessions\\`\n- \\`~/.claude/projects\\`\n- \\`~/.claude/history.jsonl\\`\n\n## Defaults\n\n- \\`list\\`: newest 12 transcript files.\n- \\`read\\`: newest 80 user/assistant entries from the selected file.\n- \\`grep\\`: first 80 matching user/assistant entries from the newest 60 files.\n- \\`--source\\`: \\`all\\`.\n\n## Output\n\n- Text mode prints source, role, timestamp when available, and extracted message text.\n- Internal developer/system payloads and hook/tool noise are skipped unless \\`--include-internal\\` is passed.\n- Direct file paths, home-relative paths, and partial session ids are accepted by \\`read\\`.\n`,\n },\n {\n title: \"coderoom\",\n aliases: [\"coderoom\", \"code-room\", \"repo-sync\"],\n body: `# cngkit coderoom\n\nCreate or join a temporary live room for sharing a working tree over the Curly backend.\n\n## Usage\n\n\\`\\`\\`bash\ncngkit coderoom <subcommand> [options]\n\\`\\`\\`\n\n## Subcommands\n\n${coderoomCommandList}\n\n## Common Flow\n\n\\`\\`\\`bash\nnpx --yes cngkit@latest coderoom share\nnpx --yes cngkit@latest coderoom join <room-code>\n\\`\\`\\`\n\n## Behavior\n\n- Connects to \\`/api/cng/sync/:roomCode\\` on the configured Curly backend.\n- Uses WebSocket transport backed by the \\`CngSyncRoom\\` Durable Object.\n- Sends an initial snapshot, then file and delete events.\n- Last received change wins.\n- Current rooms are live relays, not durable cloud storage.\n`,\n },\n {\n title: \"coderoom share\",\n aliases: [\"coderoom-share\"],\n body: `# cngkit coderoom share\n\nStart a live repository sync room from the current directory.\n\n## Usage\n\n\\`\\`\\`bash\ncngkit coderoom share [room-code]\n\\`\\`\\`\n\n## Behavior\n\n- Connects to \\`/api/cng/sync/:roomCode\\` on the configured Curly backend.\n- Uses WebSocket transport backed by the \\`CngSyncRoom\\` Durable Object.\n- Sends an initial snapshot, then file and delete events.\n- Last received change wins.\n\n## Filesystem Contract\n\n- Preserves \\`.git/\\`.\n- Preserves files ignored by the repo's \\`.gitignore\\`.\n- Sends regular files as base64 payloads in the sync protocol.\n\n## Output\n\n- Prints room code, repo root, peer id, backend health, and concise sync events.\n- Keeps running until the socket closes or the process receives a termination signal.\n`,\n },\n {\n title: \"coderoom join\",\n aliases: [\"coderoom-join\"],\n body: `# cngkit coderoom join\n\nJoin an existing live repository sync room from the current directory.\n\n## Usage\n\n\\`\\`\\`bash\ncngkit coderoom join <room-code>\n\\`\\`\\`\n\n## Behavior\n\nSame transport and filesystem contract as \\`cngkit coderoom share\\`. The supplied room code selects the Durable Object room.\n\n## Output\n\n- Prints backend health, room code, repo root, peer id, and concise sync events.\n- Missing room code exits with a usage error.\n`,\n },\n {\n title: \"scrub\",\n aliases: [\"scrub\"],\n body: `# cngkit scrub\n\nScan a file or directory for secrets with TruffleHog. Report-only is the default.\n\n## Usage\n\n\\`\\`\\`bash\ncngkit scrub [path]\ncngkit scrub [path] --yes\n\\`\\`\\`\n\n## Safety\n\n- Default mode does not rewrite files.\n- Inline masking rewrites files and requires \\`--yes\\`.\n- Raw and redacted secret values are never printed.\n\n## Requirements\n\n- \\`trufflehog\\` must be available on \\`PATH\\`.\n\n## Mask Format\n\n\\`\\`\\`text\n[CNGKIT_SECRET:<detector>:<verified|unverified>]\n\\`\\`\\`\n`,\n },\n {\n title: \"knowledges\",\n aliases: [\"knowledges\", \"knowledge\"],\n body: `# cngkit knowledges\n\nSearch and read the hosted Harness knowledges catalog from the Curly backend.\n\n## Usage\n\n\\`\\`\\`bash\ncngkit knowledges <subcommand> [options]\n\\`\\`\\`\n\n## Subcommands\n\n${knowledgesCommandList}\n\n## Progressive Help\n\n\\`\\`\\`bash\ncngkit help knowledges <subcommand>\ncngkit knowledges <subcommand> --help\ncngkit knowledges read --help\ncngkit knowledges grep --help\ncngkit knowledges glob --help\n\\`\\`\\`\n\n## Common Examples\n\n\\`\\`\\`bash\nnpx --yes cngkit@latest knowledges search Cloudflare --limit 3\nnpx --yes cngkit@latest knowledges read /libraries/lib-cloudflare/SUBSKILL.md --limit 80\nnpx --yes cngkit@latest knowledges grep Cloudflare --path /libraries/lib-cloudflare --output-mode files_with_matches\nnpx --yes cngkit@latest knowledges glob \"**/*.md\" --path /libraries/lib-cloudflare\n\\`\\`\\`\n\n## AI-Friendly Output\n\n- Default output is structured text intended to be directly usable by people and agents.\n- \\`read\\` renders Markdown files by default and prints exact source with \\`--format markdown\\`.\n- \\`grep --output-mode content\\` prints \\`path:line\\` blocks.\n- \\`grep --output-mode files_with_matches\\` and \\`glob\\` print one path per line.\n- \\`--format json\\` and \\`--json\\` print typed backend payloads for machine consumption.\n`,\n },\n {\n title: \"knowledges status\",\n aliases: [\"knowledges-status\", \"status\"],\n body: `# cngkit knowledges status\n\nPrint remote Harness catalog state.\n\n## Usage\n\n\\`\\`\\`bash\ncngkit knowledges status [--json|--format json]\n\\`\\`\\`\n\n## Output\n\n- Text mode prints catalog name, file count, blob count, database binding, and latest run when present.\n- \\`--format json\\` and \\`--json\\` print the backend data payload.\n`,\n },\n {\n title: \"knowledges audiences\",\n aliases: [\"knowledges-audiences\", \"audiences\"],\n body: `# cngkit knowledges audiences\n\nList valid audience filters for catalog browsing.\n\n## Usage\n\n\\`\\`\\`bash\ncngkit knowledges audiences [--json|--format json]\n\\`\\`\\`\n\n## Use When\n\nRun this before \\`cngkit knowledges files --audience <id>\\`.\n`,\n },\n {\n title: \"knowledges search\",\n aliases: [\"knowledges-search\", \"search\"],\n body: `# cngkit knowledges search\n\nSearch the hosted Harness index for relevant skills and subskills.\n\n## Usage\n\n\\`\\`\\`bash\ncngkit knowledges search <query> [--limit <n>] [--json|--format json]\n\\`\\`\\`\n\n## Defaults\n\n- \\`--limit\\`: \\`5\\`\n\n## Example\n\n\\`\\`\\`bash\nnpx --yes cngkit@latest knowledges search Cloudflare --limit 3\n\\`\\`\\`\n`,\n },\n {\n title: \"knowledges list\",\n aliases: [\"knowledges-list\", \"list\"],\n body: `# cngkit knowledges list\n\nList hosted Harness subskills, optionally filtered by query.\n\n## Usage\n\n\\`\\`\\`bash\ncngkit knowledges list [query] [--limit <n>] [--json|--format json]\n\\`\\`\\`\n\n## Defaults\n\n- \\`--limit\\`: \\`25\\`\n\n## Example\n\n\\`\\`\\`bash\ncngkit knowledges list cloudflare --limit 10\n\\`\\`\\`\n`,\n },\n {\n title: \"knowledges files\",\n aliases: [\"knowledges-files\", \"files\"],\n body: `# cngkit knowledges files\n\nList uploaded Harness catalog files, optionally filtered by query or audience.\n\n## Usage\n\n\\`\\`\\`bash\ncngkit knowledges files [query] [--audience <id>] [--limit <n>] [--json|--format json]\n\\`\\`\\`\n\n## Defaults\n\n- \\`--limit\\`: \\`25\\`\n- \\`--audience\\`: omitted\n\n## Example\n\n\\`\\`\\`bash\ncngkit knowledges files cloudflare --limit 10\ncngkit knowledges files \"vector search\" --audience builders\n\\`\\`\\`\n`,\n },\n {\n title: \"knowledges read\",\n aliases: [\"knowledges-read\", \"read\"],\n body: `# cngkit knowledges read\n\nRead a hosted Harness catalog file by path.\n\n## Usage\n\n\\`\\`\\`bash\ncngkit knowledges read <file-path> [--offset <n>] [--limit <n>] [--json|--format json|--format markdown]\n\\`\\`\\`\n\n## Inputs\n\n- \\`file-path\\`: normalized catalog path. Shorthand paths such as \\`/libraries/lib-cloudflare/SUBSKILL.md\\` are expanded to \\`skills/knowledges/subskills/libraries/lib-cloudflare/SUBSKILL.md\\`.\n- \\`--offset\\`: zero-based starting line. Default: \\`0\\`.\n- \\`--limit\\`: maximum lines. Default in CLI: \\`200\\`. Backend max: \\`2000\\`.\n\n## Output\n\n- Text mode renders Markdown files for terminal reading.\n- \\`--format markdown\\` prints the exact returned file content.\n- If truncated, a final bracketed truncation note is printed after the content.\n- \\`--format json\\` and \\`--json\\` print \\`{ file_path, content, total_lines, offset, limit, truncated }\\`.\n\n## Example\n\n\\`\\`\\`bash\nnpx --yes cngkit@latest knowledges read /libraries/lib-cloudflare/SUBSKILL.md --limit 80\n\\`\\`\\`\n`,\n },\n {\n title: \"knowledges grep\",\n aliases: [\"knowledges-grep\", \"grep\"],\n body: `# cngkit knowledges grep\n\nSearch inside hosted Harness catalog files with a JavaScript regular expression.\n\n## Usage\n\n\\`\\`\\`bash\ncngkit knowledges grep <pattern> [--path <path>] [--include <glob>] [--output-mode <mode>] [--context <n>] [--case-insensitive] [--json|--format json]\n\\`\\`\\`\n\n## Inputs\n\n- \\`pattern\\`: JavaScript regular expression source.\n- \\`--path\\`: catalog path prefix. Default: \\`skills\\`.\n- \\`--include\\`: filename include filter. Default: \\`*\\`.\n- Modes: content, files_with_matches, or count.\n- \\`--output-mode\\`: \\`content\\`, \\`files_with_matches\\`, or \\`count\\`. Default: \\`content\\`.\n- \\`--context\\`: context lines around content matches. Default: \\`0\\`. Backend max: \\`20\\`.\n- \\`--case-insensitive\\`: maps to backend \\`case_insensitive=true\\`.\n\n## Output\n\n- \\`content\\`: prints blocks as \\`file_path:line_number\\`, optional context lines, then \\`> matching line\\`.\n- \\`files_with_matches\\`: prints one matching file path per line.\n- \\`count\\`: prints \\`file_path: match_count\\` lines.\n- \\`--format json\\` and \\`--json\\` print the typed backend response union.\n\n## Examples\n\n\\`\\`\\`bash\nnpx --yes cngkit@latest knowledges grep Cloudflare --path /libraries/lib-cloudflare --output-mode files_with_matches\nnpx --yes cngkit@latest knowledges grep \"Postgres|Hyperdrive\" --path /libraries/lib-cloudflare --context 2\n\\`\\`\\`\n`,\n },\n {\n title: \"knowledges glob\",\n aliases: [\"knowledges-glob\", \"glob\"],\n body: `# cngkit knowledges glob\n\nFind hosted Harness catalog files by glob pattern.\n\n## Usage\n\n\\`\\`\\`bash\ncngkit knowledges glob [pattern] [--path <path>] [--json|--format json]\n\\`\\`\\`\n\n## Inputs\n\n- \\`pattern\\`: supported glob pattern. CLI default: \\`**/*.md\\`.\n- \\`--path\\`: catalog path prefix. Default: \\`skills\\`.\n\n## Supported Patterns\n\n- \\`**/*.md\\`\n- \\`**/*.SUBSKILL.md\\`\n- \\`**/SKILL.md\\`\n- \\`*.md\\`\n- \\`*.SUBSKILL.md\\`\n- \\`SKILL.md\\`\n\n## Output\n\n- Text mode prints one file path per line.\n- If truncated, a final bracketed truncation note is printed.\n- \\`--format json\\` and \\`--json\\` print \\`{ files, total_files, truncated }\\`.\n\n## Example\n\n\\`\\`\\`bash\nnpx --yes cngkit@latest knowledges glob \"**/*.md\" --path /libraries/lib-cloudflare\n\\`\\`\\`\n`,\n },\n];\n\nconst helpTopicNames = helpTopics\n .filter((topic) => topic.title !== \"cngkit\")\n .map((topic) => topic.title)\n .sort();\n\nconst helpTopicByAlias = new Map<string, HelpTopic>();\n\nfor (const topic of helpTopics) {\n for (const alias of topic.aliases) {\n helpTopicByAlias.set(alias, topic);\n }\n}\n\nexport function formatCngkitHelp(topicName?: string): string {\n const normalizedTopicName = normalizeHelpTopicName(topicName);\n const topic = helpTopicByAlias.get(normalizedTopicName);\n\n if (topic) {\n return topic.body.trim();\n }\n\n if (normalizedTopicName === \"\") {\n return helpTopicByAlias.get(\"\")?.body.trim() ?? \"\";\n }\n\n return formatUnknownHelpTopic(normalizedTopicName);\n}\n\nexport function formatKnowledgesHelp(topicName?: string): string {\n const normalizedTopicName = normalizeHelpTopicName(topicName);\n const topicKey = normalizedTopicName ? `knowledges-${normalizedTopicName}` : \"knowledges\";\n return formatCngkitHelp(topicKey);\n}\n\nfunction normalizeHelpTopicName(value: string | undefined): string {\n return value?.trim().toLowerCase().replace(/\\s+/g, \"-\") ?? \"\";\n}\n\nfunction formatUnknownHelpTopic(topicName: string): string {\n return `# cngkit help\n\nNo help topic named \\`${topicName}\\`.\n\n## Available Topics\n\n${helpTopicNames.map((name) => `- \\`${name}\\``).join(\"\\n\")}\n\n## Usage\n\n\\`\\`\\`bash\ncngkit help <topic>\ncngkit <command> --help\n\\`\\`\\``;\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli/options.ts"],"sourcesContent":["import { argument, option } from \"pastel\";\nimport { z } from \"zod\";\n\nexport const GlobalOptionsSchema = z.object({\n apiBaseUrl: z\n .string()\n .optional()\n .describe(\n option({\n description: \"Curly API base URL. Default: CNGKIT_API_BASE_URL or https://curly.ng\",\n valueDescription: \"url\",\n })\n ),\n});\n\nexport const JsonOutputOptionsSchema = GlobalOptionsSchema.extend({\n json: z\n .boolean()\n .optional()\n .describe(\n option({\n description: \"Print raw JSON\",\n })\n ),\n});\n\nexport const OptionalPathArgsSchema = z.tuple([\n z\n .string()\n .optional()\n .describe(\n argument({\n name: \"path\",\n description: \"Path to scan\",\n })\n ),\n]);\n\nexport const OptionalRoomCodeArgsSchema = z.tuple([\n z\n .string()\n .optional()\n .describe(\n argument({\n name: \"room-code\",\n description: \"Room code\",\n })\n ),\n]);\n\nexport const RequiredRoomCodeArgsSchema = z.tuple([\n z.string().describe(\n argument({\n name: \"room-code\",\n description: \"Room code\",\n })\n ),\n]);\n\nexport const OptionalQueryArgsSchema = z.tuple([\n z\n .string()\n .optional()\n .describe(\n argument({\n name: \"query\",\n description: \"Optional query\",\n })\n ),\n]);\n\nexport const RequiredQueryArgsSchema = z.array(\n z.string().describe(\n argument({\n name: \"query\",\n description: \"Search query\",\n })\n )\n);\n\nexport const RequiredFilePathArgsSchema = z.tuple([\n z.string().describe(\n argument({\n name: \"file-path\",\n description: \"Catalog file path\",\n })\n ),\n]);\n\nexport const RequiredPatternArgsSchema = z.array(\n z.string().describe(\n argument({\n name: \"pattern\",\n description: \"Search pattern\",\n })\n )\n);\n\nexport const OptionalGlobPatternArgsSchema = z.array(\n z.string().describe(\n argument({\n name: \"pattern\",\n description: \"Glob pattern\",\n })\n )\n);\n\nexport const LimitOptionsSchema = JsonOutputOptionsSchema.extend({\n limit: z\n .number()\n .optional()\n .describe(\n option({\n description: \"Maximum results\",\n valueDescription: \"n\",\n })\n ),\n});\n\nexport const TranscriptArgsSchema = z.array(\n z.string().describe(\n argument({\n name: \"transcript-args\",\n description: \"Transcript action and arguments\",\n })\n )\n);\n"],"mappings":";AAAA,SAAS,UAAU,cAAc;AACjC,SAAS,SAAS;AAEX,IAAM,sBAAsB,EAAE,OAAO;AAAA,EAC1C,YAAY,EACT,OAAO,EACP,SAAS,EACT;AAAA,IACC,OAAO;AAAA,MACL,aAAa;AAAA,MACb,kBAAkB;AAAA,IACpB,CAAC;AAAA,EACH;AACJ,CAAC;AAEM,IAAM,0BAA0B,oBAAoB,OAAO;AAAA,EAChE,MAAM,EACH,QAAQ,EACR,SAAS,EACT;AAAA,IACC,OAAO;AAAA,MACL,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AACJ,CAAC;AAEM,IAAM,yBAAyB,EAAE,MAAM;AAAA,EAC5C,EACG,OAAO,EACP,SAAS,EACT;AAAA,IACC,SAAS;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AACJ,CAAC;AAEM,IAAM,6BAA6B,EAAE,MAAM;AAAA,EAChD,EACG,OAAO,EACP,SAAS,EACT;AAAA,IACC,SAAS;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AACJ,CAAC;AAEM,IAAM,6BAA6B,EAAE,MAAM;AAAA,EAChD,EAAE,OAAO,EAAE;AAAA,IACT,SAAS;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AACF,CAAC;AAEM,IAAM,0BAA0B,EAAE,MAAM;AAAA,EAC7C,EACG,OAAO,EACP,SAAS,EACT;AAAA,IACC,SAAS;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AACJ,CAAC;AAEM,IAAM,0BAA0B,EAAE;AAAA,EACvC,EAAE,OAAO,EAAE;AAAA,IACT,SAAS;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AACF;AAEO,IAAM,6BAA6B,EAAE,MAAM;AAAA,EAChD,EAAE,OAAO,EAAE;AAAA,IACT,SAAS;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AACF,CAAC;AAEM,IAAM,4BAA4B,EAAE;AAAA,EACzC,EAAE,OAAO,EAAE;AAAA,IACT,SAAS;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AACF;AAEO,IAAM,gCAAgC,EAAE;AAAA,EAC7C,EAAE,OAAO,EAAE;AAAA,IACT,SAAS;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AACF;AAEO,IAAM,qBAAqB,wBAAwB,OAAO;AAAA,EAC/D,OAAO,EACJ,OAAO,EACP,SAAS,EACT;AAAA,IACC,OAAO;AAAA,MACL,aAAa;AAAA,MACb,kBAAkB;AAAA,IACpB,CAAC;AAAA,EACH;AACJ,CAAC;AAEM,IAAM,uBAAuB,EAAE;AAAA,EACpC,EAAE,OAAO,EAAE;AAAA,IACT,SAAS;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AACF;","names":[]}