@bastani/atomic 0.5.11-0 → 0.5.12-0

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 (506) hide show
  1. package/.agents/skills/adapt/SKILL.md +199 -0
  2. package/.agents/skills/advanced-evaluation/SKILL.md +402 -0
  3. package/.agents/skills/advanced-evaluation/references/bias-mitigation.md +288 -0
  4. package/.agents/skills/advanced-evaluation/references/evaluation-pipeline.md +43 -0
  5. package/.agents/skills/advanced-evaluation/references/implementation-patterns.md +315 -0
  6. package/.agents/skills/advanced-evaluation/references/metrics-guide.md +331 -0
  7. package/.agents/skills/advanced-evaluation/scripts/evaluation_example.py +392 -0
  8. package/.agents/skills/animate/SKILL.md +175 -0
  9. package/.agents/skills/arrange/SKILL.md +124 -0
  10. package/.agents/skills/audit/SKILL.md +148 -0
  11. package/.agents/skills/bdi-mental-states/SKILL.md +311 -0
  12. package/.agents/skills/bdi-mental-states/references/bdi-ontology-core.md +207 -0
  13. package/.agents/skills/bdi-mental-states/references/framework-integration.md +582 -0
  14. package/.agents/skills/bdi-mental-states/references/rdf-examples.md +315 -0
  15. package/.agents/skills/bdi-mental-states/references/sparql-competency.md +420 -0
  16. package/.agents/skills/bolder/SKILL.md +117 -0
  17. package/.agents/skills/bun/SKILL.md +199 -0
  18. package/.agents/skills/clarify/SKILL.md +183 -0
  19. package/.agents/skills/colorize/SKILL.md +143 -0
  20. package/.agents/skills/context-compression/SKILL.md +272 -0
  21. package/.agents/skills/context-compression/references/evaluation-framework.md +213 -0
  22. package/.agents/skills/context-compression/scripts/compression_evaluator.py +862 -0
  23. package/.agents/skills/context-compression/tests/test_compression_evaluator.py +56 -0
  24. package/.agents/skills/context-degradation/SKILL.md +206 -0
  25. package/.agents/skills/context-degradation/references/patterns.md +314 -0
  26. package/.agents/skills/context-degradation/scripts/degradation_detector.py +614 -0
  27. package/.agents/skills/context-fundamentals/SKILL.md +201 -0
  28. package/.agents/skills/context-fundamentals/references/context-components.md +283 -0
  29. package/.agents/skills/context-fundamentals/scripts/context_manager.py +533 -0
  30. package/.agents/skills/context-optimization/SKILL.md +195 -0
  31. package/.agents/skills/context-optimization/references/optimization_techniques.md +272 -0
  32. package/.agents/skills/context-optimization/scripts/compaction.py +562 -0
  33. package/.agents/skills/create-spec/SKILL.md +244 -0
  34. package/.agents/skills/critique/SKILL.md +225 -0
  35. package/.agents/skills/critique/reference/cognitive-load.md +106 -0
  36. package/.agents/skills/critique/reference/heuristics-scoring.md +234 -0
  37. package/.agents/skills/critique/reference/personas.md +178 -0
  38. package/.agents/skills/delight/SKILL.md +304 -0
  39. package/.agents/skills/distill/SKILL.md +122 -0
  40. package/.agents/skills/docx/LICENSE.txt +30 -0
  41. package/.agents/skills/docx/SKILL.md +590 -0
  42. package/.agents/skills/docx/scripts/__init__.py +1 -0
  43. package/.agents/skills/docx/scripts/accept_changes.py +135 -0
  44. package/.agents/skills/docx/scripts/comment.py +318 -0
  45. package/.agents/skills/docx/scripts/office/helpers/__init__.py +0 -0
  46. package/.agents/skills/docx/scripts/office/helpers/merge_runs.py +199 -0
  47. package/.agents/skills/docx/scripts/office/helpers/simplify_redlines.py +197 -0
  48. package/.agents/skills/docx/scripts/office/pack.py +159 -0
  49. package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  50. package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  51. package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  52. package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  53. package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  54. package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  55. package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  56. package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  57. package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  58. package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  59. package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  60. package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  61. package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  62. package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  63. package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  64. package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  65. package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  66. package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  67. package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  68. package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  69. package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  70. package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  71. package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  72. package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  73. package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  74. package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  75. package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  76. package/.agents/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  77. package/.agents/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  78. package/.agents/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  79. package/.agents/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  80. package/.agents/skills/docx/scripts/office/schemas/mce/mc.xsd +75 -0
  81. package/.agents/skills/docx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
  82. package/.agents/skills/docx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
  83. package/.agents/skills/docx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
  84. package/.agents/skills/docx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
  85. package/.agents/skills/docx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
  86. package/.agents/skills/docx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  87. package/.agents/skills/docx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
  88. package/.agents/skills/docx/scripts/office/soffice.py +183 -0
  89. package/.agents/skills/docx/scripts/office/unpack.py +132 -0
  90. package/.agents/skills/docx/scripts/office/validate.py +111 -0
  91. package/.agents/skills/docx/scripts/office/validators/__init__.py +15 -0
  92. package/.agents/skills/docx/scripts/office/validators/base.py +847 -0
  93. package/.agents/skills/docx/scripts/office/validators/docx.py +446 -0
  94. package/.agents/skills/docx/scripts/office/validators/pptx.py +275 -0
  95. package/.agents/skills/docx/scripts/office/validators/redlining.py +247 -0
  96. package/.agents/skills/docx/scripts/templates/comments.xml +3 -0
  97. package/.agents/skills/docx/scripts/templates/commentsExtended.xml +3 -0
  98. package/.agents/skills/docx/scripts/templates/commentsExtensible.xml +3 -0
  99. package/.agents/skills/docx/scripts/templates/commentsIds.xml +3 -0
  100. package/.agents/skills/docx/scripts/templates/people.xml +3 -0
  101. package/.agents/skills/evaluation/SKILL.md +251 -0
  102. package/.agents/skills/evaluation/references/metrics.md +339 -0
  103. package/.agents/skills/evaluation/scripts/evaluator.py +627 -0
  104. package/.agents/skills/explain-code/SKILL.md +230 -0
  105. package/.agents/skills/extract/SKILL.md +91 -0
  106. package/.agents/skills/filesystem-context/SKILL.md +287 -0
  107. package/.agents/skills/filesystem-context/references/implementation-patterns.md +549 -0
  108. package/.agents/skills/filesystem-context/scripts/filesystem_context.py +425 -0
  109. package/.agents/skills/find-skills/SKILL.md +142 -0
  110. package/.agents/skills/frontend-design/SKILL.md +147 -0
  111. package/.agents/skills/frontend-design/reference/color-and-contrast.md +132 -0
  112. package/.agents/skills/frontend-design/reference/interaction-design.md +195 -0
  113. package/.agents/skills/frontend-design/reference/motion-design.md +99 -0
  114. package/.agents/skills/frontend-design/reference/responsive-design.md +114 -0
  115. package/.agents/skills/frontend-design/reference/spatial-design.md +100 -0
  116. package/.agents/skills/frontend-design/reference/typography.md +133 -0
  117. package/.agents/skills/frontend-design/reference/ux-writing.md +107 -0
  118. package/.agents/skills/gh-commit/SKILL.md +243 -0
  119. package/.agents/skills/gh-create-pr/SKILL.md +93 -0
  120. package/.agents/skills/harden/SKILL.md +354 -0
  121. package/.agents/skills/hosted-agents/SKILL.md +260 -0
  122. package/.agents/skills/hosted-agents/references/infrastructure-patterns.md +700 -0
  123. package/.agents/skills/hosted-agents/scripts/sandbox_manager.py +590 -0
  124. package/.agents/skills/impeccable/SKILL.md +365 -0
  125. package/.agents/skills/impeccable/reference/color-and-contrast.md +105 -0
  126. package/.agents/skills/impeccable/reference/craft.md +70 -0
  127. package/.agents/skills/impeccable/reference/extract.md +70 -0
  128. package/.agents/skills/impeccable/reference/interaction-design.md +195 -0
  129. package/.agents/skills/impeccable/reference/motion-design.md +99 -0
  130. package/.agents/skills/impeccable/reference/responsive-design.md +114 -0
  131. package/.agents/skills/impeccable/reference/spatial-design.md +100 -0
  132. package/.agents/skills/impeccable/reference/typography.md +142 -0
  133. package/.agents/skills/impeccable/reference/ux-writing.md +107 -0
  134. package/.agents/skills/impeccable/scripts/cleanup-deprecated.mjs +214 -0
  135. package/.agents/skills/init/SKILL.md +138 -0
  136. package/.agents/skills/layout/SKILL.md +125 -0
  137. package/.agents/skills/liteparse/SKILL.md +222 -0
  138. package/.agents/skills/memory-systems/SKILL.md +219 -0
  139. package/.agents/skills/memory-systems/references/implementation.md +551 -0
  140. package/.agents/skills/memory-systems/scripts/memory_store.py +616 -0
  141. package/.agents/skills/multi-agent-patterns/SKILL.md +257 -0
  142. package/.agents/skills/multi-agent-patterns/references/frameworks.md +433 -0
  143. package/.agents/skills/multi-agent-patterns/scripts/coordination.py +613 -0
  144. package/.agents/skills/normalize/SKILL.md +70 -0
  145. package/.agents/skills/onboard/SKILL.md +245 -0
  146. package/.agents/skills/opentui/SKILL.md +201 -0
  147. package/.agents/skills/opentui/references/animation/REFERENCE.md +431 -0
  148. package/.agents/skills/opentui/references/components/REFERENCE.md +144 -0
  149. package/.agents/skills/opentui/references/components/code-diff.md +672 -0
  150. package/.agents/skills/opentui/references/components/containers.md +417 -0
  151. package/.agents/skills/opentui/references/components/inputs.md +531 -0
  152. package/.agents/skills/opentui/references/components/text-display.md +386 -0
  153. package/.agents/skills/opentui/references/core/REFERENCE.md +145 -0
  154. package/.agents/skills/opentui/references/core/api.md +543 -0
  155. package/.agents/skills/opentui/references/core/configuration.md +168 -0
  156. package/.agents/skills/opentui/references/core/gotchas.md +393 -0
  157. package/.agents/skills/opentui/references/core/patterns.md +449 -0
  158. package/.agents/skills/opentui/references/keyboard/REFERENCE.md +617 -0
  159. package/.agents/skills/opentui/references/layout/REFERENCE.md +337 -0
  160. package/.agents/skills/opentui/references/layout/patterns.md +444 -0
  161. package/.agents/skills/opentui/references/react/REFERENCE.md +174 -0
  162. package/.agents/skills/opentui/references/react/api.md +436 -0
  163. package/.agents/skills/opentui/references/react/configuration.md +302 -0
  164. package/.agents/skills/opentui/references/react/gotchas.md +443 -0
  165. package/.agents/skills/opentui/references/react/patterns.md +501 -0
  166. package/.agents/skills/opentui/references/solid/REFERENCE.md +201 -0
  167. package/.agents/skills/opentui/references/solid/api.md +564 -0
  168. package/.agents/skills/opentui/references/solid/configuration.md +316 -0
  169. package/.agents/skills/opentui/references/solid/gotchas.md +427 -0
  170. package/.agents/skills/opentui/references/solid/patterns.md +560 -0
  171. package/.agents/skills/opentui/references/testing/REFERENCE.md +614 -0
  172. package/.agents/skills/optimize/SKILL.md +266 -0
  173. package/.agents/skills/overdrive/SKILL.md +142 -0
  174. package/.agents/skills/pdf/LICENSE.txt +30 -0
  175. package/.agents/skills/pdf/SKILL.md +314 -0
  176. package/.agents/skills/pdf/forms.md +294 -0
  177. package/.agents/skills/pdf/reference.md +612 -0
  178. package/.agents/skills/pdf/scripts/check_bounding_boxes.py +65 -0
  179. package/.agents/skills/pdf/scripts/check_fillable_fields.py +11 -0
  180. package/.agents/skills/pdf/scripts/convert_pdf_to_images.py +33 -0
  181. package/.agents/skills/pdf/scripts/create_validation_image.py +37 -0
  182. package/.agents/skills/pdf/scripts/extract_form_field_info.py +122 -0
  183. package/.agents/skills/pdf/scripts/extract_form_structure.py +115 -0
  184. package/.agents/skills/pdf/scripts/fill_fillable_fields.py +98 -0
  185. package/.agents/skills/pdf/scripts/fill_pdf_form_with_annotations.py +107 -0
  186. package/.agents/skills/playwright-cli/SKILL.md +344 -0
  187. package/.agents/skills/playwright-cli/references/element-attributes.md +23 -0
  188. package/.agents/skills/playwright-cli/references/playwright-tests.md +39 -0
  189. package/.agents/skills/playwright-cli/references/request-mocking.md +87 -0
  190. package/.agents/skills/playwright-cli/references/running-code.md +231 -0
  191. package/.agents/skills/playwright-cli/references/session-management.md +169 -0
  192. package/.agents/skills/playwright-cli/references/storage-state.md +275 -0
  193. package/.agents/skills/playwright-cli/references/test-generation.md +88 -0
  194. package/.agents/skills/playwright-cli/references/tracing.md +139 -0
  195. package/.agents/skills/playwright-cli/references/video-recording.md +143 -0
  196. package/.agents/skills/polish/SKILL.md +224 -0
  197. package/.agents/skills/pptx/LICENSE.txt +30 -0
  198. package/.agents/skills/pptx/SKILL.md +232 -0
  199. package/.agents/skills/pptx/editing.md +205 -0
  200. package/.agents/skills/pptx/pptxgenjs.md +420 -0
  201. package/.agents/skills/pptx/scripts/__init__.py +0 -0
  202. package/.agents/skills/pptx/scripts/add_slide.py +195 -0
  203. package/.agents/skills/pptx/scripts/clean.py +286 -0
  204. package/.agents/skills/pptx/scripts/office/helpers/__init__.py +0 -0
  205. package/.agents/skills/pptx/scripts/office/helpers/merge_runs.py +199 -0
  206. package/.agents/skills/pptx/scripts/office/helpers/simplify_redlines.py +197 -0
  207. package/.agents/skills/pptx/scripts/office/pack.py +159 -0
  208. package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  209. package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  210. package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  211. package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  212. package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  213. package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  214. package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  215. package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  216. package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  217. package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  218. package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  219. package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  220. package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  221. package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  222. package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  223. package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  224. package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  225. package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  226. package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  227. package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  228. package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  229. package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  230. package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  231. package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  232. package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  233. package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  234. package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  235. package/.agents/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  236. package/.agents/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  237. package/.agents/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  238. package/.agents/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  239. package/.agents/skills/pptx/scripts/office/schemas/mce/mc.xsd +75 -0
  240. package/.agents/skills/pptx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
  241. package/.agents/skills/pptx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
  242. package/.agents/skills/pptx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
  243. package/.agents/skills/pptx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
  244. package/.agents/skills/pptx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
  245. package/.agents/skills/pptx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  246. package/.agents/skills/pptx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
  247. package/.agents/skills/pptx/scripts/office/soffice.py +183 -0
  248. package/.agents/skills/pptx/scripts/office/unpack.py +132 -0
  249. package/.agents/skills/pptx/scripts/office/validate.py +111 -0
  250. package/.agents/skills/pptx/scripts/office/validators/__init__.py +15 -0
  251. package/.agents/skills/pptx/scripts/office/validators/base.py +847 -0
  252. package/.agents/skills/pptx/scripts/office/validators/docx.py +446 -0
  253. package/.agents/skills/pptx/scripts/office/validators/pptx.py +275 -0
  254. package/.agents/skills/pptx/scripts/office/validators/redlining.py +247 -0
  255. package/.agents/skills/pptx/scripts/thumbnail.py +289 -0
  256. package/.agents/skills/project-development/SKILL.md +291 -0
  257. package/.agents/skills/project-development/references/case-studies.md +388 -0
  258. package/.agents/skills/project-development/references/pipeline-patterns.md +610 -0
  259. package/.agents/skills/project-development/scripts/pipeline_template.py +796 -0
  260. package/.agents/skills/prompt-engineer/SKILL.md +263 -0
  261. package/.agents/skills/prompt-engineer/references/advanced_patterns.md +271 -0
  262. package/.agents/skills/prompt-engineer/references/core_prompting.md +137 -0
  263. package/.agents/skills/prompt-engineer/references/quality_improvement.md +193 -0
  264. package/.agents/skills/quieter/SKILL.md +103 -0
  265. package/.agents/skills/research-codebase/SKILL.md +227 -0
  266. package/.agents/skills/shape/SKILL.md +96 -0
  267. package/.agents/skills/skill-creator/LICENSE.txt +202 -0
  268. package/.agents/skills/skill-creator/SKILL.md +485 -0
  269. package/.agents/skills/skill-creator/agents/analyzer.md +274 -0
  270. package/.agents/skills/skill-creator/agents/comparator.md +202 -0
  271. package/.agents/skills/skill-creator/agents/grader.md +223 -0
  272. package/.agents/skills/skill-creator/assets/eval_review.html +146 -0
  273. package/.agents/skills/skill-creator/eval-viewer/generate_review.py +471 -0
  274. package/.agents/skills/skill-creator/eval-viewer/viewer.html +1325 -0
  275. package/.agents/skills/skill-creator/references/schemas.md +430 -0
  276. package/.agents/skills/skill-creator/scripts/__init__.py +0 -0
  277. package/.agents/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
  278. package/.agents/skills/skill-creator/scripts/generate_report.py +326 -0
  279. package/.agents/skills/skill-creator/scripts/improve_description.py +247 -0
  280. package/.agents/skills/skill-creator/scripts/package_skill.py +136 -0
  281. package/.agents/skills/skill-creator/scripts/quick_validate.py +103 -0
  282. package/.agents/skills/skill-creator/scripts/run_eval.py +310 -0
  283. package/.agents/skills/skill-creator/scripts/run_loop.py +328 -0
  284. package/.agents/skills/skill-creator/scripts/utils.py +47 -0
  285. package/.agents/skills/sl-commit/SKILL.md +51 -0
  286. package/.agents/skills/sl-submit-diff/SKILL.md +55 -0
  287. package/.agents/skills/teach-impeccable/SKILL.md +71 -0
  288. package/.agents/skills/test-driven-development/SKILL.md +371 -0
  289. package/.agents/skills/test-driven-development/testing-anti-patterns.md +299 -0
  290. package/.agents/skills/tool-design/SKILL.md +271 -0
  291. package/.agents/skills/tool-design/references/architectural_reduction.md +210 -0
  292. package/.agents/skills/tool-design/references/best_practices.md +176 -0
  293. package/.agents/skills/tool-design/scripts/description_generator.py +528 -0
  294. package/.agents/skills/typescript-advanced-types/SKILL.md +719 -0
  295. package/.agents/skills/typescript-expert/SKILL.md +428 -0
  296. package/.agents/skills/typescript-expert/references/tsconfig-strict.json +92 -0
  297. package/.agents/skills/typescript-expert/references/typescript-cheatsheet.md +383 -0
  298. package/.agents/skills/typescript-expert/references/utility-types.ts +335 -0
  299. package/.agents/skills/typescript-expert/scripts/ts_diagnostic.py +203 -0
  300. package/.agents/skills/typescript-react-reviewer/SKILL.md +200 -0
  301. package/.agents/skills/typescript-react-reviewer/references/antipatterns.md +510 -0
  302. package/.agents/skills/typescript-react-reviewer/references/checklist.md +267 -0
  303. package/.agents/skills/typescript-react-reviewer/references/react19-patterns.md +305 -0
  304. package/.agents/skills/typeset/SKILL.md +116 -0
  305. package/.agents/skills/workflow-creator/SKILL.md +337 -0
  306. package/.agents/skills/workflow-creator/references/agent-sessions.md +789 -0
  307. package/.agents/skills/workflow-creator/references/computation-and-validation.md +224 -0
  308. package/.agents/skills/workflow-creator/references/control-flow.md +450 -0
  309. package/.agents/skills/workflow-creator/references/discovery-and-verification.md +156 -0
  310. package/.agents/skills/workflow-creator/references/failure-modes.md +732 -0
  311. package/.agents/skills/workflow-creator/references/getting-started.md +289 -0
  312. package/.agents/skills/workflow-creator/references/session-config.md +355 -0
  313. package/.agents/skills/workflow-creator/references/state-and-data-flow.md +374 -0
  314. package/.agents/skills/workflow-creator/references/user-input.md +206 -0
  315. package/.agents/skills/workflow-creator/references/workflow-inputs.md +274 -0
  316. package/.agents/skills/xlsx/LICENSE.txt +30 -0
  317. package/.agents/skills/xlsx/SKILL.md +292 -0
  318. package/.agents/skills/xlsx/scripts/office/helpers/__init__.py +0 -0
  319. package/.agents/skills/xlsx/scripts/office/helpers/merge_runs.py +199 -0
  320. package/.agents/skills/xlsx/scripts/office/helpers/simplify_redlines.py +197 -0
  321. package/.agents/skills/xlsx/scripts/office/pack.py +159 -0
  322. package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  323. package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  324. package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  325. package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  326. package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  327. package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  328. package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  329. package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  330. package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  331. package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  332. package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  333. package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  334. package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  335. package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  336. package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  337. package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  338. package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  339. package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  340. package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  341. package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  342. package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  343. package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  344. package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  345. package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  346. package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  347. package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  348. package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  349. package/.agents/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  350. package/.agents/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  351. package/.agents/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  352. package/.agents/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  353. package/.agents/skills/xlsx/scripts/office/schemas/mce/mc.xsd +75 -0
  354. package/.agents/skills/xlsx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
  355. package/.agents/skills/xlsx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
  356. package/.agents/skills/xlsx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
  357. package/.agents/skills/xlsx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
  358. package/.agents/skills/xlsx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
  359. package/.agents/skills/xlsx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  360. package/.agents/skills/xlsx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
  361. package/.agents/skills/xlsx/scripts/office/soffice.py +183 -0
  362. package/.agents/skills/xlsx/scripts/office/unpack.py +132 -0
  363. package/.agents/skills/xlsx/scripts/office/validate.py +111 -0
  364. package/.agents/skills/xlsx/scripts/office/validators/__init__.py +15 -0
  365. package/.agents/skills/xlsx/scripts/office/validators/base.py +847 -0
  366. package/.agents/skills/xlsx/scripts/office/validators/docx.py +446 -0
  367. package/.agents/skills/xlsx/scripts/office/validators/pptx.py +275 -0
  368. package/.agents/skills/xlsx/scripts/office/validators/redlining.py +247 -0
  369. package/.agents/skills/xlsx/scripts/recalc.py +184 -0
  370. package/.claude/agents/reviewer.md +1 -0
  371. package/.github/agents/reviewer.md +1 -0
  372. package/.opencode/agents/reviewer.md +1 -0
  373. package/README.md +274 -169
  374. package/package.json +6 -7
  375. package/src/commands/cli/init/index.ts +2 -2
  376. package/src/commands/cli/init/scm.ts +7 -8
  377. package/src/commands/cli/workflow-command.test.ts +74 -0
  378. package/src/commands/cli/workflow.ts +7 -2
  379. package/src/scripts/bundle-configs.ts +128 -0
  380. package/src/sdk/components/compact-switcher.tsx +1 -1
  381. package/src/sdk/components/orchestrator-panel-store.ts +13 -0
  382. package/src/sdk/components/orchestrator-panel.tsx +10 -0
  383. package/src/sdk/components/statusline.tsx +13 -1
  384. package/src/sdk/providers/claude.ts +42 -0
  385. package/src/sdk/runtime/executor.ts +111 -32
  386. package/src/sdk/types.ts +7 -0
  387. package/src/sdk/workflows/builtin/ralph/claude/index.ts +132 -76
  388. package/src/sdk/workflows/builtin/ralph/copilot/index.ts +129 -71
  389. package/src/sdk/workflows/builtin/ralph/helpers/git.ts +184 -17
  390. package/src/sdk/workflows/builtin/ralph/helpers/prompts.ts +463 -79
  391. package/src/sdk/workflows/builtin/ralph/opencode/index.ts +124 -80
  392. package/src/services/system/auto-sync.ts +31 -51
  393. package/src/services/system/skills.ts +56 -60
  394. package/dist/lib/path-root-guard.d.ts +0 -4
  395. package/dist/lib/path-root-guard.d.ts.map +0 -1
  396. package/dist/sdk/components/color-utils.d.ts +0 -4
  397. package/dist/sdk/components/color-utils.d.ts.map +0 -1
  398. package/dist/sdk/components/compact-switcher.d.ts +0 -10
  399. package/dist/sdk/components/compact-switcher.d.ts.map +0 -1
  400. package/dist/sdk/components/connectors.d.ts +0 -15
  401. package/dist/sdk/components/connectors.d.ts.map +0 -1
  402. package/dist/sdk/components/connectors.test.d.ts +0 -2
  403. package/dist/sdk/components/connectors.test.d.ts.map +0 -1
  404. package/dist/sdk/components/edge.d.ts +0 -4
  405. package/dist/sdk/components/edge.d.ts.map +0 -1
  406. package/dist/sdk/components/error-boundary.d.ts +0 -23
  407. package/dist/sdk/components/error-boundary.d.ts.map +0 -1
  408. package/dist/sdk/components/graph-theme.d.ts +0 -17
  409. package/dist/sdk/components/graph-theme.d.ts.map +0 -1
  410. package/dist/sdk/components/header.d.ts +0 -3
  411. package/dist/sdk/components/header.d.ts.map +0 -1
  412. package/dist/sdk/components/hooks.d.ts +0 -15
  413. package/dist/sdk/components/hooks.d.ts.map +0 -1
  414. package/dist/sdk/components/layout.d.ts +0 -27
  415. package/dist/sdk/components/layout.d.ts.map +0 -1
  416. package/dist/sdk/components/layout.test.d.ts +0 -2
  417. package/dist/sdk/components/layout.test.d.ts.map +0 -1
  418. package/dist/sdk/components/node-card.d.ts +0 -10
  419. package/dist/sdk/components/node-card.d.ts.map +0 -1
  420. package/dist/sdk/components/orchestrator-panel-contexts.d.ts +0 -16
  421. package/dist/sdk/components/orchestrator-panel-contexts.d.ts.map +0 -1
  422. package/dist/sdk/components/orchestrator-panel-store.d.ts +0 -46
  423. package/dist/sdk/components/orchestrator-panel-store.d.ts.map +0 -1
  424. package/dist/sdk/components/orchestrator-panel-store.test.d.ts +0 -2
  425. package/dist/sdk/components/orchestrator-panel-store.test.d.ts.map +0 -1
  426. package/dist/sdk/components/orchestrator-panel-types.d.ts +0 -18
  427. package/dist/sdk/components/orchestrator-panel-types.d.ts.map +0 -1
  428. package/dist/sdk/components/orchestrator-panel.d.ts +0 -52
  429. package/dist/sdk/components/orchestrator-panel.d.ts.map +0 -1
  430. package/dist/sdk/components/session-graph-panel.d.ts +0 -7
  431. package/dist/sdk/components/session-graph-panel.d.ts.map +0 -1
  432. package/dist/sdk/components/status-helpers.d.ts +0 -6
  433. package/dist/sdk/components/status-helpers.d.ts.map +0 -1
  434. package/dist/sdk/components/statusline.d.ts +0 -7
  435. package/dist/sdk/components/statusline.d.ts.map +0 -1
  436. package/dist/sdk/components/workflow-picker-panel.d.ts +0 -123
  437. package/dist/sdk/components/workflow-picker-panel.d.ts.map +0 -1
  438. package/dist/sdk/define-workflow.d.ts +0 -78
  439. package/dist/sdk/define-workflow.d.ts.map +0 -1
  440. package/dist/sdk/define-workflow.test.d.ts +0 -2
  441. package/dist/sdk/define-workflow.test.d.ts.map +0 -1
  442. package/dist/sdk/errors.d.ts +0 -24
  443. package/dist/sdk/errors.d.ts.map +0 -1
  444. package/dist/sdk/errors.test.d.ts +0 -2
  445. package/dist/sdk/errors.test.d.ts.map +0 -1
  446. package/dist/sdk/index.d.ts +0 -13
  447. package/dist/sdk/index.d.ts.map +0 -1
  448. package/dist/sdk/providers/claude.d.ts +0 -170
  449. package/dist/sdk/providers/claude.d.ts.map +0 -1
  450. package/dist/sdk/providers/copilot.d.ts +0 -11
  451. package/dist/sdk/providers/copilot.d.ts.map +0 -1
  452. package/dist/sdk/providers/opencode.d.ts +0 -11
  453. package/dist/sdk/providers/opencode.d.ts.map +0 -1
  454. package/dist/sdk/runtime/discovery.d.ts +0 -86
  455. package/dist/sdk/runtime/discovery.d.ts.map +0 -1
  456. package/dist/sdk/runtime/executor-entry.d.ts +0 -11
  457. package/dist/sdk/runtime/executor-entry.d.ts.map +0 -1
  458. package/dist/sdk/runtime/executor.d.ts +0 -72
  459. package/dist/sdk/runtime/executor.d.ts.map +0 -1
  460. package/dist/sdk/runtime/executor.test.d.ts +0 -2
  461. package/dist/sdk/runtime/executor.test.d.ts.map +0 -1
  462. package/dist/sdk/runtime/graph-inference.d.ts +0 -35
  463. package/dist/sdk/runtime/graph-inference.d.ts.map +0 -1
  464. package/dist/sdk/runtime/loader.d.ts +0 -70
  465. package/dist/sdk/runtime/loader.d.ts.map +0 -1
  466. package/dist/sdk/runtime/panel.d.ts +0 -9
  467. package/dist/sdk/runtime/panel.d.ts.map +0 -1
  468. package/dist/sdk/runtime/theme.d.ts +0 -28
  469. package/dist/sdk/runtime/theme.d.ts.map +0 -1
  470. package/dist/sdk/runtime/tmux.d.ts +0 -297
  471. package/dist/sdk/runtime/tmux.d.ts.map +0 -1
  472. package/dist/sdk/types.d.ts +0 -295
  473. package/dist/sdk/types.d.ts.map +0 -1
  474. package/dist/sdk/workflows/builtin/deep-research-codebase/claude/index.d.ts +0 -62
  475. package/dist/sdk/workflows/builtin/deep-research-codebase/claude/index.d.ts.map +0 -1
  476. package/dist/sdk/workflows/builtin/deep-research-codebase/copilot/index.d.ts +0 -46
  477. package/dist/sdk/workflows/builtin/deep-research-codebase/copilot/index.d.ts.map +0 -1
  478. package/dist/sdk/workflows/builtin/deep-research-codebase/helpers/heuristic.d.ts +0 -26
  479. package/dist/sdk/workflows/builtin/deep-research-codebase/helpers/heuristic.d.ts.map +0 -1
  480. package/dist/sdk/workflows/builtin/deep-research-codebase/helpers/prompts.d.ts +0 -92
  481. package/dist/sdk/workflows/builtin/deep-research-codebase/helpers/prompts.d.ts.map +0 -1
  482. package/dist/sdk/workflows/builtin/deep-research-codebase/helpers/scout.d.ts +0 -57
  483. package/dist/sdk/workflows/builtin/deep-research-codebase/helpers/scout.d.ts.map +0 -1
  484. package/dist/sdk/workflows/builtin/deep-research-codebase/opencode/index.d.ts +0 -49
  485. package/dist/sdk/workflows/builtin/deep-research-codebase/opencode/index.d.ts.map +0 -1
  486. package/dist/sdk/workflows/builtin/ralph/claude/index.d.ts +0 -14
  487. package/dist/sdk/workflows/builtin/ralph/claude/index.d.ts.map +0 -1
  488. package/dist/sdk/workflows/builtin/ralph/copilot/index.d.ts +0 -14
  489. package/dist/sdk/workflows/builtin/ralph/copilot/index.d.ts.map +0 -1
  490. package/dist/sdk/workflows/builtin/ralph/helpers/git.d.ts +0 -17
  491. package/dist/sdk/workflows/builtin/ralph/helpers/git.d.ts.map +0 -1
  492. package/dist/sdk/workflows/builtin/ralph/helpers/prompts.d.ts +0 -119
  493. package/dist/sdk/workflows/builtin/ralph/helpers/prompts.d.ts.map +0 -1
  494. package/dist/sdk/workflows/builtin/ralph/helpers/review.d.ts +0 -20
  495. package/dist/sdk/workflows/builtin/ralph/helpers/review.d.ts.map +0 -1
  496. package/dist/sdk/workflows/builtin/ralph/opencode/index.d.ts +0 -14
  497. package/dist/sdk/workflows/builtin/ralph/opencode/index.d.ts.map +0 -1
  498. package/dist/sdk/workflows/index.d.ts +0 -24
  499. package/dist/sdk/workflows/index.d.ts.map +0 -1
  500. package/dist/services/config/definitions.d.ts +0 -85
  501. package/dist/services/config/definitions.d.ts.map +0 -1
  502. package/dist/services/system/copy.d.ts +0 -77
  503. package/dist/services/system/copy.d.ts.map +0 -1
  504. package/dist/services/system/detect.d.ts +0 -75
  505. package/dist/services/system/detect.d.ts.map +0 -1
  506. package/tsconfig.json +0 -33
