codymaster 4.8.0 → 7.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +331 -7
- package/README.md +226 -296
- package/dist/advisory-handoff.js +89 -0
- package/dist/advisory-report.js +105 -0
- package/dist/agent/antigravity.js +152 -0
- package/dist/agent/backend.js +2 -0
- package/dist/agent/claude.js +196 -0
- package/dist/agent/codex.js +204 -0
- package/dist/agent/copilot.js +284 -0
- package/dist/agent/cursor.js +211 -0
- package/dist/agent/factory.js +30 -0
- package/dist/agent/gemini.js +142 -0
- package/dist/agent/opencode.js +205 -0
- package/dist/agent/spawn-helper.js +237 -0
- package/dist/agent/version.js +25 -0
- package/dist/browse/adapter-factory.js +69 -0
- package/dist/browse/adapters/agent-browser-adapter.js +305 -0
- package/dist/browse/adapters/playwright-adapter.js +309 -0
- package/dist/browse/adapters/types.js +6 -0
- package/dist/browse/error-collector.js +132 -0
- package/dist/browse/event-log.js +109 -0
- package/dist/browse/index.js +17 -0
- package/dist/browse-server.js +204 -120
- package/dist/cli/command-registry.js +20 -0
- package/dist/cli/commands/bench.js +69 -0
- package/dist/cli/commands/brain.js +108 -0
- package/dist/cli/commands/dashboard.js +76 -2
- package/dist/cli/commands/engineering.js +326 -4
- package/dist/cli/commands/evolve.js +123 -0
- package/dist/cli/commands/install.js +160 -0
- package/dist/cli/commands/learn.js +181 -0
- package/dist/cli/commands/mcp-serve.js +104 -0
- package/dist/cli/commands/parallel.js +138 -0
- package/dist/cli/commands/quality.js +105 -0
- package/dist/cli/commands/stack.js +49 -0
- package/dist/cli/commands/update.js +159 -0
- package/dist/cli/update-check.js +94 -10
- package/dist/cm-config.js +0 -18
- package/dist/codybench/judges/automated.js +31 -0
- package/dist/codybench/runners/claude-code.js +32 -0
- package/dist/codybench/suites/memory-retention.js +85 -0
- package/dist/codybench/suites/tdd-regression.js +35 -0
- package/dist/codybench/suites/token-efficiency.js +55 -0
- package/dist/codybench/types.js +2 -0
- package/dist/context-db.js +157 -0
- package/dist/continuity.js +5 -7
- package/dist/dashboard.js +47 -6
- package/dist/data.js +35 -0
- package/dist/execution/tdd-gate.js +113 -0
- package/dist/execution-analyzer.js +138 -0
- package/dist/executor/cancel.js +34 -0
- package/dist/executor/gc.js +74 -0
- package/dist/executor/index.js +14 -0
- package/dist/executor/runner.js +70 -0
- package/dist/executor/workdir.js +31 -0
- package/dist/handoff/contracts.js +22 -0
- package/dist/handoff/index.js +18 -0
- package/dist/handoff/io.js +121 -0
- package/dist/index.js +7 -3
- package/dist/indexer/skills-lib.js +533 -0
- package/dist/indexer/skills-map.js +1374 -0
- package/dist/indexer/skills.js +16 -0
- package/dist/indexer/stack-detect.js +219 -0
- package/dist/install/copy.js +98 -0
- package/dist/install/engine.js +42 -0
- package/dist/install/paths.js +70 -0
- package/dist/install/platforms/_simple.js +85 -0
- package/dist/install/platforms/antigravity.js +91 -0
- package/dist/install/platforms/claude-code.js +107 -0
- package/dist/install/platforms/cursor.js +77 -0
- package/dist/install/platforms/index.js +27 -0
- package/dist/install/platforms/simple.js +163 -0
- package/dist/install/profiles.js +75 -0
- package/dist/install/types.js +2 -0
- package/dist/learning-promoter.js +246 -0
- package/dist/learnings.js +208 -0
- package/dist/mcp-context-server.js +230 -1
- package/dist/middleware/metrics.js +30 -0
- package/dist/middleware/security-headers.js +14 -0
- package/dist/realtime/event-bus.js +29 -0
- package/dist/realtime/ws-hub.js +91 -0
- package/dist/schemas/task-schema.js +48 -0
- package/dist/schemas/validate.js +18 -0
- package/dist/skill-chain.js +63 -1
- package/dist/skill-evolver.js +456 -0
- package/dist/skill-execution-cache.js +254 -0
- package/dist/skills-lock.js +96 -0
- package/dist/smart-brain-router.js +184 -0
- package/dist/sprint-pipeline.js +26 -0
- package/dist/storage/index.js +21 -0
- package/dist/storage/repos/activity-repo.js +46 -0
- package/dist/storage/repos/message-repo.js +39 -0
- package/dist/storage/repos/project-repo.js +56 -0
- package/dist/storage/repos/task-repo.js +142 -0
- package/dist/storage/services/project-service.js +49 -0
- package/dist/storage/services/task-service.js +97 -0
- package/dist/storage/sqlite.js +113 -0
- package/dist/storage-backend.js +10 -8
- package/dist/tier-classify.js +131 -0
- package/dist/token-budget.js +88 -0
- package/dist/ui/onboarding.js +51 -15
- package/dist/utils/cli-utils.js +7 -2
- package/dist/utils/design-taste.js +108 -0
- package/dist/utils/output-compress.js +143 -0
- package/dist/vibecoding-index.js +126 -0
- package/package.json +20 -6
- package/public/dashboard/app.js +52 -1
- package/scripts/build-skills-lock.mjs +88 -0
- package/scripts/build-skills.mjs +187 -28
- package/scripts/compress-skill.mjs +73 -0
- package/scripts/deprecate-skill.mjs +72 -0
- package/scripts/install.sh +170 -0
- package/scripts/mcp-bridge.js +2 -2
- package/scripts/postinstall.js +53 -335
- package/scripts/update-changelog.sh +88 -0
- package/scripts/validate-skills.mjs +101 -4
- package/skills/CLAUDE.md +0 -5
- package/skills/_shared/SKILL_TEMPLATE.md +62 -0
- package/skills/_shared/helpers.md +2 -8
- package/skills/cm-autopilot/scripts/autopilot.py +19 -2
- package/skills/cm-brainstorm-idea/SKILL.md +9 -0
- package/skills/cm-browse/SKILL.md +6 -0
- package/skills/cm-clean-code/SKILL.md +20 -0
- package/skills/cm-code-review/SKILL.md +21 -0
- package/skills/cm-codeintell/SKILL.md +9 -0
- package/skills/cm-conductor-worktrees/SKILL.archive.md +28 -0
- package/skills/cm-conductor-worktrees/SKILL.md +20 -18
- package/skills/cm-continuity/SKILL.md +41 -33
- package/skills/cm-dashboard/SKILL.archive.md +15 -0
- package/skills/cm-dashboard/SKILL.md +20 -9
- package/skills/cm-dashboard/ui/app.js +9 -1
- package/skills/cm-debugging/SKILL.md +9 -0
- package/skills/cm-design-studio/SKILL.archive.md +34 -0
- package/skills/cm-design-studio/SKILL.md +20 -24
- package/skills/cm-design-system/SKILL.md +1 -0
- package/skills/cm-ecosystem-roadmap/SKILL.md +4 -0
- package/skills/cm-engineering-meta/SKILL.archive.md +73 -0
- package/skills/cm-engineering-meta/SKILL.md +19 -62
- package/skills/cm-execution/SKILL.md +98 -0
- package/skills/cm-git-worktrees/SKILL.archive.md +157 -0
- package/skills/cm-git-worktrees/SKILL.md +15 -146
- package/skills/cm-guardian-runtime/SKILL.md +5 -1
- package/skills/cm-identity-guard/SKILL.md +8 -0
- package/skills/cm-mcp-engineering/SKILL.md +4 -0
- package/skills/cm-planning/SKILL.md +63 -92
- package/skills/cm-post-deploy-canary/SKILL.archive.md +22 -0
- package/skills/cm-post-deploy-canary/SKILL.md +20 -12
- package/skills/cm-project-bootstrap/SKILL.md +11 -0
- package/skills/cm-qa-visual-cli/SKILL.archive.md +22 -0
- package/skills/cm-qa-visual-cli/SKILL.md +19 -11
- package/skills/cm-quality-gate/SKILL.md +38 -0
- package/skills/cm-retro-cli/SKILL.md +4 -0
- package/skills/cm-safe-deploy/SKILL.md +9 -0
- package/skills/cm-second-opinion-cli/SKILL.archive.md +23 -0
- package/skills/cm-second-opinion-cli/SKILL.md +20 -13
- package/skills/cm-secret-shield/SKILL.archive.md +580 -0
- package/skills/cm-secret-shield/SKILL.md +15 -569
- package/skills/cm-security-gate/SKILL.archive.md +239 -0
- package/skills/cm-security-gate/SKILL.md +16 -228
- package/skills/cm-skill-chain/SKILL.md +25 -4
- package/skills/cm-skill-evolution/SKILL.md +83 -0
- package/skills/cm-skill-health/SKILL.archive.md +83 -0
- package/skills/cm-skill-health/SKILL.md +26 -0
- package/skills/cm-skill-index/SKILL.md +19 -3
- package/skills/cm-skill-mastery/SKILL.archive.md +156 -0
- package/skills/cm-skill-mastery/SKILL.md +16 -146
- package/skills/cm-skill-search/SKILL.archive.md +49 -0
- package/skills/cm-skill-search/SKILL.md +26 -0
- package/skills/cm-skill-share/SKILL.archive.md +58 -0
- package/skills/cm-skill-share/SKILL.md +26 -0
- package/skills/cm-sprint-bus/SKILL.md +13 -0
- package/skills/cm-start/SKILL.md +17 -10
- package/skills/cm-tdd/SKILL.md +21 -2
- package/skills/cm-terminal/SKILL.md +15 -0
- package/skills/cm-test-gate/SKILL.archive.md +245 -0
- package/skills/cm-test-gate/SKILL.md +15 -234
- package/skills/cm-ui-preview/SKILL.archive.md +153 -0
- package/skills/cm-ui-preview/SKILL.md +16 -143
- package/skills/cm-ux-master/cli/uxmaster/commands/mcp.py +1 -1
- package/skills/cm-ux-master/mcp/mcp-config.json +1 -1
- package/skills/cm-ux-master/mcp/server.py +2 -2
- package/skills/profiles/design.txt +1 -1
- package/skills/profiles/full.txt +4 -10
- package/skills/profiles/growth.txt +8 -8
- package/skills/profiles/knowledge.txt +1 -1
- package/skills/profiles/top35.json +41 -0
- package/adapters/antigravity.js +0 -15
- package/adapters/claude-code.js +0 -17
- package/adapters/cursor.js +0 -16
- package/install.sh +0 -1125
- package/scripts/viking-demo.ts +0 -105
- package/skills/cm-ads-tracker/SKILL.md +0 -401
- package/skills/cm-ads-tracker/evals/evals.json +0 -55
- package/skills/cm-ads-tracker/references/gtm-architecture.md +0 -321
- package/skills/cm-ads-tracker/references/industry-events.md +0 -294
- package/skills/cm-ads-tracker/references/platforms-api.md +0 -238
- package/skills/cm-ads-tracker/templates/capi-payload.md +0 -79
- package/skills/cm-ads-tracker/templates/datalayer-push.js +0 -104
- package/skills/cm-ads-tracker/templates/gtm-variables.js +0 -56
- package/skills/cm-auto-publisher/SKILL.md +0 -81
- package/skills/cm-booking-calendar/SKILL.md +0 -521
- package/skills/cm-booking-calendar/references/industry-patterns.md +0 -527
- package/skills/cm-booking-calendar/templates/booking-form.css +0 -626
- package/skills/cm-booking-calendar/templates/booking-form.html +0 -477
- package/skills/cm-booking-calendar/templates/calendar-engine.js +0 -419
- package/skills/cm-booking-calendar/templates/calendar-export.js +0 -395
- package/skills/cm-booking-calendar/templates/reminder-config.js +0 -629
- package/skills/cm-content-factory/.content-factory-state.json +0 -132
- package/skills/cm-content-factory/.git 2/logs/refs/heads/main +0 -1
- package/skills/cm-content-factory/.git 2/logs/refs/remotes/origin/main +0 -1
- package/skills/cm-content-factory/.git 2/objects/02/fb0956734b5f8ba3f918b7defd04a89cfe0076 +0 -0
- package/skills/cm-content-factory/.git 2/objects/08/1e129d75dc6feac6c02037272e6bd1a04e3324 +0 -0
- package/skills/cm-content-factory/.git 2/objects/0c/5393416f3c5e01c9a655a802bff0dd52f76f0a +0 -0
- package/skills/cm-content-factory/.git 2/objects/10/0b9be46978a946a77188f68be725098a122001 +0 -0
- package/skills/cm-content-factory/.git 2/objects/10/cf041167fc9843610eb3d90259ef3396315fdc +0 -0
- package/skills/cm-content-factory/.git 2/objects/12/5e19538dd6e1338ffe74f6c4c165b00435bf48 +0 -0
- package/skills/cm-content-factory/.git 2/objects/16/a9b9d0088d5c1347628b45a2620b479d8ad57c +0 -0
- package/skills/cm-content-factory/.git 2/objects/17/8c2a9ef93c33ae4eec9d58e82321f9229843a1 +0 -0
- package/skills/cm-content-factory/.git 2/objects/25/397ae41d09104d763bdcac2695209d85cdea89 +0 -0
- package/skills/cm-content-factory/.git 2/objects/2f/a836b7947f2d458e1f639788bf4bb0983a3305 +0 -0
- package/skills/cm-content-factory/.git 2/objects/3a/baaaf0a1c0909c0828335791557125fba911e0 +0 -0
- package/skills/cm-content-factory/.git 2/objects/42/2924221b81f5ce3c4e4daac9a64a24f9b01f9a +0 -0
- package/skills/cm-content-factory/.git 2/objects/42/ec0ce707447dc11446a34c9995fb8533801731 +0 -0
- package/skills/cm-content-factory/.git 2/objects/46/e43ce92866d56ce74b1d750db307cfe6154a15 +0 -0
- package/skills/cm-content-factory/.git 2/objects/48/5e41b633c63f55b8277bcc59f44f67681f671a +0 -0
- package/skills/cm-content-factory/.git 2/objects/49/49c596a3a89fa240642acd95dd3258e261eb09 +0 -0
- package/skills/cm-content-factory/.git 2/objects/50/9d42d8412ef8eaf7f7e138476bac2e4d10ce60 +0 -0
- package/skills/cm-content-factory/.git 2/objects/55/0c8c389d981b463ef849aeb792d8be3ccb6ec8 +0 -0
- package/skills/cm-content-factory/.git 2/objects/5d/82d3b18410cdda3ace3677436f0cb599dbe2d2 +0 -0
- package/skills/cm-content-factory/.git 2/objects/60/0617c58e871a38b33bf29e282d132bb3c381ad +0 -0
- package/skills/cm-content-factory/.git 2/objects/6a/8369a99c687b7245c92ffaf0e0f0dab9014504 +0 -0
- package/skills/cm-content-factory/.git 2/objects/79/bea435d40ab531c1aaf6be0432c6a5b7aaed21 +0 -0
- package/skills/cm-content-factory/.git 2/objects/7e/5ebd79251c2f14e4aceb86c74b6b6daae6b500 +0 -0
- package/skills/cm-content-factory/.git 2/objects/81/98a822a60178d6d5023ddb3e222cddf048742e +0 -0
- package/skills/cm-content-factory/.git 2/objects/86/0a0e1943dfe53411d2e499a1f16f46a96ef758 +0 -0
- package/skills/cm-content-factory/.git 2/objects/86/971fb55fdc081fdbae52376f0f13e57a4e9b04 +0 -0
- package/skills/cm-content-factory/.git 2/objects/88/b89dd609a0a03f8d4fe8bfde20d5b8fc1d326d +0 -0
- package/skills/cm-content-factory/.git 2/objects/90/8737edb6b7809e32cc01590b4e08ba42a9d40d +0 -0
- package/skills/cm-content-factory/.git 2/objects/93/d5a8a9a7d4fb7f11491cb596a6880528725118 +0 -0
- package/skills/cm-content-factory/.git 2/objects/98/46a2ab81d0c3b3eb00ef88fc56989aa7e9f316 +0 -0
- package/skills/cm-content-factory/.git 2/objects/9b/d8dd1e49cf274eaf9c555f3ab39dce7af5715e +0 -0
- package/skills/cm-content-factory/.git 2/objects/a1/13329fb0cec96ae78b222d33a24c3b5bc7fa1f +0 -0
- package/skills/cm-content-factory/.git 2/objects/a9/e6effe626e8a3aea3a8fc3364b492191c6e7d0 +0 -0
- package/skills/cm-content-factory/.git 2/objects/ad/6de7e48d9782cca9353d1ff0aa1aab7fe1df85 +0 -0
- package/skills/cm-content-factory/.git 2/objects/af/54ae316f771ff692e299ffcd8bf2f06b413b59 +0 -0
- package/skills/cm-content-factory/.git 2/objects/b0/4cb8b0b00dad633e731c1472161419e738d674 +0 -0
- package/skills/cm-content-factory/.git 2/objects/b3/094abb0b9ed46419b269e4a4e36a459690e3b0 +0 -0
- package/skills/cm-content-factory/.git 2/objects/b9/435c5d4baac2cfc5c83009ddd27b46b60db5f1 +0 -0
- package/skills/cm-content-factory/.git 2/objects/ba/5da17dbaec5ec2dcfdfd126aead518d1171d5c +0 -0
- package/skills/cm-content-factory/.git 2/objects/c0/bf58703aa258ba5dd63083bebaec8f223d844c +0 -0
- package/skills/cm-content-factory/.git 2/objects/c4/701a34edf1fc1bad58ccc57bd03f9426acb59a +0 -0
- package/skills/cm-content-factory/.git 2/objects/c7/5ccce9a4e5cc74d9b3174550cf6d993ca43638 +0 -0
- package/skills/cm-content-factory/.git 2/objects/c7/710d59b5a35b0f1f0a0399386643a0bd94c929 +0 -0
- package/skills/cm-content-factory/.git 2/objects/d1/fe58237112e953e5fec52da22cf38e08be3df9 +0 -5
- package/skills/cm-content-factory/.git 2/objects/d2/2bbe9fd2f74c95bc5583e803f5e435f1e2cd86 +0 -0
- package/skills/cm-content-factory/.git 2/objects/d7/e72852ea2bff74581dbf247d400120086229f4 +0 -0
- package/skills/cm-content-factory/.git 2/objects/d8/d4c3b5553e4fd72807e1d4b49ef07d9ef3ac35 +0 -0
- package/skills/cm-content-factory/.git 2/objects/dc/75050c2876f6a02ae2a53a3c886f395b622977 +0 -0
- package/skills/cm-content-factory/.git 2/objects/ee/e8546f95acec500187c08a28a8b9ee02db0dec +0 -0
- package/skills/cm-content-factory/.git 2/objects/ef/263c059208b416c2146434f10cb2b9fabcba16 +0 -0
- package/skills/cm-content-factory/.git 2/objects/f3/ae597e84d9a59b88acd21c99bde2eaf686d785 +0 -0
- package/skills/cm-content-factory/.git 2/objects/f3/f6f5673c821d3d8e76fa267a9e882e7a5387ea +0 -0
- package/skills/cm-content-factory/.git 2/objects/f9/6e6d0ad02624dd11d5848594d056caef7a5e8b +0 -0
- package/skills/cm-content-factory/.git 2/objects/ff/278988fc1edf0db3abcf18de795f4cc0b4f3e1 +0 -0
- package/skills/cm-content-factory/.git 2/refs/heads/main +0 -1
- package/skills/cm-content-factory/.git 2/refs/remotes/origin/main +0 -1
- package/skills/cm-content-factory/.pytest_cache 2/v/cache/nodeids +0 -76
- package/skills/cm-content-factory/.pytest_cache 2/v/cache/stepwise +0 -1
- package/skills/cm-content-factory/AGENTS.md +0 -61
- package/skills/cm-content-factory/CLAUDE.md +0 -63
- package/skills/cm-content-factory/CURSOR.md +0 -43
- package/skills/cm-content-factory/Content Factory.zip +0 -0
- package/skills/cm-content-factory/SKILL.md +0 -416
- package/skills/cm-content-factory/cf +0 -313
- package/skills/cm-content-factory/config.schema.json +0 -397
- package/skills/cm-content-factory/dashboard/app.js +0 -556
- package/skills/cm-content-factory/dashboard/index.html +0 -397
- package/skills/cm-content-factory/dashboard/style.css +0 -1211
- package/skills/cm-content-factory/examples/01-real-estate.config.json +0 -146
- package/skills/cm-content-factory/examples/02-personal-finance.config.json +0 -146
- package/skills/cm-content-factory/examples/03-health-wellness.config.json +0 -147
- package/skills/cm-content-factory/examples/04-saas-software.config.json +0 -147
- package/skills/cm-content-factory/examples/05-legal-services.config.json +0 -147
- package/skills/cm-content-factory/examples/06-insurance.config.json +0 -146
- package/skills/cm-content-factory/examples/07-ecommerce-dropship.config.json +0 -146
- package/skills/cm-content-factory/examples/08-online-education.config.json +0 -147
- package/skills/cm-content-factory/examples/09-crypto-defi.config.json +0 -147
- package/skills/cm-content-factory/examples/10-beauty-skincare.config.json +0 -147
- package/skills/cm-content-factory/examples/11-home-services.config.json +0 -146
- package/skills/cm-content-factory/examples/12-dental-clinic.config.json +0 -147
- package/skills/cm-content-factory/examples/13-pet-care.config.json +0 -147
- package/skills/cm-content-factory/examples/14-travel-hospitality.config.json +0 -147
- package/skills/cm-content-factory/examples/15-ai-automation.config.json +0 -147
- package/skills/cm-content-factory/examples/16-wedding-events.config.json +0 -147
- package/skills/cm-content-factory/examples/17-fitness-coaching.config.json +0 -148
- package/skills/cm-content-factory/examples/18-cybersecurity.config.json +0 -147
- package/skills/cm-content-factory/examples/19-food-restaurant.config.json +0 -148
- package/skills/cm-content-factory/examples/20-solar-energy.config.json +0 -147
- package/skills/cm-content-factory/examples/fitness-blog.config.json +0 -116
- package/skills/cm-content-factory/examples/tech-blog.config.json +0 -107
- package/skills/cm-content-factory/extensions/EXTENSION_GUIDE.md +0 -72
- package/skills/cm-content-factory/extensions/hooks.py +0 -126
- package/skills/cm-content-factory/extensions/openclaw_adapter.py +0 -132
- package/skills/cm-content-factory/landing/docs/content/changelog.md +0 -36
- package/skills/cm-content-factory/landing/docs/content/deployment.md +0 -46
- package/skills/cm-content-factory/landing/docs/content/execution-flow.md +0 -67
- package/skills/cm-content-factory/landing/docs/content/openspace.md +0 -27
- package/skills/cm-content-factory/landing/docs/content/openviking.md +0 -33
- package/skills/cm-content-factory/landing/docs/content/use-cases.md +0 -26
- package/skills/cm-content-factory/landing/docs/content/v5-intro.md +0 -28
- package/skills/cm-content-factory/landing/docs/index.html +0 -240
- package/skills/cm-content-factory/landing/index.html +0 -680
- package/skills/cm-content-factory/landing/script.js +0 -143
- package/skills/cm-content-factory/landing/style.css +0 -1216
- package/skills/cm-content-factory/landing/translations.js +0 -508
- package/skills/cm-content-factory/logs/events.jsonl +0 -11
- package/skills/cm-content-factory/profiles/_template.profile.json +0 -231
- package/skills/cm-content-factory/profiles/finance.profile.json +0 -278
- package/skills/cm-content-factory/profiles/legal.profile.json +0 -263
- package/skills/cm-content-factory/profiles/medical-research.profile.json +0 -321
- package/skills/cm-content-factory/profiles/technology.profile.json +0 -275
- package/skills/cm-content-factory/scripts/agent_dispatcher.py +0 -266
- package/skills/cm-content-factory/scripts/audit.py +0 -106
- package/skills/cm-content-factory/scripts/dashboard_server.py +0 -225
- package/skills/cm-content-factory/scripts/deploy.py +0 -146
- package/skills/cm-content-factory/scripts/extract.py +0 -132
- package/skills/cm-content-factory/scripts/landing_generator.py +0 -459
- package/skills/cm-content-factory/scripts/memory.py +0 -521
- package/skills/cm-content-factory/scripts/monetize.py +0 -239
- package/skills/cm-content-factory/scripts/pipeline.py +0 -357
- package/skills/cm-content-factory/scripts/plan.py +0 -163
- package/skills/cm-content-factory/scripts/publish.py +0 -145
- package/skills/cm-content-factory/scripts/research.py +0 -337
- package/skills/cm-content-factory/scripts/scaffold.py +0 -464
- package/skills/cm-content-factory/scripts/scoreboard.py +0 -336
- package/skills/cm-content-factory/scripts/seo.py +0 -90
- package/skills/cm-content-factory/scripts/state_manager.py +0 -320
- package/skills/cm-content-factory/scripts/token_manager.py +0 -268
- package/skills/cm-content-factory/scripts/validate.py +0 -221
- package/skills/cm-content-factory/scripts/wizard.py +0 -329
- package/skills/cm-content-factory/scripts/write.py +0 -93
- package/skills/cm-content-factory/sites/docs-site/src/assets/houston.webp +0 -0
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/architecture.md +0 -90
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/data-flow.md +0 -54
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/deployment.md +0 -38
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/flows/index.md +0 -65
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/flows/lc-content-lifecycle.md +0 -48
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/flows/seq-write-mode.md +0 -39
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/flows/uj-first-batch.md +0 -42
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/flows/wf-content-pipeline.md +0 -51
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/flows/wf-learning-cycle.md +0 -52
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/getting-started/configuration.md +0 -86
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/getting-started/installation.md +0 -80
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/getting-started/intro.md +0 -58
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/index.md +0 -102
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/jtbd/index.md +0 -45
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/jtbd/optimize-seo.md +0 -29
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/jtbd/scale-content-production.md +0 -55
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/jtbd/standardize-quality.md +0 -29
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/personas/buyer-cmo-huong.md +0 -41
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/personas/buyer-content-lead-khoa.md +0 -40
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/personas/index.md +0 -56
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/personas/user-content-manager-lan.md +0 -46
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/personas/user-seo-minh.md +0 -45
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/personas/user-writer-tu.md +0 -45
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/sop/content-pipeline.md +0 -108
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/sop/index.md +0 -22
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/sop/memory-system.md +0 -52
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/sop/seo-optimization.md +0 -58
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/sop/troubleshooting-guide.md +0 -92
- package/skills/cm-content-factory/sites/docs-site/src/styles/custom.css +0 -575
- package/skills/cm-content-factory/tests/conftest.py +0 -66
- package/skills/cm-content-factory/tests/test_agent_dispatcher.py +0 -125
- package/skills/cm-content-factory/tests/test_memory.py +0 -128
- package/skills/cm-content-factory/tests/test_pipeline.py +0 -107
- package/skills/cm-content-factory/tests/test_research.py +0 -56
- package/skills/cm-content-factory/tests/test_state_manager.py +0 -131
- package/skills/cm-content-factory/tests/test_token_manager.py +0 -110
- package/skills/cm-content-factory/tests/test_wizard.py +0 -121
- package/skills/cm-cro-methodology/SKILL.md +0 -290
- package/skills/cm-cro-methodology/references/COPYWRITING.md +0 -178
- package/skills/cm-cro-methodology/references/OBJECTIONS.md +0 -135
- package/skills/cm-cro-methodology/references/PERSUASION.md +0 -158
- package/skills/cm-cro-methodology/references/RESEARCH.md +0 -220
- package/skills/cm-cro-methodology/references/funnel-analysis.md +0 -365
- package/skills/cm-cro-methodology/references/testing-methodology.md +0 -330
- package/skills/cm-google-form/SKILL.md +0 -266
- package/skills/cm-google-form/templates/apps-script.js +0 -55
- package/skills/cm-google-form/templates/form-markup.html +0 -110
- package/skills/cm-google-form/templates/form-submit.js +0 -201
- package/skills/cm-google-form/templates/toast.css +0 -152
- package/skills/cm-growth-hacking/SKILL.md +0 -282
- package/skills/cm-growth-hacking/bottom-sheet-engine.md +0 -261
- package/skills/cm-growth-hacking/calendar-integration.md +0 -264
- package/skills/cm-growth-hacking/references/engagement-patterns.md +0 -346
- package/skills/cm-growth-hacking/templates/bottom-sheet.css +0 -528
- package/skills/cm-growth-hacking/templates/bottom-sheet.js +0 -269
- package/skills/cm-growth-hacking/templates/calendar-cta.js +0 -213
- package/skills/cm-growth-hacking/templates/tracking-events.js +0 -211
- package/skills/cm-growth-hacking/templates/trigger-manager.js +0 -254
- package/skills/cm-growth-hacking/tracking-events.md +0 -246
- package/skills/cm-growth-hacking/trigger-system.md +0 -342
- package/skills/cm-jtbd/SKILL.md +0 -98
- package/skills/cm-notebooklm/SKILL.md +0 -156
- package/skills/cm-notebooklm/references/command_reference.md +0 -94
- package/skills/cm-notebooklm/references/workflows.md +0 -60
- package/skills/cm-notebooklm/resources/knowledge_sources.md +0 -106
- package/skills/cm-notebooklm/scripts/brain-sync.sh +0 -453
- package/skills/cm-notebooklm/scripts/graduate_wisdom.py +0 -101
- package/skills/cm-readit/SKILL.md +0 -289
- package/skills/cm-readit/audio-player.md +0 -206
- package/skills/cm-readit/examples/blog-reader.js +0 -352
- package/skills/cm-readit/examples/voice-cro.js +0 -390
- package/skills/cm-readit/tts-engine.md +0 -262
- package/skills/cm-readit/ui-patterns.md +0 -362
- package/skills/cm-readit/voice-cro.md +0 -223
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* TDD Enforcement Gate — blocks execution without tests.
|
|
4
|
+
*
|
|
5
|
+
* TRIZ Principle #10 (Prior Action):
|
|
6
|
+
* Pre-flight check scans for test files BEFORE execution starts.
|
|
7
|
+
*
|
|
8
|
+
* TRIZ Principle #3 (Local Quality):
|
|
9
|
+
* Each task must have its own test file before implementation.
|
|
10
|
+
*/
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.findTestFile = findTestFile;
|
|
16
|
+
exports.suggestTestFile = suggestTestFile;
|
|
17
|
+
exports.runTests = runTests;
|
|
18
|
+
exports.enforceTDD = enforceTDD;
|
|
19
|
+
exports.hasTestFile = hasTestFile;
|
|
20
|
+
const fs_1 = __importDefault(require("fs"));
|
|
21
|
+
const child_process_1 = require("child_process");
|
|
22
|
+
/**
|
|
23
|
+
* Find test file for a given source file.
|
|
24
|
+
* Mapping: src/foo.ts → test/foo.test.ts
|
|
25
|
+
* src/bar/baz.ts → test/bar/baz.test.ts
|
|
26
|
+
*/
|
|
27
|
+
function findTestFile(sourceFile) {
|
|
28
|
+
const testFile = sourceFile
|
|
29
|
+
.replace(/^src\//, 'test/')
|
|
30
|
+
.replace(/\.ts$/, '.test.ts')
|
|
31
|
+
.replace(/\.js$/, '.test.js');
|
|
32
|
+
return fs_1.default.existsSync(testFile) ? testFile : null;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Suggest test file path for a given source file.
|
|
36
|
+
*/
|
|
37
|
+
function suggestTestFile(sourceFile) {
|
|
38
|
+
return sourceFile
|
|
39
|
+
.replace(/^src\//, 'test/')
|
|
40
|
+
.replace(/\.ts$/, '.test.ts')
|
|
41
|
+
.replace(/\.js$/, '.test.js');
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Run tests for a specific test file and return failure count.
|
|
45
|
+
*/
|
|
46
|
+
function runTests(testFile) {
|
|
47
|
+
try {
|
|
48
|
+
const output = (0, child_process_1.execSync)(`npx vitest run ${testFile} --reporter=verbose`, {
|
|
49
|
+
encoding: 'utf-8',
|
|
50
|
+
timeout: 30000,
|
|
51
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
52
|
+
});
|
|
53
|
+
return { failures: 0, output };
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
// vitest exits with non-zero code when tests fail
|
|
57
|
+
const output = error.stdout || error.stderr || '';
|
|
58
|
+
const failMatch = output.match(/(\d+) failed/);
|
|
59
|
+
const failures = failMatch ? parseInt(failMatch[1], 10) : 1;
|
|
60
|
+
return { failures, output };
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Enforce TDD: verify test file exists and has failing tests (RED phase).
|
|
65
|
+
*
|
|
66
|
+
* Rules:
|
|
67
|
+
* 1. Test file MUST exist for target source file
|
|
68
|
+
* 2. Tests MUST fail (RED phase) before implementation
|
|
69
|
+
* 3. If all tests pass, user must write a failing test first
|
|
70
|
+
*/
|
|
71
|
+
function enforceTDD(targetFiles) {
|
|
72
|
+
for (const file of targetFiles) {
|
|
73
|
+
// Skip test files themselves
|
|
74
|
+
if (file.includes('.test.') || file.includes('.spec.')) {
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
// Skip non-source files
|
|
78
|
+
if (!file.startsWith('src/') && !file.startsWith('lib/')) {
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
const testFile = findTestFile(file);
|
|
82
|
+
if (!testFile) {
|
|
83
|
+
return {
|
|
84
|
+
passed: false,
|
|
85
|
+
testFile: null,
|
|
86
|
+
message: `TDD GATE: No test file found for ${file}. Write test first: ${suggestTestFile(file)}`,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
const result = runTests(testFile);
|
|
90
|
+
if (result.failures === 0) {
|
|
91
|
+
return {
|
|
92
|
+
passed: false,
|
|
93
|
+
testFile,
|
|
94
|
+
message: `TDD GATE: All tests pass in ${testFile}. Write a failing test for new behavior first (RED phase).`,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return { passed: true, testFile: null, message: 'TDD GATE: OK — failing tests found (RED phase)' };
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Quick check: does test file exist? (no execution, fast)
|
|
102
|
+
*/
|
|
103
|
+
function hasTestFile(targetFiles) {
|
|
104
|
+
for (const file of targetFiles) {
|
|
105
|
+
if (file.includes('.test.') || file.includes('.spec.'))
|
|
106
|
+
continue;
|
|
107
|
+
if (!file.startsWith('src/') && !file.startsWith('lib/'))
|
|
108
|
+
continue;
|
|
109
|
+
if (!findTestFile(file))
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
return true;
|
|
113
|
+
}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ExecutionAnalyzer = void 0;
|
|
7
|
+
exports.qualityWeight = qualityWeight;
|
|
8
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
9
|
+
const path_1 = __importDefault(require("path"));
|
|
10
|
+
const context_bus_1 = require("./context-bus");
|
|
11
|
+
const storage_backend_1 = require("./storage-backend");
|
|
12
|
+
const retro_summary_1 = require("./retro-summary");
|
|
13
|
+
function bucketLatency(latencyMs) {
|
|
14
|
+
if (latencyMs === undefined || latencyMs < 0)
|
|
15
|
+
return undefined;
|
|
16
|
+
if (latencyMs < 1000)
|
|
17
|
+
return 'subsecond';
|
|
18
|
+
if (latencyMs < 5000)
|
|
19
|
+
return 'fast';
|
|
20
|
+
if (latencyMs < 15000)
|
|
21
|
+
return 'medium';
|
|
22
|
+
return 'slow';
|
|
23
|
+
}
|
|
24
|
+
function buildRetroSummary(projectPath, limit = 3) {
|
|
25
|
+
const retroPath = path_1.default.join(projectPath, '.cm', 'operational-learnings.jsonl');
|
|
26
|
+
const entries = (0, retro_summary_1.loadRetroEntries)(retroPath).slice(-limit);
|
|
27
|
+
if (entries.length === 0)
|
|
28
|
+
return undefined;
|
|
29
|
+
return entries.map((entry) => `- [${entry.tool}] ${entry.note}`).join('\n');
|
|
30
|
+
}
|
|
31
|
+
function normalizeJudgments(input) {
|
|
32
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
|
|
33
|
+
const map = new Map();
|
|
34
|
+
for (const skill of (_a = input.selectedSkills) !== null && _a !== void 0 ? _a : []) {
|
|
35
|
+
map.set(skill, {
|
|
36
|
+
skill,
|
|
37
|
+
selected: true,
|
|
38
|
+
applied: true,
|
|
39
|
+
task_completed: input.taskStatus === 'completed',
|
|
40
|
+
fallback_used: false,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
for (const observation of (_b = input.skillObservations) !== null && _b !== void 0 ? _b : []) {
|
|
44
|
+
const current = (_c = map.get(observation.skill)) !== null && _c !== void 0 ? _c : { skill: observation.skill };
|
|
45
|
+
map.set(observation.skill, {
|
|
46
|
+
skill: observation.skill,
|
|
47
|
+
selected: (_e = (_d = observation.selected) !== null && _d !== void 0 ? _d : current.selected) !== null && _e !== void 0 ? _e : false,
|
|
48
|
+
applied: (_g = (_f = observation.applied) !== null && _f !== void 0 ? _f : current.applied) !== null && _g !== void 0 ? _g : ((_j = (_h = observation.selected) !== null && _h !== void 0 ? _h : current.selected) !== null && _j !== void 0 ? _j : false),
|
|
49
|
+
task_completed: input.taskStatus === 'completed',
|
|
50
|
+
fallback_used: (_l = (_k = observation.fallbackUsed) !== null && _k !== void 0 ? _k : current.fallback_used) !== null && _l !== void 0 ? _l : false,
|
|
51
|
+
token_estimate: (_m = observation.tokenEstimate) !== null && _m !== void 0 ? _m : current.token_estimate,
|
|
52
|
+
note: (_o = observation.note) !== null && _o !== void 0 ? _o : current.note,
|
|
53
|
+
relevance_score: (_p = observation.relevanceScore) !== null && _p !== void 0 ? _p : current.relevance_score,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
return Array.from(map.values());
|
|
57
|
+
}
|
|
58
|
+
function qualityWeight(metric) {
|
|
59
|
+
if (!metric)
|
|
60
|
+
return 0.5;
|
|
61
|
+
const base = Math.max(metric.selections, 1);
|
|
62
|
+
const applicationRate = metric.applications / base;
|
|
63
|
+
const completionRate = metric.task_completions / base;
|
|
64
|
+
const fallbackPenalty = metric.fallbacks / base;
|
|
65
|
+
const weighted = (applicationRate * 0.35) + (completionRate * 0.5) + ((1 - fallbackPenalty) * 0.15);
|
|
66
|
+
return Math.max(0, Math.min(1, weighted));
|
|
67
|
+
}
|
|
68
|
+
function buildAdvisory(taskStatus, judgments, backend) {
|
|
69
|
+
const activeSkills = judgments.filter((judgment) => judgment.selected || judgment.applied).map((judgment) => judgment.skill);
|
|
70
|
+
const fallbackSkills = judgments.filter((judgment) => judgment.fallback_used).map((judgment) => judgment.skill);
|
|
71
|
+
if (taskStatus !== 'completed' && activeSkills.length > 0) {
|
|
72
|
+
const weakest = activeSkills
|
|
73
|
+
.map((skill) => ({ skill, weight: qualityWeight(backend.getSkillMetric(skill)) }))
|
|
74
|
+
.sort((a, b) => a.weight - b.weight)[0];
|
|
75
|
+
const targetSkills = weakest ? [weakest.skill] : activeSkills.slice(0, 1);
|
|
76
|
+
return {
|
|
77
|
+
action: 'FIX',
|
|
78
|
+
confidence: weakest ? Math.max(0.68, 0.82 - weakest.weight * 0.2) : 0.72,
|
|
79
|
+
reason: 'Task did not complete successfully while selected skills were active.',
|
|
80
|
+
targetSkills,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
if (taskStatus === 'completed' && activeSkills.length === 0) {
|
|
84
|
+
return {
|
|
85
|
+
action: 'CAPTURED',
|
|
86
|
+
confidence: 0.76,
|
|
87
|
+
reason: 'Task completed without any tracked skill usage, suggesting a reusable pattern worth capturing.',
|
|
88
|
+
targetSkills: [],
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
if (taskStatus === 'completed' && fallbackSkills.length > 0) {
|
|
92
|
+
return {
|
|
93
|
+
action: 'DERIVED',
|
|
94
|
+
confidence: 0.74,
|
|
95
|
+
reason: 'Task completed, but fallback handling suggests the current skill may need a specialized derived variant.',
|
|
96
|
+
targetSkills: fallbackSkills,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
return {
|
|
100
|
+
reason: 'No evolution action recommended from the current execution signal.',
|
|
101
|
+
targetSkills: [],
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
class ExecutionAnalyzer {
|
|
105
|
+
constructor(projectPath, backend) {
|
|
106
|
+
this.projectPath = projectPath;
|
|
107
|
+
this.backend = backend !== null && backend !== void 0 ? backend : (0, storage_backend_1.getBackend)(projectPath);
|
|
108
|
+
this.backend.initialize();
|
|
109
|
+
}
|
|
110
|
+
analyzeExecution(input) {
|
|
111
|
+
var _a, _b, _c;
|
|
112
|
+
const judgments = normalizeJudgments(input);
|
|
113
|
+
const bus = (0, context_bus_1.readBus)(this.projectPath);
|
|
114
|
+
const retroSummary = buildRetroSummary(this.projectPath);
|
|
115
|
+
const advisory = buildAdvisory(input.taskStatus, judgments, this.backend);
|
|
116
|
+
const analysis = {
|
|
117
|
+
id: crypto_1.default.randomUUID(),
|
|
118
|
+
task_title: input.taskTitle,
|
|
119
|
+
status: input.taskStatus,
|
|
120
|
+
summary: (_a = input.summary) !== null && _a !== void 0 ? _a : `${input.taskStatus.toUpperCase()}: ${input.taskTitle}`,
|
|
121
|
+
source_task_type: input.sourceTaskType,
|
|
122
|
+
session_id: (_b = input.sessionId) !== null && _b !== void 0 ? _b : bus === null || bus === void 0 ? void 0 : bus.session_id,
|
|
123
|
+
chain_id: input.chainId,
|
|
124
|
+
selected_skills: (_c = input.selectedSkills) !== null && _c !== void 0 ? _c : judgments.filter((judgment) => judgment.selected).map((judgment) => judgment.skill),
|
|
125
|
+
token_estimate: input.tokenEstimate,
|
|
126
|
+
latency_bucket: bucketLatency(input.latencyMs),
|
|
127
|
+
bus_snapshot: bus ? JSON.stringify(bus.shared_context) : undefined,
|
|
128
|
+
retro_summary: retroSummary,
|
|
129
|
+
recommended_action: advisory.action,
|
|
130
|
+
confidence: advisory.confidence,
|
|
131
|
+
skill_judgments: judgments,
|
|
132
|
+
created_at: new Date().toISOString(),
|
|
133
|
+
};
|
|
134
|
+
this.backend.recordExecutionAnalysis(analysis);
|
|
135
|
+
return analysis;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
exports.ExecutionAnalyzer = ExecutionAnalyzer;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.cancelTask = cancelTask;
|
|
16
|
+
const child_process_1 = require("child_process");
|
|
17
|
+
const os_1 = __importDefault(require("os"));
|
|
18
|
+
function cancelTask(taskId, pgid) {
|
|
19
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
20
|
+
if (os_1.default.platform() === 'win32') {
|
|
21
|
+
(0, child_process_1.execFileSync)('taskkill', ['/PID', String(pgid), '/T', '/F'], { timeout: 10000 });
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
process.kill(-pgid, 'SIGTERM');
|
|
25
|
+
yield new Promise(resolve => setTimeout(resolve, 5000));
|
|
26
|
+
try {
|
|
27
|
+
process.kill(-pgid, 'SIGKILL');
|
|
28
|
+
}
|
|
29
|
+
catch (_a) {
|
|
30
|
+
// already dead
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.startGcLoop = startGcLoop;
|
|
7
|
+
exports.gcPass = gcPass;
|
|
8
|
+
const fs_1 = __importDefault(require("fs"));
|
|
9
|
+
const path_1 = __importDefault(require("path"));
|
|
10
|
+
const os_1 = __importDefault(require("os"));
|
|
11
|
+
const WORKSPACES_ROOT = path_1.default.join(os_1.default.homedir(), '.cm', 'workspaces');
|
|
12
|
+
const DEFAULT_GC_TTL_MS = 24 * 60 * 60 * 1000; // 24h
|
|
13
|
+
const DEFAULT_GC_ORPHAN_TTL_MS = 72 * 60 * 60 * 1000; // 72h
|
|
14
|
+
const GC_INTERVAL_MS = 60 * 60 * 1000; // 1h
|
|
15
|
+
function startGcLoop() {
|
|
16
|
+
return setInterval(() => {
|
|
17
|
+
gcPass();
|
|
18
|
+
}, GC_INTERVAL_MS);
|
|
19
|
+
}
|
|
20
|
+
function gcPass() {
|
|
21
|
+
let removed = 0;
|
|
22
|
+
let errors = 0;
|
|
23
|
+
if (!fs_1.default.existsSync(WORKSPACES_ROOT)) {
|
|
24
|
+
return { removed, errors };
|
|
25
|
+
}
|
|
26
|
+
const now = Date.now();
|
|
27
|
+
try {
|
|
28
|
+
const projects = fs_1.default.readdirSync(WORKSPACES_ROOT);
|
|
29
|
+
for (const project of projects) {
|
|
30
|
+
const projectDir = path_1.default.join(WORKSPACES_ROOT, project);
|
|
31
|
+
if (!fs_1.default.statSync(projectDir).isDirectory())
|
|
32
|
+
continue;
|
|
33
|
+
try {
|
|
34
|
+
const tasks = fs_1.default.readdirSync(projectDir);
|
|
35
|
+
for (const task of tasks) {
|
|
36
|
+
const taskDir = path_1.default.join(projectDir, task);
|
|
37
|
+
if (!fs_1.default.statSync(taskDir).isDirectory())
|
|
38
|
+
continue;
|
|
39
|
+
const gcMetaPath = path_1.default.join(taskDir, '.gc_meta.json');
|
|
40
|
+
try {
|
|
41
|
+
if (fs_1.default.existsSync(gcMetaPath)) {
|
|
42
|
+
const meta = JSON.parse(fs_1.default.readFileSync(gcMetaPath, 'utf-8'));
|
|
43
|
+
if (meta.completedAt) {
|
|
44
|
+
const completedTime = new Date(meta.completedAt).getTime();
|
|
45
|
+
if (now - completedTime > DEFAULT_GC_TTL_MS) {
|
|
46
|
+
fs_1.default.rmSync(taskDir, { recursive: true, force: true });
|
|
47
|
+
removed++;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
const stat = fs_1.default.statSync(taskDir);
|
|
53
|
+
const age = now - stat.mtimeMs;
|
|
54
|
+
if (age > DEFAULT_GC_ORPHAN_TTL_MS) {
|
|
55
|
+
fs_1.default.rmSync(taskDir, { recursive: true, force: true });
|
|
56
|
+
removed++;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
catch (_a) {
|
|
61
|
+
errors++;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch (_b) {
|
|
66
|
+
errors++;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
catch (_c) {
|
|
71
|
+
errors++;
|
|
72
|
+
}
|
|
73
|
+
return { removed, errors };
|
|
74
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.cancelTask = exports.runTask = exports.gcPass = exports.startGcLoop = exports.reuseWorkdir = exports.writeGcMeta = exports.prepareWorkdir = void 0;
|
|
4
|
+
var workdir_1 = require("./workdir");
|
|
5
|
+
Object.defineProperty(exports, "prepareWorkdir", { enumerable: true, get: function () { return workdir_1.prepareWorkdir; } });
|
|
6
|
+
Object.defineProperty(exports, "writeGcMeta", { enumerable: true, get: function () { return workdir_1.writeGcMeta; } });
|
|
7
|
+
Object.defineProperty(exports, "reuseWorkdir", { enumerable: true, get: function () { return workdir_1.reuseWorkdir; } });
|
|
8
|
+
var gc_1 = require("./gc");
|
|
9
|
+
Object.defineProperty(exports, "startGcLoop", { enumerable: true, get: function () { return gc_1.startGcLoop; } });
|
|
10
|
+
Object.defineProperty(exports, "gcPass", { enumerable: true, get: function () { return gc_1.gcPass; } });
|
|
11
|
+
var runner_1 = require("./runner");
|
|
12
|
+
Object.defineProperty(exports, "runTask", { enumerable: true, get: function () { return runner_1.runTask; } });
|
|
13
|
+
var cancel_1 = require("./cancel");
|
|
14
|
+
Object.defineProperty(exports, "cancelTask", { enumerable: true, get: function () { return cancel_1.cancelTask; } });
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __asyncValues = (this && this.__asyncValues) || function (o) {
|
|
12
|
+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
|
|
13
|
+
var m = o[Symbol.asyncIterator], i;
|
|
14
|
+
return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
|
|
15
|
+
function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
|
|
16
|
+
function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
|
|
17
|
+
};
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
exports.runTask = runTask;
|
|
20
|
+
const workdir_1 = require("./workdir");
|
|
21
|
+
function runTask(opts) {
|
|
22
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
23
|
+
const { backend, taskId, projectId, prompt, execOpts, eventBus, priorWorkdir, pinnedSessionId, } = opts;
|
|
24
|
+
const projectShort = projectId.slice(0, 8);
|
|
25
|
+
const taskShort = taskId.slice(0, 8);
|
|
26
|
+
const workdir = priorWorkdir !== null && priorWorkdir !== void 0 ? priorWorkdir : (0, workdir_1.prepareWorkdir)(projectShort, taskShort);
|
|
27
|
+
const resolvedOpts = Object.assign(Object.assign({}, execOpts), { cwd: workdir, resumeSessionId: pinnedSessionId !== null && pinnedSessionId !== void 0 ? pinnedSessionId : execOpts.resumeSessionId });
|
|
28
|
+
const session = yield backend.execute(prompt, resolvedOpts);
|
|
29
|
+
let lastSessionId = pinnedSessionId;
|
|
30
|
+
const messageLoop = (() => __awaiter(this, void 0, void 0, function* () {
|
|
31
|
+
var _a, e_1, _b, _c;
|
|
32
|
+
try {
|
|
33
|
+
for (var _d = true, _e = __asyncValues(session.messages), _f; _f = yield _e.next(), _a = _f.done, !_a; _d = true) {
|
|
34
|
+
_c = _f.value;
|
|
35
|
+
_d = false;
|
|
36
|
+
const msg = _c;
|
|
37
|
+
emitAgentMessage(eventBus, taskId, projectId, msg);
|
|
38
|
+
if (msg.type === 'text' && msg.sessionId) {
|
|
39
|
+
lastSessionId = msg.sessionId;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
44
|
+
finally {
|
|
45
|
+
try {
|
|
46
|
+
if (!_d && !_a && (_b = _e.return)) yield _b.call(_e);
|
|
47
|
+
}
|
|
48
|
+
finally { if (e_1) throw e_1.error; }
|
|
49
|
+
}
|
|
50
|
+
}))();
|
|
51
|
+
const [result] = yield Promise.all([session.result, messageLoop]);
|
|
52
|
+
if (lastSessionId && !result.sessionId) {
|
|
53
|
+
result.sessionId = lastSessionId;
|
|
54
|
+
}
|
|
55
|
+
(0, workdir_1.writeGcMeta)(projectShort, taskShort, {
|
|
56
|
+
taskId,
|
|
57
|
+
projectId,
|
|
58
|
+
completedAt: new Date().toISOString(),
|
|
59
|
+
});
|
|
60
|
+
return result;
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
function emitAgentMessage(eventBus, taskId, projectId, msg) {
|
|
64
|
+
eventBus.emitTask({
|
|
65
|
+
type: 'task.message',
|
|
66
|
+
taskId,
|
|
67
|
+
projectId,
|
|
68
|
+
data: { message: msg },
|
|
69
|
+
});
|
|
70
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.prepareWorkdir = prepareWorkdir;
|
|
7
|
+
exports.writeGcMeta = writeGcMeta;
|
|
8
|
+
exports.reuseWorkdir = reuseWorkdir;
|
|
9
|
+
const fs_1 = __importDefault(require("fs"));
|
|
10
|
+
const path_1 = __importDefault(require("path"));
|
|
11
|
+
const os_1 = __importDefault(require("os"));
|
|
12
|
+
const WORKSPACES_ROOT = path_1.default.join(os_1.default.homedir(), '.cm', 'workspaces');
|
|
13
|
+
function prepareWorkdir(projectShort, taskShort) {
|
|
14
|
+
const workdir = path_1.default.join(WORKSPACES_ROOT, projectShort, taskShort, 'workdir');
|
|
15
|
+
fs_1.default.mkdirSync(workdir, { recursive: true });
|
|
16
|
+
const outputDir = path_1.default.join(WORKSPACES_ROOT, projectShort, taskShort, 'output');
|
|
17
|
+
const logsDir = path_1.default.join(WORKSPACES_ROOT, projectShort, taskShort, 'logs');
|
|
18
|
+
fs_1.default.mkdirSync(outputDir, { recursive: true });
|
|
19
|
+
fs_1.default.mkdirSync(logsDir, { recursive: true });
|
|
20
|
+
return workdir;
|
|
21
|
+
}
|
|
22
|
+
function writeGcMeta(projectShort, taskShort, meta) {
|
|
23
|
+
const metaPath = path_1.default.join(WORKSPACES_ROOT, projectShort, taskShort, '.gc_meta.json');
|
|
24
|
+
fs_1.default.writeFileSync(metaPath, JSON.stringify(meta, null, 2));
|
|
25
|
+
}
|
|
26
|
+
function reuseWorkdir(existingPath) {
|
|
27
|
+
if (!fs_1.default.existsSync(existingPath)) {
|
|
28
|
+
throw new Error(`Workdir not found: ${existingPath}`);
|
|
29
|
+
}
|
|
30
|
+
return existingPath;
|
|
31
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Handoff JSON contracts for the sprint flow (v2.0).
|
|
4
|
+
*
|
|
5
|
+
* Each sprint phase emits a typed handoff JSON under `.cm/handoff/`.
|
|
6
|
+
* Downstream skills read the predecessor's handoff to pick up cold,
|
|
7
|
+
* eliminating re-derivation cost.
|
|
8
|
+
*
|
|
9
|
+
* Schema versioning: every contract has a `schema: "<name>@<n>"` field.
|
|
10
|
+
* Bump @n on breaking change; readers should reject unknown majors.
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.HANDOFF_FILENAMES = void 0;
|
|
14
|
+
exports.HANDOFF_FILENAMES = {
|
|
15
|
+
'intent@1': 'intent.json',
|
|
16
|
+
'plan@1': 'plan.json',
|
|
17
|
+
'exec@1': 'exec.json',
|
|
18
|
+
'review@1': 'review.json',
|
|
19
|
+
'quality@1': 'quality.json',
|
|
20
|
+
'retro@1': 'retro.json',
|
|
21
|
+
'party@1': 'party.json',
|
|
22
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./contracts.js"), exports);
|
|
18
|
+
__exportStar(require("./io.js"), exports);
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Handoff JSON read/write helpers.
|
|
4
|
+
*
|
|
5
|
+
* Files live under `<projectPath>/.cm/handoff/<name>.json`.
|
|
6
|
+
* Validation is intentionally lightweight (no zod dep) — schema field +
|
|
7
|
+
* required key presence is enough to catch drift early.
|
|
8
|
+
*/
|
|
9
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
10
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
11
|
+
};
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.HandoffError = void 0;
|
|
14
|
+
exports.handoffPath = handoffPath;
|
|
15
|
+
exports.ensureHandoffDir = ensureHandoffDir;
|
|
16
|
+
exports.validateHandoff = validateHandoff;
|
|
17
|
+
exports.writeHandoff = writeHandoff;
|
|
18
|
+
exports.readHandoff = readHandoff;
|
|
19
|
+
exports.listHandoffs = listHandoffs;
|
|
20
|
+
exports.clearHandoffs = clearHandoffs;
|
|
21
|
+
exports.nowIso = nowIso;
|
|
22
|
+
const fs_1 = __importDefault(require("fs"));
|
|
23
|
+
const path_1 = __importDefault(require("path"));
|
|
24
|
+
const contracts_js_1 = require("./contracts.js");
|
|
25
|
+
class HandoffError extends Error {
|
|
26
|
+
}
|
|
27
|
+
exports.HandoffError = HandoffError;
|
|
28
|
+
function handoffDir(projectPath) {
|
|
29
|
+
return path_1.default.join(projectPath, '.cm', 'handoff');
|
|
30
|
+
}
|
|
31
|
+
function handoffPath(projectPath, schema) {
|
|
32
|
+
return path_1.default.join(handoffDir(projectPath), contracts_js_1.HANDOFF_FILENAMES[schema]);
|
|
33
|
+
}
|
|
34
|
+
function ensureHandoffDir(projectPath) {
|
|
35
|
+
const d = handoffDir(projectPath);
|
|
36
|
+
if (!fs_1.default.existsSync(d))
|
|
37
|
+
fs_1.default.mkdirSync(d, { recursive: true });
|
|
38
|
+
}
|
|
39
|
+
/** Required top-level keys for every envelope. */
|
|
40
|
+
const ENVELOPE_KEYS = ['schema', 'emitted_at', 'emitted_by', 'data'];
|
|
41
|
+
/** Per-schema required keys inside `data`. */
|
|
42
|
+
const DATA_KEYS = {
|
|
43
|
+
'intent@1': ['problem', 'success_criteria', 'constraints', 'options_considered'],
|
|
44
|
+
'plan@1': ['goal', 'decisions', 'first_tasks'],
|
|
45
|
+
'exec@1': ['completed_tasks', 'pending_tasks', 'files_changed', 'test_status'],
|
|
46
|
+
'review@1': ['verdict', 'findings', 'must_fix_count'],
|
|
47
|
+
'quality@1': ['gates_passed', 'gates_failed', 'safe_to_ship', 'evidence'],
|
|
48
|
+
'retro@1': ['sprint_id', 'learnings'],
|
|
49
|
+
'party@1': ['topic', 'personas'],
|
|
50
|
+
};
|
|
51
|
+
function validateHandoff(obj) {
|
|
52
|
+
if (!obj || typeof obj !== 'object') {
|
|
53
|
+
throw new HandoffError('handoff must be an object');
|
|
54
|
+
}
|
|
55
|
+
const o = obj;
|
|
56
|
+
for (const k of ENVELOPE_KEYS) {
|
|
57
|
+
if (!(k in o))
|
|
58
|
+
throw new HandoffError(`handoff missing key: ${k}`);
|
|
59
|
+
}
|
|
60
|
+
const schema = o.schema;
|
|
61
|
+
if (typeof schema !== 'string' || !(schema in contracts_js_1.HANDOFF_FILENAMES)) {
|
|
62
|
+
throw new HandoffError(`unknown schema: ${String(schema)}`);
|
|
63
|
+
}
|
|
64
|
+
const data = o.data;
|
|
65
|
+
if (!data || typeof data !== 'object') {
|
|
66
|
+
throw new HandoffError('handoff.data must be an object');
|
|
67
|
+
}
|
|
68
|
+
const required = DATA_KEYS[schema];
|
|
69
|
+
for (const k of required) {
|
|
70
|
+
if (!(k in data)) {
|
|
71
|
+
throw new HandoffError(`handoff[${schema}].data missing key: ${k}`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
function writeHandoff(projectPath, handoff) {
|
|
76
|
+
validateHandoff(handoff);
|
|
77
|
+
ensureHandoffDir(projectPath);
|
|
78
|
+
const file = handoffPath(projectPath, handoff.schema);
|
|
79
|
+
fs_1.default.writeFileSync(file, JSON.stringify(handoff, null, 2), 'utf8');
|
|
80
|
+
return file;
|
|
81
|
+
}
|
|
82
|
+
function readHandoff(projectPath, schema) {
|
|
83
|
+
const file = handoffPath(projectPath, schema);
|
|
84
|
+
if (!fs_1.default.existsSync(file))
|
|
85
|
+
return null;
|
|
86
|
+
const raw = fs_1.default.readFileSync(file, 'utf8');
|
|
87
|
+
let parsed;
|
|
88
|
+
try {
|
|
89
|
+
parsed = JSON.parse(raw);
|
|
90
|
+
}
|
|
91
|
+
catch (e) {
|
|
92
|
+
throw new HandoffError(`handoff file is not valid JSON: ${file}`);
|
|
93
|
+
}
|
|
94
|
+
validateHandoff(parsed);
|
|
95
|
+
if (parsed.schema !== schema) {
|
|
96
|
+
throw new HandoffError(`handoff schema mismatch: expected ${schema}, got ${parsed.schema}`);
|
|
97
|
+
}
|
|
98
|
+
return parsed;
|
|
99
|
+
}
|
|
100
|
+
function listHandoffs(projectPath) {
|
|
101
|
+
const d = handoffDir(projectPath);
|
|
102
|
+
if (!fs_1.default.existsSync(d))
|
|
103
|
+
return [];
|
|
104
|
+
return fs_1.default.readdirSync(d).filter((f) => f.endsWith('.json'));
|
|
105
|
+
}
|
|
106
|
+
function clearHandoffs(projectPath) {
|
|
107
|
+
const d = handoffDir(projectPath);
|
|
108
|
+
if (!fs_1.default.existsSync(d))
|
|
109
|
+
return 0;
|
|
110
|
+
let n = 0;
|
|
111
|
+
for (const f of fs_1.default.readdirSync(d)) {
|
|
112
|
+
if (f.endsWith('.json')) {
|
|
113
|
+
fs_1.default.unlinkSync(path_1.default.join(d, f));
|
|
114
|
+
n++;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return n;
|
|
118
|
+
}
|
|
119
|
+
function nowIso() {
|
|
120
|
+
return new Date().toISOString();
|
|
121
|
+
}
|
package/dist/index.js
CHANGED
|
@@ -31,9 +31,6 @@ function main() {
|
|
|
31
31
|
// ─── Registration ──────────────────────────────────────────────────────────
|
|
32
32
|
// Register all modular commands
|
|
33
33
|
(0, command_registry_1.registerAllCommands)(program);
|
|
34
|
-
// ─── Update Check ──────────────────────────────────────────────────────────
|
|
35
|
-
// Run update check in background (non-blocking)
|
|
36
|
-
(0, update_check_1.checkForUpdates)().catch(() => { });
|
|
37
34
|
// ─── Execution ─────────────────────────────────────────────────────────────
|
|
38
35
|
// Parse arguments and execute
|
|
39
36
|
program.parse(process.argv);
|
|
@@ -41,6 +38,13 @@ function main() {
|
|
|
41
38
|
if (process.argv.length <= 2) {
|
|
42
39
|
program.help();
|
|
43
40
|
}
|
|
41
|
+
// ─── Update Check (after command runs, non-blocking) ───────────────────────
|
|
42
|
+
// Show update notification in background after command completes
|
|
43
|
+
(0, update_check_1.checkForUpdates)().then((info) => {
|
|
44
|
+
if (info) {
|
|
45
|
+
(0, update_check_1.promptForUpgrade)(info).catch(() => { });
|
|
46
|
+
}
|
|
47
|
+
}).catch(() => { });
|
|
44
48
|
});
|
|
45
49
|
}
|
|
46
50
|
// Error handling for uncaught exceptions
|