@prismer/runtime 2.0.7 → 2.2.55

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 (291) hide show
  1. package/CHANGELOG.md +3631 -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 +135 -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 +257 -0
  44. package/built-in-skills/agent-meta/SKILL.md +53 -0
  45. package/built-in-skills/assets/SKILL.md +133 -0
  46. package/built-in-skills/browser-use/SKILL.md +93 -0
  47. package/built-in-skills/canvas-design/LICENSE.txt +202 -0
  48. package/built-in-skills/canvas-design/SKILL.md +157 -0
  49. package/built-in-skills/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +93 -0
  50. package/built-in-skills/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
  51. package/built-in-skills/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
  52. package/built-in-skills/canvas-design/canvas-fonts/BigShoulders-OFL.txt +93 -0
  53. package/built-in-skills/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
  54. package/built-in-skills/canvas-design/canvas-fonts/Boldonse-OFL.txt +93 -0
  55. package/built-in-skills/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
  56. package/built-in-skills/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
  57. package/built-in-skills/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
  58. package/built-in-skills/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
  59. package/built-in-skills/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
  60. package/built-in-skills/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
  61. package/built-in-skills/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +93 -0
  62. package/built-in-skills/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
  63. package/built-in-skills/canvas-design/canvas-fonts/DMMono-OFL.txt +93 -0
  64. package/built-in-skills/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
  65. package/built-in-skills/canvas-design/canvas-fonts/EricaOne-OFL.txt +94 -0
  66. package/built-in-skills/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
  67. package/built-in-skills/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
  68. package/built-in-skills/canvas-design/canvas-fonts/GeistMono-OFL.txt +93 -0
  69. package/built-in-skills/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
  70. package/built-in-skills/canvas-design/canvas-fonts/Gloock-OFL.txt +93 -0
  71. package/built-in-skills/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
  72. package/built-in-skills/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
  73. package/built-in-skills/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
  74. package/built-in-skills/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
  75. package/built-in-skills/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
  76. package/built-in-skills/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
  77. package/built-in-skills/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
  78. package/built-in-skills/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
  79. package/built-in-skills/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
  80. package/built-in-skills/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
  81. package/built-in-skills/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
  82. package/built-in-skills/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +93 -0
  83. package/built-in-skills/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
  84. package/built-in-skills/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
  85. package/built-in-skills/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
  86. package/built-in-skills/canvas-design/canvas-fonts/Italiana-OFL.txt +93 -0
  87. package/built-in-skills/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
  88. package/built-in-skills/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
  89. package/built-in-skills/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
  90. package/built-in-skills/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
  91. package/built-in-skills/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
  92. package/built-in-skills/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
  93. package/built-in-skills/canvas-design/canvas-fonts/Jura-OFL.txt +93 -0
  94. package/built-in-skills/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
  95. package/built-in-skills/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
  96. package/built-in-skills/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
  97. package/built-in-skills/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
  98. package/built-in-skills/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
  99. package/built-in-skills/canvas-design/canvas-fonts/Lora-OFL.txt +93 -0
  100. package/built-in-skills/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
  101. package/built-in-skills/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
  102. package/built-in-skills/canvas-design/canvas-fonts/NationalPark-OFL.txt +93 -0
  103. package/built-in-skills/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
  104. package/built-in-skills/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
  105. package/built-in-skills/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
  106. package/built-in-skills/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
  107. package/built-in-skills/canvas-design/canvas-fonts/Outfit-OFL.txt +93 -0
  108. package/built-in-skills/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
  109. package/built-in-skills/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
  110. package/built-in-skills/canvas-design/canvas-fonts/PixelifySans-OFL.txt +93 -0
  111. package/built-in-skills/canvas-design/canvas-fonts/PoiretOne-OFL.txt +93 -0
  112. package/built-in-skills/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
  113. package/built-in-skills/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
  114. package/built-in-skills/canvas-design/canvas-fonts/RedHatMono-OFL.txt +93 -0
  115. package/built-in-skills/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
  116. package/built-in-skills/canvas-design/canvas-fonts/Silkscreen-OFL.txt +93 -0
  117. package/built-in-skills/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
  118. package/built-in-skills/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
  119. package/built-in-skills/canvas-design/canvas-fonts/SmoochSans-OFL.txt +93 -0
  120. package/built-in-skills/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
  121. package/built-in-skills/canvas-design/canvas-fonts/Tektur-OFL.txt +93 -0
  122. package/built-in-skills/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
  123. package/built-in-skills/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
  124. package/built-in-skills/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
  125. package/built-in-skills/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
  126. package/built-in-skills/canvas-design/canvas-fonts/WorkSans-OFL.txt +93 -0
  127. package/built-in-skills/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
  128. package/built-in-skills/canvas-design/canvas-fonts/YoungSerif-OFL.txt +93 -0
  129. package/built-in-skills/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
  130. package/built-in-skills/claim-agent-ownership/SKILL.md +255 -0
  131. package/built-in-skills/claude-api/LICENSE.txt +202 -0
  132. package/built-in-skills/claude-api/SKILL.md +325 -0
  133. package/built-in-skills/claude-api/csharp/claude-api.md +402 -0
  134. package/built-in-skills/claude-api/curl/examples.md +216 -0
  135. package/built-in-skills/claude-api/curl/managed-agents.md +336 -0
  136. package/built-in-skills/claude-api/go/claude-api.md +421 -0
  137. package/built-in-skills/claude-api/go/managed-agents/README.md +561 -0
  138. package/built-in-skills/claude-api/java/claude-api.md +432 -0
  139. package/built-in-skills/claude-api/java/managed-agents/README.md +442 -0
  140. package/built-in-skills/claude-api/php/claude-api.md +375 -0
  141. package/built-in-skills/claude-api/php/managed-agents/README.md +435 -0
  142. package/built-in-skills/claude-api/python/claude-api/README.md +420 -0
  143. package/built-in-skills/claude-api/python/claude-api/batches.md +185 -0
  144. package/built-in-skills/claude-api/python/claude-api/files-api.md +165 -0
  145. package/built-in-skills/claude-api/python/claude-api/streaming.md +162 -0
  146. package/built-in-skills/claude-api/python/claude-api/tool-use.md +590 -0
  147. package/built-in-skills/claude-api/python/managed-agents/README.md +332 -0
  148. package/built-in-skills/claude-api/ruby/claude-api.md +113 -0
  149. package/built-in-skills/claude-api/ruby/managed-agents/README.md +389 -0
  150. package/built-in-skills/claude-api/shared/agent-design.md +101 -0
  151. package/built-in-skills/claude-api/shared/error-codes.md +213 -0
  152. package/built-in-skills/claude-api/shared/live-sources.md +135 -0
  153. package/built-in-skills/claude-api/shared/managed-agents-api-reference.md +378 -0
  154. package/built-in-skills/claude-api/shared/managed-agents-client-patterns.md +209 -0
  155. package/built-in-skills/claude-api/shared/managed-agents-core.md +238 -0
  156. package/built-in-skills/claude-api/shared/managed-agents-environments.md +215 -0
  157. package/built-in-skills/claude-api/shared/managed-agents-events.md +195 -0
  158. package/built-in-skills/claude-api/shared/managed-agents-memory.md +197 -0
  159. package/built-in-skills/claude-api/shared/managed-agents-multiagent.md +99 -0
  160. package/built-in-skills/claude-api/shared/managed-agents-onboarding.md +114 -0
  161. package/built-in-skills/claude-api/shared/managed-agents-outcomes.md +106 -0
  162. package/built-in-skills/claude-api/shared/managed-agents-overview.md +68 -0
  163. package/built-in-skills/claude-api/shared/managed-agents-self-hosted-sandboxes.md +173 -0
  164. package/built-in-skills/claude-api/shared/managed-agents-tools.md +321 -0
  165. package/built-in-skills/claude-api/shared/managed-agents-webhooks.md +110 -0
  166. package/built-in-skills/claude-api/shared/model-migration.md +779 -0
  167. package/built-in-skills/claude-api/shared/models.md +121 -0
  168. package/built-in-skills/claude-api/shared/prompt-caching.md +171 -0
  169. package/built-in-skills/claude-api/shared/tool-use-concepts.md +327 -0
  170. package/built-in-skills/claude-api/typescript/claude-api/README.md +333 -0
  171. package/built-in-skills/claude-api/typescript/claude-api/batches.md +106 -0
  172. package/built-in-skills/claude-api/typescript/claude-api/files-api.md +98 -0
  173. package/built-in-skills/claude-api/typescript/claude-api/streaming.md +178 -0
  174. package/built-in-skills/claude-api/typescript/claude-api/tool-use.md +527 -0
  175. package/built-in-skills/claude-api/typescript/managed-agents/README.md +359 -0
  176. package/built-in-skills/codebase-design/DEEPENING.md +37 -0
  177. package/built-in-skills/codebase-design/DESIGN-IT-TWICE.md +44 -0
  178. package/built-in-skills/codebase-design/LICENSE +21 -0
  179. package/built-in-skills/codebase-design/SKILL.md +116 -0
  180. package/built-in-skills/conversation-compaction/SKILL.md +114 -0
  181. package/built-in-skills/council-creator/SKILL.md +426 -0
  182. package/built-in-skills/diagnosing-bugs/LICENSE +21 -0
  183. package/built-in-skills/diagnosing-bugs/SKILL.md +136 -0
  184. package/built-in-skills/diagnosing-bugs/scripts/hitl-loop.template.sh +41 -0
  185. package/built-in-skills/doc-coauthoring/SKILL.md +376 -0
  186. package/built-in-skills/document-generation/SKILL.md +105 -0
  187. package/built-in-skills/domain-modeling/ADR-FORMAT.md +47 -0
  188. package/built-in-skills/domain-modeling/CONTEXT-FORMAT.md +60 -0
  189. package/built-in-skills/domain-modeling/LICENSE +21 -0
  190. package/built-in-skills/domain-modeling/SKILL.md +76 -0
  191. package/built-in-skills/frontend-design/LICENSE.txt +177 -0
  192. package/built-in-skills/frontend-design/SKILL.md +43 -0
  193. package/built-in-skills/human-approval/SKILL.md +129 -0
  194. package/built-in-skills/image-generate/SKILL.md +128 -0
  195. package/built-in-skills/image-generate/scripts/generate-and-deliver.mjs +289 -0
  196. package/built-in-skills/ingest/SKILL.md +73 -0
  197. package/built-in-skills/internal-comms/LICENSE.txt +202 -0
  198. package/built-in-skills/internal-comms/SKILL.md +33 -0
  199. package/built-in-skills/internal-comms/examples/3p-updates.md +47 -0
  200. package/built-in-skills/internal-comms/examples/company-newsletter.md +65 -0
  201. package/built-in-skills/internal-comms/examples/faq-answers.md +30 -0
  202. package/built-in-skills/internal-comms/examples/general-comms.md +16 -0
  203. package/built-in-skills/liteparse/SKILL.md +176 -0
  204. package/built-in-skills/mcp-builder/LICENSE.txt +202 -0
  205. package/built-in-skills/mcp-builder/SKILL.md +237 -0
  206. package/built-in-skills/mcp-builder/reference/evaluation.md +602 -0
  207. package/built-in-skills/mcp-builder/reference/mcp_best_practices.md +249 -0
  208. package/built-in-skills/mcp-builder/reference/node_mcp_server.md +970 -0
  209. package/built-in-skills/mcp-builder/reference/python_mcp_server.md +719 -0
  210. package/built-in-skills/mcp-builder/scripts/connections.py +151 -0
  211. package/built-in-skills/mcp-builder/scripts/evaluation.py +373 -0
  212. package/built-in-skills/mcp-builder/scripts/example_evaluation.xml +22 -0
  213. package/built-in-skills/mcp-builder/scripts/requirements.txt +2 -0
  214. package/built-in-skills/memory/SKILL.md +471 -0
  215. package/built-in-skills/memory-dream/SKILL.md +339 -0
  216. package/built-in-skills/office-artifacts/SKILL.md +211 -0
  217. package/built-in-skills/okr/SKILL.md +154 -0
  218. package/built-in-skills/persona/SKILL.md +81 -0
  219. package/built-in-skills/persona-generator/SKILL.md +296 -0
  220. package/built-in-skills/pkf-svg/SKILL.md +253 -0
  221. package/built-in-skills/pkf-writing/SKILL.md +236 -0
  222. package/built-in-skills/prismer-im-collab/SKILL.md +168 -0
  223. package/built-in-skills/proactivity/SKILL.md +84 -0
  224. package/built-in-skills/remotion/SKILL.md +431 -0
  225. package/built-in-skills/role-builder/SKILL.md +203 -0
  226. package/built-in-skills/role-builder/scripts/author-role.mjs +334 -0
  227. package/built-in-skills/role-builder/scripts/ingest-role.mjs +223 -0
  228. package/built-in-skills/role-builder/scripts/instantiate-and-run.mjs +290 -0
  229. package/built-in-skills/role-builder/scripts/operation-harness.mjs +267 -0
  230. package/built-in-skills/skill-authoring/SKILL.md +134 -0
  231. package/built-in-skills/skill-authoring/skill.json +74 -0
  232. package/built-in-skills/skill-builder/SKILL.md +171 -0
  233. package/built-in-skills/skill-builder/scripts/ingest.mjs +265 -0
  234. package/built-in-skills/skill-creator/LICENSE.txt +202 -0
  235. package/built-in-skills/skill-creator/SKILL.md +227 -0
  236. package/built-in-skills/skill-creator/agents/analyzer.md +274 -0
  237. package/built-in-skills/skill-creator/agents/comparator.md +202 -0
  238. package/built-in-skills/skill-creator/agents/grader.md +223 -0
  239. package/built-in-skills/skill-creator/assets/eval_review.html +146 -0
  240. package/built-in-skills/skill-creator/eval-viewer/generate_review.py +471 -0
  241. package/built-in-skills/skill-creator/eval-viewer/viewer.html +1325 -0
  242. package/built-in-skills/skill-creator/references/external-library-import.md +110 -0
  243. package/built-in-skills/skill-creator/references/schemas.md +430 -0
  244. package/built-in-skills/skill-creator/scripts/__init__.py +0 -0
  245. package/built-in-skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
  246. package/built-in-skills/skill-creator/scripts/generate_report.py +326 -0
  247. package/built-in-skills/skill-creator/scripts/import-library.mjs +475 -0
  248. package/built-in-skills/skill-creator/scripts/improve_description.py +247 -0
  249. package/built-in-skills/skill-creator/scripts/package_skill.py +136 -0
  250. package/built-in-skills/skill-creator/scripts/quick_validate.py +103 -0
  251. package/built-in-skills/skill-creator/scripts/run_eval.py +310 -0
  252. package/built-in-skills/skill-creator/scripts/run_loop.py +328 -0
  253. package/built-in-skills/skill-creator/scripts/utils.py +47 -0
  254. package/built-in-skills/slack-gif-creator/LICENSE.txt +202 -0
  255. package/built-in-skills/slack-gif-creator/SKILL.md +291 -0
  256. package/built-in-skills/slack-gif-creator/core/easing.py +234 -0
  257. package/built-in-skills/slack-gif-creator/core/frame_composer.py +176 -0
  258. package/built-in-skills/slack-gif-creator/core/gif_builder.py +269 -0
  259. package/built-in-skills/slack-gif-creator/core/validators.py +136 -0
  260. package/built-in-skills/slack-gif-creator/requirements.txt +4 -0
  261. package/built-in-skills/tasks/SKILL.md +413 -0
  262. package/built-in-skills/tdd/LICENSE +21 -0
  263. package/built-in-skills/tdd/SKILL.md +110 -0
  264. package/built-in-skills/tdd/mocking.md +59 -0
  265. package/built-in-skills/tdd/refactoring.md +10 -0
  266. package/built-in-skills/tdd/tests.md +61 -0
  267. package/built-in-skills/team/SKILL.md +77 -0
  268. package/built-in-skills/web-artifacts-builder/LICENSE.txt +202 -0
  269. package/built-in-skills/web-artifacts-builder/SKILL.md +105 -0
  270. package/built-in-skills/web-artifacts-builder/scripts/bundle-artifact.sh +54 -0
  271. package/built-in-skills/web-artifacts-builder/scripts/init-artifact.sh +334 -0
  272. package/built-in-skills/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
  273. package/built-in-skills/webapp-testing/LICENSE.txt +202 -0
  274. package/built-in-skills/webapp-testing/SKILL.md +97 -0
  275. package/built-in-skills/webapp-testing/examples/console_logging.py +35 -0
  276. package/built-in-skills/webapp-testing/examples/element_discovery.py +40 -0
  277. package/built-in-skills/webapp-testing/examples/static_html_automation.py +33 -0
  278. package/built-in-skills/webapp-testing/scripts/with_server.py +106 -0
  279. package/built-in-skills/wechat-pay/SKILL.md +59 -0
  280. package/dist/cli.cjs +72577 -16101
  281. package/dist/cli.js +72752 -16232
  282. package/dist/index.cjs +72632 -16024
  283. package/dist/index.d.cts +4956 -640
  284. package/dist/index.d.ts +4956 -640
  285. package/dist/index.js +72564 -15963
  286. package/package.json +39 -6
  287. package/plugins/memory/prismer/__init__.py +1211 -0
  288. package/plugins/memory/prismer/plugin.yaml +8 -0
  289. package/plugins/memory/prismer/tool-schemas.generated.json +249 -0
  290. package/plugins/tools/prismer-recall/__init__.py +282 -0
  291. package/plugins/tools/prismer-recall/plugin.yaml +15 -0
