@prismer/runtime 2.0.8 → 2.2.63

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 (633) hide show
  1. package/CHANGELOG.md +4004 -0
  2. package/README.md +34 -12
  3. package/apc/skills/FIELD-DICTIONARY.md +111 -0
  4. package/apc/skills/bug-reproduce/SKILL.md +150 -0
  5. package/apc/skills/bug-reproduce/skill.json +96 -0
  6. package/apc/skills/code-review/SKILL.md +198 -0
  7. package/apc/skills/code-review/skill.json +124 -0
  8. package/apc/skills/design-review/SKILL.md +122 -0
  9. package/apc/skills/design-review/skill.json +88 -0
  10. package/apc/skills/doc-sync/SKILL.md +168 -0
  11. package/apc/skills/doc-sync/skill.json +81 -0
  12. package/apc/skills/env-doctor/SKILL.md +194 -0
  13. package/apc/skills/env-doctor/skill.json +209 -0
  14. package/apc/skills/git-ops/SKILL.md +189 -0
  15. package/apc/skills/git-ops/skill.json +94 -0
  16. package/apc/skills/impact-trace/SKILL.md +168 -0
  17. package/apc/skills/impact-trace/skill.json +104 -0
  18. package/apc/skills/observability/SKILL.md +195 -0
  19. package/apc/skills/observability/skill.json +116 -0
  20. package/apc/skills/release-db-config-sync/SKILL.md +186 -0
  21. package/apc/skills/release-db-config-sync/skill.json +109 -0
  22. package/apc/skills/release-ota-promote/SKILL.md +195 -0
  23. package/apc/skills/release-ota-promote/skill.json +176 -0
  24. package/apc/skills/release-preflight/SKILL.md +174 -0
  25. package/apc/skills/release-preflight/skill.json +175 -0
  26. package/apc/skills/release-rollback/SKILL.md +214 -0
  27. package/apc/skills/release-rollback/skill.json +230 -0
  28. package/apc/skills/release-tag/SKILL.md +194 -0
  29. package/apc/skills/release-tag/skill.json +94 -0
  30. package/apc/skills/releasing-prod/SKILL.md +49 -0
  31. package/apc/skills/releasing-test/SKILL.md +144 -0
  32. package/apc/skills/sdk-release/SKILL.md +200 -0
  33. package/apc/skills/spec-intake/SKILL.md +169 -0
  34. package/apc/skills/spec-intake/skill.json +93 -0
  35. package/apc/skills/test-result-feedback/SKILL.md +239 -0
  36. package/apc/skills/test-result-feedback/skill.json +193 -0
  37. package/apc/skills/test-runner/SKILL.md +169 -0
  38. package/apc/skills/test-runner/skill.json +103 -0
  39. package/apc/skills/ui-align/SKILL.md +209 -0
  40. package/apc/skills/ui-align/skill.json +114 -0
  41. package/apc/skills/ui-canvas/SKILL.md +148 -0
  42. package/apc/skills/ui-canvas/skill.json +127 -0
  43. package/built-in-skills/agent-coordination/SKILL.md +77 -38
  44. package/built-in-skills/agent-meta/SKILL.md +12 -0
  45. package/built-in-skills/assets/SKILL.md +9 -7
  46. package/built-in-skills/browser-use/SKILL.md +93 -0
  47. package/built-in-skills/canvas-design/SKILL.md +4 -3
  48. package/built-in-skills/canvas-design/canvas-fonts/IBMPlexSerif-OFL.txt +93 -0
  49. package/built-in-skills/canvas-design/canvas-fonts/InstrumentSerif-OFL.txt +93 -0
  50. package/built-in-skills/canvas-design/canvas-fonts/LICENSE-SOURCES.md +16 -0
  51. package/built-in-skills/claim-agent-ownership/SKILL.md +10 -5
  52. package/built-in-skills/claude-api/SKILL.md +2 -1
  53. package/built-in-skills/claude-api/python/claude-api/README.md +2 -2
  54. package/built-in-skills/claude-api/python/claude-api/tool-use.md +9 -5
  55. package/built-in-skills/claude-api/python/managed-agents/README.md +11 -1
  56. package/built-in-skills/claude-api/shared/error-codes.md +4 -4
  57. package/built-in-skills/claude-api/shared/managed-agents-client-patterns.md +4 -2
  58. package/built-in-skills/claude-api/shared/managed-agents-core.md +1 -2
  59. package/built-in-skills/claude-api/shared/managed-agents-events.md +41 -22
  60. package/built-in-skills/claude-api/shared/managed-agents-multiagent.md +5 -3
  61. package/built-in-skills/claude-api/shared/managed-agents-self-hosted-sandboxes.md +1 -1
  62. package/built-in-skills/claude-api/shared/managed-agents-tools.md +2 -3
  63. package/built-in-skills/claude-api/shared/model-migration.md +3 -3
  64. package/built-in-skills/claude-api/shared/models.md +1 -1
  65. package/built-in-skills/claude-api/typescript/claude-api/batches.md +1 -1
  66. package/built-in-skills/claude-api/typescript/claude-api/files-api.md +3 -1
  67. package/built-in-skills/claude-api/typescript/claude-api/tool-use.md +8 -2
  68. package/built-in-skills/claude-api/typescript/managed-agents/README.md +8 -2
  69. package/built-in-skills/codebase-design/DEEPENING.md +37 -0
  70. package/built-in-skills/codebase-design/DESIGN-IT-TWICE.md +44 -0
  71. package/built-in-skills/codebase-design/LICENSE +21 -0
  72. package/built-in-skills/codebase-design/SKILL.md +130 -0
  73. package/built-in-skills/codebase-design/references/requesting-code-review/GUIDE.md +291 -0
  74. package/built-in-skills/codebase-design/references/requesting-code-review/LICENSE +21 -0
  75. package/built-in-skills/codebase-design/references/requesting-code-review/LICENSE.superpowers +21 -0
  76. package/built-in-skills/codebase-design/references/requesting-code-review/NOTICE.md +37 -0
  77. package/built-in-skills/codebase-design/references/sdlc-review/GUIDE.md +130 -0
  78. package/built-in-skills/codebase-design/references/sdlc-review/LICENSE +21 -0
  79. package/built-in-skills/codebase-design/references/sdlc-review/NOTICE.md +17 -0
  80. package/built-in-skills/codebase-design/references/simplify-code/GUIDE.md +269 -0
  81. package/built-in-skills/codebase-design/references/simplify-code/LICENSE +21 -0
  82. package/built-in-skills/codebase-design/references/simplify-code/NOTICE.md +37 -0
  83. package/built-in-skills/competitor-intelligence/LICENSE +21 -0
  84. package/built-in-skills/competitor-intelligence/NOTICE.md +6 -0
  85. package/built-in-skills/competitor-intelligence/SKILL.md +125 -0
  86. package/built-in-skills/competitor-intelligence/scripts/watch_state.py +160 -0
  87. package/built-in-skills/conversation-compaction/SKILL.md +117 -0
  88. package/built-in-skills/council-creator/SKILL.md +427 -0
  89. package/built-in-skills/diagnosing-bugs/LICENSE +21 -0
  90. package/built-in-skills/diagnosing-bugs/SKILL.md +148 -0
  91. package/built-in-skills/diagnosing-bugs/references/desktop-dom/GUIDE.md +64 -0
  92. package/built-in-skills/diagnosing-bugs/references/desktop-dom/LICENSE +21 -0
  93. package/built-in-skills/diagnosing-bugs/references/desktop-dom/NOTICE.md +17 -0
  94. package/built-in-skills/diagnosing-bugs/references/systematic-debugging/GUIDE.md +410 -0
  95. package/built-in-skills/diagnosing-bugs/references/systematic-debugging/LICENSE +21 -0
  96. package/built-in-skills/diagnosing-bugs/references/systematic-debugging/LICENSE.superpowers +21 -0
  97. package/built-in-skills/diagnosing-bugs/references/systematic-debugging/NOTICE.md +37 -0
  98. package/built-in-skills/diagnosing-bugs/scripts/hitl-loop.template.sh +41 -0
  99. package/built-in-skills/doc-coauthoring/SKILL.md +7 -0
  100. package/built-in-skills/doc-coauthoring/references/humanizer/GUIDE.md +647 -0
  101. package/built-in-skills/doc-coauthoring/references/humanizer/LICENSE +21 -0
  102. package/built-in-skills/doc-coauthoring/references/humanizer/LICENSE.hermes +21 -0
  103. package/built-in-skills/doc-coauthoring/references/humanizer/PROVENANCE.md +7 -0
  104. package/built-in-skills/document-actions/LICENSE +21 -0
  105. package/built-in-skills/document-actions/NOTICE.md +21 -0
  106. package/built-in-skills/document-actions/SKILL.md +46 -0
  107. package/built-in-skills/domain-modeling/ADR-FORMAT.md +47 -0
  108. package/built-in-skills/domain-modeling/CONTEXT-FORMAT.md +60 -0
  109. package/built-in-skills/domain-modeling/LICENSE +21 -0
  110. package/built-in-skills/domain-modeling/SKILL.md +76 -0
  111. package/built-in-skills/evidence-citations/LICENSE +21 -0
  112. package/built-in-skills/evidence-citations/NOTICE.md +21 -0
  113. package/built-in-skills/evidence-citations/SKILL.md +46 -0
  114. package/built-in-skills/evidence-citations/references/citation-formats.md +68 -0
  115. package/built-in-skills/evidence-citations/references/grounding-rationale.md +64 -0
  116. package/built-in-skills/evidence-citations/scripts/sources.py +720 -0
  117. package/built-in-skills/frontend-design/SKILL.md +7 -0
  118. package/built-in-skills/frontend-design/references/claude-design/GUIDE.md +650 -0
  119. package/built-in-skills/frontend-design/references/claude-design/LICENSE +21 -0
  120. package/built-in-skills/frontend-design/references/claude-design/LICENSE.hermes +21 -0
  121. package/built-in-skills/frontend-design/references/claude-design/PROVENANCE.md +7 -0
  122. package/built-in-skills/human-approval/SKILL.md +17 -2
  123. package/built-in-skills/image-generate/SKILL.md +107 -301
  124. package/built-in-skills/image-generate/scripts/generate-and-deliver.mjs +310 -0
  125. package/built-in-skills/ingest/SKILL.md +13 -45
  126. package/built-in-skills/internal-comms/SKILL.md +1 -0
  127. package/built-in-skills/liteparse/SKILL.md +130 -110
  128. package/built-in-skills/mcp-builder/SKILL.md +1 -0
  129. package/built-in-skills/mcp-builder/reference/evaluation.md +11 -2
  130. package/built-in-skills/mcp-builder/reference/node_mcp_server.md +34 -5
  131. package/built-in-skills/mcp-builder/reference/python_mcp_server.md +6 -2
  132. package/built-in-skills/mcp-builder/scripts/connections.py +1 -1
  133. package/built-in-skills/mcp-builder/scripts/evaluation.py +52 -34
  134. package/built-in-skills/mcp-builder/scripts/requirements.txt +2 -2
  135. package/built-in-skills/meeting-actions/LICENSE +21 -0
  136. package/built-in-skills/meeting-actions/NOTICE.md +21 -0
  137. package/built-in-skills/meeting-actions/SKILL.md +48 -0
  138. package/built-in-skills/memory/SKILL.md +444 -55
  139. package/built-in-skills/memory/references/llm-wiki/GUIDE.md +468 -0
  140. package/built-in-skills/memory/references/llm-wiki/LICENSE +21 -0
  141. package/built-in-skills/memory/references/llm-wiki/NOTICE.md +4 -0
  142. package/built-in-skills/memory/references/llm-wiki/scripts/lint_wiki.py +84 -0
  143. package/built-in-skills/memory/references/llm-wiki/scripts/requirements.txt +1 -0
  144. package/built-in-skills/memory/references/llm-wiki/templates/SCHEMA.md +19 -0
  145. package/built-in-skills/memory/references/llm-wiki/templates/index.md +9 -0
  146. package/built-in-skills/memory/references/llm-wiki/templates/log.md +4 -0
  147. package/built-in-skills/memory-dream/SKILL.md +332 -0
  148. package/built-in-skills/memory-import/SKILL.md +51 -0
  149. package/built-in-skills/office-artifacts/NOTICE.md +15 -0
  150. package/built-in-skills/office-artifacts/SKILL.md +37 -4
  151. package/built-in-skills/office-artifacts/references/RESOURCE-LIMITS.md +44 -0
  152. package/built-in-skills/office-artifacts/references/document-generation/GUIDE.md +105 -0
  153. package/built-in-skills/office-artifacts/references/docx/GUIDE.md +196 -0
  154. package/built-in-skills/office-artifacts/references/docx/LICENSE +21 -0
  155. package/built-in-skills/office-artifacts/references/docx/NOTICE.md +21 -0
  156. package/built-in-skills/office-artifacts/references/docx/references/revisions-and-comments.md +88 -0
  157. package/built-in-skills/office-artifacts/references/docx/scripts/docx_comments.py +292 -0
  158. package/built-in-skills/office-artifacts/references/docx/scripts/docx_common.py +93 -0
  159. package/built-in-skills/office-artifacts/references/docx/scripts/docx_create.py +177 -0
  160. package/built-in-skills/office-artifacts/references/docx/scripts/docx_edit.py +250 -0
  161. package/built-in-skills/office-artifacts/references/docx/scripts/docx_read.py +169 -0
  162. package/built-in-skills/office-artifacts/references/docx/scripts/docx_revisions.py +149 -0
  163. package/built-in-skills/office-artifacts/references/docx/scripts/docx_template.py +70 -0
  164. package/built-in-skills/office-artifacts/references/docx/scripts/docx_validate.py +155 -0
  165. package/built-in-skills/office-artifacts/references/docx/tests/test_docx_skill.py +525 -0
  166. package/built-in-skills/office-artifacts/references/pdf/GUIDE.md +125 -0
  167. package/built-in-skills/office-artifacts/references/pdf/LICENSE +21 -0
  168. package/built-in-skills/office-artifacts/references/pdf/NOTICE.md +21 -0
  169. package/built-in-skills/office-artifacts/references/pdf/references/forms.md +99 -0
  170. package/built-in-skills/office-artifacts/references/pdf/references/nano-pdf-editing.md +40 -0
  171. package/built-in-skills/office-artifacts/references/pdf/references/ocr-extraction.md +165 -0
  172. package/built-in-skills/office-artifacts/references/pdf/scripts/_raster.py +87 -0
  173. package/built-in-skills/office-artifacts/references/pdf/scripts/extract_marker.py +95 -0
  174. package/built-in-skills/office-artifacts/references/pdf/scripts/extract_pymupdf.py +107 -0
  175. package/built-in-skills/office-artifacts/references/pdf/scripts/pdf_create.py +153 -0
  176. package/built-in-skills/office-artifacts/references/pdf/scripts/pdf_fill_form.py +97 -0
  177. package/built-in-skills/office-artifacts/references/pdf/scripts/pdf_form_layout.py +168 -0
  178. package/built-in-skills/office-artifacts/references/pdf/scripts/pdf_make_form.py +145 -0
  179. package/built-in-skills/office-artifacts/references/pdf/scripts/pdf_merge.py +50 -0
  180. package/built-in-skills/office-artifacts/references/pdf/scripts/pdf_meta.py +123 -0
  181. package/built-in-skills/office-artifacts/references/pdf/scripts/pdf_page_image.py +101 -0
  182. package/built-in-skills/office-artifacts/references/pdf/scripts/pdf_read.py +153 -0
  183. package/built-in-skills/office-artifacts/references/pdf/scripts/pdf_secure.py +71 -0
  184. package/built-in-skills/office-artifacts/references/pdf/scripts/pdf_split.py +86 -0
  185. package/built-in-skills/office-artifacts/references/pdf/scripts/pdf_stamp.py +145 -0
  186. package/built-in-skills/office-artifacts/references/pdf/scripts/pdf_watermark.py +51 -0
  187. package/built-in-skills/office-artifacts/references/pdf/tests/test_pdf_skill.py +414 -0
  188. package/built-in-skills/office-artifacts/references/powerpoint/GUIDE.md +220 -0
  189. package/built-in-skills/office-artifacts/references/powerpoint/LICENSE +21 -0
  190. package/built-in-skills/office-artifacts/references/powerpoint/NOTICE.md +21 -0
  191. package/built-in-skills/office-artifacts/references/powerpoint/scripts/pptx_create.py +214 -0
  192. package/built-in-skills/office-artifacts/references/powerpoint/scripts/pptx_edit.py +442 -0
  193. package/built-in-skills/office-artifacts/references/powerpoint/scripts/pptx_from_template.py +88 -0
  194. package/built-in-skills/office-artifacts/references/powerpoint/scripts/pptx_read.py +131 -0
  195. package/built-in-skills/office-artifacts/references/powerpoint/scripts/pptx_render.py +104 -0
  196. package/built-in-skills/office-artifacts/references/powerpoint/tests/test_powerpoint_skill.py +478 -0
  197. package/built-in-skills/office-artifacts/references/xlsx/GUIDE.md +196 -0
  198. package/built-in-skills/office-artifacts/references/xlsx/LICENSE +21 -0
  199. package/built-in-skills/office-artifacts/references/xlsx/NOTICE.md +21 -0
  200. package/built-in-skills/office-artifacts/references/xlsx/references/restructuring.md +74 -0
  201. package/built-in-skills/office-artifacts/references/xlsx/scripts/csv_to_xlsx.py +108 -0
  202. package/built-in-skills/office-artifacts/references/xlsx/scripts/xlsx_create.py +259 -0
  203. package/built-in-skills/office-artifacts/references/xlsx/scripts/xlsx_edit.py +269 -0
  204. package/built-in-skills/office-artifacts/references/xlsx/scripts/xlsx_read.py +160 -0
  205. package/built-in-skills/office-artifacts/references/xlsx/scripts/xlsx_recalc.py +111 -0
  206. package/built-in-skills/office-artifacts/references/xlsx/scripts/xlsx_restructure.py +418 -0
  207. package/built-in-skills/office-artifacts/references/xlsx/scripts/xlsx_to_csv.py +69 -0
  208. package/built-in-skills/office-artifacts/references/xlsx/tests/test_xlsx_skill.py +542 -0
  209. package/built-in-skills/office-artifacts/tests/test_resource_regressions.py +272 -0
  210. package/built-in-skills/okr/SKILL.md +154 -0
  211. package/built-in-skills/persona/SKILL.md +81 -0
  212. package/built-in-skills/persona-generator/SKILL.md +296 -0
  213. package/built-in-skills/pkf-svg/SKILL.md +258 -0
  214. package/built-in-skills/pkf-svg/references/architecture-diagram/GUIDE.md +148 -0
  215. package/built-in-skills/pkf-svg/references/architecture-diagram/LICENSE +21 -0
  216. package/built-in-skills/pkf-svg/references/architecture-diagram/LICENSE.hermes +21 -0
  217. package/built-in-skills/pkf-svg/references/architecture-diagram/PROVENANCE.md +7 -0
  218. package/built-in-skills/pkf-svg/references/architecture-diagram/templates/template.html +345 -0
  219. package/built-in-skills/pkf-writing/SKILL.md +258 -0
  220. package/built-in-skills/prismer-airtable/LICENSE +21 -0
  221. package/built-in-skills/prismer-airtable/NOTICE.md +11 -0
  222. package/built-in-skills/prismer-airtable/SKILL.md +248 -0
  223. package/built-in-skills/prismer-airtable/scripts/airtable_client.py +76 -0
  224. package/built-in-skills/prismer-apple-notes/LICENSE +21 -0
  225. package/built-in-skills/prismer-apple-notes/NOTICE.md +17 -0
  226. package/built-in-skills/prismer-apple-notes/SKILL.md +118 -0
  227. package/built-in-skills/prismer-apple-notes/scripts/readiness.py +47 -0
  228. package/built-in-skills/prismer-apple-reminders/LICENSE +21 -0
  229. package/built-in-skills/prismer-apple-reminders/NOTICE.md +17 -0
  230. package/built-in-skills/prismer-apple-reminders/SKILL.md +155 -0
  231. package/built-in-skills/prismer-apple-reminders/scripts/readiness.py +47 -0
  232. package/built-in-skills/prismer-ascii-video/LICENSE +21 -0
  233. package/built-in-skills/prismer-ascii-video/LICENSE.hermes +21 -0
  234. package/built-in-skills/prismer-ascii-video/PROVENANCE.md +7 -0
  235. package/built-in-skills/prismer-ascii-video/README.md +290 -0
  236. package/built-in-skills/prismer-ascii-video/SKILL.md +252 -0
  237. package/built-in-skills/prismer-ascii-video/provenance/category-DESCRIPTION.md +3 -0
  238. package/built-in-skills/prismer-ascii-video/references/architecture.md +807 -0
  239. package/built-in-skills/prismer-ascii-video/references/composition.md +900 -0
  240. package/built-in-skills/prismer-ascii-video/references/effects.md +1877 -0
  241. package/built-in-skills/prismer-ascii-video/references/inputs.md +693 -0
  242. package/built-in-skills/prismer-ascii-video/references/optimization.md +688 -0
  243. package/built-in-skills/prismer-ascii-video/references/scenes.md +1018 -0
  244. package/built-in-skills/prismer-ascii-video/references/shaders.md +1408 -0
  245. package/built-in-skills/prismer-ascii-video/references/troubleshooting.md +360 -0
  246. package/built-in-skills/prismer-baoyu-infographic/LICENSE +21 -0
  247. package/built-in-skills/prismer-baoyu-infographic/LICENSE.hermes +21 -0
  248. package/built-in-skills/prismer-baoyu-infographic/LICENSE.origin +21 -0
  249. package/built-in-skills/prismer-baoyu-infographic/PORT_NOTES.md +37 -0
  250. package/built-in-skills/prismer-baoyu-infographic/PROVENANCE.md +7 -0
  251. package/built-in-skills/prismer-baoyu-infographic/SKILL.md +240 -0
  252. package/built-in-skills/prismer-baoyu-infographic/references/analysis-framework.md +182 -0
  253. package/built-in-skills/prismer-baoyu-infographic/references/base-prompt.md +43 -0
  254. package/built-in-skills/prismer-baoyu-infographic/references/layouts/bento-grid.md +41 -0
  255. package/built-in-skills/prismer-baoyu-infographic/references/layouts/binary-comparison.md +48 -0
  256. package/built-in-skills/prismer-baoyu-infographic/references/layouts/bridge.md +41 -0
  257. package/built-in-skills/prismer-baoyu-infographic/references/layouts/circular-flow.md +41 -0
  258. package/built-in-skills/prismer-baoyu-infographic/references/layouts/comic-strip.md +41 -0
  259. package/built-in-skills/prismer-baoyu-infographic/references/layouts/comparison-matrix.md +41 -0
  260. package/built-in-skills/prismer-baoyu-infographic/references/layouts/dashboard.md +41 -0
  261. package/built-in-skills/prismer-baoyu-infographic/references/layouts/dense-modules.md +72 -0
  262. package/built-in-skills/prismer-baoyu-infographic/references/layouts/funnel.md +41 -0
  263. package/built-in-skills/prismer-baoyu-infographic/references/layouts/hierarchical-layers.md +48 -0
  264. package/built-in-skills/prismer-baoyu-infographic/references/layouts/hub-spoke.md +41 -0
  265. package/built-in-skills/prismer-baoyu-infographic/references/layouts/iceberg.md +41 -0
  266. package/built-in-skills/prismer-baoyu-infographic/references/layouts/isometric-map.md +41 -0
  267. package/built-in-skills/prismer-baoyu-infographic/references/layouts/jigsaw.md +41 -0
  268. package/built-in-skills/prismer-baoyu-infographic/references/layouts/linear-progression.md +48 -0
  269. package/built-in-skills/prismer-baoyu-infographic/references/layouts/periodic-table.md +41 -0
  270. package/built-in-skills/prismer-baoyu-infographic/references/layouts/story-mountain.md +41 -0
  271. package/built-in-skills/prismer-baoyu-infographic/references/layouts/structural-breakdown.md +48 -0
  272. package/built-in-skills/prismer-baoyu-infographic/references/layouts/tree-branching.md +41 -0
  273. package/built-in-skills/prismer-baoyu-infographic/references/layouts/venn-diagram.md +41 -0
  274. package/built-in-skills/prismer-baoyu-infographic/references/layouts/winding-roadmap.md +41 -0
  275. package/built-in-skills/prismer-baoyu-infographic/references/structured-content-template.md +244 -0
  276. package/built-in-skills/prismer-baoyu-infographic/references/styles/aged-academia.md +36 -0
  277. package/built-in-skills/prismer-baoyu-infographic/references/styles/bold-graphic.md +36 -0
  278. package/built-in-skills/prismer-baoyu-infographic/references/styles/chalkboard.md +61 -0
  279. package/built-in-skills/prismer-baoyu-infographic/references/styles/claymation.md +29 -0
  280. package/built-in-skills/prismer-baoyu-infographic/references/styles/corporate-memphis.md +29 -0
  281. package/built-in-skills/prismer-baoyu-infographic/references/styles/craft-handmade.md +44 -0
  282. package/built-in-skills/prismer-baoyu-infographic/references/styles/cyberpunk-neon.md +29 -0
  283. package/built-in-skills/prismer-baoyu-infographic/references/styles/hand-drawn-edu.md +63 -0
  284. package/built-in-skills/prismer-baoyu-infographic/references/styles/ikea-manual.md +29 -0
  285. package/built-in-skills/prismer-baoyu-infographic/references/styles/kawaii.md +29 -0
  286. package/built-in-skills/prismer-baoyu-infographic/references/styles/knolling.md +29 -0
  287. package/built-in-skills/prismer-baoyu-infographic/references/styles/lego-brick.md +29 -0
  288. package/built-in-skills/prismer-baoyu-infographic/references/styles/morandi-journal.md +60 -0
  289. package/built-in-skills/prismer-baoyu-infographic/references/styles/origami.md +29 -0
  290. package/built-in-skills/prismer-baoyu-infographic/references/styles/pixel-art.md +29 -0
  291. package/built-in-skills/prismer-baoyu-infographic/references/styles/pop-laboratory.md +48 -0
  292. package/built-in-skills/prismer-baoyu-infographic/references/styles/retro-pop-grid.md +47 -0
  293. package/built-in-skills/prismer-baoyu-infographic/references/styles/storybook-watercolor.md +29 -0
  294. package/built-in-skills/prismer-baoyu-infographic/references/styles/subway-map.md +29 -0
  295. package/built-in-skills/prismer-baoyu-infographic/references/styles/technical-schematic.md +36 -0
  296. package/built-in-skills/prismer-baoyu-infographic/references/styles/ui-wireframe.md +29 -0
  297. package/built-in-skills/prismer-blocked-page-recovery/LICENSE +21 -0
  298. package/built-in-skills/prismer-blocked-page-recovery/NOTICE.md +17 -0
  299. package/built-in-skills/prismer-blocked-page-recovery/SKILL.md +158 -0
  300. package/built-in-skills/prismer-blocked-page-recovery/scripts/recover_page.py +311 -0
  301. package/built-in-skills/prismer-box/LICENSE +21 -0
  302. package/built-in-skills/prismer-box/NOTICE.md +11 -0
  303. package/built-in-skills/prismer-box/SKILL.md +147 -0
  304. package/built-in-skills/prismer-box/references/bulk-operations.md +43 -0
  305. package/built-in-skills/prismer-box/references/cli-guide.md +133 -0
  306. package/built-in-skills/prismer-box/references/content-workflows.md +86 -0
  307. package/built-in-skills/prismer-box/references/hubs.md +77 -0
  308. package/built-in-skills/prismer-box/references/oauth-setup.md +92 -0
  309. package/built-in-skills/prismer-box/references/rest-api.md +37 -0
  310. package/built-in-skills/prismer-box/references/sdk-development.md +85 -0
  311. package/built-in-skills/prismer-box/references/search-and-ai.md +147 -0
  312. package/built-in-skills/prismer-box/references/troubleshooting.md +33 -0
  313. package/built-in-skills/prismer-box/references/webhooks-and-events.md +43 -0
  314. package/built-in-skills/prismer-codebase-inspection/LICENSE +21 -0
  315. package/built-in-skills/prismer-codebase-inspection/NOTICE.md +17 -0
  316. package/built-in-skills/prismer-codebase-inspection/SKILL.md +141 -0
  317. package/built-in-skills/prismer-computer-use/LICENSE +21 -0
  318. package/built-in-skills/prismer-computer-use/NOTICE.md +17 -0
  319. package/built-in-skills/prismer-computer-use/SKILL.md +372 -0
  320. package/built-in-skills/prismer-design-md/LICENSE +21 -0
  321. package/built-in-skills/prismer-design-md/LICENSE.hermes +21 -0
  322. package/built-in-skills/prismer-design-md/PROVENANCE.md +7 -0
  323. package/built-in-skills/prismer-design-md/SKILL.md +227 -0
  324. package/built-in-skills/prismer-design-md/templates/starter.md +99 -0
  325. package/built-in-skills/prismer-email-inbox-triage/LICENSE +21 -0
  326. package/built-in-skills/prismer-email-inbox-triage/NOTICE.md +11 -0
  327. package/built-in-skills/prismer-email-inbox-triage/SKILL.md +116 -0
  328. package/built-in-skills/prismer-findmy/LICENSE +21 -0
  329. package/built-in-skills/prismer-findmy/NOTICE.md +17 -0
  330. package/built-in-skills/prismer-findmy/SKILL.md +150 -0
  331. package/built-in-skills/prismer-findmy/scripts/readiness.py +47 -0
  332. package/built-in-skills/prismer-gif-search/LICENSE +21 -0
  333. package/built-in-skills/prismer-gif-search/LICENSE.hermes +21 -0
  334. package/built-in-skills/prismer-gif-search/PROVENANCE.md +7 -0
  335. package/built-in-skills/prismer-gif-search/SKILL.md +97 -0
  336. package/built-in-skills/prismer-gif-search/scripts/tenor.py +81 -0
  337. package/built-in-skills/prismer-github/LICENSE +21 -0
  338. package/built-in-skills/prismer-github/NOTICE.md +17 -0
  339. package/built-in-skills/prismer-github/SKILL.md +74 -0
  340. package/built-in-skills/prismer-github/references/auth.md +91 -0
  341. package/built-in-skills/prismer-github/references/ci-troubleshooting.md +193 -0
  342. package/built-in-skills/prismer-github/references/code-review.md +465 -0
  343. package/built-in-skills/prismer-github/references/conventional-commits.md +81 -0
  344. package/built-in-skills/prismer-github/references/github-api-cheatsheet.md +177 -0
  345. package/built-in-skills/prismer-github/references/issue-to-pr.md +74 -0
  346. package/built-in-skills/prismer-github/references/issues.md +336 -0
  347. package/built-in-skills/prismer-github/references/pr-workflow.md +346 -0
  348. package/built-in-skills/prismer-github/references/repo-management.md +484 -0
  349. package/built-in-skills/prismer-github/references/review-output-template.md +84 -0
  350. package/built-in-skills/prismer-github/scripts/ensure-gh.py +132 -0
  351. package/built-in-skills/prismer-github/scripts/gh-env.sh +25 -0
  352. package/built-in-skills/prismer-github/scripts/git-credential-token.py +68 -0
  353. package/built-in-skills/prismer-github/scripts/github-api.py +71 -0
  354. package/built-in-skills/prismer-github/scripts/github-context.py +28 -0
  355. package/built-in-skills/prismer-github/templates/bug-report.md +35 -0
  356. package/built-in-skills/prismer-github/templates/feature-request.md +31 -0
  357. package/built-in-skills/prismer-github/templates/pr-body-bugfix.md +35 -0
  358. package/built-in-skills/prismer-github/templates/pr-body-feature.md +33 -0
  359. package/built-in-skills/prismer-google-workspace/LICENSE +21 -0
  360. package/built-in-skills/prismer-google-workspace/NOTICE.md +11 -0
  361. package/built-in-skills/prismer-google-workspace/SKILL.md +369 -0
  362. package/built-in-skills/prismer-google-workspace/references/daily-brief.md +65 -0
  363. package/built-in-skills/prismer-google-workspace/references/gmail-search-syntax.md +63 -0
  364. package/built-in-skills/prismer-google-workspace/scripts/_hermes_home.py +17 -0
  365. package/built-in-skills/prismer-google-workspace/scripts/_private_state.py +39 -0
  366. package/built-in-skills/prismer-google-workspace/scripts/google_api.py +1339 -0
  367. package/built-in-skills/prismer-google-workspace/scripts/gws_bridge.py +121 -0
  368. package/built-in-skills/prismer-google-workspace/scripts/setup.py +563 -0
  369. package/built-in-skills/prismer-google-workspace/tests/test_productivity_regressions.py +214 -0
  370. package/built-in-skills/prismer-hermes-agent/LICENSE +21 -0
  371. package/built-in-skills/prismer-hermes-agent/NOTICE.md +17 -0
  372. package/built-in-skills/prismer-hermes-agent/SKILL.md +247 -0
  373. package/built-in-skills/prismer-hermes-agent/references/background-systems.md +108 -0
  374. package/built-in-skills/prismer-hermes-agent/references/cli-reference.md +158 -0
  375. package/built-in-skills/prismer-hermes-agent/references/configuration.md +96 -0
  376. package/built-in-skills/prismer-hermes-agent/references/contributor-guide.md +151 -0
  377. package/built-in-skills/prismer-hermes-agent/references/delegate-task-concurrency-diagnosis.md +47 -0
  378. package/built-in-skills/prismer-hermes-agent/references/desktop-plugins.md +215 -0
  379. package/built-in-skills/prismer-hermes-agent/references/native-mcp.md +351 -0
  380. package/built-in-skills/prismer-hermes-agent/references/petdex.md +82 -0
  381. package/built-in-skills/prismer-hermes-agent/references/portal-auth-for-third-party-apps.md +135 -0
  382. package/built-in-skills/prismer-hermes-agent/references/project-context-files.md +55 -0
  383. package/built-in-skills/prismer-hermes-agent/references/providers-and-models.md +81 -0
  384. package/built-in-skills/prismer-hermes-agent/references/security-privacy.md +73 -0
  385. package/built-in-skills/prismer-hermes-agent/references/slash-commands.md +119 -0
  386. package/built-in-skills/prismer-hermes-agent/references/themes.md +134 -0
  387. package/built-in-skills/prismer-hermes-agent/references/troubleshooting.md +87 -0
  388. package/built-in-skills/prismer-hermes-agent/references/tui-widgets.md +144 -0
  389. package/built-in-skills/prismer-hermes-agent/references/webhooks.md +219 -0
  390. package/built-in-skills/prismer-hermes-agent/references/windows-quirks.md +64 -0
  391. package/built-in-skills/prismer-hermes-agent/templates/clock.mjs +51 -0
  392. package/built-in-skills/prismer-hermes-agent/templates/plugin.js +97 -0
  393. package/built-in-skills/prismer-hermes-agent/templates/skin.yaml +49 -0
  394. package/built-in-skills/prismer-himalaya/LICENSE +21 -0
  395. package/built-in-skills/prismer-himalaya/NOTICE.md +11 -0
  396. package/built-in-skills/prismer-himalaya/SKILL.md +340 -0
  397. package/built-in-skills/prismer-himalaya/references/configuration.md +227 -0
  398. package/built-in-skills/prismer-himalaya/references/message-composition.md +206 -0
  399. package/built-in-skills/prismer-himalaya/scripts/compose_draft.py +48 -0
  400. package/built-in-skills/prismer-im-collab/SKILL.md +27 -7
  401. package/built-in-skills/prismer-imessage/LICENSE +21 -0
  402. package/built-in-skills/prismer-imessage/NOTICE.md +17 -0
  403. package/built-in-skills/prismer-imessage/SKILL.md +128 -0
  404. package/built-in-skills/prismer-imessage/scripts/readiness.py +47 -0
  405. package/built-in-skills/prismer-manim-video/LICENSE +21 -0
  406. package/built-in-skills/prismer-manim-video/LICENSE.hermes +21 -0
  407. package/built-in-skills/prismer-manim-video/PROVENANCE.md +7 -0
  408. package/built-in-skills/prismer-manim-video/README.md +23 -0
  409. package/built-in-skills/prismer-manim-video/SKILL.md +279 -0
  410. package/built-in-skills/prismer-manim-video/references/animation-design-thinking.md +161 -0
  411. package/built-in-skills/prismer-manim-video/references/animations.md +282 -0
  412. package/built-in-skills/prismer-manim-video/references/camera-and-3d.md +135 -0
  413. package/built-in-skills/prismer-manim-video/references/decorations.md +202 -0
  414. package/built-in-skills/prismer-manim-video/references/equations.md +216 -0
  415. package/built-in-skills/prismer-manim-video/references/graphs-and-data.md +163 -0
  416. package/built-in-skills/prismer-manim-video/references/mobjects.md +333 -0
  417. package/built-in-skills/prismer-manim-video/references/paper-explainer.md +255 -0
  418. package/built-in-skills/prismer-manim-video/references/production-quality.md +190 -0
  419. package/built-in-skills/prismer-manim-video/references/rendering.md +187 -0
  420. package/built-in-skills/prismer-manim-video/references/scene-planning.md +118 -0
  421. package/built-in-skills/prismer-manim-video/references/troubleshooting.md +135 -0
  422. package/built-in-skills/prismer-manim-video/references/updaters-and-trackers.md +260 -0
  423. package/built-in-skills/prismer-manim-video/references/visual-design.md +124 -0
  424. package/built-in-skills/prismer-manim-video/scripts/setup.sh +15 -0
  425. package/built-in-skills/prismer-maps/LICENSE +21 -0
  426. package/built-in-skills/prismer-maps/NOTICE.md +11 -0
  427. package/built-in-skills/prismer-maps/SKILL.md +240 -0
  428. package/built-in-skills/prismer-maps/scripts/maps_client.py +1324 -0
  429. package/built-in-skills/prismer-node-inspect-debugger/LICENSE +21 -0
  430. package/built-in-skills/prismer-node-inspect-debugger/NOTICE.md +17 -0
  431. package/built-in-skills/prismer-node-inspect-debugger/SKILL.md +347 -0
  432. package/built-in-skills/prismer-notion/LICENSE +21 -0
  433. package/built-in-skills/prismer-notion/NOTICE.md +11 -0
  434. package/built-in-skills/prismer-notion/SKILL.md +495 -0
  435. package/built-in-skills/prismer-notion/references/block-types.md +112 -0
  436. package/built-in-skills/prismer-obsidian/LICENSE +21 -0
  437. package/built-in-skills/prismer-obsidian/LICENSE.hermes +21 -0
  438. package/built-in-skills/prismer-obsidian/PROVENANCE.md +7 -0
  439. package/built-in-skills/prismer-obsidian/SKILL.md +80 -0
  440. package/built-in-skills/prismer-obsidian/provenance/category-DESCRIPTION.md +3 -0
  441. package/built-in-skills/prismer-obsidian/scripts/write_note.py +84 -0
  442. package/built-in-skills/prismer-p5js/LICENSE +21 -0
  443. package/built-in-skills/prismer-p5js/LICENSE.hermes +21 -0
  444. package/built-in-skills/prismer-p5js/PROVENANCE.md +7 -0
  445. package/built-in-skills/prismer-p5js/README.md +64 -0
  446. package/built-in-skills/prismer-p5js/SKILL.md +574 -0
  447. package/built-in-skills/prismer-p5js/references/animation.md +439 -0
  448. package/built-in-skills/prismer-p5js/references/color-systems.md +355 -0
  449. package/built-in-skills/prismer-p5js/references/core-api.md +410 -0
  450. package/built-in-skills/prismer-p5js/references/export-pipeline.md +534 -0
  451. package/built-in-skills/prismer-p5js/references/interaction.md +398 -0
  452. package/built-in-skills/prismer-p5js/references/shapes-and-geometry.md +300 -0
  453. package/built-in-skills/prismer-p5js/references/troubleshooting.md +532 -0
  454. package/built-in-skills/prismer-p5js/references/typography.md +302 -0
  455. package/built-in-skills/prismer-p5js/references/visual-effects.md +905 -0
  456. package/built-in-skills/prismer-p5js/references/webgl-and-3d.md +423 -0
  457. package/built-in-skills/prismer-p5js/scripts/export-frames.js +91 -0
  458. package/built-in-skills/prismer-p5js/scripts/render.sh +113 -0
  459. package/built-in-skills/prismer-p5js/scripts/serve.sh +25 -0
  460. package/built-in-skills/prismer-p5js/scripts/setup.sh +87 -0
  461. package/built-in-skills/prismer-p5js/templates/viewer.html +401 -0
  462. package/built-in-skills/prismer-popular-web-designs/LICENSE +21 -0
  463. package/built-in-skills/prismer-popular-web-designs/LICENSE.hermes +21 -0
  464. package/built-in-skills/prismer-popular-web-designs/LICENSE.origin +21 -0
  465. package/built-in-skills/prismer-popular-web-designs/PROVENANCE.md +7 -0
  466. package/built-in-skills/prismer-popular-web-designs/SKILL.md +218 -0
  467. package/built-in-skills/prismer-popular-web-designs/templates/airbnb.md +259 -0
  468. package/built-in-skills/prismer-popular-web-designs/templates/airtable.md +102 -0
  469. package/built-in-skills/prismer-popular-web-designs/templates/apple.md +326 -0
  470. package/built-in-skills/prismer-popular-web-designs/templates/bmw.md +193 -0
  471. package/built-in-skills/prismer-popular-web-designs/templates/cal.md +272 -0
  472. package/built-in-skills/prismer-popular-web-designs/templates/claude.md +325 -0
  473. package/built-in-skills/prismer-popular-web-designs/templates/clay.md +317 -0
  474. package/built-in-skills/prismer-popular-web-designs/templates/clickhouse.md +294 -0
  475. package/built-in-skills/prismer-popular-web-designs/templates/cohere.md +279 -0
  476. package/built-in-skills/prismer-popular-web-designs/templates/coinbase.md +142 -0
  477. package/built-in-skills/prismer-popular-web-designs/templates/composio.md +320 -0
  478. package/built-in-skills/prismer-popular-web-designs/templates/cursor.md +322 -0
  479. package/built-in-skills/prismer-popular-web-designs/templates/elevenlabs.md +278 -0
  480. package/built-in-skills/prismer-popular-web-designs/templates/expo.md +294 -0
  481. package/built-in-skills/prismer-popular-web-designs/templates/figma.md +233 -0
  482. package/built-in-skills/prismer-popular-web-designs/templates/framer.md +259 -0
  483. package/built-in-skills/prismer-popular-web-designs/templates/hashicorp.md +291 -0
  484. package/built-in-skills/prismer-popular-web-designs/templates/ibm.md +345 -0
  485. package/built-in-skills/prismer-popular-web-designs/templates/intercom.md +159 -0
  486. package/built-in-skills/prismer-popular-web-designs/templates/kraken.md +138 -0
  487. package/built-in-skills/prismer-popular-web-designs/templates/linear.app.md +380 -0
  488. package/built-in-skills/prismer-popular-web-designs/templates/lovable.md +311 -0
  489. package/built-in-skills/prismer-popular-web-designs/templates/minimax.md +270 -0
  490. package/built-in-skills/prismer-popular-web-designs/templates/mintlify.md +339 -0
  491. package/built-in-skills/prismer-popular-web-designs/templates/miro.md +121 -0
  492. package/built-in-skills/prismer-popular-web-designs/templates/mistral.ai.md +274 -0
  493. package/built-in-skills/prismer-popular-web-designs/templates/mongodb.md +279 -0
  494. package/built-in-skills/prismer-popular-web-designs/templates/notion.md +322 -0
  495. package/built-in-skills/prismer-popular-web-designs/templates/nvidia.md +306 -0
  496. package/built-in-skills/prismer-popular-web-designs/templates/ollama.md +280 -0
  497. package/built-in-skills/prismer-popular-web-designs/templates/opencode.ai.md +294 -0
  498. package/built-in-skills/prismer-popular-web-designs/templates/pinterest.md +243 -0
  499. package/built-in-skills/prismer-popular-web-designs/templates/posthog.md +269 -0
  500. package/built-in-skills/prismer-popular-web-designs/templates/raycast.md +281 -0
  501. package/built-in-skills/prismer-popular-web-designs/templates/replicate.md +274 -0
  502. package/built-in-skills/prismer-popular-web-designs/templates/resend.md +316 -0
  503. package/built-in-skills/prismer-popular-web-designs/templates/revolut.md +198 -0
  504. package/built-in-skills/prismer-popular-web-designs/templates/runwayml.md +257 -0
  505. package/built-in-skills/prismer-popular-web-designs/templates/sanity.md +370 -0
  506. package/built-in-skills/prismer-popular-web-designs/templates/sentry.md +275 -0
  507. package/built-in-skills/prismer-popular-web-designs/templates/spacex.md +207 -0
  508. package/built-in-skills/prismer-popular-web-designs/templates/spotify.md +259 -0
  509. package/built-in-skills/prismer-popular-web-designs/templates/stripe.md +335 -0
  510. package/built-in-skills/prismer-popular-web-designs/templates/supabase.md +268 -0
  511. package/built-in-skills/prismer-popular-web-designs/templates/superhuman.md +265 -0
  512. package/built-in-skills/prismer-popular-web-designs/templates/together.ai.md +276 -0
  513. package/built-in-skills/prismer-popular-web-designs/templates/uber.md +308 -0
  514. package/built-in-skills/prismer-popular-web-designs/templates/vercel.md +323 -0
  515. package/built-in-skills/prismer-popular-web-designs/templates/voltagent.md +336 -0
  516. package/built-in-skills/prismer-popular-web-designs/templates/warp.md +266 -0
  517. package/built-in-skills/prismer-popular-web-designs/templates/webflow.md +105 -0
  518. package/built-in-skills/prismer-popular-web-designs/templates/wise.md +186 -0
  519. package/built-in-skills/prismer-popular-web-designs/templates/x.ai.md +270 -0
  520. package/built-in-skills/prismer-popular-web-designs/templates/zapier.md +341 -0
  521. package/built-in-skills/prismer-product-price-monitor/LICENSE +21 -0
  522. package/built-in-skills/prismer-product-price-monitor/NOTICE.md +11 -0
  523. package/built-in-skills/prismer-product-price-monitor/SKILL.md +97 -0
  524. package/built-in-skills/prismer-product-price-monitor/scripts/watch_state.py +116 -0
  525. package/built-in-skills/prismer-python-debugpy/LICENSE +21 -0
  526. package/built-in-skills/prismer-python-debugpy/NOTICE.md +17 -0
  527. package/built-in-skills/prismer-python-debugpy/SKILL.md +377 -0
  528. package/built-in-skills/prismer-python-debugpy/scripts/dap_client.py +68 -0
  529. package/built-in-skills/prismer-songsee/LICENSE +21 -0
  530. package/built-in-skills/prismer-songsee/LICENSE.hermes +21 -0
  531. package/built-in-skills/prismer-songsee/PROVENANCE.md +7 -0
  532. package/built-in-skills/prismer-songsee/SKILL.md +91 -0
  533. package/built-in-skills/prismer-songwriting-and-ai-music/LICENSE +21 -0
  534. package/built-in-skills/prismer-songwriting-and-ai-music/LICENSE.hermes +21 -0
  535. package/built-in-skills/prismer-songwriting-and-ai-music/PROVENANCE.md +7 -0
  536. package/built-in-skills/prismer-songwriting-and-ai-music/SKILL.md +317 -0
  537. package/built-in-skills/prismer-spike/LICENSE +21 -0
  538. package/built-in-skills/prismer-spike/LICENSE.gsd +21 -0
  539. package/built-in-skills/prismer-spike/NOTICE.md +17 -0
  540. package/built-in-skills/prismer-spike/SKILL.md +212 -0
  541. package/built-in-skills/prismer-teams-meeting-pipeline/LICENSE +21 -0
  542. package/built-in-skills/prismer-teams-meeting-pipeline/NOTICE.md +11 -0
  543. package/built-in-skills/prismer-teams-meeting-pipeline/SKILL.md +156 -0
  544. package/built-in-skills/prismer-xurl/LICENSE +21 -0
  545. package/built-in-skills/prismer-xurl/LICENSE.hermes +21 -0
  546. package/built-in-skills/prismer-xurl/PROVENANCE.md +7 -0
  547. package/built-in-skills/prismer-xurl/SKILL.md +444 -0
  548. package/built-in-skills/prismer-xurl/provenance/category-DESCRIPTION.md +3 -0
  549. package/built-in-skills/prismer-youtube-content/LICENSE +21 -0
  550. package/built-in-skills/prismer-youtube-content/LICENSE.hermes +21 -0
  551. package/built-in-skills/prismer-youtube-content/PROVENANCE.md +7 -0
  552. package/built-in-skills/prismer-youtube-content/SKILL.md +86 -0
  553. package/built-in-skills/prismer-youtube-content/provenance/category-DESCRIPTION.md +3 -0
  554. package/built-in-skills/prismer-youtube-content/references/output-formats.md +56 -0
  555. package/built-in-skills/prismer-youtube-content/scripts/fetch_transcript.py +146 -0
  556. package/built-in-skills/proactivity/SKILL.md +84 -0
  557. package/built-in-skills/remotion/SKILL.md +431 -0
  558. package/built-in-skills/research-arxiv/LICENSE +21 -0
  559. package/built-in-skills/research-arxiv/NOTICE.md +4 -0
  560. package/built-in-skills/research-arxiv/SKILL.md +263 -0
  561. package/built-in-skills/research-arxiv/scripts/search_arxiv.py +111 -0
  562. package/built-in-skills/role-builder/SKILL.md +209 -0
  563. package/built-in-skills/role-builder/scripts/author-role.mjs +350 -0
  564. package/built-in-skills/role-builder/scripts/ingest-role.mjs +121 -0
  565. package/built-in-skills/role-builder/scripts/instantiate-and-run.mjs +304 -0
  566. package/built-in-skills/role-builder/scripts/operation-harness.mjs +269 -0
  567. package/built-in-skills/skill-creator/LICENSE.prismer +21 -0
  568. package/built-in-skills/skill-creator/NOTICE.md +18 -0
  569. package/built-in-skills/skill-creator/SKILL.md +182 -421
  570. package/built-in-skills/skill-creator/eval-viewer/generate_review.py +20 -31
  571. package/built-in-skills/skill-creator/eval-viewer/viewer.html +35 -23
  572. package/built-in-skills/skill-creator/references/external-library-import.md +110 -0
  573. package/built-in-skills/skill-creator/references/hermes-agent-skill-authoring/GUIDE.md +220 -0
  574. package/built-in-skills/skill-creator/references/hermes-agent-skill-authoring/LICENSE +21 -0
  575. package/built-in-skills/skill-creator/references/skill-authoring/GUIDE.md +134 -0
  576. package/built-in-skills/{skill-authoring/skill.json → skill-creator/references/skill-authoring/draft-contract.json} +3 -3
  577. package/built-in-skills/skill-creator/references/skill-builder/GUIDE.md +167 -0
  578. package/built-in-skills/skill-creator/references/skill-builder/scripts/ingest.mjs +93 -0
  579. package/built-in-skills/skill-creator/scripts/aggregate_benchmark.py +3 -2
  580. package/built-in-skills/skill-creator/scripts/import-library.mjs +498 -0
  581. package/built-in-skills/skill-creator/scripts/improve_description.py +14 -16
  582. package/built-in-skills/skill-creator/scripts/package_skill.py +16 -9
  583. package/built-in-skills/skill-creator/scripts/quick_validate.py +22 -5
  584. package/built-in-skills/skill-creator/scripts/run_eval.py +63 -144
  585. package/built-in-skills/skill-creator/scripts/run_loop.py +24 -16
  586. package/built-in-skills/slack-gif-creator/SKILL.md +20 -0
  587. package/built-in-skills/slack-gif-creator/core/gif_builder.py +13 -2
  588. package/built-in-skills/slack-gif-creator/core/validators.py +17 -7
  589. package/built-in-skills/tasks/SKILL.md +39 -24
  590. package/built-in-skills/tdd/LICENSE +21 -0
  591. package/built-in-skills/tdd/SKILL.md +117 -0
  592. package/built-in-skills/tdd/mocking.md +59 -0
  593. package/built-in-skills/tdd/refactoring.md +10 -0
  594. package/built-in-skills/tdd/references/test-driven-development/GUIDE.md +356 -0
  595. package/built-in-skills/tdd/references/test-driven-development/LICENSE +21 -0
  596. package/built-in-skills/tdd/references/test-driven-development/LICENSE.superpowers +21 -0
  597. package/built-in-skills/tdd/references/test-driven-development/NOTICE.md +37 -0
  598. package/built-in-skills/tdd/tests.md +61 -0
  599. package/built-in-skills/team/SKILL.md +3 -2
  600. package/built-in-skills/web-artifacts-builder/SKILL.md +4 -3
  601. package/built-in-skills/web-artifacts-builder/scripts/bundle-artifact.sh +9 -7
  602. package/built-in-skills/web-artifacts-builder/scripts/init-artifact.sh +28 -55
  603. package/built-in-skills/webapp-qa/LICENSE +21 -0
  604. package/built-in-skills/webapp-qa/NOTICE.md +37 -0
  605. package/built-in-skills/webapp-qa/SKILL.md +41 -0
  606. package/built-in-skills/webapp-qa/references/dogfood/GUIDE.md +161 -0
  607. package/built-in-skills/webapp-qa/references/issue-taxonomy.md +109 -0
  608. package/built-in-skills/webapp-qa/templates/dogfood-report-template.md +86 -0
  609. package/built-in-skills/webapp-testing/SKILL.md +10 -2
  610. package/built-in-skills/webapp-testing/examples/console_logging.py +10 -4
  611. package/built-in-skills/webapp-testing/examples/element_discovery.py +11 -4
  612. package/built-in-skills/webapp-testing/examples/static_html_automation.py +14 -9
  613. package/built-in-skills/webapp-testing/scripts/with_server.py +34 -10
  614. package/built-in-skills/wechat-pay/SKILL.md +59 -0
  615. package/built-in-skills/weekly-review/LICENSE +21 -0
  616. package/built-in-skills/weekly-review/NOTICE.md +21 -0
  617. package/built-in-skills/weekly-review/SKILL.md +49 -0
  618. package/components/eaas-pi-components.manifest.json +37 -0
  619. package/dist/cli.cjs +75799 -20210
  620. package/dist/cli.js +75900 -20248
  621. package/dist/index.cjs +76159 -20082
  622. package/dist/index.d.cts +4766 -766
  623. package/dist/index.d.ts +4766 -766
  624. package/dist/index.js +76040 -19960
  625. package/package.json +42 -6
  626. package/plugins/memory/prismer/__init__.py +1215 -0
  627. package/plugins/memory/prismer/plugin.yaml +8 -0
  628. package/plugins/memory/prismer/tool-schemas.generated.json +257 -0
  629. package/plugins/tools/prismer-recall/__init__.py +282 -0
  630. package/plugins/tools/prismer-recall/plugin.yaml +15 -0
  631. package/built-in-skills/memory-curation/SKILL.md +0 -135
  632. package/built-in-skills/skill-authoring/SKILL.md +0 -124
  633. package/built-in-skills/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
