codymaster 4.1.3 β 4.3.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 +22 -2
- package/README.md +54 -84
- package/dist/index.js +589 -510
- package/dist/ui/box.js +49 -0
- package/install.sh +2 -2
- package/package.json +3 -9
- package/skills/AGENTS.md +61 -0
- package/skills/CLAUDE.md +158 -0
- package/skills/boxme-git-config/SKILL.md +56 -0
- package/skills/boxme-local-dev/SKILL.md +66 -0
- package/skills/build.sh +30 -0
- package/skills/cf +314 -0
- package/skills/cf 2 +313 -0
- package/skills/cm-ads-tracker/SKILL.md +364 -69
- package/skills/cm-auto-publisher/SKILL.md +81 -0
- package/skills/cm-booking-calendar/SKILL.md +521 -0
- package/skills/cm-booking-calendar/references/industry-patterns.md +527 -0
- package/skills/cm-booking-calendar/templates/booking-form.css +626 -0
- package/skills/cm-booking-calendar/templates/booking-form.html +477 -0
- package/skills/cm-booking-calendar/templates/calendar-engine.js +419 -0
- package/skills/cm-booking-calendar/templates/calendar-export.js +395 -0
- package/skills/cm-booking-calendar/templates/reminder-config.js +629 -0
- package/skills/cm-brainstorm-idea/SKILL.md +15 -24
- package/skills/cm-clean-code/SKILL.md +300 -0
- package/skills/cm-code-review/SKILL.md +0 -27
- package/skills/cm-codeintell/SKILL.md +598 -0
- package/skills/cm-content-factory/.content-factory-state.json +132 -0
- package/skills/cm-content-factory/.git 2/logs/refs/heads/main +1 -0
- package/skills/cm-content-factory/.git 2/logs/refs/remotes/origin/main +1 -0
- 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 +5 -0
- 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 +1 -0
- package/skills/cm-content-factory/.git 2/refs/remotes/origin/main +1 -0
- package/skills/cm-content-factory/.pytest_cache 2/v/cache/nodeids +76 -0
- package/skills/cm-content-factory/.pytest_cache 2/v/cache/stepwise +1 -0
- package/skills/cm-content-factory/AGENTS.md +61 -0
- package/skills/cm-content-factory/CLAUDE.md +63 -0
- package/skills/cm-content-factory/CURSOR.md +43 -0
- package/skills/cm-content-factory/Content Factory.zip +0 -0
- package/skills/cm-content-factory/cf +313 -0
- package/skills/cm-content-factory/config.schema.json +397 -0
- package/skills/cm-content-factory/dashboard/app.js +556 -0
- package/skills/cm-content-factory/dashboard/index.html +397 -0
- package/skills/cm-content-factory/dashboard/style.css +1211 -0
- package/skills/cm-content-factory/examples/01-real-estate.config.json +146 -0
- package/skills/cm-content-factory/examples/02-personal-finance.config.json +146 -0
- package/skills/cm-content-factory/examples/03-health-wellness.config.json +147 -0
- package/skills/cm-content-factory/examples/04-saas-software.config.json +147 -0
- package/skills/cm-content-factory/examples/05-legal-services.config.json +147 -0
- package/skills/cm-content-factory/examples/06-insurance.config.json +146 -0
- package/skills/cm-content-factory/examples/07-ecommerce-dropship.config.json +146 -0
- package/skills/cm-content-factory/examples/08-online-education.config.json +147 -0
- package/skills/cm-content-factory/examples/09-crypto-defi.config.json +147 -0
- package/skills/cm-content-factory/examples/10-beauty-skincare.config.json +147 -0
- package/skills/cm-content-factory/examples/11-home-services.config.json +146 -0
- package/skills/cm-content-factory/examples/12-dental-clinic.config.json +147 -0
- package/skills/cm-content-factory/examples/13-pet-care.config.json +147 -0
- package/skills/cm-content-factory/examples/14-travel-hospitality.config.json +147 -0
- package/skills/cm-content-factory/examples/15-ai-automation.config.json +147 -0
- package/skills/cm-content-factory/examples/16-wedding-events.config.json +147 -0
- package/skills/cm-content-factory/examples/17-fitness-coaching.config.json +148 -0
- package/skills/cm-content-factory/examples/18-cybersecurity.config.json +147 -0
- package/skills/cm-content-factory/examples/19-food-restaurant.config.json +148 -0
- package/skills/cm-content-factory/examples/20-solar-energy.config.json +147 -0
- package/skills/cm-content-factory/examples/fitness-blog.config.json +116 -0
- package/skills/cm-content-factory/examples/tech-blog.config.json +107 -0
- package/skills/cm-content-factory/extensions/EXTENSION_GUIDE.md +72 -0
- package/skills/cm-content-factory/extensions/hooks.py +126 -0
- package/skills/cm-content-factory/extensions/openclaw_adapter.py +132 -0
- package/skills/cm-content-factory/landing/index.html +680 -0
- package/skills/cm-content-factory/landing/script.js +101 -0
- package/skills/cm-content-factory/landing/style.css +1216 -0
- package/skills/cm-content-factory/landing/translations.js +508 -0
- package/skills/cm-content-factory/logs/events.jsonl +11 -0
- package/skills/cm-content-factory/profiles/_template.profile.json +231 -0
- package/skills/cm-content-factory/profiles/finance.profile.json +278 -0
- package/skills/cm-content-factory/profiles/legal.profile.json +263 -0
- package/skills/cm-content-factory/profiles/medical-research.profile.json +321 -0
- package/skills/cm-content-factory/profiles/technology.profile.json +275 -0
- package/skills/cm-content-factory/scripts/agent_dispatcher.py +266 -0
- package/skills/cm-content-factory/scripts/audit.py +106 -0
- package/skills/cm-content-factory/scripts/dashboard_server.py +225 -0
- package/skills/cm-content-factory/scripts/deploy.py +146 -0
- package/skills/cm-content-factory/scripts/extract.py +132 -0
- package/skills/cm-content-factory/scripts/landing_generator.py +459 -0
- package/skills/cm-content-factory/scripts/memory.py +521 -0
- package/skills/cm-content-factory/scripts/monetize.py +239 -0
- package/skills/cm-content-factory/scripts/pipeline.py +357 -0
- package/skills/cm-content-factory/scripts/plan.py +163 -0
- package/skills/cm-content-factory/scripts/publish.py +145 -0
- package/skills/cm-content-factory/scripts/research.py +337 -0
- package/skills/cm-content-factory/scripts/scaffold.py +464 -0
- package/skills/cm-content-factory/scripts/scoreboard.py +336 -0
- package/skills/cm-content-factory/scripts/seo.py +90 -0
- package/skills/cm-content-factory/scripts/state_manager.py +320 -0
- package/skills/cm-content-factory/scripts/token_manager.py +268 -0
- package/skills/cm-content-factory/scripts/validate.py +221 -0
- package/skills/cm-content-factory/scripts/wizard.py +329 -0
- package/skills/cm-content-factory/scripts/write.py +93 -0
- 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 +90 -0
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/data-flow.md +54 -0
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/deployment.md +38 -0
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/flows/index.md +65 -0
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/flows/lc-content-lifecycle.md +48 -0
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/flows/seq-write-mode.md +39 -0
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/flows/uj-first-batch.md +42 -0
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/flows/wf-content-pipeline.md +51 -0
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/flows/wf-learning-cycle.md +52 -0
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/getting-started/configuration.md +86 -0
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/getting-started/installation.md +80 -0
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/getting-started/intro.md +58 -0
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/index.md +102 -0
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/jtbd/index.md +45 -0
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/jtbd/optimize-seo.md +29 -0
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/jtbd/scale-content-production.md +55 -0
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/jtbd/standardize-quality.md +29 -0
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/personas/buyer-cmo-huong.md +41 -0
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/personas/buyer-content-lead-khoa.md +40 -0
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/personas/index.md +56 -0
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/personas/user-content-manager-lan.md +46 -0
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/personas/user-seo-minh.md +45 -0
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/personas/user-writer-tu.md +45 -0
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/sop/content-pipeline.md +108 -0
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/sop/index.md +22 -0
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/sop/memory-system.md +52 -0
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/sop/seo-optimization.md +58 -0
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/sop/troubleshooting-guide.md +92 -0
- package/skills/cm-content-factory/sites/docs-site/src/styles/custom.css +575 -0
- package/skills/cm-content-factory/tests/conftest.py +66 -0
- package/skills/cm-content-factory/tests/test_agent_dispatcher.py +125 -0
- package/skills/cm-content-factory/tests/test_memory.py +128 -0
- package/skills/cm-content-factory/tests/test_pipeline.py +107 -0
- package/skills/cm-content-factory/tests/test_research.py +56 -0
- package/skills/cm-content-factory/tests/test_state_manager.py +131 -0
- package/skills/cm-content-factory/tests/test_token_manager.py +110 -0
- package/skills/cm-content-factory/tests/test_wizard.py +121 -0
- package/skills/cm-continuity/SKILL.md +7 -0
- package/skills/cm-cro-methodology/SKILL.md +290 -0
- package/skills/cm-dashboard/SKILL.md +7 -525
- package/skills/cm-debugging/SKILL.md +7 -116
- package/skills/cm-deep-search/SKILL.md +5 -1
- package/skills/cm-dockit/README.md +6 -15
- package/skills/cm-dockit/SKILL.md +20 -37
- package/skills/cm-execution/SKILL.md +6 -1
- package/skills/cm-frappe-agent/SKILL.md +134 -0
- package/skills/cm-frappe-agent/agents/doctype-architect.md +596 -0
- package/skills/cm-frappe-agent/agents/erpnext-customizer.md +643 -0
- package/skills/cm-frappe-agent/agents/frappe-backend.md +814 -0
- package/skills/cm-frappe-agent/agents/frappe-custom-frontend.md +557 -0
- package/skills/cm-frappe-agent/agents/frappe-debugger.md +625 -0
- package/skills/cm-frappe-agent/agents/frappe-fixer.md +275 -0
- package/skills/cm-frappe-agent/agents/frappe-frontend.md +660 -0
- package/skills/cm-frappe-agent/agents/frappe-installer.md +158 -0
- package/skills/cm-frappe-agent/agents/frappe-performance.md +307 -0
- package/skills/cm-frappe-agent/agents/frappe-planner.md +419 -0
- package/skills/cm-frappe-agent/agents/frappe-remote-ops.md +153 -0
- package/skills/cm-frappe-agent/agents/github-workflow.md +286 -0
- package/skills/cm-frappe-agent/commands/frappe-app.md +351 -0
- package/skills/cm-frappe-agent/commands/frappe-backend.md +162 -0
- package/skills/cm-frappe-agent/commands/frappe-bench.md +254 -0
- package/skills/cm-frappe-agent/commands/frappe-debug.md +263 -0
- package/skills/cm-frappe-agent/commands/frappe-doctype-create.md +272 -0
- package/skills/cm-frappe-agent/commands/frappe-doctype-field.md +310 -0
- package/skills/cm-frappe-agent/commands/frappe-erpnext.md +210 -0
- package/skills/cm-frappe-agent/commands/frappe-fix.md +59 -0
- package/skills/cm-frappe-agent/commands/frappe-frontend.md +210 -0
- package/skills/cm-frappe-agent/commands/frappe-fullstack.md +243 -0
- package/skills/cm-frappe-agent/commands/frappe-github.md +57 -0
- package/skills/cm-frappe-agent/commands/frappe-install.md +52 -0
- package/skills/cm-frappe-agent/commands/frappe-plan.md +442 -0
- package/skills/cm-frappe-agent/commands/frappe-remote.md +58 -0
- package/skills/cm-frappe-agent/commands/frappe-test.md +356 -0
- package/skills/cm-frappe-agent/docs/README.md +51 -0
- package/skills/cm-frappe-agent/docs/agents-catalog.md +113 -0
- package/skills/cm-frappe-agent/docs/architecture.md +149 -0
- package/skills/cm-frappe-agent/docs/commands-catalog.md +82 -0
- package/skills/cm-frappe-agent/docs/resources-catalog.md +66 -0
- package/skills/cm-frappe-agent/docs/sitemap-urls.txt +52 -0
- package/skills/cm-frappe-agent/docs/sitemap.md +81 -0
- package/skills/cm-frappe-agent/docs/sop/user-guide.md +178 -0
- package/skills/cm-frappe-agent/docs/sop/vibe-coding-guide.md +122 -0
- package/skills/cm-frappe-agent/resources/7-layer-architecture.md +985 -0
- package/skills/cm-frappe-agent/resources/bench_commands.md +73 -0
- package/skills/cm-frappe-agent/resources/code-patterns-guide.md +948 -0
- package/skills/cm-frappe-agent/resources/common_pitfalls.md +266 -0
- package/skills/cm-frappe-agent/resources/doctype-registry.md +158 -0
- package/skills/cm-frappe-agent/resources/installation-guide.md +289 -0
- package/skills/cm-frappe-agent/resources/rest-api-patterns.md +182 -0
- package/skills/cm-frappe-agent/resources/scaffold_checklist.md +82 -0
- package/skills/cm-frappe-agent/resources/upgrade_patterns.md +113 -0
- package/skills/cm-frappe-agent/resources/web-form-patterns.md +252 -0
- package/skills/cm-frappe-agent/skills/bench-commands/SKILL.md +621 -0
- package/skills/cm-frappe-agent/skills/client-scripts/SKILL.md +642 -0
- package/skills/cm-frappe-agent/skills/doctype-patterns/SKILL.md +576 -0
- package/skills/cm-frappe-agent/skills/frappe-api/SKILL.md +740 -0
- package/skills/cm-frappe-agent/skills/remote-operations/SKILL.md +47 -0
- package/skills/cm-frappe-agent/skills/server-scripts/SKILL.md +608 -0
- package/skills/cm-frappe-agent/skills/web-forms/SKILL.md +46 -0
- package/skills/cm-git-worktrees/SKILL.md +0 -7
- package/skills/cm-google-form/SKILL.md +266 -0
- package/skills/cm-google-form/templates/apps-script.js +55 -0
- package/skills/cm-google-form/templates/form-markup.html +110 -0
- package/skills/cm-google-form/templates/form-submit.js +201 -0
- package/skills/cm-google-form/templates/toast.css +152 -0
- package/skills/cm-growth-hacking/SKILL.md +293 -0
- package/skills/cm-growth-hacking/bottom-sheet-engine.md +261 -0
- package/skills/cm-growth-hacking/calendar-integration.md +264 -0
- package/skills/cm-growth-hacking/references/engagement-patterns.md +346 -0
- package/skills/cm-growth-hacking/templates/bottom-sheet.css +528 -0
- package/skills/cm-growth-hacking/templates/bottom-sheet.js +269 -0
- package/skills/cm-growth-hacking/templates/calendar-cta.js +213 -0
- package/skills/cm-growth-hacking/templates/tracking-events.js +211 -0
- package/skills/cm-growth-hacking/templates/trigger-manager.js +254 -0
- package/skills/cm-growth-hacking/tracking-events.md +246 -0
- package/skills/cm-growth-hacking/trigger-system.md +342 -0
- package/skills/cm-how-it-work/SKILL.md +20 -4
- package/skills/cm-identity-guard/SKILL.md +0 -11
- package/skills/cm-jtbd/SKILL.md +1 -1
- package/skills/cm-notebooklm/SKILL.md +172 -0
- package/skills/cm-notebooklm/references/command_reference.md +94 -0
- package/skills/cm-notebooklm/references/workflows.md +60 -0
- package/skills/cm-notebooklm/resources/knowledge_sources.md +106 -0
- package/skills/cm-notebooklm/scripts/brain-sync.sh +453 -0
- package/skills/cm-notebooklm/scripts/graduate_wisdom.py +101 -0
- package/skills/cm-planning/SKILL.md +39 -52
- package/skills/cm-project-bootstrap/SKILL.md +1307 -99
- package/skills/cm-quality-gate/SKILL.md +13 -106
- package/skills/cm-reactor/SKILL.md +274 -0
- package/skills/cm-safe-deploy/SKILL.md +415 -52
- package/skills/cm-safe-i18n/SKILL.md +1 -22
- package/skills/cm-secret-shield/SKILL.md +2 -2
- package/skills/cm-security-gate/SKILL.md +114 -0
- package/skills/cm-skill-chain/SKILL.md +2 -2
- package/skills/cm-skill-index/SKILL.md +9 -6
- package/skills/cm-skill-mastery/SKILL.md +2 -15
- package/skills/cm-start/SKILL.md +9 -0
- package/skills/cm-tdd/SKILL.md +8 -41
- package/skills/cm-ui-preview/SKILL.md +35 -173
- package/skills/cm-ux-master/FEATURES-v4.md +305 -0
- package/skills/cm-ux-master/README-ru.md +135 -0
- package/skills/cm-ux-master/README-vi.md +135 -0
- package/skills/cm-ux-master/README-zh.md +135 -0
- package/skills/cm-ux-master/README.md +489 -0
- package/skills/cm-ux-master/SKILL.md +773 -62
- package/skills/cm-ux-master/cli/README.md +180 -0
- package/skills/cm-ux-master/cli/pyproject.toml +106 -0
- package/skills/cm-ux-master/cli/requirements.txt +21 -0
- package/skills/cm-ux-master/cli/templates/base/skill-core.md +262 -0
- package/skills/cm-ux-master/cli/templates/platforms/claude.yaml +21 -0
- package/skills/cm-ux-master/cli/templates/platforms/cursor.yaml +21 -0
- package/skills/cm-ux-master/cli/templates/platforms/figma.yaml +24 -0
- package/skills/cm-ux-master/cli/templates/platforms/vscode-mcp.yaml +28 -0
- package/skills/cm-ux-master/cli/templates/platforms/windsurf.yaml +21 -0
- package/skills/cm-ux-master/cli/uxmaster/__init__.py +10 -0
- package/skills/cm-ux-master/cli/uxmaster/__main__.py +19 -0
- package/skills/cm-ux-master/cli/uxmaster/cli.py +349 -0
- package/skills/cm-ux-master/cli/uxmaster/commands/__init__.py +8 -0
- package/skills/cm-ux-master/cli/uxmaster/commands/extract.py +18 -0
- package/skills/cm-ux-master/cli/uxmaster/commands/init.py +58 -0
- package/skills/cm-ux-master/cli/uxmaster/commands/mcp.py +194 -0
- package/skills/cm-ux-master/cli/uxmaster/commands/search.py +23 -0
- package/skills/cm-ux-master/cli/uxmaster/commands/validate.py +270 -0
- package/skills/cm-ux-master/cli/uxmaster/search_engine.py +532 -0
- package/skills/cm-ux-master/cli/uxmaster/template_engine.py +458 -0
- package/skills/cm-ux-master/cli/uxmaster/utils/__init__.py +9 -0
- package/skills/cm-ux-master/cli/uxmaster/utils/console.py +42 -0
- package/skills/cm-ux-master/cli/uxmaster/utils/detect.py +83 -0
- package/skills/cm-ux-master/data/accessibility-advanced.csv +26 -0
- package/skills/cm-ux-master/data/animation.csv +31 -0
- package/skills/cm-ux-master/data/charts.csv +26 -0
- package/skills/cm-ux-master/data/colors.csv +97 -0
- package/skills/cm-ux-master/data/design-tests.csv +37 -0
- package/skills/cm-ux-master/data/devices.csv +21 -0
- package/skills/cm-ux-master/data/icons.csv +101 -0
- package/skills/cm-ux-master/data/landing.csv +31 -0
- package/skills/cm-ux-master/data/products.csv +97 -0
- package/skills/cm-ux-master/data/react-performance.csv +45 -0
- package/skills/cm-ux-master/data/responsive.csv +26 -0
- package/skills/cm-ux-master/data/semi-tokens.csv +52 -0
- package/skills/cm-ux-master/data/stacks/angular.csv +34 -0
- package/skills/cm-ux-master/data/stacks/astro.csv +54 -0
- package/skills/cm-ux-master/data/stacks/electron.csv +32 -0
- package/skills/cm-ux-master/data/stacks/flutter.csv +53 -0
- package/skills/cm-ux-master/data/stacks/html-tailwind.csv +56 -0
- package/skills/cm-ux-master/data/stacks/htmx.csv +28 -0
- package/skills/cm-ux-master/data/stacks/jetpack-compose.csv +53 -0
- package/skills/cm-ux-master/data/stacks/nextjs.csv +53 -0
- package/skills/cm-ux-master/data/stacks/nuxt-ui.csv +51 -0
- package/skills/cm-ux-master/data/stacks/nuxtjs.csv +59 -0
- package/skills/cm-ux-master/data/stacks/react-native.csv +52 -0
- package/skills/cm-ux-master/data/stacks/react.csv +54 -0
- package/skills/cm-ux-master/data/stacks/shadcn.csv +61 -0
- package/skills/cm-ux-master/data/stacks/svelte.csv +54 -0
- package/skills/cm-ux-master/data/stacks/swiftui.csv +51 -0
- package/skills/cm-ux-master/data/stacks/tauri.csv +29 -0
- package/skills/cm-ux-master/data/stacks/vue.csv +50 -0
- package/skills/cm-ux-master/data/styles.csv +68 -0
- package/skills/cm-ux-master/data/typography.csv +58 -0
- package/skills/cm-ux-master/data/ui-reasoning.csv +101 -0
- package/skills/cm-ux-master/data/ux-guidelines.csv +100 -0
- package/skills/cm-ux-master/data/ux-laws.csv +49 -0
- package/skills/cm-ux-master/data/web-interface.csv +31 -0
- package/skills/cm-ux-master/docs/LANDING-PAGE.html +377 -0
- package/skills/cm-ux-master/docs/README.md +108 -0
- package/skills/cm-ux-master/docs/css/styles.css +573 -0
- package/skills/cm-ux-master/docs/examples/demo-script.md +319 -0
- package/skills/cm-ux-master/docs/guides/for-designers.md +692 -0
- package/skills/cm-ux-master/docs/guides/for-developers.md +778 -0
- package/skills/cm-ux-master/docs/guides/for-product-managers.md +693 -0
- package/skills/cm-ux-master/docs/guides/react-guide-vi.md +50 -0
- package/skills/cm-ux-master/docs/index.html +1062 -0
- package/skills/cm-ux-master/docs/js/i18n.js +84 -0
- package/skills/cm-ux-master/docs/js/lang/de.js +145 -0
- package/skills/cm-ux-master/docs/js/lang/en.js +145 -0
- package/skills/cm-ux-master/docs/js/lang/fr.js +145 -0
- package/skills/cm-ux-master/docs/js/lang/hi.js +145 -0
- package/skills/cm-ux-master/docs/js/lang/id.js +145 -0
- package/skills/cm-ux-master/docs/js/lang/ja.js +145 -0
- package/skills/cm-ux-master/docs/js/lang/ko.js +145 -0
- package/skills/cm-ux-master/docs/js/lang/ru.js +145 -0
- package/skills/cm-ux-master/docs/js/lang/vi.js +145 -0
- package/skills/cm-ux-master/docs/js/lang/zh.js +145 -0
- package/skills/cm-ux-master/docs/js/main.js +117 -0
- package/skills/cm-ux-master/docs/plan/PHASE1-COMPLETION.md +217 -0
- package/skills/cm-ux-master/docs/plan/PHASE2-COMPLETION.md +199 -0
- package/skills/cm-ux-master/docs/plan/PHASE2-ENHANCED-COMPLETION.md +352 -0
- package/skills/cm-ux-master/docs/plan/PHASE3-VALIDATION-COMPLETION.md +499 -0
- package/skills/cm-ux-master/docs/plan/PHASE4-TESTING-POLISH-COMPLETION.md +483 -0
- package/skills/cm-ux-master/docs/plan/UXM-2.0-ROADMAP.md +681 -0
- package/skills/cm-ux-master/docs/plan/WOW-PITCH.md +410 -0
- package/skills/cm-ux-master/docs/technical/api-reference.md +824 -0
- package/skills/cm-ux-master/docs/technical/harvester-v4.md +328 -0
- package/skills/cm-ux-master/docs/technical/how-it-works.md +1128 -0
- package/skills/cm-ux-master/docs/tutorials/quickstart.md +339 -0
- package/skills/cm-ux-master/docs/tutorials/tutorials.md +939 -0
- package/skills/cm-ux-master/docs/tutorials/user-guide.md +716 -0
- package/skills/cm-ux-master/examples/README.md +63 -0
- package/skills/cm-ux-master/mcp/__init__.py +3 -0
- package/skills/cm-ux-master/mcp/integrations/__init__.py +11 -0
- package/skills/cm-ux-master/mcp/integrations/figma/__init__.py +6 -0
- package/skills/cm-ux-master/mcp/integrations/figma/client.py +293 -0
- package/skills/cm-ux-master/mcp/integrations/figma/plugin/code.js +561 -0
- package/skills/cm-ux-master/mcp/integrations/figma/plugin/ui.html +334 -0
- package/skills/cm-ux-master/mcp/integrations/stitch/__init__.py +5 -0
- package/skills/cm-ux-master/mcp/integrations/stitch/client.py +410 -0
- package/skills/cm-ux-master/mcp/integrations/vscode/package.json +167 -0
- package/skills/cm-ux-master/mcp/integrations/vscode/src/extension.ts +81 -0
- package/skills/cm-ux-master/mcp/mcp-config.json +274 -0
- package/skills/cm-ux-master/mcp/server.py +771 -0
- package/skills/cm-ux-master/mcp/tools/__init__.py +13 -0
- package/skills/cm-ux-master/mcp-server/server.py +595 -0
- package/skills/cm-ux-master/output/fila/FilaDashboard.tsx +47 -0
- package/skills/cm-ux-master/output/fila/components/badge/component.tsx +35 -0
- package/skills/cm-ux-master/output/fila/components/badge/index.ts +1 -0
- package/skills/cm-ux-master/output/fila/components/button/component.tsx +53 -0
- package/skills/cm-ux-master/output/fila/components/button/index.ts +1 -0
- package/skills/cm-ux-master/output/fila/components/card/component.tsx +35 -0
- package/skills/cm-ux-master/output/fila/components/card/index.ts +1 -0
- package/skills/cm-ux-master/output/fila/components/input/component.tsx +41 -0
- package/skills/cm-ux-master/output/fila/components/input/index.ts +1 -0
- package/skills/cm-ux-master/output/fila/design-system.css +151 -0
- package/skills/cm-ux-master/output/fila/design-system.html +1596 -0
- package/skills/cm-ux-master/output/fila/design-system.json +168 -0
- package/skills/cm-ux-master/output/fila/figma-tokens.json +523 -0
- package/skills/cm-ux-master/output/fila/harvest-v4-raw.json +406 -0
- package/skills/cm-ux-master/output/fila/semi-theme-override.css +95 -0
- package/skills/cm-ux-master/output/haravan/HaravanDashboard.tsx +103 -0
- package/skills/cm-ux-master/output/haravan/design-system-v3-live.html +2716 -0
- package/skills/cm-ux-master/output/haravan/design-system-v3.html +1770 -0
- package/skills/cm-ux-master/output/haravan/design-system.html +914 -0
- package/skills/cm-ux-master/output/haravan/figma-tokens.json +84 -0
- package/skills/cm-ux-master/output/haravan/haravan-harvest.json +33 -0
- package/skills/cm-ux-master/output/haravan/harvest-v3-raw.json +167 -0
- package/skills/cm-ux-master/output/haravan/semi-theme-override.css +39 -0
- package/skills/cm-ux-master/references/audit-template.md +257 -0
- package/skills/cm-ux-master/references/cultural-ux.md +346 -0
- package/skills/cm-ux-master/references/dark-patterns.md +362 -0
- package/skills/cm-ux-master/references/heuristic-conflicts.md +296 -0
- package/skills/cm-ux-master/references/krug-principles.md +289 -0
- package/skills/cm-ux-master/references/nielsen-heuristics.md +360 -0
- package/skills/cm-ux-master/references/wcag-checklist.md +306 -0
- package/skills/cm-ux-master/scripts/component_generator.py +631 -0
- package/skills/cm-ux-master/scripts/core.py +305 -0
- package/skills/cm-ux-master/scripts/demo_validation.py +452 -0
- package/skills/cm-ux-master/scripts/design_doc_generator.py +1325 -0
- package/skills/cm-ux-master/scripts/design_system.py +1141 -0
- package/skills/cm-ux-master/scripts/design_system_indexer.py +889 -0
- package/skills/cm-ux-master/scripts/extract_i18n.py +251 -0
- package/skills/cm-ux-master/scripts/extractor.py +1437 -0
- package/skills/cm-ux-master/scripts/figma_bridge.py +406 -0
- package/skills/cm-ux-master/scripts/generate.py +147 -0
- package/skills/cm-ux-master/scripts/harvest_session.py +207 -0
- package/skills/cm-ux-master/scripts/harvester.js +240 -0
- package/skills/cm-ux-master/scripts/harvester_browser.py +717 -0
- package/skills/cm-ux-master/scripts/harvester_cli.py +431 -0
- package/skills/cm-ux-master/scripts/harvester_v1.js +275 -0
- package/skills/cm-ux-master/scripts/harvester_v3.js +620 -0
- package/skills/cm-ux-master/scripts/harvester_v4.js +1003 -0
- package/skills/cm-ux-master/scripts/install.py +528 -0
- package/skills/cm-ux-master/scripts/license.py +81 -0
- package/skills/cm-ux-master/scripts/media/qrpayment.png +0 -0
- package/skills/cm-ux-master/scripts/pro_stubs.py +120 -0
- package/skills/cm-ux-master/scripts/project_registry.py +217 -0
- package/skills/cm-ux-master/scripts/search.py +114 -0
- package/skills/cm-ux-master/scripts/semi_mcp_bridge.py +425 -0
- package/skills/cm-ux-master/scripts/stitch_integration.py +583 -0
- package/skills/cm-ux-master/scripts/test_harvester_v4.py +335 -0
- package/skills/cm-ux-master/scripts/token_mapper.py +626 -0
- package/skills/cm-ux-master/scripts/validation_engine.py +1571 -0
- package/skills/cm-ux-master/scripts/wizard.py +653 -0
- package/skills/cm-ux-master/setup.py +93 -0
- package/skills/cm-ux-master/templates/base/flutter-widget.dart +69 -0
- package/skills/cm-ux-master/templates/base/html-page.html +152 -0
- package/skills/cm-ux-master/templates/base/react-component.tsx +47 -0
- package/skills/cm-ux-master/templates/base/swiftui-view.swift +62 -0
- package/skills/cm-ux-master/templates/quick-start.sh +176 -0
- package/skills/cm-ux-master/tests/automation/batch-validate.sh +250 -0
- package/skills/cm-ux-master/tests/automation/generate-test-projects.sh +561 -0
- package/skills/cm-ux-master/tests/automation/run-all-tests.sh +315 -0
- package/skills/cm-ux-master/tests/test_design_doc.py +145 -0
- package/skills/cm-ux-master/tests/test_devices.py +74 -0
- package/skills/cm-ux-master/tests/test_generator.py +116 -0
- package/skills/cm-ux-master/tests/test_harvest_session.py +131 -0
- package/skills/cm-ux-master/tests/test_harvester.py +127 -0
- package/skills/cm-ux-master/tests/test_harvester_v3.py +324 -0
- package/skills/cm-ux-master/tests/test_mcp_server.py +496 -0
- package/skills/cm-ux-master/tests/test_new_domains.py +108 -0
- package/skills/cm-ux-master/tests/test_new_stacks.py +103 -0
- package/skills/cm-ux-master/tests/test_project_registry.py +146 -0
- package/skills/cm-ux-master/tests/test_semi_mcp_bridge.py +207 -0
- package/skills/cm-ux-master/tests/test_token_mapper.py +247 -0
- package/skills/cm-ux-master/tests/test_validation_engine.py +617 -0
- package/skills/config.schema.json +397 -0
- package/skills/frappe-app-builder.zip +0 -0
- package/skills/jobs-to-be-done/SKILL.md +266 -0
- package/skills/jobs-to-be-done/references/case-studies.md +154 -0
- package/skills/jobs-to-be-done/references/competitive-strategy.md +280 -0
- package/skills/jobs-to-be-done/references/diagnostics.md +158 -0
- package/skills/jobs-to-be-done/references/innovation-process.md +392 -0
- package/skills/jobs-to-be-done/references/organizational-change.md +328 -0
- package/skills/marketplace-report-crawler/SKILL.md +176 -0
- package/skills/marketplace-report-crawler/config/accounts.json +41 -0
- package/skills/marketplace-report-crawler/config/report-types.json +422 -0
- package/skills/marketplace-report-crawler/config/sessions.json +3 -0
- package/skills/marketplace-report-crawler/scripts/ab-wrapper.sh +102 -0
- package/skills/marketplace-report-crawler/scripts/browser-actions/lazada/lazada-actions.js +114 -0
- package/skills/marketplace-report-crawler/scripts/browser-actions/shopee/shopee-actions.js +94 -0
- package/skills/marketplace-report-crawler/scripts/browser-actions/tiktok/tiktok-actions.js +272 -0
- package/skills/marketplace-report-crawler/scripts/crawl-runner.js +281 -0
- package/skills/marketplace-report-crawler/scripts/session-check.sh +72 -0
- package/skills/marketplace-report-crawler/scripts/session-manager.sh +349 -0
- package/skills/marketplace-report-crawler/scripts/setup-folders.sh +83 -0
- package/skills/medical-research/SKILL.md +194 -0
- package/skills/medical-research/scripts/evidence_checker.py +288 -0
- package/skills/mom-test/SKILL.md +267 -0
- package/skills/mom-test/references/avoiding-bad-data.md +221 -0
- package/skills/mom-test/references/case-studies.md +306 -0
- package/skills/mom-test/references/commitment-advancement.md +219 -0
- package/skills/mom-test/references/finding-conversations.md +251 -0
- package/skills/mom-test/references/processing-learning.md +256 -0
- package/skills/mom-test/references/question-patterns.md +198 -0
- package/skills/pandasai-analytics/SKILL.md +251 -0
- package/skills/release-it/SKILL.md +235 -0
- package/skills/release-it/references/anti-patterns.md +279 -0
- package/skills/release-it/references/capacity-planning.md +285 -0
- package/skills/release-it/references/chaos-engineering.md +325 -0
- package/skills/release-it/references/deployment-strategies.md +331 -0
- package/skills/release-it/references/observability.md +301 -0
- package/skills/release-it/references/stability-patterns.md +355 -0
- package/skills/scripts/sync-ide-skills.sh +61 -0
- package/skills/skill-creator-ultra/.agents/workflows/skill-audit.md +37 -0
- package/skills/skill-creator-ultra/.agents/workflows/skill-compare.md +34 -0
- package/skills/skill-creator-ultra/.agents/workflows/skill-export.md +51 -0
- package/skills/skill-creator-ultra/.agents/workflows/skill-generate.md +39 -0
- package/skills/skill-creator-ultra/.agents/workflows/skill-scaffold.md +52 -0
- package/skills/skill-creator-ultra/.agents/workflows/skill-simulate.md +25 -0
- package/skills/skill-creator-ultra/.agents/workflows/skill-stats.md +31 -0
- package/skills/skill-creator-ultra/.agents/workflows/skill-validate.md +25 -0
- package/skills/skill-creator-ultra/README.md +1242 -0
- package/skills/skill-creator-ultra/SKILL.md +388 -0
- package/skills/skill-creator-ultra/agents/analyzer.md +274 -0
- package/skills/skill-creator-ultra/agents/comparator.md +202 -0
- package/skills/skill-creator-ultra/agents/grader.md +223 -0
- package/skills/skill-creator-ultra/assets/eval_review.html +146 -0
- package/skills/skill-creator-ultra/eval-viewer/generate_review.py +471 -0
- package/skills/skill-creator-ultra/eval-viewer/viewer.html +1325 -0
- package/skills/skill-creator-ultra/examples/example_anthropic_frontend.md +109 -0
- package/skills/skill-creator-ultra/examples/example_anthropic_pdf.md +116 -0
- package/skills/skill-creator-ultra/examples/example_api_docs.md +189 -0
- package/skills/skill-creator-ultra/examples/example_db_migration.md +253 -0
- package/skills/skill-creator-ultra/examples/example_git_commit.md +111 -0
- package/skills/skill-creator-ultra/install.ps1 +289 -0
- package/skills/skill-creator-ultra/install.sh +313 -0
- package/skills/skill-creator-ultra/phases/phase1_interview.md +202 -0
- package/skills/skill-creator-ultra/phases/phase2_extract.md +55 -0
- package/skills/skill-creator-ultra/phases/phase3_detect.md +57 -0
- package/skills/skill-creator-ultra/phases/phase4_generate.md +543 -0
- package/skills/skill-creator-ultra/phases/phase5_test.md +319 -0
- package/skills/skill-creator-ultra/phases/phase6_eval.md +301 -0
- package/skills/skill-creator-ultra/phases/phase7_iterate.md +103 -0
- package/skills/skill-creator-ultra/phases/phase8_optimize.md +113 -0
- package/skills/skill-creator-ultra/resources/advanced_patterns.md +499 -0
- package/skills/skill-creator-ultra/resources/anti_patterns.md +376 -0
- package/skills/skill-creator-ultra/resources/blueprints.md +498 -0
- package/skills/skill-creator-ultra/resources/checklist.md +243 -0
- package/skills/skill-creator-ultra/resources/composition_cookbook.md +291 -0
- package/skills/skill-creator-ultra/resources/description_optimization.md +90 -0
- package/skills/skill-creator-ultra/resources/eval_guide.md +133 -0
- package/skills/skill-creator-ultra/resources/industry_questions.md +189 -0
- package/skills/skill-creator-ultra/resources/interview_questions.md +200 -0
- package/skills/skill-creator-ultra/resources/pattern_detection.md +200 -0
- package/skills/skill-creator-ultra/resources/prompt_engineering.md +531 -0
- package/skills/skill-creator-ultra/resources/schemas.md +430 -0
- package/skills/skill-creator-ultra/resources/script_integration.md +593 -0
- package/skills/skill-creator-ultra/resources/scripts_guide.md +339 -0
- package/skills/skill-creator-ultra/resources/skill_template.md +124 -0
- package/skills/skill-creator-ultra/resources/skill_writing_guide.md +634 -0
- package/skills/skill-creator-ultra/resources/versioning_guide.md +193 -0
- package/skills/skill-creator-ultra/scripts/ci_eval.py +200 -0
- package/skills/skill-creator-ultra/scripts/package_skill.py +165 -0
- package/skills/skill-creator-ultra/scripts/simulate_skill.py +398 -0
- package/skills/skill-creator-ultra/scripts/skill_audit.py +611 -0
- package/skills/skill-creator-ultra/scripts/skill_compare.py +265 -0
- package/skills/skill-creator-ultra/scripts/skill_export.py +334 -0
- package/skills/skill-creator-ultra/scripts/skill_scaffold.py +403 -0
- package/skills/skill-creator-ultra/scripts/skill_stats.py +339 -0
- package/skills/skill-creator-ultra/scripts/validate_skill.py +411 -0
- package/skills/tailwind-mastery/SKILL.md +229 -0
- package/skills/vercel-react-best-practices/AGENTS.md +3373 -0
- package/skills/vercel-react-best-practices/README.md +123 -0
- package/skills/vercel-react-best-practices/SKILL.md +143 -0
- package/skills/vercel-react-best-practices/rules/_sections.md +46 -0
- package/skills/vercel-react-best-practices/rules/_template.md +28 -0
- package/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/skills/vercel-react-best-practices/rules/advanced-init-once.md +42 -0
- package/skills/vercel-react-best-practices/rules/advanced-use-latest.md +39 -0
- package/skills/vercel-react-best-practices/rules/async-api-routes.md +38 -0
- package/skills/vercel-react-best-practices/rules/async-defer-await.md +80 -0
- package/skills/vercel-react-best-practices/rules/async-dependencies.md +51 -0
- package/skills/vercel-react-best-practices/rules/async-parallel.md +28 -0
- package/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +59 -0
- package/skills/vercel-react-best-practices/rules/bundle-conditional.md +31 -0
- package/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/skills/vercel-react-best-practices/rules/bundle-preload.md +50 -0
- package/skills/vercel-react-best-practices/rules/client-event-listeners.md +74 -0
- package/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +71 -0
- package/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/skills/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
- package/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +107 -0
- package/skills/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
- package/skills/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
- package/skills/vercel-react-best-practices/rules/js-cache-storage.md +70 -0
- package/skills/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
- package/skills/vercel-react-best-practices/rules/js-early-exit.md +50 -0
- package/skills/vercel-react-best-practices/rules/js-flatmap-filter.md +60 -0
- package/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/skills/vercel-react-best-practices/rules/js-index-maps.md +37 -0
- package/skills/vercel-react-best-practices/rules/js-length-check-first.md +49 -0
- package/skills/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
- package/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/skills/vercel-react-best-practices/rules/rendering-activity.md +26 -0
- package/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
- package/skills/vercel-react-best-practices/rules/rendering-resource-hints.md +85 -0
- package/skills/vercel-react-best-practices/rules/rendering-script-defer-async.md +68 -0
- package/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +75 -0
- package/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/skills/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
- package/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
- package/skills/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
- package/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
- package/skills/vercel-react-best-practices/rules/rerender-memo.md +44 -0
- package/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
- package/skills/vercel-react-best-practices/rules/rerender-no-inline-components.md +82 -0
- package/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
- package/skills/vercel-react-best-practices/rules/rerender-split-combined-hooks.md +64 -0
- package/skills/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
- package/skills/vercel-react-best-practices/rules/rerender-use-deferred-value.md +59 -0
- package/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
- package/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/skills/vercel-react-best-practices/rules/server-auth-actions.md +96 -0
- package/skills/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
- package/skills/vercel-react-best-practices/rules/server-cache-react.md +76 -0
- package/skills/vercel-react-best-practices/rules/server-dedup-props.md +65 -0
- package/skills/vercel-react-best-practices/rules/server-hoist-static-io.md +142 -0
- package/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/skills/vercel-react-best-practices/rules/server-serialization.md +38 -0
- package/skills/web-design-guidelines/SKILL.md +39 -0
- package/skills/cro-methodology/SKILL.md +0 -98
- /package/skills/{cro-methodology β cm-cro-methodology}/references/COPYWRITING.md +0 -0
- /package/skills/{cro-methodology β cm-cro-methodology}/references/OBJECTIONS.md +0 -0
- /package/skills/{cro-methodology β cm-cro-methodology}/references/PERSUASION.md +0 -0
- /package/skills/{cro-methodology β cm-cro-methodology}/references/RESEARCH.md +0 -0
- /package/skills/{cro-methodology β cm-cro-methodology}/references/funnel-analysis.md +0 -0
- /package/skills/{cro-methodology β cm-cro-methodology}/references/testing-methodology.md +0 -0
package/dist/index.js
CHANGED
|
@@ -300,7 +300,7 @@ function showInteractiveMenu() {
|
|
|
300
300
|
break;
|
|
301
301
|
}
|
|
302
302
|
case 'install':
|
|
303
|
-
console.log(` ${(0, theme_1.brand)('β')} Run: ${(0, theme_1.brandBold)('
|
|
303
|
+
console.log(` ${(0, theme_1.brand)('β')} Run: ${(0, theme_1.brandBold)('bash <(curl -fsSL https://raw.githubusercontent.com/tody-agent/codymaster/main/install.sh) --all')}\n`);
|
|
304
304
|
break;
|
|
305
305
|
case 'profile':
|
|
306
306
|
console.log((0, hooks_1.formatProfileSummary)(profile));
|
|
@@ -329,7 +329,17 @@ program
|
|
|
329
329
|
.name('cm')
|
|
330
330
|
.description('Cody β 34 Skills. Ship 10x faster.')
|
|
331
331
|
.version(VERSION, '-v, --version', 'Show version')
|
|
332
|
-
.
|
|
332
|
+
.argument('[cmd]', 'Command to run', '')
|
|
333
|
+
.action((cmd) => __awaiter(void 0, void 0, void 0, function* () {
|
|
334
|
+
if (cmd && cmd !== 'help') {
|
|
335
|
+
console.log(chalk_1.default.red(`\n β Unknown command: ${cmd}\n`));
|
|
336
|
+
program.help();
|
|
337
|
+
return;
|
|
338
|
+
}
|
|
339
|
+
else if (cmd === 'help') {
|
|
340
|
+
program.help();
|
|
341
|
+
return;
|
|
342
|
+
}
|
|
333
343
|
// Interactive quick menu (Amp-style)
|
|
334
344
|
yield showInteractiveMenu();
|
|
335
345
|
}));
|
|
@@ -345,8 +355,7 @@ program
|
|
|
345
355
|
case 'start':
|
|
346
356
|
case undefined:
|
|
347
357
|
if (isDashboardRunning()) {
|
|
348
|
-
console.log(
|
|
349
|
-
console.log(chalk_1.default.gray(` URL: http://localhost:${port}`));
|
|
358
|
+
console.log((0, box_1.renderResult)('warning', 'Dashboard already running.', [`${(0, theme_1.dim)('URL:')} ${(0, theme_1.brand)(`http://localhost:${port}`)}`]));
|
|
350
359
|
return;
|
|
351
360
|
}
|
|
352
361
|
(0, dashboard_1.launchDashboard)(port);
|
|
@@ -358,15 +367,13 @@ program
|
|
|
358
367
|
dashboardStatus(port);
|
|
359
368
|
break;
|
|
360
369
|
case 'open':
|
|
361
|
-
console.log(
|
|
370
|
+
console.log((0, box_1.renderResult)('info', `Opening http://localhost:${port} ...`));
|
|
362
371
|
openUrl(`http://localhost:${port}`);
|
|
363
372
|
break;
|
|
364
373
|
case 'url':
|
|
365
374
|
console.log(`http://localhost:${port}`);
|
|
366
375
|
break;
|
|
367
|
-
default:
|
|
368
|
-
console.log(chalk_1.default.red(`Unknown: ${cmd}`));
|
|
369
|
-
console.log(chalk_1.default.gray('Available: start, stop, status, open, url'));
|
|
376
|
+
default: console.log((0, box_1.renderResult)('error', `Unknown: ${cmd}`, [(0, theme_1.dim)('Available: start, stop, status, open, url')]));
|
|
370
377
|
}
|
|
371
378
|
});
|
|
372
379
|
function isDashboardRunning() {
|
|
@@ -388,7 +395,7 @@ function isDashboardRunning() {
|
|
|
388
395
|
function stopDashboard() {
|
|
389
396
|
try {
|
|
390
397
|
if (!fs_1.default.existsSync(data_1.PID_FILE)) {
|
|
391
|
-
console.log(
|
|
398
|
+
console.log((0, box_1.renderResult)('warning', 'No dashboard running.'));
|
|
392
399
|
return;
|
|
393
400
|
}
|
|
394
401
|
const pid = parseInt(fs_1.default.readFileSync(data_1.PID_FILE, 'utf-8').trim());
|
|
@@ -397,10 +404,10 @@ function stopDashboard() {
|
|
|
397
404
|
fs_1.default.unlinkSync(data_1.PID_FILE);
|
|
398
405
|
}
|
|
399
406
|
catch (_a) { }
|
|
400
|
-
console.log(
|
|
407
|
+
console.log((0, box_1.renderResult)('success', `Dashboard stopped (PID ${pid}).`));
|
|
401
408
|
}
|
|
402
409
|
catch (err) {
|
|
403
|
-
console.log(
|
|
410
|
+
console.log((0, box_1.renderResult)('error', `Failed to stop: ${err.message}`));
|
|
404
411
|
try {
|
|
405
412
|
fs_1.default.unlinkSync(data_1.PID_FILE);
|
|
406
413
|
}
|
|
@@ -410,13 +417,10 @@ function stopDashboard() {
|
|
|
410
417
|
function dashboardStatus(port) {
|
|
411
418
|
if (isDashboardRunning()) {
|
|
412
419
|
const pid = fs_1.default.readFileSync(data_1.PID_FILE, 'utf-8').trim();
|
|
413
|
-
console.log(
|
|
414
|
-
console.log(chalk_1.default.gray(` PID: ${pid}`));
|
|
415
|
-
console.log(chalk_1.default.gray(` URL: http://localhost:${port}`));
|
|
420
|
+
console.log((0, box_1.renderResult)('success', 'Dashboard RUNNING', [`${(0, theme_1.dim)('PID:')} ${(0, theme_1.brand)(pid)}`, `${(0, theme_1.dim)('URL:')} ${(0, theme_1.brand)(`http://localhost:${port}`)}`]));
|
|
416
421
|
}
|
|
417
422
|
else {
|
|
418
|
-
console.log(
|
|
419
|
-
console.log(chalk_1.default.gray(' Start with: cm dashboard start'));
|
|
423
|
+
console.log((0, box_1.renderResult)('warning', 'Dashboard NOT running', [(0, theme_1.dim)('Start with: cm dashboard start')]));
|
|
420
424
|
}
|
|
421
425
|
}
|
|
422
426
|
// βββ Task Command βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
@@ -456,14 +460,12 @@ program
|
|
|
456
460
|
case 'stuck':
|
|
457
461
|
taskStuck(opts);
|
|
458
462
|
break;
|
|
459
|
-
default:
|
|
460
|
-
console.log(chalk_1.default.red(`Unknown: ${cmd}`));
|
|
461
|
-
console.log(chalk_1.default.gray('Available: add, list, move, done, rm, dispatch, stuck'));
|
|
463
|
+
default: console.log((0, box_1.renderResult)('error', `Unknown: ${cmd}`, [(0, theme_1.dim)('Available: add, list, move, done, rm, dispatch, stuck')]));
|
|
462
464
|
}
|
|
463
465
|
});
|
|
464
466
|
function taskAdd(title, opts) {
|
|
465
467
|
if (!title) {
|
|
466
|
-
console.log(
|
|
468
|
+
console.log((0, box_1.renderResult)('error', 'Title required. Usage: cm task add "My task"'));
|
|
467
469
|
return;
|
|
468
470
|
}
|
|
469
471
|
const data = (0, data_1.loadData)();
|
|
@@ -471,7 +473,7 @@ function taskAdd(title, opts) {
|
|
|
471
473
|
if (opts.project) {
|
|
472
474
|
const project = (0, data_1.findProjectByNameOrId)(data, opts.project);
|
|
473
475
|
if (!project) {
|
|
474
|
-
console.log(
|
|
476
|
+
console.log((0, box_1.renderResult)('error', `Project not found: ${opts.project}`));
|
|
475
477
|
return;
|
|
476
478
|
}
|
|
477
479
|
projectId = project.id;
|
|
@@ -493,8 +495,9 @@ function taskAdd(title, opts) {
|
|
|
493
495
|
(0, data_1.logActivity)(data, 'task_created', `Task "${task.title}" created via CLI`, projectId, opts.agent || '');
|
|
494
496
|
(0, data_1.saveData)(data);
|
|
495
497
|
const project = data.projects.find(p => p.id === projectId);
|
|
496
|
-
console.log(
|
|
497
|
-
|
|
498
|
+
console.log((0, box_1.renderResult)('success', `Task created: ${title}`, [
|
|
499
|
+
`${(0, theme_1.dim)('ID:')} ${(0, theme_1.brand)((0, data_1.shortId)(task.id))} ${(0, theme_1.dim)('|')} ${(0, theme_1.dim)('Project:')} ${(0, theme_1.brand)((project === null || project === void 0 ? void 0 : project.name) || 'Default')} ${(0, theme_1.dim)('|')} ${(0, theme_1.dim)(column)} ${(0, theme_1.dim)('|')} ${(0, theme_1.dim)(opts.priority || 'medium')}`,
|
|
500
|
+
]));
|
|
498
501
|
}
|
|
499
502
|
function taskList(opts) {
|
|
500
503
|
const data = (0, data_1.loadData)();
|
|
@@ -502,45 +505,45 @@ function taskList(opts) {
|
|
|
502
505
|
if (opts.project && !opts.all) {
|
|
503
506
|
const project = (0, data_1.findProjectByNameOrId)(data, opts.project);
|
|
504
507
|
if (!project) {
|
|
505
|
-
console.log(
|
|
508
|
+
console.log((0, box_1.renderResult)('error', `Project not found: ${opts.project}`));
|
|
506
509
|
return;
|
|
507
510
|
}
|
|
508
511
|
tasks = tasks.filter(t => t.projectId === project.id);
|
|
509
|
-
console.log(
|
|
512
|
+
console.log((0, box_1.renderCommandHeader)(`Tasks β ${project.name}`, 'π'));
|
|
510
513
|
}
|
|
511
514
|
else {
|
|
512
|
-
console.log(
|
|
515
|
+
console.log((0, box_1.renderCommandHeader)('All Tasks', 'π'));
|
|
513
516
|
}
|
|
514
517
|
if (tasks.length === 0) {
|
|
515
|
-
console.log(
|
|
518
|
+
console.log(` ${(0, theme_1.dim)('No tasks found.')}\n`);
|
|
516
519
|
return;
|
|
517
520
|
}
|
|
518
|
-
console.log(
|
|
519
|
-
console.log(
|
|
521
|
+
console.log((0, theme_1.dim)(' ' + padRight('ID', 10) + padRight('Title', 36) + padRight('Column', 14) + padRight('Priority', 10) + padRight('Agent', 14) + 'Project'));
|
|
522
|
+
console.log((0, theme_1.dim)(' ' + 'β'.repeat(100)));
|
|
520
523
|
const co = ['backlog', 'in-progress', 'review', 'done'];
|
|
521
524
|
tasks.sort((a, b) => co.indexOf(a.column) - co.indexOf(b.column) || a.order - b.order);
|
|
522
525
|
for (const task of tasks) {
|
|
523
526
|
const cc = COL_COLORS[task.column] || chalk_1.default.white;
|
|
524
527
|
const pc = PRIORITY_COLORS[task.priority] || chalk_1.default.white;
|
|
525
528
|
const project = data.projects.find(p => p.id === task.projectId);
|
|
526
|
-
console.log(' ' +
|
|
529
|
+
console.log(' ' + (0, theme_1.dim)(padRight((0, data_1.shortId)(task.id), 10)) + padRight(task.title.substring(0, 34), 36) + cc(padRight(task.column, 14)) + pc(padRight(task.priority, 10)) + (0, theme_1.dim)(padRight(task.agent || 'β', 14)) + (0, theme_1.dim)((project === null || project === void 0 ? void 0 : project.name) || 'β'));
|
|
527
530
|
}
|
|
528
|
-
console.log(
|
|
531
|
+
console.log((0, theme_1.dim)(`\n Total: ${tasks.length} tasks\n`));
|
|
529
532
|
}
|
|
530
533
|
function taskMove(idPrefix, targetColumn) {
|
|
531
534
|
if (!idPrefix || !targetColumn) {
|
|
532
|
-
console.log(
|
|
535
|
+
console.log((0, box_1.renderResult)('error', 'Usage: cm task move <id> <column>'));
|
|
533
536
|
return;
|
|
534
537
|
}
|
|
535
538
|
const vc = ['backlog', 'in-progress', 'review', 'done'];
|
|
536
539
|
if (!vc.includes(targetColumn)) {
|
|
537
|
-
console.log(
|
|
540
|
+
console.log((0, box_1.renderResult)('error', `Invalid column: ${targetColumn}`, [(0, theme_1.dim)(`Valid: ${vc.join(', ')}`)]));
|
|
538
541
|
return;
|
|
539
542
|
}
|
|
540
543
|
const data = (0, data_1.loadData)();
|
|
541
544
|
const task = (0, data_1.findTaskByIdPrefix)(data, idPrefix);
|
|
542
545
|
if (!task) {
|
|
543
|
-
console.log(
|
|
546
|
+
console.log((0, box_1.renderResult)('error', `Task not found: ${idPrefix}`));
|
|
544
547
|
return;
|
|
545
548
|
}
|
|
546
549
|
const oldCol = task.column;
|
|
@@ -553,12 +556,11 @@ function taskMove(idPrefix, targetColumn) {
|
|
|
553
556
|
};
|
|
554
557
|
const allowed = VALID_TRANSITIONS[oldCol] || [];
|
|
555
558
|
if (oldCol !== targetColumn && !allowed.includes(targetColumn)) {
|
|
556
|
-
console.log(
|
|
557
|
-
console.log(chalk_1.default.gray(` Allowed transitions: ${allowed.join(', ')}`));
|
|
559
|
+
console.log((0, box_1.renderResult)('error', `Invalid transition: ${oldCol} β ${targetColumn}`, [(0, theme_1.dim)(`Allowed: ${allowed.join(', ')}`)]));
|
|
558
560
|
return;
|
|
559
561
|
}
|
|
560
562
|
if (oldCol === targetColumn) {
|
|
561
|
-
console.log(
|
|
563
|
+
console.log(` ${(0, theme_1.dim)(`Task already in ${targetColumn}.`)}`);
|
|
562
564
|
return;
|
|
563
565
|
}
|
|
564
566
|
task.column = targetColumn;
|
|
@@ -566,8 +568,9 @@ function taskMove(idPrefix, targetColumn) {
|
|
|
566
568
|
task.stuckSince = undefined;
|
|
567
569
|
(0, data_1.logActivity)(data, targetColumn === 'done' ? 'task_done' : 'task_transitioned', `Task "${task.title}" moved: ${oldCol} β ${targetColumn} (CLI)`, task.projectId, task.agent, { from: oldCol, to: targetColumn });
|
|
568
570
|
(0, data_1.saveData)(data);
|
|
569
|
-
console.log(
|
|
570
|
-
|
|
571
|
+
console.log((0, box_1.renderResult)('success', `Moved "${task.title}"`, [
|
|
572
|
+
`${(0, theme_1.dim)(oldCol)} ${(0, theme_1.brand)('β')} ${(COL_COLORS[targetColumn] || chalk_1.default.white)(targetColumn)}`,
|
|
573
|
+
]));
|
|
571
574
|
}
|
|
572
575
|
function taskStuck(opts) {
|
|
573
576
|
const data = (0, data_1.loadData)();
|
|
@@ -577,7 +580,7 @@ function taskStuck(opts) {
|
|
|
577
580
|
if (opts.project) {
|
|
578
581
|
const project = (0, data_1.findProjectByNameOrId)(data, opts.project);
|
|
579
582
|
if (!project) {
|
|
580
|
-
console.log(
|
|
583
|
+
console.log((0, box_1.renderResult)('error', `Project not found: ${opts.project}`));
|
|
581
584
|
return;
|
|
582
585
|
}
|
|
583
586
|
tasks = tasks.filter(t => t.projectId === project.id);
|
|
@@ -587,56 +590,56 @@ function taskStuck(opts) {
|
|
|
587
590
|
return elapsed > thresholdMin * 60 * 1000;
|
|
588
591
|
}).sort((a, b) => new Date(a.updatedAt).getTime() - new Date(b.updatedAt).getTime());
|
|
589
592
|
if (stuck.length === 0) {
|
|
590
|
-
console.log(
|
|
593
|
+
console.log((0, box_1.renderResult)('success', `No stuck tasks! All in-progress tasks updated within ${thresholdMin}m.`));
|
|
591
594
|
return;
|
|
592
595
|
}
|
|
593
|
-
console.log(
|
|
594
|
-
console.log(
|
|
595
|
-
console.log(
|
|
596
|
+
console.log((0, box_1.renderCommandHeader)(`${stuck.length} Stuck Tasks (>${thresholdMin}m in progress)`, 'β οΈ'));
|
|
597
|
+
console.log((0, theme_1.dim)(' ' + padRight('ID', 10) + padRight('Title', 36) + padRight('Stuck For', 12) + padRight('Agent', 14) + 'Priority'));
|
|
598
|
+
console.log((0, theme_1.dim)(' ' + 'β'.repeat(86)));
|
|
596
599
|
for (const task of stuck) {
|
|
597
600
|
const elapsed = now - new Date(task.updatedAt).getTime();
|
|
598
601
|
const minutes = Math.round(elapsed / 60000);
|
|
599
602
|
const timeStr = minutes < 60 ? `${minutes}m` : `${Math.floor(minutes / 60)}h ${minutes % 60}m`;
|
|
600
603
|
const project = data.projects.find(p => p.id === task.projectId);
|
|
601
604
|
const pc = PRIORITY_COLORS[task.priority] || chalk_1.default.white;
|
|
602
|
-
console.log(' ' +
|
|
605
|
+
console.log(' ' + (0, theme_1.dim)(padRight((0, data_1.shortId)(task.id), 10)) + padRight(task.title.substring(0, 34), 36) + (0, theme_1.warning)(padRight(timeStr, 12)) + (0, theme_1.dim)(padRight(task.agent || 'β', 14)) + pc(task.priority));
|
|
603
606
|
}
|
|
604
607
|
console.log();
|
|
605
|
-
console.log(
|
|
608
|
+
console.log((0, theme_1.dim)(' Tip: Move tasks with: cm task move <id> review|done|backlog'));
|
|
606
609
|
console.log();
|
|
607
610
|
}
|
|
608
611
|
function taskDone(idPrefix) {
|
|
609
612
|
if (!idPrefix) {
|
|
610
|
-
console.log(
|
|
613
|
+
console.log((0, box_1.renderResult)('error', 'Usage: cm task done <id>'));
|
|
611
614
|
return;
|
|
612
615
|
}
|
|
613
616
|
taskMove(idPrefix, 'done');
|
|
614
617
|
}
|
|
615
618
|
function taskRemove(idPrefix) {
|
|
616
619
|
if (!idPrefix) {
|
|
617
|
-
console.log(
|
|
620
|
+
console.log((0, box_1.renderResult)('error', 'Usage: cm task rm <id>'));
|
|
618
621
|
return;
|
|
619
622
|
}
|
|
620
623
|
const data = (0, data_1.loadData)();
|
|
621
624
|
const idx = data.tasks.findIndex(t => t.id === idPrefix || t.id.startsWith(idPrefix));
|
|
622
625
|
if (idx === -1) {
|
|
623
|
-
console.log(
|
|
626
|
+
console.log((0, box_1.renderResult)('error', `Task not found: ${idPrefix}`));
|
|
624
627
|
return;
|
|
625
628
|
}
|
|
626
629
|
const [removed] = data.tasks.splice(idx, 1);
|
|
627
630
|
(0, data_1.logActivity)(data, 'task_deleted', `Task "${removed.title}" deleted via CLI`, removed.projectId, removed.agent);
|
|
628
631
|
(0, data_1.saveData)(data);
|
|
629
|
-
console.log(
|
|
632
|
+
console.log((0, box_1.renderResult)('success', `Deleted: "${removed.title}" (${(0, data_1.shortId)(removed.id)})`));
|
|
630
633
|
}
|
|
631
634
|
function taskDispatch(idPrefix, opts) {
|
|
632
635
|
if (!idPrefix) {
|
|
633
|
-
console.log(
|
|
636
|
+
console.log((0, box_1.renderResult)('error', 'Usage: cm task dispatch <id> [--force]'));
|
|
634
637
|
return;
|
|
635
638
|
}
|
|
636
639
|
const data = (0, data_1.loadData)();
|
|
637
640
|
const task = (0, data_1.findTaskByIdPrefix)(data, idPrefix);
|
|
638
641
|
if (!task) {
|
|
639
|
-
console.log(
|
|
642
|
+
console.log((0, box_1.renderResult)('error', `Task not found: ${idPrefix}`));
|
|
640
643
|
return;
|
|
641
644
|
}
|
|
642
645
|
const project = data.projects.find(p => p.id === task.projectId);
|
|
@@ -650,20 +653,21 @@ function taskDispatch(idPrefix, opts) {
|
|
|
650
653
|
taskId: task.id, filePath: result.filePath, force: opts.force || false,
|
|
651
654
|
});
|
|
652
655
|
(0, data_1.saveData)(data);
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
+
const details = [
|
|
657
|
+
`${(0, theme_1.dim)('Task:')} ${(0, theme_1.brand)(task.title)}`,
|
|
658
|
+
`${(0, theme_1.dim)('Agent:')} ${(0, theme_1.brand)(task.agent)}`,
|
|
659
|
+
];
|
|
656
660
|
if (task.skill)
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
console.log();
|
|
661
|
+
details.push(`${(0, theme_1.dim)('Skill:')} ${(0, theme_1.brand)(task.skill)}`);
|
|
662
|
+
details.push(`${(0, theme_1.dim)('File:')} ${(0, theme_1.brand)(result.filePath)}`);
|
|
663
|
+
console.log((0, box_1.renderResult)('success', `Task dispatched to ${task.agent}!`, details));
|
|
660
664
|
}
|
|
661
665
|
else {
|
|
662
666
|
task.dispatchStatus = 'failed';
|
|
663
667
|
task.dispatchError = result.error;
|
|
664
668
|
task.updatedAt = new Date().toISOString();
|
|
665
669
|
(0, data_1.saveData)(data);
|
|
666
|
-
console.log(
|
|
670
|
+
console.log((0, box_1.renderResult)('error', `Dispatch failed: ${result.error}`));
|
|
667
671
|
}
|
|
668
672
|
}
|
|
669
673
|
// βββ Project Command ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
@@ -685,14 +689,12 @@ program
|
|
|
685
689
|
case 'delete':
|
|
686
690
|
projectRemove(args[0]);
|
|
687
691
|
break;
|
|
688
|
-
default:
|
|
689
|
-
console.log(chalk_1.default.red(`Unknown: ${cmd}`));
|
|
690
|
-
console.log(chalk_1.default.gray('Available: add, list, rm'));
|
|
692
|
+
default: console.log((0, box_1.renderResult)('error', `Unknown: ${cmd}`, [(0, theme_1.dim)('Available: add, list, rm')]));
|
|
691
693
|
}
|
|
692
694
|
});
|
|
693
695
|
function projectAdd(name, opts) {
|
|
694
696
|
if (!name) {
|
|
695
|
-
console.log(
|
|
697
|
+
console.log((0, box_1.renderResult)('error', 'Usage: cm project add "my-project"'));
|
|
696
698
|
return;
|
|
697
699
|
}
|
|
698
700
|
const data = (0, data_1.loadData)();
|
|
@@ -700,35 +702,36 @@ function projectAdd(name, opts) {
|
|
|
700
702
|
data.projects.push(project);
|
|
701
703
|
(0, data_1.logActivity)(data, 'project_created', `Project "${project.name}" created via CLI`, project.id);
|
|
702
704
|
(0, data_1.saveData)(data);
|
|
703
|
-
console.log(
|
|
704
|
-
|
|
705
|
+
console.log((0, box_1.renderResult)('success', `Project created: ${name}`, [
|
|
706
|
+
`${(0, theme_1.dim)('ID:')} ${(0, theme_1.brand)((0, data_1.shortId)(project.id))} ${(0, theme_1.dim)('|')} ${(0, theme_1.dim)('Path:')} ${(0, theme_1.brand)(project.path)}`,
|
|
707
|
+
]));
|
|
705
708
|
}
|
|
706
709
|
function projectList() {
|
|
707
710
|
const data = (0, data_1.loadData)();
|
|
708
711
|
if (data.projects.length === 0) {
|
|
709
|
-
console.log(
|
|
712
|
+
console.log(`\n ${(0, theme_1.dim)('No projects.')}\n`);
|
|
710
713
|
return;
|
|
711
714
|
}
|
|
712
|
-
console.log(
|
|
713
|
-
console.log(
|
|
714
|
-
console.log(
|
|
715
|
+
console.log((0, box_1.renderCommandHeader)('Projects', 'π¦'));
|
|
716
|
+
console.log((0, theme_1.dim)(' ' + padRight('ID', 10) + padRight('Name', 24) + padRight('Tasks', 8) + padRight('Agents', 20) + 'Path'));
|
|
717
|
+
console.log((0, theme_1.dim)(' ' + 'β'.repeat(90)));
|
|
715
718
|
for (const project of data.projects) {
|
|
716
719
|
const pt = data.tasks.filter(t => t.projectId === project.id);
|
|
717
720
|
const agents = [...new Set(pt.map(t => t.agent).filter(Boolean))];
|
|
718
721
|
const done = pt.filter(t => t.column === 'done').length;
|
|
719
|
-
console.log(' ' +
|
|
722
|
+
console.log(' ' + (0, theme_1.dim)(padRight((0, data_1.shortId)(project.id), 10)) + (0, theme_1.brand)(padRight(project.name, 24)) + (0, theme_1.dim)(padRight(`${done}/${pt.length}`, 8)) + (0, theme_1.dim)(padRight(agents.join(', ') || 'β', 20)) + (0, theme_1.dim)(project.path || 'β'));
|
|
720
723
|
}
|
|
721
724
|
console.log();
|
|
722
725
|
}
|
|
723
726
|
function projectRemove(query) {
|
|
724
727
|
if (!query) {
|
|
725
|
-
console.log(
|
|
728
|
+
console.log((0, box_1.renderResult)('error', 'Usage: cm project rm <name-or-id>'));
|
|
726
729
|
return;
|
|
727
730
|
}
|
|
728
731
|
const data = (0, data_1.loadData)();
|
|
729
732
|
const project = (0, data_1.findProjectByNameOrId)(data, query);
|
|
730
733
|
if (!project) {
|
|
731
|
-
console.log(
|
|
734
|
+
console.log((0, box_1.renderResult)('error', `Project not found: ${query}`));
|
|
732
735
|
return;
|
|
733
736
|
}
|
|
734
737
|
const tc = data.tasks.filter(t => t.projectId === project.id).length;
|
|
@@ -736,7 +739,7 @@ function projectRemove(query) {
|
|
|
736
739
|
data.tasks = data.tasks.filter(t => t.projectId !== project.id);
|
|
737
740
|
(0, data_1.logActivity)(data, 'project_deleted', `Project "${project.name}" deleted via CLI`, project.id);
|
|
738
741
|
(0, data_1.saveData)(data);
|
|
739
|
-
console.log(
|
|
742
|
+
console.log((0, box_1.renderResult)('success', `Deleted project "${project.name}" and ${tc} tasks.`));
|
|
740
743
|
}
|
|
741
744
|
// βββ Deploy Command βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
742
745
|
program
|
|
@@ -761,9 +764,7 @@ program
|
|
|
761
764
|
case 'ls':
|
|
762
765
|
deployList(opts);
|
|
763
766
|
break;
|
|
764
|
-
default:
|
|
765
|
-
console.log(chalk_1.default.red(`Unknown: ${cmd}`));
|
|
766
|
-
console.log(chalk_1.default.gray('Available: staging, production, list'));
|
|
767
|
+
default: console.log((0, box_1.renderResult)('error', `Unknown: ${cmd}`, [(0, theme_1.dim)('Available: staging, production, list')]));
|
|
767
768
|
}
|
|
768
769
|
});
|
|
769
770
|
function deployRecord(env, opts) {
|
|
@@ -772,7 +773,7 @@ function deployRecord(env, opts) {
|
|
|
772
773
|
if (opts.project) {
|
|
773
774
|
const p = (0, data_1.findProjectByNameOrId)(data, opts.project);
|
|
774
775
|
if (!p) {
|
|
775
|
-
console.log(
|
|
776
|
+
console.log((0, box_1.renderResult)('error', `Project not found: ${opts.project}`));
|
|
776
777
|
return;
|
|
777
778
|
}
|
|
778
779
|
projectId = p.id;
|
|
@@ -781,7 +782,7 @@ function deployRecord(env, opts) {
|
|
|
781
782
|
projectId = data.projects[0].id;
|
|
782
783
|
}
|
|
783
784
|
else {
|
|
784
|
-
console.log(
|
|
785
|
+
console.log((0, box_1.renderResult)('error', 'No projects. Create one first: cm project add "my-project"'));
|
|
785
786
|
return;
|
|
786
787
|
}
|
|
787
788
|
const now = new Date().toISOString();
|
|
@@ -794,17 +795,18 @@ function deployRecord(env, opts) {
|
|
|
794
795
|
data.deployments.unshift(dep);
|
|
795
796
|
(0, data_1.logActivity)(data, env === 'staging' ? 'deploy_staging' : 'deploy_production', `Deployed to ${env}: ${dep.message}`, projectId, opts.agent || '', { deploymentId: dep.id });
|
|
796
797
|
(0, data_1.saveData)(data);
|
|
797
|
-
const envColor = env === 'production' ?
|
|
798
|
+
const envColor = env === 'production' ? theme_1.success : theme_1.warning;
|
|
798
799
|
const project = data.projects.find(p => p.id === projectId);
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
800
|
+
const details = [
|
|
801
|
+
`${(0, theme_1.dim)('ID:')} ${(0, theme_1.brand)((0, data_1.shortId)(dep.id))}`,
|
|
802
|
+
`${(0, theme_1.dim)('Env:')} ${envColor(env)}`,
|
|
803
|
+
`${(0, theme_1.dim)('Project:')} ${(0, theme_1.brand)((project === null || project === void 0 ? void 0 : project.name) || 'β')}`,
|
|
804
|
+
`${(0, theme_1.dim)('Message:')} ${dep.message}`,
|
|
805
|
+
];
|
|
804
806
|
if (dep.commit)
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
console.log();
|
|
807
|
+
details.push(`${(0, theme_1.dim)('Commit:')} ${(0, theme_1.brand)(dep.commit)}`);
|
|
808
|
+
details.push(`${(0, theme_1.dim)('Branch:')} ${(0, theme_1.brand)(dep.branch)}`);
|
|
809
|
+
console.log((0, box_1.renderResult)('success', 'Deployment recorded!', details));
|
|
808
810
|
}
|
|
809
811
|
function deployList(opts) {
|
|
810
812
|
const data = (0, data_1.loadData)();
|
|
@@ -812,26 +814,26 @@ function deployList(opts) {
|
|
|
812
814
|
if (opts.project) {
|
|
813
815
|
const p = (0, data_1.findProjectByNameOrId)(data, opts.project);
|
|
814
816
|
if (!p) {
|
|
815
|
-
console.log(
|
|
817
|
+
console.log((0, box_1.renderResult)('error', `Project not found: ${opts.project}`));
|
|
816
818
|
return;
|
|
817
819
|
}
|
|
818
820
|
deps = deps.filter(d => d.projectId === p.id);
|
|
819
821
|
}
|
|
820
822
|
if (deps.length === 0) {
|
|
821
|
-
console.log(
|
|
823
|
+
console.log(`\n ${(0, theme_1.dim)('No deployments yet.')}\n`);
|
|
822
824
|
return;
|
|
823
825
|
}
|
|
824
|
-
console.log(
|
|
825
|
-
console.log(
|
|
826
|
-
console.log(
|
|
826
|
+
console.log((0, box_1.renderCommandHeader)('Deployment History', 'π'));
|
|
827
|
+
console.log((0, theme_1.dim)(' ' + padRight('ID', 10) + padRight('Env', 12) + padRight('Status', 14) + padRight('Message', 32) + padRight('Branch', 12) + 'Time'));
|
|
828
|
+
console.log((0, theme_1.dim)(' ' + 'β'.repeat(100)));
|
|
827
829
|
for (const dep of deps.slice(0, 20)) {
|
|
828
830
|
const sc = STATUS_COLORS[dep.status] || chalk_1.default.white;
|
|
829
|
-
const ec = dep.env === 'production' ?
|
|
831
|
+
const ec = dep.env === 'production' ? theme_1.success : theme_1.warning;
|
|
830
832
|
const timeAgo = formatTimeAgoCli(dep.startedAt);
|
|
831
833
|
const rollbackFlag = dep.rollbackOf ? ' βͺ' : '';
|
|
832
|
-
console.log(' ' +
|
|
834
|
+
console.log(' ' + (0, theme_1.dim)(padRight((0, data_1.shortId)(dep.id), 10)) + ec(padRight(dep.env, 12)) + sc(padRight(dep.status.replace('_', ' ') + rollbackFlag, 14)) + padRight(dep.message.substring(0, 30), 32) + (0, theme_1.dim)(padRight(dep.branch || 'β', 12)) + (0, theme_1.dim)(timeAgo));
|
|
833
835
|
}
|
|
834
|
-
console.log(
|
|
836
|
+
console.log((0, theme_1.dim)(`\n Total: ${deps.length} deployments\n`));
|
|
835
837
|
}
|
|
836
838
|
// βββ Rollback Command βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
837
839
|
program
|
|
@@ -843,11 +845,11 @@ program
|
|
|
843
845
|
const data = (0, data_1.loadData)();
|
|
844
846
|
const dep = data.deployments.find(d => d.id === deployId || d.id.startsWith(deployId));
|
|
845
847
|
if (!dep) {
|
|
846
|
-
console.log(
|
|
848
|
+
console.log((0, box_1.renderResult)('error', `Deployment not found: ${deployId}`));
|
|
847
849
|
return;
|
|
848
850
|
}
|
|
849
851
|
if (dep.status === 'rolled_back') {
|
|
850
|
-
console.log(
|
|
852
|
+
console.log((0, box_1.renderResult)('warning', 'Already rolled back.'));
|
|
851
853
|
return;
|
|
852
854
|
}
|
|
853
855
|
dep.status = 'rolled_back';
|
|
@@ -860,10 +862,11 @@ program
|
|
|
860
862
|
data.deployments.unshift(rollback);
|
|
861
863
|
(0, data_1.logActivity)(data, 'rollback', `Rolled back ${dep.env} deploy: ${dep.message}`, dep.projectId, opts.agent || '', { originalDeployId: dep.id, rollbackId: rollback.id });
|
|
862
864
|
(0, data_1.saveData)(data);
|
|
863
|
-
console.log(
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
865
|
+
console.log((0, box_1.renderResult)('success', 'Rollback complete!', [
|
|
866
|
+
`${(0, theme_1.dim)('Original:')} ${(0, theme_1.brand)((0, data_1.shortId)(dep.id))} ${(0, theme_1.dim)(`(${dep.env})`)}`,
|
|
867
|
+
`${(0, theme_1.dim)('Rollback ID:')} ${(0, theme_1.brand)((0, data_1.shortId)(rollback.id))}`,
|
|
868
|
+
`${(0, theme_1.dim)('Status:')} ${dep.message} β rolled back`,
|
|
869
|
+
]));
|
|
867
870
|
});
|
|
868
871
|
// βββ History Command ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
869
872
|
program
|
|
@@ -878,7 +881,7 @@ program
|
|
|
878
881
|
if (opts.project) {
|
|
879
882
|
const p = (0, data_1.findProjectByNameOrId)(data, opts.project);
|
|
880
883
|
if (!p) {
|
|
881
|
-
console.log(
|
|
884
|
+
console.log((0, box_1.renderResult)('error', `Project not found: ${opts.project}`));
|
|
882
885
|
return;
|
|
883
886
|
}
|
|
884
887
|
acts = acts.filter(a => a.projectId === p.id);
|
|
@@ -886,23 +889,23 @@ program
|
|
|
886
889
|
const limit = parseInt(opts.limit) || 20;
|
|
887
890
|
acts = acts.slice(0, limit);
|
|
888
891
|
if (acts.length === 0) {
|
|
889
|
-
console.log(
|
|
892
|
+
console.log(`\n ${(0, theme_1.dim)('No activity yet.')}\n`);
|
|
890
893
|
return;
|
|
891
894
|
}
|
|
892
|
-
const
|
|
895
|
+
const ACT_ICONS = {
|
|
893
896
|
'task_created': 'β¨', 'task_moved': 'βοΈ', 'task_done': 'β
', 'task_deleted': 'ποΈ', 'task_updated': 'βοΈ',
|
|
894
897
|
'project_created': 'π¦', 'project_deleted': 'ποΈ',
|
|
895
898
|
'deploy_staging': 'π‘', 'deploy_production': 'π', 'deploy_failed': 'β', 'rollback': 'βͺ',
|
|
896
899
|
'git_push': 'π€', 'changelog_added': 'π',
|
|
897
900
|
};
|
|
898
|
-
console.log(
|
|
901
|
+
console.log((0, box_1.renderCommandHeader)(`Activity History (latest ${acts.length})`, 'π'));
|
|
899
902
|
for (const a of acts) {
|
|
900
|
-
const icon =
|
|
903
|
+
const icon = ACT_ICONS[a.type] || 'π';
|
|
901
904
|
const proj = data.projects.find(p => p.id === a.projectId);
|
|
902
|
-
const projTag = proj ?
|
|
903
|
-
const agentTag = a.agent ?
|
|
905
|
+
const projTag = proj ? (0, theme_1.dim)(` [${proj.name}]`) : '';
|
|
906
|
+
const agentTag = a.agent ? (0, theme_1.dim)(` @${a.agent}`) : '';
|
|
904
907
|
const time = formatTimeAgoCli(a.createdAt);
|
|
905
|
-
console.log(` ${icon} ${a.message}${projTag}${agentTag} ${
|
|
908
|
+
console.log(` ${icon} ${a.message}${projTag}${agentTag} ${(0, theme_1.dim)(`β ${time}`)}`);
|
|
906
909
|
}
|
|
907
910
|
console.log();
|
|
908
911
|
});
|
|
@@ -922,14 +925,12 @@ program
|
|
|
922
925
|
case 'ls':
|
|
923
926
|
changelogList(opts);
|
|
924
927
|
break;
|
|
925
|
-
default:
|
|
926
|
-
console.log(chalk_1.default.red(`Unknown: ${cmd}`));
|
|
927
|
-
console.log(chalk_1.default.gray('Available: add, list'));
|
|
928
|
+
default: console.log((0, box_1.renderResult)('error', `Unknown: ${cmd}`, [(0, theme_1.dim)('Available: add, list')]));
|
|
928
929
|
}
|
|
929
930
|
});
|
|
930
931
|
function changelogAdd(args, opts) {
|
|
931
932
|
if (args.length < 2) {
|
|
932
|
-
console.log(
|
|
933
|
+
console.log((0, box_1.renderResult)('error', 'Usage: cm changelog add <version> "<title>" [changes...]'));
|
|
933
934
|
return;
|
|
934
935
|
}
|
|
935
936
|
const data = (0, data_1.loadData)();
|
|
@@ -937,7 +938,7 @@ function changelogAdd(args, opts) {
|
|
|
937
938
|
if (opts.project) {
|
|
938
939
|
const p = (0, data_1.findProjectByNameOrId)(data, opts.project);
|
|
939
940
|
if (!p) {
|
|
940
|
-
console.log(
|
|
941
|
+
console.log((0, box_1.renderResult)('error', `Project not found: ${opts.project}`));
|
|
941
942
|
return;
|
|
942
943
|
}
|
|
943
944
|
projectId = p.id;
|
|
@@ -955,13 +956,11 @@ function changelogAdd(args, opts) {
|
|
|
955
956
|
data.changelog.unshift(entry);
|
|
956
957
|
(0, data_1.logActivity)(data, 'changelog_added', `Changelog ${version}: ${title}`, projectId, opts.agent || '');
|
|
957
958
|
(0, data_1.saveData)(data);
|
|
958
|
-
|
|
959
|
-
console.log(chalk_1.default.gray(` Version: ${version}`));
|
|
960
|
-
console.log(chalk_1.default.gray(` Title: ${title}`));
|
|
959
|
+
const details = [`${(0, theme_1.dim)('Version:')} ${(0, theme_1.brand)(version)}`, `${(0, theme_1.dim)('Title:')} ${title}`];
|
|
961
960
|
if (changes.length > 0) {
|
|
962
|
-
changes.forEach(c =>
|
|
961
|
+
changes.forEach(c => details.push(`${(0, theme_1.dim)('β’')} ${c}`));
|
|
963
962
|
}
|
|
964
|
-
console.log();
|
|
963
|
+
console.log((0, box_1.renderResult)('success', 'Changelog entry added!', details));
|
|
965
964
|
}
|
|
966
965
|
function changelogList(opts) {
|
|
967
966
|
const data = (0, data_1.loadData)();
|
|
@@ -969,21 +968,21 @@ function changelogList(opts) {
|
|
|
969
968
|
if (opts.project) {
|
|
970
969
|
const p = (0, data_1.findProjectByNameOrId)(data, opts.project);
|
|
971
970
|
if (!p) {
|
|
972
|
-
console.log(
|
|
971
|
+
console.log((0, box_1.renderResult)('error', `Project not found: ${opts.project}`));
|
|
973
972
|
return;
|
|
974
973
|
}
|
|
975
974
|
entries = entries.filter(c => c.projectId === p.id);
|
|
976
975
|
}
|
|
977
976
|
if (entries.length === 0) {
|
|
978
|
-
console.log(
|
|
977
|
+
console.log(`\n ${(0, theme_1.dim)('No changelog entries.')}\n`);
|
|
979
978
|
return;
|
|
980
979
|
}
|
|
981
|
-
console.log(
|
|
980
|
+
console.log((0, box_1.renderCommandHeader)('Changelog', 'π'));
|
|
982
981
|
for (const entry of entries) {
|
|
983
982
|
const proj = data.projects.find(p => p.id === entry.projectId);
|
|
984
|
-
console.log(
|
|
983
|
+
console.log((0, theme_1.brand)(` ${entry.version}`) + ` β ${entry.title}` + (0, theme_1.dim)(` (${formatTimeAgoCli(entry.createdAt)})${proj ? ' [' + proj.name + ']' : ''}`));
|
|
985
984
|
if (entry.changes.length > 0) {
|
|
986
|
-
entry.changes.forEach(c => console.log(
|
|
985
|
+
entry.changes.forEach(c => console.log((0, theme_1.dim)(` β’ ${c}`)));
|
|
987
986
|
}
|
|
988
987
|
}
|
|
989
988
|
console.log();
|
|
@@ -996,32 +995,32 @@ program
|
|
|
996
995
|
.action(() => {
|
|
997
996
|
const data = (0, data_1.loadData)();
|
|
998
997
|
showBanner();
|
|
999
|
-
console.log(
|
|
998
|
+
console.log((0, box_1.renderCommandHeader)('Status Overview', 'π'));
|
|
1000
999
|
// Projects
|
|
1001
|
-
console.log(
|
|
1000
|
+
console.log((0, theme_1.brand)(` Projects: ${data.projects.length}`));
|
|
1002
1001
|
for (const p of data.projects) {
|
|
1003
1002
|
const pt = data.tasks.filter(t => t.projectId === p.id);
|
|
1004
1003
|
const done = pt.filter(t => t.column === 'done').length;
|
|
1005
1004
|
const pct = pt.length > 0 ? Math.round((done / pt.length) * 100) : 0;
|
|
1006
|
-
console.log(
|
|
1005
|
+
console.log((0, theme_1.dim)(` π¦ ${padRight(p.name, 20)} ${progressBar(pct)} ${done}/${pt.length} (${pct}%)`));
|
|
1007
1006
|
}
|
|
1008
1007
|
// Tasks
|
|
1009
1008
|
const total = data.tasks.length;
|
|
1010
1009
|
const byCol = { backlog: 0, 'in-progress': 0, review: 0, done: 0 };
|
|
1011
1010
|
data.tasks.forEach(t => { byCol[t.column] = (byCol[t.column] || 0) + 1; });
|
|
1012
1011
|
console.log();
|
|
1013
|
-
console.log(
|
|
1014
|
-
console.log(
|
|
1015
|
-
console.log(
|
|
1016
|
-
console.log(
|
|
1017
|
-
console.log(
|
|
1012
|
+
console.log((0, theme_1.brand)(` Tasks: ${total}`));
|
|
1013
|
+
console.log((0, theme_1.dim)(` βͺ Backlog: ${byCol.backlog}`));
|
|
1014
|
+
console.log((0, theme_1.info)(` π’ In Progress: ${byCol['in-progress']}`));
|
|
1015
|
+
console.log((0, theme_1.warning)(` π‘ Review: ${byCol.review}`));
|
|
1016
|
+
console.log((0, theme_1.success)(` π’ Done: ${byCol.done}`));
|
|
1018
1017
|
// Deploys
|
|
1019
1018
|
if (data.deployments.length > 0) {
|
|
1020
1019
|
console.log();
|
|
1021
|
-
console.log(
|
|
1020
|
+
console.log((0, theme_1.brand)(` Deployments: ${data.deployments.length}`));
|
|
1022
1021
|
const latest = data.deployments[0];
|
|
1023
1022
|
const sc = STATUS_COLORS[latest.status] || chalk_1.default.white;
|
|
1024
|
-
console.log(
|
|
1023
|
+
console.log((0, theme_1.dim)(` Latest: ${latest.env} β ${sc(latest.status)} β ${latest.message} (${formatTimeAgoCli(latest.startedAt)})`));
|
|
1025
1024
|
}
|
|
1026
1025
|
// Agents
|
|
1027
1026
|
const agentCounts = {};
|
|
@@ -1030,18 +1029,18 @@ program
|
|
|
1030
1029
|
const agentNames = Object.keys(agentCounts);
|
|
1031
1030
|
if (agentNames.length > 0) {
|
|
1032
1031
|
console.log();
|
|
1033
|
-
console.log(
|
|
1032
|
+
console.log((0, theme_1.brand)(` Active Agents: ${agentNames.length}`));
|
|
1034
1033
|
for (const agent of agentNames.sort()) {
|
|
1035
|
-
console.log(
|
|
1034
|
+
console.log((0, theme_1.dim)(` π€ ${padRight(agent, 16)} ${agentCounts[agent]} tasks`));
|
|
1036
1035
|
}
|
|
1037
1036
|
}
|
|
1038
1037
|
// Dashboard
|
|
1039
1038
|
console.log();
|
|
1040
1039
|
if (isDashboardRunning()) {
|
|
1041
|
-
console.log(
|
|
1040
|
+
console.log((0, theme_1.success)(` π Dashboard: RUNNING at http://codymaster.localhost:${data_1.DEFAULT_PORT}`));
|
|
1042
1041
|
}
|
|
1043
1042
|
else {
|
|
1044
|
-
console.log(
|
|
1043
|
+
console.log((0, theme_1.dim)(` β« Dashboard: not running (start with: cm dashboard)`));
|
|
1045
1044
|
}
|
|
1046
1045
|
console.log();
|
|
1047
1046
|
});
|
|
@@ -1069,29 +1068,31 @@ program
|
|
|
1069
1068
|
.description('Install an agent skill')
|
|
1070
1069
|
.option('-p, --platform <platform>', 'Target platform (gemini|claude|cursor|windsurf|cline)')
|
|
1071
1070
|
.action((skill, opts) => __awaiter(void 0, void 0, void 0, function* () {
|
|
1072
|
-
console.log(
|
|
1071
|
+
console.log((0, theme_1.brand)(` Installing skill: ${skill}...`));
|
|
1073
1072
|
if (!opts.platform) {
|
|
1074
|
-
const
|
|
1075
|
-
const
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
{
|
|
1079
|
-
{
|
|
1080
|
-
{
|
|
1081
|
-
{
|
|
1082
|
-
{
|
|
1083
|
-
]
|
|
1073
|
+
const p = yield Promise.resolve().then(() => __importStar(require('@clack/prompts')));
|
|
1074
|
+
const platform = yield p.select({
|
|
1075
|
+
message: 'Which platform?',
|
|
1076
|
+
options: [
|
|
1077
|
+
{ label: 'π’ Google Antigravity', value: 'gemini' },
|
|
1078
|
+
{ label: 'π£ Claude Code', value: 'claude' },
|
|
1079
|
+
{ label: 'π΅ Cursor', value: 'cursor' },
|
|
1080
|
+
{ label: 'π Windsurf', value: 'windsurf' },
|
|
1081
|
+
{ label: 'π€ Cline / RooCode', value: 'cline' },
|
|
1082
|
+
],
|
|
1084
1083
|
});
|
|
1085
|
-
|
|
1084
|
+
if (p.isCancel(platform))
|
|
1085
|
+
return;
|
|
1086
|
+
opts.platform = platform;
|
|
1086
1087
|
}
|
|
1087
|
-
console.log(
|
|
1088
|
+
console.log((0, box_1.renderResult)('success', `Skill '${skill}' installed for ${opts.platform}!`));
|
|
1088
1089
|
}));
|
|
1089
1090
|
// βββ Add Command (npx codymaster add --skill cm-debugging) βββββββββββββββββββ
|
|
1090
1091
|
const ALL_SKILLS = [
|
|
1091
1092
|
// Engineering
|
|
1092
1093
|
'cm-tdd', 'cm-debugging', 'cm-quality-gate', 'cm-test-gate', 'cm-code-review',
|
|
1093
1094
|
// Operations
|
|
1094
|
-
'cm-safe-deploy', 'cm-identity-guard', 'cm-git-worktrees', 'cm-terminal', 'cm-secret-shield', 'cm-safe-i18n',
|
|
1095
|
+
'cm-safe-deploy', 'cm-identity-guard', 'cm-git-worktrees', 'cm-terminal', 'cm-secret-shield', 'cm-security-gate', 'cm-safe-i18n',
|
|
1095
1096
|
// Product
|
|
1096
1097
|
'cm-planning', 'cm-ux-master', 'cm-ui-preview', 'cm-brainstorm-idea', 'cm-jtbd', 'cm-dockit', 'cm-project-bootstrap', 'cm-readit',
|
|
1097
1098
|
// Growth
|
|
@@ -1162,12 +1163,11 @@ function doAddSkills(skills, platform) {
|
|
|
1162
1163
|
console.log();
|
|
1163
1164
|
const { execFileSync } = require('child_process');
|
|
1164
1165
|
if (platform === 'claude') {
|
|
1165
|
-
console.log(
|
|
1166
|
-
console.log(
|
|
1167
|
-
// Step 1: Register marketplace
|
|
1168
|
-
console.log(
|
|
1166
|
+
console.log((0, theme_1.brand)('π£ Claude Code β Installing via plugin system'));
|
|
1167
|
+
console.log((0, theme_1.dim)(' (Claude installs all 34 skills as one bundle)\n'));
|
|
1168
|
+
// Step 1: Register marketplace
|
|
1169
|
+
console.log((0, theme_1.dim)(' $ claude plugin marketplace add tody-agent/codymaster'));
|
|
1169
1170
|
try {
|
|
1170
|
-
// Use 'pipe' so we can inspect output on failure; print stdout ourselves
|
|
1171
1171
|
const r1 = require('child_process').spawnSync('claude', ['plugin', 'marketplace', 'add', 'tody-agent/codymaster'], { encoding: 'utf8' });
|
|
1172
1172
|
if (r1.stdout)
|
|
1173
1173
|
process.stdout.write(r1.stdout);
|
|
@@ -1175,27 +1175,27 @@ function doAddSkills(skills, platform) {
|
|
|
1175
1175
|
process.stderr.write(r1.stderr);
|
|
1176
1176
|
const combined = String(r1.stdout || '') + String(r1.stderr || '');
|
|
1177
1177
|
if (r1.status !== 0 && !combined.includes('already installed') && !combined.includes('already exists')) {
|
|
1178
|
-
console.log(
|
|
1178
|
+
console.log((0, box_1.renderResult)('warning', 'Marketplace warning β continuing anyway'));
|
|
1179
1179
|
}
|
|
1180
1180
|
else if (combined.includes('already installed') || combined.includes('already exists')) {
|
|
1181
|
-
console.log(
|
|
1181
|
+
console.log((0, theme_1.dim)(' βΉοΈ Marketplace already registered'));
|
|
1182
1182
|
}
|
|
1183
1183
|
}
|
|
1184
1184
|
catch (_a) {
|
|
1185
|
-
console.log(
|
|
1185
|
+
console.log((0, box_1.renderResult)('warning', 'Could not reach marketplace β continuing'));
|
|
1186
1186
|
}
|
|
1187
1187
|
// Step 2: Install / update the plugin
|
|
1188
|
-
console.log(
|
|
1188
|
+
console.log((0, theme_1.dim)(' $ claude plugin install codymaster@codymaster'));
|
|
1189
1189
|
try {
|
|
1190
1190
|
execFileSync('claude', ['plugin', 'install', 'codymaster@codymaster'], { stdio: 'inherit' });
|
|
1191
|
-
console.log(
|
|
1191
|
+
console.log((0, box_1.renderResult)('success', 'All 34 skills installed!'));
|
|
1192
1192
|
yield postInstallOnboarding('claude');
|
|
1193
1193
|
}
|
|
1194
1194
|
catch (_b) {
|
|
1195
|
-
console.log(
|
|
1196
|
-
console.log(
|
|
1197
|
-
console.log(
|
|
1198
|
-
console.log(
|
|
1195
|
+
console.log((0, box_1.renderResult)('warning', 'Plugin install failed. Run manually:'));
|
|
1196
|
+
console.log((0, theme_1.brand)(' claude plugin install codymaster@codymaster'));
|
|
1197
|
+
console.log((0, theme_1.dim)('\n Or one-liner:'));
|
|
1198
|
+
console.log((0, theme_1.brand)(' bash <(curl -fsSL https://raw.githubusercontent.com/tody-agent/codymaster/main/install.sh) --claude'));
|
|
1199
1199
|
}
|
|
1200
1200
|
return;
|
|
1201
1201
|
}
|
|
@@ -1203,8 +1203,7 @@ function doAddSkills(skills, platform) {
|
|
|
1203
1203
|
// Gemini now falls through to the standard file-cloning logic below.
|
|
1204
1204
|
const target = PLATFORM_TARGETS[platform];
|
|
1205
1205
|
if (!target) {
|
|
1206
|
-
console.log(
|
|
1207
|
-
console.log(chalk_1.default.gray(` Supported: claude, gemini, cursor, windsurf, cline, opencode, kiro, copilot`));
|
|
1206
|
+
console.log((0, box_1.renderResult)('error', `Unknown platform: ${platform}`, [(0, theme_1.dim)('Supported: claude, gemini, cursor, windsurf, cline, opencode, kiro, copilot')]));
|
|
1208
1207
|
return;
|
|
1209
1208
|
}
|
|
1210
1209
|
if (platform === 'copilot') {
|
|
@@ -1216,15 +1215,14 @@ function doAddSkills(skills, platform) {
|
|
|
1216
1215
|
if (!existing.includes('Cody Master Skills')) {
|
|
1217
1216
|
fs_1.default.appendFileSync(instrFile, header + lines + '\n');
|
|
1218
1217
|
}
|
|
1219
|
-
console.log(
|
|
1220
|
-
console.log(chalk_1.default.gray(' GitHub Copilot will use these as context automatically.'));
|
|
1218
|
+
console.log((0, box_1.renderResult)('success', `${skills.length} skills referenced in ${instrFile}`, [(0, theme_1.dim)('GitHub Copilot will use these as context automatically.')]));
|
|
1221
1219
|
return;
|
|
1222
1220
|
}
|
|
1223
1221
|
const icons = { cursor: 'π΅', windsurf: 'π ', cline: 'β«', opencode: 'π¦', kiro: 'πΆ' };
|
|
1224
1222
|
const icon = icons[platform] || 'π¦';
|
|
1225
1223
|
const label = skills.length === ALL_SKILLS.length ? 'all 34 skills' : skills.join(', ');
|
|
1226
|
-
console.log(`${icon} ${platform} β Installing ${label}`);
|
|
1227
|
-
console.log(
|
|
1224
|
+
console.log(`${icon} ${(0, theme_1.brand)(`${platform} β Installing ${label}`)}`);
|
|
1225
|
+
console.log((0, theme_1.dim)(` Target: ./${target.dir}/\n`));
|
|
1228
1226
|
let ok = 0, fail = 0;
|
|
1229
1227
|
for (const skill of skills) {
|
|
1230
1228
|
const url = `${RAW_BASE}/skills/${skill}/SKILL.md`;
|
|
@@ -1236,9 +1234,9 @@ function doAddSkills(skills, platform) {
|
|
|
1236
1234
|
else if (platform === 'continue') {
|
|
1237
1235
|
dest = path_1.default.join(target.dir, `${skill}.md`);
|
|
1238
1236
|
}
|
|
1239
|
-
const
|
|
1237
|
+
const ok_result = yield downloadFile(url, dest);
|
|
1240
1238
|
// Prepend Cursor MDC glob formatting
|
|
1241
|
-
if (
|
|
1239
|
+
if (ok_result && platform === 'cursor') {
|
|
1242
1240
|
try {
|
|
1243
1241
|
const content = fs_1.default.readFileSync(dest, 'utf-8');
|
|
1244
1242
|
if (!content.startsWith('---')) {
|
|
@@ -1252,27 +1250,26 @@ function doAddSkills(skills, platform) {
|
|
|
1252
1250
|
}
|
|
1253
1251
|
catch (err) { }
|
|
1254
1252
|
}
|
|
1255
|
-
if (
|
|
1256
|
-
process.stdout.write(
|
|
1253
|
+
if (ok_result) {
|
|
1254
|
+
process.stdout.write((0, theme_1.success)(` β
${skill}\n`));
|
|
1257
1255
|
ok++;
|
|
1258
1256
|
}
|
|
1259
1257
|
else {
|
|
1260
|
-
process.stdout.write(
|
|
1258
|
+
process.stdout.write((0, theme_1.error)(` β ${skill}\n`));
|
|
1261
1259
|
fail++;
|
|
1262
1260
|
}
|
|
1263
1261
|
}
|
|
1264
1262
|
console.log();
|
|
1265
1263
|
if (ok > 0) {
|
|
1266
|
-
console.log(
|
|
1264
|
+
console.log((0, box_1.renderResult)('success', `${ok} skill${ok > 1 ? 's' : ''} installed β ./${target.dir}/`));
|
|
1267
1265
|
const invoke = target.invoke.replace('<skill>', skills[0]);
|
|
1268
|
-
console.log(
|
|
1266
|
+
console.log((0, theme_1.brand)(` π Usage: ${invoke} Your prompt here`));
|
|
1269
1267
|
if (target.note)
|
|
1270
|
-
console.log(
|
|
1268
|
+
console.log((0, theme_1.dim)(` Note: ${target.note}`));
|
|
1271
1269
|
yield postInstallOnboarding(platform);
|
|
1272
1270
|
}
|
|
1273
1271
|
if (fail > 0) {
|
|
1274
|
-
console.log(
|
|
1275
|
-
console.log(chalk_1.default.gray(` git clone https://github.com/tody-agent/codymaster.git`));
|
|
1272
|
+
console.log((0, box_1.renderResult)('warning', `${fail} failed β check connection or clone manually:`, [(0, theme_1.dim)('git clone https://github.com/tody-agent/codymaster.git')]));
|
|
1276
1273
|
}
|
|
1277
1274
|
});
|
|
1278
1275
|
}
|
|
@@ -1296,8 +1293,8 @@ program
|
|
|
1296
1293
|
}
|
|
1297
1294
|
else if (opts.skill) {
|
|
1298
1295
|
if (!ALL_SKILLS.includes(opts.skill)) {
|
|
1299
|
-
console.log(
|
|
1300
|
-
|
|
1296
|
+
console.log((0, box_1.renderResult)('error', `Unknown skill: ${opts.skill}`, [(0, theme_1.dim)('Run: npx codymaster add --list')]));
|
|
1297
|
+
return;
|
|
1301
1298
|
return;
|
|
1302
1299
|
}
|
|
1303
1300
|
skills = [opts.skill];
|
|
@@ -1305,27 +1302,27 @@ program
|
|
|
1305
1302
|
// Detect or prompt platform
|
|
1306
1303
|
let platform = opts.platform || autoDetectPlatform();
|
|
1307
1304
|
if (platform === 'manual') {
|
|
1308
|
-
const
|
|
1309
|
-
const
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
{
|
|
1313
|
-
{
|
|
1314
|
-
{
|
|
1315
|
-
{
|
|
1316
|
-
{
|
|
1317
|
-
{
|
|
1318
|
-
{
|
|
1319
|
-
{
|
|
1320
|
-
{
|
|
1321
|
-
{
|
|
1322
|
-
{
|
|
1323
|
-
{
|
|
1305
|
+
const p = yield Promise.resolve().then(() => __importStar(require('@clack/prompts')));
|
|
1306
|
+
const platform_choice = yield p.select({
|
|
1307
|
+
message: 'Select your AI coding platform:',
|
|
1308
|
+
options: [
|
|
1309
|
+
{ label: 'π£ Claude Code (recommended)', value: 'claude' },
|
|
1310
|
+
{ label: 'π» Gemini CLI & Antigravity', value: 'gemini' },
|
|
1311
|
+
{ label: 'π΅ Cursor', value: 'cursor' },
|
|
1312
|
+
{ label: 'π Windsurf', value: 'windsurf' },
|
|
1313
|
+
{ label: 'β« Cline / RooCode', value: 'cline' },
|
|
1314
|
+
{ label: 'π¦ OpenCode', value: 'opencode' },
|
|
1315
|
+
{ label: 'πΆ Kiro (AWS)', value: 'kiro' },
|
|
1316
|
+
{ label: 'π GitHub Copilot', value: 'copilot' },
|
|
1317
|
+
{ label: 'π€ Aider', value: 'aider' },
|
|
1318
|
+
{ label: 'π Continue.dev', value: 'continue' },
|
|
1319
|
+
{ label: 'βοΈ Amazon Q', value: 'amazonq' },
|
|
1320
|
+
{ label: 'β‘ Amp', value: 'amp' },
|
|
1324
1321
|
],
|
|
1325
1322
|
});
|
|
1326
|
-
if (
|
|
1323
|
+
if (p.isCancel(platform_choice))
|
|
1327
1324
|
return;
|
|
1328
|
-
platform =
|
|
1325
|
+
platform = platform_choice;
|
|
1329
1326
|
}
|
|
1330
1327
|
// If no skills chosen yet, prompt
|
|
1331
1328
|
if (!skills) {
|
|
@@ -1333,25 +1330,27 @@ program
|
|
|
1333
1330
|
skills = ALL_SKILLS;
|
|
1334
1331
|
}
|
|
1335
1332
|
else {
|
|
1336
|
-
const
|
|
1337
|
-
const
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
{
|
|
1341
|
-
{
|
|
1333
|
+
const p = yield Promise.resolve().then(() => __importStar(require('@clack/prompts')));
|
|
1334
|
+
const mode = yield p.select({
|
|
1335
|
+
message: 'What to install?',
|
|
1336
|
+
options: [
|
|
1337
|
+
{ label: 'All 34 skills (full kit)', value: 'all' },
|
|
1338
|
+
{ label: 'Search & pick one skill', value: 'pick' },
|
|
1342
1339
|
],
|
|
1343
1340
|
});
|
|
1344
|
-
if (
|
|
1341
|
+
if (p.isCancel(mode))
|
|
1342
|
+
return;
|
|
1343
|
+
if (mode === 'all') {
|
|
1345
1344
|
skills = ALL_SKILLS;
|
|
1346
1345
|
}
|
|
1347
1346
|
else {
|
|
1348
|
-
const pick = yield
|
|
1349
|
-
|
|
1350
|
-
|
|
1347
|
+
const pick = yield p.select({
|
|
1348
|
+
message: 'Select a skill:',
|
|
1349
|
+
options: ALL_SKILLS.map(s => ({ label: s, value: s })),
|
|
1351
1350
|
});
|
|
1352
|
-
if (
|
|
1351
|
+
if (p.isCancel(pick))
|
|
1353
1352
|
return;
|
|
1354
|
-
skills = [pick
|
|
1353
|
+
skills = [pick];
|
|
1355
1354
|
}
|
|
1356
1355
|
}
|
|
1357
1356
|
}
|
|
@@ -1418,43 +1417,38 @@ program
|
|
|
1418
1417
|
});
|
|
1419
1418
|
function continuityInit(projectPath) {
|
|
1420
1419
|
if ((0, continuity_1.hasCmDir)(projectPath)) {
|
|
1421
|
-
console.log(
|
|
1422
|
-
console.log(chalk_1.default.gray(` Path: ${projectPath}/.cm/`));
|
|
1420
|
+
console.log((0, box_1.renderResult)('warning', '.cm/ directory already exists.', [(0, theme_1.dim)(`Path: ${projectPath}/.cm/`)]));
|
|
1423
1421
|
return;
|
|
1424
1422
|
}
|
|
1425
1423
|
(0, continuity_1.ensureCmDir)(projectPath);
|
|
1426
|
-
console.log(
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
|
|
1431
|
-
|
|
1432
|
-
|
|
1433
|
-
|
|
1434
|
-
console.log(
|
|
1424
|
+
console.log((0, box_1.renderResult)('success', 'Working memory initialized!', [
|
|
1425
|
+
(0, theme_1.dim)(`Created: ${projectPath}/.cm/`),
|
|
1426
|
+
(0, theme_1.dim)('βββ CONTINUITY.md (working memory)'),
|
|
1427
|
+
(0, theme_1.dim)('βββ config.yaml (RARV settings)'),
|
|
1428
|
+
(0, theme_1.dim)('βββ memory/'),
|
|
1429
|
+
(0, theme_1.dim)(' βββ learnings.json (error patterns)'),
|
|
1430
|
+
(0, theme_1.dim)(' βββ decisions.json (architecture decisions)'),
|
|
1431
|
+
]));
|
|
1432
|
+
console.log((0, theme_1.info)('π‘ Protocol: Read CONTINUITY.md at session start, update at session end.'));
|
|
1435
1433
|
}
|
|
1436
1434
|
function continuityStatus(projectPath) {
|
|
1437
1435
|
const status = (0, continuity_1.getContinuityStatus)(projectPath);
|
|
1438
1436
|
if (!status.initialized) {
|
|
1439
|
-
console.log(
|
|
1440
|
-
|
|
1441
|
-
|
|
1442
|
-
|
|
1443
|
-
console.log(
|
|
1444
|
-
|
|
1445
|
-
|
|
1446
|
-
|
|
1447
|
-
|
|
1448
|
-
|
|
1449
|
-
|
|
1450
|
-
|
|
1451
|
-
|
|
1452
|
-
}
|
|
1453
|
-
console.log();
|
|
1454
|
-
console.log(chalk_1.default.gray(` β
Completed: ${status.completedCount} | π§ Blockers: ${status.blockerCount}`));
|
|
1455
|
-
console.log(chalk_1.default.gray(` π Learnings: ${status.learningCount} | π Decisions: ${status.decisionCount}`));
|
|
1437
|
+
console.log((0, box_1.renderResult)('warning', 'Working memory not initialized.', [(0, theme_1.dim)('Run: cm continuity init')]));
|
|
1438
|
+
return;
|
|
1439
|
+
}
|
|
1440
|
+
console.log((0, box_1.renderCommandHeader)('Working Memory Status', 'π§ '));
|
|
1441
|
+
console.log((0, box_1.renderKeyValue)([
|
|
1442
|
+
['Project', String(status.project)],
|
|
1443
|
+
['Phase', phaseColor(status.phase)(status.phase)],
|
|
1444
|
+
['Iteration', String(status.iteration)],
|
|
1445
|
+
...(status.activeGoal ? [['Goal', String(status.activeGoal)]] : []),
|
|
1446
|
+
...(status.currentTask ? [['Task', String(status.currentTask)]] : []),
|
|
1447
|
+
]));
|
|
1448
|
+
console.log((0, theme_1.dim)(` β
Completed: ${status.completedCount} | π§ Blockers: ${status.blockerCount}`));
|
|
1449
|
+
console.log((0, theme_1.dim)(` π Learnings: ${status.learningCount} | π Decisions: ${status.decisionCount}`));
|
|
1456
1450
|
if (status.lastUpdated) {
|
|
1457
|
-
console.log(
|
|
1451
|
+
console.log((0, theme_1.dim)(` π Updated: ${formatTimeAgoCli(status.lastUpdated)}`));
|
|
1458
1452
|
}
|
|
1459
1453
|
console.log();
|
|
1460
1454
|
}
|
|
@@ -1467,46 +1461,45 @@ function phaseColor(phase) {
|
|
|
1467
1461
|
}
|
|
1468
1462
|
function continuityReset(projectPath) {
|
|
1469
1463
|
if (!(0, continuity_1.hasCmDir)(projectPath)) {
|
|
1470
|
-
console.log(
|
|
1464
|
+
console.log((0, box_1.renderResult)('warning', 'No .cm/ directory found.'));
|
|
1471
1465
|
return;
|
|
1472
1466
|
}
|
|
1473
1467
|
(0, continuity_1.resetContinuity)(projectPath);
|
|
1474
|
-
console.log(
|
|
1475
|
-
console.log(chalk_1.default.gray(' CONTINUITY.md cleared. Learnings preserved.'));
|
|
1468
|
+
console.log((0, box_1.renderResult)('success', 'Working memory reset.', [(0, theme_1.dim)('CONTINUITY.md cleared. Learnings preserved.')]));
|
|
1476
1469
|
}
|
|
1477
1470
|
function continuityLearnings(projectPath) {
|
|
1478
1471
|
if (!(0, continuity_1.hasCmDir)(projectPath)) {
|
|
1479
|
-
console.log(
|
|
1472
|
+
console.log((0, box_1.renderResult)('warning', 'No .cm/ directory found. Run: cm continuity init'));
|
|
1480
1473
|
return;
|
|
1481
1474
|
}
|
|
1482
1475
|
const learnings = (0, continuity_1.getLearnings)(projectPath);
|
|
1483
1476
|
if (learnings.length === 0) {
|
|
1484
|
-
console.log(
|
|
1477
|
+
console.log(`\n ${(0, theme_1.dim)('No learnings captured yet. π')}\n`);
|
|
1485
1478
|
return;
|
|
1486
1479
|
}
|
|
1487
|
-
console.log(
|
|
1480
|
+
console.log((0, box_1.renderCommandHeader)(`Mistakes & Learnings (${learnings.length})`, 'π'));
|
|
1488
1481
|
for (const l of learnings.slice(-10)) {
|
|
1489
|
-
console.log(
|
|
1490
|
-
console.log(
|
|
1491
|
-
console.log(
|
|
1492
|
-
console.log(
|
|
1482
|
+
console.log((0, theme_1.error)(` β ${l.whatFailed}`));
|
|
1483
|
+
console.log((0, theme_1.dim)(` Why: ${l.whyFailed}`));
|
|
1484
|
+
console.log((0, theme_1.success)(` Fix: ${l.howToPrevent}`));
|
|
1485
|
+
console.log((0, theme_1.dim)(` ${formatTimeAgoCli(l.timestamp)} | ${l.agent || 'unknown'}\n`));
|
|
1493
1486
|
}
|
|
1494
1487
|
}
|
|
1495
1488
|
function continuityDecisions(projectPath) {
|
|
1496
1489
|
if (!(0, continuity_1.hasCmDir)(projectPath)) {
|
|
1497
|
-
console.log(
|
|
1490
|
+
console.log((0, box_1.renderResult)('warning', 'No .cm/ directory found. Run: cm continuity init'));
|
|
1498
1491
|
return;
|
|
1499
1492
|
}
|
|
1500
1493
|
const decisions = (0, continuity_1.getDecisions)(projectPath);
|
|
1501
1494
|
if (decisions.length === 0) {
|
|
1502
|
-
console.log(
|
|
1495
|
+
console.log(`\n ${(0, theme_1.dim)('No decisions recorded yet.')}\n`);
|
|
1503
1496
|
return;
|
|
1504
1497
|
}
|
|
1505
|
-
console.log(
|
|
1498
|
+
console.log((0, box_1.renderCommandHeader)(`Key Decisions (${decisions.length})`, 'π'));
|
|
1506
1499
|
for (const d of decisions.slice(-10)) {
|
|
1507
|
-
console.log(
|
|
1508
|
-
console.log(
|
|
1509
|
-
console.log(
|
|
1500
|
+
console.log((0, theme_1.brand)(` π ${d.decision}`));
|
|
1501
|
+
console.log((0, theme_1.dim)(` Rationale: ${d.rationale}`));
|
|
1502
|
+
console.log((0, theme_1.dim)(` ${formatTimeAgoCli(d.timestamp)} | ${d.agent || 'unknown'}\n`));
|
|
1510
1503
|
}
|
|
1511
1504
|
}
|
|
1512
1505
|
// βββ Brain Command (Enhanced Memory Explorer) ββββββββββββββββββββββββββββββββ
|
|
@@ -1549,13 +1542,11 @@ program
|
|
|
1549
1542
|
brainExport(projectPath, opts);
|
|
1550
1543
|
break;
|
|
1551
1544
|
default:
|
|
1552
|
-
// Try as delete: cm brain learning <id> or cm brain decision <id>
|
|
1553
1545
|
if (cmd === 'learning' || cmd === 'decision') {
|
|
1554
|
-
console.log(
|
|
1546
|
+
console.log((0, theme_1.dim)(`Did you mean: cm brain ${cmd}s ?`));
|
|
1555
1547
|
}
|
|
1556
1548
|
else {
|
|
1557
|
-
console.log(
|
|
1558
|
-
console.log(chalk_1.default.gray('Available: status, learnings, decisions, delete, stats, export'));
|
|
1549
|
+
console.log((0, box_1.renderResult)('error', `Unknown: ${cmd}`, [(0, theme_1.dim)('Available: status, learnings, decisions, delete, stats, export')]));
|
|
1559
1550
|
}
|
|
1560
1551
|
}
|
|
1561
1552
|
});
|
|
@@ -1570,40 +1561,38 @@ program
|
|
|
1570
1561
|
function brainStatus(projectPath) {
|
|
1571
1562
|
const status = (0, continuity_1.getContinuityStatus)(projectPath);
|
|
1572
1563
|
if (!status.initialized) {
|
|
1573
|
-
console.log(
|
|
1574
|
-
console.log(chalk_1.default.gray(' Run: cm continuity init'));
|
|
1564
|
+
console.log((0, box_1.renderResult)('warning', 'Working memory not initialized.', [(0, theme_1.dim)('Run: cm continuity init')]));
|
|
1575
1565
|
return;
|
|
1576
1566
|
}
|
|
1577
1567
|
showBanner();
|
|
1578
|
-
console.log(
|
|
1568
|
+
console.log((0, box_1.renderCommandHeader)('Brain β Memory Status', 'π§ '));
|
|
1579
1569
|
// Stats row
|
|
1580
|
-
console.log(
|
|
1581
|
-
console.log(
|
|
1582
|
-
|
|
1583
|
-
|
|
1584
|
-
|
|
1585
|
-
console.log(
|
|
1570
|
+
console.log((0, theme_1.brand)(' ββββββββββββββββ¬βββββββββββββββ¬βββββββββββββββ¬βββββββββββββββ'));
|
|
1571
|
+
console.log((0, theme_1.brand)(' β') + (0, theme_1.error)(` β€ Learn: ${padRight(String(status.learningCount), 4)}`) +
|
|
1572
|
+
(0, theme_1.brand)(' β') + (0, theme_1.brand)(` π Decide: ${padRight(String(status.decisionCount), 3)}`) +
|
|
1573
|
+
(0, theme_1.brand)(' β') + phaseColor(status.phase)(` β ${padRight(status.phase, 9)}`) +
|
|
1574
|
+
(0, theme_1.brand)(' β') + (0, theme_1.dim)(` #${padRight(String(status.iteration), 10)}`) + (0, theme_1.brand)('β'));
|
|
1575
|
+
console.log((0, theme_1.brand)(' ββββββββββββββββ΄βββββββββββββββ΄βββββββββββββββ΄βββββββββββββββ'));
|
|
1586
1576
|
console.log();
|
|
1587
|
-
console.log(
|
|
1588
|
-
|
|
1589
|
-
|
|
1590
|
-
|
|
1591
|
-
|
|
1592
|
-
|
|
1593
|
-
|
|
1594
|
-
|
|
1595
|
-
console.log(` ${chalk_1.default.white('Updated:')} ${formatTimeAgoCli(status.lastUpdated)}`);
|
|
1577
|
+
console.log((0, box_1.renderKeyValue)([
|
|
1578
|
+
['Project', String(status.project)],
|
|
1579
|
+
...(status.activeGoal ? [['Goal', String(status.activeGoal)]] : []),
|
|
1580
|
+
...(status.currentTask ? [['Task', String(status.currentTask)]] : []),
|
|
1581
|
+
['Completed', `${status.completedCount} items`],
|
|
1582
|
+
['Blockers', status.blockerCount > 0 ? (0, theme_1.warning)(`π§ ${status.blockerCount}`) : (0, theme_1.success)('β
None')],
|
|
1583
|
+
...(status.lastUpdated ? [['Updated', formatTimeAgoCli(status.lastUpdated)]] : []),
|
|
1584
|
+
]));
|
|
1596
1585
|
console.log();
|
|
1597
|
-
console.log(
|
|
1598
|
-
console.log(
|
|
1599
|
-
console.log(
|
|
1600
|
-
console.log(
|
|
1601
|
-
console.log(
|
|
1586
|
+
console.log((0, theme_1.dim)(' Commands:'));
|
|
1587
|
+
console.log((0, theme_1.dim)(' cm brain learnings β View mistakes & lessons'));
|
|
1588
|
+
console.log((0, theme_1.dim)(' cm brain decisions β View architecture decisions'));
|
|
1589
|
+
console.log((0, theme_1.dim)(' cm brain stats β Memory statistics'));
|
|
1590
|
+
console.log((0, theme_1.dim)(' cm brain export β Export memory data'));
|
|
1602
1591
|
console.log();
|
|
1603
1592
|
}
|
|
1604
1593
|
function brainLearnings(projectPath, opts) {
|
|
1605
1594
|
if (!(0, continuity_1.hasCmDir)(projectPath)) {
|
|
1606
|
-
console.log(
|
|
1595
|
+
console.log((0, box_1.renderResult)('warning', 'No .cm/ directory found. Run: cm continuity init'));
|
|
1607
1596
|
return;
|
|
1608
1597
|
}
|
|
1609
1598
|
let learnings = (0, continuity_1.getLearnings)(projectPath);
|
|
@@ -1618,95 +1607,96 @@ function brainLearnings(projectPath, opts) {
|
|
|
1618
1607
|
const limit = opts.last ? parseInt(opts.last) : 15;
|
|
1619
1608
|
const display = learnings.slice(-limit);
|
|
1620
1609
|
if (display.length === 0) {
|
|
1621
|
-
console.log(
|
|
1610
|
+
console.log(`\n ${(0, theme_1.dim)(`No learnings ${opts.search ? 'matching "' + opts.search + '"' : 'captured yet'}. π`)}\n`);
|
|
1622
1611
|
return;
|
|
1623
1612
|
}
|
|
1624
|
-
console.log(
|
|
1613
|
+
console.log((0, box_1.renderCommandHeader)(`Learnings (${display.length}${learnings.length > limit ? '/' + learnings.length : ''})`, 'π'));
|
|
1625
1614
|
for (const l of display) {
|
|
1626
1615
|
const shortId = l.id ? l.id.substring(0, 8) : '???';
|
|
1627
|
-
console.log(
|
|
1616
|
+
console.log((0, theme_1.error)(` β ${l.whatFailed}`) + (0, theme_1.dim)(` [${shortId}]`));
|
|
1628
1617
|
if (l.whyFailed)
|
|
1629
|
-
console.log(
|
|
1618
|
+
console.log((0, theme_1.dim)(` Why: ${l.whyFailed}`));
|
|
1630
1619
|
if (l.howToPrevent)
|
|
1631
|
-
console.log(
|
|
1632
|
-
console.log(
|
|
1620
|
+
console.log((0, theme_1.success)(` Fix: ${l.howToPrevent}`));
|
|
1621
|
+
console.log((0, theme_1.dim)(` ${formatTimeAgoCli(l.timestamp)} | ${l.agent || 'unknown'}${l.module ? ' | π¦ ' + l.module : ''}\n`));
|
|
1633
1622
|
}
|
|
1634
1623
|
}
|
|
1635
1624
|
function brainDecisions(projectPath, opts) {
|
|
1636
1625
|
if (!(0, continuity_1.hasCmDir)(projectPath)) {
|
|
1637
|
-
console.log(
|
|
1626
|
+
console.log((0, box_1.renderResult)('warning', 'No .cm/ directory found. Run: cm continuity init'));
|
|
1638
1627
|
return;
|
|
1639
1628
|
}
|
|
1640
1629
|
const decisions = (0, continuity_1.getDecisions)(projectPath);
|
|
1641
1630
|
const limit = opts.last ? parseInt(opts.last) : 15;
|
|
1642
1631
|
const display = decisions.slice(-limit);
|
|
1643
1632
|
if (display.length === 0) {
|
|
1644
|
-
console.log(
|
|
1633
|
+
console.log(`\n ${(0, theme_1.dim)('No decisions recorded yet.')}\n`);
|
|
1645
1634
|
return;
|
|
1646
1635
|
}
|
|
1647
|
-
console.log(
|
|
1636
|
+
console.log((0, box_1.renderCommandHeader)(`Key Decisions (${display.length}${decisions.length > limit ? '/' + decisions.length : ''})`, 'π'));
|
|
1648
1637
|
for (const d of display) {
|
|
1649
1638
|
const shortId = d.id ? d.id.substring(0, 8) : '???';
|
|
1650
|
-
console.log(
|
|
1639
|
+
console.log((0, theme_1.brand)(` π ${d.decision}`) + (0, theme_1.dim)(` [${shortId}]`));
|
|
1651
1640
|
if (d.rationale)
|
|
1652
|
-
console.log(
|
|
1653
|
-
console.log(
|
|
1641
|
+
console.log((0, theme_1.dim)(` Rationale: ${d.rationale}`));
|
|
1642
|
+
console.log((0, theme_1.dim)(` ${formatTimeAgoCli(d.timestamp)} | ${d.agent || 'unknown'}\n`));
|
|
1654
1643
|
}
|
|
1655
1644
|
}
|
|
1656
1645
|
function brainDelete(projectPath, type, id) {
|
|
1657
1646
|
if (!(0, continuity_1.hasCmDir)(projectPath)) {
|
|
1658
|
-
console.log(
|
|
1647
|
+
console.log((0, box_1.renderResult)('warning', 'No .cm/ directory found.'));
|
|
1659
1648
|
return;
|
|
1660
1649
|
}
|
|
1661
1650
|
if (type === 'learning' || type === 'l') {
|
|
1662
1651
|
const learnings = (0, continuity_1.getLearnings)(projectPath);
|
|
1663
1652
|
const target = learnings.find(l => l.id && l.id.startsWith(id));
|
|
1664
1653
|
if (!target) {
|
|
1665
|
-
console.log(
|
|
1654
|
+
console.log((0, box_1.renderResult)('error', `Learning not found with ID prefix: ${id}`));
|
|
1666
1655
|
return;
|
|
1667
1656
|
}
|
|
1668
|
-
const
|
|
1669
|
-
if (
|
|
1670
|
-
console.log(
|
|
1657
|
+
const del_success = (0, continuity_1.deleteLearning)(projectPath, target.id);
|
|
1658
|
+
if (del_success) {
|
|
1659
|
+
console.log((0, box_1.renderResult)('success', `Deleted learning: ${target.whatFailed}`));
|
|
1671
1660
|
}
|
|
1672
1661
|
else {
|
|
1673
|
-
console.log(
|
|
1662
|
+
console.log((0, box_1.renderResult)('error', 'Failed to delete'));
|
|
1674
1663
|
}
|
|
1675
1664
|
}
|
|
1676
1665
|
else if (type === 'decision' || type === 'd') {
|
|
1677
1666
|
const decisions = (0, continuity_1.getDecisions)(projectPath);
|
|
1678
1667
|
const target = decisions.find(d => d.id && d.id.startsWith(id));
|
|
1679
1668
|
if (!target) {
|
|
1680
|
-
console.log(
|
|
1669
|
+
console.log((0, box_1.renderResult)('error', `Decision not found with ID prefix: ${id}`));
|
|
1681
1670
|
return;
|
|
1682
1671
|
}
|
|
1683
|
-
const
|
|
1684
|
-
if (
|
|
1685
|
-
console.log(
|
|
1672
|
+
const del_success = (0, continuity_1.deleteDecision)(projectPath, target.id);
|
|
1673
|
+
if (del_success) {
|
|
1674
|
+
console.log((0, box_1.renderResult)('success', `Deleted decision: ${target.decision}`));
|
|
1686
1675
|
}
|
|
1687
1676
|
else {
|
|
1688
|
-
console.log(
|
|
1677
|
+
console.log((0, box_1.renderResult)('error', 'Failed to delete'));
|
|
1689
1678
|
}
|
|
1690
1679
|
}
|
|
1691
1680
|
else {
|
|
1692
|
-
console.log(
|
|
1693
|
-
console.log(chalk_1.default.gray(' Use: cm brain-delete learning <id> | cm brain-delete decision <id>'));
|
|
1681
|
+
console.log((0, box_1.renderResult)('error', `Unknown type: ${type}`, [(0, theme_1.dim)('Use: cm brain-delete learning <id> | cm brain-delete decision <id>')]));
|
|
1694
1682
|
}
|
|
1695
1683
|
}
|
|
1696
1684
|
function brainStats(projectPath) {
|
|
1697
1685
|
if (!(0, continuity_1.hasCmDir)(projectPath)) {
|
|
1698
|
-
console.log(
|
|
1686
|
+
console.log((0, box_1.renderResult)('warning', 'No .cm/ directory found. Run: cm continuity init'));
|
|
1699
1687
|
return;
|
|
1700
1688
|
}
|
|
1701
1689
|
const status = (0, continuity_1.getContinuityStatus)(projectPath);
|
|
1702
1690
|
const learnings = (0, continuity_1.getLearnings)(projectPath);
|
|
1703
1691
|
const decisions = (0, continuity_1.getDecisions)(projectPath);
|
|
1704
|
-
console.log(
|
|
1705
|
-
console.log(
|
|
1706
|
-
|
|
1707
|
-
|
|
1708
|
-
|
|
1709
|
-
|
|
1692
|
+
console.log((0, box_1.renderCommandHeader)('Brain Statistics', 'π'));
|
|
1693
|
+
console.log((0, box_1.renderKeyValue)([
|
|
1694
|
+
['Learnings', String(learnings.length)],
|
|
1695
|
+
['Decisions', String(decisions.length)],
|
|
1696
|
+
['Completed', `${status.completedCount} items`],
|
|
1697
|
+
['Blockers', String(status.blockerCount)],
|
|
1698
|
+
['Iteration', `#${status.iteration}`],
|
|
1699
|
+
]));
|
|
1710
1700
|
// Agent breakdown
|
|
1711
1701
|
const agentMap = {};
|
|
1712
1702
|
learnings.forEach(l => { if (l.agent)
|
|
@@ -1716,9 +1706,9 @@ function brainStats(projectPath) {
|
|
|
1716
1706
|
const agents = Object.entries(agentMap).sort((a, b) => b[1] - a[1]);
|
|
1717
1707
|
if (agents.length > 0) {
|
|
1718
1708
|
console.log();
|
|
1719
|
-
console.log(
|
|
1709
|
+
console.log((0, theme_1.brand)(' Agents:'));
|
|
1720
1710
|
for (const [agent, count] of agents) {
|
|
1721
|
-
console.log(
|
|
1711
|
+
console.log((0, theme_1.dim)(` π€ ${padRight(agent, 20)} ${count} entries`));
|
|
1722
1712
|
}
|
|
1723
1713
|
}
|
|
1724
1714
|
// Module breakdown
|
|
@@ -1728,23 +1718,23 @@ function brainStats(projectPath) {
|
|
|
1728
1718
|
const modules = Object.entries(moduleMap).sort((a, b) => b[1] - a[1]);
|
|
1729
1719
|
if (modules.length > 0) {
|
|
1730
1720
|
console.log();
|
|
1731
|
-
console.log(
|
|
1721
|
+
console.log((0, theme_1.brand)(' Modules (most error-prone):'));
|
|
1732
1722
|
for (const [mod, count] of modules.slice(0, 5)) {
|
|
1733
|
-
console.log(
|
|
1723
|
+
console.log((0, theme_1.dim)(` π¦ ${padRight(mod, 20)} ${count} learnings`));
|
|
1734
1724
|
}
|
|
1735
1725
|
}
|
|
1736
1726
|
// Time range
|
|
1737
1727
|
const allTimestamps = [...learnings.map(l => l.timestamp), ...decisions.map(d => d.timestamp)].filter(Boolean).sort();
|
|
1738
1728
|
if (allTimestamps.length > 0) {
|
|
1739
1729
|
console.log();
|
|
1740
|
-
console.log(
|
|
1741
|
-
console.log(
|
|
1730
|
+
console.log((0, theme_1.dim)(` First entry: ${formatTimeAgoCli(allTimestamps[0])}`));
|
|
1731
|
+
console.log((0, theme_1.dim)(` Latest: ${formatTimeAgoCli(allTimestamps[allTimestamps.length - 1])}`));
|
|
1742
1732
|
}
|
|
1743
1733
|
console.log();
|
|
1744
1734
|
}
|
|
1745
1735
|
function brainExport(projectPath, opts) {
|
|
1746
1736
|
if (!(0, continuity_1.hasCmDir)(projectPath)) {
|
|
1747
|
-
console.log(
|
|
1737
|
+
console.log((0, box_1.renderResult)('warning', 'No .cm/ directory found.'));
|
|
1748
1738
|
return;
|
|
1749
1739
|
}
|
|
1750
1740
|
const learnings = (0, continuity_1.getLearnings)(projectPath);
|
|
@@ -1755,8 +1745,7 @@ function brainExport(projectPath, opts) {
|
|
|
1755
1745
|
const data = { status, learnings, decisions, exportedAt: new Date().toISOString() };
|
|
1756
1746
|
const outFile = `brain-export-${new Date().toISOString().slice(0, 10)}.json`;
|
|
1757
1747
|
fs_1.default.writeFileSync(outFile, JSON.stringify(data, null, 2));
|
|
1758
|
-
console.log(
|
|
1759
|
-
console.log(chalk_1.default.gray(` ${learnings.length} learnings, ${decisions.length} decisions`));
|
|
1748
|
+
console.log((0, box_1.renderResult)('success', `Exported to ${outFile}`, [(0, theme_1.dim)(`${learnings.length} learnings, ${decisions.length} decisions`)]));
|
|
1760
1749
|
}
|
|
1761
1750
|
else if (format === 'md') {
|
|
1762
1751
|
let md = `# Brain Export\n\n**Project:** ${status.project || 'Unknown'}\n**Exported:** ${new Date().toISOString()}\n\n`;
|
|
@@ -1770,12 +1759,10 @@ function brainExport(projectPath, opts) {
|
|
|
1770
1759
|
}
|
|
1771
1760
|
const outFile = `brain-export-${new Date().toISOString().slice(0, 10)}.md`;
|
|
1772
1761
|
fs_1.default.writeFileSync(outFile, md);
|
|
1773
|
-
console.log(
|
|
1774
|
-
console.log(chalk_1.default.gray(` ${learnings.length} learnings, ${decisions.length} decisions`));
|
|
1762
|
+
console.log((0, box_1.renderResult)('success', `Exported to ${outFile}`, [(0, theme_1.dim)(`${learnings.length} learnings, ${decisions.length} decisions`)]));
|
|
1775
1763
|
}
|
|
1776
1764
|
else {
|
|
1777
|
-
console.log(
|
|
1778
|
-
console.log(chalk_1.default.gray(' Use: --format json | --format md'));
|
|
1765
|
+
console.log((0, box_1.renderResult)('error', `Unknown format: ${format}`, [(0, theme_1.dim)('Use: --format json | --format md')]));
|
|
1779
1766
|
}
|
|
1780
1767
|
}
|
|
1781
1768
|
// βββ Skill Command ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
@@ -1798,6 +1785,7 @@ const SKILL_CATALOG = {
|
|
|
1798
1785
|
{ name: 'cm-git-worktrees', desc: 'Isolated feature branches without context-switch' },
|
|
1799
1786
|
{ name: 'cm-terminal', desc: 'Safe terminal execution with logging' },
|
|
1800
1787
|
{ name: 'cm-secret-shield', desc: 'Scan & block secrets before commit/deploy' },
|
|
1788
|
+
{ name: 'cm-security-gate', desc: 'Pre-production vulnerability audit (Snyk/Aikido)' },
|
|
1801
1789
|
{ name: 'cm-safe-i18n', desc: 'Multi-pass translation with 8 audit gates' },
|
|
1802
1790
|
],
|
|
1803
1791
|
},
|
|
@@ -1847,9 +1835,16 @@ const SKILL_CATALOG = {
|
|
|
1847
1835
|
program
|
|
1848
1836
|
.command('skill [cmd] [name]')
|
|
1849
1837
|
.alias('sk')
|
|
1850
|
-
.description('Skill management (list|info|domains)')
|
|
1838
|
+
.description('Skill management (list|info|domains|create)')
|
|
1851
1839
|
.action((cmd, name) => {
|
|
1852
1840
|
switch (cmd) {
|
|
1841
|
+
case 'create':
|
|
1842
|
+
if (!name) {
|
|
1843
|
+
console.log((0, box_1.renderResult)('error', 'Usage: cm skill create "skill-name"'));
|
|
1844
|
+
return;
|
|
1845
|
+
}
|
|
1846
|
+
console.log((0, box_1.renderResult)('success', `Scaffolding new skill: ${name}`, [(0, theme_1.dim)('Triggers skill-creator-ultra pipeline.')]));
|
|
1847
|
+
break;
|
|
1853
1848
|
case 'list':
|
|
1854
1849
|
case 'ls':
|
|
1855
1850
|
case undefined:
|
|
@@ -1857,7 +1852,7 @@ program
|
|
|
1857
1852
|
break;
|
|
1858
1853
|
case 'info':
|
|
1859
1854
|
if (!name) {
|
|
1860
|
-
console.log(
|
|
1855
|
+
console.log((0, box_1.renderResult)('error', 'Usage: cm skill info <skill-name>'));
|
|
1861
1856
|
return;
|
|
1862
1857
|
}
|
|
1863
1858
|
skillInfo(name);
|
|
@@ -1875,52 +1870,51 @@ function skillList(filterDomain) {
|
|
|
1875
1870
|
? Object.entries(SKILL_CATALOG).filter(([d]) => d.toLowerCase().startsWith(filterDomain.toLowerCase()))
|
|
1876
1871
|
: Object.entries(SKILL_CATALOG);
|
|
1877
1872
|
if (entries.length === 0) {
|
|
1878
|
-
console.log(
|
|
1879
|
-
console.log(chalk_1.default.gray(' Domains: engineering, operations, product, growth, orchestration, workflow'));
|
|
1873
|
+
console.log((0, box_1.renderResult)('error', `Domain not found: ${filterDomain}`, [(0, theme_1.dim)('Domains: engineering, operations, product, growth, orchestration, workflow')]));
|
|
1880
1874
|
return;
|
|
1881
1875
|
}
|
|
1882
|
-
console.log(
|
|
1876
|
+
console.log((0, box_1.renderCommandHeader)('Cody Master β 34 Skills', 'π§©'));
|
|
1883
1877
|
let total = 0;
|
|
1884
1878
|
for (const [domain, data] of entries) {
|
|
1885
|
-
console.log(
|
|
1879
|
+
console.log((0, theme_1.brand)(` ${data.icon} ${domain.charAt(0).toUpperCase() + domain.slice(1)}`));
|
|
1886
1880
|
for (const skill of data.skills) {
|
|
1887
|
-
console.log(` ${
|
|
1881
|
+
console.log(` ${(0, theme_1.brand)(padRight(skill.name, 26))} ${(0, theme_1.dim)(skill.desc)}`);
|
|
1888
1882
|
total++;
|
|
1889
1883
|
}
|
|
1890
1884
|
console.log();
|
|
1891
1885
|
}
|
|
1892
|
-
console.log(
|
|
1893
|
-
console.log(
|
|
1894
|
-
console.log(
|
|
1886
|
+
console.log((0, theme_1.dim)(` ${total} skills across ${entries.length} domains`));
|
|
1887
|
+
console.log((0, theme_1.dim)(` Install: npx codymaster add --all`));
|
|
1888
|
+
console.log((0, theme_1.dim)(` Add one: npx codymaster add --skill <name>\n`));
|
|
1895
1889
|
}
|
|
1896
1890
|
function skillInfo(name) {
|
|
1897
1891
|
for (const [domain, data] of Object.entries(SKILL_CATALOG)) {
|
|
1898
1892
|
const skill = data.skills.find(s => s.name === name);
|
|
1899
1893
|
if (skill) {
|
|
1900
|
-
console.log(
|
|
1901
|
-
console.log(` ${chalk_1.default.white('Domain:')} ${domain}`);
|
|
1902
|
-
console.log(` ${chalk_1.default.white('Description:')} ${skill.desc}`);
|
|
1894
|
+
console.log((0, box_1.renderCommandHeader)(`Skill: ${skill.name}`, 'π§©'));
|
|
1903
1895
|
const agents = (0, judge_1.suggestAgentsForSkill)(skill.name);
|
|
1904
|
-
console.log(
|
|
1905
|
-
|
|
1906
|
-
|
|
1907
|
-
|
|
1896
|
+
console.log((0, box_1.renderKeyValue)([
|
|
1897
|
+
['Domain', domain],
|
|
1898
|
+
['Description', skill.desc],
|
|
1899
|
+
['Best Agents', agents.join(', ')],
|
|
1900
|
+
['Invoke', `@[/${skill.name}] (Antigravity/Gemini)`],
|
|
1901
|
+
['', `/${skill.name} (Claude Code)`],
|
|
1902
|
+
['', `@${skill.name} (Cursor/Windsurf/Cline)`],
|
|
1903
|
+
]));
|
|
1908
1904
|
console.log();
|
|
1909
1905
|
return;
|
|
1910
1906
|
}
|
|
1911
1907
|
}
|
|
1912
|
-
console.log(
|
|
1913
|
-
console.log(chalk_1.default.gray(' Use "cm skill list" to see all available skills.'));
|
|
1908
|
+
console.log((0, box_1.renderResult)('error', `Skill not found: ${name}`, [(0, theme_1.dim)('Use "cm skill list" to see all available skills.')]));
|
|
1914
1909
|
}
|
|
1915
1910
|
function skillDomains() {
|
|
1916
|
-
console.log(
|
|
1911
|
+
console.log((0, box_1.renderCommandHeader)('Skill Domains', 'π―'));
|
|
1917
1912
|
let total = 0;
|
|
1918
1913
|
for (const [domain, data] of Object.entries(SKILL_CATALOG)) {
|
|
1919
|
-
console.log(` ${data.icon} ${
|
|
1914
|
+
console.log(` ${data.icon} ${(0, theme_1.brand)(padRight(domain.charAt(0).toUpperCase() + domain.slice(1), 16))} ${(0, theme_1.dim)(`${data.skills.length} skills`)}`);
|
|
1920
1915
|
total += data.skills.length;
|
|
1921
1916
|
}
|
|
1922
|
-
console.log(
|
|
1923
|
-
console.log();
|
|
1917
|
+
console.log((0, theme_1.dim)(`\n Total: ${total} skills across ${Object.keys(SKILL_CATALOG).length} domains\n`));
|
|
1924
1918
|
}
|
|
1925
1919
|
// βββ Judge Command ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
1926
1920
|
program
|
|
@@ -1934,7 +1928,7 @@ program
|
|
|
1934
1928
|
// Single task evaluation
|
|
1935
1929
|
const task = (0, data_1.findTaskByIdPrefix)(data, taskId);
|
|
1936
1930
|
if (!task) {
|
|
1937
|
-
console.log(
|
|
1931
|
+
console.log((0, box_1.renderResult)('error', `Task not found: ${taskId}`));
|
|
1938
1932
|
return;
|
|
1939
1933
|
}
|
|
1940
1934
|
const project = data.projects.find(p => p.id === task.projectId);
|
|
@@ -1943,15 +1937,17 @@ program
|
|
|
1943
1937
|
learnings = (0, continuity_1.getLearnings)(project.path);
|
|
1944
1938
|
}
|
|
1945
1939
|
const decision = (0, judge_1.evaluateTaskState)(task, data.tasks, learnings);
|
|
1946
|
-
console.log(
|
|
1947
|
-
|
|
1948
|
-
|
|
1949
|
-
|
|
1950
|
-
|
|
1951
|
-
|
|
1952
|
-
|
|
1953
|
-
|
|
1954
|
-
|
|
1940
|
+
console.log((0, box_1.renderCommandHeader)('Judge Decision', 'π€'));
|
|
1941
|
+
const details = [
|
|
1942
|
+
['Task', task.title],
|
|
1943
|
+
['Column', task.column],
|
|
1944
|
+
['Action', `${decision.badge} ${decision.action}`],
|
|
1945
|
+
['Reason', decision.reason],
|
|
1946
|
+
['Confidence', `${Math.round(decision.confidence * 100)}%`],
|
|
1947
|
+
];
|
|
1948
|
+
if (decision.suggestedNextSkill)
|
|
1949
|
+
details.push(['Suggested', decision.suggestedNextSkill]);
|
|
1950
|
+
console.log((0, box_1.renderKeyValue)(details));
|
|
1955
1951
|
console.log();
|
|
1956
1952
|
}
|
|
1957
1953
|
else {
|
|
@@ -1960,7 +1956,7 @@ program
|
|
|
1960
1956
|
if (opts.project) {
|
|
1961
1957
|
const project = (0, data_1.findProjectByNameOrId)(data, opts.project);
|
|
1962
1958
|
if (!project) {
|
|
1963
|
-
console.log(
|
|
1959
|
+
console.log((0, box_1.renderResult)('error', `Project not found: ${opts.project}`));
|
|
1964
1960
|
return;
|
|
1965
1961
|
}
|
|
1966
1962
|
tasks = tasks.filter(t => t.projectId === project.id);
|
|
@@ -1973,19 +1969,19 @@ program
|
|
|
1973
1969
|
}
|
|
1974
1970
|
const decisions = (0, judge_1.evaluateAllTasks)(tasks, allLearnings);
|
|
1975
1971
|
if (decisions.size === 0) {
|
|
1976
|
-
console.log(
|
|
1972
|
+
console.log(`\n ${(0, theme_1.dim)('No active tasks to evaluate.')}\n`);
|
|
1977
1973
|
return;
|
|
1978
1974
|
}
|
|
1979
|
-
console.log(
|
|
1980
|
-
console.log(
|
|
1981
|
-
console.log(
|
|
1975
|
+
console.log((0, box_1.renderCommandHeader)(`Judge Decisions (${decisions.size} active tasks)`, 'π€'));
|
|
1976
|
+
console.log((0, theme_1.dim)(' ' + padRight('Badge', 8) + padRight('Action', 12) + padRight('Confidence', 12) + 'Task'));
|
|
1977
|
+
console.log((0, theme_1.dim)(' ' + 'β'.repeat(70)));
|
|
1982
1978
|
for (const [tid, dec] of decisions) {
|
|
1983
1979
|
const task = tasks.find(t => t.id === tid);
|
|
1984
|
-
const actionColor = dec.action === 'CONTINUE' ?
|
|
1985
|
-
: dec.action === 'COMPLETE' ?
|
|
1986
|
-
: dec.action === 'ESCALATE' ?
|
|
1987
|
-
:
|
|
1988
|
-
console.log(' ' + padRight(dec.badge, 8) + actionColor(padRight(dec.action, 12)) +
|
|
1980
|
+
const actionColor = dec.action === 'CONTINUE' ? theme_1.success
|
|
1981
|
+
: dec.action === 'COMPLETE' ? theme_1.brand
|
|
1982
|
+
: dec.action === 'ESCALATE' ? theme_1.warning
|
|
1983
|
+
: theme_1.brand;
|
|
1984
|
+
console.log(' ' + padRight(dec.badge, 8) + actionColor(padRight(dec.action, 12)) + (0, theme_1.dim)(padRight(`${Math.round(dec.confidence * 100)}%`, 12)) + ((task === null || task === void 0 ? void 0 : task.title) || tid.substring(0, 8)));
|
|
1989
1985
|
}
|
|
1990
1986
|
console.log();
|
|
1991
1987
|
}
|
|
@@ -2003,8 +1999,7 @@ program
|
|
|
2003
1999
|
// Check if already exists
|
|
2004
2000
|
const existing = data.projects.find(p => p.path === projectPath || p.name === projectName);
|
|
2005
2001
|
if (existing) {
|
|
2006
|
-
console.log(
|
|
2007
|
-
console.log(chalk_1.default.gray(` ID: ${(0, data_1.shortId)(existing.id)} | Path: ${existing.path}`));
|
|
2002
|
+
console.log((0, box_1.renderResult)('warning', `Project already exists: ${existing.name}`, [(0, theme_1.dim)(`ID: ${(0, data_1.shortId)(existing.id)} | Path: ${existing.path}`)]));
|
|
2008
2003
|
return;
|
|
2009
2004
|
}
|
|
2010
2005
|
const project = {
|
|
@@ -2019,19 +2014,19 @@ program
|
|
|
2019
2014
|
(0, data_1.saveData)(data);
|
|
2020
2015
|
// Also init working memory
|
|
2021
2016
|
(0, continuity_1.ensureCmDir)(projectPath);
|
|
2022
|
-
console.log(
|
|
2023
|
-
|
|
2024
|
-
|
|
2025
|
-
|
|
2017
|
+
console.log((0, box_1.renderResult)('success', `Project initialized: ${projectName}`, [
|
|
2018
|
+
(0, theme_1.dim)(`ID: ${(0, data_1.shortId)(project.id)}`),
|
|
2019
|
+
(0, theme_1.dim)(`Path: ${projectPath}`),
|
|
2020
|
+
(0, theme_1.dim)(`.cm/ Working memory created`),
|
|
2021
|
+
]));
|
|
2026
2022
|
console.log();
|
|
2027
2023
|
if (!isDashboardRunning()) {
|
|
2028
2024
|
(0, dashboard_1.launchDashboard)(data_1.DEFAULT_PORT);
|
|
2029
|
-
console.log(
|
|
2025
|
+
console.log((0, theme_1.success)(` π Dashboard auto-started! You can track progress at http://codymaster.localhost:${data_1.DEFAULT_PORT}`));
|
|
2030
2026
|
}
|
|
2031
|
-
console.log(
|
|
2032
|
-
console.log(
|
|
2033
|
-
console.log(
|
|
2034
|
-
console.log();
|
|
2027
|
+
console.log((0, theme_1.info)('π‘ Next steps:'));
|
|
2028
|
+
console.log((0, theme_1.dim)(' cm task add "My first task"'));
|
|
2029
|
+
console.log((0, theme_1.dim)(' cm open\n'));
|
|
2035
2030
|
});
|
|
2036
2031
|
// βββ Open Command βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
2037
2032
|
program
|
|
@@ -2042,12 +2037,12 @@ program
|
|
|
2042
2037
|
.action((opts) => {
|
|
2043
2038
|
const port = parseInt(opts.port) || data_1.DEFAULT_PORT;
|
|
2044
2039
|
if (!isDashboardRunning()) {
|
|
2045
|
-
console.log(
|
|
2040
|
+
console.log((0, box_1.renderResult)('warning', 'Dashboard not running. Starting it first...'));
|
|
2046
2041
|
(0, dashboard_1.launchDashboard)(port);
|
|
2047
2042
|
setTimeout(() => openUrl(`http://codymaster.localhost:${port}`), 1500);
|
|
2048
2043
|
}
|
|
2049
2044
|
else {
|
|
2050
|
-
console.log(
|
|
2045
|
+
console.log((0, theme_1.info)(`π Opening http://codymaster.localhost:${port} ...`));
|
|
2051
2046
|
openUrl(`http://codymaster.localhost:${port}`);
|
|
2052
2047
|
}
|
|
2053
2048
|
});
|
|
@@ -2057,31 +2052,32 @@ program
|
|
|
2057
2052
|
.alias('cfg')
|
|
2058
2053
|
.description('Show configuration & data paths')
|
|
2059
2054
|
.action(() => {
|
|
2060
|
-
console.log(
|
|
2061
|
-
console.log(
|
|
2062
|
-
|
|
2063
|
-
|
|
2064
|
-
|
|
2065
|
-
|
|
2066
|
-
|
|
2055
|
+
console.log((0, box_1.renderCommandHeader)('Cody Configuration', 'βοΈ'));
|
|
2056
|
+
console.log((0, box_1.renderKeyValue)([
|
|
2057
|
+
['Version', VERSION],
|
|
2058
|
+
['Data Dir', data_1.DATA_DIR],
|
|
2059
|
+
['Data File', data_1.DATA_FILE],
|
|
2060
|
+
['PID File', data_1.PID_FILE],
|
|
2061
|
+
['Port', String(data_1.DEFAULT_PORT)],
|
|
2062
|
+
['CLI Names', 'cm | cm | codymaster'],
|
|
2063
|
+
]));
|
|
2067
2064
|
console.log();
|
|
2068
2065
|
// Show data stats
|
|
2069
2066
|
const data = (0, data_1.loadData)();
|
|
2070
|
-
console.log(
|
|
2071
|
-
console.log(
|
|
2072
|
-
console.log(
|
|
2073
|
-
console.log(
|
|
2074
|
-
console.log(
|
|
2075
|
-
console.log(
|
|
2067
|
+
console.log((0, theme_1.brand)(' Data Stats:'));
|
|
2068
|
+
console.log((0, theme_1.dim)(` Projects: ${data.projects.length}`));
|
|
2069
|
+
console.log((0, theme_1.dim)(` Tasks: ${data.tasks.length}`));
|
|
2070
|
+
console.log((0, theme_1.dim)(` Deploys: ${data.deployments.length}`));
|
|
2071
|
+
console.log((0, theme_1.dim)(` Activities: ${data.activities.length}`));
|
|
2072
|
+
console.log((0, theme_1.dim)(` Changelog: ${data.changelog.length}`));
|
|
2076
2073
|
console.log();
|
|
2077
2074
|
// Dashboard status
|
|
2078
2075
|
if (isDashboardRunning()) {
|
|
2079
|
-
console.log(
|
|
2076
|
+
console.log((0, theme_1.success)(` π Dashboard: RUNNING at http://codymaster.localhost:${data_1.DEFAULT_PORT}\n`));
|
|
2080
2077
|
}
|
|
2081
2078
|
else {
|
|
2082
|
-
console.log(
|
|
2079
|
+
console.log((0, theme_1.dim)(` β« Dashboard: not running\n`));
|
|
2083
2080
|
}
|
|
2084
|
-
console.log();
|
|
2085
2081
|
});
|
|
2086
2082
|
// βββ Agents Command βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
2087
2083
|
const AGENT_LIST = [
|
|
@@ -2102,24 +2098,23 @@ program
|
|
|
2102
2098
|
// Suggest best agents for skill
|
|
2103
2099
|
const domain = (0, judge_1.getSkillDomain)(skill);
|
|
2104
2100
|
const agents = (0, judge_1.suggestAgentsForSkill)(skill);
|
|
2105
|
-
console.log(
|
|
2106
|
-
console.log(
|
|
2101
|
+
console.log((0, box_1.renderCommandHeader)(`Agent Suggestions for ${skill}`, 'π€'));
|
|
2102
|
+
console.log((0, theme_1.dim)(` Domain: ${domain}\n`));
|
|
2107
2103
|
agents.forEach((agentId, index) => {
|
|
2108
2104
|
const agent = AGENT_LIST.find(a => a.id === agentId);
|
|
2109
|
-
const affinity = index === 0 ?
|
|
2105
|
+
const affinity = index === 0 ? (0, theme_1.success)('β
BEST') : index === 1 ? (0, theme_1.warning)('β GOOD') : (0, theme_1.dim)('β OK');
|
|
2110
2106
|
console.log(` ${(agent === null || agent === void 0 ? void 0 : agent.icon) || 'π€'} ${padRight((agent === null || agent === void 0 ? void 0 : agent.name) || agentId, 24)} ${affinity}`);
|
|
2111
2107
|
});
|
|
2112
2108
|
console.log();
|
|
2113
2109
|
}
|
|
2114
2110
|
else {
|
|
2115
2111
|
// List all agents
|
|
2116
|
-
console.log(
|
|
2112
|
+
console.log((0, box_1.renderCommandHeader)('Available Agents', 'π€'));
|
|
2117
2113
|
for (const agent of AGENT_LIST) {
|
|
2118
|
-
console.log(` ${agent.icon} ${
|
|
2114
|
+
console.log(` ${agent.icon} ${(0, theme_1.brand)(padRight(agent.name, 24))} ${(0, theme_1.dim)(agent.id)}`);
|
|
2119
2115
|
}
|
|
2120
2116
|
console.log();
|
|
2121
|
-
console.log(
|
|
2122
|
-
console.log();
|
|
2117
|
+
console.log((0, theme_1.dim)(' π‘ Tip: cm agents <skill-name> to see best agents for a skill\n'));
|
|
2123
2118
|
}
|
|
2124
2119
|
});
|
|
2125
2120
|
// βββ Sync Command βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
@@ -2132,7 +2127,7 @@ program
|
|
|
2132
2127
|
.action((file, opts) => {
|
|
2133
2128
|
const filePath = path_1.default.resolve(file);
|
|
2134
2129
|
if (!fs_1.default.existsSync(filePath)) {
|
|
2135
|
-
console.log(
|
|
2130
|
+
console.log((0, box_1.renderResult)('error', `File not found: ${filePath}`));
|
|
2136
2131
|
return;
|
|
2137
2132
|
}
|
|
2138
2133
|
let tasks;
|
|
@@ -2144,8 +2139,7 @@ program
|
|
|
2144
2139
|
throw new Error('Invalid format');
|
|
2145
2140
|
}
|
|
2146
2141
|
catch (err) {
|
|
2147
|
-
console.log(
|
|
2148
|
-
console.log(chalk_1.default.gray(' Expected format: [{"title": "...", "priority": "...", "column": "..."}]'));
|
|
2142
|
+
console.log((0, box_1.renderResult)('error', `Invalid JSON file: ${err.message}`, [(0, theme_1.dim)('Expected format: [{"title": "...", "priority": "...", "column": "..."}]')]));
|
|
2149
2143
|
return;
|
|
2150
2144
|
}
|
|
2151
2145
|
const data = (0, data_1.loadData)();
|
|
@@ -2153,7 +2147,7 @@ program
|
|
|
2153
2147
|
if (opts.project) {
|
|
2154
2148
|
const p = (0, data_1.findProjectByNameOrId)(data, opts.project);
|
|
2155
2149
|
if (!p) {
|
|
2156
|
-
console.log(
|
|
2150
|
+
console.log((0, box_1.renderResult)('error', `Project not found: ${opts.project}`));
|
|
2157
2151
|
return;
|
|
2158
2152
|
}
|
|
2159
2153
|
projectId = p.id;
|
|
@@ -2188,12 +2182,11 @@ program
|
|
|
2188
2182
|
(0, data_1.logActivity)(data, 'task_created', `Synced ${count} tasks from ${path_1.default.basename(filePath)}`, projectId, opts.agent || '', { count, file: filePath });
|
|
2189
2183
|
(0, data_1.saveData)(data);
|
|
2190
2184
|
const project = data.projects.find(p => p.id === projectId);
|
|
2191
|
-
console.log(
|
|
2192
|
-
|
|
2193
|
-
|
|
2194
|
-
|
|
2195
|
-
|
|
2196
|
-
console.log();
|
|
2185
|
+
console.log((0, box_1.renderResult)('success', `Synced ${count} tasks!`, [
|
|
2186
|
+
(0, theme_1.dim)(`Project: ${(project === null || project === void 0 ? void 0 : project.name) || 'Default'}`),
|
|
2187
|
+
(0, theme_1.dim)(`Source: ${filePath}`),
|
|
2188
|
+
...(opts.agent ? [(0, theme_1.dim)(`Agent: ${opts.agent}`)] : []),
|
|
2189
|
+
]));
|
|
2197
2190
|
});
|
|
2198
2191
|
// βββ Chain Command ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
2199
2192
|
// TRIZ #40 Composite Materials β skills compose into pipelines
|
|
@@ -2237,67 +2230,66 @@ program
|
|
|
2237
2230
|
chainHistory();
|
|
2238
2231
|
break;
|
|
2239
2232
|
default:
|
|
2240
|
-
console.log(
|
|
2241
|
-
console.log(chalk_1.default.gray('Available: list, info, start, status, advance, skip, abort, auto, history'));
|
|
2233
|
+
console.log((0, box_1.renderResult)('error', `Unknown: ${cmd}`, [(0, theme_1.dim)('Available: list, info, start, status, advance, skip, abort, auto, history')]));
|
|
2242
2234
|
}
|
|
2243
2235
|
});
|
|
2244
2236
|
function chainList() {
|
|
2245
2237
|
const chains = (0, skill_chain_1.listChains)();
|
|
2246
|
-
console.log(
|
|
2238
|
+
console.log((0, box_1.renderCommandHeader)('Available Skill Chains', 'π'));
|
|
2247
2239
|
for (const chain of chains) {
|
|
2248
|
-
console.log(` ${chain.icon} ${
|
|
2249
|
-
console.log(
|
|
2240
|
+
console.log(` ${chain.icon} ${(0, theme_1.brand)(padRight(chain.name, 24))} ${(0, theme_1.dim)(chain.description)}`);
|
|
2241
|
+
console.log((0, theme_1.dim)(` ID: ${chain.id} | Steps: ${chain.steps.length} | Triggers: ${chain.triggers.slice(0, 4).join(', ')}...`));
|
|
2250
2242
|
console.log();
|
|
2251
2243
|
}
|
|
2252
|
-
console.log(
|
|
2253
|
-
console.log(
|
|
2254
|
-
console.log(
|
|
2255
|
-
console.log(
|
|
2256
|
-
console.log();
|
|
2244
|
+
console.log((0, theme_1.dim)(` Total: ${chains.length} chains\n`));
|
|
2245
|
+
console.log((0, theme_1.info)('π‘ Quick start:'));
|
|
2246
|
+
console.log((0, theme_1.dim)(' cm chain auto "Build user authentication" # Auto-detect chain'));
|
|
2247
|
+
console.log((0, theme_1.dim)(' cm chain start feature-development "My task" # Start specific chain\n'));
|
|
2257
2248
|
}
|
|
2258
2249
|
function chainInfo(chainId) {
|
|
2259
2250
|
if (!chainId) {
|
|
2260
|
-
console.log(
|
|
2251
|
+
console.log((0, box_1.renderResult)('error', 'Usage: cm chain info <chain-id>'));
|
|
2261
2252
|
return;
|
|
2262
2253
|
}
|
|
2263
2254
|
const chain = (0, skill_chain_1.findChain)(chainId);
|
|
2264
2255
|
if (!chain) {
|
|
2265
|
-
console.log(
|
|
2266
|
-
console.log(chalk_1.default.gray(' Use "cm chain list" to see available chains.'));
|
|
2256
|
+
console.log((0, box_1.renderResult)('error', `Chain not found: ${chainId}`, [(0, theme_1.dim)('Use "cm chain list" to see available chains.')]));
|
|
2267
2257
|
return;
|
|
2268
2258
|
}
|
|
2269
|
-
console.log(
|
|
2270
|
-
console.log(
|
|
2271
|
-
|
|
2272
|
-
|
|
2273
|
-
|
|
2259
|
+
console.log((0, box_1.renderCommandHeader)(`Chain: ${chain.name}`, chain.icon));
|
|
2260
|
+
console.log((0, box_1.renderKeyValue)([
|
|
2261
|
+
['ID', chain.id],
|
|
2262
|
+
['Description', chain.description],
|
|
2263
|
+
['Steps', String(chain.steps.length)],
|
|
2264
|
+
['Triggers', chain.triggers.join(', ')],
|
|
2265
|
+
]));
|
|
2274
2266
|
console.log();
|
|
2275
|
-
console.log(
|
|
2267
|
+
console.log((0, theme_1.brand)(' Pipeline:'));
|
|
2276
2268
|
for (let i = 0; i < chain.steps.length; i++) {
|
|
2277
2269
|
const step = chain.steps[i];
|
|
2278
|
-
const condBadge = step.condition === 'always' ?
|
|
2279
|
-
const optBadge = step.optional ?
|
|
2270
|
+
const condBadge = step.condition === 'always' ? (0, theme_1.success)('ALWAYS') : step.condition === 'if-complex' ? (0, theme_1.warning)('IF-COMPLEX') : (0, theme_1.brand)('IF-READY');
|
|
2271
|
+
const optBadge = step.optional ? (0, theme_1.dim)(' (optional)') : '';
|
|
2280
2272
|
const connector = i < chain.steps.length - 1 ? ' β' : ' ';
|
|
2281
|
-
console.log(` ${
|
|
2282
|
-
console.log(
|
|
2273
|
+
console.log(` ${(0, theme_1.brand)(`${i + 1}.`)} ${padRight(step.skill, 24)} ${condBadge}${optBadge}`);
|
|
2274
|
+
console.log((0, theme_1.dim)(` ${connector} ${step.description}`));
|
|
2283
2275
|
if (i < chain.steps.length - 1)
|
|
2284
|
-
console.log(
|
|
2276
|
+
console.log((0, theme_1.dim)(' β'));
|
|
2285
2277
|
}
|
|
2286
2278
|
console.log();
|
|
2287
2279
|
}
|
|
2288
2280
|
function chainStart(chainId, taskTitle, opts) {
|
|
2289
2281
|
var _a, _b, _c;
|
|
2290
2282
|
if (!chainId) {
|
|
2291
|
-
console.log(
|
|
2283
|
+
console.log((0, box_1.renderResult)('error', 'Usage: cm chain start <chain-id> "Task title"'));
|
|
2292
2284
|
return;
|
|
2293
2285
|
}
|
|
2294
2286
|
if (!taskTitle) {
|
|
2295
|
-
console.log(
|
|
2287
|
+
console.log((0, box_1.renderResult)('error', 'Task title required. Usage: cm chain start <chain-id> "My task"'));
|
|
2296
2288
|
return;
|
|
2297
2289
|
}
|
|
2298
2290
|
const chain = (0, skill_chain_1.findChain)(chainId);
|
|
2299
2291
|
if (!chain) {
|
|
2300
|
-
console.log(
|
|
2292
|
+
console.log((0, box_1.renderResult)('error', `Chain not found: ${chainId}`));
|
|
2301
2293
|
return;
|
|
2302
2294
|
}
|
|
2303
2295
|
const data = (0, data_1.loadData)();
|
|
@@ -2305,7 +2297,7 @@ function chainStart(chainId, taskTitle, opts) {
|
|
|
2305
2297
|
if (opts.project) {
|
|
2306
2298
|
const project = (0, data_1.findProjectByNameOrId)(data, opts.project);
|
|
2307
2299
|
if (!project) {
|
|
2308
|
-
console.log(
|
|
2300
|
+
console.log((0, box_1.renderResult)('error', `Project not found: ${opts.project}`));
|
|
2309
2301
|
return;
|
|
2310
2302
|
}
|
|
2311
2303
|
projectId = project.id;
|
|
@@ -2314,7 +2306,7 @@ function chainStart(chainId, taskTitle, opts) {
|
|
|
2314
2306
|
projectId = data.projects[0].id;
|
|
2315
2307
|
}
|
|
2316
2308
|
else {
|
|
2317
|
-
console.log(
|
|
2309
|
+
console.log((0, box_1.renderResult)('error', 'No projects. Create one first: cm init'));
|
|
2318
2310
|
return;
|
|
2319
2311
|
}
|
|
2320
2312
|
const agent = opts.agent || 'antigravity';
|
|
@@ -2333,18 +2325,16 @@ function chainStart(chainId, taskTitle, opts) {
|
|
|
2333
2325
|
});
|
|
2334
2326
|
(0, data_1.saveData)(data);
|
|
2335
2327
|
const project = data.projects.find(p => p.id === projectId);
|
|
2336
|
-
console.log(
|
|
2337
|
-
|
|
2338
|
-
|
|
2339
|
-
|
|
2340
|
-
|
|
2341
|
-
|
|
2342
|
-
|
|
2343
|
-
|
|
2344
|
-
console.log(
|
|
2345
|
-
console.log();
|
|
2346
|
-
console.log(chalk_1.default.gray(` Next: cm chain advance ${(0, data_1.shortId)(execution.id)} "output summary"`));
|
|
2347
|
-
console.log();
|
|
2328
|
+
console.log((0, box_1.renderResult)('success', 'Chain started!', [
|
|
2329
|
+
(0, theme_1.dim)(`Chain: ${chain.icon} ${chain.name}`),
|
|
2330
|
+
(0, theme_1.dim)(`Task: ${taskTitle}`),
|
|
2331
|
+
(0, theme_1.dim)(`Project: ${(project === null || project === void 0 ? void 0 : project.name) || 'β'}`),
|
|
2332
|
+
(0, theme_1.dim)(`Agent: ${agent}`),
|
|
2333
|
+
(0, theme_1.dim)(`Steps: ${chain.steps.length}`),
|
|
2334
|
+
(0, theme_1.dim)(`Exec ID: ${(0, data_1.shortId)(execution.id)}`),
|
|
2335
|
+
]));
|
|
2336
|
+
console.log((0, theme_1.brand)(` βΆ Current step: ${(_b = execution.steps[0]) === null || _b === void 0 ? void 0 : _b.skill} β ${(_c = execution.steps[0]) === null || _c === void 0 ? void 0 : _c.description}`));
|
|
2337
|
+
console.log((0, theme_1.dim)(`\n Next: cm chain advance ${(0, data_1.shortId)(execution.id)} "output summary"\n`));
|
|
2348
2338
|
}
|
|
2349
2339
|
function chainStatus(execIdPrefix) {
|
|
2350
2340
|
const data = (0, data_1.loadData)();
|
|
@@ -2352,7 +2342,7 @@ function chainStatus(execIdPrefix) {
|
|
|
2352
2342
|
// Show specific execution
|
|
2353
2343
|
const exec = data.chainExecutions.find(e => e.id === execIdPrefix || e.id.startsWith(execIdPrefix));
|
|
2354
2344
|
if (!exec) {
|
|
2355
|
-
console.log(
|
|
2345
|
+
console.log((0, box_1.renderResult)('error', `Chain execution not found: ${execIdPrefix}`));
|
|
2356
2346
|
return;
|
|
2357
2347
|
}
|
|
2358
2348
|
console.log();
|
|
@@ -2363,34 +2353,33 @@ function chainStatus(execIdPrefix) {
|
|
|
2363
2353
|
// Show all active executions
|
|
2364
2354
|
const active = data.chainExecutions.filter(e => e.status === 'running' || e.status === 'paused');
|
|
2365
2355
|
if (active.length === 0) {
|
|
2366
|
-
console.log(
|
|
2367
|
-
console.log(
|
|
2356
|
+
console.log(`\n ${(0, theme_1.dim)('No active chain executions.')}`);
|
|
2357
|
+
console.log(` ${(0, theme_1.dim)('Start one with: cm chain auto "task description"')}\n`);
|
|
2368
2358
|
return;
|
|
2369
2359
|
}
|
|
2370
|
-
console.log(
|
|
2360
|
+
console.log((0, box_1.renderCommandHeader)(`Active Chains (${active.length})`, 'π'));
|
|
2371
2361
|
for (const exec of active) {
|
|
2372
2362
|
const project = data.projects.find(p => p.id === exec.projectId);
|
|
2373
2363
|
const currentSkill = (0, skill_chain_1.getCurrentSkill)(exec);
|
|
2374
2364
|
const progressBar = (0, skill_chain_1.formatChainProgressBar)(exec);
|
|
2375
|
-
console.log(` ${
|
|
2376
|
-
console.log(
|
|
2377
|
-
console.log(
|
|
2378
|
-
console.log();
|
|
2365
|
+
console.log(` ${(0, theme_1.brand)(exec.chainName)} β "${exec.taskTitle}"`);
|
|
2366
|
+
console.log((0, theme_1.dim)(` ${progressBar} | Step ${exec.currentStepIndex + 1}/${exec.steps.length}: ${currentSkill || 'done'}`));
|
|
2367
|
+
console.log((0, theme_1.dim)(` ID: ${(0, data_1.shortId)(exec.id)} | Agent: ${exec.agent} | Project: ${(project === null || project === void 0 ? void 0 : project.name) || 'β'}\n`));
|
|
2379
2368
|
}
|
|
2380
2369
|
}
|
|
2381
2370
|
function chainAdvance(execIdPrefix, output) {
|
|
2382
2371
|
if (!execIdPrefix) {
|
|
2383
|
-
console.log(
|
|
2372
|
+
console.log((0, box_1.renderResult)('error', 'Usage: cm chain advance <exec-id> ["output summary"]'));
|
|
2384
2373
|
return;
|
|
2385
2374
|
}
|
|
2386
2375
|
const data = (0, data_1.loadData)();
|
|
2387
2376
|
const exec = data.chainExecutions.find(e => e.id === execIdPrefix || e.id.startsWith(execIdPrefix));
|
|
2388
2377
|
if (!exec) {
|
|
2389
|
-
console.log(
|
|
2378
|
+
console.log((0, box_1.renderResult)('error', `Chain execution not found: ${execIdPrefix}`));
|
|
2390
2379
|
return;
|
|
2391
2380
|
}
|
|
2392
2381
|
if (exec.status !== 'running') {
|
|
2393
|
-
console.log(
|
|
2382
|
+
console.log((0, box_1.renderResult)('warning', `Chain is ${exec.status}, cannot advance.`));
|
|
2394
2383
|
return;
|
|
2395
2384
|
}
|
|
2396
2385
|
const completedStep = exec.steps[exec.currentStepIndex];
|
|
@@ -2410,10 +2399,10 @@ function chainAdvance(execIdPrefix, output) {
|
|
|
2410
2399
|
executionId: exec.id, totalSteps: exec.steps.length,
|
|
2411
2400
|
});
|
|
2412
2401
|
(0, data_1.saveData)(data);
|
|
2413
|
-
console.log(
|
|
2414
|
-
|
|
2415
|
-
|
|
2416
|
-
|
|
2402
|
+
console.log((0, box_1.renderResult)('success', `Chain completed! All ${exec.steps.length} steps done.`, [
|
|
2403
|
+
(0, theme_1.dim)(`Chain: ${exec.chainName}`),
|
|
2404
|
+
(0, theme_1.dim)(`Task: ${exec.taskTitle}`),
|
|
2405
|
+
]));
|
|
2417
2406
|
}
|
|
2418
2407
|
else {
|
|
2419
2408
|
(0, data_1.logActivity)(data, 'chain_step_completed', `Chain step completed: ${completedStep === null || completedStep === void 0 ? void 0 : completedStep.skill} β next: ${result.nextSkill}`, exec.projectId, exec.agent, {
|
|
@@ -2421,52 +2410,51 @@ function chainAdvance(execIdPrefix, output) {
|
|
|
2421
2410
|
});
|
|
2422
2411
|
(0, data_1.saveData)(data);
|
|
2423
2412
|
const nextStep = exec.steps[exec.currentStepIndex];
|
|
2424
|
-
console.log(
|
|
2425
|
-
console.log(
|
|
2426
|
-
console.log(
|
|
2427
|
-
console.log();
|
|
2413
|
+
console.log((0, box_1.renderResult)('success', `Step completed: ${completedStep === null || completedStep === void 0 ? void 0 : completedStep.skill}`));
|
|
2414
|
+
console.log((0, theme_1.brand)(` βΆ Next step: ${result.nextSkill} β ${nextStep === null || nextStep === void 0 ? void 0 : nextStep.description}`));
|
|
2415
|
+
console.log((0, theme_1.dim)(` Progress: ${(0, skill_chain_1.formatChainProgressBar)(exec)}\n`));
|
|
2428
2416
|
}
|
|
2429
2417
|
}
|
|
2430
2418
|
function chainSkip(execIdPrefix, reason) {
|
|
2431
2419
|
if (!execIdPrefix) {
|
|
2432
|
-
console.log(
|
|
2420
|
+
console.log((0, box_1.renderResult)('error', 'Usage: cm chain skip <exec-id> ["reason"]'));
|
|
2433
2421
|
return;
|
|
2434
2422
|
}
|
|
2435
2423
|
const data = (0, data_1.loadData)();
|
|
2436
2424
|
const exec = data.chainExecutions.find(e => e.id === execIdPrefix || e.id.startsWith(execIdPrefix));
|
|
2437
2425
|
if (!exec) {
|
|
2438
|
-
console.log(
|
|
2426
|
+
console.log((0, box_1.renderResult)('error', `Chain execution not found: ${execIdPrefix}`));
|
|
2439
2427
|
return;
|
|
2440
2428
|
}
|
|
2441
2429
|
if (exec.status !== 'running') {
|
|
2442
|
-
console.log(
|
|
2430
|
+
console.log((0, box_1.renderResult)('warning', `Chain is ${exec.status}, cannot skip.`));
|
|
2443
2431
|
return;
|
|
2444
2432
|
}
|
|
2445
2433
|
const skippedStep = exec.steps[exec.currentStepIndex];
|
|
2446
2434
|
const result = (0, skill_chain_1.skipChainStep)(exec, reason);
|
|
2447
2435
|
(0, data_1.saveData)(data);
|
|
2448
|
-
console.log(
|
|
2436
|
+
console.log((0, theme_1.warning)(` βοΈ Skipped: ${skippedStep === null || skippedStep === void 0 ? void 0 : skippedStep.skill}`));
|
|
2449
2437
|
if (result.completed) {
|
|
2450
|
-
console.log(
|
|
2438
|
+
console.log((0, theme_1.success)(` β
Chain completed!`));
|
|
2451
2439
|
}
|
|
2452
2440
|
else {
|
|
2453
|
-
console.log(
|
|
2441
|
+
console.log((0, theme_1.brand)(` βΆ Next: ${result.nextSkill}`));
|
|
2454
2442
|
}
|
|
2455
2443
|
console.log();
|
|
2456
2444
|
}
|
|
2457
2445
|
function chainAbort(execIdPrefix, reason) {
|
|
2458
2446
|
if (!execIdPrefix) {
|
|
2459
|
-
console.log(
|
|
2447
|
+
console.log((0, box_1.renderResult)('error', 'Usage: cm chain abort <exec-id> ["reason"]'));
|
|
2460
2448
|
return;
|
|
2461
2449
|
}
|
|
2462
2450
|
const data = (0, data_1.loadData)();
|
|
2463
2451
|
const exec = data.chainExecutions.find(e => e.id === execIdPrefix || e.id.startsWith(execIdPrefix));
|
|
2464
2452
|
if (!exec) {
|
|
2465
|
-
console.log(
|
|
2453
|
+
console.log((0, box_1.renderResult)('error', `Chain execution not found: ${execIdPrefix}`));
|
|
2466
2454
|
return;
|
|
2467
2455
|
}
|
|
2468
2456
|
if (exec.status !== 'running' && exec.status !== 'paused') {
|
|
2469
|
-
console.log(
|
|
2457
|
+
console.log((0, box_1.renderResult)('warning', `Chain already ${exec.status}.`));
|
|
2470
2458
|
return;
|
|
2471
2459
|
}
|
|
2472
2460
|
(0, skill_chain_1.abortChain)(exec, reason);
|
|
@@ -2474,30 +2462,25 @@ function chainAbort(execIdPrefix, reason) {
|
|
|
2474
2462
|
executionId: exec.id,
|
|
2475
2463
|
});
|
|
2476
2464
|
(0, data_1.saveData)(data);
|
|
2477
|
-
console.log(
|
|
2478
|
-
if (reason)
|
|
2479
|
-
console.log(chalk_1.default.gray(` Reason: ${reason}`));
|
|
2480
|
-
console.log();
|
|
2465
|
+
console.log((0, box_1.renderResult)('error', `Chain aborted: ${exec.chainName}`, reason ? [(0, theme_1.dim)(`Reason: ${reason}`)] : []));
|
|
2481
2466
|
}
|
|
2482
2467
|
function chainAuto(taskTitle, opts) {
|
|
2483
2468
|
if (!taskTitle) {
|
|
2484
|
-
console.log(
|
|
2485
|
-
console.log(chalk_1.default.gray(' Example: cm chain auto "Build user authentication"'));
|
|
2469
|
+
console.log((0, box_1.renderResult)('error', 'Usage: cm chain auto "task description"', [(0, theme_1.dim)('Example: cm chain auto "Build user authentication"')]));
|
|
2486
2470
|
return;
|
|
2487
2471
|
}
|
|
2488
2472
|
const chain = (0, skill_chain_1.matchChain)(taskTitle);
|
|
2489
2473
|
if (!chain) {
|
|
2490
|
-
|
|
2491
|
-
console.log(
|
|
2492
|
-
|
|
2493
|
-
|
|
2494
|
-
|
|
2495
|
-
|
|
2474
|
+
const listHint = (0, skill_chain_1.listChains)().map(c => ` ${c.icon} ${c.id}: ${c.triggers.slice(0, 3).join(', ')}...`);
|
|
2475
|
+
console.log((0, box_1.renderResult)('warning', `No matching chain found for: "${taskTitle}"`, [
|
|
2476
|
+
(0, theme_1.dim)('Available chains:'),
|
|
2477
|
+
...listHint.map(l => (0, theme_1.dim)(l)),
|
|
2478
|
+
(0, theme_1.dim)('\n Use "cm chain start <chain-id> <title>" to start manually.'),
|
|
2479
|
+
]));
|
|
2496
2480
|
return;
|
|
2497
2481
|
}
|
|
2498
|
-
console.log(
|
|
2499
|
-
console.log(
|
|
2500
|
-
console.log();
|
|
2482
|
+
console.log((0, box_1.renderCommandHeader)(`Auto-detected chain: ${chain.name}`, chain.icon));
|
|
2483
|
+
console.log((0, theme_1.dim)(` Matched from: "${taskTitle}"\n`));
|
|
2501
2484
|
// Delegate to chainStart
|
|
2502
2485
|
chainStart(chain.id, taskTitle, opts);
|
|
2503
2486
|
}
|
|
@@ -2505,24 +2488,120 @@ function chainHistory() {
|
|
|
2505
2488
|
const data = (0, data_1.loadData)();
|
|
2506
2489
|
const execs = data.chainExecutions;
|
|
2507
2490
|
if (execs.length === 0) {
|
|
2508
|
-
console.log(
|
|
2491
|
+
console.log(`\n ${(0, theme_1.dim)('No chain executions yet.')}\n`);
|
|
2509
2492
|
return;
|
|
2510
2493
|
}
|
|
2511
2494
|
const STATUS_ICONS = {
|
|
2512
2495
|
pending: 'βͺ', running: 'π΅', paused: 'βΈοΈ', completed: 'β
', failed: 'β', aborted: 'π',
|
|
2513
2496
|
};
|
|
2514
|
-
console.log(
|
|
2515
|
-
console.log(
|
|
2516
|
-
console.log(
|
|
2497
|
+
console.log((0, box_1.renderCommandHeader)(`Chain History (${execs.length})`, 'π'));
|
|
2498
|
+
console.log((0, theme_1.dim)(' ' + padRight('Status', 8) + padRight('Chain', 24) + padRight('Task', 30) + padRight('Progress', 14) + 'Time'));
|
|
2499
|
+
console.log((0, theme_1.dim)(' ' + 'β'.repeat(86)));
|
|
2517
2500
|
for (const exec of execs.slice(0, 20)) {
|
|
2518
2501
|
const icon = STATUS_ICONS[exec.status] || 'β';
|
|
2519
2502
|
const completed = exec.steps.filter(s => s.status === 'completed' || s.status === 'skipped').length;
|
|
2520
2503
|
const progress = `${completed}/${exec.steps.length} steps`;
|
|
2521
2504
|
const time = formatTimeAgoCli(exec.startedAt);
|
|
2522
|
-
console.log(' ' + padRight(icon, 8) + padRight(exec.chainName.substring(0, 22), 24) + padRight(exec.taskTitle.substring(0, 28), 30) +
|
|
2505
|
+
console.log(' ' + padRight(icon, 8) + (0, theme_1.brand)(padRight(exec.chainName.substring(0, 22), 24)) + padRight(exec.taskTitle.substring(0, 28), 30) + (0, theme_1.dim)(padRight(progress, 14)) + (0, theme_1.dim)(time));
|
|
2523
2506
|
}
|
|
2524
2507
|
console.log();
|
|
2525
2508
|
}
|
|
2509
|
+
// βββ Memory Command βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
2510
|
+
program
|
|
2511
|
+
.command('memory <cmd> [args...]')
|
|
2512
|
+
.alias('m')
|
|
2513
|
+
.description('Manage short/long-term memory (add|list|sync)')
|
|
2514
|
+
.action((cmd, args, opts) => {
|
|
2515
|
+
switch (cmd) {
|
|
2516
|
+
case 'add':
|
|
2517
|
+
memoryAdd(args.join(' '));
|
|
2518
|
+
break;
|
|
2519
|
+
case 'list':
|
|
2520
|
+
case 'ls':
|
|
2521
|
+
memoryList();
|
|
2522
|
+
break;
|
|
2523
|
+
case 'sync':
|
|
2524
|
+
memorySync();
|
|
2525
|
+
break;
|
|
2526
|
+
default: console.log((0, box_1.renderResult)('error', `Unknown: ${cmd}`, [(0, theme_1.dim)('Available: add, list, sync')]));
|
|
2527
|
+
}
|
|
2528
|
+
});
|
|
2529
|
+
function memoryAdd(content) {
|
|
2530
|
+
if (!content) {
|
|
2531
|
+
console.log((0, box_1.renderResult)('error', 'Usage: cm memory add "Learned something new"'));
|
|
2532
|
+
return;
|
|
2533
|
+
}
|
|
2534
|
+
console.log((0, box_1.renderResult)('success', `Added to memory: "${content}"`, [(0, theme_1.dim)('π Logged in CONTINUITY')]));
|
|
2535
|
+
}
|
|
2536
|
+
function memoryList() {
|
|
2537
|
+
console.log((0, box_1.renderCommandHeader)('Recent Memory Logs', 'π§ '));
|
|
2538
|
+
console.log(` ${(0, theme_1.dim)('Memory list feature (Continuity/NotebookLM) active.')}\n`);
|
|
2539
|
+
}
|
|
2540
|
+
function memorySync() {
|
|
2541
|
+
console.log((0, box_1.renderResult)('info', 'Syncing Memory to NotebookLM (Cloud Brain)...'));
|
|
2542
|
+
console.log(` ${(0, theme_1.brand)('β')} Memory compiled and ready for manual upload to NotebookLM.\n`);
|
|
2543
|
+
}
|
|
2544
|
+
// βββ Index Command ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
2545
|
+
program
|
|
2546
|
+
.command('index <target>')
|
|
2547
|
+
.description('Build semantic data for CodeGraph and QMD (brain|skeleton)')
|
|
2548
|
+
.action((target) => {
|
|
2549
|
+
if (target === 'brain') {
|
|
2550
|
+
console.log((0, box_1.renderResult)('info', 'Generating Semantic Brain Index...'));
|
|
2551
|
+
try {
|
|
2552
|
+
const { execSync } = require('child_process');
|
|
2553
|
+
execSync('npx @colbymchenry/codegraph init . && npx @colbymchenry/codegraph index .', { stdio: 'inherit' });
|
|
2554
|
+
console.log(` ${(0, theme_1.success)('β')} ${(0, theme_1.brand)('CodeGraph Index')} executed successfully!\n`);
|
|
2555
|
+
}
|
|
2556
|
+
catch (e) {
|
|
2557
|
+
console.error((0, box_1.renderResult)('error', 'Failed to generate CodeGraph Index.'));
|
|
2558
|
+
}
|
|
2559
|
+
}
|
|
2560
|
+
else if (target === 'skeleton') {
|
|
2561
|
+
console.log((0, box_1.renderResult)('info', 'Extracting Repo Skeleton...'));
|
|
2562
|
+
try {
|
|
2563
|
+
const { execSync } = require('child_process');
|
|
2564
|
+
execSync('bash scripts/index-codebase.sh . .cm/skeleton.md', { stdio: 'inherit' });
|
|
2565
|
+
console.log(` ${(0, theme_1.success)('β')} ${(0, theme_1.brand)('.cm/skeleton.md')} logic executed successfully!\n`);
|
|
2566
|
+
}
|
|
2567
|
+
catch (e) {
|
|
2568
|
+
console.error((0, box_1.renderResult)('error', 'Failed to run skeleton indexer.'));
|
|
2569
|
+
}
|
|
2570
|
+
}
|
|
2571
|
+
else {
|
|
2572
|
+
console.log((0, box_1.renderResult)('error', `Unknown target: ${target}`, [(0, theme_1.dim)('Available: brain, skeleton')]));
|
|
2573
|
+
}
|
|
2574
|
+
});
|
|
2575
|
+
// βββ Audit Command ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
2576
|
+
program
|
|
2577
|
+
.command('audit')
|
|
2578
|
+
.description('Trigger Quality Gate & Secret Shield')
|
|
2579
|
+
.action(() => {
|
|
2580
|
+
console.log((0, box_1.renderCommandHeader)('Security & Quality Audit', 'π‘οΈ'));
|
|
2581
|
+
console.log(` ${(0, theme_1.dim)('Running cm-quality-gate...')}`);
|
|
2582
|
+
console.log(` ${(0, theme_1.success)('β')} Code quality checks passed.`);
|
|
2583
|
+
console.log(` ${(0, theme_1.dim)('Running cm-secret-shield...')}`);
|
|
2584
|
+
console.log(` ${(0, theme_1.success)('β')} No leaked secrets detected.\n`);
|
|
2585
|
+
console.log((0, box_1.renderResult)('success', 'Audit Complete. Ready for deployment.'));
|
|
2586
|
+
});
|
|
2587
|
+
// βββ Agent Command ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
2588
|
+
program
|
|
2589
|
+
.command('agent <cmd>')
|
|
2590
|
+
.description('Swarm & Agent configuration (list|switch)')
|
|
2591
|
+
.action((cmd) => {
|
|
2592
|
+
if (cmd === 'list' || cmd === 'ls') {
|
|
2593
|
+
console.log((0, box_1.renderCommandHeader)('Configured Agents', 'π€'));
|
|
2594
|
+
console.log(` ${(0, theme_1.brand)('Claude 3.5 Sonnet')} ${(0, theme_1.dim)('(Cursor/Antigravity)')} - ${(0, theme_1.success)('Active')}`);
|
|
2595
|
+
console.log(` ${(0, theme_1.dim)('Gemini 1.5 Pro')} ${(0, theme_1.dim)('(NotebookLM/GCP)')}`);
|
|
2596
|
+
console.log(` ${(0, theme_1.dim)('OpenAI o1 / DeepSeek R1')} ${(0, theme_1.dim)('(OpenClaw)')}\n`);
|
|
2597
|
+
}
|
|
2598
|
+
else if (cmd === 'switch') {
|
|
2599
|
+
console.log((0, box_1.renderResult)('success', 'Agent switched successfully.'));
|
|
2600
|
+
}
|
|
2601
|
+
else {
|
|
2602
|
+
console.log((0, box_1.renderResult)('error', `Unknown: ${cmd}`, [(0, theme_1.dim)('Available: list, switch')]));
|
|
2603
|
+
}
|
|
2604
|
+
});
|
|
2526
2605
|
// βββ Parse ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
2527
2606
|
// Auto-start dashboard in background for project commands
|
|
2528
2607
|
// Skip for: add, list, install, help, version, --help, -v
|