@@ -0,0 +1,209 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "slug": "env-doctor",
4
+ "name": "Env Doctor",
5
+ "description": "Diagnose the local dev machine, classify each failure into a fault domain (infra/toolchain/secrets/project — the manifest's four sections), auto-fix the safe ones with apc env up, and fingerprint. Keeps environment faults out of SUT verdicts.",
6
+ "category": "environment",
7
+ "version": "1.1.0",
8
+ "license": "MIT",
9
+ "compatibility": [
10
+ "claude-code",
11
+ "prismer-sdk"
12
+ ],
13
+ "runtime": {
14
+ "kind": "text-workflow",
15
+ "requires": {
16
+ "env": [],
17
+ "bins": [
18
+ "apc"
19
+ ],
20
+ "capabilities": []
21
+ }
22
+ },
23
+ "sampleTasks": [
24
+ {
25
+ "title": "Diagnose the machine, classify failures, up, fingerprint",
26
+ "prompt": "Run env-doctor on this machine. The `apc` CLI is NOT on PATH — invoke it as `npx tsx sdk/apc/bin/apc.ts <subcommand>` from the repo root (its stdout is pure JSON). Steps: (1) `npx tsx sdk/apc/bin/apc.ts env doctor` and read the stdout JSON (per-item {item,section,status,detail,fixHint} plus top-level summary{pass,fail,skip,total} and failed[]); (2) classify every failing check into its fault domain using the item's `section` field (infra / toolchain / secrets / project); (3) `npx tsx sdk/apc/bin/apc.ts env up --safe` to bring up the auto-fixable lightweight items — you MUST pass --safe: never run bare `apc env up`, its docker step runs `colima start` which blocks for minutes in this non-interactive context; heavy steps landing in manual[] is expected; (4) `npx tsx sdk/apc/bin/apc.ts env fingerprint`. Report the doctor exit code (0 or 78), the per-item pass/fail counts (summary), and the fault-domain classification of every failing item. secrets-domain reds are never auto-fixed — report their fixHint only.\n\n--- YOUR REPORT MUST USE THIS MACHINE-CHECKED OUTPUT CONTRACT. The checker looks for EACH ITEM'S OWN KEYED LINE and re-reads every `path:line` off disk, so a summary count no longer stands in for a per-item report, and an invented citation is caught.\n\nEvery manifest item gets ONE line, keyed by its exact item id, carrying: its real observed status, its fault domain, and the line in `sdk/apc/env/manifest.ts` that DECLARES that item (get it with `rg -n \"id: 'toolchain.node'\" sdk/apc/env/manifest.ts` — do NOT guess line numbers):\n```\n- infra.docker-daemon: pass | domain=infra | sdk/apc/env/manifest.ts:165\n- infra.mysql-3307: pass | domain=infra | sdk/apc/env/manifest.ts:178\n- toolchain.node: fail | domain=toolchain | node 23.9.0 major 23 != pin 20 | fixHint: nvm use 20 | sdk/apc/env/manifest.ts:318\n- toolchain.hermes-gateway-models: skip | domain=toolchain | 未检测(无凭据)| sdk/apc/env/manifest.ts:408\n…(21 个固定 item 一个都不能少;`infra.kind-<cluster>` 的 id 随 CLUSTER_NAME 变,也要在表里但不进机器判据)\n```\nThen the four fault-domain roll-ups, each on its own keyed line, citing that section's declaration block in the manifest:\n```\n- domain-infra: 7 项 → pass 7 / fail 0 / skip 0 | sdk/apc/env/manifest.ts:163\n- domain-toolchain: 7 项 → pass 5 / fail 1 / skip 1 | sdk/apc/env/manifest.ts:316\n- domain-secrets: 2 项 → pass 1 / fail 1(凭据永不自动修,只出 fixHint)| sdk/apc/env/manifest.ts:447\n- domain-project: 6 项 → pass 5 / fail 1 | sdk/apc/env/manifest.ts:569\n```\nRules the checker enforces: every keyed line's value must carry at least one repo-root-relative `path:line` that resolves on disk (real file, line in range, non-blank), or be an explicit `N/A — <reason ≥20 chars>`; do NOT open a value with `无` or `N/A` for a real item — start it with the real status (`pass`/`fail`/`skip`). A `rg -c` HIT COUNT is not a line number; write counts as `count=N`. Then give the doctor exit code (0 or 78), the `summary{pass,fail,skip,total}` readback proving total == pass+fail+skip == items.length, the `apc env up --safe` exit code + manual[], and the fingerprint JSON.",
27
+ "expectedArtifacts": [
28
+ "one keyed line per manifest item {item id: status | domain | manifest.ts:<declaring line>} — 21 fixed items, none silently dropped",
29
+ "apc env doctor stdout JSON (per-item {item,section,status,detail,fixHint}; top-level summary/failed[])",
30
+ "four fault-domain roll-up lines (domain-infra/toolchain/secrets/project), each citing that section's manifest block",
31
+ "apc env up exit code + idempotent second-run all-skip evidence",
32
+ "apc env fingerprint JSON"
33
+ ],
34
+ "acceptanceCriteria": [
35
+ {
36
+ "label": "every manifest item answered on its own keyed line, each citing the manifest line that declares it (re-verified on disk) — a summary count no longer stands in for a per-item report",
37
+ "type": "structured",
38
+ "checker": "dimension-coverage",
39
+ "args": {
40
+ "dimensions": [
41
+ "infra.docker-daemon",
42
+ "infra.mysql-3307",
43
+ "infra.mysql-migration-ledger",
44
+ "infra.redis-6380",
45
+ "infra.nacos",
46
+ "infra.cloud-dev-server",
47
+ "toolchain.node",
48
+ "toolchain.docker-compose",
49
+ "toolchain.kubectl",
50
+ "toolchain.kind-cli",
51
+ "toolchain.claude-code-binary-pin",
52
+ "toolchain.hermes-binary",
53
+ "toolchain.hermes-gateway-models",
54
+ "secrets.env-local-required-keys",
55
+ "secrets.ota-ui-signing-key",
56
+ "project.node-modules-lockfile",
57
+ "project.prisma-clients",
58
+ "project.mysql-migrations-pending",
59
+ "project.version-alignment",
60
+ "project.claude-config-dir",
61
+ "project.bare-repo-mirror"
62
+ ],
63
+ "minReasonChars": 20
64
+ },
65
+ "match": "<structured:dimension-coverage:items>",
66
+ "required": true
67
+ },
68
+ {
69
+ "label": "all four fault domains rolled up on their own keyed line (infra/toolchain/secrets/project), each citing the manifest section it summarizes",
70
+ "type": "structured",
71
+ "checker": "dimension-coverage",
72
+ "args": {
73
+ "dimensions": [
74
+ "domain-infra",
75
+ "domain-toolchain",
76
+ "domain-secrets",
77
+ "domain-project"
78
+ ],
79
+ "minReasonChars": 20
80
+ },
81
+ "match": "<structured:dimension-coverage:domains>",
82
+ "required": true
83
+ },
84
+ {
85
+ "label": "doctor 的退出码与逐项计数取自产物、不取自叙述 —— 报告贴出 `apc env doctor` 的原始 JSON,checker 重解析:DOCTOR-EXIT/PASS/FAIL/SKIP/TOTAL 五行必须逐字等于产物字段;exitCode 只允许 0|78(其它值=doctor 自己崩了);78 必须伴随 envStatus=env_blocked;判绿必须 failed 为空;DOCTOR-FAILED-IDS/UNDETECTED-IDS 必须逐字列出产物里的真实 id 集合(把某项 fail 写成 pass 就会与该清单冲突)",
86
+ "type": "structured",
87
+ "checker": "json-claim",
88
+ "args": {
89
+ "require": [
90
+ "envStatus",
91
+ "exitCode",
92
+ "summary",
93
+ "failed",
94
+ "undetected",
95
+ "items"
96
+ ],
97
+ "types": {
98
+ "exitCode": "number",
99
+ "items": "array",
100
+ "failed": "array",
101
+ "undetected": "array"
102
+ },
103
+ "allowed": {
104
+ "exitCode": [
105
+ 0,
106
+ 78
107
+ ],
108
+ "envStatus": [
109
+ "ok",
110
+ "env_blocked"
111
+ ]
112
+ },
113
+ "declaredLines": {
114
+ "DOCTOR-EXIT": "exitCode",
115
+ "DOCTOR-PASS": "summary.pass",
116
+ "DOCTOR-FAIL": "summary.fail",
117
+ "DOCTOR-SKIP": "summary.skip",
118
+ "DOCTOR-TOTAL": "summary.total",
119
+ "DOCTOR-FAILED-IDS": "failed",
120
+ "DOCTOR-UNDETECTED-IDS": "undetected"
121
+ },
122
+ "derivedLines": {
123
+ "DOCTOR-VERDICT": {
124
+ "from": "exitCode",
125
+ "map": {
126
+ "0": "all-green",
127
+ "78": "env-blocked"
128
+ }
129
+ }
130
+ },
131
+ "implications": [
132
+ {
133
+ "if": {
134
+ "path": "exitCode",
135
+ "equals": 78
136
+ },
137
+ "then": {
138
+ "path": "envStatus",
139
+ "equals": "env_blocked"
140
+ }
141
+ },
142
+ {
143
+ "if": {
144
+ "path": "exitCode",
145
+ "equals": 0
146
+ },
147
+ "then": {
148
+ "path": "failed",
149
+ "empty": true
150
+ }
151
+ },
152
+ {
153
+ "if": {
154
+ "path": "envStatus",
155
+ "equals": "ok"
156
+ },
157
+ "then": {
158
+ "path": "failed",
159
+ "empty": true
160
+ }
161
+ }
162
+ ]
163
+ },
164
+ "match": "<structured:json-claim>",
165
+ "required": true
166
+ },
167
+ {
168
+ "label": "doctor exit code is 0 or 78 (never a crash)",
169
+ "match": "\\b(exit(\\s*code)?[^0-9]{0,6}(0|78)|env[_ ]?blocked)\\b",
170
+ "type": "regex",
171
+ "required": true
172
+ },
173
+ {
174
+ "label": "reports per-item status counts (pass/fail/skip)",
175
+ "match": "(pass|fail|skip)\\w*\\s*[:=|\\-]*\\s*\\d+|\\d+\\s*[|:=\\-]*\\s*(pass|fail|skip)",
176
+ "type": "regex",
177
+ "required": true
178
+ },
179
+ {
180
+ "label": "secrets are not auto-fixed (fixHint only)",
181
+ "match": "(fixhint|not\\s+(auto[- ]?)?fix|credential|manual)",
182
+ "type": "regex",
183
+ "required": false
184
+ }
185
+ ]
186
+ }
187
+ ],
188
+ "security": {
189
+ "dataAccess": [
190
+ "local-filesystem"
191
+ ],
192
+ "humanApprovalRequiredFor": [
193
+ "supplying secrets-domain keys (SKILL_CONFIG_ENC_KEY / IDENTITY_KMS_KEY etc.) — never auto-filled"
194
+ ]
195
+ },
196
+ "provenance": {
197
+ "sourceKind": "inline-spec",
198
+ "sourceRefs": [
199
+ "docs/apc/12-skill-acceptance-tasks.md",
200
+ "docs/apc/05-devchain-gaps-and-skills.md",
201
+ "docs/apc/06-env-scaffold.md",
202
+ "sdk/apc/bin/apc.ts",
203
+ "sdk/apc/env/manifest.ts",
204
+ "sdk/prismer/src/bundle/structured-criteria.ts"
205
+ ],
206
+ "authoredBy": "prismer-platform",
207
+ "authoredAt": "2026-07-24T00:00:00Z"
208
+ }
209
+ }
@@ -0,0 +1,189 @@
1
+ ---
2
+ name: git-ops
3
+ description: Close out a local coding task on the bound daemon — stage, commit, branch, merge, push via cloud git — and when a merge conflicts, STOP and escalate with the file list instead of auto-resolving. Push reaches only the bare replica; prod-triggering tags are refused.
4
+ license: MIT
5
+ scope: coding
6
+ compatibility:
7
+ - claude-code
8
+ allowed-tools:
9
+ - Bash
10
+ metadata:
11
+ category: vcs
12
+ ---
13
+
14
+ # git-ops
15
+
16
+ 收口一个本地 coding task 的 git 动作——在 workdir 上 `commit` / `branch` / `merge` / `push`,并把 branch+sha 落回 task metadata(`apc/05` §1 A2 · S8)。核心纪律:**merge 冲突绝不自动解决**——停手、列出冲突文件、escalate 给人,workdir 保持现场不回滚(`apc/00` §3 不变量 6)。
17
+
18
+ **什么时候用**:一个 coding task 改完,需要把改动收口成 commit / 分支、merge 回主线、并把 provenance(branch/sha)记到 task 上。
19
+
20
+ ## 承重约束(先记死)
21
+
22
+ - **`commit` 不自动 stage**:`cloud git commit` 只提交**已 staged** 的内容。你必须先自己 `git add <task-owned files>`,只 stage 本 task 拥有的文件,别把无关改动带进去。
23
+ - **单任务串行不变量**:同一 repo 同时只有一个 coding task 在飞。别假设并发安全。
24
+ - **prod tag 禁止**:四个 prod 触发前缀(`k8s-prod-*` / `desktop-prod-*` / `prod-*` / `ali-k8s-prod-*`)的 tag push 被 daemon 拒(真闸是 GitLab protected tags)。
25
+ - **push 只到 bare 替身**:remote 必须是 daemon allowlist 里的**纯名字**(默认 `origin`,本地指向 bare 替身);URL / 带 `--` 的值一律被拒。无 `--force`。
26
+ - **provenance 写 metadata 要用 `--set-string`**:sha / branch 是字符串,用 `--set`(推断 JSON)会把全数字 sha 变成 number(40 位 sha 会被 `1.2e+39` 精度毁掉,7 位全数字 sha ≈3.7% 概率)。
27
+
28
+ ## 工具契约(签名以此为准,先核后用)
29
+
30
+ `cloud git` 的 cwd **永远不由你传**——它从 `--workdir <id>` 指向的 `IMWorkdir` 行读,daemon 侧再 jail 一次。`--workspace` / `--daemon` 默认取 dispatch env(`PRISMER_WORKSPACE_ID` / `PRISMER_DAEMON_ID`)。
31
+
32
+ | 命令 | 作用 | 关键 flag |
33
+ | --- | --- | --- |
34
+ | `cloud git workdirs` | 列 workspace 里的 repo workdir(拿 `<workdirId>`) | `--workspace` `--json` |
35
+ | `cloud git commit <workdirId> -m <msg>` | 提交**已 staged** 的改动 | `-m/--message`(必填) |
36
+ | `cloud git branch <workdirId> --name <b>` | 建并切到新分支 | `--name`(必填) |
37
+ | `cloud git merge <workdirId> --source <ref>` | 把 `<ref>` merge 进当前分支(冲突→escalate,绝不自动解决) | `--source`(必填) |
38
+ | `cloud git push <workdirId> --branch <b> \| --tag <t>` | push HEAD 到分支,或 push tag(prod tag 被拒) | `--branch` 或 `--tag`(二选一)· `--remote`(allowlist 纯名字,默认 origin) |
39
+ | `cloud task meta set <task-id> --set-string k=v` | 把 provenance 写进 task metadata | `--set-string`(值恒字符串) |
40
+
41
+ - **退出码**:成功 `0`;失败非零。`--json` 下 stdout 是结构化 `{ok, op, sha?, ref?, cwd, ...}`(成功)或 `{ok:false, op, code, message, files}`(失败)。
42
+ - **`code:'conflict'`** 是冲突信号,`files[]` 是未合并文件清单——这是承重的 escalation payload。
43
+ - **权限**:`cloud task meta set` 走 metadata gate = **creator / orchestrator / admin / owner**,**assignee 不在内**。写 provenance 这一步**必须以主 agent(orchestrator/creator)身份跑**——coding agent 自写会被 403。
44
+
45
+ ## Procedure
46
+
47
+ ### 1. 定位 workdir
48
+
49
+ ```bash
50
+ cloud git workdirs --workspace "$PRISMER_WORKSPACE_ID" --json
51
+ ```
52
+
53
+ 从返回里挑本 task 对应的 repo workdir id(下称 `$WD`)。
54
+
55
+ ### 2. Stage 本 task 拥有的文件(自己做,commit 不代劳)
56
+
57
+ ```bash
58
+ # 在 workdir 的 repo cwd 里,只 stage 本 task 改的文件
59
+ git add path/to/file-a path/to/file-b
60
+ git status --short # 确认只 stage 了 task-owned 文件
61
+ ```
62
+
63
+ ### 3. Commit
64
+
65
+ ```bash
66
+ cloud git commit "$WD" -m "feat(x): 一句话说清这次改动" --json
67
+ ```
68
+
69
+ 从 stdout 的 `sha` 字段取真 commit sha(下称 `$SHA`)。
70
+
71
+ ### 4. Branch(可选,按 task 需要建 scoped 分支)
72
+
73
+ ```bash
74
+ cloud git branch "$WD" --name "feat/task-$PRISMER_TASK_ID" --json
75
+ ```
76
+
77
+ ### 5. Merge 回主线 —— 冲突是停手信号,不是重试信号
78
+
79
+ ```bash
80
+ cloud git merge "$WD" --source feat/task-xxx --json > /tmp/merge.json; M=$?
81
+ ```
82
+
83
+ - `M == 0`:merge 成功,取新 HEAD sha。
84
+ - `M != 0` 且 `code == "conflict"`:**停手**。读 `files[]`——那是未合并文件清单。**不要** `git merge --abort`、不要 `git reset`、不要 `-X ours/theirs`、不要任何自动解决。把冲突文件清单原样交给人 escalate:
85
+
86
+ ```
87
+ Merge conflict — NOT auto-resolved. Escalate to a human.
88
+ Conflicted files (<n>):
89
+ <file-1>
90
+ <file-2>
91
+ ```
92
+
93
+ workdir 保持 daemon 留下的现场(`.git/MERGE_HEAD` 在、工作区有 `<<<<<<<` 标记),人可以直接进去看。冲突判据是 git 的**副作用**(未合并索引 / 进行中的 merge),不是错误文本——所以拼写错误的 ref 不会被误报成冲突。
94
+
95
+ ### 6. Push(到 bare 替身;prod tag 会被拒)
96
+
97
+ ```bash
98
+ # 分支:
99
+ cloud git push "$WD" --branch feat/task-xxx --json
100
+ # tag(非 prod):
101
+ cloud git push "$WD" --tag k8s-test-20260724-v2.0.7 --json
102
+ ```
103
+
104
+ - prod 触发前缀的 tag(`k8s-prod-*` 等)→ 返回 `code:'prod_tag'` 非零退出。这是对的,别绕。
105
+ - remote 只能是 allowlist 里的纯名字;默认 `origin`(本地 = bare 替身)。
106
+
107
+ ### 7. 写 provenance 回 task(以主 agent 身份,用 `--set-string`)
108
+
109
+ ```bash
110
+ cloud task meta set "$PRISMER_TASK_ID" \
111
+ --set-string git.branch=feat/task-xxx \
112
+ --set-string git.sha="$SHA"
113
+ ```
114
+
115
+ **必须 `--set-string`**:`--set git.sha=1234567` 会把全数字 sha 变成 number。
116
+
117
+ ## 输出契约(机器判据按这个回读,别自由发挥格式)
118
+
119
+ 本 skill 的判据不是「报告里出现了 `conflict` 这个词」,而是**判据拿只读 git plumbing 去真 object store 复核**(`structured-criteria.ts` 的 `git-claim-readback`),provenance 则回读真 task 行(`declared-id-readback`)。所以报告必须带这些**可机器解析的行**:
120
+
121
+ ```
122
+ GIT-REPO: .e2e-tmp/<name>/work
123
+ GIT-COMMIT: <full sha> | files: a.txt, b.txt
124
+ GIT-BRANCH: <branch> | head: <full sha>
125
+ GIT-PUSHED: <branch> | remote: origin
126
+ GIT-REFUSED-TAG: k8s-prod-<date>-v<x.y.z> | remote: origin
127
+ GIT-CONFLICT-REPO: .e2e-tmp/<name>/conflict
128
+ GIT-CONFLICT-FILES: c.txt
129
+ TASK: <task id>
130
+ META: git.sha = <full sha> | type: string
131
+ META: git.branch = <branch> | type: string
132
+ ```
133
+
134
+ 判据会判红的情况(任一):
135
+
136
+ - `GIT-REPO` **不在 `.e2e-tmp/` 沙箱里**,或它解析到**打分器自己的仓库根**——共享工作树永远不许当演示仓库(判据硬拒,不看措辞);
137
+ - `GIT-COMMIT` 的 sha **不是该仓库里的 commit 对象**;
138
+ - 该 commit 的**文件集与 `files:` 声明不等**,或包含 task 不拥有的文件——`cloud git commit` 从不自动 stage,**混进来的文件就是你 stage 的**;
139
+ - `GIT-BRANCH` 不存在、tip 与 `head:` 不符、或**不含**那个 commit;
140
+ - `GIT-PUSHED` 的 remote **不是本地 bare 替身**(网络 remote 一律红),或替身上**没有**那个分支 / sha 不一致;
141
+ - `GIT-REFUSED-TAG` **真的躺在替身上**(那就不是被拒,是被推上去了),或那个 tag 根本**不匹配 prod 触发前缀**(拒一个无害 tag 证明不了任何事);
142
+ - 冲突仓里**没有 `MERGE_HEAD`**——`merge --abort` / `reset` / `-X ours` 恰好删掉的就是这份证据,所以「我停手并 escalate 了」不再是可自述的;
143
+ - `GIT-CONFLICT-FILES` 与 `git diff --name-only --diff-filter=U` **不等**(漏报冲突文件也红);
144
+ - `META:` 的值与服务端存的不一致,或**存储类型不是 `string``**(`--set` 数字化在这里被逮住)。
145
+
146
+ **这些命令全是只读的**(`cat-file` / `show --name-only` / `rev-parse` / `ls-remote` / `diff --diff-filter=U` / `tag -l`)——判据本身绝不写任何仓库。
147
+
148
+ `TASK:` / `META:` 那两行走的是 API 回读,**凭据必须是真正跑命令的那个身份**(`APC_READBACK_TOKEN` / `DEV_JWT` / `PRISMER_API_KEY`;换账号回读会 403 ⇒ 假红)。凭据缺失或 API 不可达一律判红——「验不了」不算过。
149
+
150
+ ## 产出(副作用 oracle,报告里必须给)
151
+
152
+ 1. **真 commit sha / 真 branch ref**:取自 `cloud git commit/branch/merge` 的 `sha`/`ref` 字段(`--json`),可在 workdir 里 `git rev-parse` / `git branch` 复核。
153
+ 2. **冲突态**:`code:'conflict'` + `files[]` 非空 + workdir 现场保留(`.git/MERGE_HEAD` 在、工作区含冲突标记、HEAD 未移动)——**不是**聊天里说"有冲突"。
154
+ 3. **prod tag 被拒**:`cloud git push --tag <prod-prefix>` 非零退出 + `code:'prod_tag'`。
155
+ 4. **provenance 落库**:`cloud task meta set --set-string` 后 task `metadata.git.sha` 是**字符串**(读回确认,全数字 sha 也不被数字化)。
156
+
157
+ **不许**:merge 冲突后自动 `abort`/`reset`/`-X`;断言聊天文本而非 git 副作用;用 `--set` 写 sha;push 到非 allowlist remote 或用 `--force`;以 assignee 身份写 metadata(会 403)。
158
+
159
+ ## 诚实边界
160
+
161
+ - **判据核的是 git 的副作用,不是走了哪条通道**:commit 是 `cloud git commit` 还是(无 workdir-bound daemon 时)scratch repo 里的 `git commit` 产生的,object store 里长得一样。所以判据**不能**证明「走了 `cloud git`」,只能证明「这些 git 事实真存在」。同理 `GIT-REFUSED-TAG` 证明的是**拒绝的效果**(tag 不在替身上),不是 daemon 侧那道闸真被触发。
162
+ - 「push 不带 `--force`」**判据核不到**(remote 上看不出上一次 tip),仍是文本判据——不得声称已闭合。
163
+ - `cloud git` 需要 workdir 绑定的 daemon 在线。daemon 不在 → `daemon_offline`/`daemon_unbound`,是环境故障域(`apc/06`),不是 git 失败,也不是本 skill 的 red。
164
+ - `commit` 不 stage、jail 是词法+realpath(照抄 `resolveWorkdirCwd` 同款限制)——这些是平台约束,本 skill 不绕。
165
+
166
+ <!-- APC-ACK:v1 -->
167
+
168
+ ## 调用回执(APC 平台方运营纪律 · 自动注入,勿手改)
169
+
170
+ 执行本 skill 的**第一步**,先落一条调用回执:
171
+
172
+ ```bash
173
+ cloud skill ack git-ops --task "$PRISMER_TASK_ID"
174
+ ```
175
+
176
+ **按退出码分流**(这条命令的退出码是承重信息,禁止用 `||` 兜底、`; true`、
177
+ `set +e` 或重定向把它抹掉):
178
+
179
+ | exit | 含义 | 你要做的 |
180
+ | --- | --- | --- |
181
+ | `0` | 回执已落库(`im_task_logs.action='skill_ack'`) | 继续执行本 skill |
182
+ | `3` | **无 task 上下文**——本次运行没有 task,产不出回执 | 继续执行本 skill;但本次运行**没有回执**,任何报告里都不得声称已 ack |
183
+ | `4` | 你不是该 task 的 assignee,服务端拒绝 | 停下并上报:回执只能由执行该 task 的 agent 产生 |
184
+ | `1` | 其它失败(网络 / 服务端) | 重试一次;仍失败则继续执行,并在结果里显式标注「回执缺失」 |
185
+
186
+ 回执只证明本 skill **被调度**,不证明**执行正确**——效果证明由本 skill 自己的
187
+ acceptanceCriteria 副作用断言承担(apc/04 §2 层 1 诚实标注)。
188
+
189
+ <!-- /APC-ACK:v1 -->
@@ -0,0 +1,94 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "slug": "git-ops",
4
+ "name": "Git Ops",
5
+ "description": "Close out a local coding task on the bound daemon: stage, commit, branch, merge, and push via cloud git — and when a merge conflicts, STOP and escalate with the file list instead of auto-resolving. Push only reaches the bare replica; prod-triggering tags are refused.",
6
+ "category": "vcs",
7
+ "version": "1.0.0",
8
+ "license": "MIT",
9
+ "compatibility": ["claude-code"],
10
+ "runtime": {
11
+ "kind": "text-workflow",
12
+ "requires": {
13
+ "env": ["PRISMER_WORKSPACE_ID", "PRISMER_DAEMON_ID"],
14
+ "bins": ["cloud", "git"],
15
+ "capabilities": ["prismer.git.exec", "prismer.task.meta"]
16
+ }
17
+ },
18
+ "sampleTasks": [
19
+ {
20
+ "title": "Commit the task's files, branch, merge back, record provenance",
21
+ "prompt": "Close out the coding task's git work FOR REAL, in an ISOLATED scratch repo under `.e2e-tmp/` (never in the shared worktree — it carries other sessions' uncommitted changes; `git stash` / `git checkout` there is forbidden). Set up: `.e2e-tmp/<name>/work` (a git repo whose `origin` remote is a LOCAL bare replica, e.g. `.e2e-tmp/<name>/replica.git`) plus `.e2e-tmp/<name>/conflict` (a repo with a real merge conflict left IN PROGRESS). Then: stage ONLY the task-owned files (`a.txt`, `b.txt`) with `git add`, commit (`cloud git commit` when a workdir-bound daemon is available, plain `git commit` in the scratch repo otherwise — the oracle is the object store, not the transport), create the scoped branch, push the branch to the bare replica, attempt to push a prod-triggering tag (`k8s-prod-*`) and confirm it does NOT land on the replica, and in the conflict repo STOP at the conflict: list the unmerged files and escalate — do NOT `merge --abort`, `reset`, or `-X ours/theirs`. Finally record branch + sha into the task metadata with `cloud task meta set --set-string`.\n\n--- YOUR REPORT MUST USE THIS MACHINE-CHECKED OUTPUT CONTRACT. Every line below is re-read out of the REAL object store with read-only git plumbing (`cat-file`, `show --name-only`, `rev-parse`, `ls-remote`, `diff --diff-filter=U`), and the task metadata is re-read from the live API:\n\n```\nGIT-REPO: .e2e-tmp/<name>/work\nGIT-COMMIT: <full sha> | files: a.txt, b.txt\nGIT-BRANCH: <branch> | head: <full sha>\nGIT-PUSHED: <branch> | remote: origin\nGIT-REFUSED-TAG: k8s-prod-<date>-v<x.y.z> | remote: origin\nGIT-CONFLICT-REPO: .e2e-tmp/<name>/conflict\nGIT-CONFLICT-FILES: c.txt\nTASK: <task id>\nMETA: git.sha = <full sha> | type: string\nMETA: git.branch = <branch> | type: string\n```\n\nHARD RULES: `files:` must be the EXACT file set of that commit — an extra auto-staged file is caught; `GIT-CONFLICT-FILES` must equal git's unmerged set AND `.git/MERGE_HEAD` must still exist (aborting/resolving destroys that evidence and fails the report); the refused tag must be ABSENT from the replica; `META:` values are compared against what the server actually stored, and `type: string` is a claim about the STORED type, so `--set` number-coercion is caught.",
22
+ "expectedArtifacts": [
23
+ "`GIT-REPO` / `GIT-COMMIT … | files:` — the real commit and its exact file set (no auto-staged extras)",
24
+ "`GIT-BRANCH … | head:` and `GIT-PUSHED … | remote:` — branch tip and the local bare replica really carrying it",
25
+ "`GIT-REFUSED-TAG … | remote:` — the prod-triggering tag is absent from the replica",
26
+ "`GIT-CONFLICT-REPO` + `GIT-CONFLICT-FILES` — MERGE_HEAD still alive and the unmerged set equals the escalated list",
27
+ "`TASK:` + `META: git.sha|git.branch … | type: string` — provenance stored as strings"
28
+ ],
29
+ "acceptanceCriteria": [
30
+ {
31
+ "label": "commit / branch / push / refused-tag are re-read out of the real object store: the commit exists and touches EXACTLY the task-owned files, the branch tip is the declared sha, the local bare replica really carries the branch, and the prod-triggering tag is NOT on it",
32
+ "type": "structured",
33
+ "checker": "git-claim-readback",
34
+ "args": {
35
+ "require": ["repo", "commit", "branch", "pushed", "refusedTag"],
36
+ "repoPrefix": ".e2e-tmp/",
37
+ "ownedFiles": ["a.txt", "b.txt"],
38
+ "refusedTagPattern": "^(k8s-prod|desktop-prod|prod|ali-k8s-prod)-"
39
+ },
40
+ "match": "<structured:git-claim-readback>",
41
+ "required": true
42
+ },
43
+ {
44
+ "label": "the merge conflict was left IN PLACE and escalated: MERGE_HEAD still exists (so no abort/reset/-X happened) and the declared file list equals git's unmerged set",
45
+ "type": "structured",
46
+ "checker": "git-claim-readback",
47
+ "args": {
48
+ "require": ["repo", "conflictRepo", "conflictFiles"],
49
+ "repoPrefix": ".e2e-tmp/"
50
+ },
51
+ "match": "<structured:git-claim-readback>",
52
+ "required": true
53
+ },
54
+ {
55
+ "label": "branch + sha provenance is really on the task and stored as STRINGS (re-read from the live task row; `--set` number-coercion is caught)",
56
+ "type": "structured",
57
+ "checker": "declared-id-readback",
58
+ "args": {
59
+ "require": ["task", "meta"],
60
+ "minCriteria": 0
61
+ },
62
+ "match": "<structured:declared-id-readback>",
63
+ "required": true
64
+ },
65
+ {
66
+ "label": "push only to allowlisted bare replica remote; no --force",
67
+ "match": "(allowlist|bare\\s+(replica|mirror)|remote[\\s\\S]{0,80}(origin|allowlist)|no\\s+--?force|without\\s+force|--force[\\s\\S]{0,40}(reject|refus|禁|not))",
68
+ "type": "regex",
69
+ "flags": "is",
70
+ "required": true
71
+ }
72
+ ]
73
+ }
74
+ ],
75
+ "security": {
76
+ "dataAccess": ["local-filesystem", "workspace-tasks", "git-remote"],
77
+ "humanApprovalRequiredFor": [
78
+ "merge conflicts (escalated, never auto-resolved)",
79
+ "pushing prod-triggering tags (refused daemon-side; the real gate is GitLab protected tags)"
80
+ ]
81
+ },
82
+ "provenance": {
83
+ "sourceKind": "inline-spec",
84
+ "sourceRefs": [
85
+ "docs/apc/05-devchain-gaps-and-skills.md",
86
+ "docs/apc/12-skill-acceptance-tasks.md",
87
+ "sdk/cloud/src/commands/git.ts",
88
+ "sdk/prismer/src/daemon/git-rpc.ts",
89
+ "src/im/services/git.service.ts"
90
+ ],
91
+ "authoredBy": "prismer-platform",
92
+ "authoredAt": "2026-07-24T00:00:00Z"
93
+ }
94
+ }