cngkit 1.1.19 → 1.1.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +9 -9
  3. package/dist/{chunk-TYDIBWZV.js → chunk-CIZBVLN5.js} +2 -2
  4. package/dist/{chunk-GBONV6XP.js → chunk-E2GLGGKO.js} +3 -3
  5. package/dist/chunk-MRXGD6TC.js +42 -0
  6. package/dist/chunk-MRXGD6TC.js.map +1 -0
  7. package/dist/{chunk-L6ZVQRSY.js → chunk-NODJM6SH.js} +141 -52
  8. package/dist/chunk-NODJM6SH.js.map +1 -0
  9. package/dist/{chunk-3A6GRNEV.js → chunk-SKK2XLRZ.js} +21 -21
  10. package/dist/chunk-SKK2XLRZ.js.map +1 -0
  11. package/dist/{chunk-DBA3BZXP.js → chunk-SMTQ3W3F.js} +50 -10
  12. package/dist/chunk-SMTQ3W3F.js.map +1 -0
  13. package/dist/{chunk-7SO75QXJ.js → chunk-WDI43VPW.js} +108 -88
  14. package/dist/chunk-WDI43VPW.js.map +1 -0
  15. package/dist/cli.js +63 -24
  16. package/dist/cli.js.map +1 -1
  17. package/dist/commands/coderoom/index.js +3 -3
  18. package/dist/commands/coderoom/join.js +4 -4
  19. package/dist/commands/coderoom/share.js +4 -4
  20. package/dist/commands/hookify/index.js +3 -3
  21. package/dist/commands/hookify/ingest.js +3 -3
  22. package/dist/commands/hooks/index.js +3 -3
  23. package/dist/commands/hooks/install.js +3 -3
  24. package/dist/commands/hooks/uninstall.js +3 -3
  25. package/dist/commands/index.js +3 -3
  26. package/dist/commands/knowledges/audiences.js +5 -5
  27. package/dist/commands/knowledges/cat.js +5 -5
  28. package/dist/commands/knowledges/files.js +5 -5
  29. package/dist/commands/knowledges/find.js +5 -5
  30. package/dist/commands/knowledges/glob.js +5 -5
  31. package/dist/commands/knowledges/grep.js +5 -5
  32. package/dist/commands/knowledges/head.js +5 -5
  33. package/dist/commands/knowledges/index.js +3 -3
  34. package/dist/commands/knowledges/list.js +5 -5
  35. package/dist/commands/knowledges/ls.js +5 -5
  36. package/dist/commands/knowledges/read.js +5 -5
  37. package/dist/commands/knowledges/realpath.js +6 -6
  38. package/dist/commands/knowledges/realpath.js.map +1 -1
  39. package/dist/commands/knowledges/search.js +5 -5
  40. package/dist/commands/knowledges/stat.js +5 -5
  41. package/dist/commands/knowledges/status.js +5 -5
  42. package/dist/commands/knowledges/tail.js +5 -5
  43. package/dist/commands/knowledges/tree.js +5 -5
  44. package/dist/commands/login.js +3 -3
  45. package/dist/commands/login.js.map +1 -1
  46. package/dist/commands/scrub.js +37 -14
  47. package/dist/commands/scrub.js.map +1 -1
  48. package/dist/commands/transcripts.js +41 -21
  49. package/dist/commands/transcripts.js.map +1 -1
  50. package/package.json +2 -3
  51. package/dist/chunk-3A6GRNEV.js.map +0 -1
  52. package/dist/chunk-7SO75QXJ.js.map +0 -1
  53. package/dist/chunk-DBA3BZXP.js.map +0 -1
  54. package/dist/chunk-L6ZVQRSY.js.map +0 -1
  55. package/dist/chunk-X4E7NAN4.js +0 -26
  56. package/dist/chunk-X4E7NAN4.js.map +0 -1
  57. /package/dist/{chunk-TYDIBWZV.js.map → chunk-CIZBVLN5.js.map} +0 -0
  58. /package/dist/{chunk-GBONV6XP.js.map → chunk-E2GLGGKO.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/features/hooks/run-hooks-install-command.ts"],"sourcesContent":["import fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { z } from \"zod\";\n\nimport type { CommandOutput } from \"../../shared/output.js\";\n\nexport const hookToolIds = [\"all\", \"claude\", \"codex\"] as const;\n\nexport type HookToolId = (typeof hookToolIds)[number];\n\nexport type HooksInstallCommandOptions = {\n readonly dryRun?: boolean;\n readonly tool?: HookToolId;\n};\n\nexport type HooksUninstallCommandOptions = {\n readonly dryRun?: boolean;\n readonly tool?: HookToolId;\n};\n\ntype InstallTarget = {\n readonly tool: Exclude<HookToolId, \"all\">;\n readonly label: string;\n readonly configPath: string;\n readonly events: readonly string[];\n readonly statusMessages: boolean;\n};\n\nconst cngkitHookCommandPrefix = \"cngkit hookify ingest --event \";\nconst legacyCngkitHookCommandPrefixes = [\n \"npx --yes cngkit@latest hookify ingest --event \",\n \"npm exec cngkit@latest hookify ingest --event \",\n \"npm exec --yes cngkit@latest hookify ingest --event \",\n] as const;\n\nconst HookHandlerSchema = z\n .object({\n command: z.string().optional(),\n })\n .passthrough();\n\nconst HookGroupSchema = z\n .object({\n hooks: z.array(HookHandlerSchema).optional(),\n })\n .passthrough();\n\nconst HooksConfigSchema = z.record(z.string(), z.array(HookGroupSchema));\n\nconst AgentSettingsDocumentSchema = z\n .object({\n hooks: HooksConfigSchema.optional(),\n })\n .passthrough();\n\ntype HookHandler = z.infer<typeof HookHandlerSchema>;\ntype HookGroup = z.infer<typeof HookGroupSchema>;\ntype HookConfig = z.infer<typeof HooksConfigSchema>;\ntype AgentSettingsDocument = z.infer<typeof AgentSettingsDocumentSchema>;\n\nconst claudeHookEvents = [\n \"SessionStart\",\n \"Setup\",\n \"InstructionsLoaded\",\n \"UserPromptSubmit\",\n \"UserPromptExpansion\",\n \"MessageDisplay\",\n \"PreToolUse\",\n \"PermissionRequest\",\n \"PermissionDenied\",\n \"PostToolUse\",\n \"PostToolUseFailure\",\n \"PostToolBatch\",\n \"Notification\",\n \"SubagentStart\",\n \"SubagentStop\",\n \"TaskCreated\",\n \"TaskCompleted\",\n \"Stop\",\n \"StopFailure\",\n \"TeammateIdle\",\n \"ConfigChange\",\n \"CwdChanged\",\n \"FileChanged\",\n \"WorktreeCreate\",\n \"WorktreeRemove\",\n \"PreCompact\",\n \"PostCompact\",\n \"SessionEnd\",\n \"Elicitation\",\n \"ElicitationResult\",\n] as const;\n\nconst codexHookEvents = [\n \"SessionStart\",\n \"SubagentStart\",\n \"PreToolUse\",\n \"PermissionRequest\",\n \"PostToolUse\",\n \"PreCompact\",\n \"PostCompact\",\n \"UserPromptSubmit\",\n \"SubagentStop\",\n \"Stop\",\n] as const;\n\nexport async function runHooksInstallCommand(\n options: HooksInstallCommandOptions,\n output: CommandOutput\n): Promise<void> {\n const targets = resolveInstallTargets(options.tool ?? \"all\");\n const results: string[] = [];\n\n for (const target of targets) {\n const result = await installHooksForTarget(target, options.dryRun === true);\n results.push(result);\n }\n\n for (const result of results) {\n output.success(result);\n }\n}\n\nexport async function runHooksUninstallCommand(\n options: HooksUninstallCommandOptions,\n output: CommandOutput\n): Promise<void> {\n const targets = resolveInstallTargets(options.tool ?? \"all\");\n const results: string[] = [];\n\n for (const target of targets) {\n const result = await uninstallHooksForTarget(target, options.dryRun === true);\n results.push(result);\n }\n\n for (const result of results) {\n output.success(result);\n }\n}\n\nfunction resolveInstallTargets(tool: HookToolId): InstallTarget[] {\n const homeDirectory = os.homedir();\n const targets: InstallTarget[] = [\n {\n tool: \"claude\",\n label: \"Claude Code\",\n configPath: path.join(homeDirectory, \".claude\", \"settings.json\"),\n events: claudeHookEvents,\n statusMessages: false,\n },\n {\n tool: \"codex\",\n label: \"Codex\",\n configPath: path.join(homeDirectory, \".codex\", \"hooks.json\"),\n events: codexHookEvents,\n statusMessages: true,\n },\n ];\n\n if (tool === \"all\") {\n return targets;\n }\n\n return targets.filter((target) => target.tool === tool);\n}\n\nasync function installHooksForTarget(target: InstallTarget, dryRun: boolean): Promise<string> {\n const document = await readJsonDocument(target.configPath);\n const hooks = parseHookConfig(document.hooks);\n let replacedHandlers = 0;\n\n for (const eventName of target.events) {\n const result = installHookEvent(hooks[eventName], eventName, target.statusMessages);\n hooks[eventName] = result.groups;\n replacedHandlers += result.removedHandlers;\n }\n\n document.hooks = hooks;\n\n if (!dryRun) {\n await fs.mkdir(path.dirname(target.configPath), { recursive: true });\n await fs.writeFile(target.configPath, `${JSON.stringify(document, null, 2)}\\n`);\n }\n\n const action = dryRun ? \"Would install\" : \"Installed\";\n return `${action} ${target.events.length} ${target.label} hook events in ${target.configPath}; replaced ${replacedHandlers} existing cngkit handlers; events: ${target.events.join(\", \")}`;\n}\n\nasync function uninstallHooksForTarget(target: InstallTarget, dryRun: boolean): Promise<string> {\n const document = await readJsonDocument(target.configPath);\n const hooks = parseHookConfig(document.hooks);\n const removedEvents: string[] = [];\n let removedHandlers = 0;\n\n for (const [eventName, groups] of Object.entries(hooks)) {\n const result = uninstallHookEvent(groups);\n if (result.removedHandlers > 0) {\n removedEvents.push(eventName);\n removedHandlers += result.removedHandlers;\n }\n hooks[eventName] = result.groups;\n }\n\n document.hooks = Object.fromEntries(Object.entries(hooks).filter(([, groups]) => groups.length > 0));\n\n if (!dryRun) {\n await fs.mkdir(path.dirname(target.configPath), { recursive: true });\n await fs.writeFile(target.configPath, `${JSON.stringify(document, null, 2)}\\n`);\n }\n\n const action = dryRun ? \"Would remove\" : \"Removed\";\n const eventSummary = removedEvents.length > 0 ? removedEvents.join(\", \") : \"none\";\n return `${action} ${removedHandlers} cngkit ${target.label} hook handlers from ${target.configPath}: ${eventSummary}`;\n}\n\nasync function readJsonDocument(filePath: string): Promise<AgentSettingsDocument> {\n if (!(await fileExists(filePath))) {\n return {};\n }\n\n const content = await fs.readFile(filePath, \"utf8\");\n return AgentSettingsDocumentSchema.parse(JSON.parse(content));\n}\n\nasync function fileExists(filePath: string): Promise<boolean> {\n return fs.access(filePath).then(\n () => true,\n () => false\n );\n}\n\nfunction installHookEvent(\n existingGroups: HookGroup[] | undefined,\n eventName: string,\n withStatusMessage: boolean\n): {\n readonly groups: HookGroup[];\n readonly removedHandlers: number;\n} {\n const result = uninstallHookEvent(existingGroups ?? []);\n\n return {\n groups: [\n ...result.groups,\n {\n hooks: [createCngkitHookHandler(eventName, withStatusMessage)],\n },\n ],\n removedHandlers: result.removedHandlers,\n };\n}\n\nfunction uninstallHookEvent(groups: HookGroup[] | undefined): {\n readonly groups: HookGroup[];\n readonly removedHandlers: number;\n} {\n let removedHandlers = 0;\n const cleanedGroups = parseHookGroups(groups)\n .map((group) => {\n if (group.hooks === undefined) {\n return group;\n }\n\n const hooks = group.hooks.filter((handler) => {\n const keep = !isCngkitHookHandler(handler);\n if (!keep) {\n removedHandlers += 1;\n }\n return keep;\n });\n\n return { ...group, hooks };\n })\n .filter((group) => {\n return group.hooks === undefined || group.hooks.length > 0;\n });\n\n return { groups: cleanedGroups, removedHandlers };\n}\n\nfunction parseHookConfig(value: AgentSettingsDocument[\"hooks\"]): HookConfig {\n return HooksConfigSchema.catch({}).parse(value);\n}\n\nfunction parseHookGroups(value: HookGroup[] | undefined): HookGroup[] {\n return z\n .array(HookGroupSchema)\n .catch([])\n .parse(value ?? []);\n}\n\nfunction isCngkitHookHandler(handler: HookHandler): boolean {\n const command = handler.command?.trimStart();\n if (command === undefined) {\n return false;\n }\n\n return [cngkitHookCommandPrefix, ...legacyCngkitHookCommandPrefixes].some((prefix) =>\n command.startsWith(prefix)\n );\n}\n\nfunction createCngkitHookHandler(eventName: string, withStatusMessage: boolean): HookHandler {\n const handler: HookHandler = {\n type: \"command\",\n command: `${cngkitHookCommandPrefix}${eventName}`,\n };\n\n if (!withStatusMessage) {\n return handler;\n }\n\n return {\n ...handler,\n statusMessage: `Forwarding ${eventName} hook to cngkit`,\n };\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/features/knowledges/knowledges-api.ts","../src/features/knowledges/knowledges-input.ts","../src/features/knowledges/run-knowledges-command.ts"],"sourcesContent":["import type { CngApi } from \"@cng/client\";\n\nimport { createCngApiClient } from \"../../shared/api-client.js\";\nimport type { GlobalCommandOptions } from \"../../shared/config.js\";\n\nexport type KnowCommandDependencies = {\n api?: KnowledgesApi;\n};\n\nexport type KnowledgesApi = {\n getCatalog(): Promise<CngApi.HarnessCatalogSummaryApiResponse>;\n listAudiences(): Promise<CngApi.HarnessAudiencesApiResponse>;\n search(query: string, limit: number): Promise<CngApi.HarnessSemanticSearchApiResponse>;\n listTopics(): Promise<CngApi.HarnessTopicsApiResponse>;\n listFiles(options: {\n query?: string;\n audience?: CngApi.HarnessAudienceId;\n limit: number;\n }): Promise<CngApi.HarnessTopicAssetsApiResponse>;\n read(options: {\n filePath: string;\n offset?: number;\n limit: number;\n }): Promise<CngApi.HarnessReadApiResponse>;\n grep(options: {\n pattern: string;\n path: string;\n include: string;\n mode: CngApi.HarnessGrepOutputMode;\n context: number;\n ignoreCase: boolean;\n }): Promise<CngApi.HarnessGrepApiResponse>;\n glob(options: { pattern: string; path: string }): Promise<CngApi.HarnessGlobApiResponse>;\n listDirectory(options: {\n path: string;\n limit: number;\n }): Promise<CngApi.HarnessFilesystemLsApiResponse>;\n tree(options: {\n path: string;\n depth: number;\n limit: number;\n }): Promise<CngApi.HarnessFilesystemTreeApiResponse>;\n find(options: {\n path: string;\n name?: string;\n type?: CngApi.HarnessFilesystemFindType;\n maxDepth?: number;\n limit: number;\n }): Promise<CngApi.HarnessFilesystemFindApiResponse>;\n tail(options: {\n filePath: string;\n lines: number;\n }): Promise<CngApi.HarnessFilesystemTailApiResponse>;\n statPath(options: { path: string }): Promise<CngApi.HarnessFilesystemStatApiResponse>;\n};\n\nexport function createKnowledgesApi(options: GlobalCommandOptions): KnowledgesApi {\n const client = createCngApiClient(options);\n\n return {\n getCatalog: () => client.harnessKnowledges.getHarnessKnowledgesCatalog(),\n listAudiences: () => client.harnessKnowledges.listHarnessKnowledgesAudiences(),\n search: (query, limit) =>\n client.harnessKnowledges.searchHarnessKnowledges({\n q: query,\n limit,\n }),\n listTopics: () => client.harnessKnowledges.listHarnessKnowledgesTopics(),\n listFiles: ({ query, audience, limit }) =>\n client.harnessKnowledges.listHarnessTopicAssets({\n ...(query ? { q: query } : {}),\n ...(audience ? { audience } : {}),\n limit,\n }),\n read: ({ filePath, offset, limit }) =>\n client.harnessFilesystem.getHarnessFilesystemRead({\n file_path: filePath,\n offset,\n limit,\n }),\n grep: ({ pattern, path, include, mode, context, ignoreCase }) =>\n client.harnessFilesystem.getHarnessFilesystemGrep({\n pattern,\n path,\n include,\n output_mode: mode,\n context,\n case_insensitive: ignoreCase ? \"true\" : undefined,\n }),\n glob: ({ pattern, path }) =>\n client.harnessFilesystem.getHarnessFilesystemGlob({\n pattern,\n path,\n }),\n listDirectory: ({ path, limit }) =>\n client.harnessFilesystem.getHarnessFilesystemLs({\n path,\n limit,\n }),\n tree: ({ path, depth, limit }) =>\n client.harnessFilesystem.getHarnessFilesystemTree({\n path,\n depth,\n limit,\n }),\n find: ({ path, name, type, maxDepth, limit }) =>\n client.harnessFilesystem.getHarnessFilesystemFind({\n path,\n ...(name ? { name } : {}),\n ...(type ? { type } : {}),\n ...(maxDepth !== undefined ? { max_depth: maxDepth } : {}),\n limit,\n }),\n tail: ({ filePath, lines }) =>\n client.harnessFilesystem.getHarnessFilesystemTail({\n file_path: filePath,\n lines,\n }),\n statPath: ({ path }) =>\n client.harnessFilesystem.getHarnessFilesystemStat({\n path,\n }),\n };\n}\n","import type { CngApi } from \"@cng/client\";\n\nexport function normalizeAudienceId(value: string | undefined): CngApi.HarnessAudienceId | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n switch (value) {\n case \"all\":\n case \"operators\":\n case \"builders\":\n case \"researchers\":\n case \"agent-makers\":\n return value;\n default:\n throw new Error(\n `Unknown audience \"${value}\". Run cngkit knowledges audiences to see supported values.`\n );\n }\n}\n\nexport function normalizeCatalogPath(value: string): string {\n const trimmed = value.trim();\n if (trimmed === \"/\" || trimmed === \"\") {\n return \"skills\";\n }\n\n const relativePath = trimmed.replace(/^\\/+/, \"\");\n if (relativePath.startsWith(\"skills/knowledges/\")) {\n return relativePath;\n }\n\n const [firstSegment, ...restSegments] = relativePath.split(\"/\");\n if (!firstSegment) {\n return relativePath;\n }\n\n switch (firstSegment) {\n case \"concepts\":\n case \"domains\":\n case \"formats\":\n case \"languages\":\n case \"libraries\":\n case \"patterns\":\n case \"platforms\":\n case \"procedures\":\n case \"protocols\":\n case \"tools\":\n return `skills/knowledges/topics/${firstSegment}${restSegments.length > 0 ? `/${restSegments.join(\"/\")}` : \"\"}`;\n default:\n return relativePath;\n }\n}\n\nexport function normalizeFilesystemCatalogPath(value: string): string {\n const trimmed = value.trim();\n if (trimmed === \"/\" || trimmed === \"\") {\n return \"skills/knowledges/topics\";\n }\n\n return normalizeCatalogPath(trimmed);\n}\n\nexport function normalizeGrepMode(value: string | undefined): CngApi.HarnessGrepOutputMode {\n if (value === undefined) {\n return \"content\";\n }\n\n switch (value) {\n case \"content\":\n case \"files_with_matches\":\n case \"count\":\n return value;\n default:\n throw new Error(\"Unknown grep mode. Use one of: content, files_with_matches, count.\");\n }\n}\n","import { renderKnowledgesHelp } from \"../../cli/help-specs.js\";\nimport type { CngApi } from \"@cng/client\";\nimport {\n coerceLimit,\n coerceOptionalNumber,\n formatJson,\n optionalJoinedArgument,\n shouldPrintJson,\n singleLine,\n type JsonOutputOptions,\n type NumberOption,\n} from \"../../shared/command-utils.js\";\nimport { resolveOutputFormat } from \"../../shared/config.js\";\nimport type { GlobalCommandOptions } from \"../../shared/config.js\";\nimport type { CommandOutput } from \"../../shared/output.js\";\nimport { createKnowledgesApi, type KnowCommandDependencies } from \"./knowledges-api.js\";\nimport {\n normalizeAudienceId,\n normalizeCatalogPath,\n normalizeFilesystemCatalogPath,\n normalizeGrepMode,\n} from \"./knowledges-input.js\";\n\nexport type KnowStatusCommandOptions = GlobalCommandOptions & JsonOutputOptions;\n\nexport type KnowAudiencesCommandOptions = GlobalCommandOptions & JsonOutputOptions;\n\nexport type KnowSearchCommandOptions = GlobalCommandOptions &\n JsonOutputOptions & {\n limit?: NumberOption;\n };\n\nexport type KnowListCommandOptions = GlobalCommandOptions &\n JsonOutputOptions & {\n limit?: NumberOption;\n };\n\nexport type KnowFilesCommandOptions = GlobalCommandOptions &\n JsonOutputOptions & {\n audience?: string;\n limit?: NumberOption;\n };\n\nexport type KnowReadCommandOptions = GlobalCommandOptions &\n JsonOutputOptions & {\n offset?: NumberOption;\n limit?: NumberOption;\n };\n\nexport type KnowCatCommandOptions = GlobalCommandOptions & JsonOutputOptions;\n\nexport type KnowHeadCommandOptions = GlobalCommandOptions &\n JsonOutputOptions & {\n lines?: NumberOption;\n };\n\nexport type KnowTailCommandOptions = GlobalCommandOptions &\n JsonOutputOptions & {\n lines?: NumberOption;\n };\n\nexport type KnowGrepCommandOptions = GlobalCommandOptions &\n JsonOutputOptions & {\n path?: string;\n include?: string;\n outputMode?: string;\n context?: NumberOption;\n caseInsensitive?: boolean;\n limit?: NumberOption;\n };\n\nexport type KnowGlobCommandOptions = GlobalCommandOptions &\n JsonOutputOptions & {\n path?: string;\n limit?: NumberOption;\n };\n\nexport type KnowLsCommandOptions = GlobalCommandOptions &\n JsonOutputOptions & {\n limit?: NumberOption;\n long?: boolean;\n };\n\nexport type KnowTreeCommandOptions = GlobalCommandOptions &\n JsonOutputOptions & {\n depth?: NumberOption;\n limit?: NumberOption;\n };\n\nexport type KnowFindCommandOptions = GlobalCommandOptions &\n JsonOutputOptions & {\n name?: string;\n type?: \"file\" | \"directory\";\n maxDepth?: NumberOption;\n limit?: NumberOption;\n };\n\nexport type KnowStatCommandOptions = GlobalCommandOptions & JsonOutputOptions;\n\nexport type KnowRealpathCommandOptions = GlobalCommandOptions & JsonOutputOptions;\n\nexport type KnowledgesCliOptions = KnowFilesCommandOptions &\n KnowGlobCommandOptions &\n KnowGrepCommandOptions &\n KnowCatCommandOptions &\n KnowHeadCommandOptions &\n KnowTailCommandOptions &\n KnowReadCommandOptions &\n KnowSearchCommandOptions &\n KnowLsCommandOptions &\n KnowTreeCommandOptions &\n KnowFindCommandOptions;\n\nexport async function runKnowledgesCommand(\n args: string[] | undefined,\n options: KnowledgesCliOptions,\n output: CommandOutput,\n dependencies?: KnowCommandDependencies\n): Promise<void> {\n const [subcommand, ...subcommandArgs] = args ?? [];\n\n if (subcommand === undefined || subcommand === \"help\") {\n output.component(renderKnowledgesHelp(subcommandArgs[0]));\n return;\n }\n\n switch (subcommand) {\n case \"status\":\n return runKnowStatusCommand(options, output, dependencies);\n case \"audiences\":\n return runKnowAudiencesCommand(options, output, dependencies);\n case \"search\":\n return runKnowSearchCommand(\n optionalJoinedArgument(subcommandArgs),\n options,\n output,\n dependencies\n );\n case \"list\":\n return runKnowListCommand(\n optionalJoinedArgument(subcommandArgs),\n options,\n output,\n dependencies\n );\n case \"files\":\n return runKnowFilesCommand(\n optionalJoinedArgument(subcommandArgs),\n options,\n output,\n dependencies\n );\n case \"read\":\n return runKnowReadCommand(subcommandArgs[0], options, output, dependencies);\n case \"cat\":\n return runKnowCatCommand(subcommandArgs[0], options, output, dependencies);\n case \"head\":\n return runKnowHeadCommand(subcommandArgs[0], options, output, dependencies);\n case \"tail\":\n return runKnowTailCommand(subcommandArgs[0], options, output, dependencies);\n case \"grep\":\n return runKnowGrepCommand(\n optionalJoinedArgument(subcommandArgs),\n options,\n output,\n dependencies\n );\n case \"glob\":\n return runKnowGlobCommand(\n optionalJoinedArgument(subcommandArgs),\n options,\n output,\n dependencies\n );\n case \"ls\":\n return runKnowLsCommand(subcommandArgs[0], options, output, dependencies);\n case \"tree\":\n return runKnowTreeCommand(subcommandArgs[0], options, output, dependencies);\n case \"find\":\n return runKnowFindCommand(subcommandArgs[0], options, output, dependencies);\n case \"stat\":\n return runKnowStatCommand(subcommandArgs[0], options, output, dependencies);\n case \"realpath\":\n return runKnowRealpathCommand(subcommandArgs[0], options, output);\n default:\n throw new Error(\n \"Missing knowledges command. Usage: cngkit knowledges <status|audiences|search|list|files|read|cat|head|tail|grep|glob|ls|tree|find|stat|realpath>\"\n );\n }\n}\n\nexport async function runKnowStatusCommand(\n options: KnowStatusCommandOptions,\n output: CommandOutput,\n dependencies?: KnowCommandDependencies\n): Promise<void> {\n const api = dependencies?.api ?? createKnowledgesApi(options);\n const response = await api.getCatalog();\n\n if (shouldPrintJson(options)) {\n output.raw(formatJson(response.data));\n return;\n }\n\n const lines = [\n `Catalog: ${response.data.name}`,\n `Files: ${response.data.files}`,\n `Blobs: ${response.data.blobs}`,\n `Database: ${response.data.database.engine} (${response.data.database.binding})`,\n ];\n\n output.info(lines.join(\"\\n\"));\n}\n\nexport async function runKnowAudiencesCommand(\n options: KnowAudiencesCommandOptions,\n output: CommandOutput,\n dependencies?: KnowCommandDependencies\n): Promise<void> {\n const api = dependencies?.api ?? createKnowledgesApi(options);\n const response = await api.listAudiences();\n\n if (shouldPrintJson(options)) {\n output.raw(formatJson(response.data));\n return;\n }\n\n const lines = response.data.audiences.flatMap((audience) => [\n `${audience.id} - ${audience.label}`,\n ` ${singleLine(audience.help)}`,\n ]);\n\n output.info(lines.length > 0 ? lines.join(\"\\n\") : \"No audiences available.\");\n}\n\nexport async function runKnowSearchCommand(\n query: string | undefined,\n options: KnowSearchCommandOptions,\n output: CommandOutput,\n dependencies?: KnowCommandDependencies\n): Promise<void> {\n if (!query) {\n throw new Error(\"Missing search query. Usage: cngkit knowledges search <query>\");\n }\n\n const api = dependencies?.api ?? createKnowledgesApi(options);\n const response = await api.search(query, coerceLimit(options.limit, 5));\n\n if (shouldPrintJson(options)) {\n output.raw(formatJson(response.data));\n return;\n }\n\n const lines = response.data.results.flatMap((result, index) => [\n `${index + 1}. ${result.title} (${result.topicName})`,\n ` score ${result.score.toFixed(3)} | ${result.path}`,\n ` ${singleLine(result.description || result.contentPreview)}`,\n ]);\n\n if (lines.length > 0) {\n output.info(lines.join(\"\\n\"));\n return;\n }\n\n output.warning(`No results for \"${query}\".`);\n}\n\nexport async function runKnowListCommand(\n query: string | undefined,\n options: KnowListCommandOptions,\n output: CommandOutput,\n dependencies?: KnowCommandDependencies\n): Promise<void> {\n const api = dependencies?.api ?? createKnowledgesApi(options);\n const response = await api.listTopics();\n const limit = coerceLimit(options.limit, 25);\n const normalizedQuery = query?.toLowerCase();\n const topics = response.data.topics\n .filter((topic) => {\n if (!normalizedQuery) {\n return true;\n }\n return [topic.name, topic.title, topic.description, topic.type]\n .join(\" \")\n .toLowerCase()\n .includes(normalizedQuery);\n })\n .slice(0, limit);\n\n if (shouldPrintJson(options)) {\n output.raw(formatJson({ topics, total: topics.length }));\n return;\n }\n\n const lines = topics.flatMap((topic) => [\n `${topic.name} [${topic.type}]`,\n ` ${topic.title} | files ${topic.fileCount} | rating ${topic.rating}`,\n ` ${singleLine(topic.description)}`,\n ]);\n\n if (lines.length > 0) {\n output.info(lines.join(\"\\n\"));\n return;\n }\n\n output.warning(\"No matching topics.\");\n}\n\nexport async function runKnowFilesCommand(\n query: string | undefined,\n options: KnowFilesCommandOptions,\n output: CommandOutput,\n dependencies?: KnowCommandDependencies\n): Promise<void> {\n const api = dependencies?.api ?? createKnowledgesApi(options);\n const response = await api.listFiles({\n query,\n audience: normalizeAudienceId(options.audience),\n limit: coerceLimit(options.limit, 25),\n });\n\n if (shouldPrintJson(options)) {\n output.raw(formatJson(response.data));\n return;\n }\n\n const lines = response.data.files.map((file) => {\n const title = file.display_title ?? file.title ?? file.topic_name ?? \"Untitled\";\n return `${file.path}\\n ${title}`;\n });\n\n if (lines.length > 0) {\n output.info(lines.join(\"\\n\"));\n return;\n }\n\n output.warning(\"No matching files.\");\n}\n\nexport async function runKnowReadCommand(\n filePath: string | undefined,\n options: KnowReadCommandOptions,\n output: CommandOutput,\n dependencies?: KnowCommandDependencies\n): Promise<void> {\n if (!filePath) {\n throw new Error(\"Missing file_path. Usage: cngkit knowledges read <file_path>\");\n }\n\n const api = dependencies?.api ?? createKnowledgesApi(options);\n const response = await api.read({\n filePath: normalizeCatalogPath(filePath),\n offset: coerceOptionalNumber(options.offset),\n limit: coerceLimit(options.limit, 200, 2000),\n });\n\n if (shouldPrintJson(options)) {\n output.raw(formatJson(response.data));\n return;\n }\n\n if (resolveOutputFormat() === \"markdown\" || !response.data.file_path.endsWith(\".md\")) {\n output.raw(response.data.content);\n } else {\n output.markdown(response.data.content);\n }\n\n if (response.data.truncated) {\n output.warning(\n `[truncated: showing ${response.data.limit} lines from offset ${response.data.offset} of ${response.data.total_lines}]`\n );\n }\n}\n\nexport async function runKnowCatCommand(\n filePath: string | undefined,\n options: KnowCatCommandOptions,\n output: CommandOutput,\n dependencies?: KnowCommandDependencies\n): Promise<void> {\n if (!filePath) {\n throw new Error(\"Missing file_path. Usage: cngkit knowledges cat <file_path>\");\n }\n\n const api = dependencies?.api ?? createKnowledgesApi(options);\n const response = await api.read({\n filePath: normalizeCatalogPath(filePath),\n offset: 0,\n limit: 2000,\n });\n\n outputRawContent(response.data, options, output);\n}\n\nexport async function runKnowHeadCommand(\n filePath: string | undefined,\n options: KnowHeadCommandOptions,\n output: CommandOutput,\n dependencies?: KnowCommandDependencies\n): Promise<void> {\n if (!filePath) {\n throw new Error(\"Missing file_path. Usage: cngkit knowledges head <file_path> -n 10\");\n }\n\n const api = dependencies?.api ?? createKnowledgesApi(options);\n const response = await api.read({\n filePath: normalizeCatalogPath(filePath),\n offset: 0,\n limit: coerceLimit(options.lines, 10, 2000),\n });\n\n outputRawContent(response.data, options, output);\n}\n\nexport async function runKnowTailCommand(\n filePath: string | undefined,\n options: KnowTailCommandOptions,\n output: CommandOutput,\n dependencies?: KnowCommandDependencies\n): Promise<void> {\n if (!filePath) {\n throw new Error(\"Missing file_path. Usage: cngkit knowledges tail <file_path> -n 10\");\n }\n\n const api = dependencies?.api ?? createKnowledgesApi(options);\n const response = await api.tail({\n filePath: normalizeCatalogPath(filePath),\n lines: coerceLimit(options.lines, 10, 2000),\n });\n\n outputRawContent(response.data, options, output);\n}\n\nexport async function runKnowGrepCommand(\n pattern: string | undefined,\n options: KnowGrepCommandOptions,\n output: CommandOutput,\n dependencies?: KnowCommandDependencies\n): Promise<void> {\n if (!pattern) {\n throw new Error(\"Missing pattern. Usage: cngkit knowledges grep <pattern>\");\n }\n\n const api = dependencies?.api ?? createKnowledgesApi(options);\n const limit = options.limit !== undefined ? coerceOptionalNumber(options.limit) : undefined;\n const response = await api.grep({\n pattern,\n path: normalizeCatalogPath(options.path ?? \"/\"),\n include: options.include ?? \"*\",\n mode: normalizeGrepMode(options.outputMode),\n context: coerceLimit(options.context, 0, 20),\n ignoreCase: options.caseInsensitive === true,\n });\n\n if (shouldPrintJson(options)) {\n output.raw(formatJson(response.data));\n return;\n }\n\n if (response.data.mode === \"files_with_matches\") {\n const files = limit ? response.data.files.slice(0, limit) : response.data.files;\n if (files.length > 0) {\n output.raw(files.join(\"\\n\"));\n return;\n }\n\n output.warning(`No files matched \"${pattern}\".`);\n return;\n }\n\n if (response.data.mode === \"count\") {\n const counts = limit ? response.data.counts.slice(0, limit) : response.data.counts;\n const lines = counts.map((count) => `${count.file_path}: ${count.match_count}`);\n if (lines.length > 0) {\n output.raw(lines.join(\"\\n\"));\n return;\n }\n\n output.warning(`No matches for \"${pattern}\".`);\n return;\n }\n\n const matches = limit ? response.data.matches.slice(0, limit) : response.data.matches;\n const lines = matches.flatMap((match) => [\n `${match.file_path}:${match.line_number}`,\n ...match.context_before.map((line) => ` ${line}`),\n `> ${match.line}`,\n ...match.context_after.map((line) => ` ${line}`),\n ]);\n\n if (lines.length > 0) {\n output.raw(lines.join(\"\\n\"));\n return;\n }\n\n output.warning(`No matches for \"${pattern}\".`);\n}\n\nexport async function runKnowGlobCommand(\n pattern: string | undefined,\n options: KnowGlobCommandOptions,\n output: CommandOutput,\n dependencies?: KnowCommandDependencies\n): Promise<void> {\n const api = dependencies?.api ?? createKnowledgesApi(options);\n const limit = options.limit !== undefined ? coerceOptionalNumber(options.limit) : undefined;\n const response = await api.glob({\n pattern: pattern ?? \"**/*.md\",\n path: normalizeCatalogPath(options.path ?? \"/\"),\n });\n\n if (shouldPrintJson(options)) {\n output.raw(formatJson(response.data));\n return;\n }\n\n const files = limit ? response.data.files.slice(0, limit) : response.data.files;\n const wasClientTruncated = limit ? response.data.files.length > limit : false;\n\n if (files.length > 0) {\n output.raw(files.join(\"\\n\"));\n } else {\n output.warning(\"No matching files.\");\n }\n if (response.data.truncated || wasClientTruncated) {\n output.warning(`[truncated: ${response.data.total_files} total files]`);\n }\n}\n\nexport async function runKnowLsCommand(\n path: string | undefined,\n options: KnowLsCommandOptions,\n output: CommandOutput,\n dependencies?: KnowCommandDependencies\n): Promise<void> {\n const api = dependencies?.api ?? createKnowledgesApi(options);\n const response = await api.listDirectory({\n path: normalizeFilesystemCatalogPath(path ?? \"/\"),\n limit: coerceLimit(options.limit, 100, 1000),\n });\n\n if (shouldPrintJson(options)) {\n output.raw(formatJson(response.data));\n return;\n }\n\n const entries = [...response.data.entries].sort(compareFilesystemEntries);\n const lines = entries.map((entry) =>\n options.long === true\n ? formatLongFilesystemEntryLine(entry)\n : formatShellFilesystemEntryName(entry)\n );\n\n if (lines.length > 0) {\n output.raw(lines.join(\"\\n\"));\n } else {\n output.warning(`No entries under ${response.data.path}.`);\n }\n\n if (response.data.truncated) {\n output.warning(`[truncated: ${response.data.total_entries} total entries]`);\n }\n}\n\nexport async function runKnowTreeCommand(\n path: string | undefined,\n options: KnowTreeCommandOptions,\n output: CommandOutput,\n dependencies?: KnowCommandDependencies\n): Promise<void> {\n const api = dependencies?.api ?? createKnowledgesApi(options);\n const response = await api.tree({\n path: normalizeFilesystemCatalogPath(path ?? \"/\"),\n depth: coerceLimit(options.depth, 3, 8),\n limit: coerceLimit(options.limit, 500, 2000),\n });\n\n if (shouldPrintJson(options)) {\n output.raw(formatJson(response.data));\n return;\n }\n\n const lines = formatFilesystemTree(response.data.path, response.data.entries);\n output.raw(lines.join(\"\\n\"));\n\n if (response.data.truncated) {\n output.warning(`[truncated: ${response.data.total_entries} total entries]`);\n }\n}\n\nexport async function runKnowFindCommand(\n path: string | undefined,\n options: KnowFindCommandOptions,\n output: CommandOutput,\n dependencies?: KnowCommandDependencies\n): Promise<void> {\n const api = dependencies?.api ?? createKnowledgesApi(options);\n const response = await api.find({\n path: normalizeFilesystemCatalogPath(path ?? \"/\"),\n name: options.name,\n type: options.type,\n maxDepth: coerceOptionalFiniteNumber(options.maxDepth),\n limit: coerceLimit(options.limit, 500, 2000),\n });\n\n if (shouldPrintJson(options)) {\n output.raw(formatJson(response.data));\n return;\n }\n\n const entries = [...response.data.entries].sort(compareFilesystemEntries);\n const lines = entries.map(formatFilesystemEntryPath);\n\n if (lines.length > 0) {\n output.raw(lines.join(\"\\n\"));\n } else {\n output.warning(`No entries found under ${response.data.path}.`);\n }\n\n if (response.data.truncated) {\n output.warning(`[truncated: ${response.data.total_entries} total entries]`);\n }\n}\n\nexport async function runKnowStatCommand(\n path: string | undefined,\n options: KnowStatCommandOptions,\n output: CommandOutput,\n dependencies?: KnowCommandDependencies\n): Promise<void> {\n if (!path) {\n throw new Error(\"Missing path. Usage: cngkit knowledges stat <path>\");\n }\n\n const api = dependencies?.api ?? createKnowledgesApi(options);\n const response = await api.statPath({\n path: normalizeFilesystemCatalogPath(path),\n });\n\n if (shouldPrintJson(options)) {\n output.raw(formatJson(response.data));\n return;\n }\n\n output.raw(formatFilesystemStat(response.data));\n}\n\nexport async function runKnowRealpathCommand(\n path: string | undefined,\n options: KnowRealpathCommandOptions,\n output: CommandOutput\n): Promise<void> {\n if (!path) {\n throw new Error(\"Missing path. Usage: cngkit knowledges realpath <path>\");\n }\n\n const resolvedPath = normalizeFilesystemCatalogPath(path);\n if (shouldPrintJson(options)) {\n output.raw(formatJson({ path: resolvedPath }));\n return;\n }\n\n output.raw(resolvedPath);\n}\n\nfunction compareFilesystemEntries(\n left: CngApi.HarnessFilesystemEntry,\n right: CngApi.HarnessFilesystemEntry\n): number {\n if (left.type !== right.type) {\n return left.type === \"directory\" ? -1 : 1;\n }\n\n return left.path.localeCompare(right.path);\n}\n\nfunction outputRawContent(\n data: CngApi.HarnessReadResponse,\n options: JsonOutputOptions,\n output: CommandOutput\n): void {\n if (shouldPrintJson(options)) {\n output.raw(formatJson(data));\n return;\n }\n\n output.raw(data.content);\n}\n\nfunction formatFilesystemTree(\n rootPath: string,\n entries: CngApi.HarnessFilesystemEntry[]\n): string[] {\n const normalizedRootPath = rootPath.replace(/\\/+$/, \"\");\n const rootLine = formatTreeDirectoryName(rootPath);\n const entryLines = [...entries].sort(compareFilesystemEntries).map((entry) => {\n const relativePath = stripRootPath(entry.path, normalizedRootPath);\n const segmentCount = relativePath.split(\"/\").filter(Boolean).length;\n const indent = \" \".repeat(Math.max(segmentCount - 1, 0));\n return `${indent}${formatShellFilesystemEntryName(entry)}`;\n });\n\n return [rootLine, ...entryLines];\n}\n\nfunction stripRootPath(path: string, rootPath: string): string {\n if (path === rootPath) {\n return \"\";\n }\n\n if (rootPath && path.startsWith(`${rootPath}/`)) {\n return path.slice(rootPath.length + 1);\n }\n\n return path;\n}\n\nfunction formatTreeDirectoryName(path: string): string {\n const normalizedPath = path.replace(/\\/+$/, \"\");\n return normalizedPath ? `${normalizedPath}/` : \"/\";\n}\n\nfunction formatShellFilesystemEntryName(entry: CngApi.HarnessFilesystemEntry): string {\n return entry.type === \"directory\" ? `${entry.name}/` : entry.name;\n}\n\nfunction formatFilesystemEntryPath(entry: CngApi.HarnessFilesystemEntry): string {\n return entry.type === \"directory\" ? `${entry.path}/` : entry.path;\n}\n\nfunction formatLongFilesystemEntryLine(entry: CngApi.HarnessFilesystemEntry): string {\n const fields = [\n entry.type,\n entry.path,\n ...formatOptionalEntryFields([\n [\"size\", entry.size],\n [\"files\", entry.file_count],\n [\"children\", entry.child_count],\n [\"total_size\", entry.total_size],\n [\"sha256\", entry.sha256],\n [\"asset_kind\", entry.asset_kind],\n [\"topic\", entry.topic_name],\n ]),\n ];\n\n return fields.join(\"\\t\");\n}\n\nfunction coerceOptionalFiniteNumber(value: NumberOption | undefined): number | undefined {\n const normalizedValue = coerceOptionalNumber(value);\n return normalizedValue === undefined || Number.isNaN(normalizedValue)\n ? undefined\n : Math.max(1, Math.trunc(normalizedValue));\n}\n\nfunction formatFilesystemStat(entry: CngApi.HarnessFilesystemStatResponse): string {\n const fields: Array<[string, string | number | null]> = [\n [\"path\", entry.path],\n [\"type\", entry.type],\n [\"name\", entry.name],\n [\"depth\", entry.depth],\n [\"size\", entry.size],\n [\"files\", entry.file_count],\n [\"children\", entry.child_count],\n [\"total_size\", entry.total_size],\n [\"sha256\", entry.sha256],\n [\"asset_kind\", entry.asset_kind],\n [\"title\", entry.title],\n [\"topic\", entry.topic_name],\n [\"updated_at\", entry.updated_at],\n ];\n\n return formatOptionalEntryFields(fields).join(\"\\n\");\n}\n\nfunction formatOptionalEntryFields(fields: Array<[string, string | number | null]>): string[] {\n return fields.flatMap(([key, value]) => {\n if (value === null || value === \"\") {\n return [];\n }\n\n return [`${key}=${value}`];\n });\n}\n"],"mappings":"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","names":["lines"]}