@@ -0,0 +1,590 @@
1
+ """
2
+ Sandbox Manager for Hosted Agent Infrastructure.
3
+
4
+ Use when: building background coding agents that need sandboxed execution
5
+ environments with pre-built images, warm pools, and session snapshots.
6
+
7
+ This module provides composable building blocks for sandbox lifecycle
8
+ management. Each class handles one concern (image building, warm pools,
9
+ session coordination) and can be used independently or combined via
10
+ SandboxManager.
11
+
12
+ Note: This is pseudocode demonstrating architectural patterns.
13
+ Adapt for your specific infrastructure (Modal, Fly.io, etc.).
14
+ """
15
+
16
+ from dataclasses import dataclass, field
17
+ from datetime import datetime, timedelta
18
+ from typing import Optional, Callable, Any
19
+ from enum import Enum
20
+ import asyncio
21
+
22
+ __all__ = [
23
+ "SandboxState",
24
+ "UserIdentity",
25
+ "SandboxConfig",
26
+ "Sandbox",
27
+ "RepositoryImage",
28
+ "ImageBuilder",
29
+ "WarmSandbox",
30
+ "WarmPoolManager",
31
+ "SandboxManager",
32
+ "AgentSession",
33
+ ]
34
+
35
+
36
+ class SandboxState(Enum):
37
+ """Sandbox lifecycle states."""
38
+ CREATING = "creating"
39
+ SYNCING = "syncing"
40
+ READY = "ready"
41
+ EXECUTING = "executing"
42
+ SNAPSHOTTING = "snapshotting"
43
+ TERMINATED = "terminated"
44
+
45
+
46
+ @dataclass
47
+ class UserIdentity:
48
+ """User identity for commit attribution.
49
+
50
+ Use when: configuring sandbox git identity so commits are
51
+ attributed to the prompting user, not the app.
52
+ """
53
+ id: str
54
+ name: str
55
+ email: str
56
+ github_token: str
57
+
58
+
59
+ @dataclass
60
+ class SandboxConfig:
61
+ """Configuration for sandbox creation.
62
+
63
+ Use when: defining resource limits and timeouts for a new sandbox
64
+ to prevent cost runaway and resource exhaustion.
65
+ """
66
+ repo_url: str
67
+ base_image: str
68
+ memory_mb: int = 4096
69
+ cpu_cores: int = 2
70
+ disk_gb: int = 10
71
+ timeout_hours: int = 4
72
+
73
+
74
+ @dataclass
75
+ class Sandbox:
76
+ """Represents a sandboxed execution environment.
77
+
78
+ Use when: interacting with a running sandbox to execute commands,
79
+ read/write files, or take snapshots for session continuity.
80
+ """
81
+ id: str
82
+ config: SandboxConfig
83
+ state: SandboxState
84
+ created_at: datetime
85
+ snapshot_id: Optional[str] = None
86
+ current_user: Optional[UserIdentity] = None
87
+
88
+ # Event handlers
89
+ on_state_change: Optional[Callable[[SandboxState], None]] = None
90
+
91
+ async def execute_command(self, command: str) -> dict[str, Any]:
92
+ """Execute a command in the sandbox.
93
+
94
+ Use when: running shell commands (git, build tools, tests)
95
+ inside the isolated environment.
96
+
97
+ Returns:
98
+ dict with keys "stdout", "stderr", "exit_code".
99
+ """
100
+ # Implementation depends on infrastructure
101
+ pass
102
+
103
+ async def read_file(self, path: str) -> str:
104
+ """Read a file from the sandbox filesystem.
105
+
106
+ Use when: agent needs to inspect source code or config files.
107
+ Safe to call before git sync completes.
108
+ """
109
+ pass
110
+
111
+ async def write_file(self, path: str, content: str) -> None:
112
+ """Write a file to the sandbox filesystem.
113
+
114
+ Use when: agent needs to modify source code. Block this
115
+ until git sync completes to avoid write conflicts.
116
+ """
117
+ pass
118
+
119
+ async def snapshot(self) -> str:
120
+ """Create a snapshot of current filesystem state.
121
+
122
+ Use when: preserving session state before sandbox termination
123
+ so follow-up prompts can restore instantly.
124
+ """
125
+ self.state = SandboxState.SNAPSHOTTING
126
+ snapshot_id = await self._create_snapshot()
127
+ self.snapshot_id = snapshot_id
128
+ self.state = SandboxState.READY
129
+ return snapshot_id
130
+
131
+ async def _create_snapshot(self) -> str:
132
+ """Create snapshot (infrastructure-specific)."""
133
+ pass
134
+
135
+ async def restore(self, snapshot_id: str) -> None:
136
+ """Restore sandbox to a previous snapshot."""
137
+ pass
138
+
139
+ async def terminate(self) -> None:
140
+ """Terminate the sandbox."""
141
+ self.state = SandboxState.TERMINATED
142
+
143
+
144
+ @dataclass
145
+ class RepositoryImage:
146
+ """Pre-built image for a repository.
147
+
148
+ Use when: checking whether a cached environment image exists
149
+ and whether it is recent enough to use.
150
+ """
151
+ repo_url: str
152
+ image_id: str
153
+ commit_sha: str
154
+ built_at: datetime
155
+
156
+ def is_stale(self, max_age: timedelta = timedelta(minutes=30)) -> bool:
157
+ """Check if image is older than max age."""
158
+ return datetime.utcnow() - self.built_at > max_age
159
+
160
+
161
+ class ImageBuilder:
162
+ """Builds and manages repository images.
163
+
164
+ Use when: setting up the periodic image build loop that
165
+ pre-bakes development environments for fast sandbox spin-up.
166
+ """
167
+
168
+ def __init__(self, github_app_token_provider: Callable[[], str]) -> None:
169
+ self.token_provider = github_app_token_provider
170
+ self.images: dict[str, RepositoryImage] = {}
171
+
172
+ async def build_image(self, repo_url: str) -> RepositoryImage:
173
+ """Build a new image for a repository.
174
+
175
+ Use when: the current image is stale or no image exists yet.
176
+ Runs clone, dependency install, build, and cache warming.
177
+ """
178
+ print(f"Building image for {repo_url}...")
179
+
180
+ # Get fresh token for clone
181
+ token = self.token_provider()
182
+
183
+ # These operations run in build environment
184
+ build_steps: list[str] = [
185
+ # Clone repository
186
+ f"git clone https://x-access-token:{token}@github.com/{repo_url} /workspace",
187
+
188
+ # Install dependencies
189
+ "cd /workspace && npm install",
190
+
191
+ # Run build
192
+ "cd /workspace && npm run build",
193
+
194
+ # Warm caches by running once
195
+ "cd /workspace && npm run dev &",
196
+ "sleep 5", # Let dev server start
197
+ "cd /workspace && npm test -- --run || true", # Run tests to warm cache
198
+ ]
199
+
200
+ # Execute build steps (infrastructure-specific)
201
+ for step in build_steps:
202
+ await self._execute_build_step(step)
203
+
204
+ # Get current commit
205
+ commit_sha: str = await self._get_commit_sha()
206
+
207
+ # Create and store image
208
+ image = RepositoryImage(
209
+ repo_url=repo_url,
210
+ image_id=await self._finalize_image(),
211
+ commit_sha=commit_sha,
212
+ built_at=datetime.utcnow()
213
+ )
214
+
215
+ self.images[repo_url] = image
216
+ return image
217
+
218
+ def get_latest_image(self, repo_url: str) -> Optional[RepositoryImage]:
219
+ """Get the most recent image for a repository."""
220
+ return self.images.get(repo_url)
221
+
222
+ async def _execute_build_step(self, command: str) -> None:
223
+ """Execute a build step (infrastructure-specific)."""
224
+ pass
225
+
226
+ async def _get_commit_sha(self) -> str:
227
+ """Get current HEAD commit SHA."""
228
+ pass
229
+
230
+ async def _finalize_image(self) -> str:
231
+ """Finalize and store the image, return image ID."""
232
+ pass
233
+
234
+
235
+ @dataclass
236
+ class WarmSandbox:
237
+ """A pre-warmed sandbox ready for use.
238
+
239
+ Use when: tracking warm pool inventory and claiming a sandbox
240
+ for an incoming user session.
241
+ """
242
+ sandbox: Sandbox
243
+ repo_url: str
244
+ created_at: datetime
245
+ image_version: str
246
+ is_claimed: bool = False
247
+ sync_complete: bool = False
248
+
249
+
250
+ class WarmPoolManager:
251
+ """Manages pools of pre-warmed sandboxes.
252
+
253
+ Use when: reducing cold start latency by maintaining ready-to-use
254
+ sandboxes that are pre-synced to the latest code.
255
+ """
256
+
257
+ def __init__(
258
+ self,
259
+ image_builder: ImageBuilder,
260
+ target_pool_size: int = 3,
261
+ max_age: timedelta = timedelta(minutes=25)
262
+ ) -> None:
263
+ self.image_builder = image_builder
264
+ self.target_size = target_pool_size
265
+ self.max_age = max_age
266
+ self.pools: dict[str, list[WarmSandbox]] = {}
267
+
268
+ async def get_warm_sandbox(self, repo_url: str) -> Optional[WarmSandbox]:
269
+ """Get a pre-warmed sandbox if available.
270
+
271
+ Use when: a user submits a prompt and needs a sandbox immediately.
272
+ Returns None if no valid warm sandbox is available.
273
+ """
274
+ if repo_url not in self.pools:
275
+ return None
276
+
277
+ for warm in self.pools[repo_url]:
278
+ if not warm.is_claimed and self._is_valid(warm):
279
+ warm.is_claimed = True
280
+ return warm
281
+
282
+ return None
283
+
284
+ def _is_valid(self, warm: WarmSandbox) -> bool:
285
+ """Check if a warm sandbox is still valid."""
286
+ age: timedelta = datetime.utcnow() - warm.created_at
287
+ if age > self.max_age:
288
+ return False
289
+
290
+ # Check if image is still current
291
+ current = self.image_builder.get_latest_image(warm.repo_url)
292
+ if not current or current.image_id != warm.image_version:
293
+ return False
294
+
295
+ return True
296
+
297
+ async def maintain_pool(self, repo_url: str) -> None:
298
+ """Ensure pool has target number of warm sandboxes.
299
+
300
+ Use when: called periodically or after an image rebuild to
301
+ keep the warm pool populated.
302
+ """
303
+ if repo_url not in self.pools:
304
+ self.pools[repo_url] = []
305
+
306
+ # Remove invalid sandboxes
307
+ valid: list[WarmSandbox] = [w for w in self.pools[repo_url] if self._is_valid(w)]
308
+ self.pools[repo_url] = valid
309
+
310
+ # Count available (unclaimed) sandboxes
311
+ available: int = len([w for w in valid if not w.is_claimed])
312
+ needed: int = self.target_size - available
313
+
314
+ # Create new warm sandboxes
315
+ for _ in range(max(0, needed)):
316
+ warm = await self._create_warm_sandbox(repo_url)
317
+ self.pools[repo_url].append(warm)
318
+
319
+ async def _create_warm_sandbox(self, repo_url: str) -> WarmSandbox:
320
+ """Create a new warm sandbox."""
321
+ image: Optional[RepositoryImage] = self.image_builder.get_latest_image(repo_url)
322
+ if not image:
323
+ raise ValueError(f"No image available for {repo_url}")
324
+
325
+ # Create sandbox from image
326
+ sandbox: Sandbox = await self._create_sandbox_from_image(image)
327
+
328
+ warm = WarmSandbox(
329
+ sandbox=sandbox,
330
+ repo_url=repo_url,
331
+ created_at=datetime.utcnow(),
332
+ image_version=image.image_id,
333
+ sync_complete=False
334
+ )
335
+
336
+ # Start syncing to latest in background
337
+ asyncio.create_task(self._sync_to_latest(warm))
338
+
339
+ return warm
340
+
341
+ async def _sync_to_latest(self, warm: WarmSandbox) -> None:
342
+ """Sync sandbox to latest commit on base branch."""
343
+ await warm.sandbox.execute_command("git fetch origin main")
344
+ await warm.sandbox.execute_command("git reset --hard origin/main")
345
+ warm.sync_complete = True
346
+
347
+ async def _create_sandbox_from_image(self, image: RepositoryImage) -> Sandbox:
348
+ """Create a sandbox from an image (infrastructure-specific)."""
349
+ pass
350
+
351
+
352
+ class SandboxManager:
353
+ """Main manager for sandbox lifecycle.
354
+
355
+ Use when: orchestrating the full sandbox lifecycle including
356
+ image building, warm pools, and session management. This is the
357
+ top-level entry point that composes ImageBuilder and WarmPoolManager.
358
+ """
359
+
360
+ def __init__(
361
+ self,
362
+ repositories: list[str],
363
+ github_app_token_provider: Callable[[], str],
364
+ build_interval: timedelta = timedelta(minutes=30)
365
+ ) -> None:
366
+ self.repositories = repositories
367
+ self.image_builder = ImageBuilder(github_app_token_provider)
368
+ self.warm_pool = WarmPoolManager(self.image_builder)
369
+ self.build_interval = build_interval
370
+ self.active_sessions: dict[str, Sandbox] = {}
371
+
372
+ async def start_build_loop(self) -> None:
373
+ """Start the background image build loop.
374
+
375
+ Use when: initializing the system. Runs indefinitely, rebuilding
376
+ images every build_interval to keep environments fresh.
377
+ """
378
+ while True:
379
+ for repo in self.repositories:
380
+ try:
381
+ await self.image_builder.build_image(repo)
382
+ await self.warm_pool.maintain_pool(repo)
383
+ except Exception as e:
384
+ print(f"Failed to build {repo}: {e}")
385
+
386
+ await asyncio.sleep(self.build_interval.total_seconds())
387
+
388
+ async def start_session(
389
+ self,
390
+ repo_url: str,
391
+ user: UserIdentity,
392
+ snapshot_id: Optional[str] = None
393
+ ) -> Sandbox:
394
+ """Start a new session for a user.
395
+
396
+ Use when: a user submits a prompt. Tries warm pool first,
397
+ then snapshot restore, then cold start as fallback.
398
+ """
399
+ # Try to get from warm pool first
400
+ warm: Optional[WarmSandbox] = await self.warm_pool.get_warm_sandbox(repo_url)
401
+
402
+ if warm:
403
+ sandbox = warm.sandbox
404
+ # Wait for sync if not complete
405
+ if not warm.sync_complete:
406
+ await self._wait_for_sync(warm)
407
+ elif snapshot_id:
408
+ # Restore from previous session snapshot
409
+ sandbox = await self._restore_from_snapshot(snapshot_id)
410
+ else:
411
+ # Cold start from latest image
412
+ sandbox = await self._cold_start(repo_url)
413
+
414
+ # Configure for user
415
+ await self._configure_for_user(sandbox, user)
416
+
417
+ # Track session
418
+ session_id: str = f"{user.id}_{datetime.utcnow().isoformat()}"
419
+ self.active_sessions[session_id] = sandbox
420
+
421
+ return sandbox
422
+
423
+ async def on_user_typing(self, user: UserIdentity, repo_url: str) -> None:
424
+ """Called when user starts typing a prompt.
425
+
426
+ Use when: implementing predictive warm-up. Starts preparing a
427
+ sandbox so it is ready by the time the user submits.
428
+ """
429
+ warm: Optional[WarmSandbox] = await self.warm_pool.get_warm_sandbox(repo_url)
430
+
431
+ if not warm:
432
+ # Start warming one now
433
+ asyncio.create_task(self.warm_pool.maintain_pool(repo_url))
434
+
435
+ async def end_session(self, session_id: str) -> Optional[str]:
436
+ """End a session and return snapshot ID for potential follow-up.
437
+
438
+ Use when: a session completes. Always snapshots before termination
439
+ to prevent state loss.
440
+ """
441
+ if session_id not in self.active_sessions:
442
+ return None
443
+
444
+ sandbox: Sandbox = self.active_sessions[session_id]
445
+
446
+ # Create snapshot before terminating
447
+ snapshot_id: str = await sandbox.snapshot()
448
+
449
+ # Terminate sandbox
450
+ await sandbox.terminate()
451
+
452
+ del self.active_sessions[session_id]
453
+
454
+ return snapshot_id
455
+
456
+ async def _configure_for_user(
457
+ self,
458
+ sandbox: Sandbox,
459
+ user: UserIdentity
460
+ ) -> None:
461
+ """Configure sandbox for a specific user."""
462
+ sandbox.current_user = user
463
+
464
+ # Set git identity
465
+ await sandbox.execute_command(
466
+ f'git config user.name "{user.name}"'
467
+ )
468
+ await sandbox.execute_command(
469
+ f'git config user.email "{user.email}"'
470
+ )
471
+
472
+ async def _wait_for_sync(self, warm: WarmSandbox) -> None:
473
+ """Wait for sync to complete."""
474
+ while not warm.sync_complete:
475
+ await asyncio.sleep(0.1)
476
+
477
+ async def _restore_from_snapshot(self, snapshot_id: str) -> Sandbox:
478
+ """Restore a sandbox from a snapshot."""
479
+ pass
480
+
481
+ async def _cold_start(self, repo_url: str) -> Sandbox:
482
+ """Start a sandbox from cold (no warm pool available)."""
483
+ pass
484
+
485
+
486
+ class AgentSession:
487
+ """Agent session with file read/write coordination.
488
+
489
+ Use when: wrapping a Sandbox to enforce the pattern where reads
490
+ are allowed before sync completes but writes are blocked until
491
+ sync finishes, preventing write conflicts.
492
+ """
493
+
494
+ def __init__(self, sandbox: Sandbox) -> None:
495
+ self.sandbox = sandbox
496
+ self.sync_complete: bool = False
497
+ self.pending_writes: list[tuple[str, str]] = []
498
+
499
+ async def read_file(self, path: str) -> str:
500
+ """Read a file -- allowed even before sync completes.
501
+
502
+ Use when: agent needs to research code immediately. Safe because
503
+ in large repos, files being worked on are unlikely to have
504
+ changed in the last 30 minutes since image build.
505
+ """
506
+ return await self.sandbox.read_file(path)
507
+
508
+ async def write_file(self, path: str, content: str) -> None:
509
+ """Write a file -- blocks until sync is complete.
510
+
511
+ Use when: agent needs to modify source code. Queues the write
512
+ and waits for git sync to finish to prevent conflicts.
513
+ """
514
+ if not self.sync_complete:
515
+ # Queue the write
516
+ self.pending_writes.append((path, content))
517
+ await self._wait_for_sync()
518
+
519
+ await self.sandbox.write_file(path, content)
520
+
521
+ def mark_sync_complete(self) -> None:
522
+ """Called when git sync is complete."""
523
+ self.sync_complete = True
524
+
525
+ async def _wait_for_sync(self) -> None:
526
+ """Wait for sync to complete, then flush pending writes."""
527
+ while not self.sync_complete:
528
+ await asyncio.sleep(0.1)
529
+
530
+ # Flush pending writes
531
+ for path, content in self.pending_writes:
532
+ await self.sandbox.write_file(path, content)
533
+ self.pending_writes.clear()
534
+
535
+
536
+ if __name__ == "__main__":
537
+ async def _demo() -> None:
538
+ """Demonstrate sandbox manager usage end-to-end."""
539
+
540
+ def get_github_token() -> str:
541
+ """Get GitHub App installation token."""
542
+ # Implementation: call GitHub API to get installation token
543
+ return "ghs_xxxx"
544
+
545
+ # Initialize manager with target repositories
546
+ manager = SandboxManager(
547
+ repositories=[
548
+ "myorg/frontend",
549
+ "myorg/backend",
550
+ "myorg/shared-libs"
551
+ ],
552
+ github_app_token_provider=get_github_token
553
+ )
554
+
555
+ # Start background build loop
556
+ asyncio.create_task(manager.start_build_loop())
557
+
558
+ # Simulate user session
559
+ user = UserIdentity(
560
+ id="user123",
561
+ name="Alice Developer",
562
+ email="alice@example.com",
563
+ github_token="gho_user_token"
564
+ )
565
+
566
+ # User starts typing -- predictively warm a sandbox
567
+ await manager.on_user_typing(user, "myorg/frontend")
568
+
569
+ # User submits prompt -- get sandbox
570
+ sandbox: Sandbox = await manager.start_session("myorg/frontend", user)
571
+
572
+ # Create session wrapper for read/write coordination
573
+ session = AgentSession(sandbox)
574
+
575
+ # Agent can read immediately (before sync completes)
576
+ readme: str = await session.read_file("/workspace/README.md")
577
+
578
+ # Agent work happens here...
579
+
580
+ # End session and get snapshot for follow-up
581
+ # Find the session_id that was generated during start_session
582
+ active_ids = list(manager.active_sessions.keys())
583
+ if active_ids:
584
+ session_id = active_ids[0]
585
+ snapshot_id: Optional[str] = await manager.end_session(session_id)
586
+ print(f"Session ended, snapshot: {snapshot_id}")
587
+ else:
588
+ print("No active session found")
589
+
590
+ asyncio.run(_demo())