nexus-agents 8.76.0 → 8.76.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/dist/{ast-rule-runner-6IAAL43M.js → ast-rule-runner-BXBBL5G7.js} +3 -3
  2. package/dist/{child-mcp-config-A4LIY5TG.js → child-mcp-config-3IELNFHI.js} +2 -2
  3. package/dist/{chunk-WBTC7E6Z.js → chunk-2P4HP2A6.js} +2 -2
  4. package/dist/{chunk-6CYKSB6S.js → chunk-6E3DFUYA.js} +5 -5
  5. package/dist/{chunk-ERWWXVVM.js → chunk-A6QRKIGL.js} +3 -3
  6. package/dist/{chunk-Y2S2JKPP.js → chunk-AONC4VYB.js} +2 -2
  7. package/dist/{chunk-UFLDOHWI.js → chunk-AWCSYKUR.js} +2 -2
  8. package/dist/{chunk-HHPDVL75.js → chunk-BAGUYKZL.js} +9 -9
  9. package/dist/{chunk-QRVI44WE.js → chunk-CAIJB3CO.js} +2 -2
  10. package/dist/{chunk-UO7FFOAL.js → chunk-CMG3P6OI.js} +4 -4
  11. package/dist/{chunk-HRCJYS3M.js → chunk-EVBLCOEN.js} +2 -2
  12. package/dist/{chunk-IJCXL57M.js → chunk-F76Y5QXV.js} +9 -9
  13. package/dist/{chunk-P4IBKWRD.js → chunk-FMAJIIXZ.js} +2 -2
  14. package/dist/{chunk-ZNQ5F4QP.js → chunk-FRHYZJGC.js} +3 -3
  15. package/dist/{chunk-QKV4AQSC.js → chunk-G744HQMZ.js} +5 -5
  16. package/dist/{chunk-EWCHPHKO.js → chunk-GOXBEH6M.js} +2 -2
  17. package/dist/{chunk-TJIUBTSN.js → chunk-IDPA4X6J.js} +3 -3
  18. package/dist/{chunk-JZPRRHNB.js → chunk-IPI4I2UW.js} +2 -2
  19. package/dist/{chunk-55QYPH5F.js → chunk-J527NA52.js} +3 -3
  20. package/dist/{chunk-2QMW2KMH.js → chunk-MCRMY7K7.js} +4 -4
  21. package/dist/{chunk-JMUYQMU3.js → chunk-MRGBENPM.js} +2 -2
  22. package/dist/{chunk-ASF4HCLR.js → chunk-MSPYAOAU.js} +2 -2
  23. package/dist/{chunk-YYSUWKIF.js → chunk-MSSRXYMZ.js} +2 -2
  24. package/dist/{chunk-5MWN2LI2.js → chunk-NBTG2OQC.js} +2 -2
  25. package/dist/{chunk-RVGICII7.js → chunk-NOSQXAW3.js} +4 -4
  26. package/dist/{chunk-EKUTAEL6.js → chunk-PE4QQAAY.js} +1482 -1406
  27. package/dist/{chunk-EKUTAEL6.js.map → chunk-PE4QQAAY.js.map} +1 -1
  28. package/dist/{chunk-EK4ANFB2.js → chunk-PJZQQYLJ.js} +7 -7
  29. package/dist/{chunk-6QQOVB6Y.js → chunk-RC4ZQ4ZE.js} +4 -4
  30. package/dist/{chunk-FKHYDVCQ.js → chunk-T52Y554H.js} +2 -2
  31. package/dist/{chunk-SPSM7TWB.js → chunk-T6W3N3N3.js} +2 -2
  32. package/dist/{chunk-UIIHBU73.js → chunk-UF3BNMOV.js} +8 -8
  33. package/dist/{chunk-U2LTPDHN.js → chunk-VFTP7WSH.js} +2 -2
  34. package/dist/{chunk-YF6VDLIQ.js → chunk-VKLUJZQV.js} +2 -2
  35. package/dist/{chunk-JFANCEZ4.js → chunk-WFHUSSKZ.js} +13 -5
  36. package/dist/chunk-WFHUSSKZ.js.map +1 -0
  37. package/dist/{chunk-DXTTIJL4.js → chunk-ZVQ2Q7OM.js} +2 -2
  38. package/dist/{cli-circuit-breaker-MYREMCYC.js → cli-circuit-breaker-H5CESPLC.js} +3 -3
  39. package/dist/cli.js +277 -268
  40. package/dist/cli.js.map +1 -1
  41. package/dist/{composite-router-7EFG5JO3.js → composite-router-DSYVXQ7C.js} +2 -2
  42. package/dist/{consensus-vote-T6NT5TH3.js → consensus-vote-OKA2PL74.js} +16 -16
  43. package/dist/{context-retriever-5R4KYYDC.js → context-retriever-C5KY23EG.js} +8 -8
  44. package/dist/{doctor-deep-R4HXMRIS.js → doctor-deep-LBPZXYN4.js} +3 -3
  45. package/dist/{doctor-live-QJRB6HKE.js → doctor-live-QAT3FLUJ.js} +10 -10
  46. package/dist/{expert-bridge-GZFSYIDY.js → expert-bridge-F7V2AXUD.js} +4 -4
  47. package/dist/{factory-45WRDLYG.js → factory-ECJNRE2W.js} +5 -5
  48. package/dist/{factory-BB4L5DMB.js → factory-MZTDIMCP.js} +9 -9
  49. package/dist/{improvement-review-PKWQXPPH.js → improvement-review-UEVIATKC.js} +5 -5
  50. package/dist/index.d.ts +19 -6
  51. package/dist/index.js +30 -30
  52. package/dist/{init-opencode-MF4KJ62S.js → init-opencode-WXEXOV6X.js} +5 -5
  53. package/dist/issue-triage-OJZ275JY.js +16 -0
  54. package/dist/{pr-reviewer-helpers-E3GJOIUI.js → pr-reviewer-helpers-VRPD3CNI.js} +4 -4
  55. package/dist/{registry-command-CIEY3EKQ.js → registry-command-JZLWVBLG.js} +2 -2
  56. package/dist/{repo-security-plan-WEZDYMI4.js → repo-security-plan-IS65FSZF.js} +3 -3
  57. package/dist/{research-helpers-synthesize-ZSKQAHME.js → research-helpers-synthesize-TLZPEOAU.js} +4 -4
  58. package/dist/{routing-memory-XLXPLSKS.js → routing-memory-YHEH7ULH.js} +2 -2
  59. package/dist/{session-memory-P6FIBSKK.js → session-memory-5MD3ZFJX.js} +3 -3
  60. package/dist/{setup-config-5IZDOCOE.js → setup-config-RFOBGXUH.js} +3 -3
  61. package/dist/{setup-custom-api-2OA4I464.js → setup-custom-api-DKXRZY4C.js} +4 -4
  62. package/dist/setup-data-dir-JXSO4FDY.js +30 -0
  63. package/dist/{tool-memory-4K3F2X6J.js → tool-memory-HCCMGPVI.js} +5 -5
  64. package/dist/{unified-registry-3QLEUPXI.js → unified-registry-3TWHRO5L.js} +10 -10
  65. package/dist/{weather-report-WOKLGC27.js → weather-report-MGOA7OOC.js} +2 -2
  66. package/package.json +1 -1
  67. package/dist/chunk-JFANCEZ4.js.map +0 -1
  68. package/dist/issue-triage-YYW7GQLN.js +0 -16
  69. package/dist/setup-data-dir-APES7ONG.js +0 -30
  70. /package/dist/{ast-rule-runner-6IAAL43M.js.map → ast-rule-runner-BXBBL5G7.js.map} +0 -0
  71. /package/dist/{child-mcp-config-A4LIY5TG.js.map → child-mcp-config-3IELNFHI.js.map} +0 -0
  72. /package/dist/{chunk-WBTC7E6Z.js.map → chunk-2P4HP2A6.js.map} +0 -0
  73. /package/dist/{chunk-6CYKSB6S.js.map → chunk-6E3DFUYA.js.map} +0 -0
  74. /package/dist/{chunk-ERWWXVVM.js.map → chunk-A6QRKIGL.js.map} +0 -0
  75. /package/dist/{chunk-Y2S2JKPP.js.map → chunk-AONC4VYB.js.map} +0 -0
  76. /package/dist/{chunk-UFLDOHWI.js.map → chunk-AWCSYKUR.js.map} +0 -0
  77. /package/dist/{chunk-HHPDVL75.js.map → chunk-BAGUYKZL.js.map} +0 -0
  78. /package/dist/{chunk-QRVI44WE.js.map → chunk-CAIJB3CO.js.map} +0 -0
  79. /package/dist/{chunk-UO7FFOAL.js.map → chunk-CMG3P6OI.js.map} +0 -0
  80. /package/dist/{chunk-HRCJYS3M.js.map → chunk-EVBLCOEN.js.map} +0 -0
  81. /package/dist/{chunk-IJCXL57M.js.map → chunk-F76Y5QXV.js.map} +0 -0
  82. /package/dist/{chunk-P4IBKWRD.js.map → chunk-FMAJIIXZ.js.map} +0 -0
  83. /package/dist/{chunk-ZNQ5F4QP.js.map → chunk-FRHYZJGC.js.map} +0 -0
  84. /package/dist/{chunk-QKV4AQSC.js.map → chunk-G744HQMZ.js.map} +0 -0
  85. /package/dist/{chunk-EWCHPHKO.js.map → chunk-GOXBEH6M.js.map} +0 -0
  86. /package/dist/{chunk-TJIUBTSN.js.map → chunk-IDPA4X6J.js.map} +0 -0
  87. /package/dist/{chunk-JZPRRHNB.js.map → chunk-IPI4I2UW.js.map} +0 -0
  88. /package/dist/{chunk-55QYPH5F.js.map → chunk-J527NA52.js.map} +0 -0
  89. /package/dist/{chunk-2QMW2KMH.js.map → chunk-MCRMY7K7.js.map} +0 -0
  90. /package/dist/{chunk-JMUYQMU3.js.map → chunk-MRGBENPM.js.map} +0 -0
  91. /package/dist/{chunk-ASF4HCLR.js.map → chunk-MSPYAOAU.js.map} +0 -0
  92. /package/dist/{chunk-YYSUWKIF.js.map → chunk-MSSRXYMZ.js.map} +0 -0
  93. /package/dist/{chunk-5MWN2LI2.js.map → chunk-NBTG2OQC.js.map} +0 -0
  94. /package/dist/{chunk-RVGICII7.js.map → chunk-NOSQXAW3.js.map} +0 -0
  95. /package/dist/{chunk-EK4ANFB2.js.map → chunk-PJZQQYLJ.js.map} +0 -0
  96. /package/dist/{chunk-6QQOVB6Y.js.map → chunk-RC4ZQ4ZE.js.map} +0 -0
  97. /package/dist/{chunk-FKHYDVCQ.js.map → chunk-T52Y554H.js.map} +0 -0
  98. /package/dist/{chunk-SPSM7TWB.js.map → chunk-T6W3N3N3.js.map} +0 -0
  99. /package/dist/{chunk-UIIHBU73.js.map → chunk-UF3BNMOV.js.map} +0 -0
  100. /package/dist/{chunk-U2LTPDHN.js.map → chunk-VFTP7WSH.js.map} +0 -0
  101. /package/dist/{chunk-YF6VDLIQ.js.map → chunk-VKLUJZQV.js.map} +0 -0
  102. /package/dist/{chunk-DXTTIJL4.js.map → chunk-ZVQ2Q7OM.js.map} +0 -0
  103. /package/dist/{cli-circuit-breaker-MYREMCYC.js.map → cli-circuit-breaker-H5CESPLC.js.map} +0 -0
  104. /package/dist/{composite-router-7EFG5JO3.js.map → composite-router-DSYVXQ7C.js.map} +0 -0
  105. /package/dist/{consensus-vote-T6NT5TH3.js.map → consensus-vote-OKA2PL74.js.map} +0 -0
  106. /package/dist/{context-retriever-5R4KYYDC.js.map → context-retriever-C5KY23EG.js.map} +0 -0
  107. /package/dist/{doctor-deep-R4HXMRIS.js.map → doctor-deep-LBPZXYN4.js.map} +0 -0
  108. /package/dist/{doctor-live-QJRB6HKE.js.map → doctor-live-QAT3FLUJ.js.map} +0 -0
  109. /package/dist/{expert-bridge-GZFSYIDY.js.map → expert-bridge-F7V2AXUD.js.map} +0 -0
  110. /package/dist/{factory-45WRDLYG.js.map → factory-ECJNRE2W.js.map} +0 -0
  111. /package/dist/{factory-BB4L5DMB.js.map → factory-MZTDIMCP.js.map} +0 -0
  112. /package/dist/{improvement-review-PKWQXPPH.js.map → improvement-review-UEVIATKC.js.map} +0 -0
  113. /package/dist/{init-opencode-MF4KJ62S.js.map → init-opencode-WXEXOV6X.js.map} +0 -0
  114. /package/dist/{issue-triage-YYW7GQLN.js.map → issue-triage-OJZ275JY.js.map} +0 -0
  115. /package/dist/{pr-reviewer-helpers-E3GJOIUI.js.map → pr-reviewer-helpers-VRPD3CNI.js.map} +0 -0
  116. /package/dist/{registry-command-CIEY3EKQ.js.map → registry-command-JZLWVBLG.js.map} +0 -0
  117. /package/dist/{repo-security-plan-WEZDYMI4.js.map → repo-security-plan-IS65FSZF.js.map} +0 -0
  118. /package/dist/{research-helpers-synthesize-ZSKQAHME.js.map → research-helpers-synthesize-TLZPEOAU.js.map} +0 -0
  119. /package/dist/{routing-memory-XLXPLSKS.js.map → routing-memory-YHEH7ULH.js.map} +0 -0
  120. /package/dist/{session-memory-P6FIBSKK.js.map → session-memory-5MD3ZFJX.js.map} +0 -0
  121. /package/dist/{setup-config-5IZDOCOE.js.map → setup-config-RFOBGXUH.js.map} +0 -0
  122. /package/dist/{setup-custom-api-2OA4I464.js.map → setup-custom-api-DKXRZY4C.js.map} +0 -0
  123. /package/dist/{setup-data-dir-APES7ONG.js.map → setup-data-dir-JXSO4FDY.js.map} +0 -0
  124. /package/dist/{tool-memory-4K3F2X6J.js.map → tool-memory-HCCMGPVI.js.map} +0 -0
  125. /package/dist/{unified-registry-3QLEUPXI.js.map → unified-registry-3TWHRO5L.js.map} +0 -0
  126. /package/dist/{weather-report-WOKLGC27.js.map → weather-report-MGOA7OOC.js.map} +0 -0
