pybao-cli 1.3.83 → 1.3.86

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 (171) hide show
  1. package/dist/REPL-QBOTHGXR.js +47 -0
  2. package/dist/{acp-OWNA2GOE.js → acp-HZUGOVHE.js} +39 -38
  3. package/dist/acp-HZUGOVHE.js.map +7 -0
  4. package/dist/{agentsValidate-UC7SD3JY.js → agentsValidate-O7HQSJAA.js} +10 -8
  5. package/dist/agentsValidate-O7HQSJAA.js.map +7 -0
  6. package/dist/{ask-6ESDLRIC.js → ask-PI5RK5UV.js} +32 -27
  7. package/dist/{ask-6ESDLRIC.js.map → ask-PI5RK5UV.js.map} +1 -1
  8. package/dist/{autoUpdater-FAKGXOY4.js → autoUpdater-VMLAPV65.js} +3 -3
  9. package/dist/blockParser-QPLEX5NJ.js +9 -0
  10. package/dist/{chunk-HMCPTTVR.js → chunk-26JCV35N.js} +3 -3
  11. package/dist/{chunk-WU4VY7XT.js → chunk-3HDF767A.js} +2 -2
  12. package/dist/{chunk-BPZ44BIE.js → chunk-63AZKM53.js} +1 -1
  13. package/dist/chunk-ARPANTL5.js +1834 -0
  14. package/dist/chunk-ARPANTL5.js.map +7 -0
  15. package/dist/{chunk-3BP3TGGN.js → chunk-DSILT3OP.js} +1 -1
  16. package/dist/{chunk-3BP3TGGN.js.map → chunk-DSILT3OP.js.map} +1 -1
  17. package/dist/{chunk-NNNU5K5N.js → chunk-DXCSQJBL.js} +8 -3
  18. package/dist/chunk-DXCSQJBL.js.map +7 -0
  19. package/dist/{chunk-XJDZTRBL.js → chunk-GQQLSBYO.js} +3 -3
  20. package/dist/{chunk-WCR6QGXF.js → chunk-H4AQENXV.js} +4 -4
  21. package/dist/{chunk-MFNDDM3V.js → chunk-JLQQYGR3.js} +1 -1
  22. package/dist/{chunk-NIKESYZF.js → chunk-LSR2E3UK.js} +7 -5
  23. package/dist/chunk-LSR2E3UK.js.map +7 -0
  24. package/dist/{chunk-JGJCX75W.js → chunk-MHA6SEN4.js} +41 -13
  25. package/dist/chunk-MHA6SEN4.js.map +7 -0
  26. package/dist/{chunk-B3MDT4F6.js → chunk-MNAVHXSW.js} +5 -5
  27. package/dist/{chunk-SYHWDS75.js → chunk-MNLKFR45.js} +5 -6
  28. package/dist/chunk-MNLKFR45.js.map +7 -0
  29. package/dist/{chunk-ZZO2YNJG.js → chunk-NBCFJBBX.js} +5 -4
  30. package/dist/chunk-NBCFJBBX.js.map +7 -0
  31. package/dist/{chunk-MSWBIZZC.js → chunk-NIKYII4N.js} +8 -6
  32. package/dist/chunk-NIKYII4N.js.map +7 -0
  33. package/dist/{chunk-XC4AJGEW.js → chunk-NPB2GG6W.js} +1 -1
  34. package/dist/{chunk-FOQKIQ27.js → chunk-OLZLEJQ6.js} +3 -3
  35. package/dist/{chunk-43ZJOQDX.js → chunk-Q53PYUIA.js} +1127 -1300
  36. package/dist/chunk-Q53PYUIA.js.map +7 -0
  37. package/dist/{blockParser-CFQE5IAN.js → chunk-QWIBSCDN.js} +1 -1
  38. package/dist/{blockParser-CFQE5IAN.js.map → chunk-QWIBSCDN.js.map} +1 -1
  39. package/dist/{chunk-SSPEL7MF.js → chunk-RZB3QGK6.js} +3 -3
  40. package/dist/{chunk-6VOYUVQU.js → chunk-S4CSO2ZH.js} +7 -7
  41. package/dist/chunk-SIEX5WPV.js +364 -0
  42. package/dist/chunk-SIEX5WPV.js.map +7 -0
  43. package/dist/{chunk-TNJTMN23.js → chunk-TKDXONVW.js} +1 -1
  44. package/dist/{chunk-ZEMFBGPE.js → chunk-TPDQPJ6C.js} +19 -15
  45. package/dist/chunk-TPDQPJ6C.js.map +7 -0
  46. package/dist/{chunk-HCPU4TQ6.js → chunk-UEU4FXHS.js} +1 -1
  47. package/dist/{chunk-SWY5TLOX.js → chunk-UF7NCSRO.js} +159 -1232
  48. package/dist/chunk-UF7NCSRO.js.map +7 -0
  49. package/dist/{chunk-L62UDJSU.js → chunk-XHAFEGQ4.js} +341 -67
  50. package/dist/chunk-XHAFEGQ4.js.map +7 -0
  51. package/dist/chunk-XI4LTVYT.js +17 -0
  52. package/dist/chunk-XI4LTVYT.js.map +7 -0
  53. package/dist/chunk-XTZG3RFQ.js +1832 -0
  54. package/dist/chunk-XTZG3RFQ.js.map +7 -0
  55. package/dist/{chunk-HIH43UEF.js → chunk-YO4DT6YI.js} +4 -4
  56. package/dist/chunk-YO4DT6YI.js.map +7 -0
  57. package/dist/{chunk-FH5VPA4M.js → chunk-YV7IG5XX.js} +1 -1
  58. package/dist/{chunk-CPOVPGCU.js → chunk-ZBVG3UAU.js} +7 -7
  59. package/dist/{cli-EASV6IY7.js → cli-5PLJTPHW.js} +206 -91
  60. package/dist/cli-5PLJTPHW.js.map +7 -0
  61. package/dist/commands-B2WZOGHH.js +51 -0
  62. package/dist/{config-53WMBY35.js → config-SHEWOPFK.js} +4 -4
  63. package/dist/{context-GNSAANSR.js → context-LL2UPKAI.js} +5 -5
  64. package/dist/{customCommands-TI7KC7QR.js → customCommands-35Z3QFJ7.js} +4 -4
  65. package/dist/{env-7GAPXLOS.js → env-NQFQMCTK.js} +16 -4
  66. package/dist/file-KM744MET.js +44 -0
  67. package/dist/index.js +3 -3
  68. package/dist/{chunk-FL4UY5X6.js → llm-VLOERBXP.js} +68 -32
  69. package/dist/llm-VLOERBXP.js.map +7 -0
  70. package/dist/{llmLazy-JT5FOMWS.js → llmLazy-RBH7MNLY.js} +1 -1
  71. package/dist/{loader-FVGZ4Q4O.js → loader-7WST3AYZ.js} +4 -4
  72. package/dist/lsp-OXNZT5ZE.js +17 -0
  73. package/dist/{lspAnchor-2ESTEKDW.js → lspAnchor-DZZU6UQ6.js} +8 -10
  74. package/dist/lspAnchor-DZZU6UQ6.js.map +7 -0
  75. package/dist/{mcp-DXRJFV2Z.js → mcp-X7RYSZ6L.js} +7 -7
  76. package/dist/{mentionProcessor-24DFMNUM.js → mentionProcessor-ROLDGNA5.js} +5 -5
  77. package/dist/{messages-44UB3QCF.js → messages-UJS72R2W.js} +1 -1
  78. package/dist/{model-2MO4JM7C.js → model-V7H3W6Y7.js} +5 -5
  79. package/dist/{openai-IW2EECJN.js → openai-KGZKMMS6.js} +5 -5
  80. package/dist/{outputStyles-OFVM7RO6.js → outputStyles-7RUAZ6BO.js} +4 -4
  81. package/dist/{pluginRuntime-L2ORBVPC.js → pluginRuntime-UZ55REAW.js} +6 -6
  82. package/dist/{pluginValidation-S5YXDUDC.js → pluginValidation-GTXVXBWB.js} +6 -6
  83. package/dist/prompts-4VTBEFY3.js +53 -0
  84. package/dist/{pybAgentSessionLoad-NM2FSUHI.js → pybAgentSessionLoad-4JMXEYFZ.js} +4 -4
  85. package/dist/{pybAgentSessionResume-R6DFJVOS.js → pybAgentSessionResume-BO24O2NE.js} +4 -4
  86. package/dist/{pybAgentStreamJsonSession-IYC73GWN.js → pybAgentStreamJsonSession-ZPRBH4EV.js} +1 -1
  87. package/dist/{pybHooks-BNGLUIBL.js → pybHooks-2PL5ZVBP.js} +4 -4
  88. package/dist/query-YHFKIZJZ.js +55 -0
  89. package/dist/registry-6M7CIUP6.js +47 -0
  90. package/dist/{ripgrep-QZG3RMUD.js → ripgrep-GC4KZFGD.js} +3 -3
  91. package/dist/{skillMarketplace-IRUF6M5M.js → skillMarketplace-TCNFPAN3.js} +3 -3
  92. package/dist/{state-LSDUZCQZ.js → state-64M4LRYH.js} +2 -2
  93. package/dist/{theme-QVGQSEFJ.js → theme-KNA2WSIO.js} +5 -5
  94. package/dist/{toolPermissionSettings-U4P7K6VA.js → toolPermissionSettings-HIIWLCI7.js} +6 -6
  95. package/dist/toolPermissionSettings-HIIWLCI7.js.map +7 -0
  96. package/dist/tools-TIELMHQI.js +52 -0
  97. package/dist/tools-TIELMHQI.js.map +7 -0
  98. package/dist/{userInput-EP4A6TDN.js → userInput-LB5SZ6IS.js} +34 -29
  99. package/dist/{userInput-EP4A6TDN.js.map → userInput-LB5SZ6IS.js.map} +1 -1
  100. package/package.json +1 -1
  101. package/dist/REPL-HVMZDW6I.js +0 -42
  102. package/dist/acp-OWNA2GOE.js.map +0 -7
  103. package/dist/agentsValidate-UC7SD3JY.js.map +0 -7
  104. package/dist/chunk-43ZJOQDX.js.map +0 -7
  105. package/dist/chunk-FL4UY5X6.js.map +0 -7
  106. package/dist/chunk-HIH43UEF.js.map +0 -7
  107. package/dist/chunk-JGJCX75W.js.map +0 -7
  108. package/dist/chunk-L62UDJSU.js.map +0 -7
  109. package/dist/chunk-MSWBIZZC.js.map +0 -7
  110. package/dist/chunk-NIKESYZF.js.map +0 -7
  111. package/dist/chunk-NNNU5K5N.js.map +0 -7
  112. package/dist/chunk-PBPAGOFN.js +0 -929
  113. package/dist/chunk-PBPAGOFN.js.map +0 -7
  114. package/dist/chunk-SWY5TLOX.js.map +0 -7
  115. package/dist/chunk-SYHWDS75.js.map +0 -7
  116. package/dist/chunk-ZEMFBGPE.js.map +0 -7
  117. package/dist/chunk-ZZO2YNJG.js.map +0 -7
  118. package/dist/cli-EASV6IY7.js.map +0 -7
  119. package/dist/commands-LHZ4KLGY.js +0 -46
  120. package/dist/llm-24PI2Z6V.js +0 -80
  121. package/dist/lspAnchor-2ESTEKDW.js.map +0 -7
  122. package/dist/manager-B7QOH5CJ.js +0 -13
  123. package/dist/prompts-7PXTK55Q.js +0 -48
  124. package/dist/query-OLRMI42V.js +0 -50
  125. package/dist/tools-LSBTQYU4.js +0 -51
  126. /package/dist/{REPL-HVMZDW6I.js.map → REPL-QBOTHGXR.js.map} +0 -0
  127. /package/dist/{autoUpdater-FAKGXOY4.js.map → autoUpdater-VMLAPV65.js.map} +0 -0
  128. /package/dist/{commands-LHZ4KLGY.js.map → blockParser-QPLEX5NJ.js.map} +0 -0
  129. /package/dist/{chunk-HMCPTTVR.js.map → chunk-26JCV35N.js.map} +0 -0
  130. /package/dist/{chunk-WU4VY7XT.js.map → chunk-3HDF767A.js.map} +0 -0
  131. /package/dist/{chunk-BPZ44BIE.js.map → chunk-63AZKM53.js.map} +0 -0
  132. /package/dist/{chunk-XJDZTRBL.js.map → chunk-GQQLSBYO.js.map} +0 -0
  133. /package/dist/{chunk-WCR6QGXF.js.map → chunk-H4AQENXV.js.map} +0 -0
  134. /package/dist/{chunk-MFNDDM3V.js.map → chunk-JLQQYGR3.js.map} +0 -0
  135. /package/dist/{chunk-B3MDT4F6.js.map → chunk-MNAVHXSW.js.map} +0 -0
  136. /package/dist/{chunk-XC4AJGEW.js.map → chunk-NPB2GG6W.js.map} +0 -0
  137. /package/dist/{chunk-FOQKIQ27.js.map → chunk-OLZLEJQ6.js.map} +0 -0
  138. /package/dist/{chunk-SSPEL7MF.js.map → chunk-RZB3QGK6.js.map} +0 -0
  139. /package/dist/{chunk-6VOYUVQU.js.map → chunk-S4CSO2ZH.js.map} +0 -0
  140. /package/dist/{chunk-TNJTMN23.js.map → chunk-TKDXONVW.js.map} +0 -0
  141. /package/dist/{chunk-HCPU4TQ6.js.map → chunk-UEU4FXHS.js.map} +0 -0
  142. /package/dist/{chunk-FH5VPA4M.js.map → chunk-YV7IG5XX.js.map} +0 -0
  143. /package/dist/{chunk-CPOVPGCU.js.map → chunk-ZBVG3UAU.js.map} +0 -0
  144. /package/dist/{config-53WMBY35.js.map → commands-B2WZOGHH.js.map} +0 -0
  145. /package/dist/{context-GNSAANSR.js.map → config-SHEWOPFK.js.map} +0 -0
  146. /package/dist/{customCommands-TI7KC7QR.js.map → context-LL2UPKAI.js.map} +0 -0
  147. /package/dist/{env-7GAPXLOS.js.map → customCommands-35Z3QFJ7.js.map} +0 -0
  148. /package/dist/{llm-24PI2Z6V.js.map → env-NQFQMCTK.js.map} +0 -0
  149. /package/dist/{llmLazy-JT5FOMWS.js.map → file-KM744MET.js.map} +0 -0
  150. /package/dist/{loader-FVGZ4Q4O.js.map → llmLazy-RBH7MNLY.js.map} +0 -0
  151. /package/dist/{manager-B7QOH5CJ.js.map → loader-7WST3AYZ.js.map} +0 -0
  152. /package/dist/{mcp-DXRJFV2Z.js.map → lsp-OXNZT5ZE.js.map} +0 -0
  153. /package/dist/{messages-44UB3QCF.js.map → mcp-X7RYSZ6L.js.map} +0 -0
  154. /package/dist/{mentionProcessor-24DFMNUM.js.map → mentionProcessor-ROLDGNA5.js.map} +0 -0
  155. /package/dist/{model-2MO4JM7C.js.map → messages-UJS72R2W.js.map} +0 -0
  156. /package/dist/{openai-IW2EECJN.js.map → model-V7H3W6Y7.js.map} +0 -0
  157. /package/dist/{outputStyles-OFVM7RO6.js.map → openai-KGZKMMS6.js.map} +0 -0
  158. /package/dist/{pluginValidation-S5YXDUDC.js.map → outputStyles-7RUAZ6BO.js.map} +0 -0
  159. /package/dist/{pluginRuntime-L2ORBVPC.js.map → pluginRuntime-UZ55REAW.js.map} +0 -0
  160. /package/dist/{prompts-7PXTK55Q.js.map → pluginValidation-GTXVXBWB.js.map} +0 -0
  161. /package/dist/{pybAgentSessionLoad-NM2FSUHI.js.map → prompts-4VTBEFY3.js.map} +0 -0
  162. /package/dist/{pybAgentSessionResume-R6DFJVOS.js.map → pybAgentSessionLoad-4JMXEYFZ.js.map} +0 -0
  163. /package/dist/{pybHooks-BNGLUIBL.js.map → pybAgentSessionResume-BO24O2NE.js.map} +0 -0
  164. /package/dist/{pybAgentStreamJsonSession-IYC73GWN.js.map → pybAgentStreamJsonSession-ZPRBH4EV.js.map} +0 -0
  165. /package/dist/{query-OLRMI42V.js.map → pybHooks-2PL5ZVBP.js.map} +0 -0
  166. /package/dist/{ripgrep-QZG3RMUD.js.map → query-YHFKIZJZ.js.map} +0 -0
  167. /package/dist/{skillMarketplace-IRUF6M5M.js.map → registry-6M7CIUP6.js.map} +0 -0
  168. /package/dist/{state-LSDUZCQZ.js.map → ripgrep-GC4KZFGD.js.map} +0 -0
  169. /package/dist/{theme-QVGQSEFJ.js.map → skillMarketplace-TCNFPAN3.js.map} +0 -0
  170. /package/dist/{toolPermissionSettings-U4P7K6VA.js.map → state-64M4LRYH.js.map} +0 -0
  171. /package/dist/{tools-LSBTQYU4.js.map → theme-KNA2WSIO.js.map} +0 -0
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/utils/log/debugLogger.ts"],
4
- "sourcesContent": ["import { existsSync, mkdirSync, appendFileSync } from 'fs'\nimport { join } from 'path'\nimport { homedir } from 'os'\nimport { randomUUID } from 'crypto'\nimport { format } from 'node:util'\nimport chalk from 'chalk'\nimport envPaths from 'env-paths'\nimport { PRODUCT_COMMAND } from '@constants/product'\nimport { SESSION_ID } from './index'\nimport type { Message } from '@pyb-types/conversation'\n\nexport enum LogLevel {\n TRACE = 'TRACE',\n DEBUG = 'DEBUG',\n INFO = 'INFO',\n WARN = 'WARN',\n ERROR = 'ERROR',\n FLOW = 'FLOW',\n API = 'API',\n STATE = 'STATE',\n REMINDER = 'REMINDER',\n}\n\nconst isDebugMode = () =>\n process.argv.includes('--debug-verbose') ||\n process.argv.includes('--mcp-debug') ||\n process.argv.some(\n arg => arg === '--debug' || arg === '-d' || arg.startsWith('--debug='),\n )\nconst isVerboseMode = () => process.argv.includes('--verbose')\nconst isDebugVerboseMode = () => process.argv.includes('--debug-verbose')\n\nconst TERMINAL_LOG_LEVELS = new Set([\n LogLevel.ERROR,\n LogLevel.WARN,\n LogLevel.INFO,\n LogLevel.REMINDER,\n])\n\nconst DEBUG_VERBOSE_TERMINAL_LOG_LEVELS = new Set([\n LogLevel.ERROR,\n LogLevel.WARN,\n LogLevel.FLOW,\n LogLevel.API,\n LogLevel.STATE,\n LogLevel.INFO,\n LogLevel.REMINDER,\n])\n\nconst USER_FRIENDLY_LEVELS = new Set([\n 'SESSION_START',\n 'QUERY_START',\n 'QUERY_PROGRESS',\n 'QUERY_COMPLETE',\n 'TOOL_EXECUTION',\n 'ERROR_OCCURRED',\n 'PERFORMANCE_SUMMARY',\n])\n\nconst STARTUP_TIMESTAMP = new Date().toISOString().replace(/[:.]/g, '-')\nconst REQUEST_START_TIME = Date.now()\n\nconst PYB_DIR = join(homedir(), '.pyb')\nfunction getProjectDir(cwd: string): string {\n return cwd.replace(/[^a-zA-Z0-9]/g, '-')\n}\n\nconst DEBUG_PATHS = {\n base: () => join(PYB_DIR, getProjectDir(process.cwd()), 'debug'),\n detailed: () => join(DEBUG_PATHS.base(), `${STARTUP_TIMESTAMP}-detailed.log`),\n flow: () => join(DEBUG_PATHS.base(), `${STARTUP_TIMESTAMP}-flow.log`),\n api: () => join(DEBUG_PATHS.base(), `${STARTUP_TIMESTAMP}-api.log`),\n state: () => join(DEBUG_PATHS.base(), `${STARTUP_TIMESTAMP}-state.log`),\n}\n\nfunction ensureDebugDir() {\n const debugDir = DEBUG_PATHS.base()\n if (!existsSync(debugDir)) {\n mkdirSync(debugDir, { recursive: true })\n }\n}\n\ninterface LogEntry {\n timestamp: string\n level: LogLevel\n phase: string\n requestId?: string\n data: any\n elapsed?: number\n}\n\nclass RequestContext {\n public readonly id: string\n public readonly startTime: number\n private phases: Map<string, number> = new Map()\n\n constructor() {\n this.id = randomUUID().slice(0, 8)\n this.startTime = Date.now()\n }\n\n markPhase(phase: string) {\n this.phases.set(phase, Date.now() - this.startTime)\n }\n\n getPhaseTime(phase: string): number {\n return this.phases.get(phase) || 0\n }\n\n getAllPhases(): Record<string, number> {\n return Object.fromEntries(this.phases)\n }\n}\n\nconst activeRequests = new Map<string, RequestContext>()\nlet currentRequest: RequestContext | null = null\n\nfunction terminalLog(...args: unknown[]): void {\n process.stderr.write(`${format(...args)}\\n`)\n}\n\nfunction writeToFile(filePath: string, entry: LogEntry) {\n if (!isDebugMode()) return\n\n try {\n ensureDebugDir()\n const logLine =\n JSON.stringify(\n {\n ...entry,\n sessionId: SESSION_ID,\n pid: process.pid,\n uptime: Date.now() - REQUEST_START_TIME,\n },\n null,\n 2,\n ) + ',\\n'\n\n appendFileSync(filePath, logLine)\n } catch (error) {\n }\n}\n\nconst recentLogs = new Map<string, number>()\nconst LOG_DEDUPE_WINDOW_MS = 5000\n\nfunction getDedupeKey(level: LogLevel, phase: string, data: any): string {\n if (phase.startsWith('CONFIG_')) {\n const file = data?.file || ''\n return `${level}:${phase}:${file}`\n }\n\n return `${level}:${phase}`\n}\n\nfunction shouldLogWithDedupe(\n level: LogLevel,\n phase: string,\n data: any,\n): boolean {\n const key = getDedupeKey(level, phase, data)\n const now = Date.now()\n const lastLogTime = recentLogs.get(key)\n\n if (!lastLogTime || now - lastLogTime > LOG_DEDUPE_WINDOW_MS) {\n recentLogs.set(key, now)\n\n for (const [oldKey, oldTime] of recentLogs.entries()) {\n if (now - oldTime > LOG_DEDUPE_WINDOW_MS) {\n recentLogs.delete(oldKey)\n }\n }\n\n return true\n }\n\n return false\n}\nfunction formatMessages(messages: any): string {\n if (Array.isArray(messages)) {\n const recentMessages = messages.slice(-5)\n return recentMessages\n .map((msg, index) => {\n const role = msg.role || 'unknown'\n let content = ''\n\n if (typeof msg.content === 'string') {\n content =\n msg.content.length > 300\n ? msg.content.substring(0, 300) + '...'\n : msg.content\n } else if (typeof msg.content === 'object') {\n content = '[complex_content]'\n } else {\n content = String(msg.content || '')\n }\n\n const totalIndex = messages.length - recentMessages.length + index\n return `[${totalIndex}] ${chalk.dim(role)}: ${content}`\n })\n .join('\\n ')\n }\n\n if (typeof messages === 'string') {\n try {\n const parsed = JSON.parse(messages)\n if (Array.isArray(parsed)) {\n return formatMessages(parsed)\n }\n } catch {\n }\n }\n\n if (typeof messages === 'string' && messages.length > 200) {\n return messages.substring(0, 200) + '...'\n }\n\n return typeof messages === 'string' ? messages : JSON.stringify(messages)\n}\n\nfunction shouldShowInTerminal(level: LogLevel): boolean {\n if (!isDebugMode()) return false\n\n if (isDebugVerboseMode()) {\n return DEBUG_VERBOSE_TERMINAL_LOG_LEVELS.has(level)\n }\n\n return TERMINAL_LOG_LEVELS.has(level)\n}\n\nfunction logToTerminal(entry: LogEntry) {\n if (!shouldShowInTerminal(entry.level)) return\n\n const { level, phase, data, requestId, elapsed } = entry\n const timestamp = new Date().toISOString().slice(11, 23)\n\n let prefix = ''\n let color = chalk.gray\n\n switch (level) {\n case LogLevel.FLOW:\n prefix = '\uD83D\uDD04'\n color = chalk.cyan\n break\n case LogLevel.API:\n prefix = '\uD83C\uDF10'\n color = chalk.yellow\n break\n case LogLevel.STATE:\n prefix = '\uD83D\uDCCA'\n color = chalk.blue\n break\n case LogLevel.ERROR:\n prefix = '\u274C'\n color = chalk.red\n break\n case LogLevel.WARN:\n prefix = '\u26A0\uFE0F'\n color = chalk.yellow\n break\n case LogLevel.INFO:\n prefix = '\u2139\uFE0F'\n color = chalk.green\n break\n case LogLevel.TRACE:\n prefix = '\uD83D\uDCC8'\n color = chalk.magenta\n break\n default:\n prefix = '\uD83D\uDD0D'\n color = chalk.gray\n }\n\n const reqId = requestId ? chalk.dim(`[${requestId}]`) : ''\n const elapsedStr = elapsed !== undefined ? chalk.dim(`+${elapsed}ms`) : ''\n\n let dataStr = ''\n if (typeof data === 'object' && data !== null) {\n if (data.messages) {\n const formattedMessages = formatMessages(data.messages)\n dataStr = JSON.stringify(\n {\n ...data,\n messages: `\\n ${formattedMessages}`,\n },\n null,\n 2,\n )\n } else {\n dataStr = JSON.stringify(data, null, 2)\n }\n } else {\n dataStr = typeof data === 'string' ? data : JSON.stringify(data)\n }\n\n terminalLog(\n `${color(`[${timestamp}]`)} ${prefix} ${color(phase)} ${reqId} ${dataStr} ${elapsedStr}`,\n )\n}\n\nexport function debugLog(\n level: LogLevel,\n phase: string,\n data: any,\n requestId?: string,\n) {\n if (!isDebugMode()) return\n\n if (!shouldLogWithDedupe(level, phase, data)) {\n return\n }\n\n const entry: LogEntry = {\n timestamp: new Date().toISOString(),\n level,\n phase,\n data,\n requestId: requestId || currentRequest?.id,\n elapsed: currentRequest ? Date.now() - currentRequest.startTime : undefined,\n }\n\n writeToFile(DEBUG_PATHS.detailed(), entry)\n\n switch (level) {\n case LogLevel.FLOW:\n writeToFile(DEBUG_PATHS.flow(), entry)\n break\n case LogLevel.API:\n writeToFile(DEBUG_PATHS.api(), entry)\n break\n case LogLevel.STATE:\n writeToFile(DEBUG_PATHS.state(), entry)\n break\n }\n\n logToTerminal(entry)\n}\n\nexport const debug = {\n flow: (phase: string, data: any, requestId?: string) =>\n debugLog(LogLevel.FLOW, phase, data, requestId),\n\n api: (phase: string, data: any, requestId?: string) =>\n debugLog(LogLevel.API, phase, data, requestId),\n\n state: (phase: string, data: any, requestId?: string) =>\n debugLog(LogLevel.STATE, phase, data, requestId),\n\n info: (phase: string, data: any, requestId?: string) =>\n debugLog(LogLevel.INFO, phase, data, requestId),\n\n warn: (phase: string, data: any, requestId?: string) =>\n debugLog(LogLevel.WARN, phase, data, requestId),\n\n error: (phase: string, data: any, requestId?: string) =>\n debugLog(LogLevel.ERROR, phase, data, requestId),\n\n trace: (phase: string, data: any, requestId?: string) =>\n debugLog(LogLevel.TRACE, phase, data, requestId),\n\n ui: (phase: string, data: any, requestId?: string) =>\n debugLog(LogLevel.STATE, `UI_${phase}`, data, requestId),\n}\n\nexport function startRequest(): RequestContext {\n const ctx = new RequestContext()\n currentRequest = ctx\n activeRequests.set(ctx.id, ctx)\n\n debug.flow('REQUEST_START', {\n requestId: ctx.id,\n activeRequests: activeRequests.size,\n })\n\n return ctx\n}\n\nexport function endRequest(ctx?: RequestContext) {\n const request = ctx || currentRequest\n if (!request) return\n\n debug.flow('REQUEST_END', {\n requestId: request.id,\n totalTime: Date.now() - request.startTime,\n phases: request.getAllPhases(),\n })\n\n activeRequests.delete(request.id)\n if (currentRequest === request) {\n currentRequest = null\n }\n}\n\nexport function getCurrentRequest(): RequestContext | null {\n return currentRequest\n}\n\nexport function markPhase(phase: string, data?: any) {\n if (!currentRequest) return\n\n currentRequest.markPhase(phase)\n debug.flow(`PHASE_${phase.toUpperCase()}`, {\n requestId: currentRequest.id,\n elapsed: currentRequest.getPhaseTime(phase),\n data,\n })\n}\n\nexport function logReminderEvent(\n eventType: string,\n reminderData: any,\n agentId?: string,\n) {\n if (!isDebugMode()) return\n\n debug.info('REMINDER_EVENT_TRIGGERED', {\n eventType,\n agentId: agentId || 'default',\n reminderType: reminderData.type || 'unknown',\n reminderCategory: reminderData.category || 'general',\n reminderPriority: reminderData.priority || 'medium',\n contentLength: reminderData.content ? reminderData.content.length : 0,\n timestamp: Date.now(),\n })\n}\n\nexport function logAPIError(context: {\n model: string\n endpoint: string\n status: number\n error: any\n request?: any\n response?: any\n provider?: string\n}) {\n const errorDir = join(PYB_DIR, 'logs', 'error', 'api')\n\n if (!existsSync(errorDir)) {\n try {\n mkdirSync(errorDir, { recursive: true })\n } catch (err) {\n terminalLog('Failed to create error log directory:', err)\n return\n }\n }\n\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-')\n const sanitizedModel = context.model.replace(/[^a-zA-Z0-9-_]/g, '_')\n const filename = `${sanitizedModel}_${timestamp}.log`\n const filepath = join(errorDir, filename)\n\n const fullLogContent = {\n timestamp: new Date().toISOString(),\n sessionId: SESSION_ID,\n requestId: getCurrentRequest()?.id,\n model: context.model,\n provider: context.provider,\n endpoint: context.endpoint,\n status: context.status,\n error: context.error,\n request: context.request,\n response: context.response,\n environment: {\n nodeVersion: process.version,\n platform: process.platform,\n cwd: process.cwd(),\n },\n }\n\n try {\n appendFileSync(filepath, JSON.stringify(fullLogContent, null, 2) + '\\n')\n appendFileSync(filepath, '='.repeat(80) + '\\n\\n')\n } catch (err) {\n terminalLog('Failed to write API error log:', err)\n }\n\n if (isDebugMode()) {\n debug.error('API_ERROR', {\n model: context.model,\n status: context.status,\n error:\n typeof context.error === 'string'\n ? context.error\n : context.error?.message || 'Unknown error',\n endpoint: context.endpoint,\n logFile: filename,\n })\n }\n\n if (isVerboseMode() || isDebugVerboseMode()) {\n terminalLog()\n terminalLog(chalk.red('\u2501'.repeat(60)))\n terminalLog(chalk.red.bold('\u26A0\uFE0F API Error'))\n terminalLog(chalk.red('\u2501'.repeat(60)))\n\n terminalLog(chalk.white(' Model: ') + chalk.yellow(context.model))\n terminalLog(chalk.white(' Status: ') + chalk.red(context.status))\n\n let errorMessage = 'Unknown error'\n if (typeof context.error === 'string') {\n errorMessage = context.error\n } else if (context.error?.message) {\n errorMessage = context.error.message\n } else if (context.error?.error?.message) {\n errorMessage = context.error.error.message\n }\n\n terminalLog(chalk.white(' Error: ') + chalk.red(errorMessage))\n\n if (context.response) {\n terminalLog()\n terminalLog(chalk.gray(' Response:'))\n const responseStr =\n typeof context.response === 'string'\n ? context.response\n : JSON.stringify(context.response, null, 2)\n\n responseStr.split('\\n').forEach(line => {\n terminalLog(chalk.gray(' ' + line))\n })\n }\n\n terminalLog()\n terminalLog(chalk.dim(` \uD83D\uDCC1 Full log: ${filepath}`))\n terminalLog(chalk.red('\u2501'.repeat(60)))\n terminalLog()\n }\n}\n\nexport function logLLMInteraction(context: {\n systemPrompt: string\n messages: any[]\n response: any\n usage?: { inputTokens: number; outputTokens: number }\n timing: { start: number; end: number }\n apiFormat?: 'anthropic' | 'openai'\n}) {\n if (!isDebugMode()) return\n\n const duration = context.timing.end - context.timing.start\n\n terminalLog('\\n' + chalk.blue('\uD83E\uDDE0 LLM CALL DEBUG'))\n terminalLog(chalk.gray('\u2501'.repeat(60)))\n\n terminalLog(chalk.yellow('\uD83D\uDCCA Context Overview:'))\n terminalLog(` Messages Count: ${context.messages.length}`)\n terminalLog(` System Prompt Length: ${context.systemPrompt.length} chars`)\n terminalLog(` Duration: ${duration.toFixed(0)}ms`)\n\n if (context.usage) {\n terminalLog(\n ` Token Usage: ${context.usage.inputTokens} \u2192 ${context.usage.outputTokens}`,\n )\n }\n\n const apiLabel = context.apiFormat\n ? ` (${context.apiFormat.toUpperCase()})`\n : ''\n terminalLog(chalk.cyan(`\\n\uD83D\uDCAC Real API Messages${apiLabel} (last 10):`))\n\n const recentMessages = context.messages.slice(-10)\n recentMessages.forEach((msg, index) => {\n const globalIndex = context.messages.length - recentMessages.length + index\n const roleColor =\n msg.role === 'user'\n ? 'green'\n : msg.role === 'assistant'\n ? 'blue'\n : msg.role === 'system'\n ? 'yellow'\n : 'gray'\n\n let content = ''\n let isReminder = false\n\n if (typeof msg.content === 'string') {\n if (msg.content.includes('<system-reminder>')) {\n isReminder = true\n const reminderContent = msg.content\n .replace(/<\\/?system-reminder>/g, '')\n .trim()\n content = `\uD83D\uDD14 ${reminderContent.length > 800 ? reminderContent.substring(0, 800) + '...' : reminderContent}`\n } else {\n const maxLength =\n msg.role === 'user' ? 1000 : msg.role === 'system' ? 1200 : 800\n content =\n msg.content.length > maxLength\n ? msg.content.substring(0, maxLength) + '...'\n : msg.content\n }\n } else if (Array.isArray(msg.content)) {\n const textBlocks = msg.content.filter(\n (block: any) => block.type === 'text',\n )\n const toolBlocks = msg.content.filter(\n (block: any) => block.type === 'tool_use',\n )\n if (textBlocks.length > 0) {\n const text = textBlocks[0].text || ''\n const maxLength = msg.role === 'assistant' ? 1000 : 800\n content =\n text.length > maxLength ? text.substring(0, maxLength) + '...' : text\n }\n if (toolBlocks.length > 0) {\n content += ` [+ ${toolBlocks.length} tool calls]`\n }\n if (textBlocks.length === 0 && toolBlocks.length === 0) {\n content = `[${msg.content.length} blocks: ${msg.content.map(b => b.type || 'unknown').join(', ')}]`\n }\n } else {\n content = '[complex_content]'\n }\n\n if (isReminder) {\n terminalLog(\n ` [${globalIndex}] ${chalk.magenta('\uD83D\uDD14 REMINDER')}: ${chalk.dim(content)}`,\n )\n } else {\n const roleIcon =\n msg.role === 'user'\n ? '\uD83D\uDC64'\n : msg.role === 'assistant'\n ? '\uD83E\uDD16'\n : msg.role === 'system'\n ? '\u2699\uFE0F'\n : '\uD83D\uDCC4'\n terminalLog(\n ` [${globalIndex}] ${(chalk as any)[roleColor](roleIcon + ' ' + msg.role.toUpperCase())}: ${content}`,\n )\n }\n\n if (msg.role === 'assistant' && Array.isArray(msg.content)) {\n const toolCalls = msg.content.filter(\n (block: any) => block.type === 'tool_use',\n )\n if (toolCalls.length > 0) {\n terminalLog(\n chalk.cyan(\n ` \uD83D\uDD27 \u2192 Tool calls (${toolCalls.length}): ${toolCalls.map((t: any) => t.name).join(', ')}`,\n ),\n )\n toolCalls.forEach((tool: any, idx: number) => {\n const inputStr = JSON.stringify(tool.input || {})\n const maxLength = 200\n const displayInput =\n inputStr.length > maxLength\n ? inputStr.substring(0, maxLength) + '...'\n : inputStr\n terminalLog(\n chalk.dim(` [${idx}] ${tool.name}: ${displayInput}`),\n )\n })\n }\n }\n if (msg.tool_calls && msg.tool_calls.length > 0) {\n terminalLog(\n chalk.cyan(\n ` \uD83D\uDD27 \u2192 Tool calls (${msg.tool_calls.length}): ${msg.tool_calls.map((t: any) => t.function.name).join(', ')}`,\n ),\n )\n msg.tool_calls.forEach((tool: any, idx: number) => {\n const inputStr = tool.function.arguments || '{}'\n const maxLength = 200\n const displayInput =\n inputStr.length > maxLength\n ? inputStr.substring(0, maxLength) + '...'\n : inputStr\n terminalLog(\n chalk.dim(` [${idx}] ${tool.function.name}: ${displayInput}`),\n )\n })\n }\n })\n\n terminalLog(chalk.magenta('\\n\uD83E\uDD16 LLM Response:'))\n\n let responseContent = ''\n let toolCalls: any[] = []\n\n if (Array.isArray(context.response.content)) {\n const textBlocks = context.response.content.filter(\n (block: any) => block.type === 'text',\n )\n responseContent = textBlocks.length > 0 ? textBlocks[0].text || '' : ''\n toolCalls = context.response.content.filter(\n (block: any) => block.type === 'tool_use',\n )\n } else if (typeof context.response.content === 'string') {\n responseContent = context.response.content\n toolCalls = context.response.tool_calls || context.response.toolCalls || []\n } else if (context.response.message?.content) {\n if (Array.isArray(context.response.message.content)) {\n const textBlocks = context.response.message.content.filter(\n (block: any) => block.type === 'text',\n )\n responseContent = textBlocks.length > 0 ? textBlocks[0].text || '' : ''\n toolCalls = context.response.message.content.filter(\n (block: any) => block.type === 'tool_use',\n )\n } else if (typeof context.response.message.content === 'string') {\n responseContent = context.response.message.content\n }\n } else {\n responseContent = JSON.stringify(\n context.response.content || context.response || '',\n )\n }\n\n const maxResponseLength = 1000\n const displayContent =\n responseContent.length > maxResponseLength\n ? responseContent.substring(0, maxResponseLength) + '...'\n : responseContent\n terminalLog(` Content: ${displayContent}`)\n\n if (toolCalls.length > 0) {\n const toolNames = toolCalls.map(\n (t: any) => t.name || t.function?.name || 'unknown',\n )\n terminalLog(\n chalk.cyan(\n ` \uD83D\uDD27 Tool Calls (${toolCalls.length}): ${toolNames.join(', ')}`,\n ),\n )\n toolCalls.forEach((tool: any, index: number) => {\n const toolName = tool.name || tool.function?.name || 'unknown'\n const toolInput = tool.input || tool.function?.arguments || '{}'\n const inputStr =\n typeof toolInput === 'string' ? toolInput : JSON.stringify(toolInput)\n const maxToolInputLength = 300\n const displayInput =\n inputStr.length > maxToolInputLength\n ? inputStr.substring(0, maxToolInputLength) + '...'\n : inputStr\n terminalLog(chalk.dim(` [${index}] ${toolName}: ${displayInput}`))\n })\n }\n\n terminalLog(\n ` Stop Reason: ${context.response.stop_reason || context.response.finish_reason || 'unknown'}`,\n )\n terminalLog(chalk.gray('\u2501'.repeat(60)))\n}\n\nexport function logSystemPromptConstruction(construction: {\n basePrompt: string\n pybContext?: string\n reminders: string[]\n finalPrompt: string\n}) {\n if (!isDebugMode()) return\n\n terminalLog('\\n' + chalk.yellow('\uD83D\uDCDD SYSTEM PROMPT CONSTRUCTION'))\n terminalLog(` Base Prompt: ${construction.basePrompt.length} chars`)\n\n if (construction.pybContext) {\n terminalLog(` + Pyb Context: ${construction.pybContext.length} chars`)\n }\n\n if (construction.reminders.length > 0) {\n terminalLog(\n ` + Dynamic Reminders: ${construction.reminders.length} items`,\n )\n construction.reminders.forEach((reminder, index) => {\n terminalLog(chalk.dim(` [${index}] ${reminder.substring(0, 80)}...`))\n })\n }\n\n terminalLog(` = Final Length: ${construction.finalPrompt.length} chars`)\n}\n\nexport function logContextCompression(compression: {\n beforeMessages: number\n afterMessages: number\n trigger: string\n preservedFiles: string[]\n compressionRatio: number\n}) {\n if (!isDebugMode()) return\n\n terminalLog('\\n' + chalk.red('\uD83D\uDDDC\uFE0F CONTEXT COMPRESSION'))\n terminalLog(` Trigger: ${compression.trigger}`)\n terminalLog(\n ` Messages: ${compression.beforeMessages} \u2192 ${compression.afterMessages}`,\n )\n terminalLog(\n ` Compression Ratio: ${(compression.compressionRatio * 100).toFixed(1)}%`,\n )\n\n if (compression.preservedFiles.length > 0) {\n terminalLog(` Preserved Files: ${compression.preservedFiles.join(', ')}`)\n }\n}\n\nexport function logUserFriendly(type: string, data: any, requestId?: string) {\n if (!isDebugMode()) return\n\n const timestamp = new Date().toLocaleTimeString()\n let message = ''\n let color = chalk.gray\n let icon = '\u2022'\n\n switch (type) {\n case 'SESSION_START':\n icon = '\uD83D\uDE80'\n color = chalk.green\n message = `Session started with ${data.model || 'default model'}`\n break\n case 'QUERY_START':\n icon = '\uD83D\uDCAD'\n color = chalk.blue\n message = `Processing query: \"${data.query?.substring(0, 50)}${data.query?.length > 50 ? '...' : ''}\"`\n break\n case 'QUERY_PROGRESS':\n icon = '\u23F3'\n color = chalk.yellow\n message = `${data.phase} (${data.elapsed}ms)`\n break\n case 'QUERY_COMPLETE':\n icon = '\u2705'\n color = chalk.green\n message = `Query completed in ${data.duration}ms - Cost: $${data.cost} - ${data.tokens} tokens`\n break\n case 'TOOL_EXECUTION':\n icon = '\uD83D\uDD27'\n color = chalk.cyan\n message = `${data.toolName}: ${data.action} ${data.target ? '\u2192 ' + data.target : ''}`\n break\n case 'ERROR_OCCURRED':\n icon = '\u274C'\n color = chalk.red\n message = `${data.error} ${data.context ? '(' + data.context + ')' : ''}`\n break\n case 'PERFORMANCE_SUMMARY':\n icon = '\uD83D\uDCCA'\n color = chalk.magenta\n message = `Session: ${data.queries} queries, $${data.totalCost}, ${data.avgResponseTime}ms avg`\n break\n default:\n message = JSON.stringify(data)\n }\n\n const reqId = requestId ? chalk.dim(`[${requestId.slice(0, 8)}]`) : ''\n terminalLog(`${color(`[${timestamp}]`)} ${icon} ${color(message)} ${reqId}`)\n}\n\nexport function initDebugLogger() {\n if (!isDebugMode()) return\n\n debug.info('DEBUG_LOGGER_INIT', {\n startupTimestamp: STARTUP_TIMESTAMP,\n sessionId: SESSION_ID,\n debugPaths: {\n detailed: DEBUG_PATHS.detailed(),\n flow: DEBUG_PATHS.flow(),\n api: DEBUG_PATHS.api(),\n state: DEBUG_PATHS.state(),\n },\n })\n\n const terminalLevels = isDebugVerboseMode()\n ? Array.from(DEBUG_VERBOSE_TERMINAL_LOG_LEVELS).join(', ')\n : Array.from(TERMINAL_LOG_LEVELS).join(', ')\n\n terminalLog(\n chalk.dim(`[DEBUG] Terminal output filtered to: ${terminalLevels}`),\n )\n terminalLog(\n chalk.dim(`[DEBUG] Complete logs saved to: ${DEBUG_PATHS.base()}`),\n )\n if (!isDebugVerboseMode()) {\n terminalLog(\n chalk.dim(\n `[DEBUG] Use --debug-verbose for detailed system logs (FLOW, API, STATE)`,\n ),\n )\n }\n}\n\ninterface ErrorDiagnosis {\n errorType: string\n category:\n | 'NETWORK'\n | 'API'\n | 'PERMISSION'\n | 'CONFIG'\n | 'SYSTEM'\n | 'USER_INPUT'\n severity: 'LOW' | 'MEDIUM' | 'HIGH' | 'CRITICAL'\n description: string\n suggestions: string[]\n debugSteps: string[]\n relatedLogs?: string[]\n}\n\nexport function diagnoseError(error: any, context?: any): ErrorDiagnosis {\n const errorMessage = error instanceof Error ? error.message : String(error)\n const errorStack = error instanceof Error ? error.stack : undefined\n\n if (\n errorMessage.includes('aborted') ||\n errorMessage.includes('AbortController')\n ) {\n return {\n errorType: 'REQUEST_ABORTED',\n category: 'SYSTEM',\n severity: 'MEDIUM',\n description:\n 'Request was aborted, often due to user cancellation or timeout',\n suggestions: [\n '\u68C0\u67E5\u662F\u5426\u6309\u4E0B\u4E86 ESC \u952E\u53D6\u6D88\u8BF7\u6C42',\n '\u68C0\u67E5\u7F51\u7EDC\u8FDE\u63A5\u662F\u5426\u7A33\u5B9A',\n '\u9A8C\u8BC1 AbortController \u72B6\u6001: isActive \u548C signal.aborted \u5E94\u8BE5\u4E00\u81F4',\n '\u67E5\u770B\u662F\u5426\u6709\u91CD\u590D\u7684\u8BF7\u6C42\u5BFC\u81F4\u51B2\u7A81',\n ],\n debugSteps: [\n '\u4F7F\u7528 --debug-verbose \u6A21\u5F0F\u67E5\u770B\u8BE6\u7EC6\u7684\u8BF7\u6C42\u6D41\u7A0B',\n '\u68C0\u67E5 debug \u65E5\u5FD7\u4E2D\u7684 BINARY_FEEDBACK_* \u4E8B\u4EF6',\n '\u9A8C\u8BC1 REQUEST_START \u548C REQUEST_END \u65E5\u5FD7\u914D\u5BF9',\n '\u67E5\u770B QUERY_ABORTED \u4E8B\u4EF6\u7684\u89E6\u53D1\u539F\u56E0',\n ],\n }\n }\n\n if (\n errorMessage.includes('api-key') ||\n errorMessage.includes('authentication') ||\n errorMessage.includes('401')\n ) {\n return {\n errorType: 'API_AUTHENTICATION',\n category: 'API',\n severity: 'HIGH',\n description: 'API authentication failed - invalid or missing API key',\n suggestions: [\n '\u8FD0\u884C /login \u91CD\u65B0\u8BBE\u7F6E API \u5BC6\u94A5',\n '\u68C0\u67E5 ~/.pyb/ \u914D\u7F6E\u6587\u4EF6\u4E2D\u7684 API \u5BC6\u94A5',\n '\u9A8C\u8BC1 API \u5BC6\u94A5\u662F\u5426\u5DF2\u8FC7\u671F\u6216\u88AB\u64A4\u9500',\n '\u786E\u8BA4\u4F7F\u7528\u7684 provider \u8BBE\u7F6E\u6B63\u786E (anthropic/opendev/bigdream)',\n ],\n debugSteps: [\n '\u68C0\u67E5 CONFIG_LOAD \u65E5\u5FD7\u4E2D\u7684 provider \u548C API \u5BC6\u94A5\u72B6\u6001',\n '\u8FD0\u884C pyb doctor \u68C0\u67E5\u7CFB\u7EDF\u5065\u5EB7\u72B6\u6001',\n '\u67E5\u770B API_ERROR \u65E5\u5FD7\u4E86\u89E3\u8BE6\u7EC6\u9519\u8BEF\u4FE1\u606F',\n '\u4F7F\u7528 pyb config \u547D\u4EE4\u67E5\u770B\u5F53\u524D\u914D\u7F6E',\n ],\n }\n }\n\n if (\n errorMessage.includes('ECONNREFUSED') ||\n errorMessage.includes('ENOTFOUND') ||\n errorMessage.includes('timeout')\n ) {\n return {\n errorType: 'NETWORK_CONNECTION',\n category: 'NETWORK',\n severity: 'HIGH',\n description: 'Network connection failed - unable to reach API endpoint',\n suggestions: [\n '\u68C0\u67E5\u7F51\u7EDC\u8FDE\u63A5\u662F\u5426\u6B63\u5E38',\n '\u786E\u8BA4\u9632\u706B\u5899\u6CA1\u6709\u963B\u6B62\u76F8\u5173\u7AEF\u53E3',\n '\u68C0\u67E5 proxy \u8BBE\u7F6E\u662F\u5426\u6B63\u786E',\n '\u5C1D\u8BD5\u5207\u6362\u5230\u4E0D\u540C\u7684\u7F51\u7EDC\u73AF\u5883',\n '\u9A8C\u8BC1 baseURL \u914D\u7F6E\u662F\u5426\u6B63\u786E',\n ],\n debugSteps: [\n '\u68C0\u67E5 API_REQUEST_START \u548C\u76F8\u5173\u7F51\u7EDC\u65E5\u5FD7',\n '\u67E5\u770B LLM_REQUEST_ERROR \u4E2D\u7684\u8BE6\u7EC6\u9519\u8BEF\u4FE1\u606F',\n '\u4F7F\u7528 ping \u6216 curl \u6D4B\u8BD5 API \u7AEF\u70B9\u8FDE\u901A\u6027',\n '\u68C0\u67E5\u4F01\u4E1A\u7F51\u7EDC\u662F\u5426\u9700\u8981\u4EE3\u7406\u8BBE\u7F6E',\n ],\n }\n }\n\n if (\n errorMessage.includes('permission') ||\n errorMessage.includes('EACCES') ||\n errorMessage.includes('denied')\n ) {\n return {\n errorType: 'PERMISSION_DENIED',\n category: 'PERMISSION',\n severity: 'MEDIUM',\n description: 'Permission denied - insufficient access rights',\n suggestions: [\n '\u68C0\u67E5\u6587\u4EF6\u548C\u76EE\u5F55\u7684\u8BFB\u5199\u6743\u9650',\n '\u786E\u8BA4\u5F53\u524D\u7528\u6237\u6709\u8DB3\u591F\u7684\u7CFB\u7EDF\u6743\u9650',\n '\u67E5\u770B\u662F\u5426\u9700\u8981\u7BA1\u7406\u5458\u6743\u9650\u8FD0\u884C',\n '\u68C0\u67E5\u5DE5\u5177\u6743\u9650\u8BBE\u7F6E\u662F\u5426\u6B63\u786E\u914D\u7F6E',\n ],\n debugSteps: [\n '\u67E5\u770B PERMISSION_* \u65E5\u5FD7\u4E86\u89E3\u6743\u9650\u68C0\u67E5\u8FC7\u7A0B',\n '\u68C0\u67E5\u6587\u4EF6\u7CFB\u7EDF\u6743\u9650: ls -la',\n '\u9A8C\u8BC1\u5DE5\u5177\u5BA1\u6279\u72B6\u6001',\n '\u67E5\u770B TOOL_* \u76F8\u5173\u7684\u8C03\u8BD5\u65E5\u5FD7',\n ],\n }\n }\n\n if (\n errorMessage.includes('substring is not a function') ||\n errorMessage.includes('content')\n ) {\n return {\n errorType: 'RESPONSE_FORMAT',\n category: 'API',\n severity: 'MEDIUM',\n description: 'LLM response format mismatch between different providers',\n suggestions: [\n '\u68C0\u67E5\u5F53\u524D\u4F7F\u7528\u7684 provider \u662F\u5426\u4E0E\u671F\u671B\u4E00\u81F4',\n '\u9A8C\u8BC1\u54CD\u5E94\u683C\u5F0F\u5904\u7406\u903B\u8F91',\n '\u786E\u8BA4\u4E0D\u540C provider \u7684\u54CD\u5E94\u683C\u5F0F\u5DEE\u5F02',\n '\u68C0\u67E5\u662F\u5426\u9700\u8981\u66F4\u65B0\u54CD\u5E94\u89E3\u6790\u4EE3\u7801',\n ],\n debugSteps: [\n '\u67E5\u770B LLM_CALL_DEBUG \u4E2D\u7684\u54CD\u5E94\u683C\u5F0F',\n '\u68C0\u67E5 provider \u914D\u7F6E\u548C\u5B9E\u9645\u4F7F\u7528\u7684 API',\n '\u5BF9\u6BD4 Anthropic \u548C OpenAI \u54CD\u5E94\u683C\u5F0F\u5DEE\u5F02',\n '\u9A8C\u8BC1 logLLMInteraction \u51FD\u6570\u7684\u683C\u5F0F\u5904\u7406',\n ],\n }\n }\n\n if (\n errorMessage.includes('too long') ||\n errorMessage.includes('context') ||\n errorMessage.includes('token')\n ) {\n return {\n errorType: 'CONTEXT_OVERFLOW',\n category: 'SYSTEM',\n severity: 'MEDIUM',\n description: 'Context window exceeded - conversation too long',\n suggestions: [\n '\u8FD0\u884C /compact \u624B\u52A8\u538B\u7F29\u5BF9\u8BDD\u5386\u53F2',\n '\u68C0\u67E5\u81EA\u52A8\u538B\u7F29\u8BBE\u7F6E\u662F\u5426\u6B63\u786E\u914D\u7F6E',\n '\u51CF\u5C11\u5355\u6B21\u8F93\u5165\u7684\u5185\u5BB9\u957F\u5EA6',\n '\u6E05\u7406\u4E0D\u5FC5\u8981\u7684\u4E0A\u4E0B\u6587\u4FE1\u606F',\n ],\n debugSteps: [\n '\u67E5\u770B AUTO_COMPACT_* \u65E5\u5FD7\u68C0\u67E5\u538B\u7F29\u89E6\u53D1',\n '\u68C0\u67E5 token \u4F7F\u7528\u91CF\u548C\u9608\u503C',\n '\u67E5\u770B CONTEXT_COMPRESSION \u76F8\u5173\u65E5\u5FD7',\n '\u9A8C\u8BC1\u6A21\u578B\u7684\u6700\u5927 token \u9650\u5236',\n ],\n }\n }\n\n if (\n errorMessage.includes('config') ||\n (errorMessage.includes('undefined') && context?.configRelated)\n ) {\n return {\n errorType: 'CONFIGURATION',\n category: 'CONFIG',\n severity: 'MEDIUM',\n description: 'Configuration error - missing or invalid settings',\n suggestions: [\n '\u8FD0\u884C pyb config \u68C0\u67E5\u914D\u7F6E\u8BBE\u7F6E',\n '\u5220\u9664\u635F\u574F\u7684\u914D\u7F6E\u6587\u4EF6\u91CD\u65B0\u521D\u59CB\u5316',\n '\u68C0\u67E5 JSON \u914D\u7F6E\u6587\u4EF6\u8BED\u6CD5\u662F\u5426\u6B63\u786E',\n '\u9A8C\u8BC1\u73AF\u5883\u53D8\u91CF\u8BBE\u7F6E',\n ],\n debugSteps: [\n '\u67E5\u770B CONFIG_LOAD \u548C CONFIG_SAVE \u65E5\u5FD7',\n '\u68C0\u67E5\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\u548C\u6743\u9650',\n '\u9A8C\u8BC1 JSON \u683C\u5F0F: cat ~/.pyb/config.json | jq',\n '\u67E5\u770B\u914D\u7F6E\u7F13\u5B58\u76F8\u5173\u7684\u8C03\u8BD5\u4FE1\u606F',\n ],\n }\n }\n\n return {\n errorType: 'UNKNOWN',\n category: 'SYSTEM',\n severity: 'MEDIUM',\n description: `Unexpected error: ${errorMessage}`,\n suggestions: [\n '\u91CD\u65B0\u542F\u52A8\u5E94\u7528\u7A0B\u5E8F',\n '\u68C0\u67E5\u7CFB\u7EDF\u8D44\u6E90\u662F\u5426\u5145\u8DB3',\n '\u67E5\u770B\u5B8C\u6574\u7684\u9519\u8BEF\u65E5\u5FD7\u83B7\u53D6\u66F4\u591A\u4FE1\u606F',\n '\u5982\u679C\u95EE\u9898\u6301\u7EED\uFF0C\u8BF7\u62A5\u544A\u6B64\u9519\u8BEF',\n ],\n debugSteps: [\n '\u4F7F\u7528 --debug-verbose \u83B7\u53D6\u8BE6\u7EC6\u65E5\u5FD7',\n '\u68C0\u67E5 error.log \u4E2D\u7684\u5B8C\u6574\u9519\u8BEF\u4FE1\u606F',\n '\u67E5\u770B\u7CFB\u7EDF\u8D44\u6E90\u4F7F\u7528\u60C5\u51B5',\n '\u6536\u96C6\u91CD\u73B0\u6B65\u9AA4\u548C\u73AF\u5883\u4FE1\u606F',\n ],\n relatedLogs: errorStack ? [errorStack] : undefined,\n }\n}\n\nexport function logErrorWithDiagnosis(\n error: any,\n context?: any,\n requestId?: string,\n) {\n if (!isDebugMode()) return\n\n const diagnosis = diagnoseError(error, context)\n const errorMessage = error instanceof Error ? error.message : String(error)\n\n debug.error(\n 'ERROR_OCCURRED',\n {\n error: errorMessage,\n errorType: diagnosis.errorType,\n category: diagnosis.category,\n severity: diagnosis.severity,\n context,\n },\n requestId,\n )\n\n terminalLog('\\n' + chalk.red('\uD83D\uDEA8 ERROR DIAGNOSIS'))\n terminalLog(chalk.gray('\u2501'.repeat(60)))\n\n terminalLog(chalk.red(`\u274C ${diagnosis.errorType}`))\n terminalLog(\n chalk.dim(\n `Category: ${diagnosis.category} | Severity: ${diagnosis.severity}`,\n ),\n )\n terminalLog(`\\n${diagnosis.description}`)\n\n terminalLog(chalk.yellow('\\n\uD83D\uDCA1 Recovery Suggestions:'))\n diagnosis.suggestions.forEach((suggestion, index) => {\n terminalLog(` ${index + 1}. ${suggestion}`)\n })\n\n terminalLog(chalk.cyan('\\n\uD83D\uDD0D Debug Steps:'))\n diagnosis.debugSteps.forEach((step, index) => {\n terminalLog(` ${index + 1}. ${step}`)\n })\n\n if (diagnosis.relatedLogs && diagnosis.relatedLogs.length > 0) {\n terminalLog(chalk.magenta('\\n\uD83D\uDCCB Related Information:'))\n diagnosis.relatedLogs.forEach((log, index) => {\n const truncatedLog =\n log.length > 200 ? log.substring(0, 200) + '...' : log\n terminalLog(chalk.dim(` ${truncatedLog}`))\n })\n }\n\n const debugPath = DEBUG_PATHS.base()\n terminalLog(chalk.gray(`\\n\uD83D\uDCC1 Complete logs: ${debugPath}`))\n terminalLog(chalk.gray('\u2501'.repeat(60)))\n}\nexport function getDebugInfo() {\n return {\n isDebugMode: isDebugMode(),\n isVerboseMode: isVerboseMode(),\n isDebugVerboseMode: isDebugVerboseMode(),\n startupTimestamp: STARTUP_TIMESTAMP,\n sessionId: SESSION_ID,\n currentRequest: currentRequest?.id,\n activeRequests: Array.from(activeRequests.keys()),\n terminalLogLevels: isDebugVerboseMode()\n ? Array.from(DEBUG_VERBOSE_TERMINAL_LOG_LEVELS)\n : Array.from(TERMINAL_LOG_LEVELS),\n debugPaths: {\n detailed: DEBUG_PATHS.detailed(),\n flow: DEBUG_PATHS.flow(),\n api: DEBUG_PATHS.api(),\n state: DEBUG_PATHS.state(),\n },\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["toolCalls"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/services/plugins/customCommands.ts"],
4
- "sourcesContent": ["import { existsSync, readFileSync, readdirSync, statSync } from 'fs'\nimport { basename, dirname, join, relative, resolve, sep } from 'path'\nimport { homedir } from 'os'\nimport { memoize } from 'lodash-es'\nimport type { MessageParam } from '@anthropic-ai/sdk/resources/index.mjs'\nimport type { Command } from '@commands'\nimport { getCwd } from '@utils/state'\nimport { getSessionPlugins } from '@utils/session/sessionPlugins'\nimport { getPybBaseDir } from '@utils/config/env'\nimport { debug as debugLogger } from '@utils/log/debugLogger'\nimport { logError } from '@utils/log'\nimport { execFile } from 'child_process'\nimport { promisify } from 'util'\nimport matter from 'gray-matter'\nimport yaml from 'js-yaml'\n\nconst execFileAsync = promisify(execFile)\n\nexport async function executeBashCommands(content: string): Promise<string> {\n const bashCommandRegex = /!\\`([^`]+)\\`/g\n const matches = [...content.matchAll(bashCommandRegex)]\n\n if (matches.length === 0) {\n return content\n }\n\n let result = content\n\n for (const match of matches) {\n const fullMatch = match[0]\n const command = match[1].trim()\n\n try {\n const parts = command.split(/\\s+/)\n const cmd = parts[0]\n const args = parts.slice(1)\n\n const { stdout, stderr } = await execFileAsync(cmd, args, {\n timeout: 5000,\n encoding: 'utf8',\n cwd: getCwd(),\n })\n\n const output = stdout.trim() || stderr.trim() || '(no output)'\n result = result.replace(fullMatch, output)\n } catch (error) {\n logError(error)\n debugLogger.warn('CUSTOM_COMMAND_BASH_EXEC_FAILED', {\n command,\n error: error instanceof Error ? error.message : String(error),\n })\n result = result.replace(fullMatch, `(error executing: ${command})`)\n }\n }\n\n return result\n}\n\nexport async function resolveFileReferences(content: string): Promise<string> {\n const fileRefRegex = /@([a-zA-Z0-9/._-]+(?:\\.[a-zA-Z0-9]+)?)/g\n const matches = [...content.matchAll(fileRefRegex)]\n\n if (matches.length === 0) {\n return content\n }\n\n let result = content\n\n for (const match of matches) {\n const fullMatch = match[0]\n const filePath = match[1]\n\n if (filePath.startsWith('agent-')) {\n continue\n }\n\n try {\n const fullPath = join(getCwd(), filePath)\n\n if (existsSync(fullPath)) {\n const fileContent = readFileSync(fullPath, { encoding: 'utf-8' })\n\n const formattedContent = `\\n\\n## File: ${filePath}\\n\\`\\`\\`\\n${fileContent}\\n\\`\\`\\`\\n`\n result = result.replace(fullMatch, formattedContent)\n } else {\n result = result.replace(fullMatch, `(file not found: ${filePath})`)\n }\n } catch (error) {\n logError(error)\n debugLogger.warn('CUSTOM_COMMAND_FILE_READ_FAILED', {\n filePath,\n error: error instanceof Error ? error.message : String(error),\n })\n result = result.replace(fullMatch, `(error reading: ${filePath})`)\n }\n }\n\n return result\n}\n\nexport interface CustomCommandFrontmatter {\n description?: string\n 'allowed-tools'?: string[]\n 'argument-hint'?: string\n when_to_use?: string\n version?: string\n model?: string\n maxThinkingTokens?: number | string\n max_thinking_tokens?: number | string\n 'max-thinking-tokens'?: number | string\n name?: string\n 'disable-model-invocation'?: boolean | string\n}\n\nexport interface CustomCommandWithScope {\n type: 'prompt'\n name: string\n description: string\n isEnabled: boolean\n isHidden: boolean\n aliases?: string[]\n progressMessage: string\n userFacingName(): string\n getPromptForCommand(args: string): Promise<MessageParam[]>\n allowedTools?: string[]\n maxThinkingTokens?: number\n argumentHint?: string\n whenToUse?: string\n version?: string\n model?: string\n isSkill?: boolean\n disableModelInvocation?: boolean\n hasUserSpecifiedDescription?: boolean\n source?: 'localSettings' | 'userSettings' | 'pluginDir'\n scope?: 'user' | 'project'\n filePath?: string\n}\n\nexport interface CustomCommandFile {\n frontmatter: CustomCommandFrontmatter\n content: string\n filePath: string\n}\n\nexport function parseFrontmatter(content: string): {\n frontmatter: CustomCommandFrontmatter\n content: string\n} {\n const yamlSchema = (yaml as any).JSON_SCHEMA\n const parsed = matter(content, {\n engines: {\n yaml: {\n parse: (input: string) =>\n yaml.load(input, yamlSchema ? { schema: yamlSchema } : undefined) ??\n {},\n },\n },\n })\n return {\n frontmatter: (parsed.data ?? {}) as CustomCommandFrontmatter,\n content: parsed.content ?? '',\n }\n}\n\ntype CommandSource = 'localSettings' | 'userSettings' | 'pluginDir'\n\nfunction isSkillMarkdownFile(filePath: string): boolean {\n return /^skill\\.md$/i.test(basename(filePath))\n}\n\nfunction getUserPybBaseDir(): string {\n return getPybBaseDir()\n}\n\nfunction toBoolean(value: unknown): boolean {\n if (typeof value === 'boolean') return value\n if (typeof value === 'string') {\n const normalized = value.trim().toLowerCase()\n if (['1', 'true', 'yes', 'on'].includes(normalized)) return true\n if (['0', 'false', 'no', 'off'].includes(normalized)) return false\n }\n return false\n}\n\nfunction parseAllowedTools(value: unknown): string[] {\n if (Array.isArray(value)) {\n return value.map(v => String(v).trim()).filter(Boolean)\n }\n if (typeof value === 'string') {\n const trimmed = value.trim()\n if (!trimmed) return []\n return trimmed\n .split(/\\s+/)\n .map(v => v.trim())\n .filter(Boolean)\n }\n return []\n}\n\nfunction parseMaxThinkingTokens(\n frontmatter: CustomCommandFrontmatter,\n): number | undefined {\n const raw =\n (frontmatter as any).maxThinkingTokens ??\n (frontmatter as any).max_thinking_tokens ??\n (frontmatter as any)['max-thinking-tokens'] ??\n (frontmatter as any)['max_thinking_tokens']\n if (raw === undefined || raw === null) return undefined\n const value = typeof raw === 'number' ? raw : Number(String(raw).trim())\n if (!Number.isFinite(value) || value < 0) return undefined\n return Math.floor(value)\n}\n\nfunction sourceLabel(source: CommandSource): string {\n if (source === 'localSettings') return 'project'\n if (source === 'userSettings') return 'user'\n if (source === 'pluginDir') return 'plugin'\n return 'unknown'\n}\n\nfunction extractDescriptionFromMarkdown(\n markdown: string,\n fallback: string,\n): string {\n const lines = markdown.split(/\\r?\\n/)\n for (const line of lines) {\n const trimmed = line.trim()\n if (!trimmed) continue\n const heading = trimmed.match(/^#{1,6}\\s+(.*)$/)\n if (heading?.[1]) return heading[1].trim()\n return trimmed.length > 120 ? `${trimmed.slice(0, 117)}...` : trimmed\n }\n return fallback\n}\n\nfunction namespaceFromDirPath(dirPath: string, baseDir: string): string {\n const relPath = relative(baseDir, dirPath)\n if (!relPath || relPath === '.' || relPath.startsWith('..')) return ''\n return relPath.split(sep).join(':')\n}\n\nfunction nameForCommandFile(filePath: string, baseDir: string): string {\n if (isSkillMarkdownFile(filePath)) {\n const skillDir = dirname(filePath)\n const parentDir = dirname(skillDir)\n const skillName = basename(skillDir)\n const namespace = namespaceFromDirPath(parentDir, baseDir)\n return namespace ? `${namespace}:${skillName}` : skillName\n }\n\n const dir = dirname(filePath)\n const namespace = namespaceFromDirPath(dir, baseDir)\n const fileName = basename(filePath).replace(/\\.md$/i, '')\n return namespace ? `${namespace}:${fileName}` : fileName\n}\n\ntype CommandFileRecord = {\n baseDir: string\n filePath: string\n frontmatter: CustomCommandFrontmatter\n content: string\n source: CommandSource\n scope: 'user' | 'project'\n}\n\nfunction buildPluginQualifiedName(\n pluginName: string,\n localName: string,\n): string {\n const p = pluginName.trim()\n const l = localName.trim()\n if (!p) return l\n if (!l || l === p) return p\n return `${p}:${l}`\n}\n\nfunction nameForPluginCommandFile(\n filePath: string,\n commandsDir: string,\n pluginName: string,\n): string {\n const rel = relative(commandsDir, filePath)\n const noExt = rel.replace(/\\.md$/i, '')\n const localName = noExt.split(sep).filter(Boolean).join(':')\n return buildPluginQualifiedName(pluginName, localName)\n}\n\nfunction createPluginPromptCommandFromFile(record: {\n pluginName: string\n commandsDir: string\n filePath: string\n frontmatter: CustomCommandFrontmatter\n content: string\n}): CustomCommandWithScope | null {\n const name = nameForPluginCommandFile(\n record.filePath,\n record.commandsDir,\n record.pluginName,\n )\n if (!name) return null\n\n const descriptionText =\n record.frontmatter.description ??\n extractDescriptionFromMarkdown(record.content, 'Custom command')\n const allowedTools = parseAllowedTools(record.frontmatter['allowed-tools'])\n const maxThinkingTokens = parseMaxThinkingTokens(record.frontmatter)\n const argumentHint = record.frontmatter['argument-hint']\n const whenToUse = record.frontmatter.when_to_use\n const version = record.frontmatter.version\n const disableModelInvocation = toBoolean(\n record.frontmatter['disable-model-invocation'],\n )\n const model =\n record.frontmatter.model === 'inherit'\n ? undefined\n : record.frontmatter.model\n\n return {\n type: 'prompt',\n name,\n description: `${descriptionText} (${sourceLabel('pluginDir')})`,\n isEnabled: true,\n isHidden: false,\n filePath: record.filePath,\n aliases: [],\n progressMessage: 'running',\n allowedTools,\n maxThinkingTokens,\n argumentHint,\n whenToUse,\n version,\n model,\n isSkill: false,\n disableModelInvocation,\n hasUserSpecifiedDescription: !!record.frontmatter.description,\n source: 'pluginDir',\n scope: 'project',\n userFacingName() {\n return name\n },\n async getPromptForCommand(args: string): Promise<MessageParam[]> {\n let prompt = record.content\n const trimmedArgs = args.trim()\n if (trimmedArgs) {\n if (prompt.includes('$ARGUMENTS')) {\n prompt = prompt.replaceAll('$ARGUMENTS', trimmedArgs)\n } else {\n prompt = `${prompt}\\n\\nARGUMENTS: ${trimmedArgs}`\n }\n }\n return [{ role: 'user', content: prompt }]\n },\n }\n}\n\nfunction loadPluginCommandsFromDir(args: {\n pluginName: string\n commandsDir: string\n signal: AbortSignal\n}): CustomCommandWithScope[] {\n let commandsBaseDir = args.commandsDir\n let files: string[] = []\n try {\n const st = statSync(args.commandsDir)\n if (st.isFile()) {\n if (!args.commandsDir.toLowerCase().endsWith('.md')) return []\n files = [args.commandsDir]\n commandsBaseDir = dirname(args.commandsDir)\n } else if (st.isDirectory()) {\n files = listMarkdownFilesRecursively(args.commandsDir, args.signal)\n } else {\n return []\n }\n } catch {\n return []\n }\n\n const out: CustomCommandWithScope[] = []\n for (const filePath of files) {\n if (args.signal.aborted) break\n try {\n const raw = readFileSync(filePath, 'utf8')\n const { frontmatter, content } = parseFrontmatter(raw)\n const cmd = createPluginPromptCommandFromFile({\n pluginName: args.pluginName,\n commandsDir: commandsBaseDir,\n filePath,\n frontmatter,\n content,\n })\n if (cmd) out.push(cmd)\n } catch {\n }\n }\n return out\n}\n\nfunction loadPluginSkillDirectoryCommandsFromBaseDir(args: {\n pluginName: string\n skillsDir: string\n}): CustomCommandWithScope[] {\n if (!existsSync(args.skillsDir)) return []\n\n const out: CustomCommandWithScope[] = []\n let entries\n try {\n entries = readdirSync(args.skillsDir, { withFileTypes: true })\n } catch {\n return []\n }\n\n const strictMode = toBoolean(process.env.PYB_SKILLS_STRICT)\n const validateName = (skillName: string): boolean => {\n if (skillName.length < 1 || skillName.length > 64) return false\n return /^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(skillName)\n }\n\n for (const entry of entries) {\n if (!entry.isDirectory() && !entry.isSymbolicLink()) continue\n const skillDir = join(args.skillsDir, entry.name)\n const skillFileCandidates = [\n join(skillDir, 'SKILL.md'),\n join(skillDir, 'skill.md'),\n ]\n const skillFile = skillFileCandidates.find(p => existsSync(p))\n if (!skillFile) continue\n\n try {\n const raw = readFileSync(skillFile, 'utf8')\n const { frontmatter, content } = parseFrontmatter(raw)\n\n const dirName = entry.name\n const declaredName =\n typeof (frontmatter as any).name === 'string'\n ? String((frontmatter as any).name).trim()\n : ''\n const effectiveDeclaredName =\n declaredName && declaredName === dirName ? declaredName : ''\n if (declaredName && declaredName !== dirName) {\n if (strictMode) continue\n debugLogger.warn('CUSTOM_COMMAND_SKILL_NAME_MISMATCH', {\n dirName,\n declaredName,\n skillFile,\n })\n }\n const name = buildPluginQualifiedName(args.pluginName, dirName)\n if (!validateName(dirName)) {\n if (strictMode) continue\n debugLogger.warn('CUSTOM_COMMAND_SKILL_DIR_INVALID', { dirName, skillFile })\n }\n const descriptionText =\n frontmatter.description ??\n extractDescriptionFromMarkdown(content, 'Skill')\n if (strictMode) {\n const d =\n typeof frontmatter.description === 'string'\n ? frontmatter.description.trim()\n : ''\n if (!d || d.length > 1024) continue\n }\n\n const allowedTools = parseAllowedTools(frontmatter['allowed-tools'])\n const maxThinkingTokens = parseMaxThinkingTokens(frontmatter as any)\n const argumentHint = frontmatter['argument-hint']\n const whenToUse = frontmatter.when_to_use\n const version = frontmatter.version\n const disableModelInvocation = toBoolean(\n frontmatter['disable-model-invocation'],\n )\n const model =\n frontmatter.model === 'inherit' ? undefined : frontmatter.model\n\n out.push({\n type: 'prompt',\n name,\n description: `${descriptionText} (${sourceLabel('pluginDir')})`,\n isEnabled: true,\n isHidden: true,\n aliases: [],\n filePath: skillFile,\n progressMessage: 'loading',\n allowedTools,\n maxThinkingTokens,\n argumentHint,\n whenToUse,\n version,\n model,\n isSkill: true,\n disableModelInvocation,\n hasUserSpecifiedDescription: !!frontmatter.description,\n source: 'pluginDir',\n scope: 'project',\n userFacingName() {\n return effectiveDeclaredName\n ? buildPluginQualifiedName(args.pluginName, effectiveDeclaredName)\n : name\n },\n async getPromptForCommand(argsText: string): Promise<MessageParam[]> {\n let prompt = `Base directory for this skill: ${skillDir}\\n\\n${content}`\n const trimmedArgs = argsText.trim()\n if (trimmedArgs) {\n if (prompt.includes('$ARGUMENTS')) {\n prompt = prompt.replaceAll('$ARGUMENTS', trimmedArgs)\n } else {\n prompt = `${prompt}\\n\\nARGUMENTS: ${trimmedArgs}`\n }\n }\n return [{ role: 'user', content: prompt }]\n },\n })\n } catch {\n }\n }\n\n return out\n}\n\nfunction applySkillFilePreference(\n files: CommandFileRecord[],\n): CommandFileRecord[] {\n const grouped = new Map<string, CommandFileRecord[]>()\n for (const file of files) {\n const key = dirname(file.filePath)\n const existing = grouped.get(key) ?? []\n existing.push(file)\n grouped.set(key, existing)\n }\n\n const result: CommandFileRecord[] = []\n for (const group of grouped.values()) {\n const skillFiles = group.filter(f => isSkillMarkdownFile(f.filePath))\n if (skillFiles.length > 0) {\n result.push(skillFiles[0]!)\n continue\n }\n result.push(...group)\n }\n return result\n}\n\nfunction createPromptCommandFromFile(\n record: CommandFileRecord,\n): CustomCommandWithScope | null {\n const isSkill = isSkillMarkdownFile(record.filePath)\n const name = nameForCommandFile(record.filePath, record.baseDir)\n if (!name) return null\n\n const descriptionText =\n record.frontmatter.description ??\n extractDescriptionFromMarkdown(\n record.content,\n isSkill ? 'Skill' : 'Custom command',\n )\n\n const allowedTools = parseAllowedTools(record.frontmatter['allowed-tools'])\n const maxThinkingTokens = parseMaxThinkingTokens(record.frontmatter)\n const argumentHint = record.frontmatter['argument-hint']\n const whenToUse = record.frontmatter.when_to_use\n const version = record.frontmatter.version\n const disableModelInvocation = toBoolean(\n record.frontmatter['disable-model-invocation'],\n )\n const model =\n record.frontmatter.model === 'inherit'\n ? undefined\n : record.frontmatter.model\n\n const description = `${descriptionText} (${sourceLabel(record.source)})`\n const progressMessage = isSkill ? 'loading' : 'running'\n const skillBaseDir = isSkill ? dirname(record.filePath) : undefined\n\n return {\n type: 'prompt',\n name,\n description,\n isEnabled: true,\n isHidden: false,\n filePath: record.filePath,\n aliases: [],\n progressMessage,\n allowedTools,\n maxThinkingTokens,\n argumentHint,\n whenToUse,\n version,\n model,\n isSkill,\n disableModelInvocation,\n hasUserSpecifiedDescription: !!record.frontmatter.description,\n source: record.source,\n scope: record.scope,\n userFacingName() {\n return name\n },\n async getPromptForCommand(args: string): Promise<MessageParam[]> {\n let prompt = record.content\n if (isSkill && skillBaseDir) {\n prompt = `Base directory for this skill: ${skillBaseDir}\\n\\n${prompt}`\n }\n const trimmedArgs = args.trim()\n if (trimmedArgs) {\n if (prompt.includes('$ARGUMENTS')) {\n prompt = prompt.replaceAll('$ARGUMENTS', trimmedArgs)\n } else {\n prompt = `${prompt}\\n\\nARGUMENTS: ${trimmedArgs}`\n }\n }\n return [{ role: 'user', content: prompt }]\n },\n }\n}\n\nfunction listMarkdownFilesRecursively(\n baseDir: string,\n signal: AbortSignal,\n): string[] {\n const results: string[] = []\n const queue: string[] = [baseDir]\n while (queue.length > 0) {\n if (signal.aborted) break\n const currentDir = queue.pop()!\n let entries\n try {\n entries = readdirSync(currentDir, { withFileTypes: true })\n } catch {\n continue\n }\n for (const entry of entries) {\n if (signal.aborted) break\n const fullPath = join(currentDir, entry.name)\n if (entry.isDirectory()) {\n queue.push(fullPath)\n continue\n }\n if (entry.isFile() && entry.name.toLowerCase().endsWith('.md')) {\n results.push(fullPath)\n }\n }\n }\n return results\n}\n\nfunction loadCommandMarkdownFilesFromBaseDir(\n baseDir: string,\n source: CommandSource,\n scope: 'user' | 'project',\n signal: AbortSignal,\n): CommandFileRecord[] {\n if (!existsSync(baseDir)) return []\n const files = listMarkdownFilesRecursively(baseDir, signal)\n const records: CommandFileRecord[] = []\n for (const filePath of files) {\n if (signal.aborted) break\n try {\n const raw = readFileSync(filePath, 'utf8')\n const { frontmatter, content } = parseFrontmatter(raw)\n records.push({ baseDir, filePath, frontmatter, content, source, scope })\n } catch {\n }\n }\n return records\n}\n\nfunction loadSkillDirectoryCommandsFromBaseDir(\n skillsDir: string,\n source: CommandSource,\n scope: 'user' | 'project',\n): CustomCommandWithScope[] {\n if (!existsSync(skillsDir)) return []\n\n const out: CustomCommandWithScope[] = []\n let entries\n try {\n entries = readdirSync(skillsDir, { withFileTypes: true })\n } catch {\n return []\n }\n\n const strictMode = toBoolean(process.env.PYB_SKILLS_STRICT)\n const validateName = (skillName: string): boolean => {\n if (skillName.length < 1 || skillName.length > 64) return false\n return /^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(skillName)\n }\n\n for (const entry of entries) {\n if (!entry.isDirectory() && !entry.isSymbolicLink()) continue\n const skillDir = join(skillsDir, entry.name)\n const skillFileCandidates = [\n join(skillDir, 'SKILL.md'),\n join(skillDir, 'skill.md'),\n ]\n const skillFile = skillFileCandidates.find(p => existsSync(p))\n if (!skillFile) continue\n\n try {\n const raw = readFileSync(skillFile, 'utf8')\n const { frontmatter, content } = parseFrontmatter(raw)\n\n const dirName = entry.name\n const declaredName =\n typeof (frontmatter as any).name === 'string'\n ? String((frontmatter as any).name).trim()\n : ''\n const effectiveDeclaredName =\n declaredName && declaredName === dirName ? declaredName : ''\n if (declaredName && declaredName !== dirName) {\n if (strictMode) continue\n debugLogger.warn('CUSTOM_COMMAND_SKILL_NAME_MISMATCH', {\n dirName,\n declaredName,\n skillFile,\n })\n }\n const name = dirName\n if (!validateName(name)) {\n if (strictMode) continue\n debugLogger.warn('CUSTOM_COMMAND_SKILL_DIR_INVALID', { name, skillFile })\n }\n const descriptionText =\n frontmatter.description ??\n extractDescriptionFromMarkdown(content, 'Skill')\n if (strictMode) {\n const d =\n typeof frontmatter.description === 'string'\n ? frontmatter.description.trim()\n : ''\n if (!d || d.length > 1024) continue\n }\n\n const allowedTools = parseAllowedTools(frontmatter['allowed-tools'])\n const maxThinkingTokens = parseMaxThinkingTokens(frontmatter as any)\n const argumentHint = frontmatter['argument-hint']\n const whenToUse = frontmatter.when_to_use\n const version = frontmatter.version\n const disableModelInvocation = toBoolean(\n frontmatter['disable-model-invocation'],\n )\n const model =\n frontmatter.model === 'inherit' ? undefined : frontmatter.model\n\n out.push({\n type: 'prompt',\n name,\n description: `${descriptionText} (${sourceLabel(source)})`,\n isEnabled: true,\n isHidden: true,\n aliases: [],\n filePath: skillFile,\n progressMessage: 'loading',\n allowedTools,\n maxThinkingTokens,\n argumentHint,\n whenToUse,\n version,\n model,\n isSkill: true,\n disableModelInvocation,\n hasUserSpecifiedDescription: !!frontmatter.description,\n source,\n scope,\n userFacingName() {\n return effectiveDeclaredName || name\n },\n async getPromptForCommand(args: string): Promise<MessageParam[]> {\n let prompt = `Base directory for this skill: ${skillDir}\\n\\n${content}`\n const trimmedArgs = args.trim()\n if (trimmedArgs) {\n if (prompt.includes('$ARGUMENTS')) {\n prompt = prompt.replaceAll('$ARGUMENTS', trimmedArgs)\n } else {\n prompt = `${prompt}\\n\\nARGUMENTS: ${trimmedArgs}`\n }\n }\n return [{ role: 'user', content: prompt }]\n },\n })\n } catch {\n }\n }\n\n return out\n}\n\nexport const loadCustomCommands = memoize(\n async (): Promise<CustomCommandWithScope[]> => {\n const cwd = getCwd()\n const userPybBaseDir = getUserPybBaseDir()\n const sessionPlugins = getSessionPlugins()\n\n const projectLegacyCommandsDir = join(cwd, '.claude', 'commands')\n const userLegacyCommandsDir = join(homedir(), '.claude', 'commands')\n const projectPybCommandsDir = join(cwd, '.pyb', 'commands')\n const userPybCommandsDir = join(userPybBaseDir, 'commands')\n\n const projectLegacySkillsDir = join(cwd, '.claude', 'skills')\n const userLegacySkillsDir = join(homedir(), '.claude', 'skills')\n const projectPybSkillsDir = join(cwd, '.pyb', 'skills')\n const userPybSkillsDir = join(userPybBaseDir, 'skills')\n\n const abortController = new AbortController()\n const timeout = setTimeout(() => abortController.abort(), 3000)\n\n try {\n const commandFiles = applySkillFilePreference([\n ...loadCommandMarkdownFilesFromBaseDir(\n projectLegacyCommandsDir,\n 'localSettings',\n 'project',\n abortController.signal,\n ),\n ...loadCommandMarkdownFilesFromBaseDir(\n projectPybCommandsDir,\n 'localSettings',\n 'project',\n abortController.signal,\n ),\n ...loadCommandMarkdownFilesFromBaseDir(\n userLegacyCommandsDir,\n 'userSettings',\n 'user',\n abortController.signal,\n ),\n ...loadCommandMarkdownFilesFromBaseDir(\n userPybCommandsDir,\n 'userSettings',\n 'user',\n abortController.signal,\n ),\n ])\n\n const fileCommands = commandFiles\n .map(createPromptCommandFromFile)\n .filter((cmd): cmd is CustomCommandWithScope => cmd !== null)\n\n const skillDirCommands: CustomCommandWithScope[] = [\n ...loadSkillDirectoryCommandsFromBaseDir(\n projectLegacySkillsDir,\n 'localSettings',\n 'project',\n ),\n ...loadSkillDirectoryCommandsFromBaseDir(\n projectPybSkillsDir,\n 'localSettings',\n 'project',\n ),\n ...loadSkillDirectoryCommandsFromBaseDir(\n userLegacySkillsDir,\n 'userSettings',\n 'user',\n ),\n ...loadSkillDirectoryCommandsFromBaseDir(\n userPybSkillsDir,\n 'userSettings',\n 'user',\n ),\n ]\n\n const pluginCommands: CustomCommandWithScope[] = []\n if (sessionPlugins.length > 0) {\n for (const plugin of sessionPlugins) {\n for (const commandsDir of plugin.commandsDirs) {\n pluginCommands.push(\n ...loadPluginCommandsFromDir({\n pluginName: plugin.name,\n commandsDir,\n signal: abortController.signal,\n }),\n )\n }\n for (const skillsDir of plugin.skillsDirs) {\n pluginCommands.push(\n ...loadPluginSkillDirectoryCommandsFromBaseDir({\n pluginName: plugin.name,\n skillsDir,\n }),\n )\n }\n }\n }\n\n const ordered = [\n ...fileCommands,\n ...skillDirCommands,\n ...pluginCommands,\n ].filter(cmd => cmd.isEnabled)\n\n const seen = new Set<string>()\n const unique: CustomCommandWithScope[] = []\n for (const cmd of ordered) {\n const key = cmd.userFacingName()\n if (seen.has(key)) continue\n seen.add(key)\n unique.push(cmd)\n }\n\n return unique\n } catch (error) {\n logError(error)\n debugLogger.warn('CUSTOM_COMMANDS_LOAD_FAILED', {\n error: error instanceof Error ? error.message : String(error),\n })\n return []\n } finally {\n clearTimeout(timeout)\n }\n },\n () => {\n const cwd = getCwd()\n const userPybBaseDir = getUserPybBaseDir()\n const dirs = [\n join(homedir(), '.claude', 'commands'),\n join(cwd, '.claude', 'commands'),\n join(userPybBaseDir, 'commands'),\n join(cwd, '.pyb', 'commands'),\n join(homedir(), '.claude', 'skills'),\n join(cwd, '.claude', 'skills'),\n join(userPybBaseDir, 'skills'),\n join(cwd, '.pyb', 'skills'),\n ]\n const exists = dirs.map(d => (existsSync(d) ? '1' : '0')).join('')\n return `${cwd}:${exists}:${Math.floor(Date.now() / 60000)}`\n },\n)\n\nexport const reloadCustomCommands = (): void => {\n loadCustomCommands.cache.clear()\n}\n\nexport function getCustomCommandDirectories(): {\n userClaudeCommands: string\n projectClaudeCommands: string\n userClaudeSkills: string\n projectClaudeSkills: string\n userPybCommands: string\n projectPybCommands: string\n userPybSkills: string\n projectPybSkills: string\n} {\n const userPybBaseDir = getUserPybBaseDir()\n return {\n userClaudeCommands: join(homedir(), '.claude', 'commands'),\n projectClaudeCommands: join(getCwd(), '.claude', 'commands'),\n userClaudeSkills: join(homedir(), '.claude', 'skills'),\n projectClaudeSkills: join(getCwd(), '.claude', 'skills'),\n userPybCommands: join(userPybBaseDir, 'commands'),\n projectPybCommands: join(getCwd(), '.pyb', 'commands'),\n userPybSkills: join(userPybBaseDir, 'skills'),\n projectPybSkills: join(getCwd(), '.pyb', 'skills'),\n }\n}\n\nexport function hasCustomCommands(): boolean {\n const dirs = getCustomCommandDirectories()\n return (\n existsSync(dirs.userClaudeCommands) ||\n existsSync(dirs.projectClaudeCommands) ||\n existsSync(dirs.userClaudeSkills) ||\n existsSync(dirs.projectClaudeSkills) ||\n existsSync(dirs.userPybCommands) ||\n existsSync(dirs.projectPybCommands) ||\n existsSync(dirs.userPybSkills) ||\n existsSync(dirs.projectPybSkills)\n )\n}\n"],
5
- "mappings": "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",
6
- "names": ["namespace"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/services/plugins/skillMarketplace.ts"],
4
- "sourcesContent": ["import {\n copyFileSync,\n existsSync,\n lstatSync,\n mkdirSync,\n readFileSync,\n readdirSync,\n renameSync,\n rmSync,\n writeFileSync,\n} from 'node:fs'\nimport { randomUUID } from 'node:crypto'\nimport { homedir } from 'node:os'\nimport { basename, dirname, join, resolve, sep } from 'node:path'\nimport { unzipSync } from 'fflate'\nimport { z } from 'zod'\nimport { CONFIG_BASE_DIR } from '@constants/product'\nimport { getCwd } from '@utils/state'\nimport { getPybBaseDir } from '@utils/config/env'\n\nconst KNOWN_MARKETPLACES_FILE = 'known_marketplaces.json'\nconst MARKETPLACES_CACHE_DIR = 'marketplaces'\nconst INSTALLED_SKILL_PLUGINS_FILE = 'installed-skill-plugins.json'\n\nfunction getMarketplacesCacheDir(): string {\n return join(getPybBaseDir(), MARKETPLACES_CACHE_DIR)\n}\n\nfunction getKnownMarketplacesFile(): string {\n return join(getPybBaseDir(), KNOWN_MARKETPLACES_FILE)\n}\n\nfunction getInstalledSkillPluginsFile(): string {\n return join(getPybBaseDir(), INSTALLED_SKILL_PLUGINS_FILE)\n}\n\nconst MarketplaceSourceSchema = z.discriminatedUnion('source', [\n z.strictObject({\n source: z.literal('github'),\n repo: z.string().min(3),\n ref: z.string().optional(),\n path: z.string().optional(),\n }),\n z.strictObject({\n source: z.literal('git'),\n url: z.string().min(3),\n ref: z.string().optional(),\n path: z.string().optional(),\n }),\n z.strictObject({\n source: z.literal('url'),\n url: z.string().url(),\n headers: z.record(z.string(), z.string()).optional(),\n }),\n z.strictObject({\n source: z.literal('npm'),\n package: z.string().min(1),\n }),\n z.strictObject({\n source: z.literal('file'),\n path: z.string().min(1),\n }),\n z.strictObject({\n source: z.literal('directory'),\n path: z.string().min(1),\n }),\n])\n\nexport type MarketplaceSource = z.infer<typeof MarketplaceSourceSchema>\n\nconst MarketplacePathListSchema = z.preprocess(value => {\n if (typeof value === 'string') return [value]\n return value\n}, z.array(z.string()))\n\nconst MarketplacePluginSchema = z\n .object({\n name: z.string().min(1),\n description: z.string().optional(),\n source: z.string().optional().default('./'),\n strict: z.boolean().optional(),\n skills: MarketplacePathListSchema.optional(),\n commands: MarketplacePathListSchema.optional(),\n })\n .passthrough()\n\nexport const MarketplaceManifestSchema = z\n .object({\n $schema: z.string().optional(),\n description: z.string().optional(),\n name: z.string().min(1),\n owner: z\n .object({\n name: z.string().optional(),\n email: z.string().optional(),\n })\n .passthrough()\n .optional(),\n metadata: z.record(z.string(), z.unknown()).optional().default({}),\n plugins: z.array(MarketplacePluginSchema).default([]),\n })\n .passthrough()\n\nexport type MarketplaceManifest = z.infer<typeof MarketplaceManifestSchema>\nexport type PluginEntry = MarketplaceManifest['plugins'][number]\n\nconst KnownMarketplacesSchema = z.record(\n z.string(),\n z.strictObject({\n source: MarketplaceSourceSchema,\n installLocation: z.string().min(1),\n lastUpdated: z.string().min(1),\n autoUpdate: z.boolean().optional(),\n }),\n)\n\nexport type KnownMarketplacesConfig = z.infer<typeof KnownMarketplacesSchema>\n\nexport type PluginScope = 'user' | 'project' | 'local'\n\ntype InstalledSkillPlugin = {\n plugin: string\n marketplace: string\n scope: PluginScope\n kind?: 'skill-pack' | 'plugin-pack'\n isEnabled?: boolean\n projectPath?: string\n installedAt: string\n pluginRoot?: string\n skills: string[]\n commands: string[]\n sourceMarketplacePath: string\n}\n\ntype InstalledSkillPluginsFile = Record<string, InstalledSkillPlugin>\n\nfunction userPybDir(): string {\n return getPybBaseDir()\n}\n\nfunction normalizePluginScope(options?: {\n scope?: PluginScope\n project?: boolean\n}): PluginScope {\n if (\n options?.scope === 'user' ||\n options?.scope === 'project' ||\n options?.scope === 'local'\n ) {\n return options.scope\n }\n if (options?.project === true) return 'project'\n return 'user'\n}\n\nfunction scopeBaseDir(scope: PluginScope): string {\n if (scope === 'user') return userPybDir()\n return join(getCwd(), CONFIG_BASE_DIR)\n}\n\nfunction scopeSkillsDir(scope: PluginScope): string {\n return join(scopeBaseDir(scope), 'skills')\n}\n\nfunction scopeCommandsDir(scope: PluginScope): string {\n return join(scopeBaseDir(scope), 'commands')\n}\n\nfunction scopeDisabledSkillsDir(scope: PluginScope): string {\n return join(scopeBaseDir(scope), 'skills.disabled')\n}\n\nfunction scopeDisabledCommandsDir(scope: PluginScope): string {\n return join(scopeBaseDir(scope), 'commands.disabled')\n}\n\nfunction scopeInstalledPluginsDir(scope: PluginScope): string {\n return join(scopeBaseDir(scope), 'plugins', 'installed')\n}\n\nfunction scopeInstalledPluginRoot(\n scope: PluginScope,\n plugin: string,\n marketplace: string,\n): string {\n return join(scopeInstalledPluginsDir(scope), plugin, marketplace)\n}\n\nfunction pluginsDir(): string {\n return join(userPybDir(), 'plugins')\n}\n\nfunction knownMarketplacesConfigPath(): string {\n return join(pluginsDir(), KNOWN_MARKETPLACES_FILE)\n}\n\nfunction marketplaceCacheBaseDir(): string {\n return join(pluginsDir(), MARKETPLACES_CACHE_DIR)\n}\n\nfunction installedSkillPluginsPath(): string {\n return join(userPybDir(), INSTALLED_SKILL_PLUGINS_FILE)\n}\n\nfunction ensureDir(path: string): void {\n mkdirSync(path, { recursive: true })\n}\n\nfunction readJsonFile<T>(path: string, fallback: T): T {\n try {\n if (!existsSync(path)) return fallback\n const raw = readFileSync(path, 'utf8')\n return JSON.parse(raw) as T\n } catch {\n return fallback\n }\n}\n\nfunction writeJsonFile(path: string, value: unknown): void {\n ensureDir(dirname(path))\n writeFileSync(path, `${JSON.stringify(value, null, 2)}\\n`, 'utf8')\n}\n\nfunction normalizeMarketplaceSubPath(path: string | undefined): string | null {\n if (!path) return null\n const trimmed = path\n .trim()\n .replace(/^\\.?\\//, '')\n .replace(/^\\/+/, '')\n if (!trimmed) return null\n if (trimmed.includes('..')) {\n throw new Error(`Marketplace path contains '..': ${path}`)\n }\n return trimmed.replace(/\\\\/g, '/').replace(/\\/+$/, '')\n}\n\nfunction safeJoinWithin(baseDir: string, relativePath: string): string {\n const normalized = relativePath.replace(/\\\\/g, '/')\n if (!normalized || normalized.startsWith('/') || normalized.includes('..')) {\n throw new Error(`Unsafe path in archive: ${relativePath}`)\n }\n const joined = resolve(baseDir, normalized.split('/').join(sep))\n const resolvedBase = resolve(baseDir)\n if (!joined.startsWith(resolvedBase + sep) && joined !== resolvedBase) {\n throw new Error(`Path traversal detected: ${relativePath}`)\n }\n return joined\n}\n\nfunction ensureEmptyDir(path: string): void {\n if (existsSync(path)) rmSync(path, { recursive: true, force: true })\n ensureDir(path)\n}\n\nfunction safeCopyDirectory(srcDir: string, destDir: string): void {\n ensureDir(destDir)\n const entries = readdirSync(srcDir, { withFileTypes: true })\n for (const entry of entries) {\n const srcPath = join(srcDir, entry.name)\n const destPath = join(destDir, entry.name)\n\n if (entry.isDirectory()) {\n safeCopyDirectory(srcPath, destPath)\n continue\n }\n\n if (entry.isFile()) {\n ensureDir(dirname(destPath))\n copyFileSync(srcPath, destPath)\n continue\n }\n\n }\n}\n\nfunction readMarketplaceFromDirectory(rootDir: string): MarketplaceManifest {\n const primaryMarketplaceFile = resolve(\n rootDir,\n '.pyb-plugin',\n 'marketplace.json',\n )\n const legacyMarketplaceFile = resolve(\n rootDir,\n '.claude-plugin',\n 'marketplace.json',\n )\n const marketplaceFile = existsSync(primaryMarketplaceFile)\n ? primaryMarketplaceFile\n : legacyMarketplaceFile\n if (!existsSync(marketplaceFile)) {\n throw new Error(\n `Marketplace file not found (expected .pyb-plugin/marketplace.json or .claude-plugin/marketplace.json)`,\n )\n }\n const raw = readFileSync(marketplaceFile, 'utf8')\n const parsed = MarketplaceManifestSchema.safeParse(JSON.parse(raw))\n if (!parsed.success) {\n throw new Error(\n `Invalid marketplace.json: ${parsed.error.issues.map(i => i.message).join('; ')}`,\n )\n }\n return parsed.data\n}\n\nexport function parsePluginSpec(spec: string): {\n plugin: string\n marketplace: string\n} {\n const trimmed = spec.trim()\n const parts = trimmed.split('@')\n if (parts.length !== 2) {\n throw new Error(\n `Invalid plugin spec: ${spec}. Expected format: <plugin>@<marketplace>`,\n )\n }\n const plugin = parts[0]!.trim()\n const marketplace = parts[1]!.trim()\n if (!plugin || !marketplace) {\n throw new Error(\n `Invalid plugin spec: ${spec}. Expected format: <plugin>@<marketplace>`,\n )\n }\n return { plugin, marketplace }\n}\n\nfunction resolvePluginForInstall(pluginInput: string): {\n plugin: string\n marketplace: string\n pluginSpec: string\n} {\n const trimmed = pluginInput.trim()\n if (!trimmed) throw new Error('Plugin is required')\n\n if (trimmed.includes('@')) {\n const resolved = parsePluginSpec(trimmed)\n return {\n ...resolved,\n pluginSpec: `${resolved.plugin}@${resolved.marketplace}`,\n }\n }\n\n const config = loadKnownMarketplaces()\n const matches: { marketplace: string; entry: PluginEntry }[] = []\n for (const [marketplace, entry] of Object.entries(config)) {\n try {\n const manifest = readMarketplaceFromDirectory(entry.installLocation)\n const found = manifest.plugins.find(p => p.name === trimmed)\n if (found) matches.push({ marketplace, entry: found })\n } catch {\n }\n }\n\n if (matches.length === 0) {\n const availableMarketplaces = Object.keys(config).sort().join(', ')\n throw new Error(\n `Plugin '${trimmed}' not found in any marketplace. Available marketplaces: ${availableMarketplaces || '(none)'}`,\n )\n }\n\n if (matches.length > 1) {\n const options = matches\n .map(m => `${trimmed}@${m.marketplace}`)\n .sort()\n .join(', ')\n throw new Error(\n `Plugin '${trimmed}' is available in multiple marketplaces. Use an explicit spec: ${options}`,\n )\n }\n\n return {\n plugin: trimmed,\n marketplace: matches[0]!.marketplace,\n pluginSpec: `${trimmed}@${matches[0]!.marketplace}`,\n }\n}\n\nfunction resolveInstalledPluginSpec(\n pluginInput: string,\n state: InstalledSkillPluginsFile,\n): string {\n const trimmed = pluginInput.trim()\n if (!trimmed) throw new Error('Plugin is required')\n\n if (trimmed.includes('@')) {\n parsePluginSpec(trimmed)\n return trimmed\n }\n\n const matches = Object.entries(state).filter(\n ([, record]) => record?.plugin === trimmed,\n )\n if (matches.length === 0) {\n throw new Error(`Plugin '${trimmed}' is not installed`)\n }\n if (matches.length > 1) {\n const options = matches\n .map(([spec]) => spec)\n .sort()\n .join(', ')\n throw new Error(\n `Plugin '${trimmed}' is installed from multiple marketplaces. Use an explicit spec: ${options}`,\n )\n }\n return matches[0]![0]\n}\n\nfunction baseDirForInstallRecord(record: InstalledSkillPlugin): string {\n if (record.scope === 'user') return userPybDir()\n const projectPath =\n typeof record.projectPath === 'string' ? record.projectPath.trim() : ''\n if (!projectPath) {\n throw new Error(\n `Installed plugin '${record.plugin}@${record.marketplace}' is missing projectPath for scope=${record.scope}`,\n )\n }\n return join(projectPath, CONFIG_BASE_DIR)\n}\n\nfunction githubRepoFromUrl(input: string): string | null {\n const ssh = input.match(/^git@github\\.com:([^/]+\\/[^/]+?)(?:\\.git)?$/)\n if (ssh?.[1]) return ssh[1]\n const https = input.match(\n /^https?:\\/\\/github\\.com\\/([^/]+\\/[^/]+?)(?:\\.git)?$/,\n )\n if (https?.[1]) return https[1]\n return null\n}\n\nfunction parseRefAndPath(input: string): {\n base: string\n ref?: string\n path?: string\n} {\n const [beforeHash, hashPart] = input.split('#', 2)\n const [base, refPart] = beforeHash.split('@', 2)\n return {\n base,\n ref: refPart?.trim() || undefined,\n path: hashPart?.trim() || undefined,\n }\n}\n\nfunction parseMarketplaceSourceInput(sourceInput: string): MarketplaceSource {\n const raw = sourceInput.trim()\n if (!raw) throw new Error('Marketplace source is required')\n\n for (const prefix of [\n 'github:',\n 'git:',\n 'url:',\n 'npm:',\n 'file:',\n 'dir:',\n ] as const) {\n if (raw.startsWith(prefix)) {\n const rest = raw.slice(prefix.length).trim()\n const parsed = parseRefAndPath(rest)\n if (prefix === 'github:') {\n return {\n source: 'github',\n repo: parsed.base.trim(),\n ...(parsed.ref ? { ref: parsed.ref } : {}),\n ...(parsed.path ? { path: parsed.path } : {}),\n }\n }\n if (prefix === 'git:') {\n const repo = githubRepoFromUrl(parsed.base.trim())\n if (repo) {\n return {\n source: 'github',\n repo,\n ...(parsed.ref ? { ref: parsed.ref } : {}),\n ...(parsed.path ? { path: parsed.path } : {}),\n }\n }\n return {\n source: 'git',\n url: parsed.base.trim(),\n ...(parsed.ref ? { ref: parsed.ref } : {}),\n ...(parsed.path ? { path: parsed.path } : {}),\n }\n }\n if (prefix === 'url:') {\n return { source: 'url', url: rest }\n }\n if (prefix === 'npm:') {\n return { source: 'npm', package: rest }\n }\n if (prefix === 'file:') {\n return { source: 'file', path: rest }\n }\n if (prefix === 'dir:') {\n return { source: 'directory', path: rest }\n }\n }\n }\n\n const resolved = resolve(raw)\n if (existsSync(resolved)) {\n const stat = lstatSync(resolved)\n if (stat.isDirectory()) return { source: 'directory', path: resolved }\n if (stat.isFile()) return { source: 'file', path: resolved }\n throw new Error(`Marketplace source must be a directory or file: ${raw}`)\n }\n\n const parsed = parseRefAndPath(raw)\n if (/^[^/\\s]+\\/[^/\\s]+$/.test(parsed.base)) {\n return {\n source: 'github',\n repo: parsed.base,\n ...(parsed.ref ? { ref: parsed.ref } : {}),\n ...(parsed.path ? { path: parsed.path } : {}),\n }\n }\n\n const repo = githubRepoFromUrl(parsed.base)\n if (repo) {\n return {\n source: 'github',\n repo,\n ...(parsed.ref ? { ref: parsed.ref } : {}),\n ...(parsed.path ? { path: parsed.path } : {}),\n }\n }\n\n if (/^https?:\\/\\//.test(raw)) {\n return { source: 'url', url: raw }\n }\n\n throw new Error(\n `Unsupported marketplace source: ${sourceInput}. Use a local path, \"owner/repo\", or prefixes like github:, git:, url:, file:, dir:.`,\n )\n}\n\nasync function fetchBinary(url: string): Promise<Uint8Array> {\n const resp = await fetch(url, { method: 'GET' })\n if (!resp.ok) {\n throw new Error(\n `Failed to download ${url}: ${resp.status} ${resp.statusText}`,\n )\n }\n const buf = await resp.arrayBuffer()\n return new Uint8Array(buf)\n}\n\nasync function tryDownloadGithubZip(\n repo: string,\n ref: string,\n): Promise<Uint8Array> {\n const [owner, name] = repo.split('/', 2)\n if (!owner || !name) throw new Error(`Invalid GitHub repo: ${repo}`)\n\n const candidates = ref.startsWith('refs/')\n ? [ref]\n : [`refs/heads/${ref}`, `refs/tags/${ref}`]\n\n\t let lastError: Error | null = null\n\t for (const candidate of candidates) {\n\t const url = `https://codeload.github.com/${owner}/${name}/zip/${candidate}`\n\t try {\n\t return await fetchBinary(url)\n\t } catch (err) {\n\t lastError = err instanceof Error ? err : Error(String(err))\n\t }\n }\n throw lastError ?? new Error(`Failed to download GitHub repo ${repo}@${ref}`)\n}\n\nasync function cacheMarketplaceToTempDir(\n source: MarketplaceSource,\n tempDir: string,\n): Promise<void> {\n ensureEmptyDir(tempDir)\n\n if (source.source === 'directory') {\n const root = resolve(source.path)\n if (!existsSync(root) || !lstatSync(root).isDirectory()) {\n throw new Error(`Directory not found: ${source.path}`)\n }\n safeCopyDirectory(root, tempDir)\n return\n }\n\n if (source.source === 'file') {\n const file = resolve(source.path)\n if (!existsSync(file) || !lstatSync(file).isFile()) {\n throw new Error(`File not found: ${source.path}`)\n }\n const out = join(tempDir, '.pyb-plugin')\n ensureDir(out)\n copyFileSync(file, join(out, 'marketplace.json'))\n return\n }\n\n if (source.source === 'github') {\n const pathWithin = normalizeMarketplaceSubPath(source.path)\n\n const preferredRef = source.ref?.trim() || ''\n const refsToTry = preferredRef ? [preferredRef] : ['main', 'master']\n\n let zip: Uint8Array | null = null\n let usedRef = preferredRef || 'main'\n let lastError: Error | null = null\n for (const ref of refsToTry) {\n try {\n zip = await tryDownloadGithubZip(source.repo, ref)\n usedRef = ref\n break\n } catch (err) {\n lastError = err instanceof Error ? err : Error(String(err))\n }\n }\n if (!zip)\n throw (\n lastError ?? new Error(`Failed to download GitHub repo ${source.repo}`)\n )\n\n const files = unzipSync(zip)\n const names = Object.keys(files).filter(Boolean)\n const topDir = names.length > 0 ? names[0]!.split('/')[0]! : ''\n const includePrefix = pathWithin\n ? `${topDir}/${pathWithin.replace(/\\/+$/, '')}/`\n : `${topDir}/`\n\n let extractedCount = 0\n for (const [name, data] of Object.entries(files)) {\n if (!name.startsWith(includePrefix)) continue\n const rel = name.slice(includePrefix.length)\n if (!rel) continue\n if (rel.endsWith('/')) {\n ensureDir(safeJoinWithin(tempDir, rel))\n continue\n }\n const dest = safeJoinWithin(tempDir, rel)\n ensureDir(dirname(dest))\n writeFileSync(dest, data)\n extractedCount++\n }\n\n if (extractedCount === 0) {\n throw new Error(\n `No files extracted from ${source.repo}@${usedRef}${pathWithin ? `#${pathWithin}` : ''}`,\n )\n }\n return\n }\n\n if (source.source === 'url') {\n const url = source.url\n if (url.toLowerCase().endsWith('.json')) {\n const data = await fetchBinary(url)\n const out = join(tempDir, '.pyb-plugin')\n ensureDir(out)\n writeFileSync(join(out, 'marketplace.json'), Buffer.from(data))\n return\n }\n if (url.toLowerCase().endsWith('.zip')) {\n const zip = await fetchBinary(url)\n const files = unzipSync(zip)\n for (const [name, data] of Object.entries(files)) {\n if (!name || name.endsWith('/')) continue\n const dest = safeJoinWithin(tempDir, name)\n ensureDir(dirname(dest))\n writeFileSync(dest, data)\n }\n return\n }\n throw new Error(\n `Unsupported url marketplace source. Provide a .json or .zip URL: ${url}`,\n )\n }\n\n if (source.source === 'git') {\n const repo = githubRepoFromUrl(source.url)\n if (repo) {\n await cacheMarketplaceToTempDir(\n {\n source: 'github',\n repo,\n ...(source.ref ? { ref: source.ref } : {}),\n ...(source.path ? { path: source.path } : {}),\n },\n tempDir,\n )\n return\n }\n throw new Error(\n `git sources are not supported without GitHub conversion (url=${source.url})`,\n )\n }\n\n if (source.source === 'npm') {\n throw new Error(\n `npm marketplace sources are not supported yet (package=${source.package}). Install the package and add it as a local dir instead.`,\n )\n }\n}\n\nfunction loadKnownMarketplaces(): KnownMarketplacesConfig {\n const raw = readJsonFile<unknown>(knownMarketplacesConfigPath(), {})\n const parsed = KnownMarketplacesSchema.safeParse(raw)\n if (!parsed.success) {\n throw new Error(\n `Marketplace configuration is corrupted: ${parsed.error.issues.map(i => i.message).join('; ')}`,\n )\n }\n return parsed.data\n}\n\nfunction saveKnownMarketplaces(config: KnownMarketplacesConfig): void {\n const parsed = KnownMarketplacesSchema.safeParse(config)\n if (!parsed.success) {\n throw new Error(`Invalid marketplace config: ${parsed.error.message}`)\n }\n writeJsonFile(knownMarketplacesConfigPath(), parsed.data)\n}\n\nexport function listMarketplaces(): KnownMarketplacesConfig {\n return loadKnownMarketplaces()\n}\n\nexport async function addMarketplace(\n sourceInput: string,\n): Promise<{ name: string }> {\n const source = parseMarketplaceSourceInput(sourceInput)\n const validatedSource = MarketplaceSourceSchema.safeParse(source)\n if (!validatedSource.success) {\n throw new Error(\n `Invalid marketplace source: ${validatedSource.error.issues.map(i => i.message).join('; ')}`,\n )\n }\n\n const config = loadKnownMarketplaces()\n const cacheBase = marketplaceCacheBaseDir()\n ensureDir(cacheBase)\n\n const tempDir = join(cacheBase, `tmp-${randomUUID()}`)\n try {\n await cacheMarketplaceToTempDir(validatedSource.data, tempDir)\n const manifest = readMarketplaceFromDirectory(tempDir)\n const marketplaceName = manifest.name\n\n if (config[marketplaceName]) {\n throw new Error(\n `Marketplace '${marketplaceName}' is already installed. Remove it first to re-add.`,\n )\n }\n\n const installLocation = join(cacheBase, marketplaceName)\n if (existsSync(installLocation)) {\n throw new Error(\n `Marketplace cache directory already exists: ${installLocation}`,\n )\n }\n\n renameSync(tempDir, installLocation)\n config[marketplaceName] = {\n source: validatedSource.data,\n installLocation,\n lastUpdated: new Date().toISOString(),\n }\n saveKnownMarketplaces(config)\n return { name: marketplaceName }\n } catch (error) {\n if (existsSync(tempDir)) rmSync(tempDir, { recursive: true, force: true })\n throw error\n }\n}\n\nexport function removeMarketplace(name: string): void {\n const trimmed = name.trim()\n if (!trimmed) throw new Error('Marketplace name is required')\n\n const config = loadKnownMarketplaces()\n const entry = config[trimmed]\n if (!entry) throw new Error(`Marketplace '${trimmed}' not found`)\n\n delete config[trimmed]\n saveKnownMarketplaces(config)\n\n try {\n if (existsSync(entry.installLocation)) {\n rmSync(entry.installLocation, { recursive: true, force: true })\n }\n } catch {\n }\n}\n\nexport async function refreshMarketplaceAsync(name: string): Promise<void> {\n const trimmed = name.trim()\n if (!trimmed) throw new Error('Marketplace name is required')\n\n const config = loadKnownMarketplaces()\n const entry = config[trimmed]\n if (!entry) throw new Error(`Marketplace '${trimmed}' not found`)\n\n const cacheBase = marketplaceCacheBaseDir()\n ensureDir(cacheBase)\n\n const tempDir = join(cacheBase, `tmp-${randomUUID()}`)\n try {\n await cacheMarketplaceToTempDir(entry.source, tempDir)\n const manifest = readMarketplaceFromDirectory(tempDir)\n if (manifest.name !== trimmed) {\n throw new Error(\n `Marketplace name mismatch on refresh: expected ${trimmed}, got ${manifest.name}`,\n )\n }\n\n if (existsSync(entry.installLocation)) {\n rmSync(entry.installLocation, { recursive: true, force: true })\n }\n renameSync(tempDir, entry.installLocation)\n config[trimmed] = {\n ...entry,\n lastUpdated: new Date().toISOString(),\n }\n saveKnownMarketplaces(config)\n } catch (error) {\n if (existsSync(tempDir)) rmSync(tempDir, { recursive: true, force: true })\n throw error\n }\n}\n\nexport async function refreshAllMarketplacesAsync(\n onProgress?: (message: string) => void,\n): Promise<{ refreshed: string[]; failed: { name: string; error: string }[] }> {\n const config = loadKnownMarketplaces()\n const names = Object.keys(config).sort()\n\n const refreshed: string[] = []\n const failed: { name: string; error: string }[] = []\n\n for (const name of names) {\n try {\n onProgress?.(`Updating marketplace: ${name}...`)\n await refreshMarketplaceAsync(name)\n refreshed.push(name)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n failed.push({ name, error: message })\n onProgress?.(`Failed to refresh marketplace ${name}: ${message}`)\n }\n }\n\n return { refreshed, failed }\n}\n\nexport function getMarketplaceManifest(marketplaceName: string): {\n manifest: MarketplaceManifest\n rootDir: string\n source: MarketplaceSource\n} {\n const config = loadKnownMarketplaces()\n const entry = config[marketplaceName]\n if (!entry) {\n const available = Object.keys(config).sort().join(', ')\n throw new Error(\n `Marketplace '${marketplaceName}' not found. Available marketplaces: ${available || '(none)'}`,\n )\n }\n const manifest = readMarketplaceFromDirectory(entry.installLocation)\n return { manifest, rootDir: entry.installLocation, source: entry.source }\n}\n\nfunction ensurePluginInstallState(): InstalledSkillPluginsFile {\n ensureDir(userPybDir())\n const state = readJsonFile<Record<string, any>>(\n installedSkillPluginsPath(),\n {},\n )\n for (const record of Object.values(state)) {\n if (!record || typeof record !== 'object') continue\n if (\n record.scope !== 'user' &&\n record.scope !== 'project' &&\n record.scope !== 'local'\n ) {\n record.scope = 'user'\n }\n if (record.kind !== 'skill-pack' && record.kind !== 'plugin-pack') {\n record.kind =\n typeof record.pluginRoot === 'string' ? 'plugin-pack' : 'skill-pack'\n }\n if (record.isEnabled === undefined) record.isEnabled = true\n }\n return state as InstalledSkillPluginsFile\n}\n\nfunction savePluginInstallState(state: InstalledSkillPluginsFile): void {\n writeJsonFile(installedSkillPluginsPath(), state)\n}\n\nexport function installSkillPlugin(\n pluginInput: string,\n options?: { scope?: PluginScope; project?: boolean; force?: boolean },\n): {\n pluginSpec: string\n installedSkills: string[]\n installedCommands: string[]\n} {\n const scope = normalizePluginScope(options)\n const { plugin, marketplace, pluginSpec } =\n resolvePluginForInstall(pluginInput)\n const { manifest, rootDir, source } = getMarketplaceManifest(marketplace)\n\n const entry = manifest.plugins.find(p => p.name === plugin)\n if (!entry) {\n const available = manifest.plugins\n .map(p => p.name)\n .sort()\n .join(', ')\n throw new Error(\n `Plugin '${plugin}' not found in marketplace '${marketplace}'. Available plugins: ${available || '(none)'}`,\n )\n }\n\n const installState = ensurePluginInstallState()\n const existing = installState[pluginSpec]\n if (existing && existing.scope !== scope && options?.force !== true) {\n throw new Error(\n `Plugin '${pluginSpec}' is already installed with scope=${existing.scope}. Uninstall it first to install with scope=${scope}.`,\n )\n }\n if (existing && options?.force !== true) {\n throw new Error(\n `Plugin '${pluginSpec}' is already installed. Re-run with --force to reinstall.`,\n )\n }\n\n const entrySourceBase = resolve(rootDir, entry.source ?? './')\n const primaryManifestPath = join(\n entrySourceBase,\n '.pyb-plugin',\n 'plugin.json',\n )\n const legacyManifestPath = join(\n entrySourceBase,\n '.claude-plugin',\n 'plugin.json',\n )\n const pluginManifestPath = existsSync(primaryManifestPath)\n ? primaryManifestPath\n : legacyManifestPath\n\n if (\n existsSync(pluginManifestPath) &&\n lstatSync(pluginManifestPath).isFile()\n ) {\n const pluginRoot = scopeInstalledPluginRoot(scope, plugin, marketplace)\n if (existsSync(pluginRoot) && options?.force !== true) {\n throw new Error(`Destination already exists: ${pluginRoot}`)\n }\n ensureEmptyDir(pluginRoot)\n safeCopyDirectory(entrySourceBase, pluginRoot)\n\n installState[pluginSpec] = {\n plugin,\n marketplace,\n scope,\n kind: 'plugin-pack',\n pluginRoot,\n isEnabled: true,\n projectPath: scope === 'user' ? undefined : getCwd(),\n installedAt: new Date().toISOString(),\n skills: [],\n commands: [],\n sourceMarketplacePath:\n source.source === 'file' || source.source === 'directory'\n ? source.path\n : source.source === 'github'\n ? `github:${source.repo}`\n : source.source === 'url'\n ? source.url\n : source.source === 'git'\n ? source.url\n : `npm:${source.package}`,\n }\n savePluginInstallState(installState)\n\n return { pluginSpec, installedSkills: [], installedCommands: [] }\n }\n\n const skillsDestBase = scopeSkillsDir(scope)\n const commandsDestBase = join(scopeCommandsDir(scope), plugin, marketplace)\n\n ensureDir(skillsDestBase)\n ensureDir(commandsDestBase)\n\n const installedSkills: string[] = []\n const installedCommands: string[] = []\n\n const skillPaths = entry.skills ?? []\n for (const rel of skillPaths) {\n const src = safeJoinWithin(entrySourceBase, rel)\n if (!existsSync(src) || !lstatSync(src).isDirectory()) {\n throw new Error(`Skill path not found or not a directory: ${src}`)\n }\n const skillName = basename(src)\n const dest = join(skillsDestBase, skillName)\n\n if (existsSync(dest) && options?.force !== true) {\n throw new Error(`Destination already exists: ${dest}`)\n }\n ensureEmptyDir(dest)\n safeCopyDirectory(src, dest)\n installedSkills.push(skillName)\n }\n\n const commandPaths = entry.commands ?? []\n for (const rel of commandPaths) {\n const src = safeJoinWithin(entrySourceBase, rel)\n if (!existsSync(src)) {\n throw new Error(`Command path not found: ${src}`)\n }\n const stat = lstatSync(src)\n if (stat.isDirectory()) {\n const dest = join(commandsDestBase, basename(src))\n if (existsSync(dest) && options?.force !== true) {\n throw new Error(`Destination already exists: ${dest}`)\n }\n ensureEmptyDir(dest)\n safeCopyDirectory(src, dest)\n installedCommands.push(dest)\n continue\n }\n if (stat.isFile()) {\n const dest = join(commandsDestBase, basename(src))\n ensureDir(dirname(dest))\n if (existsSync(dest) && options?.force !== true) {\n throw new Error(`Destination already exists: ${dest}`)\n }\n copyFileSync(src, dest)\n installedCommands.push(dest)\n continue\n }\n }\n\n installState[pluginSpec] = {\n plugin,\n marketplace,\n scope,\n kind: 'skill-pack',\n isEnabled: true,\n projectPath: scope === 'user' ? undefined : getCwd(),\n installedAt: new Date().toISOString(),\n skills: installedSkills,\n commands: installedCommands,\n sourceMarketplacePath:\n source.source === 'file' || source.source === 'directory'\n ? source.path\n : source.source === 'github'\n ? `github:${source.repo}`\n : source.source === 'url'\n ? source.url\n : source.source === 'git'\n ? source.url\n : `npm:${source.package}`,\n }\n savePluginInstallState(installState)\n\n return { pluginSpec, installedSkills, installedCommands }\n}\n\nexport function uninstallSkillPlugin(\n pluginInput: string,\n options?: { scope?: PluginScope; project?: boolean },\n): { pluginSpec: string; removedSkills: string[]; removedCommands: string[] } {\n const requestedScope = normalizePluginScope(options)\n const state = ensurePluginInstallState()\n const pluginSpec = resolveInstalledPluginSpec(pluginInput, state)\n const record = state[pluginSpec]\n if (!record) {\n throw new Error(`Plugin '${pluginSpec}' is not installed`)\n }\n\n if (record.scope !== requestedScope) {\n throw new Error(\n `Plugin '${pluginSpec}' is installed with scope=${record.scope}. Re-run with --scope ${record.scope}.`,\n )\n }\n if (record.scope !== 'user') {\n const projectPath = record.projectPath?.trim() || ''\n const cwd = getCwd()\n if (!projectPath || projectPath !== cwd) {\n throw new Error(\n `Plugin '${pluginSpec}' is installed for a different directory. Expected cwd=${projectPath || '(missing)'}, got cwd=${cwd}`,\n )\n }\n }\n\n if (record.kind === 'plugin-pack') {\n const baseDir = baseDirForInstallRecord(record)\n const pluginRoot =\n typeof record.pluginRoot === 'string' && record.pluginRoot.trim()\n ? record.pluginRoot\n : join(\n baseDir,\n 'plugins',\n 'installed',\n record.plugin,\n record.marketplace,\n )\n\n const removedCommands: string[] = []\n if (existsSync(pluginRoot)) {\n rmSync(pluginRoot, { recursive: true, force: true })\n removedCommands.push(pluginRoot)\n }\n\n delete state[pluginSpec]\n savePluginInstallState(state)\n\n return { pluginSpec, removedSkills: [], removedCommands }\n }\n\n const baseDir = baseDirForInstallRecord(record)\n const skillsDestBase = join(baseDir, 'skills')\n const commandsDestBase = join(\n baseDir,\n 'commands',\n record.plugin,\n record.marketplace,\n )\n const disabledSkillsBase = join(\n baseDir,\n 'skills.disabled',\n record.plugin,\n record.marketplace,\n )\n const disabledCommandsBase = join(\n baseDir,\n 'commands.disabled',\n record.plugin,\n record.marketplace,\n )\n\n const removedSkills: string[] = []\n for (const skillName of record.skills) {\n const dest = join(skillsDestBase, skillName)\n if (existsSync(dest)) rmSync(dest, { recursive: true, force: true })\n const disabledDest = join(disabledSkillsBase, skillName)\n if (existsSync(disabledDest))\n rmSync(disabledDest, { recursive: true, force: true })\n removedSkills.push(skillName)\n }\n\n const removedCommands: string[] = []\n if (existsSync(commandsDestBase)) {\n rmSync(commandsDestBase, { recursive: true, force: true })\n removedCommands.push(commandsDestBase)\n }\n if (existsSync(disabledCommandsBase)) {\n rmSync(disabledCommandsBase, { recursive: true, force: true })\n removedCommands.push(disabledCommandsBase)\n }\n\n delete state[pluginSpec]\n savePluginInstallState(state)\n\n return { pluginSpec, removedSkills, removedCommands }\n}\n\nexport function disableSkillPlugin(\n pluginInput: string,\n options?: { scope?: PluginScope; project?: boolean },\n): {\n pluginSpec: string\n disabledSkills: string[]\n disabledCommands: string[]\n} {\n const requestedScope = normalizePluginScope(options)\n const state = ensurePluginInstallState()\n const pluginSpec = resolveInstalledPluginSpec(pluginInput, state)\n const record = state[pluginSpec]\n if (!record) throw new Error(`Plugin '${pluginSpec}' is not installed`)\n\n if (record.scope !== requestedScope) {\n throw new Error(\n `Plugin '${pluginSpec}' is installed with scope=${record.scope}. Re-run with --scope ${record.scope}.`,\n )\n }\n if (record.scope !== 'user') {\n const projectPath = record.projectPath?.trim() || ''\n const cwd = getCwd()\n if (!projectPath || projectPath !== cwd) {\n throw new Error(\n `Plugin '${pluginSpec}' is installed for a different directory. Expected cwd=${projectPath || '(missing)'}, got cwd=${cwd}`,\n )\n }\n }\n\n if (record.isEnabled === false) {\n return { pluginSpec, disabledSkills: [], disabledCommands: [] }\n }\n\n if (record.kind === 'plugin-pack') {\n record.isEnabled = false\n state[pluginSpec] = record\n savePluginInstallState(state)\n return { pluginSpec, disabledSkills: [], disabledCommands: [] }\n }\n\n const baseDir = baseDirForInstallRecord(record)\n const skillsDir = join(baseDir, 'skills')\n const commandsDir = join(\n baseDir,\n 'commands',\n record.plugin,\n record.marketplace,\n )\n const disabledSkillsBase = join(\n baseDir,\n 'skills.disabled',\n record.plugin,\n record.marketplace,\n )\n const disabledCommandsDir = join(\n baseDir,\n 'commands.disabled',\n record.plugin,\n record.marketplace,\n )\n\n const disabledSkills: string[] = []\n for (const skillName of record.skills) {\n const src = join(skillsDir, skillName)\n if (!existsSync(src)) continue\n const dest = join(disabledSkillsBase, skillName)\n ensureDir(dirname(dest))\n if (existsSync(dest)) rmSync(dest, { recursive: true, force: true })\n renameSync(src, dest)\n disabledSkills.push(skillName)\n }\n\n const disabledCommands: string[] = []\n if (existsSync(commandsDir)) {\n ensureDir(dirname(disabledCommandsDir))\n if (existsSync(disabledCommandsDir)) {\n rmSync(disabledCommandsDir, { recursive: true, force: true })\n }\n renameSync(commandsDir, disabledCommandsDir)\n disabledCommands.push(disabledCommandsDir)\n }\n\n record.isEnabled = false\n state[pluginSpec] = record\n savePluginInstallState(state)\n\n return { pluginSpec, disabledSkills, disabledCommands }\n}\n\nexport function enableSkillPlugin(\n pluginInput: string,\n options?: { scope?: PluginScope; project?: boolean },\n): { pluginSpec: string; enabledSkills: string[]; enabledCommands: string[] } {\n const requestedScope = normalizePluginScope(options)\n const state = ensurePluginInstallState()\n const pluginSpec = resolveInstalledPluginSpec(pluginInput, state)\n const record = state[pluginSpec]\n if (!record) throw new Error(`Plugin '${pluginSpec}' is not installed`)\n\n if (record.scope !== requestedScope) {\n throw new Error(\n `Plugin '${pluginSpec}' is installed with scope=${record.scope}. Re-run with --scope ${record.scope}.`,\n )\n }\n if (record.scope !== 'user') {\n const projectPath = record.projectPath?.trim() || ''\n const cwd = getCwd()\n if (!projectPath || projectPath !== cwd) {\n throw new Error(\n `Plugin '${pluginSpec}' is installed for a different directory. Expected cwd=${projectPath || '(missing)'}, got cwd=${cwd}`,\n )\n }\n }\n\n if (record.isEnabled !== false) {\n return { pluginSpec, enabledSkills: [], enabledCommands: [] }\n }\n\n if (record.kind === 'plugin-pack') {\n record.isEnabled = true\n state[pluginSpec] = record\n savePluginInstallState(state)\n return { pluginSpec, enabledSkills: [], enabledCommands: [] }\n }\n\n const baseDir = baseDirForInstallRecord(record)\n const skillsDir = join(baseDir, 'skills')\n const commandsDir = join(\n baseDir,\n 'commands',\n record.plugin,\n record.marketplace,\n )\n const disabledSkillsBase = join(\n baseDir,\n 'skills.disabled',\n record.plugin,\n record.marketplace,\n )\n const disabledCommandsDir = join(\n baseDir,\n 'commands.disabled',\n record.plugin,\n record.marketplace,\n )\n\n const enabledSkills: string[] = []\n for (const skillName of record.skills) {\n const src = join(disabledSkillsBase, skillName)\n if (!existsSync(src)) continue\n const dest = join(skillsDir, skillName)\n ensureDir(dirname(dest))\n if (existsSync(dest)) {\n throw new Error(`Destination already exists: ${dest}`)\n }\n renameSync(src, dest)\n enabledSkills.push(skillName)\n }\n\n const enabledCommands: string[] = []\n if (existsSync(disabledCommandsDir)) {\n ensureDir(dirname(commandsDir))\n if (existsSync(commandsDir)) {\n throw new Error(`Destination already exists: ${commandsDir}`)\n }\n renameSync(disabledCommandsDir, commandsDir)\n enabledCommands.push(commandsDir)\n }\n\n record.isEnabled = true\n state[pluginSpec] = record\n savePluginInstallState(state)\n\n return { pluginSpec, enabledSkills, enabledCommands }\n}\n\nexport function listInstalledSkillPlugins(): InstalledSkillPluginsFile {\n return ensurePluginInstallState()\n}\n\nexport function listEnabledInstalledPluginPackRoots(): string[] {\n const state = ensurePluginInstallState()\n const cwd = getCwd()\n const roots: string[] = []\n\n for (const spec of Object.keys(state).sort()) {\n const record = state[spec]\n if (!record || record.kind !== 'plugin-pack') continue\n if (record.isEnabled === false) continue\n\n if (record.scope !== 'user') {\n const projectPath = record.projectPath?.trim() || ''\n if (!projectPath || projectPath !== cwd) continue\n }\n\n const baseDir = baseDirForInstallRecord(record)\n const pluginRoot =\n typeof record.pluginRoot === 'string' && record.pluginRoot.trim()\n ? record.pluginRoot\n : join(\n baseDir,\n 'plugins',\n 'installed',\n record.plugin,\n record.marketplace,\n )\n\n try {\n if (!existsSync(pluginRoot) || !lstatSync(pluginRoot).isDirectory())\n continue\n roots.push(pluginRoot)\n } catch {\n continue\n }\n }\n\n return roots\n}\n"],
5
- "mappings": "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",
6
- "names": ["parsed", "repo", "baseDir", "removedCommands"]
7
- }