imhcode 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/ISSUE_TEMPLATE/bug_report.md +41 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +39 -0
- package/.github/PULL_REQUEST_TEMPLATE.md +29 -0
- package/.github/copilot-instructions.md +43 -0
- package/.github/workflows/framework-validator.yml +53 -0
- package/.gitignore.template +15 -0
- package/AGENTS.md +69 -0
- package/CLAUDE.md +27 -0
- package/README.md +63 -0
- package/SETUP.md +81 -0
- package/USER_MANUAL.md +70 -0
- package/agents/android-executor/SYSTEM.md +32 -0
- package/agents/android-executor/agent.yml +53 -0
- package/agents/debugger/SYSTEM.md +32 -0
- package/agents/debugger/agent.yml +56 -0
- package/agents/designer/SYSTEM.md +32 -0
- package/agents/designer/agent.yml +59 -0
- package/agents/devops-executor/SYSTEM.md +32 -0
- package/agents/devops-executor/agent.yml +56 -0
- package/agents/flutter-executor/SYSTEM.md +32 -0
- package/agents/flutter-executor/agent.yml +54 -0
- package/agents/ios-executor/SYSTEM.md +32 -0
- package/agents/ios-executor/agent.yml +53 -0
- package/agents/java-executor/SYSTEM.md +32 -0
- package/agents/java-executor/agent.yml +57 -0
- package/agents/laravel-executor/SYSTEM.md +32 -0
- package/agents/laravel-executor/agent.yml +59 -0
- package/agents/nextjs-executor/SYSTEM.md +32 -0
- package/agents/nextjs-executor/agent.yml +60 -0
- package/agents/planner/SYSTEM.md +32 -0
- package/agents/planner/agent.yml +56 -0
- package/agents/python-executor/SYSTEM.md +32 -0
- package/agents/python-executor/agent.yml +58 -0
- package/agents/react-executor/SYSTEM.md +32 -0
- package/agents/react-executor/agent.yml +58 -0
- package/agents/react-native-executor/SYSTEM.md +32 -0
- package/agents/react-native-executor/agent.yml +53 -0
- package/agents/security-auditor/SYSTEM.md +32 -0
- package/agents/security-auditor/agent.yml +56 -0
- package/agents/seo-optimizer/SYSTEM.md +32 -0
- package/agents/seo-optimizer/agent.yml +54 -0
- package/agents/systems-executor/SYSTEM.md +32 -0
- package/agents/systems-executor/agent.yml +54 -0
- package/agents/tester/SYSTEM.md +32 -0
- package/agents/tester/agent.yml +58 -0
- package/agents/vue-executor/SYSTEM.md +32 -0
- package/agents/vue-executor/agent.yml +58 -0
- package/agents/web3-executor/SYSTEM.md +32 -0
- package/agents/web3-executor/agent.yml +55 -0
- package/bin/imhcode.js +1634 -0
- package/dist/orchestrator/builder.d.ts +23 -0
- package/dist/orchestrator/builder.d.ts.map +1 -0
- package/dist/orchestrator/builder.js +231 -0
- package/dist/orchestrator/builder.js.map +1 -0
- package/dist/orchestrator/executor.d.ts +43 -0
- package/dist/orchestrator/executor.d.ts.map +1 -0
- package/dist/orchestrator/executor.js +356 -0
- package/dist/orchestrator/executor.js.map +1 -0
- package/dist/orchestrator/index.d.ts +35 -0
- package/dist/orchestrator/index.d.ts.map +1 -0
- package/dist/orchestrator/index.js +490 -0
- package/dist/orchestrator/index.js.map +1 -0
- package/dist/orchestrator/loader.d.ts +33 -0
- package/dist/orchestrator/loader.d.ts.map +1 -0
- package/dist/orchestrator/loader.js +203 -0
- package/dist/orchestrator/loader.js.map +1 -0
- package/dist/orchestrator/registry.d.ts +63 -0
- package/dist/orchestrator/registry.d.ts.map +1 -0
- package/dist/orchestrator/registry.js +181 -0
- package/dist/orchestrator/registry.js.map +1 -0
- package/dist/orchestrator/schema.d.ts +132 -0
- package/dist/orchestrator/schema.d.ts.map +1 -0
- package/dist/orchestrator/schema.js +101 -0
- package/dist/orchestrator/schema.js.map +1 -0
- package/dist/orchestrator/session.d.ts +25 -0
- package/dist/orchestrator/session.d.ts.map +1 -0
- package/dist/orchestrator/session.js +80 -0
- package/dist/orchestrator/session.js.map +1 -0
- package/dist/orchestrator/types.d.ts +91 -0
- package/dist/orchestrator/types.d.ts.map +1 -0
- package/dist/orchestrator/types.js +7 -0
- package/dist/orchestrator/types.js.map +1 -0
- package/package.json +95 -0
- package/skills/AnimatePresence/SKILL.md +3 -0
- package/skills/accessibility/SKILL.md +146 -0
- package/skills/agent-architecture-audit/SKILL.md +256 -0
- package/skills/agent-eval/SKILL.md +145 -0
- package/skills/agent-introspection-debugging/SKILL.md +153 -0
- package/skills/agentic-engineering/SKILL.md +63 -0
- package/skills/ai-regression-testing/SKILL.md +385 -0
- package/skills/android-clean-architecture/SKILL.md +339 -0
- package/skills/animated-component-libraries/SKILL.md +8 -0
- package/skills/animejs/SKILL.md +8 -0
- package/skills/api-connector-builder/SKILL.md +120 -0
- package/skills/api-design/SKILL.md +523 -0
- package/skills/apple/SKILL.md +158 -0
- package/skills/apple/metadata.json +16 -0
- package/skills/architecture-decision-records/SKILL.md +179 -0
- package/skills/article-writing/SKILL.md +79 -0
- package/skills/automation-audit-ops/SKILL.md +142 -0
- package/skills/awwwards/SKILL.md +162 -0
- package/skills/awwwards/metadata.json +16 -0
- package/skills/babylonjs-engine/SKILL.md +8 -0
- package/skills/backend-patterns/SKILL.md +561 -0
- package/skills/baqir-docs/SKILL.md +3 -0
- package/skills/barba-js/SKILL.md +8 -0
- package/skills/benchmark/SKILL.md +93 -0
- package/skills/best-practice/SKILL.md +7 -0
- package/skills/best-practice/assets/claude-memory/claude-memory-monorepo.jpg +0 -0
- package/skills/best-practice/assets/claude-power-ups/dial-the-model-1.png +0 -0
- package/skills/best-practice/assets/claude-power-ups/dial-the-model-2.png +0 -0
- package/skills/best-practice/assets/claude-power-ups/dial-the-model-3.png +0 -0
- package/skills/best-practice/assets/claude-power-ups/powerup-menu.png +0 -0
- package/skills/best-practice/claude-cli-startup-flags.md +231 -0
- package/skills/best-practice/claude-commands.md +132 -0
- package/skills/best-practice/claude-mcp.md +132 -0
- package/skills/best-practice/claude-memory.md +121 -0
- package/skills/best-practice/claude-power-ups.md +66 -0
- package/skills/best-practice/claude-settings.md +1170 -0
- package/skills/best-practice/claude-skills.md +58 -0
- package/skills/best-practice/claude-subagents.md +56 -0
- package/skills/blender-motion-state-inspection/SKILL.md +164 -0
- package/skills/bootstrap-patterns/SKILL.md +316 -0
- package/skills/brand-guidelines/LICENSE.txt +202 -0
- package/skills/brand-guidelines/SKILL.md +73 -0
- package/skills/brand-voice/SKILL.md +97 -0
- package/skills/brand-voice/references/voice-profile-schema.md +55 -0
- package/skills/browser-qa/SKILL.md +87 -0
- package/skills/canary-watch/SKILL.md +107 -0
- package/skills/canvas-design/LICENSE.txt +202 -0
- package/skills/canvas-design/SKILL.md +8 -0
- package/skills/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/BigShoulders-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/Boldonse-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/DMMono-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/EricaOne-OFL.txt +94 -0
- package/skills/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/GeistMono-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/Gloock-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/Italiana-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/Jura-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/Lora-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/NationalPark-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/Outfit-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/PixelifySans-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/PoiretOne-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/RedHatMono-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/Silkscreen-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/SmoochSans-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/Tektur-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/WorkSans-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/YoungSerif-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
- package/skills/caveman/SKILL.md +74 -0
- package/skills/changelog-generator/SKILL.md +104 -0
- package/skills/cisco-ios-patterns/SKILL.md +163 -0
- package/skills/ckm:design-system/SKILL.md +3 -0
- package/skills/ckm:slides/SKILL.md +3 -0
- package/skills/claude-red/SKILL.md +35 -0
- package/skills/click-path-audit/SKILL.md +244 -0
- package/skills/clickhouse-io/SKILL.md +439 -0
- package/skills/codebase-onboarding/SKILL.md +233 -0
- package/skills/coding-standards/SKILL.md +549 -0
- package/skills/compose-multiplatform-patterns/SKILL.md +299 -0
- package/skills/computational-architecture/SKILL.md +31 -0
- package/skills/content-engine/SKILL.md +131 -0
- package/skills/content-research-writer/SKILL.md +538 -0
- package/skills/continuous-agent-loop/SKILL.md +45 -0
- package/skills/cost-aware-llm-pipeline/SKILL.md +183 -0
- package/skills/cpp-coding-standards/SKILL.md +723 -0
- package/skills/crosspost/SKILL.md +111 -0
- package/skills/css-container-queries/SKILL.md +132 -0
- package/skills/customer-billing-ops/SKILL.md +140 -0
- package/skills/customs-trade-compliance/SKILL.md +263 -0
- package/skills/dart-flutter-patterns/SKILL.md +563 -0
- package/skills/dashboard-builder/SKILL.md +108 -0
- package/skills/data-scraper-agent/SKILL.md +764 -0
- package/skills/database-migrations/SKILL.md +429 -0
- package/skills/deep-research/SKILL.md +159 -0
- package/skills/defi-amm-security/SKILL.md +166 -0
- package/skills/deployment-patterns/SKILL.md +427 -0
- package/skills/design-auditor/README.md +504 -0
- package/skills/design-auditor/README_KR.md +327 -0
- package/skills/design-auditor/SKILL.md +8 -0
- package/skills/design-auditor/references/animation.md +300 -0
- package/skills/design-auditor/references/color.md +241 -0
- package/skills/design-auditor/references/corner-radius.md +331 -0
- package/skills/design-auditor/references/elevation.md +249 -0
- package/skills/design-auditor/references/ethics.md +877 -0
- package/skills/design-auditor/references/figma-mcp.md +377 -0
- package/skills/design-auditor/references/heuristics.md +730 -0
- package/skills/design-auditor/references/i18n.md +254 -0
- package/skills/design-auditor/references/iconography.md +201 -0
- package/skills/design-auditor/references/microcopy.md +227 -0
- package/skills/design-auditor/references/navigation.md +311 -0
- package/skills/design-auditor/references/spacing.md +313 -0
- package/skills/design-auditor/references/states.md +254 -0
- package/skills/design-auditor/references/tokens.md +286 -0
- package/skills/design-auditor/references/typography.md +273 -0
- package/skills/design-system/SKILL.md +82 -0
- package/skills/design-tokens-system/SKILL.md +156 -0
- package/skills/development-workflows/SKILL.md +7 -0
- package/skills/development-workflows/cross-model-workflow/assets/cross-model-workflow.png +0 -0
- package/skills/development-workflows/cross-model-workflow/cross-model-workflow.md +55 -0
- package/skills/development-workflows/rpi/.claude/agents/code-reviewer.md +21 -0
- package/skills/development-workflows/rpi/.claude/agents/constitutional-validator.md +288 -0
- package/skills/development-workflows/rpi/.claude/agents/documentation-analyst-writer.md +64 -0
- package/skills/development-workflows/rpi/.claude/agents/product-manager.md +15 -0
- package/skills/development-workflows/rpi/.claude/agents/requirement-parser.md +238 -0
- package/skills/development-workflows/rpi/.claude/agents/senior-software-engineer.md +15 -0
- package/skills/development-workflows/rpi/.claude/agents/technical-cto-advisor.md +201 -0
- package/skills/development-workflows/rpi/.claude/agents/ux-designer.md +14 -0
- package/skills/development-workflows/rpi/.claude/commands/rpi/implement.md +634 -0
- package/skills/development-workflows/rpi/.claude/commands/rpi/plan.md +416 -0
- package/skills/development-workflows/rpi/.claude/commands/rpi/research.md +381 -0
- package/skills/development-workflows/rpi/rpi-workflow.md +101 -0
- package/skills/development-workflows/rpi/rpi-workflow.svg +178 -0
- package/skills/django-celery/SKILL.md +457 -0
- package/skills/django-patterns/SKILL.md +734 -0
- package/skills/django-security/SKILL.md +593 -0
- package/skills/django-tdd/SKILL.md +729 -0
- package/skills/dmux-workflows/SKILL.md +7 -0
- package/skills/docker-patterns/SKILL.md +364 -0
- package/skills/documentation-lookup/SKILL.md +90 -0
- package/skills/domain-name-brainstormer/SKILL.md +212 -0
- package/skills/dribbble/SKILL.md +160 -0
- package/skills/dribbble/metadata.json +16 -0
- package/skills/e2e-testing/SKILL.md +326 -0
- package/skills/empirical-research/SKILL.md +22 -0
- package/skills/error-handling/SKILL.md +376 -0
- package/skills/eval-harness/SKILL.md +270 -0
- package/skills/evm-token-decimals/SKILL.md +130 -0
- package/skills/fastapi-patterns/SKILL.md +327 -0
- package/skills/finance-billing-ops/SKILL.md +127 -0
- package/skills/flox-environments/SKILL.md +496 -0
- package/skills/flutter-dart-code-review/SKILL.md +435 -0
- package/skills/foundation-models-on-device/SKILL.md +243 -0
- package/skills/framer/SKILL.md +159 -0
- package/skills/framer/metadata.json +16 -0
- package/skills/frontend-design/LICENSE.txt +21 -0
- package/skills/frontend-design/README.md +71 -0
- package/skills/frontend-design/SKILL.md +115 -0
- package/skills/frontend-design-direction/SKILL.md +92 -0
- package/skills/frontend-patterns/SKILL.md +7 -0
- package/skills/frontend-slides/SKILL.md +184 -0
- package/skills/frontend-slides/STYLE_PRESETS.md +330 -0
- package/skills/frontend-slides/animation-patterns.md +122 -0
- package/skills/frontend-slides/html-template.md +419 -0
- package/skills/frontend-slides/scripts/export-pdf.sh +418 -0
- package/skills/frontend-slides/scripts/extract-pptx.py +96 -0
- package/skills/frontend-slides/viewport-base.css +153 -0
- package/skills/gateguard/SKILL.md +125 -0
- package/skills/git-workflow/SKILL.md +715 -0
- package/skills/github-ops/SKILL.md +144 -0
- package/skills/golang-patterns/SKILL.md +674 -0
- package/skills/golang-testing/SKILL.md +720 -0
- package/skills/graphify/__init__.py +28 -0
- package/skills/graphify/__main__.py +2899 -0
- package/skills/graphify/analyze.py +608 -0
- package/skills/graphify/benchmark.py +152 -0
- package/skills/graphify/build.py +366 -0
- package/skills/graphify/cache.py +244 -0
- package/skills/graphify/callflow_html.py +2014 -0
- package/skills/graphify/cluster.py +267 -0
- package/skills/graphify/dedup.py +414 -0
- package/skills/graphify/detect.py +1018 -0
- package/skills/graphify/export.py +1264 -0
- package/skills/graphify/extract.py +6646 -0
- package/skills/graphify/global_graph.py +155 -0
- package/skills/graphify/google_workspace.py +223 -0
- package/skills/graphify/hooks.py +304 -0
- package/skills/graphify/ingest.py +331 -0
- package/skills/graphify/llm.py +1111 -0
- package/skills/graphify/manifest.py +4 -0
- package/skills/graphify/prs.py +746 -0
- package/skills/graphify/report.py +203 -0
- package/skills/graphify/security.py +242 -0
- package/skills/graphify/serve.py +899 -0
- package/skills/graphify/skill-aider.md +1229 -0
- package/skills/graphify/skill-claw.md +1229 -0
- package/skills/graphify/skill-codex.md +1290 -0
- package/skills/graphify/skill-copilot.md +1317 -0
- package/skills/graphify/skill-droid.md +1285 -0
- package/skills/graphify/skill-kiro.md +1228 -0
- package/skills/graphify/skill-opencode.md +1340 -0
- package/skills/graphify/skill-pi.md +1228 -0
- package/skills/graphify/skill-trae.md +1254 -0
- package/skills/graphify/skill-vscode.md +258 -0
- package/skills/graphify/skill-windows.md +1434 -0
- package/skills/graphify/skill.md +1086 -0
- package/skills/graphify/transcribe.py +184 -0
- package/skills/graphify/tree_html.py +580 -0
- package/skills/graphify/validate.py +72 -0
- package/skills/graphify/watch.py +728 -0
- package/skills/graphify/wiki.py +259 -0
- package/skills/growth-marketing/SKILL.md +26 -0
- package/skills/gsap-scrolltrigger/SKILL.md +8 -0
- package/skills/healthcare-cdss-patterns/SKILL.md +245 -0
- package/skills/healthcare-emr-patterns/SKILL.md +159 -0
- package/skills/healthcare-phi-compliance/SKILL.md +145 -0
- package/skills/hexagonal-architecture/SKILL.md +276 -0
- package/skills/hipaa-compliance/SKILL.md +78 -0
- package/skills/homelab-network-setup/SKILL.md +129 -0
- package/skills/imhcode/SKILL.md +183 -0
- package/skills/imhcode-brainstorm/SKILL.md +37 -0
- package/skills/imhcode-codebase-knowledge/SKILL.md +37 -0
- package/skills/imhcode-codebase-knowledge/assets/templates/ARCHITECTURE.md +49 -0
- package/skills/imhcode-codebase-knowledge/assets/templates/CONCERNS.md +56 -0
- package/skills/imhcode-codebase-knowledge/assets/templates/CONVENTIONS.md +52 -0
- package/skills/imhcode-codebase-knowledge/assets/templates/INTEGRATIONS.md +48 -0
- package/skills/imhcode-codebase-knowledge/assets/templates/STACK.md +56 -0
- package/skills/imhcode-codebase-knowledge/assets/templates/STRUCTURE.md +44 -0
- package/skills/imhcode-codebase-knowledge/assets/templates/TESTING.md +57 -0
- package/skills/imhcode-codebase-knowledge/references/inquiry-checkpoints.md +70 -0
- package/skills/imhcode-codebase-knowledge/references/stack-detection.md +131 -0
- package/skills/imhcode-codebase-knowledge/scripts/scan.py +712 -0
- package/skills/imhcode-dispatch/SKILL.md +31 -0
- package/skills/imhcode-saas-architect/SKILL.md +55 -0
- package/skills/imhcode-security/SKILL.md +42 -0
- package/skills/imhcode-sprint-planner/SKILL.md +42 -0
- package/skills/inventory-demand-planning/SKILL.md +247 -0
- package/skills/investor-materials/SKILL.md +96 -0
- package/skills/investor-outreach/SKILL.md +91 -0
- package/skills/ios-icon-gen/SKILL.md +157 -0
- package/skills/ios-icon-gen/scripts/generate_icons.swift +258 -0
- package/skills/ios-icon-gen/scripts/iconify_gen.sh +235 -0
- package/skills/java-coding-standards/SKILL.md +383 -0
- package/skills/jpa-patterns/SKILL.md +151 -0
- package/skills/kotlin-ktor-patterns/SKILL.md +689 -0
- package/skills/kotlin-patterns/SKILL.md +711 -0
- package/skills/laravel-patterns/SKILL.md +415 -0
- package/skills/laravel-plugin-discovery/SKILL.md +229 -0
- package/skills/laravel-security/SKILL.md +285 -0
- package/skills/laravel-tdd/SKILL.md +283 -0
- package/skills/laravel-verification/SKILL.md +179 -0
- package/skills/lightweight-3d-effects/SKILL.md +8 -0
- package/skills/linear/SKILL.md +156 -0
- package/skills/linear/metadata.json +16 -0
- package/skills/liquid-glass-design/SKILL.md +279 -0
- package/skills/llm-trading-agent-security/SKILL.md +146 -0
- package/skills/locomotive-scroll/SKILL.md +8 -0
- package/skills/logistics-exception-management/SKILL.md +222 -0
- package/skills/lottie-animations/SKILL.md +8 -0
- package/skills/make-interfaces-feel-better/SKILL.md +151 -0
- package/skills/mcp-server-patterns/SKILL.md +69 -0
- package/skills/meeting-insights-analyzer/SKILL.md +327 -0
- package/skills/micro-interactions/SKILL.md +178 -0
- package/skills/mle-workflow/SKILL.md +346 -0
- package/skills/mobbin/SKILL.md +157 -0
- package/skills/mobbin/metadata.json +16 -0
- package/skills/mobile-app-design/README.md +302 -0
- package/skills/mobile-app-design/SKILL.md +330 -0
- package/skills/mobile-app-design/examples/design-system-config.ts +685 -0
- package/skills/mobile-app-design/examples/form-validation-example.tsx +501 -0
- package/skills/mobile-app-design/examples/optimized-list-example.tsx +384 -0
- package/skills/mobile-app-design/examples/profile-screen-example.tsx +450 -0
- package/skills/mobile-app-design/references/accessibility-checklist.md +525 -0
- package/skills/mobile-app-design/references/android-guidelines.md +582 -0
- package/skills/mobile-app-design/references/common-mistakes.md +834 -0
- package/skills/mobile-app-design/references/ios-guidelines.md +421 -0
- package/skills/mobile-app-design/references/performance-patterns.md +705 -0
- package/skills/mobile-app-design/references/platform-differences.md +353 -0
- package/skills/mobile-app-design/references/ui-libraries.md +729 -0
- package/skills/mobile-app-design/scripts/accessibility-audit.sh +281 -0
- package/skills/mobile-app-design/scripts/check-contrast.py +188 -0
- package/skills/mobile-app-design/scripts/validate-touch-targets.sh +228 -0
- package/skills/mobile-app-ui-design/INDEX.md +131 -0
- package/skills/mobile-app-ui-design/README.md +135 -0
- package/skills/mobile-app-ui-design/SKILL.md +7 -0
- package/skills/mobile-app-ui-design/references/industry-conventions.md +151 -0
- package/skills/modern-web-design/SKILL.md +8 -0
- package/skills/motion-advanced/SKILL.md +596 -0
- package/skills/motion-design/SKILL.md +21 -0
- package/skills/motion-foundations/SKILL.md +299 -0
- package/skills/motion-framer/SKILL.md +8 -0
- package/skills/motion-patterns/SKILL.md +435 -0
- package/skills/motion-ui/SKILL.md +575 -0
- package/skills/mysql-patterns/SKILL.md +412 -0
- package/skills/nestjs-patterns/SKILL.md +230 -0
- package/skills/network-config-validation/SKILL.md +210 -0
- package/skills/nextjs-turbopack/SKILL.md +44 -0
- package/skills/nodejs-keccak256/SKILL.md +102 -0
- package/skills/nothing-design/SKILL.md +177 -0
- package/skills/nothing-design/references/components.md +153 -0
- package/skills/nothing-design/references/platform-mapping.md +64 -0
- package/skills/nothing-design/references/tokens.md +142 -0
- package/skills/nuxt4-patterns/SKILL.md +100 -0
- package/skills/openclaw-persona-forge/SKILL.md +288 -0
- package/skills/openclaw-persona-forge/gacha.py +224 -0
- package/skills/openclaw-persona-forge/gacha.sh +5 -0
- package/skills/openclaw-persona-forge/references/avatar-style.md +124 -0
- package/skills/openclaw-persona-forge/references/boundary-rules.md +53 -0
- package/skills/openclaw-persona-forge/references/error-handling.md +53 -0
- package/skills/openclaw-persona-forge/references/identity-tension.md +48 -0
- package/skills/openclaw-persona-forge/references/naming-system.md +39 -0
- package/skills/openclaw-persona-forge/references/output-template.md +166 -0
- package/skills/orchestration-workflow/SKILL.md +199 -0
- package/skills/orchestration-workflow/orchestration-workflow.gif +0 -0
- package/skills/orchestration-workflow/orchestration-workflow.md +199 -0
- package/skills/orchestration-workflow/orchestration-workflow.svg +78 -0
- package/skills/orchestration-workflow/output.md +13 -0
- package/skills/orchestration-workflow/weather.svg +6 -0
- package/skills/pixijs-2d/SKILL.md +8 -0
- package/skills/plan-orchestrate/SKILL.md +262 -0
- package/skills/plankton-code-quality/SKILL.md +236 -0
- package/skills/postgres-patterns/SKILL.md +147 -0
- package/skills/ppt-mckinsey/SKILL.md +27 -0
- package/skills/prisma-patterns/SKILL.md +371 -0
- package/skills/product-capability/SKILL.md +141 -0
- package/skills/product-lens/SKILL.md +92 -0
- package/skills/production-audit/SKILL.md +206 -0
- package/skills/project-flow-ops/SKILL.md +111 -0
- package/skills/prompt-optimizer/SKILL.md +398 -0
- package/skills/python-patterns/SKILL.md +750 -0
- package/skills/python-testing/SKILL.md +816 -0
- package/skills/pytorch-patterns/SKILL.md +396 -0
- package/skills/quarkus-patterns/SKILL.md +722 -0
- package/skills/radix-ui-primitives/SKILL.md +86 -0
- package/skills/react-native-best-practices/SKILL.md +83 -0
- package/skills/react-native-brownfield-migration/SKILL.md +115 -0
- package/skills/react-spring-physics/SKILL.md +8 -0
- package/skills/react-three-fiber/SKILL.md +8 -0
- package/skills/recsys-pipeline-architect/SKILL.md +114 -0
- package/skills/redis-patterns/SKILL.md +403 -0
- package/skills/remotion-video-creation/SKILL.md +43 -0
- package/skills/remotion-video-creation/rules/3d.md +86 -0
- package/skills/remotion-video-creation/rules/animations.md +29 -0
- package/skills/remotion-video-creation/rules/assets/charts-bar-chart.tsx +173 -0
- package/skills/remotion-video-creation/rules/assets/text-animations-typewriter.tsx +100 -0
- package/skills/remotion-video-creation/rules/assets/text-animations-word-highlight.tsx +108 -0
- package/skills/remotion-video-creation/rules/assets.md +78 -0
- package/skills/remotion-video-creation/rules/audio.md +172 -0
- package/skills/remotion-video-creation/rules/calculate-metadata.md +104 -0
- package/skills/remotion-video-creation/rules/can-decode.md +75 -0
- package/skills/remotion-video-creation/rules/charts.md +58 -0
- package/skills/remotion-video-creation/rules/compositions.md +146 -0
- package/skills/remotion-video-creation/rules/display-captions.md +126 -0
- package/skills/remotion-video-creation/rules/extract-frames.md +229 -0
- package/skills/remotion-video-creation/rules/fonts.md +152 -0
- package/skills/remotion-video-creation/rules/get-audio-duration.md +58 -0
- package/skills/remotion-video-creation/rules/get-video-dimensions.md +68 -0
- package/skills/remotion-video-creation/rules/get-video-duration.md +58 -0
- package/skills/remotion-video-creation/rules/gifs.md +138 -0
- package/skills/remotion-video-creation/rules/images.md +130 -0
- package/skills/remotion-video-creation/rules/import-srt-captions.md +67 -0
- package/skills/remotion-video-creation/rules/lottie.md +67 -0
- package/skills/remotion-video-creation/rules/measuring-dom-nodes.md +34 -0
- package/skills/remotion-video-creation/rules/measuring-text.md +143 -0
- package/skills/remotion-video-creation/rules/sequencing.md +106 -0
- package/skills/remotion-video-creation/rules/tailwind.md +11 -0
- package/skills/remotion-video-creation/rules/text-animations.md +20 -0
- package/skills/remotion-video-creation/rules/timing.md +179 -0
- package/skills/remotion-video-creation/rules/transcribe-captions.md +19 -0
- package/skills/remotion-video-creation/rules/transitions.md +122 -0
- package/skills/remotion-video-creation/rules/trimming.md +52 -0
- package/skills/remotion-video-creation/rules/videos.md +171 -0
- package/skills/repo-scan/SKILL.md +78 -0
- package/skills/responsive-email-templates/SKILL.md +110 -0
- package/skills/rive-interactive/SKILL.md +8 -0
- package/skills/rust-patterns/SKILL.md +499 -0
- package/skills/rust-testing/SKILL.md +500 -0
- package/skills/scroll-reveal-libraries/SKILL.md +8 -0
- package/skills/security-bounty-hunter/SKILL.md +99 -0
- package/skills/security-review/SKILL.md +503 -0
- package/skills/security-review/cloud-infrastructure-security.md +361 -0
- package/skills/security-scan/SKILL.md +165 -0
- package/skills/seo/SKILL.md +154 -0
- package/skills/seo-growth/SKILL.md +34 -0
- package/skills/shadcn-ui-patterns/SKILL.md +123 -0
- package/skills/spline-interactive/SKILL.md +8 -0
- package/skills/springboot-patterns/SKILL.md +314 -0
- package/skills/springboot-security/SKILL.md +272 -0
- package/skills/springboot-tdd/SKILL.md +158 -0
- package/skills/strategic-compact/SKILL.md +131 -0
- package/skills/stripe/SKILL.md +168 -0
- package/skills/stripe/metadata.json +16 -0
- package/skills/swift-actor-persistence/SKILL.md +143 -0
- package/skills/swift-concurrency-6-2/SKILL.md +216 -0
- package/skills/swiftui-patterns/SKILL.md +259 -0
- package/skills/systematic-debugging/CREATION-LOG.md +119 -0
- package/skills/systematic-debugging/SKILL.md +296 -0
- package/skills/systematic-debugging/condition-based-waiting-example.ts +158 -0
- package/skills/systematic-debugging/condition-based-waiting.md +115 -0
- package/skills/systematic-debugging/defense-in-depth.md +122 -0
- package/skills/systematic-debugging/find-polluter.sh +63 -0
- package/skills/systematic-debugging/root-cause-tracing.md +169 -0
- package/skills/systematic-debugging/test-academic.md +14 -0
- package/skills/systematic-debugging/test-pressure-1.md +58 -0
- package/skills/systematic-debugging/test-pressure-2.md +68 -0
- package/skills/systematic-debugging/test-pressure-3.md +69 -0
- package/skills/tailwindcss-v4/SKILL.md +107 -0
- package/skills/tdd-workflow/SKILL.md +463 -0
- package/skills/team-builder/SKILL.md +168 -0
- package/skills/test-driven-development/SKILL.md +371 -0
- package/skills/test-driven-development/testing-anti-patterns.md +299 -0
- package/skills/theme-factory/LICENSE.txt +202 -0
- package/skills/theme-factory/SKILL.md +59 -0
- package/skills/theme-factory/theme-showcase.pdf +0 -0
- package/skills/theme-factory/themes/arctic-frost.md +19 -0
- package/skills/theme-factory/themes/botanical-garden.md +19 -0
- package/skills/theme-factory/themes/desert-rose.md +19 -0
- package/skills/theme-factory/themes/forest-canopy.md +19 -0
- package/skills/theme-factory/themes/golden-hour.md +19 -0
- package/skills/theme-factory/themes/midnight-galaxy.md +19 -0
- package/skills/theme-factory/themes/modern-minimalist.md +19 -0
- package/skills/theme-factory/themes/ocean-depths.md +19 -0
- package/skills/theme-factory/themes/sunset-boulevard.md +19 -0
- package/skills/theme-factory/themes/tech-innovation.md +19 -0
- package/skills/threejs-webgl/SKILL.md +8 -0
- package/skills/trailofbits-auditing/SKILL.md +30 -0
- package/skills/twitter-algorithm-optimizer/SKILL.md +327 -0
- package/skills/typeui-cli/SKILL.md +90 -0
- package/skills/typeui-main/DESIGN.md +114 -0
- package/skills/typeui-main/LICENSE.md +9 -0
- package/skills/typeui-main/README.md +84 -0
- package/skills/typeui-main/REGISTRY.md +60 -0
- package/skills/typeui-main/SKILL.md +114 -0
- package/skills/typeui-main/package-lock.json +2123 -0
- package/skills/typeui-main/package.json +56 -0
- package/skills/typeui-main/skills/typeui-cli/SKILL.md +90 -0
- package/skills/typeui-main/src/cli.ts +282 -0
- package/skills/typeui-main/src/config.ts +28 -0
- package/skills/typeui-main/src/domain/designSystemSchema.ts +77 -0
- package/skills/typeui-main/src/generation/existingDesignSystem.ts +228 -0
- package/skills/typeui-main/src/generation/randomDesignSystem.ts +348 -0
- package/skills/typeui-main/src/generation/runDesignGeneration.ts +31 -0
- package/skills/typeui-main/src/generation/runGeneration.ts +36 -0
- package/skills/typeui-main/src/generation/runPull.ts +62 -0
- package/skills/typeui-main/src/io/updateSkillFile.ts +118 -0
- package/skills/typeui-main/src/prompts/designSystem.ts +755 -0
- package/skills/typeui-main/src/prompts/registry.ts +72 -0
- package/skills/typeui-main/src/registry/registryClient.ts +246 -0
- package/skills/typeui-main/src/renderers/claudeRenderer.ts +10 -0
- package/skills/typeui-main/src/renderers/codexRenderer.ts +10 -0
- package/skills/typeui-main/src/renderers/cursorRenderer.ts +10 -0
- package/skills/typeui-main/src/renderers/index.ts +14 -0
- package/skills/typeui-main/src/renderers/openCodeRenderer.ts +10 -0
- package/skills/typeui-main/src/renderers/shared.ts +252 -0
- package/skills/typeui-main/src/skillMetadata.ts +19 -0
- package/skills/typeui-main/src/types.ts +204 -0
- package/skills/typeui-main/src/ui/banner.ts +20 -0
- package/skills/typeui-main/test/existingDesignSystem.test.ts +67 -0
- package/skills/typeui-main/test/orchestrator.test.ts +113 -0
- package/skills/typeui-main/test/randomDesignSystem.test.ts +20 -0
- package/skills/typeui-main/test/registryClient.test.ts +408 -0
- package/skills/typeui-main/test/renderers.test.ts +41 -0
- package/skills/typeui-main/test/runDesignGeneration.test.ts +52 -0
- package/skills/typeui-main/test/runPull.test.ts +92 -0
- package/skills/typeui-main/test/skillMetadata.test.ts +11 -0
- package/skills/typeui-main/test/updateSkillFile.test.ts +160 -0
- package/skills/typeui-main/tsconfig.json +16 -0
- package/skills/ui-demo/SKILL.md +465 -0
- package/skills/ui-to-vue/SKILL.md +134 -0
- package/skills/ui-ux-pro-max/.claude/skills/banner-design/SKILL.md +192 -0
- package/skills/ui-ux-pro-max/.claude/skills/banner-design/references/banner-sizes-and-styles.md +118 -0
- package/skills/ui-ux-pro-max/.claude/skills/brand/SKILL.md +97 -0
- package/skills/ui-ux-pro-max/.claude/skills/brand/references/approval-checklist.md +169 -0
- package/skills/ui-ux-pro-max/.claude/skills/brand/references/asset-organization.md +157 -0
- package/skills/ui-ux-pro-max/.claude/skills/brand/references/brand-guideline-template.md +140 -0
- package/skills/ui-ux-pro-max/.claude/skills/brand/references/color-palette-management.md +186 -0
- package/skills/ui-ux-pro-max/.claude/skills/brand/references/consistency-checklist.md +94 -0
- package/skills/ui-ux-pro-max/.claude/skills/brand/references/logo-usage-rules.md +185 -0
- package/skills/ui-ux-pro-max/.claude/skills/brand/references/messaging-framework.md +85 -0
- package/skills/ui-ux-pro-max/.claude/skills/brand/references/typography-specifications.md +214 -0
- package/skills/ui-ux-pro-max/.claude/skills/brand/references/update.md +118 -0
- package/skills/ui-ux-pro-max/.claude/skills/brand/references/visual-identity.md +96 -0
- package/skills/ui-ux-pro-max/.claude/skills/brand/references/voice-framework.md +88 -0
- package/skills/ui-ux-pro-max/.claude/skills/brand/scripts/extract-colors.cjs +341 -0
- package/skills/ui-ux-pro-max/.claude/skills/brand/scripts/inject-brand-context.cjs +349 -0
- package/skills/ui-ux-pro-max/.claude/skills/brand/scripts/sync-brand-to-tokens.cjs +266 -0
- package/skills/ui-ux-pro-max/.claude/skills/brand/scripts/validate-asset.cjs +387 -0
- package/skills/ui-ux-pro-max/.claude/skills/brand/templates/brand-guidelines-starter.md +275 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/SKILL.md +302 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/data/cip/deliverables.csv +51 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/data/cip/industries.csv +21 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/data/cip/mockup-contexts.csv +21 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/data/cip/styles.csv +21 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/data/icon/styles.csv +16 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/data/logo/colors.csv +56 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/data/logo/industries.csv +56 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/data/logo/styles.csv +56 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/references/banner-sizes-and-styles.md +118 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/references/cip-deliverable-guide.md +95 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/references/cip-design.md +121 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/references/cip-prompt-engineering.md +84 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/references/cip-style-guide.md +68 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/references/design-routing.md +207 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/references/icon-design.md +122 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/references/logo-color-psychology.md +101 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/references/logo-design.md +92 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/references/logo-prompt-engineering.md +158 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/references/logo-style-guide.md +109 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/references/slides-copywriting-formulas.md +84 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/references/slides-create.md +4 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/references/slides-html-template.md +295 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/references/slides-layout-patterns.md +137 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/references/slides-strategies.md +94 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/references/slides.md +42 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/references/social-photos-design.md +329 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/scripts/cip/core.py +215 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/scripts/cip/generate.py +484 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/scripts/cip/render-html.py +424 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/scripts/cip/search.py +127 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/scripts/icon/generate.py +487 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/scripts/logo/core.py +175 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/scripts/logo/generate.py +362 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/scripts/logo/search.py +114 -0
- package/skills/ui-ux-pro-max/.claude/skills/design-system/SKILL.md +244 -0
- package/skills/ui-ux-pro-max/.claude/skills/design-system/data/slide-backgrounds.csv +11 -0
- package/skills/ui-ux-pro-max/.claude/skills/design-system/data/slide-charts.csv +26 -0
- package/skills/ui-ux-pro-max/.claude/skills/design-system/data/slide-color-logic.csv +14 -0
- package/skills/ui-ux-pro-max/.claude/skills/design-system/data/slide-copy.csv +26 -0
- package/skills/ui-ux-pro-max/.claude/skills/design-system/data/slide-layout-logic.csv +16 -0
- package/skills/ui-ux-pro-max/.claude/skills/design-system/data/slide-layouts.csv +26 -0
- package/skills/ui-ux-pro-max/.claude/skills/design-system/data/slide-strategies.csv +16 -0
- package/skills/ui-ux-pro-max/.claude/skills/design-system/data/slide-typography.csv +15 -0
- package/skills/ui-ux-pro-max/.claude/skills/design-system/references/component-specs.md +236 -0
- package/skills/ui-ux-pro-max/.claude/skills/design-system/references/component-tokens.md +214 -0
- package/skills/ui-ux-pro-max/.claude/skills/design-system/references/primitive-tokens.md +203 -0
- package/skills/ui-ux-pro-max/.claude/skills/design-system/references/semantic-tokens.md +215 -0
- package/skills/ui-ux-pro-max/.claude/skills/design-system/references/states-and-variants.md +241 -0
- package/skills/ui-ux-pro-max/.claude/skills/design-system/references/tailwind-integration.md +251 -0
- package/skills/ui-ux-pro-max/.claude/skills/design-system/references/token-architecture.md +224 -0
- package/skills/ui-ux-pro-max/.claude/skills/design-system/scripts/embed-tokens.cjs +99 -0
- package/skills/ui-ux-pro-max/.claude/skills/design-system/scripts/fetch-background.py +317 -0
- package/skills/ui-ux-pro-max/.claude/skills/design-system/scripts/generate-slide.py +753 -0
- package/skills/ui-ux-pro-max/.claude/skills/design-system/scripts/generate-tokens.cjs +205 -0
- package/skills/ui-ux-pro-max/.claude/skills/design-system/scripts/html-token-validator.py +327 -0
- package/skills/ui-ux-pro-max/.claude/skills/design-system/scripts/search-slides.py +218 -0
- package/skills/ui-ux-pro-max/.claude/skills/design-system/scripts/slide-token-validator.py +35 -0
- package/skills/ui-ux-pro-max/.claude/skills/design-system/scripts/slide_search_core.py +453 -0
- package/skills/ui-ux-pro-max/.claude/skills/design-system/scripts/validate-tokens.cjs +251 -0
- package/skills/ui-ux-pro-max/.claude/skills/design-system/templates/design-tokens-starter.json +143 -0
- package/skills/ui-ux-pro-max/.claude/skills/slides/SKILL.md +42 -0
- package/skills/ui-ux-pro-max/.claude/skills/slides/references/copywriting-formulas.md +84 -0
- package/skills/ui-ux-pro-max/.claude/skills/slides/references/create.md +4 -0
- package/skills/ui-ux-pro-max/.claude/skills/slides/references/html-template.md +295 -0
- package/skills/ui-ux-pro-max/.claude/skills/slides/references/layout-patterns.md +137 -0
- package/skills/ui-ux-pro-max/.claude/skills/slides/references/slide-strategies.md +94 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/LICENSE.txt +202 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/SKILL.md +324 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/ArsenalSC-OFL.txt +93 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/BigShoulders-OFL.txt +93 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/Boldonse-OFL.txt +93 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/CrimsonPro-OFL.txt +93 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/DMMono-OFL.txt +93 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/EricaOne-OFL.txt +94 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/GeistMono-OFL.txt +93 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/Gloock-OFL.txt +93 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/InstrumentSans-OFL.txt +93 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/Italiana-OFL.txt +93 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/Jura-Light.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/Jura-Medium.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/Jura-OFL.txt +93 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/Lora-Bold.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/Lora-Italic.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/Lora-OFL.txt +93 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/Lora-Regular.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/NationalPark-OFL.txt +93 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/Outfit-OFL.txt +93 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/PixelifySans-OFL.txt +93 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/PoiretOne-OFL.txt +93 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/RedHatMono-OFL.txt +93 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/Silkscreen-OFL.txt +93 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/SmoochSans-OFL.txt +93 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/Tektur-OFL.txt +93 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/WorkSans-OFL.txt +93 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/YoungSerif-OFL.txt +93 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/YoungSerif-Regular.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/references/canvas-design-system.md +320 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/references/shadcn-accessibility.md +471 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/references/shadcn-components.md +424 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/references/shadcn-theming.md +373 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/references/tailwind-customization.md +483 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/references/tailwind-responsive.md +382 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/references/tailwind-utilities.md +455 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/scripts/.coverage +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/scripts/requirements.txt +17 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/scripts/shadcn_add.py +292 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/scripts/tailwind_config_gen.py +456 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/scripts/tests/coverage-ui.json +1 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/scripts/tests/requirements.txt +3 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/scripts/tests/test_shadcn_add.py +266 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/scripts/tests/test_tailwind_config_gen.py +336 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-ux-pro-max/SKILL.md +659 -0
- package/skills/ui-ux-pro-max/.claude-plugin/marketplace.json +35 -0
- package/skills/ui-ux-pro-max/.claude-plugin/plugin.json +11 -0
- package/skills/ui-ux-pro-max/.github/workflows/claude-code-review.yml +44 -0
- package/skills/ui-ux-pro-max/.github/workflows/claude.yml +50 -0
- package/skills/ui-ux-pro-max/.github/workflows/python-package-conda.yml +34 -0
- package/skills/ui-ux-pro-max/CLAUDE.md +98 -0
- package/skills/ui-ux-pro-max/LICENSE +21 -0
- package/skills/ui-ux-pro-max/README.md +513 -0
- package/skills/ui-ux-pro-max/SKILL.md +292 -0
- package/skills/ui-ux-pro-max/cli/README.md +63 -0
- package/skills/ui-ux-pro-max/cli/assets/data/_sync_all.py +414 -0
- package/skills/ui-ux-pro-max/cli/assets/data/app-interface.csv +31 -0
- package/skills/ui-ux-pro-max/cli/assets/data/charts.csv +26 -0
- package/skills/ui-ux-pro-max/cli/assets/data/colors.csv +162 -0
- package/skills/ui-ux-pro-max/cli/assets/data/design.csv +1776 -0
- package/skills/ui-ux-pro-max/cli/assets/data/draft.csv +1779 -0
- package/skills/ui-ux-pro-max/cli/assets/data/google-fonts.csv +1924 -0
- package/skills/ui-ux-pro-max/cli/assets/data/icons.csv +105 -0
- package/skills/ui-ux-pro-max/cli/assets/data/landing.csv +31 -0
- package/skills/ui-ux-pro-max/cli/assets/data/products.csv +162 -0
- package/skills/ui-ux-pro-max/cli/assets/data/react-performance.csv +45 -0
- package/skills/ui-ux-pro-max/cli/assets/data/stacks/angular.csv +51 -0
- package/skills/ui-ux-pro-max/cli/assets/data/stacks/astro.csv +54 -0
- package/skills/ui-ux-pro-max/cli/assets/data/stacks/flutter.csv +53 -0
- package/skills/ui-ux-pro-max/cli/assets/data/stacks/html-tailwind.csv +56 -0
- package/skills/ui-ux-pro-max/cli/assets/data/stacks/jetpack-compose.csv +53 -0
- package/skills/ui-ux-pro-max/cli/assets/data/stacks/laravel.csv +51 -0
- package/skills/ui-ux-pro-max/cli/assets/data/stacks/nextjs.csv +53 -0
- package/skills/ui-ux-pro-max/cli/assets/data/stacks/nuxt-ui.csv +51 -0
- package/skills/ui-ux-pro-max/cli/assets/data/stacks/nuxtjs.csv +59 -0
- package/skills/ui-ux-pro-max/cli/assets/data/stacks/react-native.csv +52 -0
- package/skills/ui-ux-pro-max/cli/assets/data/stacks/react.csv +54 -0
- package/skills/ui-ux-pro-max/cli/assets/data/stacks/shadcn.csv +61 -0
- package/skills/ui-ux-pro-max/cli/assets/data/stacks/svelte.csv +54 -0
- package/skills/ui-ux-pro-max/cli/assets/data/stacks/swiftui.csv +51 -0
- package/skills/ui-ux-pro-max/cli/assets/data/stacks/threejs.csv +54 -0
- package/skills/ui-ux-pro-max/cli/assets/data/stacks/vue.csv +50 -0
- package/skills/ui-ux-pro-max/cli/assets/data/styles.csv +85 -0
- package/skills/ui-ux-pro-max/cli/assets/data/typography.csv +74 -0
- package/skills/ui-ux-pro-max/cli/assets/data/ui-reasoning.csv +162 -0
- package/skills/ui-ux-pro-max/cli/assets/data/ux-guidelines.csv +100 -0
- package/skills/ui-ux-pro-max/cli/assets/scripts/core.py +247 -0
- package/skills/ui-ux-pro-max/cli/assets/scripts/design_system.py +1148 -0
- package/skills/ui-ux-pro-max/cli/assets/scripts/search.py +114 -0
- package/skills/ui-ux-pro-max/cli/assets/templates/base/quick-reference.md +297 -0
- package/skills/ui-ux-pro-max/cli/assets/templates/base/skill-content.md +353 -0
- package/skills/ui-ux-pro-max/cli/assets/templates/platforms/agent.json +21 -0
- package/skills/ui-ux-pro-max/cli/assets/templates/platforms/augment.json +18 -0
- package/skills/ui-ux-pro-max/cli/assets/templates/platforms/claude.json +21 -0
- package/skills/ui-ux-pro-max/cli/assets/templates/platforms/codebuddy.json +21 -0
- package/skills/ui-ux-pro-max/cli/assets/templates/platforms/codex.json +21 -0
- package/skills/ui-ux-pro-max/cli/assets/templates/platforms/continue.json +21 -0
- package/skills/ui-ux-pro-max/cli/assets/templates/platforms/copilot.json +21 -0
- package/skills/ui-ux-pro-max/cli/assets/templates/platforms/cursor.json +21 -0
- package/skills/ui-ux-pro-max/cli/assets/templates/platforms/droid.json +21 -0
- package/skills/ui-ux-pro-max/cli/assets/templates/platforms/gemini.json +21 -0
- package/skills/ui-ux-pro-max/cli/assets/templates/platforms/kilocode.json +21 -0
- package/skills/ui-ux-pro-max/cli/assets/templates/platforms/kiro.json +21 -0
- package/skills/ui-ux-pro-max/cli/assets/templates/platforms/opencode.json +21 -0
- package/skills/ui-ux-pro-max/cli/assets/templates/platforms/qoder.json +21 -0
- package/skills/ui-ux-pro-max/cli/assets/templates/platforms/roocode.json +21 -0
- package/skills/ui-ux-pro-max/cli/assets/templates/platforms/trae.json +21 -0
- package/skills/ui-ux-pro-max/cli/assets/templates/platforms/warp.json +18 -0
- package/skills/ui-ux-pro-max/cli/assets/templates/platforms/windsurf.json +21 -0
- package/skills/ui-ux-pro-max/cli/bun.lock +77 -0
- package/skills/ui-ux-pro-max/cli/package-lock.json +370 -0
- package/skills/ui-ux-pro-max/cli/package.json +48 -0
- package/skills/ui-ux-pro-max/cli/src/commands/init.ts +216 -0
- package/skills/ui-ux-pro-max/cli/src/commands/uninstall.ts +135 -0
- package/skills/ui-ux-pro-max/cli/src/commands/update.ts +36 -0
- package/skills/ui-ux-pro-max/cli/src/commands/versions.ts +42 -0
- package/skills/ui-ux-pro-max/cli/src/index.ts +83 -0
- package/skills/ui-ux-pro-max/cli/src/types/index.ts +68 -0
- package/skills/ui-ux-pro-max/cli/src/utils/detect.ts +120 -0
- package/skills/ui-ux-pro-max/cli/src/utils/extract.ts +149 -0
- package/skills/ui-ux-pro-max/cli/src/utils/github.ts +104 -0
- package/skills/ui-ux-pro-max/cli/src/utils/logger.ts +11 -0
- package/skills/ui-ux-pro-max/cli/src/utils/template.ts +243 -0
- package/skills/ui-ux-pro-max/cli/tsconfig.json +17 -0
- package/skills/ui-ux-pro-max/data/charts.csv +26 -0
- package/skills/ui-ux-pro-max/data/colors.csv +97 -0
- package/skills/ui-ux-pro-max/data/icons.csv +101 -0
- package/skills/ui-ux-pro-max/data/landing.csv +31 -0
- package/skills/ui-ux-pro-max/data/products.csv +97 -0
- package/skills/ui-ux-pro-max/data/react-performance.csv +45 -0
- package/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -0
- package/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- package/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
- package/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
- package/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
- package/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
- package/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
- package/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/skills/ui-ux-pro-max/data/stacks/react.csv +54 -0
- package/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
- package/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
- package/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- package/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -0
- package/skills/ui-ux-pro-max/data/styles.csv +68 -0
- package/skills/ui-ux-pro-max/data/typography.csv +58 -0
- package/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
- package/skills/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/skills/ui-ux-pro-max/data/web-interface.csv +31 -0
- package/skills/ui-ux-pro-max/docs//344/270/211/344/270/252 data-scripts-templates /347/232/204/345/214/272/345/210/253.md" +30 -0
- package/skills/ui-ux-pro-max/preview/xiaomaomi-app.html +411 -0
- package/skills/ui-ux-pro-max/screenshots/website.png +0 -0
- package/skills/ui-ux-pro-max/scripts/core.py +253 -0
- package/skills/ui-ux-pro-max/scripts/design_system.py +1067 -0
- package/skills/ui-ux-pro-max/scripts/search.py +114 -0
- package/skills/ui-ux-pro-max/skill.json +41 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/_sync_all.py +414 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/app-interface.csv +31 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/charts.csv +26 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/colors.csv +162 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/design.csv +1776 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/draft.csv +1779 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/google-fonts.csv +1924 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/icons.csv +106 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/landing.csv +35 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/products.csv +162 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/react-performance.csv +45 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/stacks/angular.csv +51 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/stacks/astro.csv +54 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/stacks/laravel.csv +51 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/stacks/react.csv +54 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/stacks/threejs.csv +54 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/stacks/vue.csv +50 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/styles.csv +85 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/typography.csv +74 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/ui-reasoning.csv +162 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/scripts/core.py +262 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/scripts/design_system.py +1148 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/scripts/search.py +114 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/templates/base/quick-reference.md +297 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/templates/base/skill-content.md +358 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/templates/platforms/agent.json +21 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/templates/platforms/augment.json +18 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/templates/platforms/claude.json +21 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/templates/platforms/codebuddy.json +21 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/templates/platforms/codex.json +21 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/templates/platforms/continue.json +21 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/templates/platforms/copilot.json +21 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/templates/platforms/cursor.json +21 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/templates/platforms/droid.json +21 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/templates/platforms/gemini.json +21 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/templates/platforms/kilocode.json +21 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/templates/platforms/kiro.json +21 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/templates/platforms/opencode.json +21 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/templates/platforms/qoder.json +21 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/templates/platforms/roocode.json +21 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/templates/platforms/trae.json +21 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/templates/platforms/warp.json +18 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/templates/platforms/windsurf.json +21 -0
- package/skills/uncloud/SKILL.md +343 -0
- package/skills/upgrading-react-native/SKILL.md +58 -0
- package/skills/using-git-worktrees/SKILL.md +215 -0
- package/skills/vercel/SKILL.md +161 -0
- package/skills/vercel/metadata.json +16 -0
- package/skills/verification-loop/SKILL.md +126 -0
- package/skills/view-transitions-api/SKILL.md +108 -0
- package/skills/vite-patterns/SKILL.md +449 -0
- package/skills/vue3-composition-patterns/SKILL.md +375 -0
- package/skills/waza-habits/SKILL.md +22 -0
- package/skills/webapp-testing/LICENSE.txt +202 -0
- package/skills/webapp-testing/SKILL.md +96 -0
- package/skills/webapp-testing/examples/console_logging.py +35 -0
- package/skills/webapp-testing/examples/element_discovery.py +40 -0
- package/skills/webapp-testing/examples/static_html_automation.py +33 -0
- package/skills/webapp-testing/scripts/with_server.py +106 -0
- package/src/orchestrator/builder.ts +234 -0
- package/src/orchestrator/executor.ts +386 -0
- package/src/orchestrator/index.ts +535 -0
- package/src/orchestrator/loader.ts +237 -0
- package/src/orchestrator/registry.ts +211 -0
- package/src/orchestrator/schema.ts +141 -0
- package/src/orchestrator/session.ts +128 -0
- package/src/orchestrator/types.ts +109 -0
- package/tsconfig.json +21 -0
package/bin/imhcode.js
ADDED
|
@@ -0,0 +1,1634 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* IMH-Code CLI — Imam Hussain Coding Harness Platform
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* imhcode → Initialize framework in current directory
|
|
8
|
+
* imhcode plan → Smart: brainstorm OR sprint-plan based on state
|
|
9
|
+
* imhcode execute [N] → Execute sprint N with intelligent model routing
|
|
10
|
+
* imhcode test → Run the testing/security/SEO sprint
|
|
11
|
+
* imhcode agent list → List all discovered agents
|
|
12
|
+
* imhcode agent inspect <id> → Show full manifest + loaded skills
|
|
13
|
+
* imhcode agent run <id> "<task>" → Run agent (dry-run by default)
|
|
14
|
+
* --engine <cli> → Override engine (claude|opencode|codex|agy|qwen|mimo)
|
|
15
|
+
* -m, --model <model> → Override model
|
|
16
|
+
* --live → Call real LLM
|
|
17
|
+
* --output <path> → Custom session output directory
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
'use strict';
|
|
21
|
+
|
|
22
|
+
const fs = require('fs');
|
|
23
|
+
const path = require('path');
|
|
24
|
+
const { execSync } = require('child_process');
|
|
25
|
+
const os = require('os');
|
|
26
|
+
const readline = require('readline');
|
|
27
|
+
|
|
28
|
+
// ─── Constants ─────────────────────────────────────────────────────────────────
|
|
29
|
+
|
|
30
|
+
const PLATFORM_NAME = 'IMH-Code';
|
|
31
|
+
const PLATFORM_FULL = 'Imam Hussain Coding Harness Platform';
|
|
32
|
+
const CLI_CMD = 'imhcode';
|
|
33
|
+
const CONFIG_FILE = 'imhcode.config.json';
|
|
34
|
+
const GLOBAL_DIR = path.join(os.homedir(), '.imhcode');
|
|
35
|
+
const LOCAL_DIR_NAME = '.imhcode';
|
|
36
|
+
const DOCS_DIR = 'docs';
|
|
37
|
+
const START_MD = path.join(DOCS_DIR, 'start.md');
|
|
38
|
+
const BRAINSTORM_MD = path.join(DOCS_DIR, 'brainstorming.md');
|
|
39
|
+
const BRIEF_MD = 'PROJECT_BRIEF.md';
|
|
40
|
+
const CONTEXT_MD = path.join(LOCAL_DIR_NAME, 'context.md');
|
|
41
|
+
|
|
42
|
+
// ─── Entry Point ───────────────────────────────────────────────────────────────
|
|
43
|
+
|
|
44
|
+
const args = process.argv.slice(2);
|
|
45
|
+
const command = args[0];
|
|
46
|
+
const subcommand = args[1];
|
|
47
|
+
|
|
48
|
+
if (command === '--version' || command === '-v') {
|
|
49
|
+
const pkg = require(path.join(__dirname, '..', 'package.json'));
|
|
50
|
+
console.log(`${CLI_CMD} version: ${pkg.version}`);
|
|
51
|
+
process.exit(0);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
if (command === '--help' || command === '-h' || command === 'help') {
|
|
55
|
+
printGeneralHelp();
|
|
56
|
+
process.exit(0);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (command === 'plan') {
|
|
60
|
+
runPlanCommand(args.slice(1)).catch(err => {
|
|
61
|
+
console.error(err.message ?? err);
|
|
62
|
+
process.exit(1);
|
|
63
|
+
});
|
|
64
|
+
} else if (command === 'execute' || command === 'exec') {
|
|
65
|
+
runExecuteCommand(args.slice(1)).catch(err => {
|
|
66
|
+
console.error(err.message ?? err);
|
|
67
|
+
process.exit(1);
|
|
68
|
+
});
|
|
69
|
+
} else if (command === 'test') {
|
|
70
|
+
runTestCommand(args.slice(1)).catch(err => {
|
|
71
|
+
console.error(err.message ?? err);
|
|
72
|
+
process.exit(1);
|
|
73
|
+
});
|
|
74
|
+
} else if (command === 'agent') {
|
|
75
|
+
runAgentCommand(subcommand, args.slice(2)).catch(err => {
|
|
76
|
+
console.error(err.message ?? err);
|
|
77
|
+
process.exit(1);
|
|
78
|
+
});
|
|
79
|
+
} else if (command === 'sprint') {
|
|
80
|
+
// Legacy compat: zeoel sprint design/execute → imhcode execute
|
|
81
|
+
runSprintLegacyCommand(subcommand, args.slice(2)).catch(err => {
|
|
82
|
+
console.error(err.message ?? err);
|
|
83
|
+
process.exit(1);
|
|
84
|
+
});
|
|
85
|
+
} else {
|
|
86
|
+
// Default: framework initialization
|
|
87
|
+
runInit().catch(err => {
|
|
88
|
+
console.error(err.message ?? err);
|
|
89
|
+
process.exit(1);
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// ─── Help ─────────────────────────────────────────────────────────────────────
|
|
94
|
+
|
|
95
|
+
function printGeneralHelp() {
|
|
96
|
+
console.log(`
|
|
97
|
+
╔══════════════════════════════════════════════════════════════════╗
|
|
98
|
+
║ ${PLATFORM_NAME} — ${PLATFORM_FULL} ║
|
|
99
|
+
╚══════════════════════════════════════════════════════════════════╝
|
|
100
|
+
|
|
101
|
+
Usage:
|
|
102
|
+
${CLI_CMD} → Initialize project (engine scan + model routing setup)
|
|
103
|
+
${CLI_CMD} plan → Smart: brainstorm OR generate sprint plan
|
|
104
|
+
${CLI_CMD} execute [N] → Execute sprint N with intelligent model routing
|
|
105
|
+
${CLI_CMD} test → Run final testing/security/SEO sprint
|
|
106
|
+
${CLI_CMD} agent list → List all 19 generic agents
|
|
107
|
+
${CLI_CMD} agent inspect <id> → Show agent manifest + loaded skills
|
|
108
|
+
${CLI_CMD} agent run <id> "<task>" → Run agent (dry-run by default)
|
|
109
|
+
--live → Call real LLM
|
|
110
|
+
--engine <cli> → Override engine (claude|opencode|codex|agy|qwen|mimo)
|
|
111
|
+
-m, --model <model> → Override model
|
|
112
|
+
--output <path> → Save session to custom path
|
|
113
|
+
|
|
114
|
+
Pipeline:
|
|
115
|
+
1. ${CLI_CMD} → Init project
|
|
116
|
+
2. Edit docs/start.md → Write your problem/prompt
|
|
117
|
+
3. ${CLI_CMD} plan → Generates docs/brainstorming.md with Q&A
|
|
118
|
+
4. Edit docs/brainstorming.md → Review/edit recommended answers
|
|
119
|
+
5. ${CLI_CMD} plan → Reads answers → generates sprint plans
|
|
120
|
+
6. ${CLI_CMD} execute 1 → Execute sprint 1 (pure code, no tests)
|
|
121
|
+
7. ${CLI_CMD} execute 2 → Execute sprint 2
|
|
122
|
+
8. ${CLI_CMD} test → Final testing, security + SEO audit
|
|
123
|
+
|
|
124
|
+
Agents (19 generic — no persona names):
|
|
125
|
+
planner → Project planning, brainstorming, sprint coordination
|
|
126
|
+
designer → UX/UI design (Mimo v2.5 Pro preferred)
|
|
127
|
+
nextjs-executor → Next.js full-stack (Mimo v2.5 Pro preferred)
|
|
128
|
+
react-executor → React/Vite SPA
|
|
129
|
+
vue-executor → Vue 3 / Nuxt 4
|
|
130
|
+
laravel-executor → Laravel full-stack (DeepSeek V4 Pro preferred)
|
|
131
|
+
python-executor → Python / Django / FastAPI
|
|
132
|
+
java-executor → Java / Spring Boot
|
|
133
|
+
flutter-executor → Flutter / Dart
|
|
134
|
+
react-native-executor → React Native / Expo
|
|
135
|
+
ios-executor → iOS / SwiftUI
|
|
136
|
+
android-executor → Android / Kotlin
|
|
137
|
+
systems-executor → Go / Rust / C++
|
|
138
|
+
web3-executor → Solidity / Web3
|
|
139
|
+
devops-executor → Docker / CI/CD
|
|
140
|
+
tester → QA + E2E testing (GPT-5.5 preferred)
|
|
141
|
+
security-auditor → Security audit (GPT-5.5 preferred)
|
|
142
|
+
seo-optimizer → SEO / Content (GPT-5.5 preferred)
|
|
143
|
+
debugger → Debugging / Root cause
|
|
144
|
+
|
|
145
|
+
${CLI_CMD} --version, -v → Print version
|
|
146
|
+
${CLI_CMD} --help, -h → Print this help
|
|
147
|
+
`);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// ─── imhcode plan (Smart State Machine) ───────────────────────────────────────
|
|
151
|
+
|
|
152
|
+
async function runPlanCommand(restArgs) {
|
|
153
|
+
const cwd = process.cwd();
|
|
154
|
+
const startMdPath = path.join(cwd, START_MD);
|
|
155
|
+
const brainstormPath = path.join(cwd, BRAINSTORM_MD);
|
|
156
|
+
const briefPath = path.join(cwd, BRIEF_MD);
|
|
157
|
+
|
|
158
|
+
console.log(`\n🕌 ${PLATFORM_NAME} — Plan Command\n`);
|
|
159
|
+
|
|
160
|
+
// State detection
|
|
161
|
+
const hasStartMd = fs.existsSync(startMdPath);
|
|
162
|
+
const hasBrainstorm = fs.existsSync(brainstormPath);
|
|
163
|
+
const hasBrief = fs.existsSync(briefPath);
|
|
164
|
+
const hasSprintDocs = detectSprintDocs(cwd);
|
|
165
|
+
|
|
166
|
+
if (!hasStartMd) {
|
|
167
|
+
console.log(`❌ docs/start.md not found.\n`);
|
|
168
|
+
console.log(` Create docs/start.md and write your project description inside it.`);
|
|
169
|
+
console.log(` Then run "imhcode plan" again.\n`);
|
|
170
|
+
console.log(` Tip: Run "imhcode" first to initialize the project and create the template.\n`);
|
|
171
|
+
process.exit(1);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// Read the start.md prompt
|
|
175
|
+
const startContent = fs.readFileSync(startMdPath, 'utf8');
|
|
176
|
+
const userPrompt = extractPromptFromStartMd(startContent);
|
|
177
|
+
|
|
178
|
+
if (!userPrompt || userPrompt.trim().length < 10) {
|
|
179
|
+
console.log(`❌ docs/start.md has no project description.\n`);
|
|
180
|
+
console.log(` Write your project idea in docs/start.md between the markers:\n`);
|
|
181
|
+
console.log(` <!-- WRITE_PROMPT_HERE -->`);
|
|
182
|
+
console.log(` Your project description here...`);
|
|
183
|
+
console.log(` <!-- END_PROMPT -->\n`);
|
|
184
|
+
process.exit(1);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// ── State 1: No brainstorming yet → generate brainstorming.md ────────────
|
|
188
|
+
if (!hasBrainstorm) {
|
|
189
|
+
console.log(`📋 Phase 2: Generating brainstorming document...\n`);
|
|
190
|
+
console.log(` Reading your project description from docs/start.md...`);
|
|
191
|
+
console.log(` Prompt: "${userPrompt.slice(0, 100)}${userPrompt.length > 100 ? '...' : ''}"\n`);
|
|
192
|
+
|
|
193
|
+
await generateBrainstormingDoc(cwd, userPrompt);
|
|
194
|
+
|
|
195
|
+
console.log(`\n✅ Brainstorming document created: docs/brainstorming.md\n`);
|
|
196
|
+
console.log(`─`.repeat(60));
|
|
197
|
+
console.log(`\n📝 NEXT STEPS:\n`);
|
|
198
|
+
console.log(` 1. Open docs/brainstorming.md`);
|
|
199
|
+
console.log(` 2. Review the auto-recommended answers`);
|
|
200
|
+
console.log(` 3. Edit any answers you want to customize`);
|
|
201
|
+
console.log(` 4. Run "imhcode plan" again to generate sprint plans\n`);
|
|
202
|
+
console.log(`─`.repeat(60));
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// ── State 2: Brainstorming exists, no sprint plans → generate sprints ─────
|
|
207
|
+
if (hasBrainstorm && !hasSprintDocs) {
|
|
208
|
+
console.log(`📋 Phase 3-4: Reading brainstorming answers → generating sprint plans...\n`);
|
|
209
|
+
|
|
210
|
+
const brainstormContent = fs.readFileSync(brainstormPath, 'utf8');
|
|
211
|
+
const config = loadLocalConfig(cwd);
|
|
212
|
+
|
|
213
|
+
await generateSprintPlans(cwd, userPrompt, brainstormContent, config);
|
|
214
|
+
|
|
215
|
+
console.log(`\n✅ Sprint plans generated!\n`);
|
|
216
|
+
console.log(`─`.repeat(60));
|
|
217
|
+
console.log(`\n📝 NEXT STEPS:\n`);
|
|
218
|
+
console.log(` 1. Review docs/sprint-1/plan.md`);
|
|
219
|
+
console.log(` 2. Run "imhcode execute 1" to start Sprint 1`);
|
|
220
|
+
console.log(` 3. Then "imhcode execute 2", "imhcode execute 3", etc.`);
|
|
221
|
+
console.log(` 4. Run "imhcode test" for the final testing sprint\n`);
|
|
222
|
+
console.log(`─`.repeat(60));
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// ── State 3: Sprints already exist ───────────────────────────────────────
|
|
227
|
+
if (hasSprintDocs) {
|
|
228
|
+
const currentSprint = detectCurrentSprint(cwd);
|
|
229
|
+
console.log(`ℹ️ Sprint plans already exist (current sprint: Sprint ${currentSprint}).\n`);
|
|
230
|
+
console.log(` Use "imhcode execute ${currentSprint}" to run the current sprint.`);
|
|
231
|
+
console.log(` Use "imhcode test" to run the final testing sprint.\n`);
|
|
232
|
+
console.log(` To re-plan from scratch, delete docs/brainstorming.md and run "imhcode plan".\n`);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// ─── imhcode execute [N] ──────────────────────────────────────────────────────
|
|
237
|
+
|
|
238
|
+
async function runExecuteCommand(restArgs) {
|
|
239
|
+
const cwd = process.cwd();
|
|
240
|
+
const sprintNum = resolveSprintNum(restArgs, cwd);
|
|
241
|
+
const sprintDir = path.join(cwd, DOCS_DIR, `sprint-${sprintNum}`);
|
|
242
|
+
const masterScript = path.join(sprintDir, 'run_all_tasks.sh');
|
|
243
|
+
const progressPath = path.join(sprintDir, 'progress.md');
|
|
244
|
+
|
|
245
|
+
console.log(`\n🕌 ${PLATFORM_NAME} — Execute Sprint ${sprintNum}\n`);
|
|
246
|
+
|
|
247
|
+
if (!fs.existsSync(progressPath)) {
|
|
248
|
+
console.error(`❌ Sprint ${sprintNum} not planned yet.`);
|
|
249
|
+
console.error(` Run "imhcode plan" first to generate sprint plans.`);
|
|
250
|
+
process.exit(1);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
if (!fs.existsSync(masterScript)) {
|
|
254
|
+
console.error(`❌ run_all_tasks.sh not found for Sprint ${sprintNum}.`);
|
|
255
|
+
console.error(` Run "imhcode plan" to regenerate the sprint plan.`);
|
|
256
|
+
process.exit(1);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
// Read plan to show what will be executed
|
|
260
|
+
const planPath = path.join(sprintDir, 'plan.md');
|
|
261
|
+
if (fs.existsSync(planPath)) {
|
|
262
|
+
const plan = fs.readFileSync(planPath, 'utf8');
|
|
263
|
+
const taskCount = (plan.match(/^##\s+Task/gm) || []).length;
|
|
264
|
+
console.log(` Sprint: ${sprintNum}`);
|
|
265
|
+
console.log(` Tasks: ${taskCount}`);
|
|
266
|
+
console.log(` Script: ${masterScript}\n`);
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
// Check model routing config
|
|
270
|
+
const config = loadLocalConfig(cwd);
|
|
271
|
+
if (config?.model_routing) {
|
|
272
|
+
console.log(` Model Routing:`);
|
|
273
|
+
for (const [cat, routing] of Object.entries(config.model_routing)) {
|
|
274
|
+
if (routing && typeof routing === 'object') {
|
|
275
|
+
console.log(` ${cat.padEnd(12)}: ${routing.model} (${routing.engine})`);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
console.log('');
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
try {
|
|
282
|
+
fs.chmodSync(masterScript, 0o755);
|
|
283
|
+
} catch { /* ignore on Windows */ }
|
|
284
|
+
|
|
285
|
+
console.log(`─`.repeat(60));
|
|
286
|
+
try {
|
|
287
|
+
execSync(`sh "${masterScript}"`, { stdio: 'inherit', cwd });
|
|
288
|
+
console.log(`─`.repeat(60));
|
|
289
|
+
console.log(`\n🏁 Sprint ${sprintNum} execution complete!\n`);
|
|
290
|
+
|
|
291
|
+
// Update compact context after sprint
|
|
292
|
+
await updateCompactContext(cwd, sprintNum);
|
|
293
|
+
} catch (err) {
|
|
294
|
+
console.log(`─`.repeat(60));
|
|
295
|
+
console.error(`\n❌ Sprint ${sprintNum} execution failed.`);
|
|
296
|
+
console.error(` Check the output above for details.`);
|
|
297
|
+
process.exit(1);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
// ─── imhcode test ─────────────────────────────────────────────────────────────
|
|
302
|
+
|
|
303
|
+
async function runTestCommand(restArgs) {
|
|
304
|
+
const cwd = process.cwd();
|
|
305
|
+
const lastSprint = detectLastSprint(cwd);
|
|
306
|
+
const testingSprintNum = lastSprint + 1;
|
|
307
|
+
const testSprintDir = path.join(cwd, DOCS_DIR, `sprint-${testingSprintNum}`);
|
|
308
|
+
const testScript = path.join(testSprintDir, 'run_all_tasks.sh');
|
|
309
|
+
|
|
310
|
+
console.log(`\n🕌 ${PLATFORM_NAME} — Testing Sprint\n`);
|
|
311
|
+
|
|
312
|
+
if (fs.existsSync(testScript)) {
|
|
313
|
+
// Run existing test sprint
|
|
314
|
+
console.log(` Running auto-generated testing sprint (Sprint ${testingSprintNum})...\n`);
|
|
315
|
+
try {
|
|
316
|
+
fs.chmodSync(testScript, 0o755);
|
|
317
|
+
} catch { /* ignore */ }
|
|
318
|
+
console.log(`─`.repeat(60));
|
|
319
|
+
try {
|
|
320
|
+
execSync(`sh "${testScript}"`, { stdio: 'inherit', cwd });
|
|
321
|
+
console.log(`─`.repeat(60));
|
|
322
|
+
console.log(`\n✅ Testing sprint complete! Check docs/sprint-${testingSprintNum}/ for reports.\n`);
|
|
323
|
+
} catch {
|
|
324
|
+
console.error(`\n❌ Testing sprint failed. Check output above.\n`);
|
|
325
|
+
process.exit(1);
|
|
326
|
+
}
|
|
327
|
+
} else {
|
|
328
|
+
// Guide user to generate the test sprint
|
|
329
|
+
console.log(` ℹ️ No testing sprint found yet.\n`);
|
|
330
|
+
console.log(` The testing sprint is auto-generated when you run "imhcode plan" and`);
|
|
331
|
+
console.log(` select "Fast Mode" or "Balanced Mode" for testing strategy.\n`);
|
|
332
|
+
console.log(` To generate it now, run:\n`);
|
|
333
|
+
console.log(` imhcode agent run planner "Generate testing sprint for Sprint ${testingSprintNum}" --live\n`);
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
// ─── imhcode agent ────────────────────────────────────────────────────────────
|
|
338
|
+
|
|
339
|
+
async function runAgentCommand(subcommand, restArgs) {
|
|
340
|
+
const orchestrator = loadOrchestrator();
|
|
341
|
+
|
|
342
|
+
switch (subcommand) {
|
|
343
|
+
case 'list': return cmdList(orchestrator, restArgs);
|
|
344
|
+
case 'inspect': return cmdInspect(orchestrator, restArgs);
|
|
345
|
+
case 'run': return cmdRun(orchestrator, restArgs);
|
|
346
|
+
default:
|
|
347
|
+
printAgentHelp();
|
|
348
|
+
process.exit(0);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
function loadOrchestrator() {
|
|
353
|
+
const distPath = path.join(__dirname, '..', 'dist', 'orchestrator', 'index.js');
|
|
354
|
+
if (!fs.existsSync(distPath)) {
|
|
355
|
+
console.error(
|
|
356
|
+
`❌ Orchestrator not built. Run:\n` +
|
|
357
|
+
` npm run build\n` +
|
|
358
|
+
` Then retry.\n`
|
|
359
|
+
);
|
|
360
|
+
process.exit(1);
|
|
361
|
+
}
|
|
362
|
+
return require(distPath);
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
function resolveAgentsDir() {
|
|
366
|
+
const globalAgents = path.join(GLOBAL_DIR, 'agents');
|
|
367
|
+
if (fs.existsSync(globalAgents)) return globalAgents;
|
|
368
|
+
|
|
369
|
+
const cwdAgents = path.join(process.cwd(), 'agents');
|
|
370
|
+
if (fs.existsSync(cwdAgents)) return cwdAgents;
|
|
371
|
+
|
|
372
|
+
const pkgAgents = path.join(__dirname, '..', 'agents');
|
|
373
|
+
if (fs.existsSync(pkgAgents)) return pkgAgents;
|
|
374
|
+
|
|
375
|
+
throw new Error(
|
|
376
|
+
`❌ No "agents/" directory found.\n` +
|
|
377
|
+
` Run "imhcode" in a directory with an "agents/" folder,\n` +
|
|
378
|
+
` or run "imhcode" first to initialize the framework.`
|
|
379
|
+
);
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
async function cmdList(orc, _args) {
|
|
383
|
+
const agentsDir = resolveAgentsDir();
|
|
384
|
+
const cwd = process.cwd();
|
|
385
|
+
console.log('\n🤖 Loading agent registry...\n');
|
|
386
|
+
|
|
387
|
+
const { agents, errors } = await orc.loadRegistry(agentsDir, cwd);
|
|
388
|
+
|
|
389
|
+
if (agents.size === 0 && errors.length === 0) {
|
|
390
|
+
console.log(' No agents found in:', agentsDir);
|
|
391
|
+
return;
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
const rows = [...agents.values()].map(a => ({
|
|
395
|
+
id: a.manifest.id,
|
|
396
|
+
role: a.manifest.role,
|
|
397
|
+
model: a.manifest.default_model,
|
|
398
|
+
category: getAgentCategory(a.manifest.id),
|
|
399
|
+
}));
|
|
400
|
+
|
|
401
|
+
console.log('┌─────────────────────────────────────────────────────────────────────────────┐');
|
|
402
|
+
console.log(`│ ${PLATFORM_NAME} — AGENT REGISTRY │`);
|
|
403
|
+
console.log('├──────────────────────────┬────────────────┬──────────────┬──────────────────┤');
|
|
404
|
+
console.log('│ ID │ Category │ Model │ Role │');
|
|
405
|
+
console.log('├──────────────────────────┼────────────────┼──────────────┼──────────────────┤');
|
|
406
|
+
|
|
407
|
+
for (const row of rows) {
|
|
408
|
+
const id = row.id.padEnd(24).slice(0, 24);
|
|
409
|
+
const cat = row.category.padEnd(14).slice(0, 14);
|
|
410
|
+
const mdl = row.model.padEnd(12).slice(0, 12);
|
|
411
|
+
const rol = row.role.padEnd(16).slice(0, 16);
|
|
412
|
+
console.log(`│ ${id} │ ${cat} │ ${mdl} │ ${rol} │`);
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
console.log('└──────────────────────────┴────────────────┴──────────────┴──────────────────┘');
|
|
416
|
+
console.log(`\n Total: ${agents.size} agent(s) │ Use "imhcode agent inspect <id>" for details.\n`);
|
|
417
|
+
|
|
418
|
+
if (errors.length > 0) {
|
|
419
|
+
console.log(`⚠️ ${errors.length} agent(s) failed to load:\n`);
|
|
420
|
+
for (const { agentId, error } of errors) {
|
|
421
|
+
console.log(` ❌ ${agentId}: ${error.split('\n')[0]}\n`);
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
function getAgentCategory(agentId) {
|
|
427
|
+
const map = {
|
|
428
|
+
'planner': 'planning', 'designer': 'frontend',
|
|
429
|
+
'nextjs-executor': 'frontend', 'react-executor': 'frontend', 'vue-executor': 'frontend',
|
|
430
|
+
'laravel-executor': 'backend', 'python-executor': 'backend', 'java-executor': 'backend',
|
|
431
|
+
'flutter-executor': 'backend', 'react-native-executor': 'backend', 'ios-executor': 'backend',
|
|
432
|
+
'android-executor': 'backend', 'systems-executor': 'backend', 'web3-executor': 'backend',
|
|
433
|
+
'devops-executor': 'backend', 'tester': 'testing', 'security-auditor': 'testing',
|
|
434
|
+
'seo-optimizer': 'review', 'debugger': 'review',
|
|
435
|
+
};
|
|
436
|
+
return map[agentId] || 'backend';
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
async function cmdInspect(orc, args) {
|
|
440
|
+
const agentId = args[0];
|
|
441
|
+
if (!agentId) {
|
|
442
|
+
console.error(`❌ Usage: imhcode agent inspect <agent-id>`);
|
|
443
|
+
process.exit(1);
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
const agentsDir = resolveAgentsDir();
|
|
447
|
+
const cwd = process.cwd();
|
|
448
|
+
console.log(`\n🔍 Loading agent: ${agentId}\n`);
|
|
449
|
+
|
|
450
|
+
const { agents, errors } = await orc.loadRegistry(agentsDir, cwd);
|
|
451
|
+
|
|
452
|
+
if (errors.some(e => e.agentId === agentId)) {
|
|
453
|
+
const err = errors.find(e => e.agentId === agentId);
|
|
454
|
+
console.error(err.error);
|
|
455
|
+
process.exit(1);
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
const agent = orc.getAgent(agents, agentId);
|
|
459
|
+
const { manifest, systemPrompt, skills, dir } = agent;
|
|
460
|
+
const divider = '─'.repeat(72);
|
|
461
|
+
|
|
462
|
+
// Load config to show routing
|
|
463
|
+
const config = loadLocalConfig(cwd);
|
|
464
|
+
const category = getAgentCategory(manifest.id);
|
|
465
|
+
const routing = config?.model_routing?.[category];
|
|
466
|
+
|
|
467
|
+
console.log(divider);
|
|
468
|
+
console.log(` ${manifest.name} (v${manifest.version})`);
|
|
469
|
+
console.log(divider);
|
|
470
|
+
console.log(` ID: ${manifest.id}`);
|
|
471
|
+
console.log(` Role: ${manifest.role}`);
|
|
472
|
+
console.log(` Category: ${category}`);
|
|
473
|
+
console.log(` Description: ${manifest.description.replace(/\n\s*/g, ' ')}`);
|
|
474
|
+
console.log(` Directory: ${dir}`);
|
|
475
|
+
console.log(` Default Model: ${manifest.default_model}`);
|
|
476
|
+
if (routing) {
|
|
477
|
+
console.log(` Routed Model: ${routing.model} via ${routing.engine} (from imhcode.config.json)`);
|
|
478
|
+
}
|
|
479
|
+
console.log(` Fallbacks: ${manifest.fallback_engines.join(', ') || '(none)'}`);
|
|
480
|
+
console.log(`\n Core Skills: ${skills.length} loaded`);
|
|
481
|
+
for (const skill of skills) {
|
|
482
|
+
console.log(` ► ${skill.id}`);
|
|
483
|
+
}
|
|
484
|
+
console.log(`\n${divider}\n`);
|
|
485
|
+
console.log(` Run this agent with:`);
|
|
486
|
+
console.log(` imhcode agent run ${manifest.id} "Your task" --live\n`);
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
async function cmdRun(orc, args) {
|
|
490
|
+
const agentId = args[0];
|
|
491
|
+
const task = args[1];
|
|
492
|
+
|
|
493
|
+
if (!agentId || !task) {
|
|
494
|
+
console.error(`❌ Usage: imhcode agent run <agent-id> "<task description>" [options]`);
|
|
495
|
+
console.error(` --live Run live (calls real LLM)`);
|
|
496
|
+
console.error(` --engine <cli> Override engine`);
|
|
497
|
+
console.error(` -m, --model <model> Override model`);
|
|
498
|
+
console.error(` --output <path> Custom output dir`);
|
|
499
|
+
process.exit(1);
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
const restArgs = args.slice(2);
|
|
503
|
+
const live = restArgs.includes('--live');
|
|
504
|
+
const engineIdx = restArgs.indexOf('--engine');
|
|
505
|
+
const engine = engineIdx >= 0 ? restArgs[engineIdx + 1] : undefined;
|
|
506
|
+
const mIndex = restArgs.indexOf('--model');
|
|
507
|
+
const shortMIndex = restArgs.indexOf('-m');
|
|
508
|
+
const modelIdx = mIndex >= 0 ? mIndex : shortMIndex;
|
|
509
|
+
const model = modelIdx >= 0 ? restArgs[modelIdx + 1] : undefined;
|
|
510
|
+
const criteriaIdx = restArgs.indexOf('--criteria');
|
|
511
|
+
const criteria = criteriaIdx >= 0 ? restArgs[criteriaIdx + 1] : undefined;
|
|
512
|
+
const outputIdx = restArgs.indexOf('--output');
|
|
513
|
+
const outputDir = outputIdx >= 0 ? restArgs[outputIdx + 1] : undefined;
|
|
514
|
+
|
|
515
|
+
const agentsDir = resolveAgentsDir();
|
|
516
|
+
const cwd = process.cwd();
|
|
517
|
+
const config = loadLocalConfig(cwd);
|
|
518
|
+
const category = getAgentCategory(agentId);
|
|
519
|
+
|
|
520
|
+
console.log(`\n🕌 ${PLATFORM_NAME} — Agent Execution`);
|
|
521
|
+
console.log(` Agent: ${agentId}`);
|
|
522
|
+
console.log(` Category: ${category}`);
|
|
523
|
+
console.log(` Task: ${task}`);
|
|
524
|
+
console.log(` Mode: ${live ? '🔴 LIVE (CLI execution)' : '🟡 DRY-RUN (no CLI execution)'}`);
|
|
525
|
+
|
|
526
|
+
// Show which model will be used
|
|
527
|
+
if (!engine && !model && config?.model_routing?.[category]) {
|
|
528
|
+
const r = config.model_routing[category];
|
|
529
|
+
console.log(` Model: ${r.model} via ${r.engine} (from routing config)`);
|
|
530
|
+
} else if (model) {
|
|
531
|
+
console.log(` Model: ${model} (explicit override)`);
|
|
532
|
+
}
|
|
533
|
+
console.log('');
|
|
534
|
+
|
|
535
|
+
const { agents, errors } = await orc.loadRegistry(agentsDir, cwd);
|
|
536
|
+
|
|
537
|
+
if (errors.some(e => e.agentId === agentId)) {
|
|
538
|
+
const err = errors.find(e => e.agentId === agentId);
|
|
539
|
+
console.error(err.error);
|
|
540
|
+
process.exit(1);
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
const agent = orc.getAgent(agents, agentId);
|
|
544
|
+
const result = await orc.runAgent(agent, task, { dryRun: !live, engine, model, outputDir, cwd }, criteria);
|
|
545
|
+
|
|
546
|
+
console.log('\n' + '─'.repeat(72));
|
|
547
|
+
if (result.errors.length > 0 && !result.dryRun) {
|
|
548
|
+
console.error(`\n❌ [IMH-Code] Execution failed with errors:`);
|
|
549
|
+
result.errors.forEach(e => console.error(` • ${e}`));
|
|
550
|
+
|
|
551
|
+
// Check if the error is a limit/failover exhaustion
|
|
552
|
+
const isLimitExhausted = result.errors.some(e => e.includes('limits') && e.includes('exhausted'));
|
|
553
|
+
if (isLimitExhausted) {
|
|
554
|
+
const currentSprint = detectCurrentSprint(cwd);
|
|
555
|
+
console.error(`\n💡 [IMH-Code] All available assistant engines hit rate/token/quota limits.`);
|
|
556
|
+
console.error(` The context has been saved in the session logs: ${result.sessionDir || 'sessions/'}`);
|
|
557
|
+
console.error(` Please wait for your limits/quotas to reset, then resume development by running:`);
|
|
558
|
+
console.error(` imhcode execute ${currentSprint}\n`);
|
|
559
|
+
}
|
|
560
|
+
process.exit(1);
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
console.log(`\n✅ Execution complete`);
|
|
564
|
+
console.log(` Duration: ${result.durationMs}ms`);
|
|
565
|
+
console.log(` Model: ${result.model}`);
|
|
566
|
+
console.log(` Dry-run: ${result.dryRun}`);
|
|
567
|
+
if (result.sessionDir) console.log(` Session log: ${result.sessionDir}`);
|
|
568
|
+
console.log('');
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
function printAgentHelp() {
|
|
572
|
+
console.log(`
|
|
573
|
+
imhcode agent <subcommand>
|
|
574
|
+
|
|
575
|
+
Subcommands:
|
|
576
|
+
list List all 19 generic agents
|
|
577
|
+
inspect <id> Show agent manifest, skills, and routing
|
|
578
|
+
run <id> "<task>" [flags] Build prompt and run
|
|
579
|
+
|
|
580
|
+
Flags for "run":
|
|
581
|
+
--live Run live LLM execution
|
|
582
|
+
--engine <cli> Override engine (claude|opencode|codex|agy|qwen|mimo)
|
|
583
|
+
-m, --model <model> Override model
|
|
584
|
+
--criteria "<string>" Acceptance criteria
|
|
585
|
+
--output <path> Custom session directory
|
|
586
|
+
|
|
587
|
+
Agent IDs (short aliases work too):
|
|
588
|
+
planner (alias: plan, pm, orchestrator)
|
|
589
|
+
nextjs-executor (alias: nextjs, next)
|
|
590
|
+
laravel-executor (alias: laravel, php)
|
|
591
|
+
react-executor (alias: react, vite)
|
|
592
|
+
vue-executor (alias: vue, nuxt)
|
|
593
|
+
python-executor (alias: python, django, fastapi)
|
|
594
|
+
tester (alias: qa, test)
|
|
595
|
+
security-auditor (alias: security, audit)
|
|
596
|
+
debugger (alias: debug, fix)
|
|
597
|
+
... and more (run imhcode agent list)
|
|
598
|
+
`);
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
// ─── Legacy Sprint Commands ────────────────────────────────────────────────────
|
|
602
|
+
|
|
603
|
+
async function runSprintLegacyCommand(subcommand, restArgs) {
|
|
604
|
+
if (subcommand === 'execute') {
|
|
605
|
+
return runExecuteCommand(restArgs);
|
|
606
|
+
} else if (subcommand === 'design') {
|
|
607
|
+
return cmdSprintDesign(restArgs);
|
|
608
|
+
} else {
|
|
609
|
+
console.log(` Use "imhcode execute [N]" instead of "imhcode sprint execute [N]"`);
|
|
610
|
+
console.log(` Use "imhcode plan" instead of "imhcode sprint design [N]"\n`);
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
async function cmdSprintDesign(restArgs) {
|
|
615
|
+
const cwd = process.cwd();
|
|
616
|
+
const sprintNum = resolveSprintNum(restArgs, cwd);
|
|
617
|
+
const sprintDir = path.join(cwd, DOCS_DIR, `sprint-${sprintNum}`);
|
|
618
|
+
|
|
619
|
+
console.log(`\n📐 ${PLATFORM_NAME} Sprint Design Check — Sprint ${sprintNum}\n`);
|
|
620
|
+
|
|
621
|
+
const checks = [
|
|
622
|
+
{ file: path.join(cwd, BRIEF_MD), label: 'PROJECT_BRIEF.md' },
|
|
623
|
+
{ file: path.join(sprintDir, 'plan.md'), label: `docs/sprint-${sprintNum}/plan.md` },
|
|
624
|
+
{ file: path.join(sprintDir, 'progress.md'), label: `docs/sprint-${sprintNum}/progress.md` },
|
|
625
|
+
{ file: path.join(sprintDir, 'tasks'), label: `docs/sprint-${sprintNum}/tasks/` },
|
|
626
|
+
{ file: path.join(sprintDir, 'run_all_tasks.sh'), label: `docs/sprint-${sprintNum}/run_all_tasks.sh` },
|
|
627
|
+
];
|
|
628
|
+
|
|
629
|
+
let allOk = true;
|
|
630
|
+
for (const check of checks) {
|
|
631
|
+
const exists = fs.existsSync(check.file);
|
|
632
|
+
console.log(` ${exists ? '✅' : '❌'} ${check.label}`);
|
|
633
|
+
if (!exists) allOk = false;
|
|
634
|
+
}
|
|
635
|
+
|
|
636
|
+
if (allOk) {
|
|
637
|
+
console.log(`\n✅ Sprint ${sprintNum} planning complete!`);
|
|
638
|
+
console.log(` Run: imhcode execute ${sprintNum}\n`);
|
|
639
|
+
} else {
|
|
640
|
+
console.log(`\n❌ Sprint ${sprintNum} planning incomplete.`);
|
|
641
|
+
console.log(` Run "imhcode plan" to generate missing files.\n`);
|
|
642
|
+
process.exit(1);
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
// ─── Initialization ───────────────────────────────────────────────────────────
|
|
647
|
+
|
|
648
|
+
async function runInit() {
|
|
649
|
+
console.log(`\n🕌 Initializing ${PLATFORM_NAME}...\n`);
|
|
650
|
+
console.log(` ${PLATFORM_FULL}\n`);
|
|
651
|
+
|
|
652
|
+
const packageRoot = path.join(__dirname, '..');
|
|
653
|
+
const imhcodeScriptPath = path.join(packageRoot, 'bin', 'imhcode.js');
|
|
654
|
+
const cwd = process.cwd();
|
|
655
|
+
|
|
656
|
+
// Ensure global ~/.imhcode exists
|
|
657
|
+
if (!fs.existsSync(GLOBAL_DIR)) {
|
|
658
|
+
fs.mkdirSync(GLOBAL_DIR, { recursive: true });
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
const itemsToCopy = [
|
|
662
|
+
{ src: '.github', dest: '.github', desc: 'GitHub integration files' },
|
|
663
|
+
{ src: 'AGENTS.md', dest: 'AGENTS.md', desc: 'Agent manifest' },
|
|
664
|
+
{ src: 'CLAUDE.md', dest: 'CLAUDE.md', desc: 'Claude/Cursor/Copilot integration' },
|
|
665
|
+
{ src: '.gitignore.template', dest: '.gitignore', desc: 'Auto-generated gitignore' },
|
|
666
|
+
{ src: 'SETUP.md', dest: 'SETUP.md', desc: 'Setup guide' },
|
|
667
|
+
{ src: 'USER_MANUAL.md', dest: 'USER_MANUAL.md', desc: 'User manual' },
|
|
668
|
+
{ src: 'agents', dest: 'agents', desc: 'YAML-driven agent manifests' },
|
|
669
|
+
{ src: 'skills', dest: 'skills', desc: 'Skill library (SKILL.md files)' },
|
|
670
|
+
];
|
|
671
|
+
|
|
672
|
+
// Copy to global ~/.imhcode (unconditionally overwrite to apply updates)
|
|
673
|
+
for (const item of itemsToCopy) {
|
|
674
|
+
const sourcePath = path.join(packageRoot, item.src);
|
|
675
|
+
const targetPath = path.join(GLOBAL_DIR, item.dest);
|
|
676
|
+
if (!fs.existsSync(sourcePath)) {
|
|
677
|
+
console.warn(`⚠️ Warning: Could not find ${item.src} in package.`);
|
|
678
|
+
continue;
|
|
679
|
+
}
|
|
680
|
+
if (fs.existsSync(targetPath)) {
|
|
681
|
+
const stats = fs.statSync(targetPath);
|
|
682
|
+
if (stats.isDirectory()) rmRecursiveSync(targetPath);
|
|
683
|
+
else fs.unlinkSync(targetPath);
|
|
684
|
+
}
|
|
685
|
+
console.log(` Updating ${item.src} → ~/.imhcode/${item.dest} (${item.desc})...`);
|
|
686
|
+
copyRecursiveSync(sourcePath, targetPath);
|
|
687
|
+
}
|
|
688
|
+
|
|
689
|
+
// Copy CLAUDE.md, AGENTS.md, and skills/ to assistant config directories globally
|
|
690
|
+
const assistants = [
|
|
691
|
+
{ dir: path.join(os.homedir(), '.claude'), name: 'Claude Code' },
|
|
692
|
+
{ dir: path.join(os.homedir(), '.gemini'), name: 'Antigravity IDE' },
|
|
693
|
+
{ dir: path.join(os.homedir(), '.copilot'), name: 'Copilot' },
|
|
694
|
+
];
|
|
695
|
+
|
|
696
|
+
for (const ast of assistants) {
|
|
697
|
+
if (!fs.existsSync(ast.dir)) {
|
|
698
|
+
try { fs.mkdirSync(ast.dir, { recursive: true }); } catch { continue; }
|
|
699
|
+
}
|
|
700
|
+
try {
|
|
701
|
+
fs.copyFileSync(path.join(packageRoot, 'CLAUDE.md'), path.join(ast.dir, 'CLAUDE.md'));
|
|
702
|
+
fs.copyFileSync(path.join(packageRoot, 'AGENTS.md'), path.join(ast.dir, 'AGENTS.md'));
|
|
703
|
+
const skillsDest = path.join(ast.dir, 'skills');
|
|
704
|
+
rmRecursiveSync(skillsDest);
|
|
705
|
+
copyRecursiveSync(path.join(packageRoot, 'skills'), skillsDest);
|
|
706
|
+
console.log(` Updated rules & skills globally in ${ast.name} (${ast.dir})`);
|
|
707
|
+
} catch (e) {
|
|
708
|
+
console.warn(` ⚠️ Could not update ${ast.name}: ${e.message}`);
|
|
709
|
+
}
|
|
710
|
+
}
|
|
711
|
+
|
|
712
|
+
// Create local workspace directories
|
|
713
|
+
const dirsToCreate = [
|
|
714
|
+
'frontend', 'backend', '.worktrees', DOCS_DIR,
|
|
715
|
+
LOCAL_DIR_NAME,
|
|
716
|
+
path.join(LOCAL_DIR_NAME, 'commands'),
|
|
717
|
+
path.join(LOCAL_DIR_NAME, 'sessions'),
|
|
718
|
+
];
|
|
719
|
+
for (const dir of dirsToCreate) {
|
|
720
|
+
const dirPath = path.join(cwd, dir);
|
|
721
|
+
if (!fs.existsSync(dirPath)) {
|
|
722
|
+
fs.mkdirSync(dirPath, { recursive: true });
|
|
723
|
+
console.log(` Created local directory: ${dir}`);
|
|
724
|
+
}
|
|
725
|
+
}
|
|
726
|
+
|
|
727
|
+
// Create docs/start.md template
|
|
728
|
+
const startMdPath = path.join(cwd, START_MD);
|
|
729
|
+
if (!fs.existsSync(startMdPath)) {
|
|
730
|
+
const startMdContent = `# 🕌 IMH-Code — Project Start
|
|
731
|
+
|
|
732
|
+
> **Imam Hussain Coding Harness Platform**
|
|
733
|
+
> Write your project description below, then run \`imhcode plan\`.
|
|
734
|
+
|
|
735
|
+
---
|
|
736
|
+
|
|
737
|
+
## 📝 Your Project Description
|
|
738
|
+
|
|
739
|
+
Write your complete project idea below the markers. Be as detailed as possible.
|
|
740
|
+
Include: what you're building, who it's for, key features, preferred stack (if any).
|
|
741
|
+
|
|
742
|
+
<!-- WRITE_PROMPT_HERE -->
|
|
743
|
+
I want to build a SaaS dashboard for managing hotel room bookings with real-time availability,
|
|
744
|
+
a Next.js frontend, Laravel API backend, and PostgreSQL database.
|
|
745
|
+
<!-- END_PROMPT -->
|
|
746
|
+
|
|
747
|
+
---
|
|
748
|
+
|
|
749
|
+
## 🚀 Next Step
|
|
750
|
+
|
|
751
|
+
After writing your description, run in your terminal:
|
|
752
|
+
|
|
753
|
+
\`\`\`bash
|
|
754
|
+
imhcode plan
|
|
755
|
+
\`\`\`
|
|
756
|
+
|
|
757
|
+
This will analyze your description and generate **docs/brainstorming.md** with
|
|
758
|
+
smart questions about your project, with recommended answers you can review and edit.
|
|
759
|
+
`;
|
|
760
|
+
fs.writeFileSync(startMdPath, startMdContent, 'utf8');
|
|
761
|
+
console.log(` Created docs/start.md (write your project here)`);
|
|
762
|
+
}
|
|
763
|
+
|
|
764
|
+
// Create .gitignore
|
|
765
|
+
const localGitignore = path.join(cwd, '.gitignore');
|
|
766
|
+
if (!fs.existsSync(localGitignore)) {
|
|
767
|
+
const gitignoreTemplate = path.join(packageRoot, '.gitignore.template');
|
|
768
|
+
if (fs.existsSync(gitignoreTemplate)) {
|
|
769
|
+
fs.copyFileSync(gitignoreTemplate, localGitignore);
|
|
770
|
+
console.log(` Created local .gitignore`);
|
|
771
|
+
}
|
|
772
|
+
}
|
|
773
|
+
|
|
774
|
+
registerCliGlobally(imhcodeScriptPath);
|
|
775
|
+
ensureCavemanAndGraphify();
|
|
776
|
+
|
|
777
|
+
// ── Interactive Engine & Model Setup ────────────────────────────────────────
|
|
778
|
+
console.log('\n🔍 Scanning for local coding assistant CLIs...');
|
|
779
|
+
const engines = scanAssistantCLIs();
|
|
780
|
+
const foundEngines = Object.keys(engines).filter(k => engines[k].path);
|
|
781
|
+
|
|
782
|
+
if (foundEngines.length === 0) {
|
|
783
|
+
console.warn('\n⚠️ No local coding assistant CLIs detected.');
|
|
784
|
+
console.warn(' Supported: claude, opencode, codex, agy (Antigravity), qwen (QwenCode), mimo (MimoCode)');
|
|
785
|
+
console.warn(' Install one and re-run "imhcode" to configure model routing.\n');
|
|
786
|
+
}
|
|
787
|
+
|
|
788
|
+
let primaryEngine = 'claude';
|
|
789
|
+
const isInteractive = process.stdout.isTTY;
|
|
790
|
+
|
|
791
|
+
if (isInteractive && foundEngines.length > 0) {
|
|
792
|
+
console.log('\nFound the following local coding assistant CLIs:');
|
|
793
|
+
foundEngines.forEach((key, index) => {
|
|
794
|
+
const eng = engines[key];
|
|
795
|
+
console.log(` [${index + 1}] ${eng.name} (${key})`);
|
|
796
|
+
console.log(` Path: ${eng.path}`);
|
|
797
|
+
if (eng.models.length > 0) {
|
|
798
|
+
console.log(` Models: ${eng.models.slice(0, 3).join(', ')}${eng.models.length > 3 ? '...' : ''} (${eng.models.length} total)`);
|
|
799
|
+
}
|
|
800
|
+
});
|
|
801
|
+
|
|
802
|
+
let selectionIdx = 0;
|
|
803
|
+
while (true) {
|
|
804
|
+
const answer = await askQuestion(`\nSelect primary engine [1-${foundEngines.length}] (default: 1): `);
|
|
805
|
+
if (answer === '') { selectionIdx = 0; break; }
|
|
806
|
+
const parsed = parseInt(answer, 10);
|
|
807
|
+
if (parsed >= 1 && parsed <= foundEngines.length) { selectionIdx = parsed - 1; break; }
|
|
808
|
+
console.log(`❌ Invalid. Enter 1–${foundEngines.length}.`);
|
|
809
|
+
}
|
|
810
|
+
primaryEngine = foundEngines[selectionIdx];
|
|
811
|
+
console.log(`\n✅ Primary engine: ${engines[primaryEngine].name} (${primaryEngine})`);
|
|
812
|
+
} else if (foundEngines.length > 0) {
|
|
813
|
+
primaryEngine = foundEngines[0];
|
|
814
|
+
console.log(`\n✅ Auto-selected primary engine: ${engines[primaryEngine].name} (${primaryEngine})`);
|
|
815
|
+
}
|
|
816
|
+
|
|
817
|
+
let defaultModel = '';
|
|
818
|
+
const selectedEng = engines[primaryEngine];
|
|
819
|
+
if (selectedEng?.models?.length > 0) {
|
|
820
|
+
if (isInteractive) {
|
|
821
|
+
console.log(`\nAvailable models for ${selectedEng.name}:`);
|
|
822
|
+
selectedEng.models.forEach((m, i) => console.log(` [${i + 1}] ${m}`));
|
|
823
|
+
let modelIdx = 0;
|
|
824
|
+
while (true) {
|
|
825
|
+
const answer = await askQuestion(`Select default model [1-${selectedEng.models.length}] (default: 1): `);
|
|
826
|
+
if (answer === '') { modelIdx = 0; break; }
|
|
827
|
+
const parsed = parseInt(answer, 10);
|
|
828
|
+
if (parsed >= 1 && parsed <= selectedEng.models.length) { modelIdx = parsed - 1; break; }
|
|
829
|
+
console.log(`❌ Invalid. Enter 1–${selectedEng.models.length}.`);
|
|
830
|
+
}
|
|
831
|
+
defaultModel = selectedEng.models[modelIdx];
|
|
832
|
+
} else {
|
|
833
|
+
defaultModel = selectedEng.models[0];
|
|
834
|
+
}
|
|
835
|
+
console.log(`✅ Default model: ${defaultModel}`);
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
// ── Smart Model Routing Setup ────────────────────────────────────────────────
|
|
839
|
+
const modelRouting = await setupModelRouting(engines, foundEngines, isInteractive);
|
|
840
|
+
|
|
841
|
+
// Write config
|
|
842
|
+
const configPath = path.join(cwd, CONFIG_FILE);
|
|
843
|
+
const configData = {
|
|
844
|
+
primary_engine: primaryEngine,
|
|
845
|
+
default_model: defaultModel || undefined,
|
|
846
|
+
testing_mode: 'fast',
|
|
847
|
+
model_routing: modelRouting,
|
|
848
|
+
available_engines: {},
|
|
849
|
+
};
|
|
850
|
+
|
|
851
|
+
for (const key of foundEngines) {
|
|
852
|
+
configData.available_engines[key] = {
|
|
853
|
+
path: engines[key].path,
|
|
854
|
+
models: engines[key].models,
|
|
855
|
+
};
|
|
856
|
+
}
|
|
857
|
+
|
|
858
|
+
fs.writeFileSync(configPath, JSON.stringify(configData, null, 2), 'utf8');
|
|
859
|
+
console.log(`\n💾 Configuration saved: ${configPath}`);
|
|
860
|
+
|
|
861
|
+
// Print final guide
|
|
862
|
+
console.log(`\n✅ ${PLATFORM_NAME} initialized successfully!`);
|
|
863
|
+
console.log(`─`.repeat(60));
|
|
864
|
+
console.log(`\n🕌 HOW TO BUILD WITH IMH-CODE:\n`);
|
|
865
|
+
console.log(` 1. Open docs/start.md → Write your project description`);
|
|
866
|
+
console.log(` 2. Run: imhcode plan`);
|
|
867
|
+
console.log(` → Generates docs/brainstorming.md with smart questions`);
|
|
868
|
+
console.log(` 3. Open docs/brainstorming.md → Review/edit answers`);
|
|
869
|
+
console.log(` 4. Run: imhcode plan`);
|
|
870
|
+
console.log(` → Reads your answers → generates sprint plans`);
|
|
871
|
+
console.log(` 5. Run: imhcode execute 1 → Execute Sprint 1`);
|
|
872
|
+
console.log(` 6. Run: imhcode execute 2 → Execute Sprint 2`);
|
|
873
|
+
console.log(` 7. Run: imhcode test → Final testing + security + SEO`);
|
|
874
|
+
console.log(`\n Run "imhcode --help" for all commands.`);
|
|
875
|
+
console.log(`─`.repeat(60));
|
|
876
|
+
console.log('');
|
|
877
|
+
}
|
|
878
|
+
|
|
879
|
+
// ─── Model Routing Setup Wizard ───────────────────────────────────────────────
|
|
880
|
+
|
|
881
|
+
async function setupModelRouting(engines, foundEngines, isInteractive) {
|
|
882
|
+
const categories = {
|
|
883
|
+
frontend: {
|
|
884
|
+
label: 'Frontend (UI/UX, components, animations)',
|
|
885
|
+
note: 'Mimo v2.5 Pro preferred → GPT-5.5 → Claude Opus',
|
|
886
|
+
preferredEngines: ['mimo', 'codex', 'claude', 'opencode'],
|
|
887
|
+
preferredModels: ['mimo-vl-v2.5-pro', 'gpt-5.5', 'claude-opus-4-6', 'deepseek-v4-pro'],
|
|
888
|
+
},
|
|
889
|
+
backend: {
|
|
890
|
+
label: 'Backend (APIs, database, business logic)',
|
|
891
|
+
note: 'DeepSeek V4 Pro preferred → GPT-5.5 → Qwen Coder',
|
|
892
|
+
preferredEngines: ['opencode', 'codex', 'qwen', 'claude'],
|
|
893
|
+
preferredModels: ['deepseek-v4-pro', 'gpt-5.5', 'qwen3-coder-max', 'claude-sonnet-4-5'],
|
|
894
|
+
},
|
|
895
|
+
planning: {
|
|
896
|
+
label: 'Planning (brainstorming, sprint planning, architecture)',
|
|
897
|
+
note: 'Claude Opus preferred → GPT-5.5',
|
|
898
|
+
preferredEngines: ['claude', 'codex', 'opencode'],
|
|
899
|
+
preferredModels: ['claude-opus-4-6', 'gpt-5.5', 'deepseek-v4-pro'],
|
|
900
|
+
},
|
|
901
|
+
testing: {
|
|
902
|
+
label: 'Testing (QA, security audit, E2E)',
|
|
903
|
+
note: 'GPT-5.5 preferred → Claude Opus → DeepSeek',
|
|
904
|
+
preferredEngines: ['codex', 'claude', 'opencode'],
|
|
905
|
+
preferredModels: ['gpt-5.5', 'claude-opus-4-6', 'deepseek-v4-pro'],
|
|
906
|
+
},
|
|
907
|
+
review: {
|
|
908
|
+
label: 'Review (SEO, debugging, code review)',
|
|
909
|
+
note: 'GPT-5.5 preferred → Claude Sonnet',
|
|
910
|
+
preferredEngines: ['codex', 'claude', 'opencode'],
|
|
911
|
+
preferredModels: ['gpt-5.5', 'claude-sonnet-4-5', 'deepseek-v4'],
|
|
912
|
+
},
|
|
913
|
+
fast: {
|
|
914
|
+
label: 'Fast (boilerplate, config, simple tasks)',
|
|
915
|
+
note: 'DeepSeek V4 Flash preferred → Gemini Flash → GPT Mini',
|
|
916
|
+
preferredEngines: ['opencode', 'codex', 'qwen', 'claude'],
|
|
917
|
+
preferredModels: ['deepseek-v4-flash', 'gpt-5.4-mini', 'qwen3-coder-flash', 'claude-haiku-3-5'],
|
|
918
|
+
},
|
|
919
|
+
};
|
|
920
|
+
|
|
921
|
+
const routing = {};
|
|
922
|
+
|
|
923
|
+
// Build recommended routing from available engines
|
|
924
|
+
const recommended = {};
|
|
925
|
+
for (const [cat, cfg] of Object.entries(categories)) {
|
|
926
|
+
let found = false;
|
|
927
|
+
for (let i = 0; i < cfg.preferredEngines.length; i++) {
|
|
928
|
+
const eng = cfg.preferredEngines[i];
|
|
929
|
+
const mdl = cfg.preferredModels[i];
|
|
930
|
+
const engData = engines[eng];
|
|
931
|
+
if (engData?.path && engData.models.length > 0) {
|
|
932
|
+
const match = engData.models.find(m => m.toLowerCase().includes(mdl.replace(/-/g, '').replace(/\./g, '')));
|
|
933
|
+
recommended[cat] = { engine: eng, model: match || engData.models[0] };
|
|
934
|
+
found = true;
|
|
935
|
+
break;
|
|
936
|
+
}
|
|
937
|
+
}
|
|
938
|
+
if (!found && foundEngines.length > 0) {
|
|
939
|
+
// Fallback to primary engine
|
|
940
|
+
const fe = foundEngines[0];
|
|
941
|
+
recommended[cat] = { engine: fe, model: engines[fe].models[0] || 'default' };
|
|
942
|
+
}
|
|
943
|
+
}
|
|
944
|
+
|
|
945
|
+
// Show recommended routing table
|
|
946
|
+
console.log('\n' + '─'.repeat(60));
|
|
947
|
+
console.log('🧠 Recommended Model Routing (based on your installed engines):\n');
|
|
948
|
+
console.log(' Category │ Engine │ Model');
|
|
949
|
+
console.log(' ─────────────────────────────────────────────────────────');
|
|
950
|
+
for (const [cat, rec] of Object.entries(recommended)) {
|
|
951
|
+
const catLabel = cat.padEnd(12);
|
|
952
|
+
const eng = (rec.engine || '?').padEnd(12);
|
|
953
|
+
const mdl = rec.model || '?';
|
|
954
|
+
const cfg = categories[cat];
|
|
955
|
+
console.log(` ${catLabel} │ ${eng} │ ${mdl}`);
|
|
956
|
+
}
|
|
957
|
+
console.log(' ' + '─'.repeat(57));
|
|
958
|
+
console.log(`\n Preferences: ${categories.frontend.note}`);
|
|
959
|
+
|
|
960
|
+
if (isInteractive) {
|
|
961
|
+
const answer = await askQuestion('\nAccept recommended routing? [Y/n] ');
|
|
962
|
+
if (answer.toLowerCase() === 'n' || answer.toLowerCase() === 'no') {
|
|
963
|
+
// Let user customize each category
|
|
964
|
+
for (const [cat, cfg] of Object.entries(categories)) {
|
|
965
|
+
console.log(`\n Configure model for [${cat}] — ${cfg.label}`);
|
|
966
|
+
console.log(` (${cfg.note})`);
|
|
967
|
+
|
|
968
|
+
// Collect all available models across all engines
|
|
969
|
+
const allModels = [];
|
|
970
|
+
for (const eng of foundEngines) {
|
|
971
|
+
for (const m of engines[eng].models) {
|
|
972
|
+
allModels.push({ engine: eng, model: m });
|
|
973
|
+
}
|
|
974
|
+
}
|
|
975
|
+
|
|
976
|
+
if (allModels.length === 0) {
|
|
977
|
+
routing[cat] = recommended[cat];
|
|
978
|
+
continue;
|
|
979
|
+
}
|
|
980
|
+
|
|
981
|
+
allModels.forEach((item, i) => {
|
|
982
|
+
const rec = recommended[cat];
|
|
983
|
+
const isRec = rec && rec.engine === item.engine && rec.model === item.model;
|
|
984
|
+
console.log(` [${i + 1}] ${item.model} (${item.engine})${isRec ? ' ← Recommended' : ''}`);
|
|
985
|
+
});
|
|
986
|
+
|
|
987
|
+
let selectedIdx = allModels.findIndex(m => {
|
|
988
|
+
const rec = recommended[cat];
|
|
989
|
+
return rec && m.engine === rec.engine && m.model === rec.model;
|
|
990
|
+
});
|
|
991
|
+
if (selectedIdx < 0) selectedIdx = 0;
|
|
992
|
+
|
|
993
|
+
while (true) {
|
|
994
|
+
const ans = await askQuestion(` Select model for ${cat} [1-${allModels.length}] (default: ${selectedIdx + 1}): `);
|
|
995
|
+
if (ans === '') { routing[cat] = allModels[selectedIdx]; break; }
|
|
996
|
+
const p = parseInt(ans, 10);
|
|
997
|
+
if (p >= 1 && p <= allModels.length) { routing[cat] = allModels[p - 1]; break; }
|
|
998
|
+
console.log(` ❌ Invalid. Enter 1–${allModels.length}.`);
|
|
999
|
+
}
|
|
1000
|
+
console.log(` ✅ ${cat}: ${routing[cat].model} (${routing[cat].engine})`);
|
|
1001
|
+
}
|
|
1002
|
+
} else {
|
|
1003
|
+
Object.assign(routing, recommended);
|
|
1004
|
+
console.log('\n✅ Recommended routing accepted.');
|
|
1005
|
+
}
|
|
1006
|
+
} else {
|
|
1007
|
+
Object.assign(routing, recommended);
|
|
1008
|
+
console.log('\n✅ Recommended routing applied automatically.');
|
|
1009
|
+
}
|
|
1010
|
+
|
|
1011
|
+
return routing;
|
|
1012
|
+
}
|
|
1013
|
+
|
|
1014
|
+
// ─── Brainstorming Generator ───────────────────────────────────────────────────
|
|
1015
|
+
|
|
1016
|
+
async function generateBrainstormingDoc(cwd, userPrompt) {
|
|
1017
|
+
// Analyze keywords in the prompt to determine which sections to include
|
|
1018
|
+
const p = userPrompt.toLowerCase();
|
|
1019
|
+
|
|
1020
|
+
const hasFrontend = p.includes('frontend') || p.includes('ui') || p.includes('dashboard') ||
|
|
1021
|
+
p.includes('design') || p.includes('page') || p.includes('web') ||
|
|
1022
|
+
p.includes('next') || p.includes('react') || p.includes('vue');
|
|
1023
|
+
const hasBackend = p.includes('backend') || p.includes('api') || p.includes('database') ||
|
|
1024
|
+
p.includes('server') || p.includes('laravel') || p.includes('django') ||
|
|
1025
|
+
p.includes('fastapi') || p.includes('auth') || p.includes('data');
|
|
1026
|
+
const hasMobile = p.includes('mobile') || p.includes('flutter') || p.includes('ios') ||
|
|
1027
|
+
p.includes('android') || p.includes('react native') || p.includes('expo');
|
|
1028
|
+
|
|
1029
|
+
// Infer default stack
|
|
1030
|
+
const defaultFrontend = hasFrontend ? (p.includes('vue') ? 'Vue 3 + Nuxt 4' : 'Next.js 15') : 'Next.js 15';
|
|
1031
|
+
const defaultBackend = hasBackend ? (p.includes('python') || p.includes('django') ? 'Python/FastAPI' :
|
|
1032
|
+
p.includes('java') ? 'Java/Spring Boot' : 'Laravel 11') : 'Laravel 11';
|
|
1033
|
+
|
|
1034
|
+
const content = `# 🧠 IMH-Code — Project Brainstorming
|
|
1035
|
+
|
|
1036
|
+
> Auto-generated by \`imhcode plan\` on ${new Date().toLocaleDateString()}
|
|
1037
|
+
> Review and edit the "**Your Answer**" fields below, then run \`imhcode plan\` again.
|
|
1038
|
+
|
|
1039
|
+
---
|
|
1040
|
+
|
|
1041
|
+
## 📋 General Requirements
|
|
1042
|
+
|
|
1043
|
+
**Q1: What is the primary goal of this project?**
|
|
1044
|
+
> **Recommended:** ${userPrompt.split('.')[0].trim()}
|
|
1045
|
+
> **Your Answer:** *(edit if needed)*
|
|
1046
|
+
|
|
1047
|
+
**Q2: Who are the target users?**
|
|
1048
|
+
> **Recommended:** Business users / customers (based on your description)
|
|
1049
|
+
> **Your Answer:** *(edit if needed)*
|
|
1050
|
+
|
|
1051
|
+
**Q3: What is the expected scale at launch?**
|
|
1052
|
+
> **Recommended:** Small-medium (< 1,000 users initially)
|
|
1053
|
+
> **Your Answer:** *(edit if needed)*
|
|
1054
|
+
|
|
1055
|
+
**Q4: What is the timeline?**
|
|
1056
|
+
> **Recommended:** MVP in 2-4 sprints (4-8 weeks)
|
|
1057
|
+
> **Your Answer:** *(edit if needed)*
|
|
1058
|
+
|
|
1059
|
+
---
|
|
1060
|
+
${hasFrontend ? `
|
|
1061
|
+
## 🎨 Frontend
|
|
1062
|
+
|
|
1063
|
+
**Q5: Which frontend framework?**
|
|
1064
|
+
> **Recommended:** ${defaultFrontend}
|
|
1065
|
+
> **Your Answer:** *(edit if needed)*
|
|
1066
|
+
|
|
1067
|
+
**Q6: UI Component library?**
|
|
1068
|
+
> **Recommended:** shadcn/ui + Tailwind CSS v4
|
|
1069
|
+
> **Your Answer:** *(edit if needed)*
|
|
1070
|
+
|
|
1071
|
+
**Q7: Do you need animations/3D effects?**
|
|
1072
|
+
> **Recommended:** Light micro-animations (GSAP ScrollTrigger)
|
|
1073
|
+
> **Your Answer:** *(yes — specify / no)*
|
|
1074
|
+
|
|
1075
|
+
**Q8: Mobile responsive?**
|
|
1076
|
+
> **Recommended:** Yes (mobile-first responsive design)
|
|
1077
|
+
> **Your Answer:** *(edit if needed)*
|
|
1078
|
+
|
|
1079
|
+
**Q9: Dark mode support?**
|
|
1080
|
+
> **Recommended:** Yes (dark/light toggle)
|
|
1081
|
+
> **Your Answer:** *(yes / no)*
|
|
1082
|
+
|
|
1083
|
+
**Q10: Preferred design style?**
|
|
1084
|
+
> **Recommended:** Modern SaaS (glassmorphism, clean, premium)
|
|
1085
|
+
> **Your Answer:** *(edit if needed)*
|
|
1086
|
+
` : ''}
|
|
1087
|
+
${hasBackend ? `
|
|
1088
|
+
## 🔧 Backend
|
|
1089
|
+
|
|
1090
|
+
**Q11: Which backend framework?**
|
|
1091
|
+
> **Recommended:** ${defaultBackend}
|
|
1092
|
+
> **Your Answer:** *(edit if needed)*
|
|
1093
|
+
|
|
1094
|
+
**Q12: Database?**
|
|
1095
|
+
> **Recommended:** PostgreSQL + Redis (caching)
|
|
1096
|
+
> **Your Answer:** *(edit if needed)*
|
|
1097
|
+
|
|
1098
|
+
**Q13: Authentication system?**
|
|
1099
|
+
> **Recommended:** JWT tokens + email verification
|
|
1100
|
+
> **Your Answer:** *(JWT / session / OAuth / other)*
|
|
1101
|
+
|
|
1102
|
+
**Q14: API architecture?**
|
|
1103
|
+
> **Recommended:** RESTful API
|
|
1104
|
+
> **Your Answer:** *(REST / GraphQL / both)*
|
|
1105
|
+
|
|
1106
|
+
**Q15: Do you need file uploads?**
|
|
1107
|
+
> **Recommended:** Yes (S3-compatible storage)
|
|
1108
|
+
> **Your Answer:** *(yes / no)*
|
|
1109
|
+
|
|
1110
|
+
**Q16: Real-time features?**
|
|
1111
|
+
> **Recommended:** No (for MVP)
|
|
1112
|
+
> **Your Answer:** *(yes — specify / no)*
|
|
1113
|
+
|
|
1114
|
+
**Q17: Payment integration?**
|
|
1115
|
+
> **Recommended:** No (for MVP)
|
|
1116
|
+
> **Your Answer:** *(yes — specify provider / no)*
|
|
1117
|
+
` : ''}
|
|
1118
|
+
${hasMobile ? `
|
|
1119
|
+
## 📱 Mobile
|
|
1120
|
+
|
|
1121
|
+
**Q18: Target platforms?**
|
|
1122
|
+
> **Recommended:** iOS + Android (cross-platform)
|
|
1123
|
+
> **Your Answer:** *(iOS only / Android only / both)*
|
|
1124
|
+
|
|
1125
|
+
**Q19: Mobile framework?**
|
|
1126
|
+
> **Recommended:** Flutter
|
|
1127
|
+
> **Your Answer:** *(Flutter / React Native / both)*
|
|
1128
|
+
|
|
1129
|
+
**Q20: Offline support?**
|
|
1130
|
+
> **Recommended:** No (for MVP)
|
|
1131
|
+
> **Your Answer:** *(yes / no)*
|
|
1132
|
+
` : ''}
|
|
1133
|
+
|
|
1134
|
+
## 🚀 Deployment
|
|
1135
|
+
|
|
1136
|
+
**Q21: Deployment platform?**
|
|
1137
|
+
> **Recommended:** Vercel (frontend) + DigitalOcean/Railway (backend)
|
|
1138
|
+
> **Your Answer:** *(edit if needed)*
|
|
1139
|
+
|
|
1140
|
+
**Q22: Do you need Docker containerization?**
|
|
1141
|
+
> **Recommended:** Yes
|
|
1142
|
+
> **Your Answer:** *(yes / no)*
|
|
1143
|
+
|
|
1144
|
+
**Q23: CI/CD pipeline?**
|
|
1145
|
+
> **Recommended:** GitHub Actions
|
|
1146
|
+
> **Your Answer:** *(yes / no)*
|
|
1147
|
+
|
|
1148
|
+
---
|
|
1149
|
+
|
|
1150
|
+
## 🧪 Testing Strategy
|
|
1151
|
+
|
|
1152
|
+
**Q24: How should testing be handled?**
|
|
1153
|
+
|
|
1154
|
+
Options:
|
|
1155
|
+
- **[A] Fast Mode (Recommended for MVPs)** — No testing during development sprints.
|
|
1156
|
+
A dedicated final sprint handles all testing, security audit, SEO, and browser testing.
|
|
1157
|
+
3-5x faster for initial development.
|
|
1158
|
+
|
|
1159
|
+
- **[B] Balanced Mode** — Basic smoke tests per sprint. Full test suite at end.
|
|
1160
|
+
~80% development speed of Fast Mode.
|
|
1161
|
+
|
|
1162
|
+
- **[C] Strict TDD Mode** — Full Red-Green-Refactor on every task.
|
|
1163
|
+
Slowest but highest quality. Only for healthcare, finance, compliance projects.
|
|
1164
|
+
|
|
1165
|
+
> **Recommended:** A (Fast Mode)
|
|
1166
|
+
> **Your Answer:** A *(change to B or C if needed)*
|
|
1167
|
+
|
|
1168
|
+
---
|
|
1169
|
+
|
|
1170
|
+
## 🔒 Security
|
|
1171
|
+
|
|
1172
|
+
**Q25: Security audit timing?**
|
|
1173
|
+
> **Recommended:** Final sprint only (OWASP Top 10 + dependency scan)
|
|
1174
|
+
> **Your Answer:** *(final sprint only / every sprint)*
|
|
1175
|
+
|
|
1176
|
+
---
|
|
1177
|
+
|
|
1178
|
+
## 🌐 SEO (if web app)
|
|
1179
|
+
|
|
1180
|
+
**Q26: SEO requirements?**
|
|
1181
|
+
> **Recommended:** Technical SEO in final sprint (meta tags, Core Web Vitals, structured data)
|
|
1182
|
+
> **Your Answer:** *(final sprint only / every sprint / not needed)*
|
|
1183
|
+
|
|
1184
|
+
---
|
|
1185
|
+
|
|
1186
|
+
## 📝 Additional Notes
|
|
1187
|
+
|
|
1188
|
+
Write any additional requirements, constraints, or preferences here:
|
|
1189
|
+
|
|
1190
|
+
> *(Your notes here)*
|
|
1191
|
+
|
|
1192
|
+
---
|
|
1193
|
+
|
|
1194
|
+
*When ready, run \`imhcode plan\` to generate sprint plans from your answers.*
|
|
1195
|
+
`;
|
|
1196
|
+
|
|
1197
|
+
const brainstormPath = path.join(cwd, BRAINSTORM_MD);
|
|
1198
|
+
fs.mkdirSync(path.join(cwd, DOCS_DIR), { recursive: true });
|
|
1199
|
+
fs.writeFileSync(brainstormPath, content, 'utf8');
|
|
1200
|
+
}
|
|
1201
|
+
|
|
1202
|
+
// ─── Sprint Plan Generator ────────────────────────────────────────────────────
|
|
1203
|
+
|
|
1204
|
+
async function generateSprintPlans(cwd, userPrompt, brainstormContent, config) {
|
|
1205
|
+
// Parse answers from brainstorming
|
|
1206
|
+
const testingMode = extractAnswer(brainstormContent, 'Q24', 'A').trim().toUpperCase();
|
|
1207
|
+
const hasFrontend = brainstormContent.includes('frontend') || brainstormContent.includes('Next.js') || brainstormContent.includes('Vue');
|
|
1208
|
+
const hasBackend = brainstormContent.includes('Laravel') || brainstormContent.includes('Python') || brainstormContent.includes('Django') || brainstormContent.includes('Java');
|
|
1209
|
+
|
|
1210
|
+
const detectedTesting = testingMode === 'B' ? 'balanced' : testingMode === 'C' ? 'strict' : 'fast';
|
|
1211
|
+
|
|
1212
|
+
// Save testing mode to config
|
|
1213
|
+
if (config) {
|
|
1214
|
+
config.testing_mode = detectedTesting;
|
|
1215
|
+
const configPath = path.join(cwd, CONFIG_FILE);
|
|
1216
|
+
fs.writeFileSync(configPath, JSON.stringify(config, null, 2), 'utf8');
|
|
1217
|
+
}
|
|
1218
|
+
|
|
1219
|
+
// Generate PROJECT_BRIEF.md
|
|
1220
|
+
const briefContent = generateProjectBrief(userPrompt, brainstormContent);
|
|
1221
|
+
fs.writeFileSync(path.join(cwd, BRIEF_MD), briefContent, 'utf8');
|
|
1222
|
+
console.log(` ✅ Created PROJECT_BRIEF.md`);
|
|
1223
|
+
|
|
1224
|
+
// Generate Sprint 1 (Foundation)
|
|
1225
|
+
await generateSprint(cwd, 1, 'Foundation & Setup', [
|
|
1226
|
+
{ task: 'Initialize project structure and configure environments', agent: 'devops-executor', tier: 'light', deps: [] },
|
|
1227
|
+
{ task: 'Set up database schema and migrations', agent: hasBackend ? 'laravel-executor' : 'python-executor', tier: 'standard', deps: [1] },
|
|
1228
|
+
{ task: 'Implement authentication system (register, login, logout)', agent: hasBackend ? 'laravel-executor' : 'python-executor', tier: 'complex', deps: [2] },
|
|
1229
|
+
...(hasFrontend ? [
|
|
1230
|
+
{ task: 'Set up frontend project with design system and component library', agent: 'nextjs-executor', tier: 'standard', deps: [1] },
|
|
1231
|
+
{ task: 'Build authentication UI pages (login, register, forgot password)', agent: 'nextjs-executor', tier: 'standard', deps: [3, 4] },
|
|
1232
|
+
] : []),
|
|
1233
|
+
], detectedTesting);
|
|
1234
|
+
|
|
1235
|
+
// Generate Sprint 2 (Core Features)
|
|
1236
|
+
await generateSprint(cwd, 2, 'Core Features', [
|
|
1237
|
+
{ task: 'Build main API endpoints for core business logic', agent: hasBackend ? 'laravel-executor' : 'python-executor', tier: 'complex', deps: [] },
|
|
1238
|
+
...(hasFrontend ? [
|
|
1239
|
+
{ task: 'Build dashboard layout with navigation and sidebar', agent: 'nextjs-executor', tier: 'standard', deps: [] },
|
|
1240
|
+
{ task: 'Implement main feature pages and components', agent: 'nextjs-executor', tier: 'complex', deps: [2] },
|
|
1241
|
+
{ task: 'Connect frontend to backend API with error handling', agent: 'nextjs-executor', tier: 'standard', deps: [1, 3] },
|
|
1242
|
+
] : []),
|
|
1243
|
+
{ task: 'Implement user settings and profile management', agent: hasBackend ? 'laravel-executor' : 'python-executor', tier: 'standard', deps: [1] },
|
|
1244
|
+
], detectedTesting);
|
|
1245
|
+
|
|
1246
|
+
// Determine last sprint number
|
|
1247
|
+
let lastSprintNum = 2;
|
|
1248
|
+
|
|
1249
|
+
// If testing mode is fast/balanced, auto-generate testing sprint
|
|
1250
|
+
if (detectedTesting !== 'strict') {
|
|
1251
|
+
const testingSprintNum = lastSprintNum + 1;
|
|
1252
|
+
await generateTestingSprint(cwd, testingSprintNum, hasFrontend, hasBackend);
|
|
1253
|
+
console.log(` ✅ Created auto-generated Testing Sprint ${testingSprintNum}`);
|
|
1254
|
+
}
|
|
1255
|
+
|
|
1256
|
+
// Update compact context
|
|
1257
|
+
const contextContent = `# IMH-Code Project Context
|
|
1258
|
+
|
|
1259
|
+
Generated: ${new Date().toLocaleDateString()}
|
|
1260
|
+
Project: ${userPrompt.slice(0, 100)}...
|
|
1261
|
+
Testing Mode: ${detectedTesting}
|
|
1262
|
+
Sprints: ${lastSprintNum + (detectedTesting !== 'strict' ? 1 : 0)} total
|
|
1263
|
+
|
|
1264
|
+
## Stack
|
|
1265
|
+
${hasFrontend ? '- Frontend: Next.js 15 + shadcn/ui + Tailwind CSS v4' : ''}
|
|
1266
|
+
${hasBackend ? '- Backend: Laravel 11 + PostgreSQL + Redis' : ''}
|
|
1267
|
+
- Auth: JWT tokens
|
|
1268
|
+
- Deployment: Docker + GitHub Actions
|
|
1269
|
+
|
|
1270
|
+
## Directory Structure
|
|
1271
|
+
- frontend/ — All frontend code
|
|
1272
|
+
- backend/ — All backend code
|
|
1273
|
+
- docs/ — Sprint plans and documentation
|
|
1274
|
+
|
|
1275
|
+
## Current Sprint
|
|
1276
|
+
Sprint 1 (not started)
|
|
1277
|
+
|
|
1278
|
+
## Key Files
|
|
1279
|
+
${hasFrontend ? '- frontend/app/ — Next.js pages' : ''}
|
|
1280
|
+
${hasBackend ? '- backend/routes/api.php — API routes' : ''}
|
|
1281
|
+
${hasBackend ? '- backend/app/Models/ — Eloquent models' : ''}
|
|
1282
|
+
`;
|
|
1283
|
+
|
|
1284
|
+
fs.mkdirSync(path.join(cwd, LOCAL_DIR_NAME), { recursive: true });
|
|
1285
|
+
fs.writeFileSync(path.join(cwd, CONTEXT_MD), contextContent, 'utf8');
|
|
1286
|
+
console.log(` ✅ Created .imhcode/context.md (compact context)`);
|
|
1287
|
+
}
|
|
1288
|
+
|
|
1289
|
+
async function generateSprint(cwd, sprintNum, title, tasks, testingMode) {
|
|
1290
|
+
const sprintDir = path.join(cwd, DOCS_DIR, `sprint-${sprintNum}`);
|
|
1291
|
+
const tasksDir = path.join(sprintDir, 'tasks');
|
|
1292
|
+
fs.mkdirSync(tasksDir, { recursive: true });
|
|
1293
|
+
|
|
1294
|
+
// plan.md
|
|
1295
|
+
const tddNote = testingMode === 'strict' ? '**Testing Mode: Strict TDD** — Write failing tests first.' :
|
|
1296
|
+
testingMode === 'balanced' ? '**Testing Mode: Balanced** — Basic smoke tests per task.' :
|
|
1297
|
+
'**Testing Mode: Fast** — No tests during this sprint. Tests handled in final sprint.';
|
|
1298
|
+
|
|
1299
|
+
let planMd = `# Sprint ${sprintNum}: ${title}
|
|
1300
|
+
|
|
1301
|
+
> ${tddNote}
|
|
1302
|
+
|
|
1303
|
+
## Task Table
|
|
1304
|
+
|
|
1305
|
+
| # | Task | Agent | Tier | Depends On |
|
|
1306
|
+
|---|------|-------|------|-----------|
|
|
1307
|
+
${tasks.map((t, i) => `| ${i+1} | ${t.task} | \`${t.agent}\` | ${t.tier} | ${t.deps.length ? t.deps.join(', ') : '—'} |`).join('\n')}
|
|
1308
|
+
|
|
1309
|
+
## Sprint Goals
|
|
1310
|
+
- Complete all ${tasks.length} tasks in dependency order
|
|
1311
|
+
- Update PROJECT_BRIEF.md after completion
|
|
1312
|
+
- Update .imhcode/context.md with what was built
|
|
1313
|
+
`;
|
|
1314
|
+
|
|
1315
|
+
fs.writeFileSync(path.join(sprintDir, 'plan.md'), planMd, 'utf8');
|
|
1316
|
+
|
|
1317
|
+
// progress.md
|
|
1318
|
+
const progressMd = `# Sprint ${sprintNum} Progress
|
|
1319
|
+
|
|
1320
|
+
Status: 🟡 Not Started
|
|
1321
|
+
Start: —
|
|
1322
|
+
End: —
|
|
1323
|
+
|
|
1324
|
+
## Task Status
|
|
1325
|
+
${tasks.map((t, i) => `- [ ] Task ${i+1}: ${t.task}`).join('\n')}
|
|
1326
|
+
`;
|
|
1327
|
+
fs.writeFileSync(path.join(sprintDir, 'progress.md'), progressMd, 'utf8');
|
|
1328
|
+
|
|
1329
|
+
// deferred.md
|
|
1330
|
+
fs.writeFileSync(path.join(sprintDir, 'deferred.md'), `# Sprint ${sprintNum} Deferred Items\n\nNone yet.\n`, 'utf8');
|
|
1331
|
+
|
|
1332
|
+
// Individual task scripts
|
|
1333
|
+
for (let i = 0; i < tasks.length; i++) {
|
|
1334
|
+
const t = tasks[i];
|
|
1335
|
+
const taskNum = i + 1;
|
|
1336
|
+
const testingFlag = testingMode === 'strict' ? '# Testing mode: strict — include TDD instructions\nTASK="[STRICT TDD] ${t.task}: Write failing tests first, then implement."' :
|
|
1337
|
+
testingMode === 'balanced' ? `TASK="[BALANCED] ${t.task}: Add basic smoke tests."` :
|
|
1338
|
+
`TASK="${t.task}"`;
|
|
1339
|
+
|
|
1340
|
+
const taskScript = `#!/bin/bash
|
|
1341
|
+
# IMH-Code — Sprint ${sprintNum} Task ${taskNum}
|
|
1342
|
+
# Task: ${t.task}
|
|
1343
|
+
# Agent: ${t.agent}
|
|
1344
|
+
# Tier: ${t.tier}
|
|
1345
|
+
CWD="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
1346
|
+
cd "$CWD/../../../.."
|
|
1347
|
+
|
|
1348
|
+
${testingFlag}
|
|
1349
|
+
|
|
1350
|
+
echo "📋 Running Task ${taskNum}: ${t.task}"
|
|
1351
|
+
echo " Agent: ${t.agent} | Tier: ${t.tier}"
|
|
1352
|
+
|
|
1353
|
+
if command -v imhcode >/dev/null 2>&1; then
|
|
1354
|
+
imhcode agent run ${t.agent} "$TASK" --live
|
|
1355
|
+
else
|
|
1356
|
+
node "$(npm root -g)/imhcode/bin/imhcode.js" agent run ${t.agent} "$TASK" --live
|
|
1357
|
+
fi
|
|
1358
|
+
`;
|
|
1359
|
+
fs.writeFileSync(path.join(tasksDir, `task_${taskNum}.sh`), taskScript, { mode: 0o755 });
|
|
1360
|
+
}
|
|
1361
|
+
|
|
1362
|
+
// run_all_tasks.sh (respects dependency ordering)
|
|
1363
|
+
const masterScript = `#!/bin/bash
|
|
1364
|
+
# IMH-Code — Sprint ${sprintNum}: ${title}
|
|
1365
|
+
# Run all tasks in dependency order
|
|
1366
|
+
set -e
|
|
1367
|
+
CWD="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
1368
|
+
TASKS_DIR="$CWD/tasks"
|
|
1369
|
+
|
|
1370
|
+
echo ""
|
|
1371
|
+
echo "🕌 IMH-Code — Executing Sprint ${sprintNum}: ${title}"
|
|
1372
|
+
echo " Tasks: ${tasks.length}"
|
|
1373
|
+
echo ""
|
|
1374
|
+
|
|
1375
|
+
${tasks.map((t, i) => {
|
|
1376
|
+
const taskNum = i + 1;
|
|
1377
|
+
return `echo "\\n─────────────────────────────────────────────────────────────"
|
|
1378
|
+
echo "📋 Task ${taskNum}/${tasks.length}: ${t.task}"
|
|
1379
|
+
echo "─────────────────────────────────────────────────────────────"
|
|
1380
|
+
bash "$TASKS_DIR/task_${taskNum}.sh"`;
|
|
1381
|
+
}).join('\n\n')}
|
|
1382
|
+
|
|
1383
|
+
echo ""
|
|
1384
|
+
echo "✅ Sprint ${sprintNum} complete! All ${tasks.length} tasks executed."
|
|
1385
|
+
echo " Run: imhcode execute ${sprintNum + 1}"
|
|
1386
|
+
echo ""
|
|
1387
|
+
`;
|
|
1388
|
+
fs.writeFileSync(path.join(sprintDir, 'run_all_tasks.sh'), masterScript, { mode: 0o755 });
|
|
1389
|
+
|
|
1390
|
+
console.log(` ✅ Created Sprint ${sprintNum}: ${title} (${tasks.length} tasks)`);
|
|
1391
|
+
}
|
|
1392
|
+
|
|
1393
|
+
async function generateTestingSprint(cwd, sprintNum, hasFrontend, hasBackend) {
|
|
1394
|
+
const tasks = [
|
|
1395
|
+
{ task: 'Write unit tests for all backend API endpoints', agent: 'tester', tier: 'standard', deps: [] },
|
|
1396
|
+
{ task: 'Write integration tests for core API flows', agent: 'tester', tier: 'complex', deps: [1] },
|
|
1397
|
+
...(hasFrontend ? [
|
|
1398
|
+
{ task: 'Write component tests for all frontend pages and components', agent: 'tester', tier: 'standard', deps: [] },
|
|
1399
|
+
{ task: 'Run E2E browser tests with Playwright (all critical user flows)', agent: 'tester', tier: 'complex', deps: [3] },
|
|
1400
|
+
] : []),
|
|
1401
|
+
{ task: 'Run security audit: OWASP Top 10, dependency vulnerabilities, auth testing', agent: 'security-auditor', tier: 'complex', deps: [] },
|
|
1402
|
+
...(hasFrontend ? [
|
|
1403
|
+
{ task: 'Run SEO audit: Core Web Vitals, meta tags, structured data, sitemap', agent: 'seo-optimizer', tier: 'standard', deps: [] },
|
|
1404
|
+
{ task: 'Run accessibility audit (WCAG 2.1 AA) and fix critical issues', agent: 'tester', tier: 'standard', deps: [3, 4] },
|
|
1405
|
+
] : []),
|
|
1406
|
+
{ task: 'Generate final test coverage report and fix failing tests', agent: 'tester', tier: 'standard', deps: [] },
|
|
1407
|
+
];
|
|
1408
|
+
|
|
1409
|
+
await generateSprint(cwd, sprintNum, 'Testing, Security & SEO Audit', tasks, 'fast');
|
|
1410
|
+
}
|
|
1411
|
+
|
|
1412
|
+
// ─── Helper Functions ─────────────────────────────────────────────────────────
|
|
1413
|
+
|
|
1414
|
+
function generateProjectBrief(userPrompt, brainstormContent) {
|
|
1415
|
+
return `# PROJECT_BRIEF.md
|
|
1416
|
+
|
|
1417
|
+
> **IMH-Code — Imam Hussain Coding Harness Platform**
|
|
1418
|
+
> This file is the centralized context memory for the project.
|
|
1419
|
+
> Updated after each sprint by the planner agent.
|
|
1420
|
+
|
|
1421
|
+
## Project Summary
|
|
1422
|
+
|
|
1423
|
+
${userPrompt}
|
|
1424
|
+
|
|
1425
|
+
## Status
|
|
1426
|
+
|
|
1427
|
+
- **Current Sprint**: Sprint 1
|
|
1428
|
+
- **Testing Mode**: Fast (final sprint only)
|
|
1429
|
+
- **Generated**: ${new Date().toLocaleDateString()}
|
|
1430
|
+
|
|
1431
|
+
## Key Architecture Decisions
|
|
1432
|
+
|
|
1433
|
+
*(Will be updated as sprints complete)*
|
|
1434
|
+
|
|
1435
|
+
## Sprint Log
|
|
1436
|
+
|
|
1437
|
+
| Sprint | Title | Status |
|
|
1438
|
+
|--------|-------|--------|
|
|
1439
|
+
| 1 | Foundation & Setup | 🟡 Not Started |
|
|
1440
|
+
| 2 | Core Features | ⬜ Pending |
|
|
1441
|
+
| N | Testing & Audit | ⬜ Pending |
|
|
1442
|
+
`;
|
|
1443
|
+
}
|
|
1444
|
+
|
|
1445
|
+
function extractPromptFromStartMd(content) {
|
|
1446
|
+
const match = content.match(/<!-- WRITE_PROMPT_HERE -->([\s\S]*?)<!-- END_PROMPT -->/);
|
|
1447
|
+
if (match) return match[1].trim();
|
|
1448
|
+
// Fallback: return everything after the first heading
|
|
1449
|
+
const lines = content.split('\n').filter(l => !l.startsWith('#') && l.trim().length > 0);
|
|
1450
|
+
return lines.join(' ').slice(0, 500);
|
|
1451
|
+
}
|
|
1452
|
+
|
|
1453
|
+
function extractAnswer(brainstormContent, questionKey, defaultAnswer) {
|
|
1454
|
+
const regex = new RegExp(`\\*\\*${questionKey}.*?\\*\\*Your Answer:\\*\\*([^\\n*]+)`, 's');
|
|
1455
|
+
const match = brainstormContent.match(regex);
|
|
1456
|
+
if (match) return match[1].trim();
|
|
1457
|
+
return defaultAnswer;
|
|
1458
|
+
}
|
|
1459
|
+
|
|
1460
|
+
function detectSprintDocs(cwd) {
|
|
1461
|
+
const docsDir = path.join(cwd, DOCS_DIR);
|
|
1462
|
+
if (!fs.existsSync(docsDir)) return false;
|
|
1463
|
+
return fs.readdirSync(docsDir).some(f => /^sprint-\d+$/i.test(f));
|
|
1464
|
+
}
|
|
1465
|
+
|
|
1466
|
+
function detectCurrentSprint(cwd) {
|
|
1467
|
+
const docsDir = path.join(cwd, DOCS_DIR);
|
|
1468
|
+
if (!fs.existsSync(docsDir)) return 1;
|
|
1469
|
+
let max = 0;
|
|
1470
|
+
for (const f of fs.readdirSync(docsDir)) {
|
|
1471
|
+
const m = f.match(/^sprint-(\d+)$/i);
|
|
1472
|
+
if (m) max = Math.max(max, parseInt(m[1], 10));
|
|
1473
|
+
}
|
|
1474
|
+
return max || 1;
|
|
1475
|
+
}
|
|
1476
|
+
|
|
1477
|
+
function detectLastSprint(cwd) {
|
|
1478
|
+
return detectCurrentSprint(cwd);
|
|
1479
|
+
}
|
|
1480
|
+
|
|
1481
|
+
function resolveSprintNum(restArgs, cwd) {
|
|
1482
|
+
const numStr = restArgs.find(a => !a.startsWith('-'));
|
|
1483
|
+
if (numStr) {
|
|
1484
|
+
const n = parseInt(numStr, 10);
|
|
1485
|
+
if (!isNaN(n)) return n;
|
|
1486
|
+
}
|
|
1487
|
+
|
|
1488
|
+
// Try PROJECT_BRIEF.md
|
|
1489
|
+
const briefPath = path.join(cwd, BRIEF_MD);
|
|
1490
|
+
if (fs.existsSync(briefPath)) {
|
|
1491
|
+
const m = fs.readFileSync(briefPath, 'utf8').match(/Current Sprint:\s*Sprint\s*(\d+)/i);
|
|
1492
|
+
if (m) return parseInt(m[1], 10);
|
|
1493
|
+
}
|
|
1494
|
+
|
|
1495
|
+
return detectCurrentSprint(cwd);
|
|
1496
|
+
}
|
|
1497
|
+
|
|
1498
|
+
function loadLocalConfig(cwd) {
|
|
1499
|
+
const configPath = path.join(cwd, CONFIG_FILE);
|
|
1500
|
+
if (fs.existsSync(configPath)) {
|
|
1501
|
+
try { return JSON.parse(fs.readFileSync(configPath, 'utf8')); } catch { return null; }
|
|
1502
|
+
}
|
|
1503
|
+
return null;
|
|
1504
|
+
}
|
|
1505
|
+
|
|
1506
|
+
async function updateCompactContext(cwd, completedSprint) {
|
|
1507
|
+
const contextPath = path.join(cwd, CONTEXT_MD);
|
|
1508
|
+
if (!fs.existsSync(contextPath)) return;
|
|
1509
|
+
|
|
1510
|
+
try {
|
|
1511
|
+
let content = fs.readFileSync(contextPath, 'utf8');
|
|
1512
|
+
content = content.replace(/Current Sprint\nSprint \d+ \(not started\)/, `Current Sprint\nSprint ${completedSprint + 1}`);
|
|
1513
|
+
fs.writeFileSync(contextPath, content, 'utf8');
|
|
1514
|
+
} catch { /* non-critical */ }
|
|
1515
|
+
}
|
|
1516
|
+
|
|
1517
|
+
// ─── Utilities ────────────────────────────────────────────────────────────────
|
|
1518
|
+
|
|
1519
|
+
function askQuestion(query) {
|
|
1520
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
1521
|
+
return new Promise(resolve => rl.question(query, ans => { rl.close(); resolve(ans.trim()); }));
|
|
1522
|
+
}
|
|
1523
|
+
|
|
1524
|
+
function scanAssistantCLIs() {
|
|
1525
|
+
const engines = {
|
|
1526
|
+
claude: { name: 'Claude Code', path: resolveBinary('claude', ['~/.local/bin/claude', '/usr/local/bin/claude', '/opt/homebrew/bin/claude']), models: [], modelsCmd: b => `"${b}" --list-models 2>/dev/null || echo ''` },
|
|
1527
|
+
opencode: { name: 'OpenCode', path: resolveBinary('opencode', ['~/.opencode/bin/opencode', '/usr/local/bin/opencode']), models: [], modelsCmd: b => `"${b}" models 2>/dev/null` },
|
|
1528
|
+
codex: { name: 'Codex (OpenAI)', path: resolveBinary('codex', ['~/Library/PhpWebStudy/env/node/bin/codex', '/usr/local/bin/codex']), models: [], modelsCmd: b => `"${b}" debug models 2>/dev/null` },
|
|
1529
|
+
agy: { name: 'Antigravity CLI (agy)', path: resolveBinary('agy', ['~/.local/bin/agy', '/usr/local/bin/agy', '/opt/homebrew/bin/agy']), models: [], modelsCmd: b => `"${b}" models 2>/dev/null || echo ''` },
|
|
1530
|
+
qwen: { name: 'QwenCode (qwen)', path: resolveBinary('qwen', ['~/.local/bin/qwen', '/usr/local/bin/qwen', '/opt/homebrew/bin/qwen']), models: [], modelsCmd: b => `"${b}" models 2>/dev/null || echo ''` },
|
|
1531
|
+
mimo: { name: 'MimoCode (mimo)', path: resolveBinary('mimo', ['~/.local/bin/mimo', '/usr/local/bin/mimo', '/opt/homebrew/bin/mimo', '~/.mimo/bin/mimo']), models: [], modelsCmd: b => `"${b}" models 2>/dev/null || echo ''` },
|
|
1532
|
+
};
|
|
1533
|
+
|
|
1534
|
+
for (const [key, eng] of Object.entries(engines)) {
|
|
1535
|
+
if (!eng.path) continue;
|
|
1536
|
+
try {
|
|
1537
|
+
let raw = execSync(eng.modelsCmd(eng.path), { encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'], timeout: 30000 });
|
|
1538
|
+
let models = [];
|
|
1539
|
+
try {
|
|
1540
|
+
const parsed = JSON.parse(raw);
|
|
1541
|
+
if (parsed?.models) models = parsed.models.map(m => m.slug || m.id || m.name).filter(Boolean);
|
|
1542
|
+
else if (Array.isArray(parsed)) models = parsed.map(m => typeof m === 'string' ? m : m.id || m.slug).filter(Boolean);
|
|
1543
|
+
} catch {
|
|
1544
|
+
models = raw.split('\n').map(l => l.trim()).filter(l => l && !l.startsWith('#'));
|
|
1545
|
+
}
|
|
1546
|
+
if (models.length > 0) eng.models = models;
|
|
1547
|
+
} catch { eng.models = []; }
|
|
1548
|
+
}
|
|
1549
|
+
|
|
1550
|
+
return engines;
|
|
1551
|
+
}
|
|
1552
|
+
|
|
1553
|
+
function resolveBinary(name, fallbackPaths) {
|
|
1554
|
+
try {
|
|
1555
|
+
const p = execSync(`which ${name}`, { encoding: 'utf8', stdio: [] }).trim();
|
|
1556
|
+
if (p && fs.existsSync(p)) return p;
|
|
1557
|
+
} catch { /* ignore */ }
|
|
1558
|
+
const home = os.homedir();
|
|
1559
|
+
for (const raw of fallbackPaths) {
|
|
1560
|
+
const p = raw.replace(/^~/, home);
|
|
1561
|
+
if (fs.existsSync(p)) return p;
|
|
1562
|
+
}
|
|
1563
|
+
return null;
|
|
1564
|
+
}
|
|
1565
|
+
|
|
1566
|
+
function copyRecursiveSync(src, dest) {
|
|
1567
|
+
const stats = fs.existsSync(src) && fs.statSync(src);
|
|
1568
|
+
if (stats && stats.isDirectory()) {
|
|
1569
|
+
if (!fs.existsSync(dest)) fs.mkdirSync(dest, { recursive: true });
|
|
1570
|
+
fs.readdirSync(src).forEach(child => copyRecursiveSync(path.join(src, child), path.join(dest, child)));
|
|
1571
|
+
} else {
|
|
1572
|
+
fs.copyFileSync(src, dest);
|
|
1573
|
+
}
|
|
1574
|
+
}
|
|
1575
|
+
|
|
1576
|
+
function rmRecursiveSync(dest) {
|
|
1577
|
+
if (fs.existsSync(dest)) fs.rmSync(dest, { recursive: true, force: true });
|
|
1578
|
+
}
|
|
1579
|
+
|
|
1580
|
+
function registerCliGlobally(imhcodeScriptPath) {
|
|
1581
|
+
const isWindows = process.platform === 'win32';
|
|
1582
|
+
console.log('\n🔗 Registering imhcode command globally...');
|
|
1583
|
+
|
|
1584
|
+
if (isWindows) {
|
|
1585
|
+
const binDir = path.join(GLOBAL_DIR, 'bin');
|
|
1586
|
+
if (!fs.existsSync(binDir)) fs.mkdirSync(binDir, { recursive: true });
|
|
1587
|
+
fs.writeFileSync(path.join(binDir, 'imhcode.cmd'), `@echo off\r\nnode "${imhcodeScriptPath}" %*\r\n`);
|
|
1588
|
+
fs.writeFileSync(path.join(binDir, 'imhcode.ps1'), `node "${imhcodeScriptPath}" $args\r\n`);
|
|
1589
|
+
try {
|
|
1590
|
+
execSync(`powershell -Command "$p=[Environment]::GetEnvironmentVariable('Path','User'); if ($p -notlike '*${binDir}*') { [Environment]::SetEnvironmentVariable('Path',$p+';${binDir}','User') }"`, { stdio: 'ignore' });
|
|
1591
|
+
console.log(` ✅ Registered on Windows at ${binDir}`);
|
|
1592
|
+
} catch { /* ignore */ }
|
|
1593
|
+
} else {
|
|
1594
|
+
const localBinDir = path.join(os.homedir(), '.local', 'bin');
|
|
1595
|
+
const imhBinDir = path.join(GLOBAL_DIR, 'bin');
|
|
1596
|
+
[localBinDir, imhBinDir].forEach(dir => { if (!fs.existsSync(dir)) { try { fs.mkdirSync(dir, { recursive: true }); } catch { } } });
|
|
1597
|
+
|
|
1598
|
+
const shimContent = `#!/bin/sh\nexec node "${imhcodeScriptPath}" "$@"\n`;
|
|
1599
|
+
[path.join(localBinDir, 'imhcode'), path.join(imhBinDir, 'imhcode')].forEach(t => {
|
|
1600
|
+
try { fs.writeFileSync(t, shimContent, { mode: 0o755 }); } catch { /* ignore */ }
|
|
1601
|
+
});
|
|
1602
|
+
|
|
1603
|
+
const exportLine = `\n# IMH-Code PATH\nexport PATH="$HOME/.imhcode/bin:$HOME/.local/bin:$PATH"\n`;
|
|
1604
|
+
['.zshrc', '.bashrc', '.bash_profile', '.profile'].forEach(f => {
|
|
1605
|
+
const fp = path.join(os.homedir(), f);
|
|
1606
|
+
if (fs.existsSync(fp)) {
|
|
1607
|
+
try {
|
|
1608
|
+
const c = fs.readFileSync(fp, 'utf8');
|
|
1609
|
+
if (!c.includes('.imhcode/bin') && !c.includes('.local/bin')) {
|
|
1610
|
+
fs.appendFileSync(fp, exportLine);
|
|
1611
|
+
}
|
|
1612
|
+
} catch { /* ignore */ }
|
|
1613
|
+
}
|
|
1614
|
+
});
|
|
1615
|
+
|
|
1616
|
+
console.log(` ✅ Shims installed in ~/.imhcode/bin and ~/.local/bin.`);
|
|
1617
|
+
console.log(` ✅ PATH updated in shell config. Run: source ~/.zshrc`);
|
|
1618
|
+
}
|
|
1619
|
+
}
|
|
1620
|
+
|
|
1621
|
+
function ensureCavemanAndGraphify() {
|
|
1622
|
+
console.log('\n🔍 Checking token-saving skills...');
|
|
1623
|
+
let skillsInstalled = false;
|
|
1624
|
+
try { execSync('npx --no-install skills --version', { stdio: 'ignore' }); skillsInstalled = true; } catch { /* not installed */ }
|
|
1625
|
+
|
|
1626
|
+
if (!skillsInstalled) {
|
|
1627
|
+
console.log(' 📦 Installing skills CLI globally...');
|
|
1628
|
+
try { execSync('npm install -g skills', { stdio: 'inherit' }); skillsInstalled = true; } catch { console.warn(' ⚠️ Failed to install skills CLI.'); }
|
|
1629
|
+
}
|
|
1630
|
+
|
|
1631
|
+
if (skillsInstalled) {
|
|
1632
|
+
try { execSync('npx skills add juliusbrussee/caveman', { cwd: GLOBAL_DIR, stdio: 'inherit' }); console.log(' ✅ Caveman compression rules integrated globally'); } catch { /* ignore */ }
|
|
1633
|
+
}
|
|
1634
|
+
}
|