package/dist/cli.js CHANGED
@@ -23,11 +23,11 @@ import {
23
23
  parseExpertReview,
24
24
  reviewPostingBlock,
25
25
  sumFindings
26
- } from "./chunk-ZNQ5F4QP.js";
27
- import "./chunk-WBTC7E6Z.js";
26
+ } from "./chunk-FRHYZJGC.js";
27
+ import "./chunk-2P4HP2A6.js";
28
28
  import {
29
29
  runConfigInitSync
30
- } from "./chunk-P4IBKWRD.js";
30
+ } from "./chunk-FMAJIIXZ.js";
31
31
  import {
32
32
  AuthHandler,
33
33
  CustomExpertDefinitionSchema,
@@ -156,11 +156,11 @@ import {
156
156
  validateNexusEnv,
157
157
  validateWorkflow,
158
158
  wrapInMarkdownFence
159
- } from "./chunk-EKUTAEL6.js";
160
- import "./chunk-DXTTIJL4.js";
159
+ } from "./chunk-PE4QQAAY.js";
160
+ import "./chunk-ZVQ2Q7OM.js";
161
161
  import "./chunk-4GDMHCKX.js";
162
162
  import "./chunk-7ETWTSTB.js";
163
- import "./chunk-Y2S2JKPP.js";
163
+ import "./chunk-AONC4VYB.js";
164
164
  import {
165
165
  CATEGORY_DISPLAY_NAMES,
166
166
  DEFAULT_PR_REVIEW_CONFIG
@@ -176,11 +176,11 @@ import {
176
176
  doctorCommand,
177
177
  initDataDirectories,
178
178
  runDoctor
179
- } from "./chunk-HHPDVL75.js";
180
- import "./chunk-ASF4HCLR.js";
179
+ } from "./chunk-BAGUYKZL.js";
180
+ import "./chunk-MSPYAOAU.js";
181
181
  import {
182
182
  shutdownExpertBridge
183
- } from "./chunk-EK4ANFB2.js";
183
+ } from "./chunk-PJZQQYLJ.js";
184
184
  import {
185
185
  ConsensusVoteInputSchema,
186
186
  DEFAULT_VOTE_TIMEOUT_MS,
@@ -198,19 +198,19 @@ import {
198
198
  registerConsensusVoteTool,
199
199
  seatFallbacks,
200
200
  toRecordDecision
201
- } from "./chunk-IJCXL57M.js";
201
+ } from "./chunk-F76Y5QXV.js";
202
202
  import {
203
203
  buildOpenAICompatAdapters,
204
204
  readOpenAICompatEndpoint,
205
205
  readOpenAICompatEnv
206
- } from "./chunk-6QQOVB6Y.js";
206
+ } from "./chunk-RC4ZQ4ZE.js";
207
207
  import {
208
208
  allOf,
209
209
  anyOf
210
210
  } from "./chunk-OQB3XC5O.js";
