dsh-compound-engineering 0.0.0-stage → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (461) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +160 -2
  3. package/README.zh.md +161 -0
  4. package/cordis.patch.yml +6 -0
  5. package/lib/frontmatter.js +167 -0
  6. package/lib/index.js +46 -0
  7. package/lib/provider.js +201 -0
  8. package/package.json +62 -4
  9. package/skills/CODING_STANDARDS.md +68 -0
  10. package/skills/ce-babysit-pr/SKILL.md +59 -0
  11. package/skills/ce-babysit-pr/references/branch-currency.md +22 -0
  12. package/skills/ce-babysit-pr/references/envelope.md +44 -0
  13. package/skills/ce-babysit-pr/references/pipeline.md +15 -0
  14. package/skills/ce-babysit-pr/references/report.md +20 -0
  15. package/skills/ce-babysit-pr/references/settle.md +37 -0
  16. package/skills/ce-babysit-pr/references/setup.md +33 -0
  17. package/skills/ce-babysit-pr/references/stack-commands.md +39 -0
  18. package/skills/ce-babysit-pr/references/stack.md +43 -0
  19. package/skills/ce-babysit-pr/references/tick.md +102 -0
  20. package/skills/ce-babysit-pr/references/watch-loop.md +222 -0
  21. package/skills/ce-babysit-pr/scripts/pr-snapshot +3656 -0
  22. package/skills/ce-bakeoff/SKILL.md +48 -0
  23. package/skills/ce-bakeoff/references/candidates.md +37 -0
  24. package/skills/ce-bakeoff/references/judging.md +19 -0
  25. package/skills/ce-bakeoff/references/output.md +11 -0
  26. package/skills/ce-bakeoff/references/verification.md +15 -0
  27. package/skills/ce-brainstorm/SKILL.md +69 -0
  28. package/skills/ce-brainstorm/references/agents/slack-researcher.md +127 -0
  29. package/skills/ce-brainstorm/references/approaches.md +57 -0
  30. package/skills/ce-brainstorm/references/bakeoff.md +9 -0
  31. package/skills/ce-brainstorm/references/blindspot-pass.md +70 -0
  32. package/skills/ce-brainstorm/references/brainstorm-sections.md +458 -0
  33. package/skills/ce-brainstorm/references/dialogue.md +89 -0
  34. package/skills/ce-brainstorm/references/handoff.md +187 -0
  35. package/skills/ce-brainstorm/references/html-rendering.md +638 -0
  36. package/skills/ce-brainstorm/references/interaction-rules.md +33 -0
  37. package/skills/ce-brainstorm/references/markdown-rendering.md +242 -0
  38. package/skills/ce-brainstorm/references/model-tiers.md +13 -0
  39. package/skills/ce-brainstorm/references/output-mode.md +26 -0
  40. package/skills/ce-brainstorm/references/phase-0.md +104 -0
  41. package/skills/ce-brainstorm/references/plan-write.md +32 -0
  42. package/skills/ce-brainstorm/references/product-pressure-test.md +42 -0
  43. package/skills/ce-brainstorm/references/reasoning-elevation.md +124 -0
  44. package/skills/ce-brainstorm/references/settled-decisions.md +45 -0
  45. package/skills/ce-brainstorm/references/synthesis-summary.md +149 -0
  46. package/skills/ce-brainstorm/references/universal-brainstorming.md +72 -0
  47. package/skills/ce-brainstorm/references/verdict-routing.md +26 -0
  48. package/skills/ce-brainstorm/references/visual-probes.md +164 -0
  49. package/skills/ce-brainstorm/scripts/elevation-dispatch.sh +288 -0
  50. package/skills/ce-brainstorm/scripts/light-webserver.js +1275 -0
  51. package/skills/ce-brainstorm/scripts/packs-resolve.py +737 -0
  52. package/skills/ce-brainstorm/scripts/peer-job-runner.py +2594 -0
  53. package/skills/ce-code-review/SKILL.md +40 -0
  54. package/skills/ce-code-review/references/action-class-rubric.md +67 -0
  55. package/skills/ce-code-review/references/cross-model-recovery.md +38 -0
  56. package/skills/ce-code-review/references/cross-model-review.md +191 -0
  57. package/skills/ce-code-review/references/depth-paths.md +32 -0
  58. package/skills/ce-code-review/references/diff-scope.md +59 -0
  59. package/skills/ce-code-review/references/dispatch-reviewers.md +135 -0
  60. package/skills/ce-code-review/references/findings-schema.json +125 -0
  61. package/skills/ce-code-review/references/finish-input.md +118 -0
  62. package/skills/ce-code-review/references/finish-review.md +202 -0
  63. package/skills/ce-code-review/references/intent-and-plan.md +73 -0
  64. package/skills/ce-code-review/references/modes-and-output.md +156 -0
  65. package/skills/ce-code-review/references/persona-catalog.md +66 -0
  66. package/skills/ce-code-review/references/personas/adversarial-reviewer.md +111 -0
  67. package/skills/ce-code-review/references/personas/agent-native-reviewer.md +173 -0
  68. package/skills/ce-code-review/references/personas/api-contract-reviewer.md +44 -0
  69. package/skills/ce-code-review/references/personas/correctness-reviewer.md +48 -0
  70. package/skills/ce-code-review/references/personas/data-migration-reviewer.md +111 -0
  71. package/skills/ce-code-review/references/personas/deployment-verification-agent.md +157 -0
  72. package/skills/ce-code-review/references/personas/julik-frontend-races-reviewer.md +45 -0
  73. package/skills/ce-code-review/references/personas/learnings-researcher.md +260 -0
  74. package/skills/ce-code-review/references/personas/maintainability-reviewer.md +85 -0
  75. package/skills/ce-code-review/references/personas/performance-reviewer.md +45 -0
  76. package/skills/ce-code-review/references/personas/previous-comments-reviewer.md +59 -0
  77. package/skills/ce-code-review/references/personas/project-standards-reviewer.md +77 -0
  78. package/skills/ce-code-review/references/personas/reliability-reviewer.md +49 -0
  79. package/skills/ce-code-review/references/personas/security-reviewer.md +50 -0
  80. package/skills/ce-code-review/references/personas/swift-ios-reviewer.md +99 -0
  81. package/skills/ce-code-review/references/personas/testing-reviewer.md +51 -0
  82. package/skills/ce-code-review/references/review-output-template.md +172 -0
  83. package/skills/ce-code-review/references/scope.md +176 -0
  84. package/skills/ce-code-review/references/select-and-route.md +93 -0
  85. package/skills/ce-code-review/references/subagent-template.md +206 -0
  86. package/skills/ce-code-review/references/validator-batch-template.md +67 -0
  87. package/skills/ce-code-review/scripts/cross-model-adversarial-review.sh +1275 -0
  88. package/skills/ce-code-review/scripts/findings-mechanics.py +274 -0
  89. package/skills/ce-code-review/scripts/packs-resolve.py +737 -0
  90. package/skills/ce-code-review/scripts/peer-job-runner.py +2594 -0
  91. package/skills/ce-code-review/scripts/review-scope.py +419 -0
  92. package/skills/ce-code-review/scripts/run-log.py +280 -0
  93. package/skills/ce-commit/SKILL.md +60 -0
  94. package/skills/ce-commit-push-pr/SKILL.md +69 -0
  95. package/skills/ce-commit-push-pr/references/apply-and-handoff.md +79 -0
  96. package/skills/ce-commit-push-pr/references/branch-creation.md +47 -0
  97. package/skills/ce-commit-push-pr/references/commit-and-push.md +26 -0
  98. package/skills/ce-commit-push-pr/references/compose.md +29 -0
  99. package/skills/ce-commit-push-pr/references/context.md +42 -0
  100. package/skills/ce-commit-push-pr/references/gh-stack-cli.md +83 -0
  101. package/skills/ce-commit-push-pr/references/pr-description-writing.md +208 -0
  102. package/skills/ce-commit-push-pr/references/stack-submit.md +81 -0
  103. package/skills/ce-compound/SKILL.md +79 -0
  104. package/skills/ce-compound/assets/resolution-template.md +96 -0
  105. package/skills/ce-compound/references/agents/best-practices-researcher.md +115 -0
  106. package/skills/ce-compound/references/agents/data-integrity-guardian.md +68 -0
  107. package/skills/ce-compound/references/agents/framework-docs-researcher.md +93 -0
  108. package/skills/ce-compound/references/agents/pattern-recognition-specialist.md +55 -0
  109. package/skills/ce-compound/references/agents/performance-oracle.md +108 -0
  110. package/skills/ce-compound/references/agents/security-sentinel.md +91 -0
  111. package/skills/ce-compound/references/agents/session-historian.md +82 -0
  112. package/skills/ce-compound/references/assembly.md +127 -0
  113. package/skills/ce-compound/references/concepts-vocabulary.md +98 -0
  114. package/skills/ce-compound/references/enhancement.md +42 -0
  115. package/skills/ce-compound/references/grounding-validation.md +89 -0
  116. package/skills/ce-compound/references/lightweight.md +56 -0
  117. package/skills/ce-compound/references/modes.md +13 -0
  118. package/skills/ce-compound/references/refresh-and-discoverability.md +96 -0
  119. package/skills/ce-compound/references/report.md +115 -0
  120. package/skills/ce-compound/references/research.md +144 -0
  121. package/skills/ce-compound/references/schema.yaml +236 -0
  122. package/skills/ce-compound/references/session-history.md +73 -0
  123. package/skills/ce-compound/references/yaml-schema.md +130 -0
  124. package/skills/ce-compound/scripts/packs-resolve.py +737 -0
  125. package/skills/ce-compound/scripts/session-history/__pycache__/dsh_session.cpython-314.pyc +0 -0
  126. package/skills/ce-compound/scripts/session-history/discover-sessions.sh +290 -0
  127. package/skills/ce-compound/scripts/session-history/discover_dsh.py +123 -0
  128. package/skills/ce-compound/scripts/session-history/dsh_session.py +225 -0
  129. package/skills/ce-compound/scripts/session-history/extract-errors.py +178 -0
  130. package/skills/ce-compound/scripts/session-history/extract-metadata.py +301 -0
  131. package/skills/ce-compound/scripts/session-history/extract-skeleton.py +346 -0
  132. package/skills/ce-compound/scripts/validate-doc-claims.py +497 -0
  133. package/skills/ce-compound/scripts/validate-frontmatter.py +137 -0
  134. package/skills/ce-compound-refresh/SKILL.md +88 -0
  135. package/skills/ce-compound-refresh/assets/resolution-template.md +96 -0
  136. package/skills/ce-compound-refresh/references/classify.md +42 -0
  137. package/skills/ce-compound-refresh/references/commit.md +7 -0
  138. package/skills/ce-compound-refresh/references/concepts-vocabulary.md +116 -0
  139. package/skills/ce-compound-refresh/references/discoverability.md +15 -0
  140. package/skills/ce-compound-refresh/references/investigate.md +23 -0
  141. package/skills/ce-compound-refresh/references/modes.md +27 -0
  142. package/skills/ce-compound-refresh/references/per-action-flows.md +142 -0
  143. package/skills/ce-compound-refresh/references/report.md +23 -0
  144. package/skills/ce-compound-refresh/references/schema.yaml +236 -0
  145. package/skills/ce-compound-refresh/references/scope.md +18 -0
  146. package/skills/ce-compound-refresh/references/worth-audit.md +35 -0
  147. package/skills/ce-compound-refresh/references/yaml-schema.md +130 -0
  148. package/skills/ce-compound-refresh/scripts/validate-doc-claims.py +497 -0
  149. package/skills/ce-compound-refresh/scripts/validate-frontmatter.py +137 -0
  150. package/skills/ce-debug/SKILL.md +122 -0
  151. package/skills/ce-debug/references/anti-patterns.md +91 -0
  152. package/skills/ce-debug/references/defense-in-depth.md +39 -0
  153. package/skills/ce-debug/references/fix.md +21 -0
  154. package/skills/ce-debug/references/investigate.md +114 -0
  155. package/skills/ce-debug/references/investigation-techniques.md +384 -0
  156. package/skills/ce-debug/references/pipeline-mode.md +78 -0
  157. package/skills/ce-debug/references/post-fix-handoff.md +60 -0
  158. package/skills/ce-debug/references/return-to-caller.md +57 -0
  159. package/skills/ce-doc-review/SKILL.md +75 -0
  160. package/skills/ce-doc-review/references/bulk-preview.md +146 -0
  161. package/skills/ce-doc-review/references/cross-model-review.md +207 -0
  162. package/skills/ce-doc-review/references/decision-primer.md +47 -0
  163. package/skills/ce-doc-review/references/dispatch.md +56 -0
  164. package/skills/ce-doc-review/references/document-intake.md +44 -0
  165. package/skills/ce-doc-review/references/findings-schema.json +85 -0
  166. package/skills/ce-doc-review/references/modes.md +20 -0
  167. package/skills/ce-doc-review/references/open-questions-defer.md +158 -0
  168. package/skills/ce-doc-review/references/persona-selection.md +41 -0
  169. package/skills/ce-doc-review/references/personas/adversarial-document-reviewer.md +109 -0
  170. package/skills/ce-doc-review/references/personas/coherence-reviewer.md +69 -0
  171. package/skills/ce-doc-review/references/personas/design-lens-reviewer.md +48 -0
  172. package/skills/ce-doc-review/references/personas/feasibility-reviewer.md +50 -0
  173. package/skills/ce-doc-review/references/personas/product-lens-reviewer.md +85 -0
  174. package/skills/ce-doc-review/references/personas/scope-guardian-reviewer.md +83 -0
  175. package/skills/ce-doc-review/references/personas/security-lens-reviewer.md +41 -0
  176. package/skills/ce-doc-review/references/personas/whole-doc-reviewer.md +25 -0
  177. package/skills/ce-doc-review/references/rendering-floor.md +175 -0
  178. package/skills/ce-doc-review/references/review-output-template.md +123 -0
  179. package/skills/ce-doc-review/references/subagent-template.md +188 -0
  180. package/skills/ce-doc-review/references/synthesis-and-presentation.md +350 -0
  181. package/skills/ce-doc-review/references/walkthrough.md +347 -0
  182. package/skills/ce-doc-review/scripts/cross-model-doc-review.sh +1270 -0
  183. package/skills/ce-doc-review/scripts/packs-resolve.py +737 -0
  184. package/skills/ce-doc-review/scripts/peer-job-runner.py +2594 -0
  185. package/skills/ce-dogfood/SKILL.md +66 -0
  186. package/skills/ce-dogfood/agents/openai.yaml +2 -0
  187. package/skills/ce-dogfood/references/dogfood-report-template.md +97 -0
  188. package/skills/ce-dogfood/references/phases.md +167 -0
  189. package/skills/ce-dogfood/references/test-matrix-taxonomy.md +62 -0
  190. package/skills/ce-dogfood/scripts/packs-resolve.py +737 -0
  191. package/skills/ce-explain/SKILL.md +81 -0
  192. package/skills/ce-explain/references/agents/behavior-trace-scout.md +19 -0
  193. package/skills/ce-explain/references/agents/work-recap-scout.md +23 -0
  194. package/skills/ce-explain/references/check-in.md +18 -0
  195. package/skills/ce-explain/references/destinations.md +35 -0
  196. package/skills/ce-explain/references/explainer-html.md +29 -0
  197. package/skills/ce-explain/references/explainer-markdown.md +24 -0
  198. package/skills/ce-explain/references/intake.md +50 -0
  199. package/skills/ce-explain/references/orchestration.md +46 -0
  200. package/skills/ce-handoff/SKILL.md +54 -0
  201. package/skills/ce-handoff/references/create.md +88 -0
  202. package/skills/ce-handoff/references/resume.md +46 -0
  203. package/skills/ce-ideate/SKILL.md +75 -0
  204. package/skills/ce-ideate/references/agents/issue-intelligence-analyst.md +166 -0
  205. package/skills/ce-ideate/references/agents/learnings-researcher.md +247 -0
  206. package/skills/ce-ideate/references/agents/slack-researcher.md +127 -0
  207. package/skills/ce-ideate/references/agents/web-researcher.md +121 -0
  208. package/skills/ce-ideate/references/decomposition.md +39 -0
  209. package/skills/ce-ideate/references/divergent-ideation.md +112 -0
  210. package/skills/ce-ideate/references/grounding.md +138 -0
  211. package/skills/ce-ideate/references/html-rendering.md +638 -0
  212. package/skills/ce-ideate/references/ideation-sections.md +191 -0
  213. package/skills/ce-ideate/references/issue-intelligence.md +44 -0
  214. package/skills/ce-ideate/references/markdown-rendering.md +242 -0
  215. package/skills/ce-ideate/references/output-mode.md +34 -0
  216. package/skills/ce-ideate/references/post-ideation-workflow.md +169 -0
  217. package/skills/ce-ideate/references/scope-gates.md +148 -0
  218. package/skills/ce-ideate/references/universal-ideation.md +119 -0
  219. package/skills/ce-ideate/references/user-research-artifacts.md +28 -0
  220. package/skills/ce-ideate/references/web-research-cache.md +56 -0
  221. package/skills/ce-noslop/SKILL.md +45 -0
  222. package/skills/ce-noslop/references/patterns.md +61 -0
  223. package/skills/ce-noslop/references/terminology.md +3 -0
  224. package/skills/ce-optimize/SKILL.md +64 -0
  225. package/skills/ce-optimize/references/agents/learnings-researcher.md +247 -0
  226. package/skills/ce-optimize/references/agents/repo-research-analyst.md +258 -0
  227. package/skills/ce-optimize/references/example-expensive-benchmark-spec.yaml +88 -0
  228. package/skills/ce-optimize/references/example-hard-spec.yaml +64 -0
  229. package/skills/ce-optimize/references/example-judge-spec.yaml +83 -0
  230. package/skills/ce-optimize/references/example-text-target-spec.yaml +80 -0
  231. package/skills/ce-optimize/references/experiment-log-schema.yaml +563 -0
  232. package/skills/ce-optimize/references/experiment-prompt-template.md +143 -0
  233. package/skills/ce-optimize/references/judge-prompt-template.md +117 -0
  234. package/skills/ce-optimize/references/loop.md +286 -0
  235. package/skills/ce-optimize/references/measurement.md +168 -0
  236. package/skills/ce-optimize/references/optimize-spec-schema.yaml +570 -0
  237. package/skills/ce-optimize/references/persistence.md +93 -0
  238. package/skills/ce-optimize/references/spec.md +107 -0
  239. package/skills/ce-optimize/references/text-targets.md +51 -0
  240. package/skills/ce-optimize/references/usage-guide.md +147 -0
  241. package/skills/ce-optimize/references/wrap-up.md +54 -0
  242. package/skills/ce-optimize/scripts/decide.mjs +676 -0
  243. package/skills/ce-optimize/scripts/experiment-worktree.sh +330 -0
  244. package/skills/ce-optimize/scripts/measure.sh +140 -0
  245. package/skills/ce-optimize/scripts/parallel-probe.sh +134 -0
  246. package/skills/ce-plan/SKILL.md +60 -0
  247. package/skills/ce-plan/references/agents/agent-native-planning-strategist.md +66 -0
  248. package/skills/ce-plan/references/agents/architecture-strategist.md +46 -0
  249. package/skills/ce-plan/references/agents/best-practices-researcher.md +118 -0
  250. package/skills/ce-plan/references/agents/data-integrity-guardian.md +68 -0
  251. package/skills/ce-plan/references/agents/framework-docs-researcher.md +97 -0
  252. package/skills/ce-plan/references/agents/git-history-analyzer.md +40 -0
  253. package/skills/ce-plan/references/agents/learnings-researcher.md +268 -0
  254. package/skills/ce-plan/references/agents/pattern-recognition-specialist.md +55 -0
  255. package/skills/ce-plan/references/agents/performance-oracle.md +108 -0
  256. package/skills/ce-plan/references/agents/repo-research-analyst.md +262 -0
  257. package/skills/ce-plan/references/agents/security-sentinel.md +91 -0
  258. package/skills/ce-plan/references/agents/slack-researcher.md +131 -0
  259. package/skills/ce-plan/references/agents/spec-flow-analyzer.md +84 -0
  260. package/skills/ce-plan/references/agents/web-researcher.md +125 -0
  261. package/skills/ce-plan/references/approach-altitude.md +55 -0
  262. package/skills/ce-plan/references/bakeoff.md +9 -0
  263. package/skills/ce-plan/references/deepening-workflow.md +263 -0
  264. package/skills/ce-plan/references/final-review.md +134 -0
  265. package/skills/ce-plan/references/html-rendering.md +638 -0
  266. package/skills/ce-plan/references/intake.md +158 -0
  267. package/skills/ce-plan/references/markdown-rendering.md +242 -0
  268. package/skills/ce-plan/references/output-contracts.md +29 -0
  269. package/skills/ce-plan/references/output-mode.md +45 -0
  270. package/skills/ce-plan/references/plan-handoff.md +116 -0
  271. package/skills/ce-plan/references/plan-sections.md +489 -0
  272. package/skills/ce-plan/references/reasoning-elevation.md +124 -0
  273. package/skills/ce-plan/references/research.md +211 -0
  274. package/skills/ce-plan/references/resume.md +61 -0
  275. package/skills/ce-plan/references/settled-decisions.md +45 -0
  276. package/skills/ce-plan/references/structure.md +207 -0
  277. package/skills/ce-plan/references/synthesis-summary.md +260 -0
  278. package/skills/ce-plan/references/universal-planning.md +170 -0
  279. package/skills/ce-plan/scripts/elevation-dispatch.sh +288 -0
  280. package/skills/ce-plan/scripts/packs-resolve.py +737 -0
  281. package/skills/ce-plan/scripts/peer-job-runner.py +2594 -0
  282. package/skills/ce-polish/SKILL.md +22 -0
  283. package/skills/ce-polish/agents/openai.yaml +2 -0
  284. package/skills/ce-polish/references/dev-server-astro.md +58 -0
  285. package/skills/ce-polish/references/dev-server-detection.md +40 -0
  286. package/skills/ce-polish/references/dev-server-next.md +61 -0
  287. package/skills/ce-polish/references/dev-server-nuxt.md +58 -0
  288. package/skills/ce-polish/references/dev-server-procfile.md +59 -0
  289. package/skills/ce-polish/references/dev-server-rails.md +50 -0
  290. package/skills/ce-polish/references/dev-server-remix.md +58 -0
  291. package/skills/ce-polish/references/dev-server-sveltekit.md +58 -0
  292. package/skills/ce-polish/references/dev-server-vite.md +48 -0
  293. package/skills/ce-polish/references/install-riffrec.md +35 -0
  294. package/skills/ce-polish/references/launch-json-schema.md +177 -0
  295. package/skills/ce-polish/references/live-loop.md +98 -0
  296. package/skills/ce-polish/references/live-remote.md +35 -0
  297. package/skills/ce-polish/references/live-start.md +93 -0
  298. package/skills/ce-polish/references/live-stream-contract.md +253 -0
  299. package/skills/ce-polish/references/run.md +67 -0
  300. package/skills/ce-polish/scripts/detect-project-type.sh +277 -0
  301. package/skills/ce-polish/scripts/detect-riffrec.sh +225 -0
  302. package/skills/ce-polish/scripts/live-endpoint.js +2841 -0
  303. package/skills/ce-polish/scripts/read-launch-json.sh +117 -0
  304. package/skills/ce-polish/scripts/resolve-package-manager.sh +95 -0
  305. package/skills/ce-polish/scripts/resolve-port.sh +307 -0
  306. package/skills/ce-pov/SKILL.md +64 -0
  307. package/skills/ce-pov/references/agents/external-evidence-researcher.md +26 -0
  308. package/skills/ce-pov/references/agents/pov-peer.md +43 -0
  309. package/skills/ce-pov/references/agents/precedent-activity-scout.md +21 -0
  310. package/skills/ce-pov/references/agents/project-grounding-scout.md +32 -0
  311. package/skills/ce-pov/references/boundaries.md +36 -0
  312. package/skills/ce-pov/references/cross-model-panel.md +596 -0
  313. package/skills/ce-pov/references/followup.md +9 -0
  314. package/skills/ce-pov/references/grounding.md +47 -0
  315. package/skills/ce-pov/references/intake.md +61 -0
  316. package/skills/ce-pov/references/invocation.md +47 -0
  317. package/skills/ce-pov/references/method.md +68 -0
  318. package/skills/ce-pov/references/pov-schema.json +56 -0
  319. package/skills/ce-pov/references/report.md +7 -0
  320. package/skills/ce-pov/scripts/cross-model-pov.sh +1110 -0
  321. package/skills/ce-pov/scripts/peer-job-runner.py +2594 -0
  322. package/skills/ce-product-pulse/SKILL.md +81 -0
  323. package/skills/ce-product-pulse/agents/openai.yaml +2 -0
  324. package/skills/ce-product-pulse/references/config.md +20 -0
  325. package/skills/ce-product-pulse/references/interview.md +260 -0
  326. package/skills/ce-product-pulse/references/report-template.md +89 -0
  327. package/skills/ce-product-pulse/references/run.md +46 -0
  328. package/skills/ce-product-pulse/references/setup.md +43 -0
  329. package/skills/ce-promote/SKILL.md +90 -0
  330. package/skills/ce-promote/agents/openai.yaml +2 -0
  331. package/skills/ce-promote/references/spiral-cli.md +149 -0
  332. package/skills/ce-proof/SKILL.md +65 -0
  333. package/skills/ce-proof/references/api.md +176 -0
  334. package/skills/ce-proof/references/workflows.md +124 -0
  335. package/skills/ce-prototype/SKILL.md +59 -0
  336. package/skills/ce-prototype/assets/annotate.css +206 -0
  337. package/skills/ce-prototype/assets/annotate.js +837 -0
  338. package/skills/ce-prototype/references/annotation-loop.md +32 -0
  339. package/skills/ce-prototype/references/build.md +39 -0
  340. package/skills/ce-prototype/references/craft-floor.md +43 -0
  341. package/skills/ce-prototype/references/preview.md +118 -0
  342. package/skills/ce-prototype/references/scoping.md +38 -0
  343. package/skills/ce-prototype/references/write-back.md +37 -0
  344. package/skills/ce-prototype/scripts/light-webserver.js +1275 -0
  345. package/skills/ce-resolve-pr-feedback/SKILL.md +60 -0
  346. package/skills/ce-resolve-pr-feedback/references/agents/pr-comment-resolver.md +59 -0
  347. package/skills/ce-resolve-pr-feedback/references/evaluation-rubric.md +141 -0
  348. package/skills/ce-resolve-pr-feedback/references/full-mode.md +336 -0
  349. package/skills/ce-resolve-pr-feedback/references/pipeline-mode.md +23 -0
  350. package/skills/ce-resolve-pr-feedback/references/resume.md +60 -0
  351. package/skills/ce-resolve-pr-feedback/references/return-to-caller.md +111 -0
  352. package/skills/ce-resolve-pr-feedback/references/targeted-mode.md +48 -0
  353. package/skills/ce-resolve-pr-feedback/scripts/get-pr-comments +176 -0
  354. package/skills/ce-resolve-pr-feedback/scripts/get-thread-for-comment +84 -0
  355. package/skills/ce-resolve-pr-feedback/scripts/pending-feedback.py +287 -0
  356. package/skills/ce-resolve-pr-feedback/scripts/reply-to-pr-thread +57 -0
  357. package/skills/ce-resolve-pr-feedback/scripts/resolve-pr-thread +23 -0
  358. package/skills/ce-retune/SKILL.md +42 -0
  359. package/skills/ce-retune/agents/openai.yaml +2 -0
  360. package/skills/ce-retune/references/baseline-mining.md +122 -0
  361. package/skills/ce-retune/references/corpus-audit.md +128 -0
  362. package/skills/ce-retune/references/cut-passes.md +129 -0
  363. package/skills/ce-retune/references/halt-taxonomy.md +123 -0
  364. package/skills/ce-retune/references/noise-floor.md +131 -0
  365. package/skills/ce-retune/references/workflow-shapes.md +73 -0
  366. package/skills/ce-riffrec-feedback-analysis/SKILL.md +33 -0
  367. package/skills/ce-riffrec-feedback-analysis/references/analyzer.md +18 -0
  368. package/skills/ce-riffrec-feedback-analysis/references/compound-engineering-feedback-format.md +116 -0
  369. package/skills/ce-riffrec-feedback-analysis/references/extensive-analysis.md +98 -0
  370. package/skills/ce-riffrec-feedback-analysis/references/install-riffrec.md +27 -0
  371. package/skills/ce-riffrec-feedback-analysis/references/quick-bug-report.md +38 -0
  372. package/skills/ce-riffrec-feedback-analysis/scripts/analyze_riffrec_zip.py +1306 -0
  373. package/skills/ce-setup/SKILL.md +103 -0
  374. package/skills/ce-setup/agents/openai.yaml +2 -0
  375. package/skills/ce-setup/assets/compounding-directive.md +11 -0
  376. package/skills/ce-setup/assets/noslop-directive.md +7 -0
  377. package/skills/ce-setup/assets/pack-rule-template.md +11 -0
  378. package/skills/ce-setup/references/acpx-cache-warm.md +14 -0
  379. package/skills/ce-setup/references/config-template.yaml +210 -0
  380. package/skills/ce-setup/references/legacy-codex-tool-map.md +15 -0
  381. package/skills/ce-setup/references/pack-scaffold.md +45 -0
  382. package/skills/ce-setup/references/repo-fixes.md +121 -0
  383. package/skills/ce-setup/scripts/check-health +929 -0
  384. package/skills/ce-setup/scripts/packs-resolve.py +737 -0
  385. package/skills/ce-simplify-code/SKILL.md +76 -0
  386. package/skills/ce-simplify-code/references/personas/code-quality-reviewer.md +17 -0
  387. package/skills/ce-simplify-code/references/personas/code-reuse-reviewer.md +7 -0
  388. package/skills/ce-simplify-code/references/personas/comment-reviewer.md +24 -0
  389. package/skills/ce-simplify-code/references/personas/efficiency-reviewer.md +11 -0
  390. package/skills/ce-simplify-code/references/personas/test-value-reviewer.md +23 -0
  391. package/skills/ce-simplify-code/references/reviewer-dispatch.md +11 -0
  392. package/skills/ce-simplify-code/references/standalone-report.md +25 -0
  393. package/skills/ce-strategy/SKILL.md +61 -0
  394. package/skills/ce-strategy/references/grounding.md +22 -0
  395. package/skills/ce-strategy/references/interview.md +179 -0
  396. package/skills/ce-strategy/references/strategy-template.md +94 -0
  397. package/skills/ce-strategy/references/update-run.md +33 -0
  398. package/skills/ce-sweep/SKILL.md +93 -0
  399. package/skills/ce-sweep/agents/openai.yaml +2 -0
  400. package/skills/ce-sweep/references/agents/media-analyzer.md +54 -0
  401. package/skills/ce-sweep/references/interview.md +208 -0
  402. package/skills/ce-sweep/references/model-tiers.md +13 -0
  403. package/skills/ce-sweep/references/plan-template.md +62 -0
  404. package/skills/ce-sweep/references/run.md +126 -0
  405. package/skills/ce-sweep/references/sources/email.md +57 -0
  406. package/skills/ce-sweep/references/sources/github-issues.md +59 -0
  407. package/skills/ce-sweep/references/sources/slack.md +61 -0
  408. package/skills/ce-sweep/references/state-schema.md +157 -0
  409. package/skills/ce-sweep/references/subagent-template.md +60 -0
  410. package/skills/ce-sweep/scripts/analyze_riffrec_zip.py +1306 -0
  411. package/skills/ce-sweep/scripts/sweep-state.py +793 -0
  412. package/skills/ce-test-browser/SKILL.md +50 -0
  413. package/skills/ce-test-browser/references/agent-browser-driver.md +47 -0
  414. package/skills/ce-test-browser/references/pipeline-orchestration.md +45 -0
  415. package/skills/ce-test-browser/references/route-and-report.md +129 -0
  416. package/skills/ce-test-browser/scripts/resolve-port.sh +41 -0
  417. package/skills/ce-test-xcode/SKILL.md +26 -0
  418. package/skills/ce-test-xcode/agents/openai.yaml +2 -0
  419. package/skills/ce-test-xcode/references/setup-and-build.md +32 -0
  420. package/skills/ce-test-xcode/references/test-and-report.md +64 -0
  421. package/skills/ce-work/SKILL.md +62 -0
  422. package/skills/ce-work/references/agents/figma-design-sync.md +27 -0
  423. package/skills/ce-work/references/agents/implementation-worker.md +17 -0
  424. package/skills/ce-work/references/cross-model-execution.md +191 -0
  425. package/skills/ce-work/references/execution-engines.md +64 -0
  426. package/skills/ce-work/references/execution-strategy.md +73 -0
  427. package/skills/ce-work/references/implementation-loop.md +107 -0
  428. package/skills/ce-work/references/implementation-result-schema.json +52 -0
  429. package/skills/ce-work/references/input-triage.md +50 -0
  430. package/skills/ce-work/references/non-code-execution.md +23 -0
  431. package/skills/ce-work/references/return-to-caller.md +33 -0
  432. package/skills/ce-work/references/review-findings-followup.md +82 -0
  433. package/skills/ce-work/references/shipping-workflow.md +89 -0
  434. package/skills/ce-work/references/tracker-defer.md +150 -0
  435. package/skills/ce-work/references/work-intake.md +51 -0
  436. package/skills/ce-work/references/workspace-setup.md +27 -0
  437. package/skills/ce-work/scripts/__pycache__/unit_workspace_jobs.cpython-314.pyc +0 -0
  438. package/skills/ce-work/scripts/__pycache__/unit_workspace_state.cpython-314.pyc +0 -0
  439. package/skills/ce-work/scripts/cross-model-work.sh +1385 -0
  440. package/skills/ce-work/scripts/peer-job-runner.py +2594 -0
  441. package/skills/ce-work/scripts/unit-workspace.py +215 -0
  442. package/skills/ce-work/scripts/unit_workspace_ignored.py +93 -0
  443. package/skills/ce-work/scripts/unit_workspace_integration.py +677 -0
  444. package/skills/ce-work/scripts/unit_workspace_jobs.py +1216 -0
  445. package/skills/ce-work/scripts/unit_workspace_lifecycle.py +981 -0
  446. package/skills/ce-work/scripts/unit_workspace_state.py +1379 -0
  447. package/skills/ce-work/scripts/unit_workspace_transaction.py +612 -0
  448. package/skills/ce-worktree/SKILL.md +54 -0
  449. package/skills/lfg/SKILL.md +59 -0
  450. package/skills/lfg/references/debug-return.md +25 -0
  451. package/skills/lfg/references/intake.md +30 -0
  452. package/skills/lfg/references/next-work-handoff.md +96 -0
  453. package/skills/lfg/references/plan-brief.md +36 -0
  454. package/skills/lfg/references/review-followup.md +78 -0
  455. package/skills/lfg/references/shipping.md +65 -0
  456. package/skills/lfg/references/stage-routing.md +49 -0
  457. package/skills/lfg/references/task-visibility.md +11 -0
  458. package/skills/lfg/references/tracker-defer.md +150 -0
  459. package/skills/lfg/references/work-return.md +27 -0
  460. package/skills/wtf/SKILL.md +33 -0
  461. package/skills/wtf/agents/openai.yaml +2 -0
