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.
- package/LICENSE +21 -0
- package/README.md +160 -2
- package/README.zh.md +161 -0
- package/cordis.patch.yml +6 -0
- package/lib/frontmatter.js +167 -0
- package/lib/index.js +46 -0
- package/lib/provider.js +201 -0
- package/package.json +62 -4
- package/skills/CODING_STANDARDS.md +68 -0
- package/skills/ce-babysit-pr/SKILL.md +59 -0
- package/skills/ce-babysit-pr/references/branch-currency.md +22 -0
- package/skills/ce-babysit-pr/references/envelope.md +44 -0
- package/skills/ce-babysit-pr/references/pipeline.md +15 -0
- package/skills/ce-babysit-pr/references/report.md +20 -0
- package/skills/ce-babysit-pr/references/settle.md +37 -0
- package/skills/ce-babysit-pr/references/setup.md +33 -0
- package/skills/ce-babysit-pr/references/stack-commands.md +39 -0
- package/skills/ce-babysit-pr/references/stack.md +43 -0
- package/skills/ce-babysit-pr/references/tick.md +102 -0
- package/skills/ce-babysit-pr/references/watch-loop.md +222 -0
- package/skills/ce-babysit-pr/scripts/pr-snapshot +3656 -0
- package/skills/ce-bakeoff/SKILL.md +48 -0
- package/skills/ce-bakeoff/references/candidates.md +37 -0
- package/skills/ce-bakeoff/references/judging.md +19 -0
- package/skills/ce-bakeoff/references/output.md +11 -0
- package/skills/ce-bakeoff/references/verification.md +15 -0
- package/skills/ce-brainstorm/SKILL.md +69 -0
- package/skills/ce-brainstorm/references/agents/slack-researcher.md +127 -0
- package/skills/ce-brainstorm/references/approaches.md +57 -0
- package/skills/ce-brainstorm/references/bakeoff.md +9 -0
- package/skills/ce-brainstorm/references/blindspot-pass.md +70 -0
- package/skills/ce-brainstorm/references/brainstorm-sections.md +458 -0
- package/skills/ce-brainstorm/references/dialogue.md +89 -0
- package/skills/ce-brainstorm/references/handoff.md +187 -0
- package/skills/ce-brainstorm/references/html-rendering.md +638 -0
- package/skills/ce-brainstorm/references/interaction-rules.md +33 -0
- package/skills/ce-brainstorm/references/markdown-rendering.md +242 -0
- package/skills/ce-brainstorm/references/model-tiers.md +13 -0
- package/skills/ce-brainstorm/references/output-mode.md +26 -0
- package/skills/ce-brainstorm/references/phase-0.md +104 -0
- package/skills/ce-brainstorm/references/plan-write.md +32 -0
- package/skills/ce-brainstorm/references/product-pressure-test.md +42 -0
- package/skills/ce-brainstorm/references/reasoning-elevation.md +124 -0
- package/skills/ce-brainstorm/references/settled-decisions.md +45 -0
- package/skills/ce-brainstorm/references/synthesis-summary.md +149 -0
- package/skills/ce-brainstorm/references/universal-brainstorming.md +72 -0
- package/skills/ce-brainstorm/references/verdict-routing.md +26 -0
- package/skills/ce-brainstorm/references/visual-probes.md +164 -0
- package/skills/ce-brainstorm/scripts/elevation-dispatch.sh +288 -0
- package/skills/ce-brainstorm/scripts/light-webserver.js +1275 -0
- package/skills/ce-brainstorm/scripts/packs-resolve.py +737 -0
- package/skills/ce-brainstorm/scripts/peer-job-runner.py +2594 -0
- package/skills/ce-code-review/SKILL.md +40 -0
- package/skills/ce-code-review/references/action-class-rubric.md +67 -0
- package/skills/ce-code-review/references/cross-model-recovery.md +38 -0
- package/skills/ce-code-review/references/cross-model-review.md +191 -0
- package/skills/ce-code-review/references/depth-paths.md +32 -0
- package/skills/ce-code-review/references/diff-scope.md +59 -0
- package/skills/ce-code-review/references/dispatch-reviewers.md +135 -0
- package/skills/ce-code-review/references/findings-schema.json +125 -0
- package/skills/ce-code-review/references/finish-input.md +118 -0
- package/skills/ce-code-review/references/finish-review.md +202 -0
- package/skills/ce-code-review/references/intent-and-plan.md +73 -0
- package/skills/ce-code-review/references/modes-and-output.md +156 -0
- package/skills/ce-code-review/references/persona-catalog.md +66 -0
- package/skills/ce-code-review/references/personas/adversarial-reviewer.md +111 -0
- package/skills/ce-code-review/references/personas/agent-native-reviewer.md +173 -0
- package/skills/ce-code-review/references/personas/api-contract-reviewer.md +44 -0
- package/skills/ce-code-review/references/personas/correctness-reviewer.md +48 -0
- package/skills/ce-code-review/references/personas/data-migration-reviewer.md +111 -0
- package/skills/ce-code-review/references/personas/deployment-verification-agent.md +157 -0
- package/skills/ce-code-review/references/personas/julik-frontend-races-reviewer.md +45 -0
- package/skills/ce-code-review/references/personas/learnings-researcher.md +260 -0
- package/skills/ce-code-review/references/personas/maintainability-reviewer.md +85 -0
- package/skills/ce-code-review/references/personas/performance-reviewer.md +45 -0
- package/skills/ce-code-review/references/personas/previous-comments-reviewer.md +59 -0
- package/skills/ce-code-review/references/personas/project-standards-reviewer.md +77 -0
- package/skills/ce-code-review/references/personas/reliability-reviewer.md +49 -0
- package/skills/ce-code-review/references/personas/security-reviewer.md +50 -0
- package/skills/ce-code-review/references/personas/swift-ios-reviewer.md +99 -0
- package/skills/ce-code-review/references/personas/testing-reviewer.md +51 -0
- package/skills/ce-code-review/references/review-output-template.md +172 -0
- package/skills/ce-code-review/references/scope.md +176 -0
- package/skills/ce-code-review/references/select-and-route.md +93 -0
- package/skills/ce-code-review/references/subagent-template.md +206 -0
- package/skills/ce-code-review/references/validator-batch-template.md +67 -0
- package/skills/ce-code-review/scripts/cross-model-adversarial-review.sh +1275 -0
- package/skills/ce-code-review/scripts/findings-mechanics.py +274 -0
- package/skills/ce-code-review/scripts/packs-resolve.py +737 -0
- package/skills/ce-code-review/scripts/peer-job-runner.py +2594 -0
- package/skills/ce-code-review/scripts/review-scope.py +419 -0
- package/skills/ce-code-review/scripts/run-log.py +280 -0
- package/skills/ce-commit/SKILL.md +60 -0
- package/skills/ce-commit-push-pr/SKILL.md +69 -0
- package/skills/ce-commit-push-pr/references/apply-and-handoff.md +79 -0
- package/skills/ce-commit-push-pr/references/branch-creation.md +47 -0
- package/skills/ce-commit-push-pr/references/commit-and-push.md +26 -0
- package/skills/ce-commit-push-pr/references/compose.md +29 -0
- package/skills/ce-commit-push-pr/references/context.md +42 -0
- package/skills/ce-commit-push-pr/references/gh-stack-cli.md +83 -0
- package/skills/ce-commit-push-pr/references/pr-description-writing.md +208 -0
- package/skills/ce-commit-push-pr/references/stack-submit.md +81 -0
- package/skills/ce-compound/SKILL.md +79 -0
- package/skills/ce-compound/assets/resolution-template.md +96 -0
- package/skills/ce-compound/references/agents/best-practices-researcher.md +115 -0
- package/skills/ce-compound/references/agents/data-integrity-guardian.md +68 -0
- package/skills/ce-compound/references/agents/framework-docs-researcher.md +93 -0
- package/skills/ce-compound/references/agents/pattern-recognition-specialist.md +55 -0
- package/skills/ce-compound/references/agents/performance-oracle.md +108 -0
- package/skills/ce-compound/references/agents/security-sentinel.md +91 -0
- package/skills/ce-compound/references/agents/session-historian.md +82 -0
- package/skills/ce-compound/references/assembly.md +127 -0
- package/skills/ce-compound/references/concepts-vocabulary.md +98 -0
- package/skills/ce-compound/references/enhancement.md +42 -0
- package/skills/ce-compound/references/grounding-validation.md +89 -0
- package/skills/ce-compound/references/lightweight.md +56 -0
- package/skills/ce-compound/references/modes.md +13 -0
- package/skills/ce-compound/references/refresh-and-discoverability.md +96 -0
- package/skills/ce-compound/references/report.md +115 -0
- package/skills/ce-compound/references/research.md +144 -0
- package/skills/ce-compound/references/schema.yaml +236 -0
- package/skills/ce-compound/references/session-history.md +73 -0
- package/skills/ce-compound/references/yaml-schema.md +130 -0
- package/skills/ce-compound/scripts/packs-resolve.py +737 -0
- package/skills/ce-compound/scripts/session-history/__pycache__/dsh_session.cpython-314.pyc +0 -0
- package/skills/ce-compound/scripts/session-history/discover-sessions.sh +290 -0
- package/skills/ce-compound/scripts/session-history/discover_dsh.py +123 -0
- package/skills/ce-compound/scripts/session-history/dsh_session.py +225 -0
- package/skills/ce-compound/scripts/session-history/extract-errors.py +178 -0
- package/skills/ce-compound/scripts/session-history/extract-metadata.py +301 -0
- package/skills/ce-compound/scripts/session-history/extract-skeleton.py +346 -0
- package/skills/ce-compound/scripts/validate-doc-claims.py +497 -0
- package/skills/ce-compound/scripts/validate-frontmatter.py +137 -0
- package/skills/ce-compound-refresh/SKILL.md +88 -0
- package/skills/ce-compound-refresh/assets/resolution-template.md +96 -0
- package/skills/ce-compound-refresh/references/classify.md +42 -0
- package/skills/ce-compound-refresh/references/commit.md +7 -0
- package/skills/ce-compound-refresh/references/concepts-vocabulary.md +116 -0
- package/skills/ce-compound-refresh/references/discoverability.md +15 -0
- package/skills/ce-compound-refresh/references/investigate.md +23 -0
- package/skills/ce-compound-refresh/references/modes.md +27 -0
- package/skills/ce-compound-refresh/references/per-action-flows.md +142 -0
- package/skills/ce-compound-refresh/references/report.md +23 -0
- package/skills/ce-compound-refresh/references/schema.yaml +236 -0
- package/skills/ce-compound-refresh/references/scope.md +18 -0
- package/skills/ce-compound-refresh/references/worth-audit.md +35 -0
- package/skills/ce-compound-refresh/references/yaml-schema.md +130 -0
- package/skills/ce-compound-refresh/scripts/validate-doc-claims.py +497 -0
- package/skills/ce-compound-refresh/scripts/validate-frontmatter.py +137 -0
- package/skills/ce-debug/SKILL.md +122 -0
- package/skills/ce-debug/references/anti-patterns.md +91 -0
- package/skills/ce-debug/references/defense-in-depth.md +39 -0
- package/skills/ce-debug/references/fix.md +21 -0
- package/skills/ce-debug/references/investigate.md +114 -0
- package/skills/ce-debug/references/investigation-techniques.md +384 -0
- package/skills/ce-debug/references/pipeline-mode.md +78 -0
- package/skills/ce-debug/references/post-fix-handoff.md +60 -0
- package/skills/ce-debug/references/return-to-caller.md +57 -0
- package/skills/ce-doc-review/SKILL.md +75 -0
- package/skills/ce-doc-review/references/bulk-preview.md +146 -0
- package/skills/ce-doc-review/references/cross-model-review.md +207 -0
- package/skills/ce-doc-review/references/decision-primer.md +47 -0
- package/skills/ce-doc-review/references/dispatch.md +56 -0
- package/skills/ce-doc-review/references/document-intake.md +44 -0
- package/skills/ce-doc-review/references/findings-schema.json +85 -0
- package/skills/ce-doc-review/references/modes.md +20 -0
- package/skills/ce-doc-review/references/open-questions-defer.md +158 -0
- package/skills/ce-doc-review/references/persona-selection.md +41 -0
- package/skills/ce-doc-review/references/personas/adversarial-document-reviewer.md +109 -0
- package/skills/ce-doc-review/references/personas/coherence-reviewer.md +69 -0
- package/skills/ce-doc-review/references/personas/design-lens-reviewer.md +48 -0
- package/skills/ce-doc-review/references/personas/feasibility-reviewer.md +50 -0
- package/skills/ce-doc-review/references/personas/product-lens-reviewer.md +85 -0
- package/skills/ce-doc-review/references/personas/scope-guardian-reviewer.md +83 -0
- package/skills/ce-doc-review/references/personas/security-lens-reviewer.md +41 -0
- package/skills/ce-doc-review/references/personas/whole-doc-reviewer.md +25 -0
- package/skills/ce-doc-review/references/rendering-floor.md +175 -0
- package/skills/ce-doc-review/references/review-output-template.md +123 -0
- package/skills/ce-doc-review/references/subagent-template.md +188 -0
- package/skills/ce-doc-review/references/synthesis-and-presentation.md +350 -0
- package/skills/ce-doc-review/references/walkthrough.md +347 -0
- package/skills/ce-doc-review/scripts/cross-model-doc-review.sh +1270 -0
- package/skills/ce-doc-review/scripts/packs-resolve.py +737 -0
- package/skills/ce-doc-review/scripts/peer-job-runner.py +2594 -0
- package/skills/ce-dogfood/SKILL.md +66 -0
- package/skills/ce-dogfood/agents/openai.yaml +2 -0
- package/skills/ce-dogfood/references/dogfood-report-template.md +97 -0
- package/skills/ce-dogfood/references/phases.md +167 -0
- package/skills/ce-dogfood/references/test-matrix-taxonomy.md +62 -0
- package/skills/ce-dogfood/scripts/packs-resolve.py +737 -0
- package/skills/ce-explain/SKILL.md +81 -0
- package/skills/ce-explain/references/agents/behavior-trace-scout.md +19 -0
- package/skills/ce-explain/references/agents/work-recap-scout.md +23 -0
- package/skills/ce-explain/references/check-in.md +18 -0
- package/skills/ce-explain/references/destinations.md +35 -0
- package/skills/ce-explain/references/explainer-html.md +29 -0
- package/skills/ce-explain/references/explainer-markdown.md +24 -0
- package/skills/ce-explain/references/intake.md +50 -0
- package/skills/ce-explain/references/orchestration.md +46 -0
- package/skills/ce-handoff/SKILL.md +54 -0
- package/skills/ce-handoff/references/create.md +88 -0
- package/skills/ce-handoff/references/resume.md +46 -0
- package/skills/ce-ideate/SKILL.md +75 -0
- package/skills/ce-ideate/references/agents/issue-intelligence-analyst.md +166 -0
- package/skills/ce-ideate/references/agents/learnings-researcher.md +247 -0
- package/skills/ce-ideate/references/agents/slack-researcher.md +127 -0
- package/skills/ce-ideate/references/agents/web-researcher.md +121 -0
- package/skills/ce-ideate/references/decomposition.md +39 -0
- package/skills/ce-ideate/references/divergent-ideation.md +112 -0
- package/skills/ce-ideate/references/grounding.md +138 -0
- package/skills/ce-ideate/references/html-rendering.md +638 -0
- package/skills/ce-ideate/references/ideation-sections.md +191 -0
- package/skills/ce-ideate/references/issue-intelligence.md +44 -0
- package/skills/ce-ideate/references/markdown-rendering.md +242 -0
- package/skills/ce-ideate/references/output-mode.md +34 -0
- package/skills/ce-ideate/references/post-ideation-workflow.md +169 -0
- package/skills/ce-ideate/references/scope-gates.md +148 -0
- package/skills/ce-ideate/references/universal-ideation.md +119 -0
- package/skills/ce-ideate/references/user-research-artifacts.md +28 -0
- package/skills/ce-ideate/references/web-research-cache.md +56 -0
- package/skills/ce-noslop/SKILL.md +45 -0
- package/skills/ce-noslop/references/patterns.md +61 -0
- package/skills/ce-noslop/references/terminology.md +3 -0
- package/skills/ce-optimize/SKILL.md +64 -0
- package/skills/ce-optimize/references/agents/learnings-researcher.md +247 -0
- package/skills/ce-optimize/references/agents/repo-research-analyst.md +258 -0
- package/skills/ce-optimize/references/example-expensive-benchmark-spec.yaml +88 -0
- package/skills/ce-optimize/references/example-hard-spec.yaml +64 -0
- package/skills/ce-optimize/references/example-judge-spec.yaml +83 -0
- package/skills/ce-optimize/references/example-text-target-spec.yaml +80 -0
- package/skills/ce-optimize/references/experiment-log-schema.yaml +563 -0
- package/skills/ce-optimize/references/experiment-prompt-template.md +143 -0
- package/skills/ce-optimize/references/judge-prompt-template.md +117 -0
- package/skills/ce-optimize/references/loop.md +286 -0
- package/skills/ce-optimize/references/measurement.md +168 -0
- package/skills/ce-optimize/references/optimize-spec-schema.yaml +570 -0
- package/skills/ce-optimize/references/persistence.md +93 -0
- package/skills/ce-optimize/references/spec.md +107 -0
- package/skills/ce-optimize/references/text-targets.md +51 -0
- package/skills/ce-optimize/references/usage-guide.md +147 -0
- package/skills/ce-optimize/references/wrap-up.md +54 -0
- package/skills/ce-optimize/scripts/decide.mjs +676 -0
- package/skills/ce-optimize/scripts/experiment-worktree.sh +330 -0
- package/skills/ce-optimize/scripts/measure.sh +140 -0
- package/skills/ce-optimize/scripts/parallel-probe.sh +134 -0
- package/skills/ce-plan/SKILL.md +60 -0
- package/skills/ce-plan/references/agents/agent-native-planning-strategist.md +66 -0
- package/skills/ce-plan/references/agents/architecture-strategist.md +46 -0
- package/skills/ce-plan/references/agents/best-practices-researcher.md +118 -0
- package/skills/ce-plan/references/agents/data-integrity-guardian.md +68 -0
- package/skills/ce-plan/references/agents/framework-docs-researcher.md +97 -0
- package/skills/ce-plan/references/agents/git-history-analyzer.md +40 -0
- package/skills/ce-plan/references/agents/learnings-researcher.md +268 -0
- package/skills/ce-plan/references/agents/pattern-recognition-specialist.md +55 -0
- package/skills/ce-plan/references/agents/performance-oracle.md +108 -0
- package/skills/ce-plan/references/agents/repo-research-analyst.md +262 -0
- package/skills/ce-plan/references/agents/security-sentinel.md +91 -0
- package/skills/ce-plan/references/agents/slack-researcher.md +131 -0
- package/skills/ce-plan/references/agents/spec-flow-analyzer.md +84 -0
- package/skills/ce-plan/references/agents/web-researcher.md +125 -0
- package/skills/ce-plan/references/approach-altitude.md +55 -0
- package/skills/ce-plan/references/bakeoff.md +9 -0
- package/skills/ce-plan/references/deepening-workflow.md +263 -0
- package/skills/ce-plan/references/final-review.md +134 -0
- package/skills/ce-plan/references/html-rendering.md +638 -0
- package/skills/ce-plan/references/intake.md +158 -0
- package/skills/ce-plan/references/markdown-rendering.md +242 -0
- package/skills/ce-plan/references/output-contracts.md +29 -0
- package/skills/ce-plan/references/output-mode.md +45 -0
- package/skills/ce-plan/references/plan-handoff.md +116 -0
- package/skills/ce-plan/references/plan-sections.md +489 -0
- package/skills/ce-plan/references/reasoning-elevation.md +124 -0
- package/skills/ce-plan/references/research.md +211 -0
- package/skills/ce-plan/references/resume.md +61 -0
- package/skills/ce-plan/references/settled-decisions.md +45 -0
- package/skills/ce-plan/references/structure.md +207 -0
- package/skills/ce-plan/references/synthesis-summary.md +260 -0
- package/skills/ce-plan/references/universal-planning.md +170 -0
- package/skills/ce-plan/scripts/elevation-dispatch.sh +288 -0
- package/skills/ce-plan/scripts/packs-resolve.py +737 -0
- package/skills/ce-plan/scripts/peer-job-runner.py +2594 -0
- package/skills/ce-polish/SKILL.md +22 -0
- package/skills/ce-polish/agents/openai.yaml +2 -0
- package/skills/ce-polish/references/dev-server-astro.md +58 -0
- package/skills/ce-polish/references/dev-server-detection.md +40 -0
- package/skills/ce-polish/references/dev-server-next.md +61 -0
- package/skills/ce-polish/references/dev-server-nuxt.md +58 -0
- package/skills/ce-polish/references/dev-server-procfile.md +59 -0
- package/skills/ce-polish/references/dev-server-rails.md +50 -0
- package/skills/ce-polish/references/dev-server-remix.md +58 -0
- package/skills/ce-polish/references/dev-server-sveltekit.md +58 -0
- package/skills/ce-polish/references/dev-server-vite.md +48 -0
- package/skills/ce-polish/references/install-riffrec.md +35 -0
- package/skills/ce-polish/references/launch-json-schema.md +177 -0
- package/skills/ce-polish/references/live-loop.md +98 -0
- package/skills/ce-polish/references/live-remote.md +35 -0
- package/skills/ce-polish/references/live-start.md +93 -0
- package/skills/ce-polish/references/live-stream-contract.md +253 -0
- package/skills/ce-polish/references/run.md +67 -0
- package/skills/ce-polish/scripts/detect-project-type.sh +277 -0
- package/skills/ce-polish/scripts/detect-riffrec.sh +225 -0
- package/skills/ce-polish/scripts/live-endpoint.js +2841 -0
- package/skills/ce-polish/scripts/read-launch-json.sh +117 -0
- package/skills/ce-polish/scripts/resolve-package-manager.sh +95 -0
- package/skills/ce-polish/scripts/resolve-port.sh +307 -0
- package/skills/ce-pov/SKILL.md +64 -0
- package/skills/ce-pov/references/agents/external-evidence-researcher.md +26 -0
- package/skills/ce-pov/references/agents/pov-peer.md +43 -0
- package/skills/ce-pov/references/agents/precedent-activity-scout.md +21 -0
- package/skills/ce-pov/references/agents/project-grounding-scout.md +32 -0
- package/skills/ce-pov/references/boundaries.md +36 -0
- package/skills/ce-pov/references/cross-model-panel.md +596 -0
- package/skills/ce-pov/references/followup.md +9 -0
- package/skills/ce-pov/references/grounding.md +47 -0
- package/skills/ce-pov/references/intake.md +61 -0
- package/skills/ce-pov/references/invocation.md +47 -0
- package/skills/ce-pov/references/method.md +68 -0
- package/skills/ce-pov/references/pov-schema.json +56 -0
- package/skills/ce-pov/references/report.md +7 -0
- package/skills/ce-pov/scripts/cross-model-pov.sh +1110 -0
- package/skills/ce-pov/scripts/peer-job-runner.py +2594 -0
- package/skills/ce-product-pulse/SKILL.md +81 -0
- package/skills/ce-product-pulse/agents/openai.yaml +2 -0
- package/skills/ce-product-pulse/references/config.md +20 -0
- package/skills/ce-product-pulse/references/interview.md +260 -0
- package/skills/ce-product-pulse/references/report-template.md +89 -0
- package/skills/ce-product-pulse/references/run.md +46 -0
- package/skills/ce-product-pulse/references/setup.md +43 -0
- package/skills/ce-promote/SKILL.md +90 -0
- package/skills/ce-promote/agents/openai.yaml +2 -0
- package/skills/ce-promote/references/spiral-cli.md +149 -0
- package/skills/ce-proof/SKILL.md +65 -0
- package/skills/ce-proof/references/api.md +176 -0
- package/skills/ce-proof/references/workflows.md +124 -0
- package/skills/ce-prototype/SKILL.md +59 -0
- package/skills/ce-prototype/assets/annotate.css +206 -0
- package/skills/ce-prototype/assets/annotate.js +837 -0
- package/skills/ce-prototype/references/annotation-loop.md +32 -0
- package/skills/ce-prototype/references/build.md +39 -0
- package/skills/ce-prototype/references/craft-floor.md +43 -0
- package/skills/ce-prototype/references/preview.md +118 -0
- package/skills/ce-prototype/references/scoping.md +38 -0
- package/skills/ce-prototype/references/write-back.md +37 -0
- package/skills/ce-prototype/scripts/light-webserver.js +1275 -0
- package/skills/ce-resolve-pr-feedback/SKILL.md +60 -0
- package/skills/ce-resolve-pr-feedback/references/agents/pr-comment-resolver.md +59 -0
- package/skills/ce-resolve-pr-feedback/references/evaluation-rubric.md +141 -0
- package/skills/ce-resolve-pr-feedback/references/full-mode.md +336 -0
- package/skills/ce-resolve-pr-feedback/references/pipeline-mode.md +23 -0
- package/skills/ce-resolve-pr-feedback/references/resume.md +60 -0
- package/skills/ce-resolve-pr-feedback/references/return-to-caller.md +111 -0
- package/skills/ce-resolve-pr-feedback/references/targeted-mode.md +48 -0
- package/skills/ce-resolve-pr-feedback/scripts/get-pr-comments +176 -0
- package/skills/ce-resolve-pr-feedback/scripts/get-thread-for-comment +84 -0
- package/skills/ce-resolve-pr-feedback/scripts/pending-feedback.py +287 -0
- package/skills/ce-resolve-pr-feedback/scripts/reply-to-pr-thread +57 -0
- package/skills/ce-resolve-pr-feedback/scripts/resolve-pr-thread +23 -0
- package/skills/ce-retune/SKILL.md +42 -0
- package/skills/ce-retune/agents/openai.yaml +2 -0
- package/skills/ce-retune/references/baseline-mining.md +122 -0
- package/skills/ce-retune/references/corpus-audit.md +128 -0
- package/skills/ce-retune/references/cut-passes.md +129 -0
- package/skills/ce-retune/references/halt-taxonomy.md +123 -0
- package/skills/ce-retune/references/noise-floor.md +131 -0
- package/skills/ce-retune/references/workflow-shapes.md +73 -0
- package/skills/ce-riffrec-feedback-analysis/SKILL.md +33 -0
- package/skills/ce-riffrec-feedback-analysis/references/analyzer.md +18 -0
- package/skills/ce-riffrec-feedback-analysis/references/compound-engineering-feedback-format.md +116 -0
- package/skills/ce-riffrec-feedback-analysis/references/extensive-analysis.md +98 -0
- package/skills/ce-riffrec-feedback-analysis/references/install-riffrec.md +27 -0
- package/skills/ce-riffrec-feedback-analysis/references/quick-bug-report.md +38 -0
- package/skills/ce-riffrec-feedback-analysis/scripts/analyze_riffrec_zip.py +1306 -0
- package/skills/ce-setup/SKILL.md +103 -0
- package/skills/ce-setup/agents/openai.yaml +2 -0
- package/skills/ce-setup/assets/compounding-directive.md +11 -0
- package/skills/ce-setup/assets/noslop-directive.md +7 -0
- package/skills/ce-setup/assets/pack-rule-template.md +11 -0
- package/skills/ce-setup/references/acpx-cache-warm.md +14 -0
- package/skills/ce-setup/references/config-template.yaml +210 -0
- package/skills/ce-setup/references/legacy-codex-tool-map.md +15 -0
- package/skills/ce-setup/references/pack-scaffold.md +45 -0
- package/skills/ce-setup/references/repo-fixes.md +121 -0
- package/skills/ce-setup/scripts/check-health +929 -0
- package/skills/ce-setup/scripts/packs-resolve.py +737 -0
- package/skills/ce-simplify-code/SKILL.md +76 -0
- package/skills/ce-simplify-code/references/personas/code-quality-reviewer.md +17 -0
- package/skills/ce-simplify-code/references/personas/code-reuse-reviewer.md +7 -0
- package/skills/ce-simplify-code/references/personas/comment-reviewer.md +24 -0
- package/skills/ce-simplify-code/references/personas/efficiency-reviewer.md +11 -0
- package/skills/ce-simplify-code/references/personas/test-value-reviewer.md +23 -0
- package/skills/ce-simplify-code/references/reviewer-dispatch.md +11 -0
- package/skills/ce-simplify-code/references/standalone-report.md +25 -0
- package/skills/ce-strategy/SKILL.md +61 -0
- package/skills/ce-strategy/references/grounding.md +22 -0
- package/skills/ce-strategy/references/interview.md +179 -0
- package/skills/ce-strategy/references/strategy-template.md +94 -0
- package/skills/ce-strategy/references/update-run.md +33 -0
- package/skills/ce-sweep/SKILL.md +93 -0
- package/skills/ce-sweep/agents/openai.yaml +2 -0
- package/skills/ce-sweep/references/agents/media-analyzer.md +54 -0
- package/skills/ce-sweep/references/interview.md +208 -0
- package/skills/ce-sweep/references/model-tiers.md +13 -0
- package/skills/ce-sweep/references/plan-template.md +62 -0
- package/skills/ce-sweep/references/run.md +126 -0
- package/skills/ce-sweep/references/sources/email.md +57 -0
- package/skills/ce-sweep/references/sources/github-issues.md +59 -0
- package/skills/ce-sweep/references/sources/slack.md +61 -0
- package/skills/ce-sweep/references/state-schema.md +157 -0
- package/skills/ce-sweep/references/subagent-template.md +60 -0
- package/skills/ce-sweep/scripts/analyze_riffrec_zip.py +1306 -0
- package/skills/ce-sweep/scripts/sweep-state.py +793 -0
- package/skills/ce-test-browser/SKILL.md +50 -0
- package/skills/ce-test-browser/references/agent-browser-driver.md +47 -0
- package/skills/ce-test-browser/references/pipeline-orchestration.md +45 -0
- package/skills/ce-test-browser/references/route-and-report.md +129 -0
- package/skills/ce-test-browser/scripts/resolve-port.sh +41 -0
- package/skills/ce-test-xcode/SKILL.md +26 -0
- package/skills/ce-test-xcode/agents/openai.yaml +2 -0
- package/skills/ce-test-xcode/references/setup-and-build.md +32 -0
- package/skills/ce-test-xcode/references/test-and-report.md +64 -0
- package/skills/ce-work/SKILL.md +62 -0
- package/skills/ce-work/references/agents/figma-design-sync.md +27 -0
- package/skills/ce-work/references/agents/implementation-worker.md +17 -0
- package/skills/ce-work/references/cross-model-execution.md +191 -0
- package/skills/ce-work/references/execution-engines.md +64 -0
- package/skills/ce-work/references/execution-strategy.md +73 -0
- package/skills/ce-work/references/implementation-loop.md +107 -0
- package/skills/ce-work/references/implementation-result-schema.json +52 -0
- package/skills/ce-work/references/input-triage.md +50 -0
- package/skills/ce-work/references/non-code-execution.md +23 -0
- package/skills/ce-work/references/return-to-caller.md +33 -0
- package/skills/ce-work/references/review-findings-followup.md +82 -0
- package/skills/ce-work/references/shipping-workflow.md +89 -0
- package/skills/ce-work/references/tracker-defer.md +150 -0
- package/skills/ce-work/references/work-intake.md +51 -0
- package/skills/ce-work/references/workspace-setup.md +27 -0
- package/skills/ce-work/scripts/__pycache__/unit_workspace_jobs.cpython-314.pyc +0 -0
- package/skills/ce-work/scripts/__pycache__/unit_workspace_state.cpython-314.pyc +0 -0
- package/skills/ce-work/scripts/cross-model-work.sh +1385 -0
- package/skills/ce-work/scripts/peer-job-runner.py +2594 -0
- package/skills/ce-work/scripts/unit-workspace.py +215 -0
- package/skills/ce-work/scripts/unit_workspace_ignored.py +93 -0
- package/skills/ce-work/scripts/unit_workspace_integration.py +677 -0
- package/skills/ce-work/scripts/unit_workspace_jobs.py +1216 -0
- package/skills/ce-work/scripts/unit_workspace_lifecycle.py +981 -0
- package/skills/ce-work/scripts/unit_workspace_state.py +1379 -0
- package/skills/ce-work/scripts/unit_workspace_transaction.py +612 -0
- package/skills/ce-worktree/SKILL.md +54 -0
- package/skills/lfg/SKILL.md +59 -0
- package/skills/lfg/references/debug-return.md +25 -0
- package/skills/lfg/references/intake.md +30 -0
- package/skills/lfg/references/next-work-handoff.md +96 -0
- package/skills/lfg/references/plan-brief.md +36 -0
- package/skills/lfg/references/review-followup.md +78 -0
- package/skills/lfg/references/shipping.md +65 -0
- package/skills/lfg/references/stage-routing.md +49 -0
- package/skills/lfg/references/task-visibility.md +11 -0
- package/skills/lfg/references/tracker-defer.md +150 -0
- package/skills/lfg/references/work-return.md +27 -0
- package/skills/wtf/SKILL.md +33 -0
- package/skills/wtf/agents/openai.yaml +2 -0
|
Binary file
|
|
@@ -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
|