productfoo 0.0.0-stage → 1.0.1

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 (498) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +338 -2
  3. package/bin/foo +3 -0
  4. package/bin/foo.mjs +42 -0
  5. package/commands/bug.md +31 -0
  6. package/commands/discovery.md +28 -0
  7. package/commands/ideate.md +27 -0
  8. package/commands/init.md +28 -0
  9. package/commands/pitch.md +27 -0
  10. package/commands/preview.md +25 -0
  11. package/commands/research.md +31 -0
  12. package/commands/roast.md +27 -0
  13. package/commands/spec.md +30 -0
  14. package/config/pricing.yaml +198 -0
  15. package/config/routing-policy.yaml +171 -0
  16. package/dist-public/src/activeModel.d.ts +83 -0
  17. package/dist-public/src/activeModel.js +331 -0
  18. package/dist-public/src/agentAdapters.d.ts +122 -0
  19. package/dist-public/src/agentAdapters.js +178 -0
  20. package/dist-public/src/agentState.d.ts +43 -0
  21. package/dist-public/src/agentState.js +177 -0
  22. package/dist-public/src/bugCapsule.d.ts +94 -0
  23. package/dist-public/src/bugCapsule.js +227 -0
  24. package/dist-public/src/bugCapture.d.ts +26 -0
  25. package/dist-public/src/bugCapture.js +251 -0
  26. package/dist-public/src/bugOwnerLog.d.ts +93 -0
  27. package/dist-public/src/bugOwnerLog.js +304 -0
  28. package/dist-public/src/bugReportStore.d.ts +48 -0
  29. package/dist-public/src/bugReportStore.js +860 -0
  30. package/dist-public/src/bugSpecContext.d.ts +7 -0
  31. package/dist-public/src/bugSpecContext.js +129 -0
  32. package/dist-public/src/channelFreshness.d.ts +25 -0
  33. package/dist-public/src/channelFreshness.js +194 -0
  34. package/dist-public/src/cli.d.ts +30 -0
  35. package/dist-public/src/cli.js +1667 -0
  36. package/dist-public/src/cliArgs.d.ts +7 -0
  37. package/dist-public/src/cliArgs.js +44 -0
  38. package/dist-public/src/codeCatalog.d.ts +41 -0
  39. package/dist-public/src/codeCatalog.js +197 -0
  40. package/dist-public/src/commandContract.d.ts +84 -0
  41. package/dist-public/src/commandContract.js +390 -0
  42. package/dist-public/src/commandUsage.d.ts +3 -0
  43. package/dist-public/src/commandUsage.js +30 -0
  44. package/dist-public/src/commands/agent.d.ts +60 -0
  45. package/dist-public/src/commands/agent.js +1353 -0
  46. package/dist-public/src/commands/asp.d.ts +8 -0
  47. package/dist-public/src/commands/asp.js +669 -0
  48. package/dist-public/src/commands/evalCmd.d.ts +4 -0
  49. package/dist-public/src/commands/evalCmd.js +405 -0
  50. package/dist-public/src/commands/login.d.ts +25 -0
  51. package/dist-public/src/commands/login.js +94 -0
  52. package/dist-public/src/commands/loop.d.ts +16 -0
  53. package/dist-public/src/commands/loop.js +619 -0
  54. package/dist-public/src/commands/reconcile.d.ts +41 -0
  55. package/dist-public/src/commands/reconcile.js +292 -0
  56. package/dist-public/src/commands/runtime.d.ts +1 -0
  57. package/dist-public/src/commands/runtime.js +36 -0
  58. package/dist-public/src/commands/scanRedact.d.ts +8 -0
  59. package/dist-public/src/commands/scanRedact.js +266 -0
  60. package/dist-public/src/commands/setup.d.ts +28 -0
  61. package/dist-public/src/commands/setup.js +398 -0
  62. package/dist-public/src/commands/shared.d.ts +17 -0
  63. package/dist-public/src/commands/shared.js +147 -0
  64. package/dist-public/src/commands/source.d.ts +1 -0
  65. package/dist-public/src/commands/source.js +134 -0
  66. package/dist-public/src/commands/specCmd.d.ts +24 -0
  67. package/dist-public/src/commands/specCmd.js +794 -0
  68. package/dist-public/src/commands/update.d.ts +61 -0
  69. package/dist-public/src/commands/update.js +244 -0
  70. package/dist-public/src/comprehensionSignal.d.ts +20 -0
  71. package/dist-public/src/comprehensionSignal.js +166 -0
  72. package/dist-public/src/conductor/diversity.d.ts +48 -0
  73. package/dist-public/src/conductor/diversity.js +423 -0
  74. package/dist-public/src/conductor/engine.d.ts +7 -0
  75. package/dist-public/src/conductor/engine.js +295 -0
  76. package/dist-public/src/conductor/families/ideate.d.ts +2 -0
  77. package/dist-public/src/conductor/families/ideate.js +255 -0
  78. package/dist-public/src/conductor/families/interview.d.ts +2 -0
  79. package/dist-public/src/conductor/families/interview.js +39 -0
  80. package/dist-public/src/conductor/families/specSwarm.d.ts +2 -0
  81. package/dist-public/src/conductor/families/specSwarm.js +146 -0
  82. package/dist-public/src/conductor/familyDelivery.d.ts +6 -0
  83. package/dist-public/src/conductor/familyDelivery.js +37 -0
  84. package/dist-public/src/conductor/familyPackArtifact.d.ts +4 -0
  85. package/dist-public/src/conductor/familyPackArtifact.js +260 -0
  86. package/dist-public/src/conductor/ideateDecision.d.ts +6 -0
  87. package/dist-public/src/conductor/ideateDecision.js +237 -0
  88. package/dist-public/src/conductor/pack.d.ts +26 -0
  89. package/dist-public/src/conductor/pack.js +75 -0
  90. package/dist-public/src/conductor/types.d.ts +111 -0
  91. package/dist-public/src/conductor/types.js +7 -0
  92. package/dist-public/src/configPath.d.ts +2 -0
  93. package/dist-public/src/configPath.js +7 -0
  94. package/dist-public/src/discoveryArtifacts.d.ts +54 -0
  95. package/dist-public/src/discoveryArtifacts.js +467 -0
  96. package/dist-public/src/discoveryCommand.d.ts +127 -0
  97. package/dist-public/src/discoveryCommand.js +2148 -0
  98. package/dist-public/src/discoveryConnections.d.ts +339 -0
  99. package/dist-public/src/discoveryConnections.js +613 -0
  100. package/dist-public/src/discoveryDocs.d.ts +129 -0
  101. package/dist-public/src/discoveryDocs.js +577 -0
  102. package/dist-public/src/discoveryEvidence.d.ts +59 -0
  103. package/dist-public/src/discoveryEvidence.js +198 -0
  104. package/dist-public/src/discoveryFireflies.d.ts +25 -0
  105. package/dist-public/src/discoveryFireflies.js +551 -0
  106. package/dist-public/src/discoveryGmail.d.ts +12 -0
  107. package/dist-public/src/discoveryGmail.js +466 -0
  108. package/dist-public/src/discoveryGong.d.ts +12 -0
  109. package/dist-public/src/discoveryGong.js +491 -0
  110. package/dist-public/src/discoveryLearningRouting.d.ts +90 -0
  111. package/dist-public/src/discoveryLearningRouting.js +405 -0
  112. package/dist-public/src/discoveryMatching.d.ts +26 -0
  113. package/dist-public/src/discoveryMatching.js +73 -0
  114. package/dist-public/src/discoveryOutlook.d.ts +12 -0
  115. package/dist-public/src/discoveryOutlook.js +492 -0
  116. package/dist-public/src/discoveryProcess.d.ts +221 -0
  117. package/dist-public/src/discoveryProcess.js +703 -0
  118. package/dist-public/src/discoveryProof.d.ts +143 -0
  119. package/dist-public/src/discoveryProof.js +529 -0
  120. package/dist-public/src/discoveryProviders.d.ts +152 -0
  121. package/dist-public/src/discoveryProviders.js +756 -0
  122. package/dist-public/src/discoveryReadiness.d.ts +219 -0
  123. package/dist-public/src/discoveryReadiness.js +672 -0
  124. package/dist-public/src/discoveryReconcile.d.ts +57 -0
  125. package/dist-public/src/discoveryReconcile.js +424 -0
  126. package/dist-public/src/discoverySlack.d.ts +12 -0
  127. package/dist-public/src/discoverySlack.js +452 -0
  128. package/dist-public/src/discoverySources.d.ts +56 -0
  129. package/dist-public/src/discoverySources.js +322 -0
  130. package/dist-public/src/discoverySync.d.ts +52 -0
  131. package/dist-public/src/discoverySync.js +151 -0
  132. package/dist-public/src/discoverySynthesis.d.ts +57 -0
  133. package/dist-public/src/discoverySynthesis.js +215 -0
  134. package/dist-public/src/discoveryTeams.d.ts +12 -0
  135. package/dist-public/src/discoveryTeams.js +516 -0
  136. package/dist-public/src/discoveryZoom.d.ts +12 -0
  137. package/dist-public/src/discoveryZoom.js +523 -0
  138. package/dist-public/src/elicitationSurface.d.ts +13 -0
  139. package/dist-public/src/elicitationSurface.js +77 -0
  140. package/dist-public/src/errorReport.d.ts +99 -0
  141. package/dist-public/src/errorReport.js +443 -0
  142. package/dist-public/src/errorTaxonomy.d.ts +84 -0
  143. package/dist-public/src/errorTaxonomy.js +189 -0
  144. package/dist-public/src/evalCalibration.d.ts +82 -0
  145. package/dist-public/src/evalCalibration.js +169 -0
  146. package/dist-public/src/evalChecks.d.ts +21 -0
  147. package/dist-public/src/evalChecks.js +295 -0
  148. package/dist-public/src/evalCompile.d.ts +56 -0
  149. package/dist-public/src/evalCompile.js +58 -0
  150. package/dist-public/src/evalImprove.d.ts +60 -0
  151. package/dist-public/src/evalImprove.js +175 -0
  152. package/dist-public/src/evalJudge.d.ts +47 -0
  153. package/dist-public/src/evalJudge.js +143 -0
  154. package/dist-public/src/evalLabels.d.ts +100 -0
  155. package/dist-public/src/evalLabels.js +287 -0
  156. package/dist-public/src/evalRecord.d.ts +68 -0
  157. package/dist-public/src/evalRecord.js +165 -0
  158. package/dist-public/src/evalRoast.d.ts +88 -0
  159. package/dist-public/src/evalRoast.js +249 -0
  160. package/dist-public/src/evidenceIntake.d.ts +66 -0
  161. package/dist-public/src/evidenceIntake.js +356 -0
  162. package/dist-public/src/feedback.d.ts +78 -0
  163. package/dist-public/src/feedback.js +294 -0
  164. package/dist-public/src/firefliesClient.d.ts +106 -0
  165. package/dist-public/src/firefliesClient.js +258 -0
  166. package/dist-public/src/firstMoveTensions.d.ts +10 -0
  167. package/dist-public/src/firstMoveTensions.js +93 -0
  168. package/dist-public/src/gitRun.d.ts +21 -0
  169. package/dist-public/src/gitRun.js +50 -0
  170. package/dist-public/src/githubReconcile.d.ts +94 -0
  171. package/dist-public/src/githubReconcile.js +205 -0
  172. package/dist-public/src/gmailNango.d.ts +131 -0
  173. package/dist-public/src/gmailNango.js +329 -0
  174. package/dist-public/src/gongNango.d.ts +118 -0
  175. package/dist-public/src/gongNango.js +308 -0
  176. package/dist-public/src/grammarGate.d.ts +13 -0
  177. package/dist-public/src/grammarGate.js +72 -0
  178. package/dist-public/src/harnessGates.d.ts +65 -0
  179. package/dist-public/src/harnessGates.js +168 -0
  180. package/dist-public/src/humanSurfaceEval.d.ts +19 -0
  181. package/dist-public/src/humanSurfaceEval.js +156 -0
  182. package/dist-public/src/ideate.d.ts +43 -0
  183. package/dist-public/src/ideate.js +255 -0
  184. package/dist-public/src/ideateContext.d.ts +11 -0
  185. package/dist-public/src/ideateContext.js +83 -0
  186. package/dist-public/src/index.d.ts +2 -0
  187. package/dist-public/src/index.js +4 -0
  188. package/dist-public/src/initCommand.d.ts +25 -0
  189. package/dist-public/src/initCommand.js +558 -0
  190. package/dist-public/src/interviewGate.d.ts +25 -0
  191. package/dist-public/src/interviewGate.js +126 -0
  192. package/dist-public/src/jsonFile.d.ts +2 -0
  193. package/dist-public/src/jsonFile.js +22 -0
  194. package/dist-public/src/loopBudget.d.ts +182 -0
  195. package/dist-public/src/loopBudget.js +494 -0
  196. package/dist-public/src/loopContracts.d.ts +35 -0
  197. package/dist-public/src/loopContracts.js +364 -0
  198. package/dist-public/src/machineState.d.ts +1 -0
  199. package/dist-public/src/machineState.js +9 -0
  200. package/dist-public/src/notionNango.d.ts +93 -0
  201. package/dist-public/src/notionNango.js +279 -0
  202. package/dist-public/src/orchestrationResult.d.ts +11 -0
  203. package/dist-public/src/orchestrationResult.js +73 -0
  204. package/dist-public/src/outlookNango.d.ts +124 -0
  205. package/dist-public/src/outlookNango.js +327 -0
  206. package/dist-public/src/packetCorrections.d.ts +40 -0
  207. package/dist-public/src/packetCorrections.js +172 -0
  208. package/dist-public/src/packetGlossary.d.ts +6 -0
  209. package/dist-public/src/packetGlossary.js +42 -0
  210. package/dist-public/src/packetIndex.d.ts +54 -0
  211. package/dist-public/src/packetIndex.js +744 -0
  212. package/dist-public/src/packetIndexEntry.d.ts +3 -0
  213. package/dist-public/src/packetIndexEntry.js +128 -0
  214. package/dist-public/src/packetIndexServe.d.ts +13 -0
  215. package/dist-public/src/packetIndexServe.js +113 -0
  216. package/dist-public/src/packetIndexWorker.d.ts +7 -0
  217. package/dist-public/src/packetIndexWorker.js +45 -0
  218. package/dist-public/src/packetLifecycle.d.ts +30 -0
  219. package/dist-public/src/packetLifecycle.js +127 -0
  220. package/dist-public/src/packetReconcile.d.ts +73 -0
  221. package/dist-public/src/packetReconcile.js +386 -0
  222. package/dist-public/src/packetStatus.d.ts +125 -0
  223. package/dist-public/src/packetStatus.js +770 -0
  224. package/dist-public/src/packetValidation.d.ts +17 -0
  225. package/dist-public/src/packetValidation.js +333 -0
  226. package/dist-public/src/packetVerify.d.ts +73 -0
  227. package/dist-public/src/packetVerify.js +303 -0
  228. package/dist-public/src/packetWrite.d.ts +52 -0
  229. package/dist-public/src/packetWrite.js +448 -0
  230. package/dist-public/src/pitch.d.ts +38 -0
  231. package/dist-public/src/pitch.js +154 -0
  232. package/dist-public/src/processMemo.d.ts +8 -0
  233. package/dist-public/src/processMemo.js +23 -0
  234. package/dist-public/src/productDetect.d.ts +30 -0
  235. package/dist-public/src/productDetect.js +376 -0
  236. package/dist-public/src/profile.d.ts +62 -0
  237. package/dist-public/src/profile.js +334 -0
  238. package/dist-public/src/questionModel.d.ts +46 -0
  239. package/dist-public/src/questionModel.js +74 -0
  240. package/dist-public/src/questionText.d.ts +7 -0
  241. package/dist-public/src/questionText.js +38 -0
  242. package/dist-public/src/redactConfig.d.ts +2 -0
  243. package/dist-public/src/redactConfig.js +11 -0
  244. package/dist-public/src/redactEngine.d.ts +59 -0
  245. package/dist-public/src/redactEngine.js +509 -0
  246. package/dist-public/src/redactGate.d.ts +63 -0
  247. package/dist-public/src/redactGate.js +209 -0
  248. package/dist-public/src/repoRead.d.ts +29 -0
  249. package/dist-public/src/repoRead.js +160 -0
  250. package/dist-public/src/research.d.ts +242 -0
  251. package/dist-public/src/research.js +1314 -0
  252. package/dist-public/src/researchCompletion.d.ts +34 -0
  253. package/dist-public/src/researchCompletion.js +123 -0
  254. package/dist-public/src/researchExecution.d.ts +47 -0
  255. package/dist-public/src/researchExecution.js +309 -0
  256. package/dist-public/src/researchFormat.d.ts +21 -0
  257. package/dist-public/src/researchFormat.js +77 -0
  258. package/dist-public/src/researchGate.d.ts +86 -0
  259. package/dist-public/src/researchGate.js +1036 -0
  260. package/dist-public/src/researchReceipt.d.ts +76 -0
  261. package/dist-public/src/researchReceipt.js +148 -0
  262. package/dist-public/src/researchRender.d.ts +2 -0
  263. package/dist-public/src/researchRender.js +267 -0
  264. package/dist-public/src/researchSigningKey.d.ts +19 -0
  265. package/dist-public/src/researchSigningKey.js +95 -0
  266. package/dist-public/src/riskClassify.d.ts +42 -0
  267. package/dist-public/src/riskClassify.js +149 -0
  268. package/dist-public/src/routines.d.ts +42 -0
  269. package/dist-public/src/routines.js +269 -0
  270. package/dist-public/src/routingPolicy.d.ts +172 -0
  271. package/dist-public/src/routingPolicy.js +646 -0
  272. package/dist-public/src/secretInput.d.ts +8 -0
  273. package/dist-public/src/secretInput.js +89 -0
  274. package/dist-public/src/selfCheck.d.ts +7 -0
  275. package/dist-public/src/selfCheck.js +473 -0
  276. package/dist-public/src/selfCheckCache.d.ts +29 -0
  277. package/dist-public/src/selfCheckCache.js +147 -0
  278. package/dist-public/src/severityClass.d.ts +15 -0
  279. package/dist-public/src/severityClass.js +22 -0
  280. package/dist-public/src/skillClientPolicy.d.ts +8 -0
  281. package/dist-public/src/skillClientPolicy.js +16 -0
  282. package/dist-public/src/skillLocal.d.ts +98 -0
  283. package/dist-public/src/skillLocal.js +463 -0
  284. package/dist-public/src/skillTreeDigest.d.ts +9 -0
  285. package/dist-public/src/skillTreeDigest.js +64 -0
  286. package/dist-public/src/slackNango.d.ts +62 -0
  287. package/dist-public/src/slackNango.js +208 -0
  288. package/dist-public/src/social/arxiv.d.ts +19 -0
  289. package/dist-public/src/social/arxiv.js +96 -0
  290. package/dist-public/src/social/github.d.ts +2 -0
  291. package/dist-public/src/social/github.js +78 -0
  292. package/dist-public/src/social/hackernews.d.ts +2 -0
  293. package/dist-public/src/social/hackernews.js +67 -0
  294. package/dist-public/src/social/index.d.ts +10 -0
  295. package/dist-public/src/social/index.js +79 -0
  296. package/dist-public/src/social/reddit.d.ts +2 -0
  297. package/dist-public/src/social/reddit.js +125 -0
  298. package/dist-public/src/social/types.d.ts +73 -0
  299. package/dist-public/src/social/types.js +61 -0
  300. package/dist-public/src/social/xml.d.ts +10 -0
  301. package/dist-public/src/social/xml.js +49 -0
  302. package/dist-public/src/social/youtube.d.ts +7 -0
  303. package/dist-public/src/social/youtube.js +217 -0
  304. package/dist-public/src/sourceIngress.d.ts +488 -0
  305. package/dist-public/src/sourceIngress.js +1651 -0
  306. package/dist-public/src/specAfter.d.ts +187 -0
  307. package/dist-public/src/specAfter.js +814 -0
  308. package/dist-public/src/specBudget.d.ts +124 -0
  309. package/dist-public/src/specBudget.js +424 -0
  310. package/dist-public/src/specDecisionSignals.d.ts +38 -0
  311. package/dist-public/src/specDecisionSignals.js +121 -0
  312. package/dist-public/src/specLinkedCommits.d.ts +7 -0
  313. package/dist-public/src/specLinkedCommits.js +107 -0
  314. package/dist-public/src/specSections.d.ts +105 -0
  315. package/dist-public/src/specSections.js +718 -0
  316. package/dist-public/src/statusGlyphs.d.ts +18 -0
  317. package/dist-public/src/statusGlyphs.js +75 -0
  318. package/dist-public/src/swarmCommand.d.ts +10 -0
  319. package/dist-public/src/swarmCommand.js +96 -0
  320. package/dist-public/src/teamsNango.d.ts +114 -0
  321. package/dist-public/src/teamsNango.js +301 -0
  322. package/dist-public/src/tokenStore.d.ts +10 -0
  323. package/dist-public/src/tokenStore.js +77 -0
  324. package/dist-public/src/trustEnvelope.d.ts +78 -0
  325. package/dist-public/src/trustEnvelope.js +392 -0
  326. package/dist-public/src/untrustedText.d.ts +6 -0
  327. package/dist-public/src/untrustedText.js +20 -0
  328. package/dist-public/src/updateNotice.d.ts +41 -0
  329. package/dist-public/src/updateNotice.js +290 -0
  330. package/dist-public/src/vendorYaml.d.ts +1 -0
  331. package/dist-public/src/vendorYaml.js +7374 -0
  332. package/dist-public/src/workflowRunActuals.d.ts +67 -0
  333. package/dist-public/src/workflowRunActuals.js +184 -0
  334. package/dist-public/src/zendeskDiscovery.d.ts +12 -0
  335. package/dist-public/src/zendeskDiscovery.js +513 -0
  336. package/dist-public/src/zendeskNango.d.ts +131 -0
  337. package/dist-public/src/zendeskNango.js +344 -0
  338. package/dist-public/src/zoomNango.d.ts +106 -0
  339. package/dist-public/src/zoomNango.js +351 -0
  340. package/docs/CHANGELOG.md +32 -0
  341. package/docs/THIRD_PARTY_NOTICES.md +36 -0
  342. package/package.json +71 -4
  343. package/schemas/bug-capsule-receipt.schema.json +54 -0
  344. package/schemas/bug-capsule.schema.json +189 -0
  345. package/schemas/discovery-evidence-envelope.schema.json +79 -0
  346. package/schemas/discovery-processing-receipt.schema.json +71 -0
  347. package/schemas/discovery-service-contract.schema.json +189 -0
  348. package/skills/AGENTS.md +32 -0
  349. package/skills/README.md +287 -0
  350. package/skills/bug/SKILL.md +49 -0
  351. package/skills/build-preview-spec/SKILL.md +103 -0
  352. package/skills/capture-external-artifact/SKILL.md +23 -0
  353. package/skills/capture-external-artifact/agents/openai.yaml +4 -0
  354. package/skills/capture-external-artifact/references/extractor-libraries.md +27 -0
  355. package/skills/check-spec-health/SKILL.md +45 -0
  356. package/skills/check-spec-health/agents/openai.yaml +4 -0
  357. package/skills/competitive-positioning/SKILL.md +86 -0
  358. package/skills/competitive-positioning/agents/openai.yaml +4 -0
  359. package/skills/cpo-lens/SKILL.md +398 -0
  360. package/skills/cpo-lens/agents/openai.yaml +4 -0
  361. package/skills/create-prd/SKILL.md +26 -0
  362. package/skills/create-prd/agents/openai.yaml +4 -0
  363. package/skills/customer-discovery/SKILL.md +192 -0
  364. package/skills/design-system/SKILL.md +49 -0
  365. package/skills/design-system/agents/openai.yaml +4 -0
  366. package/skills/discussion-guide/SKILL.md +75 -0
  367. package/skills/discussion-guide/agents/openai.yaml +4 -0
  368. package/skills/firecrawl-research-papers/SKILL.md +96 -0
  369. package/skills/firecrawl-research-papers/agents/openai.yaml +4 -0
  370. package/skills/foo-roast/SKILL.md +325 -0
  371. package/skills/generate-gtm-brief/SKILL.md +41 -0
  372. package/skills/generate-gtm-brief/agents/openai.yaml +4 -0
  373. package/skills/generate-gtm-brief/references/gtm-brief-template.md +56 -0
  374. package/skills/gong-quotes/SKILL.md +43 -0
  375. package/skills/gong-quotes/agents/openai.yaml +4 -0
  376. package/skills/grill-me/SKILL.md +27 -0
  377. package/skills/grill-me/agents/openai.yaml +4 -0
  378. package/skills/ideate/SKILL.md +180 -0
  379. package/skills/ideate/references/family-packs.md +5 -0
  380. package/skills/initiative-tracker/SKILL.md +23 -0
  381. package/skills/initiative-tracker/agents/openai.yaml +4 -0
  382. package/skills/interop-review/SKILL.md +25 -0
  383. package/skills/interop-review/agents/openai.yaml +4 -0
  384. package/skills/interview-me/SKILL.md +404 -0
  385. package/skills/interview-me/agents/openai.yaml +4 -0
  386. package/skills/loop-library-audit/SKILL.md +123 -0
  387. package/skills/pitch/SKILL.md +110 -0
  388. package/skills/pitch/references/opportunity-assessment.md +136 -0
  389. package/skills/pitch/references/prfaq-template.md +54 -0
  390. package/skills/pmm-release-briefing/SKILL.md +27 -0
  391. package/skills/pmm-release-briefing/agents/openai.yaml +4 -0
  392. package/skills/pmm-release-briefing/references/variant-generalized.md +16 -0
  393. package/skills/positioning-messaging/SKILL.md +70 -0
  394. package/skills/positioning-messaging/agents/openai.yaml +4 -0
  395. package/skills/positioning-messaging/references/guest-insights.md +1400 -0
  396. package/skills/preview-swarm/SKILL.md +418 -0
  397. package/skills/preview-swarm/agents/openai.yaml +4 -0
  398. package/skills/preview-swarm/references/html-effectiveness-build-previews.md +168 -0
  399. package/skills/product-copywriting/SKILL.md +127 -0
  400. package/skills/product-copywriting/agents/openai.yaml +4 -0
  401. package/skills/product-copywriting/references/foo-voice.md +26 -0
  402. package/skills/product-shape-interview/SKILL.md +219 -0
  403. package/skills/product-shape-interview/agents/openai.yaml +4 -0
  404. package/skills/ready-for-release/SKILL.md +39 -0
  405. package/skills/ready-for-release/agents/openai.yaml +4 -0
  406. package/skills/redact-transcripts/SKILL.md +23 -0
  407. package/skills/redact-transcripts/agents/openai.yaml +4 -0
  408. package/skills/research-brief/SKILL.md +48 -0
  409. package/skills/research-brief/agents/openai.yaml +4 -0
  410. package/skills/research-refresh/SKILL.md +63 -0
  411. package/skills/research-refresh/references/worked-cases.md +44 -0
  412. package/skills/review-loop/SKILL.md +200 -0
  413. package/skills/review-spec/SKILL.md +32 -0
  414. package/skills/review-spec/agents/openai.yaml +4 -0
  415. package/skills/rfc-from-research/SKILL.md +42 -0
  416. package/skills/rfc-from-research/agents/openai.yaml +4 -0
  417. package/skills/rfc-from-research/references/rfc-pattern.md +69 -0
  418. package/skills/skill-registry.yaml +810 -0
  419. package/skills/spec-cleanup/SKILL.md +103 -0
  420. package/skills/spec-cleanup/agents/openai.yaml +4 -0
  421. package/skills/spec-swarm/SKILL.md +87 -0
  422. package/skills/spec-swarm/agents/openai.yaml +4 -0
  423. package/skills/spec-swarm/template/SKILL.template.md +94 -0
  424. package/skills/spec-swarm/template/personas/accessibility-inclusion.md +40 -0
  425. package/skills/spec-swarm/template/personas/ai-technical-pm.md +69 -0
  426. package/skills/spec-swarm/template/personas/analytics-engineering.md +39 -0
  427. package/skills/spec-swarm/template/personas/applied-ai-eval.md +64 -0
  428. package/skills/spec-swarm/template/personas/business-gm-pm.md +67 -0
  429. package/skills/spec-swarm/template/personas/consumer-craft-pm.md +68 -0
  430. package/skills/spec-swarm/template/personas/content-design.md +40 -0
  431. package/skills/spec-swarm/template/personas/cpo.md +42 -0
  432. package/skills/spec-swarm/template/personas/data-science.md +42 -0
  433. package/skills/spec-swarm/template/personas/developer-experience.md +65 -0
  434. package/skills/spec-swarm/template/personas/dx-product.md +70 -0
  435. package/skills/spec-swarm/template/personas/field.md +43 -0
  436. package/skills/spec-swarm/template/personas/finance-cfo.md +40 -0
  437. package/skills/spec-swarm/template/personas/growth-pm.md +67 -0
  438. package/skills/spec-swarm/template/personas/platform-pm.md +67 -0
  439. package/skills/spec-swarm/template/personas/pmm.md +43 -0
  440. package/skills/spec-swarm/template/personas/principal-product-designer.md +42 -0
  441. package/skills/spec-swarm/template/personas/product-ops-program.md +41 -0
  442. package/skills/spec-swarm/template/personas/qa-release.md +41 -0
  443. package/skills/spec-swarm/template/personas/responsible-ai-safety.md +64 -0
  444. package/skills/spec-swarm/template/personas/security-privacy-legal.md +40 -0
  445. package/skills/spec-swarm/template/personas/strategy-competitive.md +41 -0
  446. package/skills/spec-swarm/template/personas/technical-architect.md +42 -0
  447. package/skills/spec-swarm/template/personas/technical-lead.md +43 -0
  448. package/skills/spec-swarm/template/personas/user-research.md +41 -0
  449. package/skills/spec-swarm-accessibility-inclusion/SKILL.md +95 -0
  450. package/skills/spec-swarm-accessibility-inclusion/agents/openai.yaml +4 -0
  451. package/skills/spec-swarm-ai-technical-pm/SKILL.md +124 -0
  452. package/skills/spec-swarm-analytics-engineering/SKILL.md +94 -0
  453. package/skills/spec-swarm-analytics-engineering/agents/openai.yaml +4 -0
  454. package/skills/spec-swarm-applied-ai-eval/SKILL.md +120 -0
  455. package/skills/spec-swarm-business-gm-pm/SKILL.md +122 -0
  456. package/skills/spec-swarm-consumer-craft-pm/SKILL.md +122 -0
  457. package/skills/spec-swarm-content-design/SKILL.md +95 -0
  458. package/skills/spec-swarm-content-design/agents/openai.yaml +4 -0
  459. package/skills/spec-swarm-cpo/SKILL.md +94 -0
  460. package/skills/spec-swarm-cpo/agents/openai.yaml +4 -0
  461. package/skills/spec-swarm-data-science/SKILL.md +95 -0
  462. package/skills/spec-swarm-data-science/agents/openai.yaml +4 -0
  463. package/skills/spec-swarm-developer-experience/SKILL.md +121 -0
  464. package/skills/spec-swarm-dx-product/SKILL.md +126 -0
  465. package/skills/spec-swarm-field/SKILL.md +96 -0
  466. package/skills/spec-swarm-field/agents/openai.yaml +4 -0
  467. package/skills/spec-swarm-finance-cfo/SKILL.md +95 -0
  468. package/skills/spec-swarm-finance-cfo/agents/openai.yaml +4 -0
  469. package/skills/spec-swarm-growth-pm/SKILL.md +122 -0
  470. package/skills/spec-swarm-platform-pm/SKILL.md +122 -0
  471. package/skills/spec-swarm-pmm/SKILL.md +96 -0
  472. package/skills/spec-swarm-pmm/agents/openai.yaml +4 -0
  473. package/skills/spec-swarm-principal-product-designer/SKILL.md +95 -0
  474. package/skills/spec-swarm-principal-product-designer/agents/openai.yaml +4 -0
  475. package/skills/spec-swarm-product-ops-program/SKILL.md +96 -0
  476. package/skills/spec-swarm-product-ops-program/agents/openai.yaml +4 -0
  477. package/skills/spec-swarm-qa-release/SKILL.md +96 -0
  478. package/skills/spec-swarm-qa-release/agents/openai.yaml +4 -0
  479. package/skills/spec-swarm-responsible-ai-safety/SKILL.md +120 -0
  480. package/skills/spec-swarm-security-privacy-legal/SKILL.md +95 -0
  481. package/skills/spec-swarm-security-privacy-legal/agents/openai.yaml +4 -0
  482. package/skills/spec-swarm-strategy-competitive/SKILL.md +96 -0
  483. package/skills/spec-swarm-strategy-competitive/agents/openai.yaml +4 -0
  484. package/skills/spec-swarm-technical-architect/SKILL.md +95 -0
  485. package/skills/spec-swarm-technical-architect/agents/openai.yaml +4 -0
  486. package/skills/spec-swarm-technical-lead/SKILL.md +96 -0
  487. package/skills/spec-swarm-technical-lead/agents/openai.yaml +4 -0
  488. package/skills/spec-swarm-user-research/SKILL.md +95 -0
  489. package/skills/spec-swarm-user-research/agents/openai.yaml +4 -0
  490. package/skills/strategy-check/SKILL.md +170 -0
  491. package/skills/strategy-check/agents/openai.yaml +4 -0
  492. package/skills/study-digest/SKILL.md +41 -0
  493. package/skills/synthetic-customer/SKILL.md +68 -0
  494. package/skills/update-cli-spec/SKILL.md +69 -0
  495. package/skills/update-cli-spec/agents/openai.yaml +4 -0
  496. package/skills/voc-researcher/SKILL.md +45 -0
  497. package/skills/voc-researcher/agents/openai.yaml +4 -0
  498. package/skills-lock.json +35 -0