211
211
  import {
212
212
  synthesizeResearch
213
- } from "./chunk-ERWWXVVM.js";
213
+ } from "./chunk-A6QRKIGL.js";
214
214
  import {
215
215
  DRAFT_REPLY_BODY_MAX_LENGTH,
216
216
  configureUntrustedInputFirewall,
@@ -221,12 +221,12 @@ import {
221
221
  runUntrustedInputFirewall,
222
222
  validateAgentAction,
223
223
  validateCorroboration
224
- } from "./chunk-QKV4AQSC.js";
225
- import "./chunk-EWCHPHKO.js";
224
+ } from "./chunk-G744HQMZ.js";
225
+ import "./chunk-GOXBEH6M.js";
226
226
  import {
227
227
  ReputationCache,
228
228
  sanitizeInput
229
- } from "./chunk-SPSM7TWB.js";
229
+ } from "./chunk-T6W3N3N3.js";
230
230
  import {
231
231
  ImprovementReviewInputSchema,
232
232
  calculateFitnessScore,
@@ -240,23 +240,23 @@ import {
240
240
  registerImprovementReviewTool,
241
241
  runImprovementReview,
242
242
  scanForSecrets
243
- } from "./chunk-TJIUBTSN.js";
243
+ } from "./chunk-IDPA4X6J.js";
244
244
  import {
245
245
  createDefaultPolicyFirewall,
246
246
  setGlobalPolicyFirewall,
247
247
  setSecureHandlerAuditLogger,
248
248
  stagePolicyFirewallForRollout
249
- } from "./chunk-55QYPH5F.js";
249
+ } from "./chunk-J527NA52.js";
250
250
  import {
251
251
  NODE_ENGINE_RANGE,
252
252
  VERSION,
253
253
  isNodeVersionSupported
254
- } from "./chunk-HRCJYS3M.js";
254
+ } from "./chunk-EVBLCOEN.js";
255
255
  import {
256
256
  claimGlobalRegistry,
257
257
  createUnifiedRegistry,
258
258
  getGlobalRegistry
259
- } from "./chunk-UO7FFOAL.js";
259
+ } from "./chunk-CMG3P6OI.js";
260
260
  import {
261
261
  CodebaseIndexSchema,
262
262
  PaperStatusSchema,
@@ -282,7 +282,7 @@ import {
282
282
  loadSourcesRegistry,
283
283
  rankDiscoveredItems,
284
284
  saveSourcesRegistry
285
- } from "./chunk-6CYKSB6S.js";
285
+ } from "./chunk-6E3DFUYA.js";
286
286
  import {
287
287
  getTsMorph
288
288
  } from "./chunk-W654ME6B.js";
@@ -290,21 +290,21 @@ import {
290
290
  loadPapersRegistry,
291
291
  loadTechniquesRegistry,
292
292
  savePapersRegistry
293
- } from "./chunk-JMUYQMU3.js";
293
+ } from "./chunk-MRGBENPM.js";
294
294
  import {
295
295
  resolveToken
296
- } from "./chunk-JZPRRHNB.js";
296
+ } from "./chunk-IPI4I2UW.js";
297
297
  import {
298
298
  MemoryError,
299
299
  configureToolMemory,
300
300
  shutdownToolMemory
301
- } from "./chunk-RVGICII7.js";
301
+ } from "./chunk-NOSQXAW3.js";
302
302
  import {
303
303
  capitalize,
304
304
  capitalizeKebab,
305
305
  truncateText
306
306
  } from "./chunk-7LP6VJRP.js";
307
- import "./chunk-5MWN2LI2.js";
307
+ import "./chunk-NBTG2OQC.js";
308
308
  import {
309
309
  BUILT_IN_EXPERTS
310
310
  } from "./chunk-AHI43IQB.js";
@@ -318,23 +318,23 @@ import {
318
318
  probeAllClis,
319
319
  readSubprocessDepth,
320
320
  safeJsonParse
321
- } from "./chunk-UIIHBU73.js";
322
- import "./chunk-YYSUWKIF.js";
321
+ } from "./chunk-UF3BNMOV.js";
322
+ import "./chunk-MSSRXYMZ.js";
323
323
  import {
324
324
  DEFAULTS
325
- } from "./chunk-YF6VDLIQ.js";
326
- import "./chunk-QRVI44WE.js";
325
+ } from "./chunk-VKLUJZQV.js";
326
+ import "./chunk-CAIJB3CO.js";
327
327
  import {
328
328
  getNexusTmpDir,
329
329
  nexusMkdtempSync
330
330
  } from "./chunk-HERI7LXN.js";
331
- import "./chunk-U2LTPDHN.js";
331
+ import "./chunk-VFTP7WSH.js";
332
332
  import "./chunk-QZUG667L.js";
333
- import "./chunk-UFLDOHWI.js";
333
+ import "./chunk-AWCSYKUR.js";
334
334
  import {
335
335
  getDefaultCliCircuitBreakerRegistry,
336
336
  mapModelErrorToCategory
337
- } from "./chunk-FKHYDVCQ.js";
337
+ } from "./chunk-T52Y554H.js";
338
338
  import {
339
339
  API_TIMEOUTS,
340
340
  AgentCapability,
@@ -422,7 +422,7 @@ import {
422
422
  validateTimeout,
423
423
  writeEmptyLine,
424
424
  writeLine
425
- } from "./chunk-JFANCEZ4.js";
425
+ } from "./chunk-WFHUSSKZ.js";
426
426
  import "./chunk-4UHDDCRB.js";