@@ -1,26 +0,0 @@
1
- import {
2
- createCommandOutput,
3
- formatError
4
- } from "./chunk-7SO75QXJ.js";
5
-
6
- // src/cli/command-runner.tsx
7
- import { useEffect } from "react";
8
- import { useApp } from "ink";
9
- function CommandRunner({ run }) {
10
- const { exit } = useApp();
11
- useEffect(() => {
12
- const output = createCommandOutput(process.stdout, process.stderr);
13
- void run(output).catch((error) => {
14
- process.exitCode = 1;
15
- output.error(formatError(error));
16
- }).finally(() => {
17
- exit();
18
- });
19
- }, [exit, run]);
20
- return null;
21
- }
22
-
23
- export {
24
- CommandRunner
25
- };
26
- //# sourceMappingURL=chunk-X4E7NAN4.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli/command-runner.tsx"],"sourcesContent":["import { useEffect } from \"react\";\nimport { useApp } from \"ink\";\n\nimport { createCommandOutput, formatError, type CommandOutput } from \"../shared/output.js\";\n\ntype CommandRunnerProps = {\n readonly run: (output: CommandOutput) => Promise<void>;\n};\n\nexport function CommandRunner({ run }: CommandRunnerProps) {\n const { exit } = useApp();\n\n useEffect(() => {\n const output = createCommandOutput(process.stdout, process.stderr);\n\n void run(output)\n .catch((error: unknown) => {\n process.exitCode = 1;\n output.error(formatError(error));\n })\n .finally(() => {\n exit();\n });\n }, [exit, run]);\n\n return null;\n}\n"],"mappings":";;;;;;AAAA,SAAS,iBAAiB;AAC1B,SAAS,cAAc;AAQhB,SAAS,cAAc,EAAE,IAAI,GAAuB;AACzD,QAAM,EAAE,KAAK,IAAI,OAAO;AAExB,YAAU,MAAM;AACd,UAAM,SAAS,oBAAoB,QAAQ,QAAQ,QAAQ,MAAM;AAEjE,SAAK,IAAI,MAAM,EACZ,MAAM,CAAC,UAAmB;AACzB,cAAQ,WAAW;AACnB,aAAO,MAAM,YAAY,KAAK,CAAC;AAAA,IACjC,CAAC,EACA,QAAQ,MAAM;AACb,WAAK;AAAA,IACP,CAAC;AAAA,EACL,GAAG,CAAC,MAAM,GAAG,CAAC;AAEd,SAAO;AACT;","names":[]}