@jakkrichm/create-nexus-devflow 2.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/LICENSE +21 -0
- package/README.md +82 -0
- package/bin/create-nexus-devflow.js +275 -0
- package/lib/update.js +379 -0
- package/package.json +53 -0
- package/template/.agents/skills/00-discover/SKILL.md +170 -0
- package/template/.agents/skills/10-define/SKILL.md +170 -0
- package/template/.agents/skills/20-spec/SKILL.md +156 -0
- package/template/.agents/skills/30-plan/SKILL.md +221 -0
- package/template/.agents/skills/40-implement/SKILL.md +166 -0
- package/template/.agents/skills/50-verify/SKILL.md +188 -0
- package/template/.agents/skills/60-report/SKILL.md +183 -0
- package/template/.agents/skills/70-release/SKILL.md +155 -0
- package/template/.agents/skills/9arm-skills/README.md +51 -0
- package/template/.agents/skills/9arm-skills/debug-mantra/SKILL.md +86 -0
- package/template/.agents/skills/9arm-skills/management-talk/SKILL.md +79 -0
- package/template/.agents/skills/9arm-skills/post-mortem/SKILL.md +71 -0
- package/template/.agents/skills/9arm-skills/scrutinize/SKILL.md +72 -0
- package/template/.agents/skills/agent/SKILL.md +165 -0
- package/template/.agents/skills/api-and-interface-design/SKILL.md +294 -0
- package/template/.agents/skills/app-builder/SKILL.md +75 -0
- package/template/.agents/skills/app-builder/agent-coordination.md +71 -0
- package/template/.agents/skills/app-builder/feature-building.md +53 -0
- package/template/.agents/skills/app-builder/project-detection.md +34 -0
- package/template/.agents/skills/app-builder/scaffolding.md +118 -0
- package/template/.agents/skills/app-builder/tech-stack.md +40 -0
- package/template/.agents/skills/app-builder/templates/SKILL.md +39 -0
- package/template/.agents/skills/app-builder/templates/astro-static/TEMPLATE.md +76 -0
- package/template/.agents/skills/app-builder/templates/chrome-extension/TEMPLATE.md +92 -0
- package/template/.agents/skills/app-builder/templates/cli-tool/TEMPLATE.md +88 -0
- package/template/.agents/skills/app-builder/templates/electron-desktop/TEMPLATE.md +88 -0
- package/template/.agents/skills/app-builder/templates/express-api/TEMPLATE.md +83 -0
- package/template/.agents/skills/app-builder/templates/flutter-app/TEMPLATE.md +90 -0
- package/template/.agents/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +90 -0
- package/template/.agents/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +122 -0
- package/template/.agents/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +122 -0
- package/template/.agents/skills/app-builder/templates/nextjs-static/TEMPLATE.md +169 -0
- package/template/.agents/skills/app-builder/templates/nuxt-app/TEMPLATE.md +134 -0
- package/template/.agents/skills/app-builder/templates/python-fastapi/TEMPLATE.md +83 -0
- package/template/.agents/skills/app-builder/templates/react-native-app/TEMPLATE.md +119 -0
- package/template/.agents/skills/architecture/SKILL.md +55 -0
- package/template/.agents/skills/architecture/context-discovery.md +43 -0
- package/template/.agents/skills/architecture/examples.md +94 -0
- package/template/.agents/skills/architecture/pattern-selection.md +68 -0
- package/template/.agents/skills/architecture/patterns-reference.md +50 -0
- package/template/.agents/skills/architecture/trade-off-analysis.md +77 -0
- package/template/.agents/skills/bash-linux/SKILL.md +199 -0
- package/template/.agents/skills/behavioral-modes/SKILL.md +242 -0
- package/template/.agents/skills/brainstorm/SKILL.md +168 -0
- package/template/.agents/skills/browser-testing-with-devtools/SKILL.md +302 -0
- package/template/.agents/skills/changelog/SKILL.md +109 -0
- package/template/.agents/skills/check-for-updates/SKILL.md +117 -0
- package/template/.agents/skills/ci-cd-and-automation/SKILL.md +390 -0
- package/template/.agents/skills/code-review-and-quality/SKILL.md +392 -0
- package/template/.agents/skills/code-simplification/SKILL.md +331 -0
- package/template/.agents/skills/codebase-design/DEEPENING.md +24 -0
- package/template/.agents/skills/codebase-design/DESIGN-IT-TWICE.md +28 -0
- package/template/.agents/skills/codebase-design/SKILL.md +58 -0
- package/template/.agents/skills/commit/SKILL.md +63 -0
- package/template/.agents/skills/competitor-analysis/SKILL.md +66 -0
- package/template/.agents/skills/context-engineering/SKILL.md +290 -0
- package/template/.agents/skills/database-design/SKILL.md +52 -0
- package/template/.agents/skills/database-design/database-selection.md +43 -0
- package/template/.agents/skills/database-design/indexing.md +39 -0
- package/template/.agents/skills/database-design/migrations.md +48 -0
- package/template/.agents/skills/database-design/optimization.md +36 -0
- package/template/.agents/skills/database-design/orm-selection.md +30 -0
- package/template/.agents/skills/database-design/schema-design.md +56 -0
- package/template/.agents/skills/database-design/scripts/schema_validator.py +172 -0
- package/template/.agents/skills/debug/SKILL.md +131 -0
- package/template/.agents/skills/debugging-and-error-recovery/SKILL.md +298 -0
- package/template/.agents/skills/deploy/SKILL.md +91 -0
- package/template/.agents/skills/deployment-procedures/SKILL.md +241 -0
- package/template/.agents/skills/deprecation-and-migration/SKILL.md +206 -0
- package/template/.agents/skills/devflow/SKILL.md +89 -0
- package/template/.agents/skills/devflow-concept-intake/SKILL.md +150 -0
- package/template/.agents/skills/devflow-concept-intake/agents/openai.yaml +4 -0
- package/template/.agents/skills/devflow-concept-intake/references/adoption-proposal-template.md +60 -0
- package/template/.agents/skills/devflow-concept-intake/references/concept-report-template.md +47 -0
- package/template/.agents/skills/devflow-concept-intake/references/upstream-tracking-template.md +51 -0
- package/template/.agents/skills/devflow-wiki/SKILL.md +75 -0
- package/template/.agents/skills/diagnosing-bugs/SKILL.md +93 -0
- package/template/.agents/skills/documentation-and-adrs/SKILL.md +278 -0
- package/template/.agents/skills/domain-modeling/ADR-FORMAT.md +47 -0
- package/template/.agents/skills/domain-modeling/CONTEXT-FORMAT.md +60 -0
- package/template/.agents/skills/domain-modeling/SKILL.md +74 -0
- package/template/.agents/skills/english-to-thai-translator/SKILL.md +125 -0
- package/template/.agents/skills/followup/SKILL.md +83 -0
- package/template/.agents/skills/frontend-ui-engineering/SKILL.md +326 -0
- package/template/.agents/skills/frontend-ui-engineering/accessibility-checklist.md +159 -0
- package/template/.agents/skills/git-workflow-and-versioning/SKILL.md +300 -0
- package/template/.agents/skills/goal/SKILL.md +148 -0
- package/template/.agents/skills/handoff/SKILL.md +46 -0
- package/template/.agents/skills/help/SKILL.md +253 -0
- package/template/.agents/skills/human-review-decisions/SKILL.md +74 -0
- package/template/.agents/skills/i18n-localization/SKILL.md +154 -0
- package/template/.agents/skills/i18n-localization/scripts/i18n_checker.py +241 -0
- package/template/.agents/skills/idea-refine/SKILL.md +178 -0
- package/template/.agents/skills/idea-refine/examples.md +238 -0
- package/template/.agents/skills/idea-refine/frameworks.md +99 -0
- package/template/.agents/skills/idea-refine/refinement-criteria.md +113 -0
- package/template/.agents/skills/idea-refine/scripts/idea-refine.sh +15 -0
- package/template/.agents/skills/incremental-implementation/SKILL.md +248 -0
- package/template/.agents/skills/insight/SKILL.md +131 -0
- package/template/.agents/skills/insight-capture/SKILL.md +84 -0
- package/template/.agents/skills/intelligent-routing/SKILL.md +176 -0
- package/template/.agents/skills/issue-triage/SKILL.md +115 -0
- package/template/.agents/skills/lint-and-validate/SKILL.md +45 -0
- package/template/.agents/skills/lint-and-validate/scripts/lint_runner.py +184 -0
- package/template/.agents/skills/lint-and-validate/scripts/type_coverage.py +173 -0
- package/template/.agents/skills/mcp-builder/SKILL.md +176 -0
- package/template/.agents/skills/md2html/SKILL.md +154 -0
- package/template/.agents/skills/md2html/components.md +505 -0
- package/template/.agents/skills/md2html/template.html +1152 -0
- package/template/.agents/skills/merge/SKILL.md +76 -0
- package/template/.agents/skills/mobile-design/SKILL.md +394 -0
- package/template/.agents/skills/mobile-design/decision-trees.md +516 -0
- package/template/.agents/skills/mobile-design/mobile-backend.md +491 -0
- package/template/.agents/skills/mobile-design/mobile-color-system.md +420 -0
- package/template/.agents/skills/mobile-design/mobile-debugging.md +122 -0
- package/template/.agents/skills/mobile-design/mobile-design-thinking.md +357 -0
- package/template/.agents/skills/mobile-design/mobile-navigation.md +458 -0
- package/template/.agents/skills/mobile-design/mobile-performance.md +767 -0
- package/template/.agents/skills/mobile-design/mobile-testing.md +356 -0
- package/template/.agents/skills/mobile-design/mobile-typography.md +433 -0
- package/template/.agents/skills/mobile-design/platform-android.md +666 -0
- package/template/.agents/skills/mobile-design/platform-ios.md +561 -0
- package/template/.agents/skills/mobile-design/scripts/mobile_audit.py +670 -0
- package/template/.agents/skills/mobile-design/touch-psychology.md +537 -0
- package/template/.agents/skills/nextjs-react-expert/1-async-eliminating-waterfalls.md +312 -0
- package/template/.agents/skills/nextjs-react-expert/2-bundle-bundle-size-optimization.md +240 -0
- package/template/.agents/skills/nextjs-react-expert/3-server-server-side-performance.md +490 -0
- package/template/.agents/skills/nextjs-react-expert/4-client-client-side-data-fetching.md +264 -0
- package/template/.agents/skills/nextjs-react-expert/5-rerender-re-render-optimization.md +581 -0
- package/template/.agents/skills/nextjs-react-expert/6-rendering-rendering-performance.md +432 -0
- package/template/.agents/skills/nextjs-react-expert/7-js-javascript-performance.md +684 -0
- package/template/.agents/skills/nextjs-react-expert/8-advanced-advanced-patterns.md +150 -0
- package/template/.agents/skills/nextjs-react-expert/SKILL.md +286 -0
- package/template/.agents/skills/nextjs-react-expert/scripts/convert_rules.py +222 -0
- package/template/.agents/skills/nextjs-react-expert/scripts/react_performance_checker.py +252 -0
- package/template/.agents/skills/nodejs-best-practices/SKILL.md +333 -0
- package/template/.agents/skills/obsidian-bases/SKILL.md +506 -0
- package/template/.agents/skills/obsidian-bases/references/FUNCTIONS_REFERENCE.md +173 -0
- package/template/.agents/skills/obsidian-cli/SKILL.md +115 -0
- package/template/.agents/skills/obsidian-clipper-template-creator/SKILL.md +73 -0
- package/template/.agents/skills/obsidian-clipper-template-creator/assets/clipping-template.json +51 -0
- package/template/.agents/skills/obsidian-clipper-template-creator/assets/recipe-template.json +48 -0
- package/template/.agents/skills/obsidian-clipper-template-creator/references/analysis-workflow.md +79 -0
- package/template/.agents/skills/obsidian-clipper-template-creator/references/bases-workflow.md +44 -0
- package/template/.agents/skills/obsidian-clipper-template-creator/references/filters.md +51 -0
- package/template/.agents/skills/obsidian-clipper-template-creator/references/json-schema.md +77 -0
- package/template/.agents/skills/obsidian-clipper-template-creator/references/logic.md +67 -0
- package/template/.agents/skills/obsidian-clipper-template-creator/references/variables.md +64 -0
- package/template/.agents/skills/obsidian-markdown/SKILL.md +205 -0
- package/template/.agents/skills/obsidian-markdown/references/CALLOUTS.md +58 -0
- package/template/.agents/skills/obsidian-markdown/references/EMBEDS.md +63 -0
- package/template/.agents/skills/obsidian-markdown/references/PROPERTIES.md +61 -0
- package/template/.agents/skills/package-json-generator/SKILL.md +60 -0
- package/template/.agents/skills/package-json-generator/scripts/generate.js +120 -0
- package/template/.agents/skills/package-json-generator/scripts/run.sh +19 -0
- package/template/.agents/skills/parallel-agents/SKILL.md +144 -0
- package/template/.agents/skills/performance-optimization/SKILL.md +299 -0
- package/template/.agents/skills/performance-optimization/performance-checklist.md +113 -0
- package/template/.agents/skills/planning-and-task-breakdown/SKILL.md +239 -0
- package/template/.agents/skills/powershell-windows/SKILL.md +167 -0
- package/template/.agents/skills/pr/SKILL.md +93 -0
- package/template/.agents/skills/pr-review/SKILL.md +143 -0
- package/template/.agents/skills/pr-review-analysis/SKILL.md +89 -0
- package/template/.agents/skills/prd/SKILL.md +127 -0
- package/template/.agents/skills/preview/SKILL.md +121 -0
- package/template/.agents/skills/preview-local-check/SKILL.md +59 -0
- package/template/.agents/skills/prompt-addons/SKILL.md +99 -0
- package/template/.agents/skills/prototype/SKILL.md +44 -0
- package/template/.agents/skills/prp-dev-fastapi/SKILL.md +114 -0
- package/template/.agents/skills/prp-dev-multiplatform/SKILL.md +36 -0
- package/template/.agents/skills/prp-dev-odoo/SKILL.md +71 -0
- package/template/.agents/skills/prp-dev-php/SKILL.md +63 -0
- package/template/.agents/skills/prp-sa-ba/SKILL.md +52 -0
- package/template/.agents/skills/python-patterns/SKILL.md +441 -0
- package/template/.agents/skills/red-team-tactics/SKILL.md +199 -0
- package/template/.agents/skills/release-git-operations/SKILL.md +97 -0
- package/template/.agents/skills/research/SKILL.md +143 -0
- package/template/.agents/skills/review/SKILL.md +55 -0
- package/template/.agents/skills/review-followup-routing/SKILL.md +98 -0
- package/template/.agents/skills/roadmap-strategy/SKILL.md +97 -0
- package/template/.agents/skills/security-and-hardening/SKILL.md +349 -0
- package/template/.agents/skills/security-and-hardening/security-checklist.md +134 -0
- package/template/.agents/skills/security-review/SKILL.md +166 -0
- package/template/.agents/skills/seo-fundamentals/SKILL.md +129 -0
- package/template/.agents/skills/seo-fundamentals/scripts/seo_checker.py +219 -0
- package/template/.agents/skills/server-management/SKILL.md +161 -0
- package/template/.agents/skills/shipping-and-launch/SKILL.md +311 -0
- package/template/.agents/skills/silent-failure-audit/SKILL.md +73 -0
- package/template/.agents/skills/simplify/SKILL.md +79 -0
- package/template/.agents/skills/skill-development/SKILL.md +86 -0
- package/template/.agents/skills/spec-driven-development/SKILL.md +207 -0
- package/template/.agents/skills/spec-orchestration/SKILL.md +91 -0
- package/template/.agents/skills/specialist-agent-routing/SKILL.md +107 -0
- package/template/.agents/skills/tailwind-patterns/SKILL.md +269 -0
- package/template/.agents/skills/test/SKILL.md +82 -0
- package/template/.agents/skills/test-driven-development/SKILL.md +422 -0
- package/template/.agents/skills/test-driven-development/testing-patterns.md +236 -0
- package/template/.agents/skills/test-execution-and-coverage/SKILL.md +56 -0
- package/template/.agents/skills/type-design/SKILL.md +84 -0
- package/template/.agents/skills/ui-ux-pro-max/SKILL.md +75 -0
- package/template/.agents/skills/using-agent-skills/SKILL.md +171 -0
- package/template/.agents/skills/verification-orchestration/SKILL.md +68 -0
- package/template/.agents/skills/vulnerability-scanner/SKILL.md +276 -0
- package/template/.agents/skills/vulnerability-scanner/checklists.md +121 -0
- package/template/.agents/skills/vulnerability-scanner/scripts/security_scan.py +458 -0
- package/template/.agents/skills/wiki/SKILL.md +149 -0
- package/template/.agents/skills/workflow-documentation-sync/SKILL.md +87 -0
- package/template/.agents/skills/writing-great-skills/SKILL.md +65 -0
- package/template/.claude/skills/00-discover/SKILL.md +170 -0
- package/template/.claude/skills/10-define/SKILL.md +170 -0
- package/template/.claude/skills/20-spec/SKILL.md +156 -0
- package/template/.claude/skills/30-plan/SKILL.md +221 -0
- package/template/.claude/skills/40-implement/SKILL.md +166 -0
- package/template/.claude/skills/50-verify/SKILL.md +188 -0
- package/template/.claude/skills/60-report/SKILL.md +183 -0
- package/template/.claude/skills/70-release/SKILL.md +155 -0
- package/template/.claude/skills/9arm-skills/README.md +51 -0
- package/template/.claude/skills/9arm-skills/debug-mantra/SKILL.md +86 -0
- package/template/.claude/skills/9arm-skills/management-talk/SKILL.md +79 -0
- package/template/.claude/skills/9arm-skills/post-mortem/SKILL.md +71 -0
- package/template/.claude/skills/9arm-skills/scrutinize/SKILL.md +72 -0
- package/template/.claude/skills/agent/SKILL.md +165 -0
- package/template/.claude/skills/api-and-interface-design/SKILL.md +294 -0
- package/template/.claude/skills/app-builder/SKILL.md +75 -0
- package/template/.claude/skills/app-builder/agent-coordination.md +71 -0
- package/template/.claude/skills/app-builder/feature-building.md +53 -0
- package/template/.claude/skills/app-builder/project-detection.md +34 -0
- package/template/.claude/skills/app-builder/scaffolding.md +118 -0
- package/template/.claude/skills/app-builder/tech-stack.md +40 -0
- package/template/.claude/skills/app-builder/templates/SKILL.md +39 -0
- package/template/.claude/skills/app-builder/templates/astro-static/TEMPLATE.md +76 -0
- package/template/.claude/skills/app-builder/templates/chrome-extension/TEMPLATE.md +92 -0
- package/template/.claude/skills/app-builder/templates/cli-tool/TEMPLATE.md +88 -0
- package/template/.claude/skills/app-builder/templates/electron-desktop/TEMPLATE.md +88 -0
- package/template/.claude/skills/app-builder/templates/express-api/TEMPLATE.md +83 -0
- package/template/.claude/skills/app-builder/templates/flutter-app/TEMPLATE.md +90 -0
- package/template/.claude/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +90 -0
- package/template/.claude/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +122 -0
- package/template/.claude/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +122 -0
- package/template/.claude/skills/app-builder/templates/nextjs-static/TEMPLATE.md +169 -0
- package/template/.claude/skills/app-builder/templates/nuxt-app/TEMPLATE.md +134 -0
- package/template/.claude/skills/app-builder/templates/python-fastapi/TEMPLATE.md +83 -0
- package/template/.claude/skills/app-builder/templates/react-native-app/TEMPLATE.md +119 -0
- package/template/.claude/skills/architecture/SKILL.md +55 -0
- package/template/.claude/skills/architecture/context-discovery.md +43 -0
- package/template/.claude/skills/architecture/examples.md +94 -0
- package/template/.claude/skills/architecture/pattern-selection.md +68 -0
- package/template/.claude/skills/architecture/patterns-reference.md +50 -0
- package/template/.claude/skills/architecture/trade-off-analysis.md +77 -0
- package/template/.claude/skills/bash-linux/SKILL.md +199 -0
- package/template/.claude/skills/behavioral-modes/SKILL.md +242 -0
- package/template/.claude/skills/brainstorm/SKILL.md +168 -0
- package/template/.claude/skills/browser-testing-with-devtools/SKILL.md +302 -0
- package/template/.claude/skills/changelog/SKILL.md +109 -0
- package/template/.claude/skills/check-for-updates/SKILL.md +117 -0
- package/template/.claude/skills/ci-cd-and-automation/SKILL.md +390 -0
- package/template/.claude/skills/code-review-and-quality/SKILL.md +392 -0
- package/template/.claude/skills/code-simplification/SKILL.md +331 -0
- package/template/.claude/skills/codebase-design/DEEPENING.md +24 -0
- package/template/.claude/skills/codebase-design/DESIGN-IT-TWICE.md +28 -0
- package/template/.claude/skills/codebase-design/SKILL.md +58 -0
- package/template/.claude/skills/commit/SKILL.md +63 -0
- package/template/.claude/skills/competitor-analysis/SKILL.md +66 -0
- package/template/.claude/skills/context-engineering/SKILL.md +290 -0
- package/template/.claude/skills/database-design/SKILL.md +52 -0
- package/template/.claude/skills/database-design/database-selection.md +43 -0
- package/template/.claude/skills/database-design/indexing.md +39 -0
- package/template/.claude/skills/database-design/migrations.md +48 -0
- package/template/.claude/skills/database-design/optimization.md +36 -0
- package/template/.claude/skills/database-design/orm-selection.md +30 -0
- package/template/.claude/skills/database-design/schema-design.md +56 -0
- package/template/.claude/skills/database-design/scripts/schema_validator.py +172 -0
- package/template/.claude/skills/debug/SKILL.md +131 -0
- package/template/.claude/skills/debugging-and-error-recovery/SKILL.md +298 -0
- package/template/.claude/skills/deploy/SKILL.md +91 -0
- package/template/.claude/skills/deployment-procedures/SKILL.md +241 -0
- package/template/.claude/skills/deprecation-and-migration/SKILL.md +206 -0
- package/template/.claude/skills/devflow/SKILL.md +89 -0
- package/template/.claude/skills/devflow-concept-intake/SKILL.md +150 -0
- package/template/.claude/skills/devflow-concept-intake/agents/openai.yaml +4 -0
- package/template/.claude/skills/devflow-concept-intake/references/adoption-proposal-template.md +60 -0
- package/template/.claude/skills/devflow-concept-intake/references/concept-report-template.md +47 -0
- package/template/.claude/skills/devflow-concept-intake/references/upstream-tracking-template.md +51 -0
- package/template/.claude/skills/devflow-wiki/SKILL.md +75 -0
- package/template/.claude/skills/diagnosing-bugs/SKILL.md +93 -0
- package/template/.claude/skills/documentation-and-adrs/SKILL.md +278 -0
- package/template/.claude/skills/domain-modeling/ADR-FORMAT.md +47 -0
- package/template/.claude/skills/domain-modeling/CONTEXT-FORMAT.md +60 -0
- package/template/.claude/skills/domain-modeling/SKILL.md +74 -0
- package/template/.claude/skills/english-to-thai-translator/SKILL.md +125 -0
- package/template/.claude/skills/followup/SKILL.md +83 -0
- package/template/.claude/skills/frontend-ui-engineering/SKILL.md +326 -0
- package/template/.claude/skills/frontend-ui-engineering/accessibility-checklist.md +159 -0
- package/template/.claude/skills/git-workflow-and-versioning/SKILL.md +300 -0
- package/template/.claude/skills/goal/SKILL.md +148 -0
- package/template/.claude/skills/handoff/SKILL.md +46 -0
- package/template/.claude/skills/help/SKILL.md +253 -0
- package/template/.claude/skills/human-review-decisions/SKILL.md +74 -0
- package/template/.claude/skills/i18n-localization/SKILL.md +154 -0
- package/template/.claude/skills/i18n-localization/scripts/i18n_checker.py +241 -0
- package/template/.claude/skills/idea-refine/SKILL.md +178 -0
- package/template/.claude/skills/idea-refine/examples.md +238 -0
- package/template/.claude/skills/idea-refine/frameworks.md +99 -0
- package/template/.claude/skills/idea-refine/refinement-criteria.md +113 -0
- package/template/.claude/skills/idea-refine/scripts/idea-refine.sh +15 -0
- package/template/.claude/skills/incremental-implementation/SKILL.md +248 -0
- package/template/.claude/skills/insight/SKILL.md +131 -0
- package/template/.claude/skills/insight-capture/SKILL.md +84 -0
- package/template/.claude/skills/intelligent-routing/SKILL.md +176 -0
- package/template/.claude/skills/issue-triage/SKILL.md +115 -0
- package/template/.claude/skills/lint-and-validate/SKILL.md +45 -0
- package/template/.claude/skills/lint-and-validate/scripts/lint_runner.py +184 -0
- package/template/.claude/skills/lint-and-validate/scripts/type_coverage.py +173 -0
- package/template/.claude/skills/mcp-builder/SKILL.md +176 -0
- package/template/.claude/skills/md2html/SKILL.md +154 -0
- package/template/.claude/skills/md2html/components.md +505 -0
- package/template/.claude/skills/md2html/template.html +1152 -0
- package/template/.claude/skills/merge/SKILL.md +76 -0
- package/template/.claude/skills/mobile-design/SKILL.md +394 -0
- package/template/.claude/skills/mobile-design/decision-trees.md +516 -0
- package/template/.claude/skills/mobile-design/mobile-backend.md +491 -0
- package/template/.claude/skills/mobile-design/mobile-color-system.md +420 -0
- package/template/.claude/skills/mobile-design/mobile-debugging.md +122 -0
- package/template/.claude/skills/mobile-design/mobile-design-thinking.md +357 -0
- package/template/.claude/skills/mobile-design/mobile-navigation.md +458 -0
- package/template/.claude/skills/mobile-design/mobile-performance.md +767 -0
- package/template/.claude/skills/mobile-design/mobile-testing.md +356 -0
- package/template/.claude/skills/mobile-design/mobile-typography.md +433 -0
- package/template/.claude/skills/mobile-design/platform-android.md +666 -0
- package/template/.claude/skills/mobile-design/platform-ios.md +561 -0
- package/template/.claude/skills/mobile-design/scripts/mobile_audit.py +670 -0
- package/template/.claude/skills/mobile-design/touch-psychology.md +537 -0
- package/template/.claude/skills/nextjs-react-expert/1-async-eliminating-waterfalls.md +312 -0
- package/template/.claude/skills/nextjs-react-expert/2-bundle-bundle-size-optimization.md +240 -0
- package/template/.claude/skills/nextjs-react-expert/3-server-server-side-performance.md +490 -0
- package/template/.claude/skills/nextjs-react-expert/4-client-client-side-data-fetching.md +264 -0
- package/template/.claude/skills/nextjs-react-expert/5-rerender-re-render-optimization.md +581 -0
- package/template/.claude/skills/nextjs-react-expert/6-rendering-rendering-performance.md +432 -0
- package/template/.claude/skills/nextjs-react-expert/7-js-javascript-performance.md +684 -0
- package/template/.claude/skills/nextjs-react-expert/8-advanced-advanced-patterns.md +150 -0
- package/template/.claude/skills/nextjs-react-expert/SKILL.md +286 -0
- package/template/.claude/skills/nextjs-react-expert/scripts/convert_rules.py +222 -0
- package/template/.claude/skills/nextjs-react-expert/scripts/react_performance_checker.py +252 -0
- package/template/.claude/skills/nodejs-best-practices/SKILL.md +333 -0
- package/template/.claude/skills/obsidian-bases/SKILL.md +506 -0
- package/template/.claude/skills/obsidian-bases/references/FUNCTIONS_REFERENCE.md +173 -0
- package/template/.claude/skills/obsidian-cli/SKILL.md +115 -0
- package/template/.claude/skills/obsidian-clipper-template-creator/SKILL.md +73 -0
- package/template/.claude/skills/obsidian-clipper-template-creator/assets/clipping-template.json +51 -0
- package/template/.claude/skills/obsidian-clipper-template-creator/assets/recipe-template.json +48 -0
- package/template/.claude/skills/obsidian-clipper-template-creator/references/analysis-workflow.md +79 -0
- package/template/.claude/skills/obsidian-clipper-template-creator/references/bases-workflow.md +44 -0
- package/template/.claude/skills/obsidian-clipper-template-creator/references/filters.md +51 -0
- package/template/.claude/skills/obsidian-clipper-template-creator/references/json-schema.md +77 -0
- package/template/.claude/skills/obsidian-clipper-template-creator/references/logic.md +67 -0
- package/template/.claude/skills/obsidian-clipper-template-creator/references/variables.md +64 -0
- package/template/.claude/skills/obsidian-markdown/SKILL.md +205 -0
- package/template/.claude/skills/obsidian-markdown/references/CALLOUTS.md +58 -0
- package/template/.claude/skills/obsidian-markdown/references/EMBEDS.md +63 -0
- package/template/.claude/skills/obsidian-markdown/references/PROPERTIES.md +61 -0
- package/template/.claude/skills/package-json-generator/SKILL.md +60 -0
- package/template/.claude/skills/package-json-generator/scripts/generate.js +120 -0
- package/template/.claude/skills/package-json-generator/scripts/run.sh +19 -0
- package/template/.claude/skills/parallel-agents/SKILL.md +144 -0
- package/template/.claude/skills/performance-optimization/SKILL.md +299 -0
- package/template/.claude/skills/performance-optimization/performance-checklist.md +113 -0
- package/template/.claude/skills/planning-and-task-breakdown/SKILL.md +239 -0
- package/template/.claude/skills/powershell-windows/SKILL.md +167 -0
- package/template/.claude/skills/pr/SKILL.md +93 -0
- package/template/.claude/skills/pr-review/SKILL.md +143 -0
- package/template/.claude/skills/pr-review-analysis/SKILL.md +89 -0
- package/template/.claude/skills/prd/SKILL.md +127 -0
- package/template/.claude/skills/preview/SKILL.md +121 -0
- package/template/.claude/skills/preview-local-check/SKILL.md +59 -0
- package/template/.claude/skills/prompt-addons/SKILL.md +99 -0
- package/template/.claude/skills/prototype/SKILL.md +44 -0
- package/template/.claude/skills/prp-dev-fastapi/SKILL.md +114 -0
- package/template/.claude/skills/prp-dev-multiplatform/SKILL.md +36 -0
- package/template/.claude/skills/prp-dev-odoo/SKILL.md +71 -0
- package/template/.claude/skills/prp-dev-php/SKILL.md +63 -0
- package/template/.claude/skills/prp-sa-ba/SKILL.md +52 -0
- package/template/.claude/skills/python-patterns/SKILL.md +441 -0
- package/template/.claude/skills/red-team-tactics/SKILL.md +199 -0
- package/template/.claude/skills/release-git-operations/SKILL.md +97 -0
- package/template/.claude/skills/research/SKILL.md +143 -0
- package/template/.claude/skills/review/SKILL.md +55 -0
- package/template/.claude/skills/review-followup-routing/SKILL.md +98 -0
- package/template/.claude/skills/roadmap-strategy/SKILL.md +97 -0
- package/template/.claude/skills/security-and-hardening/SKILL.md +349 -0
- package/template/.claude/skills/security-and-hardening/security-checklist.md +134 -0
- package/template/.claude/skills/security-review/SKILL.md +166 -0
- package/template/.claude/skills/seo-fundamentals/SKILL.md +129 -0
- package/template/.claude/skills/seo-fundamentals/scripts/seo_checker.py +219 -0
- package/template/.claude/skills/server-management/SKILL.md +161 -0
- package/template/.claude/skills/shipping-and-launch/SKILL.md +311 -0
- package/template/.claude/skills/silent-failure-audit/SKILL.md +73 -0
- package/template/.claude/skills/simplify/SKILL.md +79 -0
- package/template/.claude/skills/skill-development/SKILL.md +86 -0
- package/template/.claude/skills/spec-driven-development/SKILL.md +207 -0
- package/template/.claude/skills/spec-orchestration/SKILL.md +91 -0
- package/template/.claude/skills/specialist-agent-routing/SKILL.md +107 -0
- package/template/.claude/skills/tailwind-patterns/SKILL.md +269 -0
- package/template/.claude/skills/test/SKILL.md +82 -0
- package/template/.claude/skills/test-driven-development/SKILL.md +422 -0
- package/template/.claude/skills/test-driven-development/testing-patterns.md +236 -0
- package/template/.claude/skills/test-execution-and-coverage/SKILL.md +56 -0
- package/template/.claude/skills/type-design/SKILL.md +84 -0
- package/template/.claude/skills/ui-ux-pro-max/SKILL.md +75 -0
- package/template/.claude/skills/using-agent-skills/SKILL.md +171 -0
- package/template/.claude/skills/verification-orchestration/SKILL.md +68 -0
- package/template/.claude/skills/vulnerability-scanner/SKILL.md +276 -0
- package/template/.claude/skills/vulnerability-scanner/checklists.md +121 -0
- package/template/.claude/skills/vulnerability-scanner/scripts/security_scan.py +458 -0
- package/template/.claude/skills/wiki/SKILL.md +149 -0
- package/template/.claude/skills/workflow-documentation-sync/SKILL.md +87 -0
- package/template/.claude/skills/writing-great-skills/SKILL.md +65 -0
- package/template/.nexus/nexus-devflow.json +44 -0
- package/template/AGENTS.md +58 -0
- package/template/CLAUDE.md +5 -0
- package/template/LICENSE +21 -0
- package/template/devflow/context/ai-interaction.md +34 -0
- package/template/devflow/context/coding-standards.md +19 -0
- package/template/devflow/context/current-stage.md +6 -0
- package/template/devflow/context/findings.md +13 -0
- package/template/devflow/context/project-overview.md +20 -0
- package/template/devflow/reference/running-id-contract.md +39 -0
package/lib/update.js
ADDED
|
@@ -0,0 +1,379 @@
|
|
|
1
|
+
const crypto = require("node:crypto");
|
|
2
|
+
const fs = require("node:fs/promises");
|
|
3
|
+
const path = require("node:path");
|
|
4
|
+
|
|
5
|
+
const CONTROL_DIR = ".nexus";
|
|
6
|
+
const MANIFEST_PATH = `${CONTROL_DIR}/nexus-devflow.json`;
|
|
7
|
+
const MANIFEST_SCHEMA_VERSION = 1;
|
|
8
|
+
const MANAGED_ROOTS = {
|
|
9
|
+
common: ["AGENTS.md", "CLAUDE.md", "devflow", "LICENSE"],
|
|
10
|
+
codex: [".agents/skills"],
|
|
11
|
+
antigravity: [".agents/skills", ".agent/workflows"],
|
|
12
|
+
claude: [".claude/skills"]
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
function adapterListFromMode(adapter) {
|
|
16
|
+
if (adapter === "both" || adapter === "all") {
|
|
17
|
+
return ["codex", "claude"];
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
if (adapter === "antigravity") {
|
|
21
|
+
return ["codex"];
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
if (adapter === "codex" || adapter === "claude") {
|
|
25
|
+
return [adapter];
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
throw new Error(`Unknown adapter mode: ${adapter}`);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function createManifest(version, adapters, templateFiles) {
|
|
32
|
+
const managedFiles = {};
|
|
33
|
+
|
|
34
|
+
for (const [relativePath, file] of [...templateFiles.entries()].sort(([a], [b]) =>
|
|
35
|
+
a.localeCompare(b)
|
|
36
|
+
)) {
|
|
37
|
+
managedFiles[relativePath] = file.hash;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return {
|
|
41
|
+
schemaVersion: MANIFEST_SCHEMA_VERSION,
|
|
42
|
+
name: "nexus-devflow",
|
|
43
|
+
package: "@jakkrichm/create-nexus-devflow",
|
|
44
|
+
version,
|
|
45
|
+
repository: "https://github.com/Jakkrich/nexus-devflow",
|
|
46
|
+
artifactLanguage: "th",
|
|
47
|
+
adapters: [...adapters].sort(),
|
|
48
|
+
workspace: {
|
|
49
|
+
contextDir: "devflow/context",
|
|
50
|
+
historyDir: "devflow/history",
|
|
51
|
+
referenceDir: "devflow/reference",
|
|
52
|
+
runsDir: "devflow/runs",
|
|
53
|
+
discoveriesDir: "devflow/discoveries"
|
|
54
|
+
},
|
|
55
|
+
lifecycle: {
|
|
56
|
+
mainlineStages: [
|
|
57
|
+
"00-discover",
|
|
58
|
+
"10-define",
|
|
59
|
+
"20-spec",
|
|
60
|
+
"30-plan",
|
|
61
|
+
"40-implement",
|
|
62
|
+
"50-verify",
|
|
63
|
+
"60-report",
|
|
64
|
+
"70-release"
|
|
65
|
+
],
|
|
66
|
+
companionCommands: [
|
|
67
|
+
"goal",
|
|
68
|
+
"brainstorm",
|
|
69
|
+
"research",
|
|
70
|
+
"debug",
|
|
71
|
+
"prd",
|
|
72
|
+
"issue-triage",
|
|
73
|
+
"security-review",
|
|
74
|
+
"wiki",
|
|
75
|
+
"check-for-updates",
|
|
76
|
+
"help"
|
|
77
|
+
]
|
|
78
|
+
},
|
|
79
|
+
managedFiles
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
async function collectManagedTemplateFiles(templateRoot, adapters) {
|
|
84
|
+
const files = new Map();
|
|
85
|
+
const roots = [
|
|
86
|
+
...MANAGED_ROOTS.common,
|
|
87
|
+
...adapters.flatMap((adapter) => MANAGED_ROOTS[adapter] || [])
|
|
88
|
+
];
|
|
89
|
+
|
|
90
|
+
for (const relativeRoot of roots) {
|
|
91
|
+
const sourceRoot = path.join(templateRoot, ...relativeRoot.split("/"));
|
|
92
|
+
await collectSourceFiles(sourceRoot, relativeRoot, files);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return files;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
async function collectSourceFiles(sourcePath, relativePath, files) {
|
|
99
|
+
try {
|
|
100
|
+
const stats = await fs.lstat(sourcePath);
|
|
101
|
+
|
|
102
|
+
if (stats.isSymbolicLink()) {
|
|
103
|
+
throw new Error(`Managed template path cannot be a symbolic link: ${relativePath}`);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
if (stats.isDirectory()) {
|
|
107
|
+
const children = (await fs.readdir(sourcePath)).sort();
|
|
108
|
+
|
|
109
|
+
for (const child of children) {
|
|
110
|
+
await collectSourceFiles(
|
|
111
|
+
path.join(sourcePath, child),
|
|
112
|
+
`${relativePath}/${child}`,
|
|
113
|
+
files
|
|
114
|
+
);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
if (!stats.isFile()) {
|
|
121
|
+
throw new Error(`Managed template path is not a regular file: ${relativePath}`);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
files.set(relativePath, {
|
|
125
|
+
source: sourcePath,
|
|
126
|
+
hash: await hashFile(sourcePath)
|
|
127
|
+
});
|
|
128
|
+
} catch (err) {
|
|
129
|
+
if (err.code === "ENOENT") {
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
throw err;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
async function readManifest(targetDir) {
|
|
137
|
+
const manifestFile = targetPath(targetDir, MANIFEST_PATH);
|
|
138
|
+
await assertNoSymlinkParents(targetDir, MANIFEST_PATH);
|
|
139
|
+
|
|
140
|
+
try {
|
|
141
|
+
const content = await fs.readFile(manifestFile, "utf8");
|
|
142
|
+
const data = JSON.parse(content);
|
|
143
|
+
|
|
144
|
+
if (!data || data.schemaVersion !== MANIFEST_SCHEMA_VERSION) {
|
|
145
|
+
throw new Error("Unsupported manifest schema version.");
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
return data;
|
|
149
|
+
} catch (error) {
|
|
150
|
+
if (error.code === "ENOENT") {
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
throw error;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
async function prepareUpdate({ targetDir, templateRoot, version, adapter }) {
|
|
158
|
+
const requestedAdapters = new Set(adapterListFromMode(adapter));
|
|
159
|
+
const previousManifest = await readManifest(targetDir);
|
|
160
|
+
|
|
161
|
+
const activeAdapters = new Set([
|
|
162
|
+
...requestedAdapters,
|
|
163
|
+
...(previousManifest?.adapters || [])
|
|
164
|
+
]);
|
|
165
|
+
|
|
166
|
+
const templateFiles = await collectManagedTemplateFiles(
|
|
167
|
+
templateRoot,
|
|
168
|
+
[...activeAdapters]
|
|
169
|
+
);
|
|
170
|
+
const nextManifest = createManifest(version, activeAdapters, templateFiles);
|
|
171
|
+
|
|
172
|
+
const createList = [];
|
|
173
|
+
const updateList = [];
|
|
174
|
+
const conflictList = [];
|
|
175
|
+
|
|
176
|
+
for (const [relativePath, templateFile] of templateFiles) {
|
|
177
|
+
await assertNoSymlinkParents(targetDir, relativePath);
|
|
178
|
+
const targetFile = targetPath(targetDir, relativePath);
|
|
179
|
+
|
|
180
|
+
let targetStats = null;
|
|
181
|
+
try {
|
|
182
|
+
targetStats = await fs.lstat(targetFile);
|
|
183
|
+
} catch (error) {
|
|
184
|
+
if (error.code !== "ENOENT") {
|
|
185
|
+
throw error;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
if (!targetStats) {
|
|
190
|
+
createList.push(relativePath);
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
if (targetStats.isSymbolicLink()) {
|
|
195
|
+
conflictList.push({
|
|
196
|
+
relativePath,
|
|
197
|
+
reason: "symlink",
|
|
198
|
+
detail: "Target path is a symbolic link."
|
|
199
|
+
});
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
if (!targetStats.isFile()) {
|
|
204
|
+
conflictList.push({
|
|
205
|
+
relativePath,
|
|
206
|
+
reason: "not_file",
|
|
207
|
+
detail: "Target path exists but is not a regular file."
|
|
208
|
+
});
|
|
209
|
+
continue;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
const currentHash = await hashFile(targetFile);
|
|
213
|
+
if (currentHash === templateFile.hash) {
|
|
214
|
+
continue;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
const recordedHash = previousManifest?.managedFiles?.[relativePath];
|
|
218
|
+
if (recordedHash && recordedHash === currentHash) {
|
|
219
|
+
updateList.push(relativePath);
|
|
220
|
+
continue;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
conflictList.push({
|
|
224
|
+
relativePath,
|
|
225
|
+
reason: "customized",
|
|
226
|
+
detail: recordedHash
|
|
227
|
+
? "File was modified locally since last install."
|
|
228
|
+
: "File exists in project and differs from template."
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
const orphanedFiles = [];
|
|
233
|
+
if (previousManifest) {
|
|
234
|
+
for (const [relativePath, recordedHash] of Object.entries(
|
|
235
|
+
previousManifest.managedFiles
|
|
236
|
+
)) {
|
|
237
|
+
if (templateFiles.has(relativePath)) {
|
|
238
|
+
continue;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
await assertNoSymlinkParents(targetDir, relativePath);
|
|
242
|
+
const targetFile = targetPath(targetDir, relativePath);
|
|
243
|
+
|
|
244
|
+
let targetStats = null;
|
|
245
|
+
try {
|
|
246
|
+
targetStats = await fs.lstat(targetFile);
|
|
247
|
+
} catch (error) {
|
|
248
|
+
if (error.code !== "ENOENT") {
|
|
249
|
+
throw error;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
if (!targetStats || !targetStats.isFile()) {
|
|
254
|
+
continue;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
const currentHash = await hashFile(targetFile);
|
|
258
|
+
if (currentHash === recordedHash) {
|
|
259
|
+
orphanedFiles.push(relativePath);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
return {
|
|
265
|
+
targetDir,
|
|
266
|
+
templateRoot,
|
|
267
|
+
previousManifest,
|
|
268
|
+
nextManifest,
|
|
269
|
+
activeAdapters: [...activeAdapters].sort(),
|
|
270
|
+
templateFiles,
|
|
271
|
+
createList,
|
|
272
|
+
updateList,
|
|
273
|
+
conflictList,
|
|
274
|
+
orphanedFiles
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
async function applyPreparedUpdate(prepared, { replaceConflicts = false } = {}) {
|
|
279
|
+
if (prepared.conflictList.length > 0 && !replaceConflicts) {
|
|
280
|
+
throw new Error(
|
|
281
|
+
`Cannot apply update with ${prepared.conflictList.length} conflict(s). Pass force/replace option or resolve conflicts.`
|
|
282
|
+
);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
const writeTargets = [
|
|
286
|
+
...prepared.createList,
|
|
287
|
+
...prepared.updateList,
|
|
288
|
+
...(replaceConflicts ? prepared.conflictList.map((item) => item.relativePath) : [])
|
|
289
|
+
];
|
|
290
|
+
|
|
291
|
+
let appliedCount = 0;
|
|
292
|
+
for (const relativePath of writeTargets) {
|
|
293
|
+
const templateFile = prepared.templateFiles.get(relativePath);
|
|
294
|
+
if (!templateFile) {
|
|
295
|
+
continue;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
await copyFileAtomic(prepared.targetDir, relativePath, templateFile.source);
|
|
299
|
+
appliedCount++;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
let removedCount = 0;
|
|
303
|
+
for (const relativePath of prepared.orphanedFiles) {
|
|
304
|
+
const fileToRemove = targetPath(prepared.targetDir, relativePath);
|
|
305
|
+
try {
|
|
306
|
+
await fs.unlink(fileToRemove);
|
|
307
|
+
removedCount++;
|
|
308
|
+
} catch (error) {
|
|
309
|
+
if (error.code !== "ENOENT") {
|
|
310
|
+
throw error;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
await writeInstallManifest(prepared.targetDir, prepared.nextManifest);
|
|
316
|
+
|
|
317
|
+
return {
|
|
318
|
+
appliedCount,
|
|
319
|
+
removedCount
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
async function writeInstallManifest(targetDir, manifest) {
|
|
324
|
+
const manifestFile = targetPath(targetDir, MANIFEST_PATH);
|
|
325
|
+
await fs.mkdir(path.dirname(manifestFile), { recursive: true });
|
|
326
|
+
await fs.writeFile(manifestFile, `${JSON.stringify(manifest, null, 2)}\n`, "utf8");
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
async function copyFileAtomic(targetDir, relativePath, sourcePath) {
|
|
330
|
+
await assertNoSymlinkParents(targetDir, relativePath);
|
|
331
|
+
const destinationPath = targetPath(targetDir, relativePath);
|
|
332
|
+
await fs.mkdir(path.dirname(destinationPath), { recursive: true });
|
|
333
|
+
|
|
334
|
+
const tempPath = `${destinationPath}.tmp-${process.pid}-${Date.now()}`;
|
|
335
|
+
await fs.copyFile(sourcePath, tempPath);
|
|
336
|
+
await fs.rename(tempPath, destinationPath);
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
function targetPath(targetDir, relativePath) {
|
|
340
|
+
return path.resolve(targetDir, ...relativePath.split("/"));
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
async function assertNoSymlinkParents(targetDir, relativePath) {
|
|
344
|
+
const parts = relativePath.split("/");
|
|
345
|
+
let current = path.resolve(targetDir);
|
|
346
|
+
|
|
347
|
+
for (let i = 0; i < parts.length - 1; i++) {
|
|
348
|
+
current = path.join(current, parts[i]);
|
|
349
|
+
try {
|
|
350
|
+
const stats = await fs.lstat(current);
|
|
351
|
+
if (stats.isSymbolicLink()) {
|
|
352
|
+
throw new Error(
|
|
353
|
+
`Target sub-path "${parts.slice(0, i + 1).join("/")}" is a symbolic link.`
|
|
354
|
+
);
|
|
355
|
+
}
|
|
356
|
+
} catch (error) {
|
|
357
|
+
if (error.code === "ENOENT") {
|
|
358
|
+
break;
|
|
359
|
+
}
|
|
360
|
+
throw error;
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
async function hashFile(filePath) {
|
|
366
|
+
const content = await fs.readFile(filePath);
|
|
367
|
+
return crypto.createHash("sha256").update(content).digest("hex");
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
module.exports = {
|
|
371
|
+
CONTROL_DIR,
|
|
372
|
+
MANIFEST_PATH,
|
|
373
|
+
adapterListFromMode,
|
|
374
|
+
applyPreparedUpdate,
|
|
375
|
+
createManifest,
|
|
376
|
+
prepareUpdate,
|
|
377
|
+
readManifest,
|
|
378
|
+
writeInstallManifest
|
|
379
|
+
};
|
package/package.json
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@jakkrichm/create-nexus-devflow",
|
|
3
|
+
"version": "2.0.0",
|
|
4
|
+
"description": "Install or update the agent-ready DevFlow 2.0 workflow layer into a scaffolded or existing project.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "Jakkrich",
|
|
7
|
+
"homepage": "https://github.com/Jakkrich/nexus-devflow#readme",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+https://github.com/Jakkrich/nexus-devflow.git",
|
|
11
|
+
"directory": "packages/create-nexus-devflow"
|
|
12
|
+
},
|
|
13
|
+
"bugs": {
|
|
14
|
+
"url": "https://github.com/Jakkrich/nexus-devflow/issues"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [
|
|
17
|
+
"devflow",
|
|
18
|
+
"nexus-devflow",
|
|
19
|
+
"ai",
|
|
20
|
+
"ai-coding",
|
|
21
|
+
"antigravity",
|
|
22
|
+
"codex",
|
|
23
|
+
"claude-code",
|
|
24
|
+
"agent",
|
|
25
|
+
"workflow",
|
|
26
|
+
"scaffold"
|
|
27
|
+
],
|
|
28
|
+
"bin": {
|
|
29
|
+
"create-nexus-devflow": "bin/create-nexus-devflow.js",
|
|
30
|
+
"nexus-devflow": "bin/create-nexus-devflow.js"
|
|
31
|
+
},
|
|
32
|
+
"scripts": {
|
|
33
|
+
"test": "node --test",
|
|
34
|
+
"check:pack": "npm pack --dry-run",
|
|
35
|
+
"prepare-template": "node scripts/prepare-template.js",
|
|
36
|
+
"prepack": "node scripts/prepare-template.js",
|
|
37
|
+
"postpack": "node scripts/clean-template.js"
|
|
38
|
+
},
|
|
39
|
+
"files": [
|
|
40
|
+
"bin/",
|
|
41
|
+
"lib/",
|
|
42
|
+
"template/",
|
|
43
|
+
"README.md",
|
|
44
|
+
"LICENSE",
|
|
45
|
+
"package.json"
|
|
46
|
+
],
|
|
47
|
+
"publishConfig": {
|
|
48
|
+
"access": "public"
|
|
49
|
+
},
|
|
50
|
+
"engines": {
|
|
51
|
+
"node": ">=18"
|
|
52
|
+
}
|
|
53
|
+
}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
---name: 00-discover
|
|
2
|
+
|
|
3
|
+
description: Discover stage in DevFlow 2.0 - explore a request, route supporting inquiry, and decide whether delivery work should begin without allocating a running ID.
|
|
4
|
+
argument-hint: "{title, request, or discovery-id}"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Phase 00: Discover
|
|
8
|
+
|
|
9
|
+
$ARGUMENTS
|
|
10
|
+
|
|
11
|
+
Explore a request before delivery commitment. Create or resume a Discovery ID, choose only the supporting route that the uncertainty requires, and finish with a visible `Proceed`, `Defer`, or `Reject` decision. Do not create a Running ID in this stage.
|
|
12
|
+
|
|
13
|
+
## Usage
|
|
14
|
+
|
|
15
|
+
```text
|
|
16
|
+
/00-Discover {title or request}
|
|
17
|
+
/00-Discover {discovery-id}
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Use this when:
|
|
21
|
+
|
|
22
|
+
- a new request needs discussion before the team commits to delivery
|
|
23
|
+
- the best route may be `Brainstorm`, `PRD`, `Research`, or `Debug`
|
|
24
|
+
- supporting findings need to be synthesized into a go/no-go decision
|
|
25
|
+
|
|
26
|
+
## Markdown-First Contract
|
|
27
|
+
|
|
28
|
+
Write the primary discovery artifact to:
|
|
29
|
+
|
|
30
|
+
```text
|
|
31
|
+
devflow/discoveries/{DISCOVERY_ID}-{slug}/00-discover.md
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
using:
|
|
35
|
+
|
|
36
|
+
```text
|
|
37
|
+
.agent/resources/schemas/discover.template.md
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Before writing `00-discover.md`, read `artifact_language` from `discover.template.md` and produce the artifact in that language.
|
|
41
|
+
|
|
42
|
+
A Discovery ID uses a separate namespace such as `DISC-YYYYMMDD-NNN`. It is not a Running ID and must not reserve a numeric delivery run.
|
|
43
|
+
|
|
44
|
+
## Required Section Content
|
|
45
|
+
|
|
46
|
+
Before completing any generated artifact:
|
|
47
|
+
|
|
48
|
+
- preserve every heading required by the selected template
|
|
49
|
+
- write concrete information under every heading
|
|
50
|
+
- when no information exists or the section does not apply, write exactly `-`
|
|
51
|
+
- never leave a heading immediately followed by another heading with no body content
|
|
52
|
+
- remove template placeholders from the final artifact
|
|
53
|
+
- do not invent facts merely to avoid using `-`
|
|
54
|
+
- re-read the saved artifact and verify every heading satisfies this rule
|
|
55
|
+
|
|
56
|
+
## Process
|
|
57
|
+
|
|
58
|
+
### Loop Contract
|
|
59
|
+
|
|
60
|
+
Run discovery as a decision-and-routing loop, not as task initialization.
|
|
61
|
+
|
|
62
|
+
- **Intent**: understand the request, select proportionate supporting inquiry, and decide whether the idea should enter delivery definition.
|
|
63
|
+
- **Context**: read the request, the discovery artifact when resuming, companion outputs, project context, constraints, and available evidence.
|
|
64
|
+
- **Action**: restate the problem, identify the decision-blocking uncertainty, select `Brainstorm`, `PRD`, `Research`, `Debug`, or direct decision, then synthesize returned findings.
|
|
65
|
+
- **Observation**: use concrete evidence such as option tradeoffs, product framing, research results, root cause, stakeholder constraints, open questions, and visible risk.
|
|
66
|
+
- **Adjustment**: invoke only the companion route needed to resolve the current uncertainty; every companion invoked by Discover must return to this Discovery ID for synthesis.
|
|
67
|
+
- **Stop Condition**: stop when the selected route and evidence are recorded, open questions are visible, and the decision is `Proceed`, `Defer`, or `Reject`.
|
|
68
|
+
- **Handoff**: only an approved `Proceed` discovery may hand off to `/10-Define {discovery_id}`. `Defer` and `Reject` end without allocating a Running ID.
|
|
69
|
+
|
|
70
|
+
### 1. Create Or Resume The Discovery
|
|
71
|
+
|
|
72
|
+
- inspect `devflow/discoveries/`
|
|
73
|
+
- create a collision-free Discovery ID or resume the one supplied
|
|
74
|
+
- generate a stable slug
|
|
75
|
+
- do not inspect or increment numeric Running IDs during this stage
|
|
76
|
+
|
|
77
|
+
### 2. Ground The Request
|
|
78
|
+
|
|
79
|
+
- restate the request in plain language
|
|
80
|
+
- identify the affected users, stakeholders, or systems
|
|
81
|
+
- capture known constraints and decision-blocking unknowns
|
|
82
|
+
- distinguish an idea worth exploring from delivery work already approved elsewhere
|
|
83
|
+
|
|
84
|
+
### 3. Select The Supporting Route
|
|
85
|
+
|
|
86
|
+
Choose proportionally:
|
|
87
|
+
|
|
88
|
+
- `Brainstorm` when several viable directions need comparison
|
|
89
|
+
- `PRD` when user value, product outcomes, MVP boundaries, or success measures need framing
|
|
90
|
+
- `Research` when facts, codebase evidence, feasibility, or external constraints are missing
|
|
91
|
+
- `Debug` when the request begins with a failure and root cause is unknown
|
|
92
|
+
- direct decision when the request and evidence are already clear
|
|
93
|
+
|
|
94
|
+
Routes are not mutually exclusive, but do not stack them by default. Record why each selected route is necessary. Pass the Discovery ID to the companion and require its output to link back to the discovery.
|
|
95
|
+
|
|
96
|
+
### 4. Synthesize Returned Findings
|
|
97
|
+
|
|
98
|
+
After each companion route:
|
|
99
|
+
|
|
100
|
+
- update `00-discover.md` with the durable findings and source path
|
|
101
|
+
- reassess whether another route is materially necessary
|
|
102
|
+
- return to the Discover decision rather than jumping directly to `/10-Define`
|
|
103
|
+
|
|
104
|
+
### 5. Decide
|
|
105
|
+
|
|
106
|
+
Set one decision:
|
|
107
|
+
|
|
108
|
+
- `Proceed`: enough value and evidence exist to define delivery work
|
|
109
|
+
- `Defer`: the idea remains relevant but timing, evidence, or ownership is not ready
|
|
110
|
+
- `Reject`: the idea should not proceed under the current framing
|
|
111
|
+
|
|
112
|
+
Candidate delivery slices may be suggested, but they remain provisional and unnumbered until `/10-Define`.
|
|
113
|
+
|
|
114
|
+
### 6. Write `00-discover.md`
|
|
115
|
+
|
|
116
|
+
- preserve the template headings
|
|
117
|
+
- follow the configured `artifact_language`
|
|
118
|
+
- replace placeholders with concrete context
|
|
119
|
+
- record selected routes, returned findings, open questions, decision, and rationale
|
|
120
|
+
- keep `related_runs` empty until `/10-Define` materializes approved slices
|
|
121
|
+
|
|
122
|
+
### 7. Manual Review Gate
|
|
123
|
+
|
|
124
|
+
Before `/10-Define`:
|
|
125
|
+
|
|
126
|
+
- confirm the selected route and evidence are sufficient
|
|
127
|
+
- confirm the decision is `Proceed`
|
|
128
|
+
- set `Approval Status` to `Approved`
|
|
129
|
+
|
|
130
|
+
Do not allocate Running IDs when the decision or approval is pending.
|
|
131
|
+
|
|
132
|
+
## Output
|
|
133
|
+
|
|
134
|
+
Report:
|
|
135
|
+
|
|
136
|
+
- Discovery ID and artifact path
|
|
137
|
+
- request and problem summary
|
|
138
|
+
- selected support route and why
|
|
139
|
+
- important findings and open questions
|
|
140
|
+
- `Proceed`, `Defer`, or `Reject` decision
|
|
141
|
+
- recommended next step, including `/10-Define {discovery_id}` only when Proceed is approved
|
|
142
|
+
|
|
143
|
+
## Relationship To DevFlow 2.0
|
|
144
|
+
|
|
145
|
+
- Classification: Mainline discovery stage
|
|
146
|
+
- Previous state: request intake
|
|
147
|
+
- Next state: `/10-Define {discovery_id}` only after approved Proceed
|
|
148
|
+
- Common companion routes: `Brainstorm`, `PRD`, `Research`, `Debug`
|
|
149
|
+
- Running ID lifecycle: begins in `/10-Define`, not in Discover
|
|
150
|
+
|
|
151
|
+
## Sources
|
|
152
|
+
|
|
153
|
+
- `AGENTS.md`
|
|
154
|
+
- `docs/workspace-artifacts.md`
|
|
155
|
+
- `.agent/resources/schemas/discover.template.md`
|
|
156
|
+
|
|
157
|
+
## Next Workflow Recommendation
|
|
158
|
+
|
|
159
|
+
- **Primary**: the selected companion route, or `/10-Define {discovery_id}` after approved Proceed
|
|
160
|
+
- **Alternatives**:
|
|
161
|
+
- `Brainstorm {discovery_id}` for unresolved options
|
|
162
|
+
- `PRD {discovery_id}` for product framing
|
|
163
|
+
- `Research {discovery_id}` for missing evidence
|
|
164
|
+
- `Debug {discovery_id}` for unknown root cause
|
|
165
|
+
- no next command when the decision is Defer or Reject
|
|
166
|
+
|
|
167
|
+
## Nexus Event
|
|
168
|
+
|
|
169
|
+
- Use `grill-with-docs` when focused clarification could change the decision or selected route.
|
|
170
|
+
- Use `prototype` when runnable evidence is the fastest way to settle feasibility.
|