427
427
  import {
428
428
  applyPortableMode,
@@ -4572,7 +4572,7 @@ Provide a structured review with:
4572
4572
  * (Source: Issue #828 — Wire policy gate into production pipeline)
4573
4573
  */
4574
4574
  async postReviewToGitHub(provider, pr, result, gateDecision, reputation) {
4575
- const { formatReviewComment: formatReviewComment2 } = await import("./pr-reviewer-helpers-E3GJOIUI.js");
4575
+ const { formatReviewComment: formatReviewComment2 } = await import("./pr-reviewer-helpers-VRPD3CNI.js");
4576
4576
  const formattedBody = formatReviewComment2(result);
4577
4577
  const body = truncateText(formattedBody, DRAFT_REPLY_BODY_MAX_LENGTH, "\u2026[review truncated]");
4578
4578
  const sources = buildReviewCitations(pr.files);
@@ -12244,7 +12244,7 @@ function probeGrammars(register, parse6, probes = GRAMMAR_PROBES) {
12244
12244
  }
12245
12245
  async function loadGrammarModules() {
12246
12246
  const [{ ensurePolyglotLangs }, napi] = await Promise.all([
12247
- import("./ast-rule-runner-6IAAL43M.js"),
12247
+ import("./ast-rule-runner-BXBBL5G7.js"),
12248
12248
  import("@ast-grep/napi")
12249
12249
  ]);
12250
12250
  return { register: ensurePolyglotLangs, parse: napi.parse };
@@ -17155,10 +17155,10 @@ function parseConventionalCommit(hash, message) {
17155
17155
  function extractIssueNumbers(message) {
17156
17156
  const issueRegex = /#(\d+)/g;
17157
17157
  const matches = message.matchAll(issueRegex);
17158
- return Array.from(matches, (m) => `#${m[1]}`);
17158
+ return Array.from(matches, (m) => `#${m[1] ?? ""}`);
17159
17159
  }
17160
17160
  function mapTypeToCategory(type) {
17161
- return COMMIT_TYPE_TO_CATEGORY[type.toLowerCase()] || "Maintenance";
17161
+ return COMMIT_TYPE_TO_CATEGORY[type.toLowerCase()] ?? "Maintenance";
17162
17162
  }
17163
17163
  function groupCommitsByCategory(commits) {
17164
17164
  const categoryMap = /* @__PURE__ */ new Map();
@@ -17183,7 +17183,7 @@ function groupCommitsByCategory(commits) {
17183
17183
  return categories;
17184
17184
  }
17185
17185
  function formatCommitEntry(commit) {
17186
- const scopePart = commit.scope ? `**${commit.scope}**: ` : "";
17186
+ const scopePart = commit.scope !== void 0 && commit.scope.length > 0 ? `**${commit.scope}**: ` : "";
17187
17187
  const issuesPart = commit.issues.length > 0 ? ` (${commit.issues.join(", ")})` : "";
17188
17188
  const breakingPrefix = commit.breaking ? "**BREAKING**: " : "";
17189
17189
  return `- ${breakingPrefix}${scopePart}${commit.subject}${issuesPart}`;
@@ -17232,9 +17232,9 @@ function generateMarkdownFormat(version, categories) {
17232
17232
  const totalCount = categories.reduce((sum, c) => sum + c.commits.length, 0);
17233
17233
  lines.push("## Highlights");
17234
17234
  lines.push("");
17235
- lines.push(`This release includes **${totalCount}** changes:`);
17236
- if (featCount > 0) lines.push(`- ${featCount} new features`);
17237
- if (fixCount > 0) lines.push(`- ${fixCount} bug fixes`);
17235
+ lines.push(`This release includes **${String(totalCount)}** changes:`);
17236
+ if (featCount > 0) lines.push(`- ${String(featCount)} new features`);
17237
+ if (fixCount > 0) lines.push(`- ${String(fixCount)} bug fixes`);
17238
17238
  lines.push("");
17239
17239
  for (const category of categories) {
17240
17240
  lines.push(`## ${category.name}`);
@@ -17254,13 +17254,13 @@ function suggestNextVersion(currentVersion, commits) {
17254
17254
  const patch = parts[2] ?? 0;
17255
17255
  const hasBreaking = commits.some((c) => c.breaking);
17256
17256
  if (hasBreaking) {
17257
- return `${major + 1}.0.0`;
17257
+ return `${String(major + 1)}.0.0`;
17258
17258
  }
17259
17259
  const hasFeatures = commits.some((c) => c.type === "feat");
17260
17260
  if (hasFeatures) {
17261
- return `${major}.${minor + 1}.0`;
17261
+ return `${String(major)}.${String(minor + 1)}.0`;
17262
17262
  }
17263
- return `${major}.${minor}.${patch + 1}`;
17263
+ return `${String(major)}.${String(minor)}.${String(patch + 1)}`;
17264
17264
  }
17265
17265
 
17266
17266
  // src/cli/release-notes-command.ts
@@ -17269,84 +17269,71 @@ var DEFAULT_OPTIONS = {
17269
17269
  dryRun: false,
17270
17270
  verbose: false
17271
17271
  };
17272
- async function runReleaseNotes(options = {}) {
17272
+ function isGivenRef(ref) {
17273
+ return ref !== void 0 && ref !== "";
17274
+ }
17275
+ function earlyResult(fields, startTime) {
17276
+ return {
17277
+ ...fields,
17278
+ version: "unknown",
17279
+ commitCount: 0,
17280
+ categories: [],
17281
+ usedConsensus: false,
17282
+ durationMs: Date.now() - startTime
17283
+ };
17284
+ }
17285
+ function parseCommitLines(commitLines) {
17286
+ return commitLines.map((line) => {
17287
+ const spaceIndex = line.indexOf(" ");
17288
+ const hash = line.substring(0, spaceIndex);
17289
+ const message = line.substring(spaceIndex + 1);
17290
+ return parseConventionalCommit(hash, message);
17291
+ });
17292
+ }
17293
+ function renderReleaseNotes(format, version, categories) {
17294
+ const today = (/* @__PURE__ */ new Date()).toISOString().split("T")[0] ?? (/* @__PURE__ */ new Date()).toISOString().slice(0, 10);
17295
+ switch (format) {
17296
+ case "json":
17297
+ return generateJsonFormat(version, today, categories);
17298
+ case "markdown":
17299
+ return generateMarkdownFormat(version, categories);
17300
+ case "changelog":
17301
+ default:
17302
+ return generateChangelogFormat(version, today, categories);
17303
+ }
17304
+ }
17305
+ function buildReleaseNotes(options) {
17273
17306
  const startTime = Date.now();
17274
17307
  const opts = { ...DEFAULT_OPTIONS, ...options };
17275
- const fromRef = opts.from || getLatestTag() || "HEAD~50";
17276
- const toRef = opts.to || "HEAD";
17308
+ const fromRef = isGivenRef(opts.from) ? opts.from : getLatestTag() ?? "HEAD~50";
17309
+ const toRef = isGivenRef(opts.to) ? opts.to : "HEAD";
17277
17310
  if (opts.verbose) {
17278
17311
  console.log(`${colors.dim}Analyzing commits from ${fromRef} to ${toRef}...${colors.reset}`);
17279
17312
  }
17280
17313
  const commitsResult = tryGetCommitsBetween(fromRef, toRef);
17281
17314
  if (commitsResult.kind === "invalid_ref") {
17282
- return {
17283
- success: false,
17284
- content: `Invalid git ref: "${commitsResult.ref}". Refs may only contain [a-zA-Z0-9._\\-/~^].`,
17285
- version: "unknown",
17286
- fromRef,
17287
- toRef,
17288
- commitCount: 0,
17289
- categories: [],
17290
- usedConsensus: false,
17291
- durationMs: Date.now() - startTime
17292
- };
17315
+ const content = `Invalid git ref: "${commitsResult.ref}". Refs may only contain [a-zA-Z0-9._\\-/~^].`;
17316
+ return earlyResult({ success: false, content, fromRef, toRef }, startTime);
17293
17317
  }
17294
17318
  if (commitsResult.kind === "git_failed") {
17295
- return {
17296
- success: false,
17297
- content: `git log failed for ${fromRef}..${toRef}: ${commitsResult.reason}`,
17298
- version: "unknown",
17299
- fromRef,
17300
- toRef,
17301
- commitCount: 0,
17302
- categories: [],
17303
- usedConsensus: false,
17304
- durationMs: Date.now() - startTime
17305
- };
17319
+ const content = `git log failed for ${fromRef}..${toRef}: ${commitsResult.reason}`;
17320
+ return earlyResult({ success: false, content, fromRef, toRef }, startTime);
17306
17321
  }
17307
- const commitLines = commitsResult.commits;
17308
- if (commitLines.length === 0) {
17309
- return {
17310
- success: true,
17311
- content: "No commits found in range.",
17312
- version: "unknown",
17313
- fromRef,
17314
- toRef,
17315
- commitCount: 0,
17316
- categories: [],
17317
- usedConsensus: false,
17318
- durationMs: Date.now() - startTime
17319
- };
17322
+ if (commitsResult.commits.length === 0) {
17323
+ const content = "No commits found in range.";
17324
+ return earlyResult({ success: true, content, fromRef, toRef }, startTime);
17320
17325
  }
17321
- const commits = commitLines.map((line) => {
17322
- const spaceIndex = line.indexOf(" ");
17323
- const hash = line.substring(0, spaceIndex);
17324
- const message = line.substring(spaceIndex + 1);
17325
- return parseConventionalCommit(hash, message);
17326
- });
17326
+ const commits = parseCommitLines(commitsResult.commits);
17327
17327
  if (opts.verbose) {
17328
- console.log(`${colors.dim}Found ${commits.length} commits${colors.reset}`);
17328
+ console.log(`${colors.dim}Found ${String(commits.length)} commits${colors.reset}`);
17329
17329
  }
17330
17330
  const categories = groupCommitsByCategory(commits);
17331
- const currentVersion = fromRef.replace(/^v/, "") || "0.0.0";
17331
+ const stripped = fromRef.replace(/^v/, "");
17332
+ const currentVersion = stripped === "" ? "0.0.0" : stripped;
17332
17333
  const suggestedVersion = suggestNextVersion(currentVersion, commits);
17333
- const today = (/* @__PURE__ */ new Date()).toISOString().split("T")[0] ?? (/* @__PURE__ */ new Date()).toISOString().slice(0, 10);
17334
- let output2;
17335
- switch (opts.format) {
17336
- case "json":
17337
- output2 = generateJsonFormat(suggestedVersion, today, categories);
17338
- break;
17339
- case "markdown":
17340
- output2 = generateMarkdownFormat(suggestedVersion, categories);
17341
- break;
17342
- case "changelog":
17343
- default:
17344
- output2 = generateChangelogFormat(suggestedVersion, today, categories);
17345
- break;
17346
- }
17347
17334
  return {
17348
17335
  success: true,
17349
- content: output2,
17336
+ content: renderReleaseNotes(opts.format, suggestedVersion, categories),
17350
17337
  version: suggestedVersion,
17351
17338
  fromRef,
17352
17339
  toRef,
@@ -17356,6 +17343,9 @@ async function runReleaseNotes(options = {}) {
17356
17343
  durationMs: Date.now() - startTime
17357
17344
  };
17358
17345
  }
17346
+ function runReleaseNotes(options = {}) {
17347
+ return Promise.resolve(buildReleaseNotes(options));
17348
+ }
17359
17349
  function printReleaseNotesResult(result, verbose = false) {
17360
17350
  if (verbose) {
17361
17351
  console.log("");
@@ -17363,16 +17353,16 @@ function printReleaseNotesResult(result, verbose = false) {
17363
17353
  console.log(`${colors.dim}${"\u2500".repeat(50)}${colors.reset}`);
17364
17354
  console.log(`${colors.dim}Version:${colors.reset} ${result.version}`);
17365
17355
  console.log(`${colors.dim}Range:${colors.reset} ${result.fromRef}..${result.toRef}`);
17366
- console.log(`${colors.dim}Commits:${colors.reset} ${result.commitCount}`);
17367
- console.log(`${colors.dim}Categories:${colors.reset} ${result.categories.length}`);
17368
- console.log(`${colors.dim}Duration:${colors.reset} ${result.durationMs}ms`);
17356
+ console.log(`${colors.dim}Commits:${colors.reset} ${String(result.commitCount)}`);
17357
+ console.log(`${colors.dim}Categories:${colors.reset} ${String(result.categories.length)}`);
17358
+ console.log(`${colors.dim}Duration:${colors.reset} ${String(result.durationMs)}ms`);
17369
17359
  console.log(`${colors.dim}${"\u2500".repeat(50)}${colors.reset}`);
17370
17360
  console.log("");
17371
17361
  }
17372
17362
  console.log(result.content);
17373
17363
  }
17374
17364
  async function releaseNotesCommand(args) {
17375
- const format = args.options.format || "changelog";
17365
+ const format = args.options.format !== void 0 && args.options.format !== "" ? args.options.format : "changelog";
17376
17366
  const options = {
17377
17367
  format,
17378
17368
  dryRun: args.options.dryRun ?? false,
@@ -17382,7 +17372,7 @@ async function releaseNotesCommand(args) {
17382
17372
  if (args.options.to !== void 0) options.to = args.options.to;
17383
17373
  const result = await runReleaseNotes(options);
17384
17374
  if (!result.success) {
17385
- console.error(`${colors.red}Error: ${result.error}${colors.reset}`);
17375
+ console.error(`${colors.red}Error: ${result.error ?? result.content}${colors.reset}`);
17386
17376
  return 1;
17387
17377
  }
17388
17378
  printReleaseNotesResult(result, args.options.verbose);
@@ -17485,7 +17475,7 @@ function runNpmAudit() {
17485
17475
  return unavailableNpmAuditFinding(reason);
17486
17476
  }
17487
17477
  }
17488
- async function validateSecurity(options) {
17478
+ function validateSecurity(_options) {
17489
17479
  const startTime = Date.now();
17490
17480
  const findings = [];
17491
17481
  const auditFinding = runNpmAudit();
@@ -17517,7 +17507,7 @@ async function validateSecurity(options) {
17517
17507
  remediation: "Review commits for any exposed credentials."
17518
17508
  });
17519
17509
  }
17520
- return {
17510
+ return Promise.resolve({
17521
17511
  expert: "security",
17522
17512
  // whenEmpty = false: an empty list genuinely means "scanned, nothing
17523
17513
  // found" — every check above records a finding when it cannot run, which
@@ -17526,9 +17516,36 @@ async function validateSecurity(options) {
17526
17516
  confidence: 0.85,
17527
17517
  findings,
17528
17518
  durationMs: Date.now() - startTime
17529
- };
17519
+ });
17530
17520
  }
17531
- async function validateArchitecture2(options) {
17521
+ function fitnessScoreFinding(fitnessScore) {
17522
+ if (fitnessScore < 90) {
17523
+ return {
17524
+ severity: "error",
17525
+ category: "architecture",
17526
+ title: `Fitness score below threshold: ${String(fitnessScore)}/100`,
17527
+ description: "Release gate requires fitness score >= 90.",
17528
+ remediation: "Address fitness audit findings before release."
17529
+ };
17530
+ }
17531
+ return {
17532
+ severity: "info",
17533
+ category: "architecture",
17534
+ title: `Fitness score: ${String(fitnessScore)}/100`,
17535
+ description: "Fitness score meets release threshold."
17536
+ };
17537
+ }
17538
+ function fitnessDimensionFindings(audit) {
17539
+ const auditFindings = audit["findings"];
17540
+ if (!Array.isArray(auditFindings)) return [];
17541
+ return auditFindings.map((finding) => ({
17542
+ severity: "info",
17543
+ category: "architecture",
17544
+ title: typeof finding["message"] === "string" ? finding["message"] : "Fitness finding",
17545
+ description: typeof finding["suggestion"] === "string" ? finding["suggestion"] : ""
17546
+ }));
17547
+ }
17548
+ function validateArchitecture2(_options) {
17532
17549
  const startTime = Date.now();
17533
17550
  const findings = [];
17534
17551
  try {
@@ -17539,33 +17556,7 @@ async function validateArchitecture2(options) {
17539
17556
  });
17540
17557
  const audit = JSON.parse(result);
17541
17558
  const fitnessScore = typeof audit["score"] === "number" ? audit["score"] : 0;
17542
- if (fitnessScore < 90) {
17543
- findings.push({
17544
- severity: "error",
17545
- category: "architecture",
17546
- title: `Fitness score below threshold: ${fitnessScore}/100`,
17547
- description: "Release gate requires fitness score >= 90.",
17548
- remediation: "Address fitness audit findings before release."
17549
- });
17550
- } else {
17551
- findings.push({
17552
- severity: "info",
17553
- category: "architecture",
17554
- title: `Fitness score: ${fitnessScore}/100`,
17555
- description: "Fitness score meets release threshold."
17556
- });
17557
- }
17558
- const auditFindings = audit["findings"];
17559
- if (Array.isArray(auditFindings)) {
17560
- for (const finding of auditFindings) {
17561
- findings.push({
17562
- severity: "info",
17563
- category: "architecture",
17564
- title: typeof finding["message"] === "string" ? finding["message"] : "Fitness finding",
17565
- description: typeof finding["suggestion"] === "string" ? finding["suggestion"] : ""
17566
- });
17567
- }
17568
- }
17559
+ findings.push(fitnessScoreFinding(fitnessScore), ...fitnessDimensionFindings(audit));
17569
17560
  } catch {
17570
17561
  findings.push({
17571
17562
  severity: "warning",
@@ -17576,15 +17567,15 @@ async function validateArchitecture2(options) {
17576
17567
  });
17577
17568
  }
17578
17569
  const hasErrors = findings.some((f) => f.severity === "error");
17579
- return {
17570
+ return Promise.resolve({
17580
17571
  expert: "architecture",
17581
17572
  passed: !hasErrors,
17582
17573
  confidence: 0.9,
17583
17574
  findings,
17584
17575
  durationMs: Date.now() - startTime
17585
- };
17576
+ });
17586
17577
  }
17587
- async function validateDocumentation(options) {
17578
+ function validateDocumentation(options) {
17588
17579
  const startTime = Date.now();
17589
17580
  const findings = [];
17590
17581
  if (!existsSync15("CHANGELOG.md")) {
@@ -17624,88 +17615,71 @@ async function validateDocumentation(options) {
17624
17615
  });
17625
17616
  }
17626
17617
  const hasErrors = findings.some((f) => f.severity === "error");
17627
- return {
17618
+ return Promise.resolve({
17628
17619
  expert: "documentation",
17629
17620
  passed: !hasErrors,
17630
17621
  confidence: 0.85,
17631
17622
  findings,
17632
17623
  durationMs: Date.now() - startTime
17633
- };
17624
+ });
17634
17625
  }
17635
- async function validateDevOps(options) {
17636
- const startTime = Date.now();
17637
- const findings = [];
17638
- try {
17639
- execSync5("pnpm build 2>/dev/null", {
17640
- encoding: "utf-8",
17641
- stdio: ["pipe", "pipe", "pipe"],
17642
- timeout: CLI_SUBPROCESS_TIMEOUTS.releaseValidateMs
17643
- });
17644
- findings.push({
17645
- severity: "info",
17646
- category: "ci",
17647
- title: "Build passes",
17648
- description: "pnpm build completed successfully."
17649
- });
17650
- } catch {
17651
- findings.push({
17652
- severity: "error",
17653
- category: "ci",
17654
- title: "Build failed",
17655
- description: "pnpm build failed.",
17656
- remediation: "Fix build errors before release."
17657
- });
17658
- }
17659
- try {
17660
- execSync5("pnpm lint 2>/dev/null", {
17661
- encoding: "utf-8",
17662
- stdio: ["pipe", "pipe", "pipe"],
17663
- timeout: CLI_SUBPROCESS_TIMEOUTS.releaseBuildMs
17664
- });
17665
- findings.push({
17666
- severity: "info",
17667
- category: "ci",
17668
- title: "Lint passes",
17669
- description: "pnpm lint completed successfully."
17670
- });
17671
- } catch {
17672
- findings.push({
17673
- severity: "error",
17674
- category: "ci",
17675
- title: "Lint failed",
17676
- description: "pnpm lint failed.",
17677
- remediation: "Fix lint errors before release."
17678
- });
17626
+ var CI_GATES = [
17627
+ {
17628
+ command: "pnpm build 2>/dev/null",
17629
+ timeoutMs: CLI_SUBPROCESS_TIMEOUTS.releaseValidateMs,
17630
+ name: "Build",
17631
+ script: "pnpm build",
17632
+ remediation: "Fix build errors before release."
17633
+ },
17634
+ {
17635
+ command: "pnpm lint 2>/dev/null",
17636
+ timeoutMs: CLI_SUBPROCESS_TIMEOUTS.releaseBuildMs,
17637
+ name: "Lint",
17638
+ script: "pnpm lint",
17639
+ remediation: "Fix lint errors before release."
17640
+ },
17641
+ {
17642
+ command: "pnpm typecheck 2>/dev/null",
17643
+ timeoutMs: CLI_SUBPROCESS_TIMEOUTS.releaseValidateMs,
17644
+ name: "Type check",
17645
+ script: "pnpm typecheck",
17646
+ remediation: "Fix type errors before release."
17679
17647
  }
17648
+ ];
17649
+ function runCiGate(gate) {
17680
17650
  try {
17681
- execSync5("pnpm typecheck 2>/dev/null", {
17651
+ execSync5(gate.command, {
17682
17652
  encoding: "utf-8",
17683
17653
  stdio: ["pipe", "pipe", "pipe"],
17684
- timeout: CLI_SUBPROCESS_TIMEOUTS.releaseValidateMs
17654
+ timeout: gate.timeoutMs
17685
17655
  });
17686
- findings.push({
17656
+ return {
17687
17657
  severity: "info",
17688
17658
  category: "ci",
17689
- title: "Type check passes",
17690
- description: "pnpm typecheck completed successfully."
17691
- });
17659
+ title: `${gate.name} passes`,
17660
+ description: `${gate.script} completed successfully.`
17661
+ };
17692
17662
  } catch {
17693
- findings.push({
17663
+ return {
17694
17664
  severity: "error",
17695
17665
  category: "ci",
17696
- title: "Type check failed",
17697
- description: "pnpm typecheck failed.",
17698
- remediation: "Fix type errors before release."
17699
- });
17666
+ title: `${gate.name} failed`,
17667
+ description: `${gate.script} failed.`,
17668
+ remediation: gate.remediation
17669
+ };
17700
17670
  }
17671
+ }
17672
+ function validateDevOps(_options) {
17673
+ const startTime = Date.now();
17674
+ const findings = CI_GATES.map(runCiGate);
17701
17675
  const hasErrors = findings.some((f) => f.severity === "error");
17702
- return {
17676
+ return Promise.resolve({
17703
17677
  expert: "devops",
17704
17678
  passed: !hasErrors,
17705
17679
  confidence: 0.95,
17706
17680
  findings,
17707
17681
  durationMs: Date.now() - startTime
17708
- };
17682
+ });
17709
17683
  }
17710
17684
 
17711
17685
  // src/cli/release-validate-command.ts
@@ -17895,6 +17869,12 @@ var DEFAULT_OPTIONS3 = {
17895
17869
  dryRun: false,
17896
17870
  verbose: false
17897
17871
  };
17872
+ function isNonEmpty(value) {
17873
+ return value !== void 0 && value !== "";
17874
+ }
17875
+ function isoDateToday() {
17876
+ return (/* @__PURE__ */ new Date()).toISOString().split("T")[0] ?? (/* @__PURE__ */ new Date()).toISOString().slice(0, 10);
17877
+ }
17898
17878
  function extractHighlightsFromChangelog(version) {
17899
17879
  if (!existsSync16("CHANGELOG.md")) return [];
17900
17880
  const changelog = readFileSync14("CHANGELOG.md", "utf-8");
@@ -17903,17 +17883,22 @@ function extractHighlightsFromChangelog(version) {
17903
17883
  const match = changelog.match(versionRegex);
17904
17884
  if (!match) return [];
17905
17885
  const addedMatch = match[0].match(/### Added\n((?:- .+\n)+)/);
17906
- if (addedMatch?.[1]) {
17907
- return addedMatch[1].split("\n").filter((l) => l.startsWith("- ")).slice(0, 5).map(
17886
+ const added = addedMatch?.[1];
17887
+ if (added !== void 0) {
17888
+ return added.split("\n").filter((l) => l.startsWith("- ")).slice(0, 5).map(
17908
17889
  (l) => l.replace(/^- /, "").replace(/\(#\d+\)/g, "").trim()
17909
17890
  );
17910
17891
  }
17911
17892
  return [];
17912
17893
  }
17913
- function generateBlogPost(options) {
17914
- const highlights = options.highlights || extractHighlightsFromChangelog(options.version);
17915
- const today = (/* @__PURE__ */ new Date()).toISOString().split("T")[0] ?? (/* @__PURE__ */ new Date()).toISOString().slice(0, 10);
17916
- const fromRef = getLatestTag() || "HEAD~50";
17894
+ function resolveHighlights(options) {
17895
+ return options.highlights ?? extractHighlightsFromChangelog(options.version);
17896
+ }
17897
+ function resolveReleaseUrl(options) {
17898
+ return isNonEmpty(options.releaseUrl) ? options.releaseUrl : `https://github.com/nexus-substrate/nexus-agents/releases/tag/v${options.version}`;
17899
+ }
17900
+ function collectBlogCommitStats() {
17901
+ const fromRef = getLatestTag() ?? "HEAD~50";
17917
17902
  const commitsResult = tryGetCommitsBetween(fromRef, "HEAD");
17918
17903
  const commits = commitsResult.kind === "ok" ? commitsResult.commits : [];
17919
17904
  if (commitsResult.kind !== "ok") {
@@ -17927,29 +17912,37 @@ function generateBlogPost(options) {
17927
17912
  return parseConventionalCommit(line.substring(0, spaceIndex), line.substring(spaceIndex + 1));
17928
17913
  });
17929
17914
  const categories = groupCommitsByCategory(parsedCommits);
17930
- const featCount = categories.find((c) => c.name === "Added")?.commits.length ?? 0;
17931
- const fixCount = categories.find((c) => c.name === "Fixed")?.commits.length ?? 0;
17932
- const refactorCount = categories.find((c) => c.name === "Changed")?.commits.length ?? 0;
17933
- const frontmatter = {
17934
- title: `nexus-agents v${options.version} Released: Multi-Agent Orchestration Improvements`,
17935
- date: today,
17936
- description: `Announcing nexus-agents v${options.version} with ${featCount} new features, ${fixCount} bug fixes, and improved multi-agent orchestration capabilities.`,
17937
- tags: ["nexus-agents", "release", "mcp", "ai", "multi-agent"],
17938
- author: "William Zujkowski"
17915
+ const countOf = (name) => categories.find((c) => c.name === name)?.commits.length ?? 0;
17916
+ return {
17917
+ totalCommits: commits.length,
17918
+ featCount: countOf("Added"),
17919
+ fixCount: countOf("Fixed"),
17920
+ refactorCount: countOf("Changed"),
17921
+ categories
17939
17922
  };
17940
- const content = `---
17923
+ }
17924
+ function renderTopCommits(categories, name) {
17925
+ const commits = categories.find((c) => c.name === name)?.commits.slice(0, 5) ?? [];
17926
+ if (commits.length === 0) return "See CHANGELOG.md for details.";
17927
+ return commits.map((c) => `- ${isNonEmpty(c.scope) ? `**${c.scope}**: ` : ""}${c.subject}`).join("\n");
17928
+ }
17929
+ function renderBlogFrontmatter(frontmatter) {
17930
+ return `---
17941
17931
  title: "${frontmatter.title}"
17942
17932
  date: ${frontmatter.date}
17943
17933
  description: "${frontmatter.description}"
17944
17934
  tags: [${frontmatter.tags.map((t) => `"${t}"`).join(", ")}]
17945
17935
  author: "${frontmatter.author}"
17946
17936
  ---
17947
-
17948
- # nexus-agents v${options.version} Released
17937
+ `;
17938
+ }
17939
+ function renderBlogSummary(version, stats, highlights) {
17940
+ return `
17941
+ # nexus-agents v${version} Released
17949
17942
 
17950
17943
  **BLUF (Bottom Line Up Front):**
17951
17944
 
17952
- I've released nexus-agents v${options.version} with ${commits.length} changes including ${featCount} new features and ${fixCount} bug fixes. This release focuses on improved multi-agent orchestration, better developer experience, and enhanced reliability.
17945
+ I've released nexus-agents v${version} with ${String(stats.totalCommits)} changes including ${String(stats.featCount)} new features and ${String(stats.fixCount)} bug fixes. This release focuses on improved multi-agent orchestration, better developer experience, and enhanced reliability.
17953
17946
 
17954
17947
  **Why it matters:** Multi-agent AI orchestration is becoming essential for complex software development tasks. This release makes it easier to leverage multiple AI models effectively.
17955
17948
 
@@ -17965,29 +17958,35 @@ ${highlights.map((h) => `- **${h}**`).join("\n")}
17965
17958
 
17966
17959
  I analyzed the changes in this release:
17967
17960
 
17968
- - **Total commits:** ${commits.length}
17969
- - **New features:** ${featCount}
17970
- - **Bug fixes:** ${fixCount}
17971
- - **Refactoring:** ${refactorCount}
17961
+ - **Total commits:** ${String(stats.totalCommits)}
17962
+ - **New features:** ${String(stats.featCount)}
17963
+ - **Bug fixes:** ${String(stats.fixCount)}
17964
+ - **Refactoring:** ${String(stats.refactorCount)}
17972
17965
 
17973
17966
  ---
17974
-
17967
+ `;
17968
+ }
17969
+ function renderBlogChanges(categories) {
17970
+ return `
17975
17971
  ## Key Changes
17976
17972
 
17977
17973
  ### New Features
17978
17974
 
17979
- ${categories.find((c) => c.name === "Added")?.commits.slice(0, 5).map((c) => `- ${c.scope ? `**${c.scope}**: ` : ""}${c.subject}`).join("\n") || "See CHANGELOG.md for details."}
17975
+ ${renderTopCommits(categories, "Added")}
17980
17976
 
17981
17977
  ### Bug Fixes
17982
17978
 
17983
- ${categories.find((c) => c.name === "Fixed")?.commits.slice(0, 5).map((c) => `- ${c.scope ? `**${c.scope}**: ` : ""}${c.subject}`).join("\n") || "See CHANGELOG.md for details."}
17979
+ ${renderTopCommits(categories, "Fixed")}
17984
17980
 
17985
17981
  ---
17986
-
17982
+ `;
17983
+ }
17984
+ function renderBlogFooter(version, releaseUrl) {
17985
+ return `
17987
17986
  ## Installation
17988
17987
 
17989
17988
  \`\`\`bash
17990
- npm install -g nexus-agents@${options.version}
17989
+ npm install -g nexus-agents@${version}
17991
17990
  nexus-agents doctor # Verify installation
17992
17991
  \`\`\`
17993
17992
 
@@ -18004,7 +18003,7 @@ nexus-agents doctor # Verify installation
18004
18003
  ## Further Reading
18005
18004
 
18006
18005
  ### Official Resources
18007
- - [GitHub Release](${options.releaseUrl || `https://github.com/nexus-substrate/nexus-agents/releases/tag/v${options.version}`})
18006
+ - [GitHub Release](${releaseUrl})
18008
18007
  - [Full Changelog](https://github.com/nexus-substrate/nexus-agents/blob/main/CHANGELOG.md)
18009
18008
  - [Documentation](https://github.com/nexus-substrate/nexus-agents)
18010
18009
 
@@ -18012,12 +18011,24 @@ nexus-agents doctor # Verify installation
18012
18011
 
18013
18012
  *Released via multi-agent orchestration*
18014
18013
  `;
18015
- return content;
18014
+ }
18015
+ function generateBlogPost(options) {
18016
+ const highlights = resolveHighlights(options);
18017
+ const stats = collectBlogCommitStats();
18018
+ const frontmatter = {
18019
+ title: `nexus-agents v${options.version} Released: Multi-Agent Orchestration Improvements`,
18020
+ date: isoDateToday(),
18021
+ description: `Announcing nexus-agents v${options.version} with ${String(stats.featCount)} new features, ${String(stats.fixCount)} bug fixes, and improved multi-agent orchestration capabilities.`,
18022
+ tags: ["nexus-agents", "release", "mcp", "ai", "multi-agent"],
18023
+ author: "William Zujkowski"
18024
+ };
18025
+ return renderBlogFrontmatter(frontmatter) + renderBlogSummary(options.version, stats, highlights) + renderBlogChanges(stats.categories) + renderBlogFooter(options.version, resolveReleaseUrl(options));
18016
18026
  }
18017
18027
  function generateBlueskyPost(options) {
18018
- const highlights = options.highlights || extractHighlightsFromChangelog(options.version);
18019
- const highlight = highlights[0] || "new features and improvements";
18020
- const releaseUrl = options.releaseUrl || `https://github.com/nexus-substrate/nexus-agents/releases/tag/v${options.version}`;
18028
+ const highlights = resolveHighlights(options);
18029
+ const firstHighlight = highlights[0];
18030
+ const highlight = isNonEmpty(firstHighlight) ? firstHighlight : "new features and improvements";
18031
+ const releaseUrl = resolveReleaseUrl(options);
18021
18032
  let post = `\u{1F680} nexus-agents v${options.version} released!
18022
18033
 
18023
18034
  `;
@@ -18034,9 +18045,9 @@ function generateBlueskyPost(options) {
18034
18045
  }
18035
18046
  return post;
18036
18047
  }
18037
- async function announceToBlog(options) {
18048
+ function announceToBlog(options) {
18038
18049
  const content = generateBlogPost(options);
18039
- const filename = `${(/* @__PURE__ */ new Date()).toISOString().split("T")[0]}-nexus-agents-v${options.version.replace(/\./g, "-")}-release.md`;
18050
+ const filename = `${isoDateToday()}-nexus-agents-v${options.version.replace(/\./g, "-")}-release.md`;
18040
18051
  if (options.dryRun) {
18041
18052
  return {
18042
18053
  channel: "blog",
@@ -18107,7 +18118,7 @@ async function runReleaseAnnounce(options) {
18107
18118
  let result;
18108
18119
  switch (channel) {
18109
18120
  case "blog":
18110
- result = await announceToBlog(opts);
18121
+ result = announceToBlog(opts);
18111
18122
  break;
18112
18123
  case "bluesky":
18113
18124
  result = await announceToBluesky(opts);
@@ -18117,7 +18128,7 @@ async function runReleaseAnnounce(options) {
18117
18128
  channel,
18118
18129
  success: false,
18119
18130
  content: "",
18120
- error: `Unknown channel: ${channel}`
18131
+ error: `Unknown channel: ${String(channel)}`
18121
18132
  };
18122
18133
  }
18123
18134
  results.push(result);
@@ -18135,15 +18146,15 @@ function printReleaseAnnounceResult(result, verbose = false) {
18135
18146
  console.log(`${colors.cyan}${colors.bold}Release Announcement Report${colors.reset}`);
18136
18147
  console.log(`${colors.dim}${"\u2550".repeat(50)}${colors.reset}`);
18137
18148
  console.log(`${colors.dim}Version:${colors.reset} ${result.version}`);
18138
- console.log(`${colors.dim}Duration:${colors.reset} ${result.durationMs}ms`);
18149
+ console.log(`${colors.dim}Duration:${colors.reset} ${String(result.durationMs)}ms`);
18139
18150
  console.log("");
18140
18151
  for (const channel of result.channels) {
18141
18152
  const status = channel.success ? `${colors.green}\u2713${colors.reset}` : `${colors.red}\u2717${colors.reset}`;
18142
18153
  console.log(`${status} ${colors.bold}${channel.channel.toUpperCase()}${colors.reset}`);
18143
- if (channel.url) {
18154
+ if (isNonEmpty(channel.url)) {
18144
18155
  console.log(` ${colors.dim}URL:${colors.reset} ${channel.url}`);
18145
18156
  }
18146
- if (channel.error) {
18157
+ if (isNonEmpty(channel.error)) {
18147
18158
  console.log(` ${colors.red}Error:${colors.reset} ${channel.error}`);
18148
18159
  }
18149
18160
  if (verbose) {
@@ -18161,24 +18172,22 @@ function printReleaseAnnounceResult(result, verbose = false) {
18161
18172
  console.log(`${colors.yellow}${colors.bold}\u26A0 Some announcements failed${colors.reset}`);
18162
18173
  }
18163
18174
  }
18175
+ function resolveAnnounceVersion(explicit) {
18176
+ if (isNonEmpty(explicit)) return explicit;
18177
+ try {
18178
+ const pkg = JSON.parse(readFileSync14("package.json", "utf-8"));
18179
+ return isNonEmpty(pkg.version) ? pkg.version : void 0;
18180
+ } catch {
18181
+ return void 0;
18182
+ }
18183
+ }
18164
18184
  async function releaseAnnounceCommand(args) {
18165
- let version;
18166
- if (args.options.version) {
18167
- version = args.options.version;
18168
- } else {
18169
- try {
18170
- const pkg = JSON.parse(readFileSync14("package.json", "utf-8"));
18171
- if (!pkg.version) {
18172
- console.error(`${colors.red}Error: Could not determine version${colors.reset}`);
18173
- return 1;
18174
- }
18175
- version = pkg.version;
18176
- } catch {
18177
- console.error(`${colors.red}Error: Could not determine version${colors.reset}`);
18178
- return 1;
18179
- }
18185
+ const version = resolveAnnounceVersion(args.options.version);
18186
+ if (version === void 0) {
18187
+ console.error(`${colors.red}Error: Could not determine version${colors.reset}`);
18188
+ return 1;
18180
18189
  }
18181
- const channelList = args.options.channels?.split(",") || ["blog", "bluesky"];
18190
+ const channelList = args.options.channels?.split(",") ?? ["blog", "bluesky"];
18182
18191
  const channels = channelList.filter(
18183
18192
  (c) => c === "blog" || c === "bluesky"
18184
18193
  );
@@ -19701,7 +19710,7 @@ function startImprovementReviewScheduler(options) {
19701
19710
  let running = false;
19702
19711
  const runOnce = async () => {
19703
19712
  try {
19704
- const { runImprovementReview: runImprovementReview2, ImprovementReviewInputSchema: ImprovementReviewInputSchema2 } = await import("./improvement-review-PKWQXPPH.js");
19713
+ const { runImprovementReview: runImprovementReview2, ImprovementReviewInputSchema: ImprovementReviewInputSchema2 } = await import("./improvement-review-UEVIATKC.js");
19705
19714
  const input = ImprovementReviewInputSchema2.parse({ fileIssues });
19706
19715
  const result = await runImprovementReview2(input, { logger: logger22 });
19707
19716
  logger22.info("Scheduled improvement_review complete", {
@@ -21987,7 +21996,7 @@ function adaptConfigToLibrary(config) {
21987
21996
  }
21988
21997
  function createBeliefPromoter() {
21989
21998
  return async (event) => {
21990
- const { getToolMemory } = await import("./tool-memory-4K3F2X6J.js");
21999
+ const { getToolMemory } = await import("./tool-memory-HCCMGPVI.js");
21991
22000
  const tm = getToolMemory();
21992
22001
  await tm.recordBelief(
21993
22002
  `skill:${event.name}`,
@@ -23261,7 +23270,7 @@ async function handleResearchCommand(args) {
23261
23270
  }
23262
23271
  }
23263
23272
  async function handleRegistryCommand(args) {
23264
- const { registryCommand, isValidRegistrySubcommand, formatRegistryUsage } = await import("./registry-command-CIEY3EKQ.js");
23273
+ const { registryCommand, isValidRegistrySubcommand, formatRegistryUsage } = await import("./registry-command-JZLWVBLG.js");
23265
23274
  const subcommand = args.subcommand;
23266
23275
  if (!isValidRegistrySubcommand(subcommand)) {
23267
23276
  process.stdout.write(`${formatRegistryUsage()}
@@ -23309,12 +23318,12 @@ async function handleVerifyCommand(args) {
23309
23318
  async function handleDoctorCommand(args) {
23310
23319
  const exitCode = await doctorCommand({ fix: args.options.fix });
23311
23320
  if (args.options.deep) {
23312
- const { runDeepDiagnostics: runDeepDiagnostics2, formatDeepDiagnostics: formatDeepDiagnostics2 } = await import("./doctor-deep-R4HXMRIS.js");
23321
+ const { runDeepDiagnostics: runDeepDiagnostics2, formatDeepDiagnostics: formatDeepDiagnostics2 } = await import("./doctor-deep-LBPZXYN4.js");
23313
23322
  const diag = runDeepDiagnostics2();
23314
23323
  process.stdout.write(formatDeepDiagnostics2(diag) + "\n");
23315
23324
  }
23316
23325
  if (args.options.live) {
23317
- const { runLiveReadiness, formatLiveReadiness } = await import("./doctor-live-QJRB6HKE.js");
23326
+ const { runLiveReadiness, formatLiveReadiness } = await import("./doctor-live-QAT3FLUJ.js");
23318
23327
  const report = await runLiveReadiness();
23319
23328
  process.stdout.write(formatLiveReadiness(report) + "\n");
23320
23329
  if (report.some((r) => r.levels.serves.status === "failed")) {
@@ -23775,7 +23784,7 @@ function resolveTargetPath(rawPath) {
23775
23784
  }
23776
23785
  return isAbsolute2(rawPath) ? rawPath : resolve12(process.cwd(), rawPath);
23777
23786
  }
23778
- function isNonEmpty(dir) {
23787
+ function isNonEmpty2(dir) {
23779
23788
  if (!existsSync23(dir)) return false;
23780
23789
  const stat2 = statSync2(dir);
23781
23790
  if (!stat2.isDirectory()) return true;
@@ -23813,7 +23822,7 @@ function maybeUpdateGitignore(workspaceDir, portableDirName, dryRun) {
23813
23822
  function inspectTarget(target) {
23814
23823
  const exists = existsSync23(target);
23815
23824
  if (!exists) return { exists: false, nonEmpty: false, isExistingNexusDir: false };
23816
- const nonEmpty = isNonEmpty(target);
23825
+ const nonEmpty = isNonEmpty2(target);
23817
23826
  const stat2 = statSync2(target);
23818
23827
  const isExistingNexusDir = stat2.isDirectory() && existsSync23(join19(target, "audit"));
23819
23828
  return { exists, nonEmpty, isExistingNexusDir };
@@ -24047,7 +24056,7 @@ async function runInitPortableFlow(args) {
24047
24056
  return cliExit(result.success ? EXIT_CODES.SUCCESS : EXIT_CODES.SERVER_START_FAILED);
24048
24057
  }
24049
24058
  async function runInitOpencodeFlow(args) {
24050
- const { runInitOpencode } = await import("./init-opencode-MF4KJ62S.js");
24059
+ const { runInitOpencode } = await import("./init-opencode-WXEXOV6X.js");
24051
24060
  const opencodePath = args.options.opencode;
24052
24061
  if (opencodePath === void 0 || opencodePath === "") {
24053
24062
  process.stderr.write("Error: --opencode requires a path argument.\n");
@@ -24073,7 +24082,7 @@ async function runInitOpencodeFlow(args) {
24073
24082
  return cliExit(EXIT_CODES.SUCCESS);
24074
24083
  }
24075
24084
  async function renderOpencodeValidate(opencodePath) {
24076
- const { runOpencodeValidate } = await import("./init-opencode-MF4KJ62S.js");
24085
+ const { runOpencodeValidate } = await import("./init-opencode-WXEXOV6X.js");
24077
24086
  const result = await runOpencodeValidate(opencodePath);
24078
24087
  if (!result.ok) {
24079
24088
  process.stderr.write(`init --opencode --validate: ${result.reason ?? "failed"}
@@ -24112,7 +24121,7 @@ async function handleSetupCommandAsync(args) {
24112
24121
  return cliExitFromStatus(exitCode);
24113
24122
  }
24114
24123
  async function runCustomApiSetup(args) {
24115
- const { configureCustomApi } = await import("./setup-custom-api-2OA4I464.js");
24124
+ const { configureCustomApi } = await import("./setup-custom-api-DKXRZY4C.js");
24116
24125
  const baseUrl = args.options.customApi;
24117
24126
  if (baseUrl === void 0) return EXIT_CODES.SERVER_START_FAILED;
24118
24127
  const input = {