@@ -0,0 +1,17 @@
1
+ export type JsonObject = Record<string, unknown>;
2
+ type ValidationOptions = {
3
+ packetDir: string;
4
+ label: string;
5
+ requireSpecSections?: boolean;
6
+ requiredSpecRef?: string;
7
+ requireEvents?: boolean;
8
+ };
9
+ /** A packet is malformed or violates its contract; this is a finding, not a product failure. */
10
+ export declare class PacketValidationError extends Error {
11
+ readonly code = "FOO_PACKET_VALIDATION";
12
+ constructor(message: string);
13
+ }
14
+ /** Stable across installed-CLI and project-local compiled copies of this module. */
15
+ export declare function isPacketValidationError(error: unknown): error is PacketValidationError;
16
+ export declare function validatePacket(options: ValidationOptions): string;
17
+ export {};
@@ -0,0 +1,333 @@
1
+ import { readFileSync } from "node:fs";
2
+ import path from "node:path";
3
+ import { parse as parseYaml, YAMLParseError } from "./vendorYaml.js";
4
+ const TASK_STATUSES = ["todo", "doing", "blocked", "done", "dropped"];
5
+ const TASK_AGREEMENTS = ["agreed", "discovered", "suggested", "rejected"];
6
+ const AGENT_EVENT_TYPES = [
7
+ "com.adaptivespec.task.created",
8
+ "com.adaptivespec.task.updated",
9
+ "com.adaptivespec.task.agreement_changed",
10
+ "com.adaptivespec.task.status_changed",
11
+ "com.adaptivespec.conflict.detected",
12
+ "com.adaptivespec.code.changed",
13
+ "com.adaptivespec.code.unmapped_change_detected",
14
+ ];
15
+ /** A packet is malformed or violates its contract; this is a finding, not a product failure. */
16
+ export class PacketValidationError extends Error {
17
+ code = "FOO_PACKET_VALIDATION";
18
+ constructor(message) {
19
+ super(message);
20
+ this.name = "PacketValidationError";
21
+ }
22
+ }
23
+ /** Stable across installed-CLI and project-local compiled copies of this module. */
24
+ export function isPacketValidationError(error) {
25
+ return Boolean(error
26
+ && typeof error === "object"
27
+ && "name" in error
28
+ && error.name === "PacketValidationError"
29
+ && "code" in error
30
+ && error.code === "FOO_PACKET_VALIDATION");
31
+ }
32
+ function parseValidationYaml(text) {
33
+ try {
34
+ return parseYaml(text);
35
+ }
36
+ catch (error) {
37
+ if (!(error instanceof YAMLParseError))
38
+ throw error;
39
+ const message = error instanceof Error ? error.message : String(error);
40
+ throw new PacketValidationError(message);
41
+ }
42
+ }
43
+ function parseValidationJson(text) {
44
+ try {
45
+ return JSON.parse(text);
46
+ }
47
+ catch (error) {
48
+ if (!(error instanceof SyntaxError))
49
+ throw error;
50
+ throw new PacketValidationError(error.message);
51
+ }
52
+ }
53
+ function isMissingFile(error) {
54
+ return Boolean(error && typeof error === "object" && "code" in error && error.code === "ENOENT");
55
+ }
56
+ function asObject(value, pathLabel) {
57
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
58
+ throw new PacketValidationError(`${pathLabel} must be an object`);
59
+ }
60
+ return value;
61
+ }
62
+ function asArray(value, pathLabel) {
63
+ if (!Array.isArray(value))
64
+ throw new PacketValidationError(`${pathLabel} must be an array`);
65
+ return value;
66
+ }
67
+ function requireKeys(value, keys, pathLabel) {
68
+ for (const key of keys) {
69
+ if (!(key in value))
70
+ throw new PacketValidationError(`${pathLabel} missing ${key}`);
71
+ }
72
+ }
73
+ function stringValue(value) {
74
+ return typeof value === "string" ? value : null;
75
+ }
76
+ // YAML frontmatter is the canonical packet header (asp_v0 D-017 / T-013). A
77
+ // restamped packet carries `spec_id` (and title/mode/lifecycle/stage/owner/
78
+ // autonomy/updated) in a leading `--- ... ---` block; packets mid-migration
79
+ // still carry the flat `Spec ID:` line, which stays accepted as a fallback.
80
+ function parseFrontmatter(specText) {
81
+ if (!specText.startsWith("---"))
82
+ return null;
83
+ const end = specText.indexOf("\n---", 3);
84
+ if (end === -1)
85
+ return null;
86
+ try {
87
+ const parsed = parseYaml(specText.slice(3, end));
88
+ return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : null;
89
+ }
90
+ catch (error) {
91
+ if (error instanceof YAMLParseError)
92
+ return null;
93
+ throw error;
94
+ }
95
+ }
96
+ function requireAgentIdentity(actor, pathLabel) {
97
+ requireKeys(actor, ["type", "id", "provider", "model", "persona", "skills", "adapter", "mode"], pathLabel);
98
+ if (actor.type !== "agent")
99
+ throw new PacketValidationError(`${pathLabel}.type must be agent`);
100
+ asArray(actor.skills, `${pathLabel}.skills`);
101
+ }
102
+ function loadEvents(packetDir, eventSegments, taskIds, label) {
103
+ const events = [];
104
+ for (const segment of eventSegments) {
105
+ const eventsPath = path.join(packetDir, segment);
106
+ let eventsText;
107
+ try {
108
+ eventsText = readFileSync(eventsPath, "utf8");
109
+ }
110
+ catch (error) {
111
+ if (!isMissingFile(error))
112
+ throw error;
113
+ if (segment === "events.jsonl")
114
+ throw new PacketValidationError(`${segment} missing`);
115
+ continue;
116
+ }
117
+ const lines = eventsText.split(/\r?\n/);
118
+ lines.forEach((line, index) => {
119
+ if (!line.trim())
120
+ return;
121
+ const event = asObject(parseValidationJson(line), `${segment}:${index + 1}`);
122
+ const pathLabel = `${segment}:${index + 1}`;
123
+ requireKeys(event, ["specversion", "id", "source", "type", "subject", "time", "actor", "data"], pathLabel);
124
+ const data = asObject(event.data, `${pathLabel}.data`);
125
+ if ("freshness" in data)
126
+ throw new PacketValidationError(`${pathLabel}.data.freshness must be derived, not stored`);
127
+ const actor = asObject(event.actor, `${pathLabel}.actor`);
128
+ const eventType = String(event.type);
129
+ if (actor.type === "agent" && AGENT_EVENT_TYPES.includes(eventType)) {
130
+ requireAgentIdentity(actor, `${pathLabel}.actor`);
131
+ }
132
+ if (eventType === "com.adaptivespec.task.status_changed") {
133
+ const from = data.from;
134
+ const to = data.to;
135
+ if (!TASK_STATUSES.includes(String(from)))
136
+ throw new PacketValidationError(`${pathLabel}.data.from invalid: ${from}`);
137
+ if (!TASK_STATUSES.includes(String(to)))
138
+ throw new PacketValidationError(`${pathLabel}.data.to invalid: ${to}`);
139
+ }
140
+ const subject = String(event.subject);
141
+ if (subject.startsWith("task:")) {
142
+ const taskId = subject.slice("task:".length);
143
+ if (!taskIds.has(taskId))
144
+ throw new PacketValidationError(`${pathLabel}.subject references unknown task ${taskId}`);
145
+ }
146
+ events.push(event);
147
+ });
148
+ }
149
+ if (events.length === 0)
150
+ throw new PacketValidationError(`${label} validation failed: events missing`);
151
+ return events;
152
+ }
153
+ // Errors that teach (foo-brand-presence-v0 R-007 / T-005): every validation
154
+ // failure states the concept, the fix, and the next command — the Rust-compiler
155
+ // bar — instead of a bare assertion.
156
+ function validationFixHint(message) {
157
+ if (/missing ##/.test(message))
158
+ return "add the missing section heading to spec.md";
159
+ if (/spec_id must match/.test(message))
160
+ return "make tasks.yaml spec_id equal the spec.md frontmatter spec_id";
161
+ if (/spec_ref/.test(message))
162
+ return "point tasks.yaml spec_ref at this packet's spec.md";
163
+ if (/duplicated/.test(message))
164
+ return "give each task a unique id";
165
+ if (/invalid/.test(message))
166
+ return "correct the value to one of the allowed options";
167
+ if (/missing/.test(message))
168
+ return "add the missing file or field named above";
169
+ return "correct the issue named above";
170
+ }
171
+ export function validatePacket(options) {
172
+ const fail = (message) => {
173
+ throw new PacketValidationError([
174
+ `${options.label} validation failed: ${message}`,
175
+ " Concept: a packet is valid when spec.md, tasks.yaml, and events.jsonl agree on identity and structure.",
176
+ ` Fix: ${validationFixHint(message)}.`,
177
+ ` Next: foo asp validate ${options.label}`,
178
+ ].join("\n"));
179
+ };
180
+ const specPath = path.join(options.packetDir, "spec.md");
181
+ const tasksPath = path.join(options.packetDir, "tasks.yaml");
182
+ let specText;
183
+ try {
184
+ specText = readFileSync(specPath, "utf8");
185
+ }
186
+ catch (error) {
187
+ if (isMissingFile(error))
188
+ fail("spec.md missing");
189
+ throw error;
190
+ }
191
+ if (options.requireSpecSections) {
192
+ for (const section of [
193
+ "## Intent",
194
+ "## Current Understanding",
195
+ "## Requirements",
196
+ "## Decisions",
197
+ "## Risks",
198
+ "## Validation",
199
+ "## Evidence",
200
+ "## Open Questions",
201
+ ]) {
202
+ if (!specText.includes(section))
203
+ fail(`spec.md missing ${section}`);
204
+ }
205
+ }
206
+ let tasksText;
207
+ try {
208
+ tasksText = readFileSync(tasksPath, "utf8");
209
+ }
210
+ catch (error) {
211
+ if (isMissingFile(error))
212
+ fail("tasks.yaml missing");
213
+ throw error;
214
+ }
215
+ const tasksDoc = asObject(parseValidationYaml(tasksText), "tasks.yaml");
216
+ requireKeys(tasksDoc, ["schema_version", "spec_id", "spec_ref", "updated", "defaults", "tasks"], "tasks.yaml");
217
+ if (options.requiredSpecRef && tasksDoc.spec_ref !== options.requiredSpecRef) {
218
+ fail("tasks.yaml.spec_ref must point to spec.md");
219
+ }
220
+ const specId = stringValue(tasksDoc.spec_id);
221
+ if (!specId)
222
+ fail("tasks.yaml.spec_id must match spec.md");
223
+ // Identity must agree with the spec header via either the canonical YAML
224
+ // frontmatter `spec_id` (T-013) or the transitional `Spec ID:` line.
225
+ const frontmatter = parseFrontmatter(specText);
226
+ const frontmatterSpecId = frontmatter ? stringValue(frontmatter.spec_id) : null;
227
+ const legacyLineMatches = new RegExp(`^Spec ID:\\s*${specId.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}$`, "m").test(specText);
228
+ if (frontmatterSpecId !== specId && !legacyLineMatches) {
229
+ fail("tasks.yaml.spec_id must match spec.md frontmatter spec_id or the `Spec ID:` line");
230
+ }
231
+ const ledger = tasksDoc.ledger ? asObject(tasksDoc.ledger, "tasks.yaml.ledger") : null;
232
+ if (ledger) {
233
+ requireKeys(ledger, ["segment_order"], "tasks.yaml.ledger");
234
+ const segmentOrder = asArray(ledger.segment_order, "tasks.yaml.ledger.segment_order");
235
+ if (!segmentOrder.includes("events.jsonl")) {
236
+ fail("tasks.yaml.ledger.segment_order must include events.jsonl");
237
+ }
238
+ }
239
+ if (tasksDoc.freshness) {
240
+ const freshness = asObject(tasksDoc.freshness, "tasks.yaml.freshness");
241
+ requireKeys(freshness, ["external_observations"], "tasks.yaml.freshness");
242
+ requireKeys(asObject(freshness.external_observations, "tasks.yaml.freshness.external_observations"), ["max_age_seconds"], "tasks.yaml.freshness.external_observations");
243
+ }
244
+ if (tasksDoc.codebase) {
245
+ requireKeys(asObject(tasksDoc.codebase, "tasks.yaml.codebase"), ["root", "baseline", "require_task_for_changes", "unmatched_change"], "tasks.yaml.codebase");
246
+ }
247
+ const tasks = asArray(tasksDoc.tasks, "tasks.yaml.tasks");
248
+ if (tasks.length === 0)
249
+ fail("tasks.yaml.tasks must be a nonempty array");
250
+ const taskIds = new Set();
251
+ const taskObjects = tasks.map((task, index) => {
252
+ const taskObject = asObject(task, `tasks.yaml.tasks[${index}]`);
253
+ const pathLabel = `tasks.yaml.tasks[${index}]`;
254
+ requireKeys(taskObject, ["id", "title", "status", "agreement", "stage", "refs", "depends_on", "owner", "autonomy", "do", "done_when", "completed", "blocked", "review", "extensions"], pathLabel);
255
+ const id = String(taskObject.id);
256
+ if (taskIds.has(id))
257
+ fail(`${pathLabel}.id duplicated`);
258
+ taskIds.add(id);
259
+ if (!TASK_STATUSES.includes(String(taskObject.status)))
260
+ fail(`${pathLabel}.status invalid: ${taskObject.status}`);
261
+ if (!TASK_AGREEMENTS.includes(String(taskObject.agreement))) {
262
+ fail(`${pathLabel}.agreement invalid: ${taskObject.agreement}`);
263
+ }
264
+ asArray(taskObject.refs, `${pathLabel}.refs`);
265
+ asArray(taskObject.do, `${pathLabel}.do`);
266
+ asArray(taskObject.done_when, `${pathLabel}.done_when`).forEach((check, checkIndex) => {
267
+ requireKeys(asObject(check, `${pathLabel}.done_when[${checkIndex}]`), ["id", "text", "done", "proof"], `${pathLabel}.done_when[${checkIndex}]`);
268
+ });
269
+ if (taskObject.status === "done") {
270
+ requireKeys(asObject(taskObject.completed, `${pathLabel}.completed`), ["at", "by", "summary", "event"], `${pathLabel}.completed`);
271
+ }
272
+ if (taskObject.blocked) {
273
+ requireKeys(asObject(taskObject.blocked, `${pathLabel}.blocked`), ["reason", "needs", "event"], `${pathLabel}.blocked`);
274
+ }
275
+ if (taskObject.agreement === "discovered" || taskObject.agreement === "suggested") {
276
+ const review = asObject(taskObject.review, `${pathLabel}.review`);
277
+ requireKeys(review, ["owner", "due", "stale_after_days"], `${pathLabel}.review`);
278
+ if (!review.due)
279
+ fail(`${pathLabel}.review.due required for ${taskObject.agreement} task`);
280
+ }
281
+ if (taskObject.created_by && asObject(taskObject.created_by, `${pathLabel}.created_by`).type === "agent") {
282
+ const createdBy = asObject(taskObject.created_by, `${pathLabel}.created_by`);
283
+ requireKeys(createdBy, ["type", "id", "provider", "model", "persona", "skills", "adapter"], `${pathLabel}.created_by`);
284
+ asArray(createdBy.skills, `${pathLabel}.created_by.skills`);
285
+ }
286
+ return taskObject;
287
+ });
288
+ // evidence.yaml (discovery-review-verbs-v0 R-004): the optional home for
289
+ // inbox evidence attached to this packet by `foo discovery review <F-id>
290
+ // attach --packet <name>`. Absent is valid; present must be well-formed, or
291
+ // attached evidence becomes an unvalidated side file.
292
+ let evidenceText = null;
293
+ try {
294
+ evidenceText = readFileSync(path.join(options.packetDir, "evidence.yaml"), "utf8");
295
+ }
296
+ catch (error) {
297
+ if (!isMissingFile(error))
298
+ throw error;
299
+ }
300
+ if (evidenceText !== null) {
301
+ try {
302
+ const evidenceDoc = asObject(parseValidationYaml(evidenceText), "evidence.yaml");
303
+ requireKeys(evidenceDoc, ["schema_version", "findings"], "evidence.yaml");
304
+ const evidenceFindings = asArray(evidenceDoc.findings, "evidence.yaml.findings");
305
+ const evidenceIds = new Set();
306
+ evidenceFindings.forEach((finding, index) => {
307
+ const findingLabel = `evidence.yaml.findings[${index}]`;
308
+ const findingObject = asObject(finding, findingLabel);
309
+ requireKeys(findingObject, ["finding_id", "original_finding_id", "original_lane", "review_state"], findingLabel);
310
+ const findingId = String(findingObject.finding_id);
311
+ if (evidenceIds.has(findingId))
312
+ throw new PacketValidationError(`${findingLabel}.finding_id duplicated`);
313
+ evidenceIds.add(findingId);
314
+ });
315
+ }
316
+ catch (error) {
317
+ if (isPacketValidationError(error))
318
+ fail(error.message);
319
+ throw error;
320
+ }
321
+ }
322
+ const segmentOrder = ledger ? asArray(ledger.segment_order, "tasks.yaml.ledger.segment_order").map(String) : ["events.jsonl"];
323
+ const events = loadEvents(options.packetDir, segmentOrder, taskIds, options.label);
324
+ const taskEvents = events.filter((event) => String(event.subject).startsWith("task:"));
325
+ for (const task of taskObjects) {
326
+ if (task.agreement !== "discovered" && task.agreement !== "suggested" && task.agreement !== "rejected")
327
+ continue;
328
+ const hasMatchingEvent = taskEvents.some((event) => event.subject === `task:${task.id}`);
329
+ if (!hasMatchingEvent)
330
+ fail(`task ${task.id} has agreement ${task.agreement} but no task event`);
331
+ }
332
+ return `${options.label} ok`;
333
+ }
@@ -0,0 +1,73 @@
1
+ import { type SeverityClass, type SeverityClassCounts } from "./severityClass.js";
2
+ export declare const VERIFY_SCHEMA_VERSION = "1.0";
3
+ export declare const VERIFY_EVENT_TYPE = "com.foo.intent.verified";
4
+ export type CheckState = "proven" | "claimed" | "open";
5
+ export type Verdict = "drift" | "incomplete" | "claimed" | "proven";
6
+ export interface CheckVerdict {
7
+ id: string;
8
+ text: string;
9
+ state: CheckState;
10
+ proof: string | null;
11
+ }
12
+ export interface Finding {
13
+ kind: "false_completion" | "unproven_claim" | "uncovered_requirement";
14
+ severity: "high" | "medium" | "low";
15
+ class: SeverityClass;
16
+ subject: string;
17
+ summary: string;
18
+ suggested_actions: string[];
19
+ requires_human: boolean;
20
+ }
21
+ export interface TaskVerdict {
22
+ id: string;
23
+ title: string;
24
+ status: string;
25
+ agreement: string;
26
+ verdict: Verdict;
27
+ checks_total: number;
28
+ checks_proven: number;
29
+ checks: CheckVerdict[];
30
+ }
31
+ export interface RequirementVerdict {
32
+ id: string;
33
+ verdict: Verdict;
34
+ task_ids: string[];
35
+ }
36
+ export interface VerifyReport {
37
+ schema_version: string;
38
+ spec_id: string | null;
39
+ packet: string;
40
+ intent: string | null;
41
+ verdict: Verdict;
42
+ tasks: {
43
+ total: number;
44
+ proven: number;
45
+ claimed: number;
46
+ incomplete: number;
47
+ drift: number;
48
+ dropped: number;
49
+ };
50
+ checks: {
51
+ total: number;
52
+ proven: number;
53
+ claimed: number;
54
+ open: number;
55
+ };
56
+ requirements: {
57
+ total: number;
58
+ proven: number;
59
+ unproven: number;
60
+ };
61
+ findings_by_class: SeverityClassCounts;
62
+ task_verdicts: TaskVerdict[];
63
+ requirement_verdicts: RequirementVerdict[];
64
+ findings: Finding[];
65
+ summary: string;
66
+ }
67
+ export interface VerifyOptions {
68
+ packetDir: string;
69
+ root: string;
70
+ }
71
+ export declare function verifyPacket(options: VerifyOptions): VerifyReport;
72
+ export declare function verdictGlyphState(verdict: Verdict): "proven" | "claimed" | "todo" | "drift";
73
+ export declare function renderVerifyReport(report: VerifyReport, glyphsOn: boolean): string;