@@ -0,0 +1,290 @@
1
+ #!/usr/bin/env bash
2
+ # Discover session files for DeepSeek Harness (dsh). The other platform probes
3
+ # (Claude Code, Codex, Cursor, Pi, oh-my-pi) are kept as optional fallbacks for
4
+ # mixed-tool repos; the extraction scripts downstream only decode dsh sessions,
5
+ # so run the documented pipeline with `--platform dsh`.
6
+ #
7
+ # Usage: discover-sessions.sh <repo-name> <days> [--cwd /abs/repo/root] [--platform dsh|claude|codex|cursor|pi|omp]
8
+ #
9
+ # Outputs one file path per line. Safe in both bash and zsh (all globs guarded).
10
+ # Pass output to extract-metadata.py:
11
+ # bash discover-sessions.sh <repo-name> 7 --platform dsh --cwd /abs/repo/root \
12
+ # | tr '\n' '\0' | xargs -0 python3 extract-metadata.py --cwd-filter <repo-name>
13
+ #
14
+ # Arguments:
15
+ # repo-name Folder name of the repo (e.g., "my-repo"). Used for directory matching.
16
+ # days Scan window in days (e.g., 7). Files older than this are skipped.
17
+ # --cwd Absolute repo root. Used for exact dsh (and Pi/omp) encoded-CWD
18
+ # discovery and the omp raw-bucket probe. Claude listing is unfiltered;
19
+ # extract-metadata.py --cwd-filter matches recorded cwd.
20
+ # --platform Restrict to a single platform. Omit to search all.
21
+
22
+ set -euo pipefail
23
+
24
+ REPO_NAME="${1:?Usage: discover-sessions.sh <repo-name> <days> [--cwd /abs/repo/root] [--platform claude|codex|cursor|pi|omp|dsh]}"
25
+ DAYS="${2:?Usage: discover-sessions.sh <repo-name> <days> [--cwd /abs/repo/root] [--platform claude|codex|cursor|pi|omp|dsh]}"
26
+ PLATFORM="all"
27
+ REPO_CWD=""
28
+
29
+ # Parse optional --platform flag
30
+ shift 2
31
+ while [ $# -gt 0 ]; do
32
+ case "$1" in
33
+ --cwd) REPO_CWD="$2"; shift 2 ;;
34
+ --platform) PLATFORM="$2"; shift 2 ;;
35
+ *) shift ;;
36
+ esac
37
+ done
38
+
39
+ encode_pi_cwd() {
40
+ local cwd="${1%/}"
41
+ local encoded="${cwd//\//-}"
42
+ encoded="${encoded#-}"
43
+ printf -- "--%s--" "$encoded"
44
+ }
45
+
46
+ # --- Claude Code ---
47
+ # List every recent jsonl under <config-dir>/projects. Folder names are an
48
+ # undocumented encoder of session CWD; do not invert them. Repo attribution
49
+ # is the recorded `cwd` field, applied by extract-metadata.py --cwd-filter.
50
+ # CLAUDE_CONFIG_DIR relocates the whole config tree (official); unset -> ~/.claude.
51
+ discover_claude() {
52
+ local base="${CLAUDE_CONFIG_DIR:-$HOME/.claude}/projects"
53
+ [ -d "$base" ] || return 0
54
+ find "$base" -mindepth 2 -maxdepth 2 -type f -name "*.jsonl" -mtime "-${DAYS}" 2>/dev/null
55
+ }
56
+
57
+ # --- Codex ---
58
+ discover_codex() {
59
+ local codex_home="${CODEX_HOME:-$HOME/.codex}"
60
+ for base in "$codex_home/sessions" "$HOME/.agents/sessions"; do
61
+ [ -d "$base" ] || continue
62
+
63
+ # Use mtime-based discovery (consistent with Claude/Cursor) so that
64
+ # sessions started before the scan window but still active within it
65
+ # are not missed.
66
+ find "$base" -name "*.jsonl" -mtime "-${DAYS}" 2>/dev/null
67
+ done
68
+ }
69
+
70
+ # --- Cursor ---
71
+ discover_cursor() {
72
+ local base="$HOME/.cursor/projects"
73
+ [ -d "$base" ] || return 0
74
+
75
+ for dir in "$base"/*"$REPO_NAME"*/; do
76
+ [ -d "$dir" ] || continue
77
+ local transcripts="$dir/agent-transcripts"
78
+ [ -d "$transcripts" ] || continue
79
+ find "$transcripts" -name "*.jsonl" -mtime "-${DAYS}" 2>/dev/null
80
+ done
81
+ }
82
+
83
+ # --- Pi ---
84
+ discover_pi() {
85
+ local agent_dir="${PI_CODING_AGENT_DIR:-$HOME/.pi/agent}"
86
+ local base="${PI_CODING_AGENT_SESSION_DIR:-$agent_dir/sessions}"
87
+ [ -d "$base" ] || return 0
88
+
89
+ # Pi's explicit session-dir override stores session files directly in the
90
+ # supplied directory. The cwd filter later reads each header and keeps only
91
+ # sessions for the active repo.
92
+ if [ -n "${PI_CODING_AGENT_SESSION_DIR:-}" ]; then
93
+ find "$base" -maxdepth 1 -name "*.jsonl" -mtime "-${DAYS}" 2>/dev/null
94
+ if [ -z "$REPO_CWD" ]; then
95
+ for dir in "$base"/*"$REPO_NAME"*/; do
96
+ [ -d "$dir" ] || continue
97
+ find "$dir" -maxdepth 1 -name "*.jsonl" -mtime "-${DAYS}" 2>/dev/null
98
+ done
99
+ fi
100
+ return 0
101
+ fi
102
+
103
+ # Pi stores sessions under --<absolute-cwd-with-slashes-as-hyphens>--.
104
+ # When the caller supplies an exact repo root, probe only that encoded
105
+ # directory so sibling repos like my-repo-old never enter the pipeline.
106
+ if [ -n "$REPO_CWD" ]; then
107
+ local dir="$base/$(encode_pi_cwd "$REPO_CWD")"
108
+ [ -d "$dir" ] || return 0
109
+ find "$dir" -maxdepth 1 -name "*.jsonl" -mtime "-${DAYS}" 2>/dev/null
110
+ return 0
111
+ fi
112
+
113
+ # Fallback for direct script use without --cwd.
114
+ for dir in "$base"/*"$REPO_NAME"*/; do
115
+ [ -d "$dir" ] || continue
116
+ find "$dir" -maxdepth 1 -name "*.jsonl" -mtime "-${DAYS}" 2>/dev/null
117
+ done
118
+ }
119
+
120
+ # --- oh-my-pi (omp) ---
121
+ # Encode omp's raw bucket name for a cwd: home-relative "-<rel>",
122
+ # tmp-relative "-tmp-<rel>", and otherwise "--<abs>--", with path separators
123
+ # and ":" encoded as "-" (session-paths.ts getDefaultSessionDirName /
124
+ # encodeLegacyAbsoluteSessionDirName). This raw scheme predates the hashed
125
+ # scheme and is current again since omp 17.2.9 (#7646 restored it and removed
126
+ # automatic migration), so buckets in the wild use both shapes. Canonicalize
127
+ # with physical paths so symlinked cwds resolve to the same bucket, mirroring
128
+ # omp's resolveEquivalentPath. Prints nothing when the cwd cannot be resolved.
129
+ encode_omp_raw_cwd() {
130
+ local cwd canon_home canon_tmp rel
131
+ cwd="$(cd "$1" 2>/dev/null && pwd -P)" || return 0
132
+ canon_home="$(cd "$HOME" 2>/dev/null && pwd -P)" || canon_home="$HOME"
133
+ case "$cwd" in
134
+ "$canon_home")
135
+ printf -- '-'
136
+ ;;
137
+ "$canon_home"/*)
138
+ rel="$(printf '%s' "${cwd#"$canon_home"/}" | sed 's/[/\\:]/-/g')"
139
+ printf -- '-%s' "$rel"
140
+ ;;
141
+ *)
142
+ canon_tmp="$(cd "${TMPDIR:-/tmp}" 2>/dev/null && pwd -P)" || canon_tmp=""
143
+ case "$cwd" in
144
+ "$canon_tmp")
145
+ printf -- '-tmp'
146
+ ;;
147
+ "$canon_tmp"/*)
148
+ rel="$(printf '%s' "${cwd#"$canon_tmp"/}" | sed 's/[/\\:]/-/g')"
149
+ printf -- '-tmp-%s' "$rel"
150
+ ;;
151
+ *)
152
+ rel="$(printf '%s' "${cwd#/}" | sed 's/[/\\:]/-/g')"
153
+ printf -- '--%s--' "$rel"
154
+ ;;
155
+ esac
156
+ ;;
157
+ esac
158
+ }
159
+
160
+ discover_omp() {
161
+ local config_dir="${PI_CONFIG_DIR:-.omp}"
162
+
163
+ # omp's explicit session-dir override stores session files directly in the
164
+ # supplied directory (flat), mirroring Pi's override branch. The cwd filter
165
+ # later reads each header and keeps only sessions for the active repo.
166
+ if [ -n "${PI_CODING_AGENT_SESSION_DIR:-}" ]; then
167
+ local base="$PI_CODING_AGENT_SESSION_DIR"
168
+ [ -d "$base" ] || return 0
169
+ find "$base" -maxdepth 1 -name "*.jsonl" -mtime "-${DAYS}" 2>/dev/null
170
+ if [ -z "$REPO_CWD" ]; then
171
+ for dir in "$base"/*"$REPO_NAME"*/; do
172
+ [ -d "$dir" ] || continue
173
+ find "$dir" -maxdepth 1 -name "*.jsonl" -mtime "-${DAYS}" 2>/dev/null
174
+ done
175
+ fi
176
+ return 0
177
+ fi
178
+
179
+ # omp has two bucket-naming schemes in the wild, and both keep the raw
180
+ # repo basename (spaces and all) inside the bucket name:
181
+ # - raw: "-<home-rel>", "-tmp-<tmp-rel>", "--<abs>--" (legacy relative to
182
+ # the hashed scheme; restored as current in omp 17.2.9, #7646)
183
+ # - hashed: "<scope>-<sanitized-basename>-<sha256-of-canonical-cwd>"
184
+ # (intermediate releases; basename runs of [^a-zA-Z0-9._-] collapse to
185
+ # "-", edge dashes stripped, capped at the last 80 chars, empty falls
186
+ # back to "project" — session-paths.ts getDefaultSessionDirName)
187
+ # Scan basename-matching buckets in the default-profile sessions root and
188
+ # in every named-profile root; exact repo attribution comes from the
189
+ # downstream header `cwd` filter (extract-metadata.py --cwd-filter reads
190
+ # the type:"session" header). Glob the sanitized form so repos whose
191
+ # basename contains characters the hashed scheme normalizes (e.g. spaces)
192
+ # still match, and glob the raw form so raw-scheme buckets whose basename
193
+ # sanitizes differently (e.g. "my repo" in "--Users-test-Code-my repo--")
194
+ # are found too. When --cwd is supplied, also probe the exact raw bucket
195
+ # name: it catches buckets the basename globs miss when the bucket's path
196
+ # segments no longer resemble the repo name as typed.
197
+ local sanitized
198
+ sanitized="$(printf '%s' "$REPO_NAME" | sed -E 's/[^a-zA-Z0-9._-]+/-/g; s/^-+//; s/-+$//' | tail -c 80)"
199
+ [ -n "$sanitized" ] || sanitized="project"
200
+ local agent_dir="${PI_CODING_AGENT_DIR:-$HOME/$config_dir/agent}"
201
+ # omp getSessionsDir() flattens the agent/ prefix under XDG: ~/.omp/agent/sessions
202
+ # becomes $XDG_DATA_HOME/omp/sessions (and $XDG_DATA_HOME/omp/profiles/<name>/sessions).
203
+ # Only linux/darwin, only when XDG_DATA_HOME is set and the omp app root exists,
204
+ # and only when PI_CODING_AGENT_DIR did not already take over the agent root.
205
+ local xdg_omp=""
206
+ if [ -z "${PI_CODING_AGENT_DIR:-}" ] && [ -n "${XDG_DATA_HOME:-}" ]; then
207
+ case "$(uname -s)" in
208
+ Linux|Darwin)
209
+ if [ -d "${XDG_DATA_HOME%/}/omp" ]; then
210
+ xdg_omp="${XDG_DATA_HOME%/}/omp"
211
+ fi
212
+ ;;
213
+ esac
214
+ fi
215
+ {
216
+ local root dir encoded
217
+ if [ -n "$REPO_CWD" ]; then
218
+ encoded="$(encode_omp_raw_cwd "$REPO_CWD")"
219
+ if [ -n "$encoded" ]; then
220
+ for root in "$agent_dir/sessions" \
221
+ "$HOME/$config_dir"/profiles/*/agent/sessions \
222
+ ${xdg_omp:+"$xdg_omp/sessions"} \
223
+ ${xdg_omp:+"$xdg_omp"/profiles/*/sessions}; do
224
+ [ -d "$root/$encoded" ] || continue
225
+ find "$root/$encoded" -maxdepth 1 -name "*.jsonl" -mtime "-${DAYS}" 2>/dev/null
226
+ done
227
+ fi
228
+ fi
229
+ for root in "$agent_dir/sessions" \
230
+ "$HOME/$config_dir"/profiles/*/agent/sessions \
231
+ ${xdg_omp:+"$xdg_omp/sessions"} \
232
+ ${xdg_omp:+"$xdg_omp"/profiles/*/sessions}; do
233
+ [ -d "$root" ] || continue
234
+ for dir in "$root"/*"$sanitized"*/; do
235
+ [ -d "$dir" ] || continue
236
+ find "$dir" -maxdepth 1 -name "*.jsonl" -mtime "-${DAYS}" 2>/dev/null
237
+ done
238
+ if [ "$REPO_NAME" != "$sanitized" ]; then
239
+ for dir in "$root"/*"$REPO_NAME"*/; do
240
+ [ -d "$dir" ] || continue
241
+ find "$dir" -maxdepth 1 -name "*.jsonl" -mtime "-${DAYS}" 2>/dev/null
242
+ done
243
+ fi
244
+ done
245
+ # The probe and the globs can hit the same bucket; emit each path once.
246
+ } | awk '!seen[$0]++'
247
+ }
248
+
249
+ # --- DeepSeek Harness (dsh) ---
250
+ # dsh stores one zstd-compressed jsonl per session under
251
+ # <DSH_HOME>/sessions/--<projectKey(cwd)>--/<session-id>/session[.v<N>].jsonl.zstd
252
+ # The bucket name is dsh's own reversible-ish encoding of the project cwd, which
253
+ # bash cannot reproduce faithfully (separator runs collapse, rare code units
254
+ # become ~XXXX). Delegate discovery to discover_dsh.py so the encoder lives in
255
+ # exactly one place and stays in sync with the reader.
256
+ discover_dsh() {
257
+ local here
258
+ here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
259
+ [ -f "$here/discover_dsh.py" ] || return 0
260
+ local py
261
+ py="$(for c in python3 python py; do command -v "$c" >/dev/null 2>&1 && "$c" -c '' >/dev/null 2>&1 && { echo "$c"; break; }; done)"
262
+ [ -n "$py" ] || return 0
263
+ if [ -n "$REPO_CWD" ]; then
264
+ "$py" "$here/discover_dsh.py" --cwd "$REPO_CWD" --days "$DAYS" || true
265
+ else
266
+ "$py" "$here/discover_dsh.py" --name "$REPO_NAME" --days "$DAYS" || true
267
+ fi
268
+ }
269
+
270
+ # --- Dispatch ---
271
+ case "$PLATFORM" in
272
+ claude) discover_claude ;;
273
+ codex) discover_codex ;;
274
+ cursor) discover_cursor ;;
275
+ pi) discover_pi ;;
276
+ omp) discover_omp ;;
277
+ dsh) discover_dsh ;;
278
+ all)
279
+ # Pi and omp share the PI_CODING_AGENT_SESSION_DIR override: when it
280
+ # is set, both discover functions emit the same flat-dir files, and
281
+ # the downstream xargs call does not deduplicate. Emit each path once;
282
+ # platform attribution is unaffected because extract-metadata.py
283
+ # detects the file shape (title slot => omp, otherwise pi).
284
+ { discover_claude; discover_codex; discover_cursor; discover_pi; discover_omp; discover_dsh; } | awk '!seen[$0]++'
285
+ ;;
286
+ *)
287
+ echo "Unknown platform: $PLATFORM" >&2
288
+ exit 1
289
+ ;;
290
+ esac
@@ -0,0 +1,123 @@
1
+ #!/usr/bin/env python3
2
+ """Print dsh session files for one repository.
3
+
4
+ dsh buckets sessions per project cwd:
5
+
6
+ <DSH_HOME>/sessions/--<projectKey(cwd)>--/<session-id>/session[.v<N>].jsonl.zstd
7
+
8
+ `projectKey` collapses path separators into `-` and escapes other unsafe code
9
+ units as `~XXXX`, which bash cannot reproduce faithfully (a `~` in a path, a
10
+ non-ASCII directory name, or a separator run all change the bucket name). This
11
+ helper reuses the same encoder as the reader so discovery and decoding agree.
12
+
13
+ Usage:
14
+ discover_dsh.py --cwd /abs/repo/root --days 7
15
+ discover_dsh.py --name my-repo --days 7 # basename fallback
16
+ discover_dsh.py --list-all --days 7 # every bucket, cwd filtered later
17
+
18
+ Prints one absolute path per line, newest first. Exits 0 with no output when
19
+ nothing matches, so an empty pipeline stays a normal state.
20
+
21
+ Line endings are forced to LF. Callers pipe us through `tr '\n' '\0' | xargs -0`
22
+ (a bash pipeline, LF-delimited); Python's default text mode on Windows would
23
+ emit CRLF and leave a stray `\r` glued to every path, which then fails the
24
+ extension gate in the extractors as a file-not-found.
25
+ """
26
+ import argparse
27
+ import os
28
+ import sys
29
+ import time
30
+
31
+ sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
32
+
33
+ import dsh_session # noqa: E402
34
+
35
+
36
+ def iter_session_files(directory):
37
+ """Yield the session artifacts inside one session directory.
38
+
39
+ A session can keep more than one artifact when a format generation was
40
+ migrated (`session.jsonl.zstd` -> `session.v3.jsonl.zstd` -> `session.v4...`);
41
+ emit only the highest generation so one session is not reported twice.
42
+ """
43
+ try:
44
+ names = os.listdir(directory)
45
+ except OSError:
46
+ return
47
+ candidates = sorted(n for n in names if dsh_session.is_session_file(os.path.join(directory, n)))
48
+ if not candidates:
49
+ return
50
+ # Sort by generation number so `.v4` wins over `.v3`, and a bare
51
+ # `session.jsonl.zstd` (generation 0) sorts first.
52
+ def generation(name):
53
+ marker = ".v"
54
+ if marker in name:
55
+ try:
56
+ return int(name.split(marker, 1)[1].split(".", 1)[0])
57
+ except (IndexError, ValueError):
58
+ return 0
59
+ return 0
60
+
61
+ newest = max(candidates, key=lambda n: (generation(n), n))
62
+ yield os.path.join(directory, newest)
63
+
64
+
65
+ def recent(path, cutoff):
66
+ """Report whether a file's mtime falls inside the scan window."""
67
+ try:
68
+ return os.path.getmtime(path) >= cutoff
69
+ except OSError:
70
+ return False
71
+
72
+
73
+ def main():
74
+ # LF-only output so the bash pipe below us sees clean paths (see module doc).
75
+ sys.stdout.reconfigure(newline="\n")
76
+
77
+ parser = argparse.ArgumentParser(description=__doc__)
78
+ group = parser.add_mutually_exclusive_group(required=True)
79
+ group.add_argument("--cwd", help="absolute repository root; probes its exact bucket")
80
+ group.add_argument("--name", help="repository folder name; matches bucket substrings")
81
+ group.add_argument("--list-all", action="store_true", help="scan every bucket")
82
+ parser.add_argument("--days", type=float, default=7.0, help="scan window in days")
83
+ args = parser.parse_args()
84
+
85
+ if not dsh_session.available():
86
+ # Python < 3.14 cannot decode dsh sessions; stay silent so the caller
87
+ # degrades to "no dsh sessions" instead of failing the pipeline.
88
+ return 0
89
+
90
+ cutoff = time.time() - args.days * 86400
91
+ found = []
92
+ for root in dsh_session.session_roots():
93
+ if not os.path.isdir(root):
94
+ continue
95
+ if args.list_all:
96
+ buckets = [os.path.join(root, n) for n in sorted(os.listdir(root))]
97
+ elif args.cwd:
98
+ buckets = [os.path.join(root, dsh_session.project_key(args.cwd))]
99
+ else:
100
+ buckets = [
101
+ os.path.join(root, n)
102
+ for n in sorted(os.listdir(root))
103
+ if args.name in n
104
+ ]
105
+ for bucket in buckets:
106
+ if not os.path.isdir(bucket):
107
+ continue
108
+ for session in sorted(os.listdir(bucket)):
109
+ session_dir = os.path.join(bucket, session)
110
+ if not os.path.isdir(session_dir):
111
+ continue
112
+ for path in iter_session_files(session_dir):
113
+ if recent(path, cutoff):
114
+ found.append(path)
115
+
116
+ found.sort(key=lambda p: os.path.getmtime(p), reverse=True)
117
+ for path in found:
118
+ print(path)
119
+ return 0
120
+
121
+
122
+ if __name__ == "__main__":
123
+ sys.exit(main())
@@ -0,0 +1,225 @@
1
+ #!/usr/bin/env python3
2
+ """Read DeepSeek Harness (dsh) session files.
3
+
4
+ dsh stores each session as a single `session*.jsonl.zstd` file: **concatenated
5
+ zstd frames**, one per append. A plain `zstd -d` or `compression.zstd.decompress`
6
+ call stops after the first frame and silently loses the rest of the session, so
7
+ this module scans frame boundaries itself before decompressing each frame.
8
+
9
+ Requires Python 3.14+ (`compression.zstd` in the standard library). Import is
10
+ safe on older interpreters: `available()` reports whether reading will work and
11
+ callers degrade to "no dsh sessions" instead of crashing.
12
+ """
13
+ import json
14
+ import os
15
+ import sys
16
+
17
+ try:
18
+ from compression import zstd as _zstd
19
+ except ImportError: # Python < 3.14
20
+ _zstd = None
21
+
22
+ # zstd frame magic, little-endian 0xFD2FB528.
23
+ ZSTD_MAGIC = 4247762216
24
+
25
+ # dsh names session files `session.v<N>.jsonl.zstd` and, in older layouts,
26
+ # `session.jsonl.zstd`. Session directories are `session-<uuid>` or a bare uuid.
27
+ SESSION_FILE_PREFIX = "session"
28
+ SESSION_FILE_SUFFIX = ".jsonl.zstd"
29
+
30
+
31
+ def available():
32
+ """Report whether this interpreter can decompress dsh sessions."""
33
+ return _zstd is not None
34
+
35
+
36
+ def is_session_file(path):
37
+ """Report whether a path looks like a dsh session file."""
38
+ base = os.path.basename(path)
39
+ return base.startswith(SESSION_FILE_PREFIX) and base.endswith(SESSION_FILE_SUFFIX)
40
+
41
+
42
+ def project_key(cwd):
43
+ """Encode a project directory the way dsh names its session bucket.
44
+
45
+ Mirrors dsh's own `projectKey`: separators (`/`, `\\\\`, `:`) collapse into a
46
+ single `-` run, other unsafe code units become `~XXXX`, and the result is
47
+ wrapped in `--` with leading separators trimmed. Encoding the cwd exactly
48
+ means a repo's bucket is addressed directly instead of by fuzzy basename
49
+ match, so sibling repos (`my-repo` vs `my-repo-old`) never mix.
50
+ """
51
+ if not cwd:
52
+ raise ValueError("cannot encode an empty project path")
53
+ readable = ""
54
+ separator_run = False
55
+ for ch in cwd:
56
+ if ch in ("/", "\\", ":"):
57
+ if not separator_run:
58
+ readable += "-"
59
+ separator_run = True
60
+ elif ch != "~" and (ch.isascii() and (ch.isalnum() or ch in "._-")):
61
+ readable += ch
62
+ separator_run = False
63
+ else:
64
+ readable += "~" + format(ord(ch), "04X")
65
+ separator_run = False
66
+ trimmed = readable.lstrip("-") or "root"
67
+ return "--" + trimmed[:251] + "--"
68
+
69
+
70
+ def session_roots():
71
+ """Return the candidate dsh session roots, most specific first.
72
+
73
+ `DSH_HOME` relocates the whole state tree; without it dsh uses `~/.dsh`.
74
+ """
75
+ home = os.environ.get("DSH_HOME") or os.path.join(os.path.expanduser("~"), ".dsh")
76
+ return [os.path.join(home, "sessions")]
77
+
78
+
79
+ def scan_frames(buffer, max_frames=None):
80
+ """Locate concatenated zstd frames.
81
+
82
+ Walks each frame header and block list exactly as zstd frames are laid out:
83
+ magic, frame header descriptor, optional window/dictionary/content-size
84
+ fields, then blocks whose 3-byte header carries last-block, type, and size.
85
+
86
+ Returns `(frames, torn_start)` where `frames` is a list of `(start, end)`
87
+ byte ranges and `torn_start` is the offset of an incomplete trailing frame
88
+ (a crash mid-append), or None.
89
+ """
90
+ frames = []
91
+ offset = 0
92
+ limit = len(buffer)
93
+ while offset + 4 <= limit:
94
+ if max_frames is not None and len(frames) >= max_frames:
95
+ break
96
+ if int.from_bytes(buffer[offset:offset + 4], "little") != ZSTD_MAGIC:
97
+ # Not a frame boundary: the tail is corrupt or truncated.
98
+ return frames, offset
99
+ start = offset
100
+ offset += 4
101
+ if offset >= limit:
102
+ return frames, start
103
+ descriptor = buffer[offset]
104
+ offset += 1
105
+ if (descriptor & 24) != 0:
106
+ # Reserved frame-header bits set: this is not a frame boundary.
107
+ return frames, start
108
+ content_size_flag = descriptor >> 6
109
+ single_segment = (descriptor & 32) != 0
110
+ checksum = (descriptor & 4) != 0
111
+ dictionary_flag = descriptor & 3
112
+ dictionary_bytes = 4 if dictionary_flag == 3 else dictionary_flag
113
+ if content_size_flag == 0:
114
+ content_size_bytes = 1 if single_segment else 0
115
+ else:
116
+ content_size_bytes = 1 << content_size_flag
117
+ header_bytes = (0 if single_segment else 1) + dictionary_bytes + content_size_bytes
118
+ if offset + header_bytes > limit:
119
+ return frames, start
120
+ offset += header_bytes
121
+ while True:
122
+ if offset + 3 > limit:
123
+ return frames, start
124
+ header = int.from_bytes(buffer[offset:offset + 3], "little")
125
+ offset += 3
126
+ last_block = (header & 1) != 0
127
+ block_type = (header >> 1) & 3
128
+ block_size = header >> 3
129
+ if block_type == 3:
130
+ return frames, start
131
+ # Raw (0) and compressed (2) blocks carry block_size bytes; an RLE
132
+ # block carries a single byte repeated block_size times.
133
+ payload = 1 if block_type == 1 else block_size
134
+ if offset + payload > limit:
135
+ return frames, start
136
+ offset += payload
137
+ if last_block:
138
+ break
139
+ if checksum:
140
+ offset += 4
141
+ if offset > limit:
142
+ return frames, start
143
+ frames.append((start, offset))
144
+ return frames, None
145
+
146
+
147
+ def read_lines(path, max_lines=None):
148
+ """Decode a dsh session file into its JSONL lines.
149
+
150
+ Emits only complete decoded frames. A torn trailing frame (interrupted
151
+ append) is dropped rather than failing the whole read, matching how dsh
152
+ itself tolerates the last partial record.
153
+ """
154
+ if _zstd is None:
155
+ raise RuntimeError("Python 3.14+ required: `compression.zstd` is unavailable")
156
+ with open(path, "rb") as handle:
157
+ buffer = handle.read()
158
+ frames, _torn = scan_frames(buffer)
159
+ chunks = []
160
+ for start, end in frames:
161
+ try:
162
+ chunks.append(_zstd.decompress(buffer[start:end]))
163
+ except Exception: # noqa: BLE001 - a single bad frame must not hide the rest
164
+ continue
165
+ text = b"".join(chunks).decode("utf-8", errors="replace")
166
+ if max_lines is None:
167
+ return text.splitlines()
168
+ return text.splitlines()[:max_lines]
169
+
170
+
171
+ def read_objects(path, max_lines=None):
172
+ """Decode a dsh session file into parsed JSON objects, skipping bad lines."""
173
+ objects = []
174
+ for line in read_lines(path, max_lines):
175
+ stripped = line.strip()
176
+ if not stripped:
177
+ continue
178
+ try:
179
+ objects.append(json.loads(stripped))
180
+ except (json.JSONDecodeError, ValueError):
181
+ continue
182
+ return objects
183
+
184
+
185
+ def session_header(objects):
186
+ """Return the `type: session` header object, or None.
187
+
188
+ The header carries `id`, `cwd`, and `createdAt` (epoch milliseconds); it is
189
+ the first record dsh writes, so it survives any later truncation.
190
+ """
191
+ for obj in objects:
192
+ if isinstance(obj, dict) and obj.get("type") == "session":
193
+ return obj
194
+ return None
195
+
196
+
197
+ def iso_from_millis(value):
198
+ """Format dsh's epoch-millisecond timestamps as ISO 8601 UTC."""
199
+ if not isinstance(value, (int, float)):
200
+ return ""
201
+ from datetime import datetime, timezone
202
+
203
+ try:
204
+ return datetime.fromtimestamp(value / 1000.0, tz=timezone.utc).isoformat()
205
+ except (OverflowError, OSError, ValueError):
206
+ return ""
207
+
208
+
209
+ def content_text(blocks):
210
+ """Concatenate the text blocks of one dsh content array.
211
+
212
+ dsh content blocks are `{type: 'text'|'reasoning'|'tool-call'|'image', ...}`.
213
+ Only `text` is model- or user-authored prose; reasoning and tool calls stay
214
+ out so keyword scans cannot false-match tool names or inner monologue.
215
+ """
216
+ if isinstance(blocks, str):
217
+ return [blocks]
218
+ chunks = []
219
+ if isinstance(blocks, list):
220
+ for block in blocks:
221
+ if isinstance(block, dict) and block.get("type") == "text":
222
+ text = block.get("text")
223
+ if isinstance(text, str):
224
+ chunks.append(text)
225
+ return chunks