@@ -0,0 +1,720 @@
1
+ #!/usr/bin/env python3
2
+ """Citation ledger for grounded answers and documents.
3
+
4
+ Owns the ``url -> [n]`` mapping used by the ``grounded-citations`` skill.
5
+ Ids are assigned at retrieval time and never change, so a draft's ``[3]``
6
+ always resolves to the same page. The model only ever emits integers the
7
+ ledger handed it, which is what makes the citations verifiable.
8
+
9
+ Subcommands
10
+ -----------
11
+ reset start a clean ledger
12
+ add URL [URL ...] register source(s), print their ids
13
+ ingest FILE|- register every url found in JSON tool output
14
+ quote ID --text T --from FILE|- attach verbatim supporting evidence to a source
15
+ list show the ledger
16
+ render render a Sources block
17
+ verify DRAFT check a draft's citations against the ledger
18
+
19
+ Fact-checking is evidence-backed citation: ``quote`` only accepts text that
20
+ literally appears in the fetched page text you point it at, ``verify
21
+ --evidence`` requires every cited source to carry at least one such quote, and
22
+ ``render --style evidence`` prints the quotes under each source so the reader
23
+ can check the chain themselves. Claims from model knowledge are declared with
24
+ an ``[unverified]`` marker rather than silently blended in.
25
+
26
+ Ledger path resolution (first wins):
27
+ --ledger PATH
28
+ $PRISMER_SCRATCH_DIR/citations.json (dispatch-isolated scratch only)
29
+ Otherwise fail rather than share a profile-global mutable ledger.
30
+ """
31
+
32
+ from __future__ import annotations
33
+
34
+ import argparse
35
+ import json
36
+ import os
37
+ import re
38
+ import sys
39
+ import tempfile
40
+ import time
41
+ from pathlib import Path
42
+ from typing import Any, Iterable
43
+
44
+ SCHEMA_VERSION = 1
45
+
46
+ # A citation marker in prose: [12]. Markdown links ([text](url)) and
47
+ # reference-style labels are excluded by requiring digits only and no
48
+ # following "(" or ":".
49
+ _CITE_RE = re.compile(r"\[(\d{1,4})\](?![(:])")
50
+ _SOURCES_HEADER_RE = re.compile(r"^\s*(?:#{1,6}\s*)?(?:\*\*)?sources:?(?:\*\*)?\s*$", re.IGNORECASE)
51
+ _SOURCE_LINE_RE = re.compile(r"^ {0,3}\[(\d{1,4})\][ \t]+(https?://[^\s\"'<>)\]}]+)(?:[ \t]+.*)?$")
52
+ _URL_IN_TEXT_RE = re.compile(r"https?://[^\s\"'<>)\]}]+")
53
+ _FENCE_RE = re.compile(r"^ {0,3}(`{3,}|~{3,})(.*)$")
54
+ _CJK_RE = re.compile(r"[\u3400-\u9fff\u3040-\u30ff\uac00-\ud7af]")
55
+ # Explicit declaration that a claim comes from model knowledge, not a source.
56
+ _UNVERIFIED_RE = re.compile(r"\[unverified\]", re.IGNORECASE)
57
+
58
+
59
+ # ---------------------------------------------------------------------------
60
+ # Ledger I/O
61
+ # ---------------------------------------------------------------------------
62
+
63
+
64
+ def resolve_ledger_path(explicit: str | None = None) -> Path:
65
+ if explicit:
66
+ return Path(explicit).expanduser()
67
+ scratch = os.environ.get("PRISMER_SCRATCH_DIR", "").strip()
68
+ if scratch and Path(scratch).is_absolute():
69
+ return Path(scratch) / "citations.json"
70
+ raise SystemExit("Pass --ledger with a task-specific path; no shared ledger default is allowed")
71
+
72
+
73
+ def normalize_url(url: str) -> str:
74
+ """Canonicalize a URL for ledger identity.
75
+
76
+ Strips the fragment and a trailing slash so ``/page``, ``/page/`` and
77
+ ``/page#section`` are one source. Query strings are significant and are
78
+ kept — they usually select different content.
79
+ """
80
+ u = (url or "").strip()
81
+ if "#" in u:
82
+ u = u.split("#", 1)[0]
83
+ stripped = u.rstrip("/")
84
+ return stripped or u
85
+
86
+
87
+ def load_ledger(path: Path) -> dict[str, Any]:
88
+ if not path.exists():
89
+ return {"version": SCHEMA_VERSION, "sources": []}
90
+ try:
91
+ data = json.loads(path.read_text(encoding="utf-8"))
92
+ except (json.JSONDecodeError, OSError) as exc:
93
+ raise SystemExit(f"error: ledger at {path} is unreadable ({exc}); run `reset` to start over")
94
+ if not isinstance(data, dict) or not isinstance(data.get("sources"), list):
95
+ raise SystemExit(f"error: ledger at {path} has an unexpected shape; run `reset`")
96
+ return data
97
+
98
+
99
+ def save_ledger(path: Path, data: dict[str, Any]) -> None:
100
+ path.parent.mkdir(parents=True, exist_ok=True)
101
+ tmp = path.with_suffix(path.suffix + f".tmp{os.getpid()}")
102
+ tmp.write_text(json.dumps(data, indent=2, ensure_ascii=False) + "\n", encoding="utf-8")
103
+ os.replace(tmp, path)
104
+
105
+
106
+ class _LedgerLock:
107
+ """Exclusive writer lock; contention times out without stealing ownership.
108
+
109
+ Parallel subagents can share one ledger via --ledger; without a lock two
110
+ concurrent ``add`` calls can assign the same id. A stale lock requires
111
+ explicit recovery after confirming no writer owns it.
112
+ """
113
+
114
+ def __init__(self, path: Path, timeout: float = 5.0) -> None:
115
+ self.lock_path = path.with_suffix(path.suffix + ".lock")
116
+ self.timeout = timeout
117
+ self.fd: int | None = None
118
+
119
+ def __enter__(self) -> "_LedgerLock":
120
+ self.lock_path.parent.mkdir(parents=True, exist_ok=True)
121
+ deadline = time.monotonic() + self.timeout
122
+ while True:
123
+ try:
124
+ self.fd = os.open(str(self.lock_path), os.O_CREAT | os.O_EXCL | os.O_WRONLY, 0o600)
125
+ return self
126
+ except FileExistsError:
127
+ if time.monotonic() >= deadline:
128
+ raise TimeoutError(f"ledger is locked: {self.lock_path}")
129
+ time.sleep(0.05)
130
+
131
+ def __exit__(self, *_exc: object) -> None:
132
+ if self.fd is not None:
133
+ try:
134
+ owned = os.fstat(self.fd)
135
+ current = self.lock_path.stat(follow_symlinks=False)
136
+ if (owned.st_dev, owned.st_ino) == (current.st_dev, current.st_ino):
137
+ self.lock_path.unlink()
138
+ except FileNotFoundError:
139
+ pass
140
+ finally:
141
+ os.close(self.fd)
142
+ self.fd = None
143
+
144
+
145
+ # ---------------------------------------------------------------------------
146
+ # Core operations
147
+ # ---------------------------------------------------------------------------
148
+
149
+
150
+ def _by_url(sources: list[dict[str, Any]]) -> dict[str, dict[str, Any]]:
151
+ return {s["url"]: s for s in sources}
152
+
153
+
154
+ def add_sources(
155
+ path: Path,
156
+ urls: Iterable[str],
157
+ title: str | None = None,
158
+ accessed: str | None = None,
159
+ ) -> list[dict[str, Any]]:
160
+ """Register urls, returning their ledger entries (existing or new)."""
161
+ urls = [u for u in (str(u).strip() for u in urls) if u]
162
+ if not urls:
163
+ return []
164
+ with _LedgerLock(path):
165
+ data = load_ledger(path)
166
+ sources = data["sources"]
167
+ index = _by_url(sources)
168
+ out: list[dict[str, Any]] = []
169
+ changed = False
170
+ for raw in urls:
171
+ key = normalize_url(raw)
172
+ existing = index.get(key)
173
+ if existing is not None:
174
+ if title and not existing.get("title"):
175
+ existing["title"] = title
176
+ changed = True
177
+ out.append(existing)
178
+ continue
179
+ entry = {
180
+ "id": len(sources) + 1,
181
+ "url": key,
182
+ "title": (title or "").strip(),
183
+ "accessed": accessed or time.strftime("%Y-%m-%d"),
184
+ }
185
+ sources.append(entry)
186
+ index[key] = entry
187
+ out.append(entry)
188
+ changed = True
189
+ if changed:
190
+ save_ledger(path, data)
191
+ return out
192
+
193
+
194
+ def urls_from_json(payload: Any) -> list[tuple[str, str]]:
195
+ """Walk arbitrary JSON tool output collecting (url, title) pairs.
196
+
197
+ Handles web_search (``data.web[]``), web_extract (``results[]``) and any
198
+ other nesting, in document order, deduped.
199
+ """
200
+ found: list[tuple[str, str]] = []
201
+ seen: set[str] = set()
202
+
203
+ def walk(node: Any) -> None:
204
+ if isinstance(node, dict):
205
+ url = node.get("url") or node.get("link") or node.get("source_url")
206
+ if isinstance(url, str) and url.startswith(("http://", "https://")):
207
+ key = normalize_url(url)
208
+ if key not in seen:
209
+ seen.add(key)
210
+ raw_title = node.get("title") or node.get("name") or ""
211
+ found.append((url, raw_title if isinstance(raw_title, str) else ""))
212
+ for value in node.values():
213
+ walk(value)
214
+ elif isinstance(node, list):
215
+ for item in node:
216
+ walk(item)
217
+
218
+ walk(payload)
219
+ return found
220
+
221
+
222
+ # ---------------------------------------------------------------------------
223
+ # Evidence quotes (fact-checking)
224
+ # ---------------------------------------------------------------------------
225
+
226
+
227
+ def _normalize_ws(text: str) -> str:
228
+ """Collapse all whitespace runs to single spaces for verbatim matching."""
229
+ return " ".join((text or "").split())
230
+
231
+
232
+ # Markdown artifacts that retrieval tools inject into otherwise-identical prose.
233
+ # ``web_extract`` returns markdown, so the most citation-worthy sentences are
234
+ # exactly the ones carrying inline links and emphasis around terms:
235
+ # "including _[ERAP1](https://…/erap1/)_, _[IL1A](…)_, have also been…"
236
+ # reads identically to the page a human sees. Matching has to see through that
237
+ # markup, or the skill pushes the agent toward weaker evidence fragments.
238
+ _MD_LINK_RE = re.compile(r"\[([^\]]*)\]\((?:[^()\s]|\([^()]*\))*\)")
239
+ _MD_NOISE_RE = re.compile(r"[*_`~]|\\(?=[^\w\s])")
240
+
241
+
242
+ def _match_key(text: str) -> str:
243
+ """Canonicalize text for verbatim comparison.
244
+
245
+ Whitespace-, case-, and markdown-insensitive: inline links collapse to
246
+ their label, emphasis/code markers and backslash escapes are dropped. The
247
+ stored quote keeps whatever the caller passed, so the rendered evidence
248
+ block shows clean prose rather than extractor artifacts.
249
+ """
250
+ collapsed = _MD_LINK_RE.sub(r"\1", text or "")
251
+ return _normalize_ws(_MD_NOISE_RE.sub("", collapsed)).casefold()
252
+
253
+
254
+ def quote_in_evidence(quote: str, evidence: str) -> bool:
255
+ """True when ``quote`` appears verbatim in the fetched ``evidence`` text,
256
+ ignoring whitespace, case, and markdown markup on either side."""
257
+ q = _match_key(quote)
258
+ return bool(q) and q in _match_key(evidence)
259
+
260
+
261
+ def attach_quote(path: Path, source_id: int, quote: str, evidence: str) -> dict[str, Any]:
262
+ """Attach a verbatim quote to a ledger entry after checking it against
263
+ the evidence text. Raises SystemExit on unknown id or non-verbatim text —
264
+ a quote the page does not contain is exactly the fabrication this guards
265
+ against."""
266
+ quote = (quote or "").strip()
267
+ if len(_normalize_ws(quote).split()) < 3 and len(_CJK_RE.findall(quote)) < 6:
268
+ raise SystemExit("error: quote too short — use at least 3 words or 6 CJK characters")
269
+ if not quote_in_evidence(quote, evidence):
270
+ raise SystemExit(
271
+ "error: quote not found verbatim in the evidence text — "
272
+ "copy the exact wording from the fetched page, do not paraphrase"
273
+ )
274
+ with _LedgerLock(path):
275
+ data = load_ledger(path)
276
+ entry = next((s for s in data["sources"] if s["id"] == source_id), None)
277
+ if entry is None:
278
+ raise SystemExit(f"error: no source [{source_id}] in the ledger")
279
+ quotes = entry.setdefault("quotes", [])
280
+ norm = _match_key(quote)
281
+ if not any(_match_key(q.get("text", "")) == norm for q in quotes):
282
+ quotes.append({"text": quote, "added": time.strftime("%Y-%m-%d")})
283
+ save_ledger(path, data)
284
+ return entry
285
+
286
+
287
+ def render_sources(
288
+ sources: list[dict[str, Any]],
289
+ style: str = "markdown",
290
+ only: set[int] | None = None,
291
+ ) -> str:
292
+ picked = [s for s in sources if only is None or s["id"] in only]
293
+ picked.sort(key=lambda s: s["id"])
294
+ if not picked:
295
+ return ""
296
+ lines: list[str] = []
297
+ if style == "bibtex":
298
+ for s in picked:
299
+ key = f"source{s['id']}"
300
+ title = s.get("title") or s["url"]
301
+ lines.append(
302
+ "@misc{%s,\n title = {%s},\n howpublished = {\\url{%s}},\n note = {Accessed %s}\n}"
303
+ % (key, _bibtex_escape(title), _bibtex_escape(s["url"]), _bibtex_escape(s.get("accessed", "")))
304
+ )
305
+ return "\n".join(lines)
306
+ if style == "footnotes":
307
+ for s in picked:
308
+ title = s.get("title")
309
+ suffix = f" — {title}" if title else ""
310
+ lines.append(f"[^{s['id']}]: {s['url']}{suffix}")
311
+ return "\n".join(lines)
312
+ header = "Sources:" if style == "plain" else "## Sources"
313
+ lines.append(header)
314
+ if style != "plain":
315
+ lines.append("")
316
+ for s in picked:
317
+ title = s.get("title")
318
+ suffix = f" — {title}" if title else ""
319
+ lines.append(f"[{s['id']}] {s['url']}{suffix}")
320
+ if style == "evidence":
321
+ for q in s.get("quotes", []):
322
+ lines.append(f' > "{q.get("text", "")}"')
323
+ return "\n".join(lines)
324
+
325
+
326
+ # ---------------------------------------------------------------------------
327
+ # Verification
328
+ # ---------------------------------------------------------------------------
329
+
330
+
331
+ def _bibtex_escape(value: str) -> str:
332
+ escapes = {"\\": r"\textbackslash{}", "{": r"\{", "}": r"\}",
333
+ "%": r"\%", "&": r"\&", "#": r"\#", "_": r"\_",
334
+ "$": r"\$", "~": r"\textasciitilde{}", "^": r"\textasciicircum{}"}
335
+ return "".join(escapes.get(char, char) for char in str(value).replace("\n", " "))
336
+
337
+
338
+ def _prose_lines(lines: list[str], include_indented: bool = False) -> list[tuple[int, str]]:
339
+ result = []
340
+ fence = ""
341
+ for index, line in enumerate(lines):
342
+ match = _FENCE_RE.match(line)
343
+ if fence:
344
+ if match and match[1][0] == fence[0] and len(match[1]) >= len(fence) and not match[2].strip():
345
+ fence = ""
346
+ continue
347
+ if match:
348
+ fence = match[1]
349
+ elif include_indented or not line.startswith((" ", "\t")):
350
+ result.append((index, line))
351
+ return result
352
+
353
+
354
+ def _sources_tail(text: str) -> tuple[int | None, dict[int, str]]:
355
+ """Only an unambiguous terminal bibliography may be replaced."""
356
+ lines = text.splitlines()
357
+ headers = [i for i, line in _prose_lines(lines) if _SOURCES_HEADER_RE.match(line)]
358
+ if len(headers) != 1:
359
+ return None, {}
360
+ index = headers[0]
361
+ listed = {}
362
+ for line in lines[index + 1:]:
363
+ if not line.strip():
364
+ continue
365
+ match = _SOURCE_LINE_RE.match(line)
366
+ if match:
367
+ sid = int(match[1])
368
+ if sid in listed:
369
+ return None, {}
370
+ listed[sid] = match[2]
371
+ elif listed and line.startswith(" > "):
372
+ continue
373
+ else:
374
+ return None, {}
375
+ return (index, listed) if listed else (None, {})
376
+
377
+
378
+ def _split_draft(text: str) -> tuple[str, dict[int, str]]:
379
+ index, listed = _sources_tail(text)
380
+ lines = text.splitlines()
381
+ return "\n".join(line for _, line in _prose_lines(lines[:index])), listed
382
+
383
+
384
+ def _strip_sources_block(text: str) -> str:
385
+ """Return the draft with its trailing Sources block removed.
386
+
387
+ Ambiguous, non-terminal and fenced headers are preserved verbatim.
388
+ """
389
+ header_idx, _ = _sources_tail(text)
390
+ if header_idx is None:
391
+ return text
392
+ return "\n".join(text.splitlines()[:header_idx])
393
+
394
+
395
+ def _sentences(prose: str) -> list[str]:
396
+ """Rough sentence split over prose lines, skipping headings and tables."""
397
+ out: list[str] = []
398
+ for line in prose.splitlines():
399
+ stripped = line.strip()
400
+ if not stripped or stripped.startswith("#") or stripped.startswith("|"):
401
+ continue
402
+ if stripped.startswith(">"):
403
+ stripped = stripped.lstrip("> ").strip()
404
+ for part in re.findall(r".+?(?:[.!?。!?](?:\[\d{1,4}\]|\[unverified\])*|$)", stripped):
405
+ part = part.strip()
406
+ if len(part.split()) >= 4 or len(_CJK_RE.findall(part)) >= 4:
407
+ out.append(part)
408
+ return out
409
+
410
+
411
+ def verify_draft(
412
+ draft_path: Path,
413
+ sources: list[dict[str, Any]],
414
+ strict: bool = False,
415
+ min_coverage: float | None = None,
416
+ require_evidence: bool = False,
417
+ ) -> tuple[int, list[str], list[str]]:
418
+ """Return (exit_code, errors, warnings)."""
419
+ text = draft_path.read_text(encoding="utf-8")
420
+ prose, listed = _split_draft(text)
421
+ by_id = {s["id"]: s for s in sources}
422
+
423
+ errors: list[str] = []
424
+ warnings: list[str] = []
425
+ # Containers (quotes/lists) can define document-wide Markdown references.
426
+ # Reject numeric definitions conservatively, while ignoring fenced examples.
427
+ definitions = "\n".join(line for _, line in _prose_lines(text.splitlines(), include_indented=True))
428
+ if re.search(r"\[\s*\d{1,4}\s*\]\s*:", definitions):
429
+ errors.append("numeric reference definition can redirect a citation; use plain [n] citations and Sources entries")
430
+ if re.search(r"\[\^\w+\]|\\cite\w*\{", prose):
431
+ errors.append("unsupported citation format: verify a numeric [n] Markdown draft before export")
432
+ if min_coverage is not None and not 0 <= min_coverage <= 1:
433
+ errors.append("min-coverage must be between 0 and 1")
434
+
435
+ cited = [int(m) for m in _CITE_RE.findall(prose)]
436
+ cited_set = set(cited)
437
+
438
+ unknown = sorted(i for i in cited_set if i not in by_id)
439
+ if unknown:
440
+ errors.append(
441
+ "citations not in the ledger (hallucinated or renumbered): "
442
+ + ", ".join(f"[{i}]" for i in unknown)
443
+ )
444
+
445
+ if cited_set and not listed:
446
+ errors.append("draft cites sources but has no `Sources:` block — run `render --cited-in`")
447
+
448
+ missing_from_block = sorted(cited_set - set(listed)) if listed else []
449
+ if missing_from_block:
450
+ errors.append(
451
+ "cited but absent from the Sources block: "
452
+ + ", ".join(f"[{i}]" for i in missing_from_block)
453
+ )
454
+
455
+ for sid, url in sorted(listed.items()):
456
+ entry = by_id.get(sid)
457
+ if entry is None:
458
+ errors.append(f"Sources block lists [{sid}], which is not in the ledger")
459
+ continue
460
+ if normalize_url(url) != entry["url"]:
461
+ errors.append(
462
+ f"Sources block URL for [{sid}] does not match the ledger "
463
+ f"(block: {url} / ledger: {entry['url']}) — re-run `render`"
464
+ )
465
+
466
+ extra_in_block = sorted(set(listed) - cited_set)
467
+ if extra_in_block:
468
+ warnings.append(
469
+ "listed in Sources but never cited inline: "
470
+ + ", ".join(f"[{i}]" for i in extra_in_block)
471
+ )
472
+
473
+ registered_uncited = sorted(set(by_id) - cited_set)
474
+ if registered_uncited:
475
+ warnings.append(
476
+ "registered in the ledger but not cited in this draft: "
477
+ + ", ".join(f"[{i}]" for i in registered_uncited)
478
+ )
479
+
480
+ sentences = _sentences(prose)
481
+ cited_sentences = [s for s in sentences if _CITE_RE.search(s)]
482
+ unverified_sentences = [s for s in sentences if _UNVERIFIED_RE.search(s)]
483
+ covered = [s for s in sentences if _CITE_RE.search(s) or _UNVERIFIED_RE.search(s)]
484
+ coverage = (len(covered) / len(sentences)) if sentences else 0.0
485
+ if min_coverage is not None and not sentences:
486
+ errors.append("citation coverage cannot be measured: no prose sentences")
487
+ if min_coverage is not None and sentences and coverage < min_coverage:
488
+ errors.append(
489
+ f"citation coverage {coverage:.0%} is below the required {min_coverage:.0%} "
490
+ f"({len(covered)}/{len(sentences)} sentences cited or marked [unverified])"
491
+ )
492
+
493
+ if require_evidence:
494
+ unevidenced = sorted(
495
+ i for i in cited_set if i in by_id and not by_id[i].get("quotes")
496
+ )
497
+ if unevidenced:
498
+ errors.append(
499
+ "cited sources carry no verbatim evidence quote (run `quote` with the "
500
+ "fetched page text): " + ", ".join(f"[{i}]" for i in unevidenced)
501
+ )
502
+
503
+ over_cited = [s for s in sentences if len(_CITE_RE.findall(s)) > 3]
504
+ if over_cited:
505
+ warnings.append(f"{len(over_cited)} sentence(s) carry more than 3 citations")
506
+
507
+ code = 1 if errors else (1 if (strict and warnings) else 0)
508
+ quoted = sum(1 for s in sources if s.get("quotes"))
509
+ stats = (
510
+ f"{len(sentences)} prose sentence(s), {len(covered)} with declared provenance "
511
+ f"({coverage:.0%}) — {len(cited_sentences)} cited, "
512
+ f"{len(unverified_sentences)} marked [unverified] (a sentence may be both); "
513
+ f"{len(cited_set)} distinct source(s) cited, "
514
+ f"{len(by_id)} in ledger ({quoted} with evidence quotes)"
515
+ )
516
+ warnings.insert(0, f"stats: {stats}")
517
+ return code, errors, warnings
518
+
519
+
520
+ # ---------------------------------------------------------------------------
521
+ # CLI
522
+ # ---------------------------------------------------------------------------
523
+
524
+
525
+ def _parse_only(spec: str | None) -> set[int] | None:
526
+ if not spec:
527
+ return None
528
+ out: set[int] = set()
529
+ for chunk in spec.replace(" ", "").split(","):
530
+ if not chunk:
531
+ continue
532
+ if "-" in chunk:
533
+ lo, _, hi = chunk.partition("-")
534
+ out.update(range(int(lo), int(hi) + 1))
535
+ else:
536
+ out.add(int(chunk))
537
+ return out
538
+
539
+
540
+ def main(argv: list[str] | None = None) -> int:
541
+ parser = argparse.ArgumentParser(
542
+ prog="sources.py", description="Citation ledger for grounded answers and documents."
543
+ )
544
+ parser.add_argument("--ledger", help="ledger file path (overrides env / default)")
545
+ sub = parser.add_subparsers(dest="cmd", required=True)
546
+
547
+ sub.add_parser("reset", help="start a clean ledger")
548
+
549
+ p_add = sub.add_parser("add", help="register source url(s), print their ids")
550
+ p_add.add_argument("urls", nargs="+")
551
+ p_add.add_argument("--title", help="title for the source (single-url calls)")
552
+ p_add.add_argument("--accessed", help="access date (default: today)")
553
+ p_add.add_argument("--json", action="store_true", help="emit JSON instead of ids")
554
+
555
+ p_ing = sub.add_parser("ingest", help="register every url in JSON tool output")
556
+ p_ing.add_argument("file", help="JSON file, or - for stdin")
557
+
558
+ p_q = sub.add_parser("quote", help="attach verbatim supporting evidence to a source")
559
+ p_q.add_argument("id", type=int, help="ledger id of the source the quote supports")
560
+ p_q.add_argument("--text", required=True, help="the exact quote, copied from the page")
561
+ p_q.add_argument(
562
+ "--from",
563
+ dest="evidence",
564
+ required=True,
565
+ help="file with the fetched page text (or - for stdin) the quote must appear in",
566
+ )
567
+
568
+ p_list = sub.add_parser("list", help="show the ledger")
569
+ p_list.add_argument("--json", action="store_true")
570
+
571
+ p_render = sub.add_parser("render", help="render a Sources block")
572
+ p_render.add_argument(
573
+ "--style", default="markdown", choices=["markdown", "plain", "footnotes", "bibtex", "evidence"]
574
+ )
575
+ p_render.add_argument("--only", help="ids to include, e.g. 1,3,5-7")
576
+ p_render.add_argument("--cited-in", help="include only ids cited in this draft file")
577
+ p_render.add_argument(
578
+ "--replace-in",
579
+ help="rewrite this draft's Sources block in place (implies --cited-in on it)",
580
+ )
581
+
582
+ p_ver = sub.add_parser("verify", help="check a draft's citations against the ledger")
583
+ p_ver.add_argument("draft")
584
+ p_ver.add_argument("--strict", action="store_true", help="treat warnings as failures")
585
+ p_ver.add_argument("--min-coverage", type=float, help="required cited-sentence share, e.g. 0.5")
586
+ p_ver.add_argument(
587
+ "--evidence",
588
+ action="store_true",
589
+ help="require every cited source to carry at least one verbatim quote",
590
+ )
591
+
592
+ args = parser.parse_args(argv)
593
+ path = resolve_ledger_path(args.ledger)
594
+
595
+ if args.cmd == "reset":
596
+ with _LedgerLock(path):
597
+ save_ledger(path, {"version": SCHEMA_VERSION, "sources": []})
598
+ print(f"ledger reset: {path}")
599
+ return 0
600
+
601
+ if args.cmd == "add":
602
+ title = args.title if len(args.urls) == 1 else None
603
+ entries = add_sources(path, args.urls, title=title, accessed=args.accessed)
604
+ if args.json:
605
+ print(json.dumps(entries, indent=2, ensure_ascii=False))
606
+ else:
607
+ for e in entries:
608
+ print(f"[{e['id']}] {e['url']}")
609
+ return 0
610
+
611
+ if args.cmd == "ingest":
612
+ raw = sys.stdin.read() if args.file == "-" else Path(args.file).read_text(encoding="utf-8")
613
+ try:
614
+ payload = json.loads(raw)
615
+ except json.JSONDecodeError as exc:
616
+ print(f"error: input is not valid JSON ({exc})", file=sys.stderr)
617
+ return 2
618
+ pairs = urls_from_json(payload)
619
+ if not pairs:
620
+ print("no urls found in input", file=sys.stderr)
621
+ return 1
622
+ for url, title in pairs:
623
+ entry = add_sources(path, [url], title=title or None)[0]
624
+ print(f"[{entry['id']}] {entry['url']}")
625
+ return 0
626
+
627
+ if args.cmd == "quote":
628
+ raw = (
629
+ sys.stdin.read()
630
+ if args.evidence == "-"
631
+ else Path(args.evidence).read_text(encoding="utf-8")
632
+ )
633
+ entry = attach_quote(path, args.id, args.text, raw)
634
+ print(f"[{entry['id']}] evidence attached ({len(entry.get('quotes', []))} quote(s))")
635
+ return 0
636
+
637
+ data = load_ledger(path)
638
+ sources = sorted(data["sources"], key=lambda s: s["id"])
639
+
640
+ if args.cmd == "list":
641
+ if args.json:
642
+ print(json.dumps(sources, indent=2, ensure_ascii=False))
643
+ elif not sources:
644
+ print(f"ledger is empty: {path}")
645
+ else:
646
+ for s in sources:
647
+ title = f" {s['title']}" if s.get("title") else ""
648
+ nq = len(s.get("quotes", []))
649
+ mark = f" ({nq} quote{'s' if nq != 1 else ''})" if nq else ""
650
+ print(f"[{s['id']}] {s['url']}{title}{mark}")
651
+ return 0
652
+
653
+ if args.cmd == "render":
654
+ only = _parse_only(args.only)
655
+ if args.replace_in:
656
+ target = Path(args.replace_in)
657
+ if args.style not in {"markdown", "plain", "evidence"}:
658
+ parser.error("--replace-in requires a numeric Markdown Sources style; export other formats separately")
659
+ with _LedgerLock(target):
660
+ original = target.read_text(encoding="utf-8")
661
+ prose, _ = _split_draft(original)
662
+ cited = {int(m) for m in _CITE_RE.findall(prose)}
663
+ selected = cited if only is None else (only & cited)
664
+ current_sources = sorted(load_ledger(path)["sources"], key=lambda s: s["id"])
665
+ block = render_sources(current_sources, style=args.style, only=selected)
666
+ if not block:
667
+ print("no sources to render", file=sys.stderr)
668
+ return 1
669
+ body = _strip_sources_block(original)
670
+ if any(_SOURCES_HEADER_RE.match(line) for _, line in _prose_lines(body.splitlines())):
671
+ parser.error("ambiguous or non-terminal Sources section; draft left unchanged")
672
+ temporary = None
673
+ try:
674
+ with tempfile.NamedTemporaryFile(mode="w", encoding="utf-8", dir=target.parent, delete=False) as handle:
675
+ temporary = Path(handle.name)
676
+ handle.write(body.rstrip("\n") + "\n\n" + block + "\n")
677
+ temporary.chmod(target.stat().st_mode & 0o777)
678
+ os.replace(temporary, target)
679
+ finally:
680
+ if temporary is not None:
681
+ temporary.unlink(missing_ok=True)
682
+ print(f"Sources block rewritten in {target}")
683
+ return 0
684
+ if args.cited_in:
685
+ draft = Path(args.cited_in).read_text(encoding="utf-8")
686
+ prose, _ = _split_draft(draft)
687
+ cited = {int(m) for m in _CITE_RE.findall(prose)}
688
+ only = cited if only is None else (only & cited)
689
+ block = render_sources(sources, style=args.style, only=only)
690
+ if not block:
691
+ print("no sources to render", file=sys.stderr)
692
+ return 1
693
+ print(block)
694
+ return 0
695
+
696
+ if args.cmd == "verify":
697
+ draft_path = Path(args.draft)
698
+ if not draft_path.is_file():
699
+ print(f"error: no such draft: {draft_path}", file=sys.stderr)
700
+ return 2
701
+ code, errors, warnings = verify_draft(
702
+ draft_path,
703
+ sources,
704
+ strict=args.strict,
705
+ min_coverage=args.min_coverage,
706
+ require_evidence=args.evidence,
707
+ )
708
+ for w in warnings:
709
+ prefix = "info" if w.startswith("stats: ") else "warn"
710
+ print(f"{prefix}: {w}")
711
+ for e in errors:
712
+ print(f"FAIL: {e}", file=sys.stderr)
713
+ print("citations OK" if code == 0 else "verification failed")
714
+ return code
715
+
716
+ return 2
717
+
718
+
719
+ if __name__ == "__main__":
720
+ sys.exit(main())