sinapse-ai 9.3.0 ā 9.5.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/.claude/CLAUDE.md +60 -341
- package/.claude/hooks/enforce-architecture-first.py +197 -197
- package/.claude/hooks/enforce-git-push-authority.sh +25 -4
- package/.claude/hooks/mind-clone-governance.py +193 -193
- package/.claude/hooks/read-protection.py +152 -152
- package/.claude/hooks/sql-governance.py +183 -183
- package/.claude/hooks/verify-packages.cjs +83 -0
- package/.claude/hooks/write-path-validation.py +195 -195
- package/.claude/rules/agent-authority.md +6 -0
- package/.claude/rules/agent-handoff.md +5 -0
- package/.claude/rules/cross-squad-routing.md +5 -0
- package/.claude/rules/hook-governance.md +7 -0
- package/.claude/rules/mandatory-delegation.md +24 -0
- package/.claude/rules/mcp-usage.md +3 -1
- package/.claude/rules/project-intelligence.md +63 -0
- package/.claude/rules/response-format.md +4 -0
- package/.claude/rules/safe-collaboration.md +14 -2
- package/.claude/rules/security-data-protection.md +27 -0
- package/.claude/rules/squad-awareness.md +96 -68
- package/.claude/rules/token-economy.md +148 -0
- package/.claude/rules/tool-examples.md +6 -0
- package/.claude/rules/workflow-execution.md +7 -0
- package/.codex/agents/analyst.md +342 -71
- package/.codex/agents/architect.md +533 -68
- package/.codex/agents/data-engineer.md +530 -106
- package/.codex/agents/developer.md +657 -0
- package/.codex/agents/devops.md +639 -69
- package/.codex/agents/product-lead.md +362 -0
- package/.codex/agents/project-lead.md +405 -0
- package/.codex/agents/quality-gate.md +538 -0
- package/.codex/agents/sinapse-orqx.md +9 -7
- package/.codex/agents/sprint-lead.md +315 -0
- package/.codex/agents/squad-creator.md +402 -0
- package/.codex/agents/ux-design-expert.md +523 -0
- package/.codex/delegation-matrix.json +756 -44
- package/.codex/handoff-packet.schema.json +30 -6
- package/.sinapse-ai/core/code-intel/registry-syncer.js +56 -3
- package/.sinapse-ai/core/doctor/checks/agent-memory.js +5 -1
- package/.sinapse-ai/core/doctor/checks/claude-md.js +4 -1
- package/.sinapse-ai/core/doctor/checks/code-intel.js +5 -1
- package/.sinapse-ai/core/doctor/checks/commands-count.js +4 -1
- package/.sinapse-ai/core/doctor/checks/constitution-consistency.js +4 -1
- package/.sinapse-ai/core/doctor/checks/core-config.js +4 -1
- package/.sinapse-ai/core/doctor/checks/entity-registry.js +6 -1
- package/.sinapse-ai/core/doctor/checks/git-hooks.js +5 -1
- package/.sinapse-ai/core/doctor/checks/graph-dashboard.js +4 -1
- package/.sinapse-ai/core/doctor/checks/hooks-claude-count.js +5 -1
- package/.sinapse-ai/core/doctor/checks/ide-sync.js +4 -1
- package/.sinapse-ai/core/doctor/checks/node-version.js +4 -1
- package/.sinapse-ai/core/doctor/checks/npm-packages.js +4 -1
- package/.sinapse-ai/core/doctor/checks/rules-files.js +4 -1
- package/.sinapse-ai/core/doctor/checks/settings-json.js +4 -1
- package/.sinapse-ai/core/doctor/checks/skills-count.js +4 -1
- package/.sinapse-ai/core/doctor/index.js +157 -50
- package/.sinapse-ai/core/ids/registry-updater.js +6 -1
- package/.sinapse-ai/core/logger/index.js +319 -0
- package/.sinapse-ai/core/orchestration/terminal-spawner.js +2 -2
- package/.sinapse-ai/core/telemetry/index.js +247 -0
- package/.sinapse-ai/data/entity-registry.yaml +1060 -808
- package/.sinapse-ai/development/agents/analyst.md +90 -0
- package/.sinapse-ai/development/agents/architect.md +78 -0
- package/.sinapse-ai/development/agents/data-engineer.md +38 -0
- package/.sinapse-ai/development/agents/developer.md +97 -0
- package/.sinapse-ai/development/agents/devops.md +121 -0
- package/.sinapse-ai/development/agents/product-lead.md +27 -0
- package/.sinapse-ai/development/agents/project-lead.md +28 -0
- package/.sinapse-ai/development/agents/quality-gate.md +89 -0
- package/.sinapse-ai/development/agents/sprint-lead/MEMORY.md +8 -0
- package/.sinapse-ai/development/agents/sprint-lead.md +28 -0
- package/.sinapse-ai/development/agents/squad-creator.md +58 -0
- package/.sinapse-ai/development/agents/ux-design-expert.md +28 -0
- package/.sinapse-ai/development/checklists/agent-quality-gate.md +27 -0
- package/.sinapse-ai/development/checklists/brownfield-compatibility-checklist.md +20 -0
- package/.sinapse-ai/development/checklists/code-review-checklist.md +106 -0
- package/.sinapse-ai/development/checklists/issue-triage-checklist.md +9 -0
- package/.sinapse-ai/development/checklists/memory-audit-checklist.md +16 -0
- package/.sinapse-ai/development/checklists/pr-quality-checklist.md +72 -0
- package/.sinapse-ai/development/checklists/security-deployment-checklist.md +54 -0
- package/.sinapse-ai/development/checklists/self-critique-checklist.md +19 -1
- package/.sinapse-ai/development/knowledge-base/agent-communication-protocol.md +127 -0
- package/.sinapse-ai/development/knowledge-base/database-scaling-patterns.md +374 -0
- package/.sinapse-ai/development/knowledge-base/environment-deployment-patterns.md +353 -0
- package/.sinapse-ai/development/knowledge-base/gotchas-patterns.md +224 -0
- package/.sinapse-ai/development/knowledge-base/infrastructure-decision-framework.md +221 -0
- package/.sinapse-ai/development/knowledge-base/security-pre-deploy-checklist.md +410 -0
- package/.sinapse-ai/development/knowledge-base/software-architecture-patterns.md +299 -0
- package/.sinapse-ai/development/knowledge-base/token-economy-guide.md +198 -0
- package/.sinapse-ai/development/scripts/populate-entity-registry.js +5 -1
- package/.sinapse-ai/development/skills/captcha-handler.md +82 -0
- package/.sinapse-ai/development/skills/chrome-brain.md +81 -0
- package/.sinapse-ai/development/skills/debug.md +57 -0
- package/.sinapse-ai/development/skills/deploy-readiness.md +93 -0
- package/.sinapse-ai/development/skills/fast-review.md +69 -0
- package/.sinapse-ai/development/skills/model-router.md +92 -0
- package/.sinapse-ai/development/skills/research-synthesis.md +77 -0
- package/.sinapse-ai/development/skills/security-scan.md +73 -0
- package/.sinapse-ai/development/skills/sinapse-methodology.md +175 -0
- package/.sinapse-ai/development/skills/story-fast-track.md +71 -0
- package/.sinapse-ai/development/skills/verify.md +53 -0
- package/.sinapse-ai/development/tasks/dev-develop-story.md +10 -0
- package/.sinapse-ai/development/tasks/environment-promotion-pipeline.md +582 -0
- package/.sinapse-ai/development/tasks/generate-agent-handoff.md +223 -0
- package/.sinapse-ai/development/tasks/infrastructure-assessment.md +432 -0
- package/.sinapse-ai/development/tasks/load-testing-setup.md +611 -0
- package/.sinapse-ai/development/tasks/observability-blueprint.md +562 -0
- package/.sinapse-ai/development/templates/legal/breach-notification-tmpl.md +113 -0
- package/.sinapse-ai/development/templates/legal/privacy-policy-tmpl.md +93 -0
- package/.sinapse-ai/development/templates/legal/terms-of-service-tmpl.md +85 -0
- package/.sinapse-ai/development/templates/service-template/README.md.hbs +159 -159
- package/.sinapse-ai/development/templates/service-template/__tests__/index.test.ts.hbs +238 -238
- package/.sinapse-ai/development/templates/service-template/client.ts.hbs +404 -404
- package/.sinapse-ai/development/templates/service-template/errors.ts.hbs +183 -183
- package/.sinapse-ai/development/templates/service-template/index.ts.hbs +121 -121
- package/.sinapse-ai/development/templates/service-template/package.json.hbs +88 -88
- package/.sinapse-ai/development/templates/service-template/types.ts.hbs +146 -146
- package/.sinapse-ai/development/templates/squad/agent-template.md +17 -4
- package/.sinapse-ai/development/templates/squad/checklist-template.md +13 -5
- package/.sinapse-ai/development/templates/squad/task-template.md +7 -0
- package/.sinapse-ai/development/templates/squad/workflow-template.yaml +7 -0
- package/.sinapse-ai/development/templates/squad-template/LICENSE +22 -22
- package/.sinapse-ai/development/workflows/fast-track.yaml +87 -0
- package/.sinapse-ai/development/workflows/story-development-cycle.yaml +40 -1
- package/.sinapse-ai/hooks/ids-post-commit.js +22 -0
- package/.sinapse-ai/infrastructure/contracts/compatibility/README.md +42 -0
- package/.sinapse-ai/infrastructure/contracts/compatibility/sinapse-current.yaml +35 -0
- package/.sinapse-ai/infrastructure/scripts/llm-routing/templates/claude-free-tracked.cmd +127 -127
- package/.sinapse-ai/infrastructure/scripts/llm-routing/templates/deepseek-proxy.cmd +71 -71
- package/.sinapse-ai/infrastructure/scripts/llm-routing/templates/deepseek-usage.cmd +51 -51
- package/.sinapse-ai/infrastructure/scripts/pr-review-ai.js +16 -13
- package/.sinapse-ai/infrastructure/scripts/setup-project-infra.js +128 -0
- package/.sinapse-ai/infrastructure/scripts/test-discovery.js +8 -3
- package/.sinapse-ai/infrastructure/scripts/validate-codex-delegation.js +3 -1
- package/.sinapse-ai/infrastructure/scripts/validate-manifest-parity.js +380 -0
- package/.sinapse-ai/infrastructure/scripts/validate-parity.js +76 -25
- package/.sinapse-ai/infrastructure/templates/coderabbit.yaml.template +280 -280
- package/.sinapse-ai/infrastructure/templates/config/env.example +16 -0
- package/.sinapse-ai/infrastructure/templates/config/gitignore-additions.tmpl +59 -0
- package/.sinapse-ai/infrastructure/templates/github/CODEOWNERS.template +12 -0
- package/.sinapse-ai/infrastructure/templates/github/PULL_REQUEST_TEMPLATE.md +29 -0
- package/.sinapse-ai/infrastructure/templates/github/ci-template.yml +77 -0
- package/.sinapse-ai/infrastructure/templates/github/issue-templates/bug_report.md +34 -0
- package/.sinapse-ai/infrastructure/templates/github/issue-templates/feature_request.md +19 -0
- package/.sinapse-ai/infrastructure/templates/github-workflows/ci.yml.template +170 -170
- package/.sinapse-ai/infrastructure/templates/github-workflows/pr-automation.yml.template +331 -331
- package/.sinapse-ai/infrastructure/templates/github-workflows/release.yml.template +197 -197
- package/.sinapse-ai/infrastructure/templates/gitignore/gitignore-brownfield-merge.tmpl +19 -19
- package/.sinapse-ai/infrastructure/templates/gitignore/gitignore-node.tmpl +86 -86
- package/.sinapse-ai/infrastructure/templates/gitignore/gitignore-python.tmpl +146 -146
- package/.sinapse-ai/infrastructure/templates/gitignore/gitignore-sinapse-base.tmpl +64 -64
- package/.sinapse-ai/infrastructure/templates/sinapse-sync.yaml.template +183 -183
- package/.sinapse-ai/install-manifest.yaml +333 -162
- package/.sinapse-ai/local-config.yaml.template +65 -65
- package/.sinapse-ai/monitor/hooks/lib/__init__.py +2 -2
- package/.sinapse-ai/monitor/hooks/lib/enrich.py +59 -59
- package/.sinapse-ai/monitor/hooks/lib/send_event.py +48 -48
- package/.sinapse-ai/monitor/hooks/notification.py +30 -30
- package/.sinapse-ai/monitor/hooks/post_tool_use.py +46 -46
- package/.sinapse-ai/monitor/hooks/pre_compact.py +30 -30
- package/.sinapse-ai/monitor/hooks/pre_tool_use.py +41 -41
- package/.sinapse-ai/monitor/hooks/stop.py +30 -30
- package/.sinapse-ai/monitor/hooks/subagent_stop.py +30 -30
- package/.sinapse-ai/monitor/hooks/user_prompt_submit.py +39 -39
- package/.sinapse-ai/product/templates/adr.hbs +126 -126
- package/.sinapse-ai/product/templates/dbdr.hbs +242 -242
- package/.sinapse-ai/product/templates/epic.hbs +213 -213
- package/.sinapse-ai/product/templates/pmdr.hbs +187 -187
- package/.sinapse-ai/product/templates/prd-v2.0.hbs +217 -217
- package/.sinapse-ai/product/templates/prd.hbs +202 -202
- package/.sinapse-ai/product/templates/story-tmpl.yaml +59 -0
- package/.sinapse-ai/product/templates/story.hbs +264 -264
- package/.sinapse-ai/product/templates/task.hbs +171 -171
- package/.sinapse-ai/product/templates/tmpl-comment-on-examples.sql +159 -159
- package/.sinapse-ai/product/templates/tmpl-migration-script.sql +92 -92
- package/.sinapse-ai/product/templates/tmpl-rls-granular-policies.sql +105 -105
- package/.sinapse-ai/product/templates/tmpl-rls-kiss-policy.sql +11 -11
- package/.sinapse-ai/product/templates/tmpl-rls-roles.sql +136 -136
- package/.sinapse-ai/product/templates/tmpl-rls-simple.sql +78 -78
- package/.sinapse-ai/product/templates/tmpl-rls-tenant.sql +153 -153
- package/.sinapse-ai/product/templates/tmpl-rollback-script.sql +78 -78
- package/.sinapse-ai/product/templates/tmpl-seed-data.sql +141 -141
- package/.sinapse-ai/product/templates/tmpl-smoke-test.sql +17 -17
- package/.sinapse-ai/product/templates/tmpl-staging-copy-merge.sql +140 -140
- package/.sinapse-ai/product/templates/tmpl-stored-proc.sql +141 -141
- package/.sinapse-ai/product/templates/tmpl-trigger.sql +153 -153
- package/.sinapse-ai/product/templates/tmpl-view-materialized.sql +134 -134
- package/.sinapse-ai/product/templates/tmpl-view.sql +178 -178
- package/.sinapse-ai/scripts/diagnostics/health-dashboard/package-lock.json +427 -355
- package/LICENSE +34 -34
- package/README.en.md +167 -20
- package/README.md +190 -22
- package/bin/cli.js +510 -196
- package/bin/postinstall.js +564 -0
- package/bin/sinapse-cli +283 -283
- package/bin/sinapse-graph.js +9 -0
- package/bin/sinapse-init.js +36 -4
- package/bin/sinapse-minimal.js +20 -9
- package/bin/sinapse.js +202 -122
- package/bin/utils/deprecation-warning.js +46 -0
- package/bin/utils/pre-push-safety.js +14 -0
- package/docs/TELEMETRY.md +131 -0
- package/docs/chrome-brain-upgrade-plan.md +624 -0
- package/docs/codex-integration-process.md +22 -0
- package/docs/codex-parity-program.md +27 -0
- package/docs/framework/orqx-plan.md +1 -1
- package/docs/ide-integration.md +36 -0
- package/docs/installation/chrome-brain.md +17 -7
- package/docs/mega-upgrade-orchestration-plan.md +71 -0
- package/docs/pt/contributing.md +20 -0
- package/docs/research-synthesis-for-upgrade.md +511 -0
- package/docs/security-audit-report.md +306 -0
- package/package.json +20 -8
- package/packages/installer/src/config/configure-environment.js +19 -44
- package/packages/installer/src/detection/detect-project-type.js +181 -63
- package/packages/installer/src/installer/manifest-signature.js +32 -17
- package/packages/installer/src/wizard/i18n.js +12 -0
- package/packages/installer/src/wizard/ide-config-generator.js +8 -39
- package/packages/installer/src/wizard/index.js +119 -14
- package/packages/installer/src/wizard/questions.js +2 -3
- package/packages/installer/tests/integration/environment-configuration.test.js +7 -5
- package/packages/installer/tests/unit/detection/detect-project-type.test.js +138 -1
- package/packages/installer/tests/unit/doctor/doctor-orchestrator.test.js +3 -3
- package/packages/sinapse-install/bin/edmcp.js +0 -0
- package/packages/sinapse-install/bin/sinapse-install.js +0 -0
- package/packages/sinapse-pro-cli/bin/sinapse-pro.js +0 -0
- package/scripts/check-markdown-links.py +353 -353
- package/scripts/coverage-report-summary.js +169 -0
- package/scripts/generate-install-manifest.js +6 -2
- package/scripts/release-readiness.js +169 -0
- package/scripts/test-install-matrix-local.sh +153 -0
- package/scripts/validate-install-docs.js +394 -0
- package/scripts/validate-no-external-refs.js +376 -0
- package/scripts/validate-squad-orqx.js +302 -0
- package/scripts/validate-story-meta.js +263 -0
- package/squads/claude-code-mastery/CHANGELOG.md +1 -1
- package/squads/claude-code-mastery/README.md +2 -2
- package/squads/claude-code-mastery/knowledge-base/claude-code-internals-reference.md +927 -0
- package/squads/claude-code-mastery/squad.yaml +1 -1
- package/squads/squad-artdir/README.md +90 -0
- package/squads/squad-artdir/agents/accessibility-guardian.md +184 -0
- package/squads/squad-artdir/agents/artdir-orqx.md +145 -0
- package/squads/squad-artdir/agents/color-psychologist.md +166 -0
- package/squads/squad-artdir/agents/cro-persuasion.md +161 -0
- package/squads/squad-artdir/agents/design-system-architect.md +100 -0
- package/squads/squad-artdir/agents/ia-architect.md +169 -0
- package/squads/squad-artdir/agents/interaction-designer.md +162 -0
- package/squads/squad-artdir/agents/layout-engineer.md +163 -0
- package/squads/squad-artdir/agents/motion-architect.md +185 -0
- package/squads/squad-artdir/agents/platform-aesthetic-director.md +84 -0
- package/squads/squad-artdir/agents/premium-packaging-strategist.md +107 -0
- package/squads/squad-artdir/agents/product-surface-director.md +86 -0
- package/squads/squad-artdir/agents/type-systemist.md +138 -0
- package/squads/squad-artdir/agents/visual-strategist.md +127 -0
- package/squads/squad-artdir/checklists/seven-pillars-validation-checklist.md +172 -0
- package/squads/squad-artdir/knowledge-base/case-nyo-ia-reference.md +289 -0
- package/squads/squad-artdir/knowledge-base/deliverables-templates.md +457 -0
- package/squads/squad-artdir/knowledge-base/motion-technique-catalog.md +247 -0
- package/squads/squad-artdir/knowledge-base/premium-packaging-principles.md +133 -0
- package/squads/squad-artdir/knowledge-base/psychological-toolkit.md +229 -0
- package/squads/squad-artdir/knowledge-base/saas-art-direction-canon.md +242 -0
- package/squads/squad-artdir/knowledge-base/seven-pillars-framework.md +289 -0
- package/squads/squad-artdir/knowledge-base/ten-pillars-framework.md +221 -0
- package/squads/squad-artdir/package.json +20 -0
- package/squads/squad-artdir/squad.yaml +271 -0
- package/squads/squad-artdir/tasks/audit-conversion.md +97 -0
- package/squads/squad-artdir/tasks/audit-drift-multi-surface.md +55 -0
- package/squads/squad-artdir/tasks/consult-saas-canon.md +54 -0
- package/squads/squad-artdir/tasks/create-art-direction-brief.md +110 -0
- package/squads/squad-artdir/tasks/create-premium-packaging-brief.md +61 -0
- package/squads/squad-artdir/tasks/create-wireflow.md +84 -0
- package/squads/squad-artdir/tasks/design-color-system.md +81 -0
- package/squads/squad-artdir/tasks/design-product-surface.md +60 -0
- package/squads/squad-artdir/tasks/design-token-system.md +58 -0
- package/squads/squad-artdir/tasks/diagnose-visual-language.md +92 -0
- package/squads/squad-artdir/tasks/first-5-minutes-choreography.md +65 -0
- package/squads/squad-artdir/tasks/specify-motion-system.md +84 -0
- package/squads/squad-artdir/tasks/validate-against-pillars.md +143 -0
- package/squads/squad-artdir/templates/art-direction-brief-template.md +215 -0
- package/squads/squad-artdir/workflows/conversion-audit-cycle.yaml +78 -0
- package/squads/squad-artdir/workflows/full-art-direction-cycle.yaml +98 -0
- package/squads/squad-artdir/workflows/saas-platform-art-direction-cycle.yaml +174 -0
- package/squads/squad-brand/knowledge-base/ai-visual-generation-canon.md +234 -0
- package/squads/squad-brand/knowledge-base/archetype-brand-mapping.md +12 -1
- package/squads/squad-brand/knowledge-base/brand-activism-cultural-branding.md +216 -0
- package/squads/squad-brand/knowledge-base/brand-audit-criteria.md +58 -0
- package/squads/squad-brand/knowledge-base/brand-digital-strategy.md +188 -0
- package/squads/squad-brand/knowledge-base/brand-legal-ip.md +222 -0
- package/squads/squad-brand/knowledge-base/brand-naming-framework.md +163 -0
- package/squads/squad-brand/knowledge-base/branding-master-reference.md +1001 -0
- package/squads/squad-brand/knowledge-base/color-psychology.md +25 -12
- package/squads/squad-brand/knowledge-base/employer-personal-branding.md +206 -0
- package/squads/squad-brand/knowledge-base/routing-catalog.md +34 -0
- package/squads/squad-brand/knowledge-base/sonic-branding-principles.md +6 -1
- package/squads/squad-brand/knowledge-base/typography-personality.md +34 -0
- package/squads/squad-brand/squad.yaml +20 -6
- package/squads/squad-claude/knowledge-base/context-window-optimization.md +334 -0
- package/squads/squad-claude/knowledge-base/knowledge-architecture-reference.md +403 -0
- package/squads/squad-claude/knowledge-base/memory-systems-reference.md +412 -0
- package/squads/squad-claude/knowledge-base/obsidian-claude-integration.md +423 -0
- package/squads/squad-claude/knowledge-base/retrieval-augmented-generation.md +320 -0
- package/squads/squad-claude/knowledge-base/skill-creation-patterns.md +380 -0
- package/squads/squad-claude/knowledge-base/swarm-orchestration-patterns.md +411 -0
- package/squads/squad-cloning/knowledge-base/clone-quality-assurance.md +211 -0
- package/squads/squad-cloning/knowledge-base/confidence-scoring.md +51 -0
- package/squads/squad-cloning/knowledge-base/cross-squad-deployment.md +47 -0
- package/squads/squad-cloning/knowledge-base/ethical-guidelines.md +237 -0
- package/squads/squad-cloning/knowledge-base/knowledge-graph-for-clones.md +295 -0
- package/squads/squad-cloning/knowledge-base/memory-architecture-for-clones.md +229 -0
- package/squads/squad-cloning/knowledge-base/multi-agent-deployment-patterns.md +320 -0
- package/squads/squad-cloning/knowledge-base/skill-standard-for-clones.md +262 -0
- package/squads/squad-cloning/knowledge-base/sop-extraction-guide.md +243 -0
- package/squads/squad-commercial/knowledge-base/account-based-selling.md +206 -0
- package/squads/squad-commercial/knowledge-base/ai-as-competitive-infrastructure.md +14 -0
- package/squads/squad-commercial/knowledge-base/ai-in-sales.md +199 -0
- package/squads/squad-commercial/knowledge-base/brazilian-sales-context.md +195 -0
- package/squads/squad-commercial/knowledge-base/customer-success-operations.md +83 -2
- package/squads/squad-commercial/knowledge-base/prospecting-pipeline-generation.md +69 -0
- package/squads/squad-commercial/knowledge-base/sales-enablement-playbook.md +260 -0
- package/squads/squad-commercial/knowledge-base/sales-methodology-comparison.md +185 -0
- package/squads/squad-commercial/knowledge-base/sales-revenue-master-reference.md +1123 -0
- package/squads/squad-content/knowledge-base/ai-native-content-loop.md +220 -0
- package/squads/squad-content/knowledge-base/brazilian-content-context.md +176 -0
- package/squads/squad-content/knowledge-base/competitor-analysis-methods.md +40 -1
- package/squads/squad-content/knowledge-base/content-architecture-taxonomy.md +206 -0
- package/squads/squad-content/knowledge-base/content-formats-encyclopedia.md +58 -1
- package/squads/squad-content/knowledge-base/content-references-bibliography.md +130 -0
- package/squads/squad-content/knowledge-base/content-strategy-master-reference.md +1097 -0
- package/squads/squad-content/knowledge-base/content-tech-stack.md +150 -0
- package/squads/squad-content/knowledge-base/copywriting-formulas-library.md +188 -0
- package/squads/squad-content/knowledge-base/email-newsletter-strategy.md +161 -0
- package/squads/squad-content/knowledge-base/platform-algorithm-intelligence.md +86 -1
- package/squads/squad-content/knowledge-base/signal-intelligence-v2.md +234 -0
- package/squads/squad-content/knowledge-base/social-algorithms-master-reference.md +1007 -0
- package/squads/squad-content/knowledge-base/task-ownership-map.md +235 -0
- package/squads/squad-content/knowledge-base/video-audio-content-playbook.md +218 -0
- package/squads/squad-content/squad.yaml +187 -27
- package/squads/squad-copy/knowledge-base/ai-copy-human-loop-canon.md +235 -0
- package/squads/squad-copy/knowledge-base/ai-copy-production.md +254 -0
- package/squads/squad-copy/knowledge-base/brazilian-copywriting-context.md +242 -0
- package/squads/squad-copy/knowledge-base/email-copywriting-system.md +299 -0
- package/squads/squad-copy/knowledge-base/landing-page-copy-architecture.md +267 -0
- package/squads/squad-copy/knowledge-base/power-words-catalog.md +205 -0
- package/squads/squad-copy/knowledge-base/seo-copywriting.md +255 -0
- package/squads/squad-copy/knowledge-base/video-script-copywriting.md +239 -0
- package/squads/squad-copy/squad.yaml +19 -4
- package/squads/squad-council/knowledge-base/brand-strategy-models.md +193 -0
- package/squads/squad-council/knowledge-base/growth-strategy-models.md +267 -0
- package/squads/squad-council/knowledge-base/innovation-disruption-frameworks.md +193 -0
- package/squads/squad-council/knowledge-base/market-analysis-frameworks.md +240 -0
- package/squads/squad-council/knowledge-base/organizational-leadership-models.md +212 -0
- package/squads/squad-council/knowledge-base/sales-strategy-models.md +215 -0
- package/squads/squad-courses/knowledge-base/course-launch-strategy.md +251 -0
- package/squads/squad-courses/knowledge-base/domain-advocacia-curriculum.md +385 -0
- package/squads/squad-courses/knowledge-base/domain-contabilidade-curriculum.md +266 -0
- package/squads/squad-courses/knowledge-base/platform-comparison.md +68 -0
- package/squads/squad-courses/knowledge-base/video-production-guide.md +70 -0
- package/squads/squad-cybersecurity/knowledge-base/cloud-security-reference.md +363 -0
- package/squads/squad-cybersecurity/knowledge-base/compliance-frameworks.md +273 -0
- package/squads/squad-cybersecurity/knowledge-base/database-security.md +438 -0
- package/squads/squad-cybersecurity/knowledge-base/incident-response-playbook.md +420 -0
- package/squads/squad-cybersecurity/knowledge-base/network-security-reference.md +477 -0
- package/squads/squad-cybersecurity/knowledge-base/penetration-testing-methodology.md +350 -0
- package/squads/squad-cybersecurity/knowledge-base/vulnerability-management.md +349 -0
- package/squads/squad-design/knowledge-base/brazilian-design-context.md +223 -0
- package/squads/squad-design/knowledge-base/component-api-patterns.md +208 -4
- package/squads/squad-design/knowledge-base/cross-surface-token-canon.md +209 -0
- package/squads/squad-design/knowledge-base/design-system-master-reference.md +1302 -0
- package/squads/squad-design/knowledge-base/design-systems-frameworks.md +91 -1
- package/squads/squad-design/knowledge-base/responsive-modern-css.md +96 -4
- package/squads/squad-design/knowledge-base/wcag-aria-reference.md +117 -5
- package/squads/squad-design/knowledge-base/web-performance-reference.md +127 -4
- package/squads/squad-design/squad.yaml +19 -4
- package/squads/squad-finance/knowledge-base/brazilian-taxation.md +263 -0
- package/squads/squad-finance/knowledge-base/contabilidade-master-reference.md +998 -0
- package/squads/squad-finance/knowledge-base/finance-master-reference.md +946 -0
- package/squads/squad-finance/knowledge-base/financial-reporting-analysis.md +316 -0
- package/squads/squad-finance/knowledge-base/fintech-brazilian-context.md +242 -0
- package/squads/squad-finance/knowledge-base/fpa-planning-frameworks.md +286 -0
- package/squads/squad-finance/knowledge-base/ma-and-transactions.md +285 -0
- package/squads/squad-finance/knowledge-base/risk-management.md +233 -0
- package/squads/squad-finance/knowledge-base/startups-venture-capital.md +337 -0
- package/squads/squad-growth/knowledge-base/ai-growth-playbook.md +216 -0
- package/squads/squad-growth/knowledge-base/attribution-models.md +78 -0
- package/squads/squad-growth/knowledge-base/brazilian-growth-context.md +208 -0
- package/squads/squad-growth/knowledge-base/community-led-growth.md +175 -0
- package/squads/squad-growth/knowledge-base/content-marketing-flywheel.md +190 -0
- package/squads/squad-growth/knowledge-base/email-lifecycle-framework.md +192 -0
- package/squads/squad-growth/knowledge-base/growth-frameworks-catalog.md +82 -0
- package/squads/squad-growth/knowledge-base/growth-master-reference.md +1168 -0
- package/squads/squad-growth/knowledge-base/routing-catalog.md +53 -11
- package/squads/squad-paidmedia/knowledge-base/audiences-segmentation-deep.md +285 -0
- package/squads/squad-paidmedia/knowledge-base/creative-strategy-deep.md +294 -0
- package/squads/squad-paidmedia/knowledge-base/google-ads-account-architecture.md +87 -0
- package/squads/squad-paidmedia/knowledge-base/meta-ads-campaign-architecture.md +76 -0
- package/squads/squad-paidmedia/knowledge-base/paid-media-metrics-reference.md +117 -0
- package/squads/squad-paidmedia/knowledge-base/paid-traffic-master-reference.md +1308 -0
- package/squads/squad-paidmedia/knowledge-base/routing-catalog.md +95 -18
- package/squads/squad-paidmedia/knowledge-base/traffic-masters-frameworks.md +71 -0
- package/squads/squad-product/knowledge-base/brazilian-product-context.md +284 -0
- package/squads/squad-product/knowledge-base/discovery-methodology-playbook.md +141 -0
- package/squads/squad-product/knowledge-base/pm-frameworks-reference.md +125 -9
- package/squads/squad-product/knowledge-base/product-analytics-formulas.md +72 -0
- package/squads/squad-product/knowledge-base/product-led-growth-reference.md +155 -13
- package/squads/squad-product/knowledge-base/product-market-fit-framework.md +222 -0
- package/squads/squad-product/knowledge-base/routing-catalog.md +32 -0
- package/squads/squad-research/knowledge-base/agentic-second-brain-reference.md +591 -0
- package/squads/squad-research/knowledge-base/ai-augmented-research.md +212 -0
- package/squads/squad-research/knowledge-base/brazilian-market-research-sources.md +197 -0
- package/squads/squad-research/knowledge-base/community-platforms-reference.md +786 -0
- package/squads/squad-research/knowledge-base/community-research-methods.md +194 -0
- package/squads/squad-research/knowledge-base/mixed-methods-research-design.md +168 -0
- package/squads/squad-research/knowledge-base/network-effects-analysis.md +192 -0
- package/squads/squad-research/knowledge-base/qualitative-research-deep-methods.md +202 -0
- package/squads/squad-research/knowledge-base/quantitative-research-methods.md +208 -0
- package/squads/squad-research/knowledge-base/research-frameworks-encyclopedia.md +40 -0
- package/squads/squad-research/knowledge-base/research-synthesis-frameworks.md +223 -0
- package/squads/squad-storytelling/knowledge-base/brand-mythology-framework.md +236 -0
- package/squads/squad-storytelling/knowledge-base/brazilian-storytelling-context.md +237 -0
- package/squads/squad-storytelling/knowledge-base/data-storytelling.md +232 -0
- package/squads/squad-storytelling/knowledge-base/improv-storytelling.md +226 -0
- package/squads/squad-storytelling/knowledge-base/persuasion-narrative-techniques.md +269 -0
- package/squads/squad-storytelling/knowledge-base/social-movement-narratives.md +191 -0
- package/squads/squad-storytelling/knowledge-base/video-storytelling.md +252 -0
- package/.sinapse-ai/core/registry/service-registry.json +0 -6346
- package/.sinapse-ai/data/registry-update-log.jsonl +0 -1307
- package/.sinapse-ai/manifests/agents.csv +0 -29
- package/.sinapse-ai/manifests/tasks.csv +0 -204
- package/.sinapse-ai/manifests/workers.csv +0 -196
- package/squads/claude-code-mastery/data/swarm-orchestration-patterns.yaml +0 -378
- package/squads/squad-animations/knowledge-base/framer-motion-complete-reference.md +0 -710
- package/squads/squad-animations/knowledge-base/web-animations-api-view-transitions.md +0 -478
- package/squads/squad-growth/tasks/calculate-sample-size.md +0 -121
- package/squads/squad-paidmedia/tasks/calculate-sample-size.md +0 -57
|
@@ -3,80 +3,198 @@ const path = require('path');
|
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Detects the type of project in the current directory
|
|
6
|
-
*
|
|
7
|
-
* Detection Priority Order:
|
|
8
|
-
* 1. EXISTING_SINAPSE - .sinapse-ai/ directory exists
|
|
9
|
-
* 2. GREENFIELD - directory is empty
|
|
10
|
-
* 3. BROWNFIELD - package.json OR .git exists
|
|
11
|
-
* 4. UNKNOWN - directory has files but no recognized markers
|
|
12
|
-
*
|
|
6
|
+
*
|
|
13
7
|
* @param {string} targetDir - Directory to analyze (defaults to process.cwd())
|
|
14
8
|
* @returns {string} 'GREENFIELD' | 'BROWNFIELD' | 'EXISTING_SINAPSE' | 'UNKNOWN'
|
|
15
|
-
* @throws {Error} If directory cannot be accessed
|
|
16
|
-
*
|
|
17
|
-
* @example
|
|
18
|
-
* // Detect current directory
|
|
19
|
-
* const type = detectProjectType();
|
|
20
|
-
* console.log(type); // 'GREENFIELD'
|
|
21
|
-
*
|
|
22
|
-
* @example
|
|
23
|
-
* // Detect specific directory
|
|
24
|
-
* const type = detectProjectType('/path/to/project');
|
|
25
|
-
* console.log(type); // 'BROWNFIELD'
|
|
26
9
|
*/
|
|
27
10
|
function detectProjectType(targetDir = process.cwd()) {
|
|
11
|
+
return detectProjectTypeExtended(targetDir).type;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Enhanced project detection with tech stack, maturity score, and recommendations.
|
|
16
|
+
*
|
|
17
|
+
* @param {string} targetDir - Directory to analyze (defaults to process.cwd())
|
|
18
|
+
* @returns {{ type: string, techStack: object, maturityScore: number, recommendations: string[] }}
|
|
19
|
+
*/
|
|
20
|
+
function detectProjectTypeExtended(targetDir = process.cwd()) {
|
|
21
|
+
if (!targetDir || typeof targetDir !== 'string') {
|
|
22
|
+
throw new Error('Failed to detect project type: Invalid targetDir parameter: must be a non-empty string');
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const normalizedDir = path.resolve(targetDir);
|
|
26
|
+
|
|
27
|
+
if (!fs.existsSync(normalizedDir)) {
|
|
28
|
+
throw new Error(`Failed to detect project type: Directory does not exist: ${normalizedDir}`);
|
|
29
|
+
}
|
|
30
|
+
|
|
28
31
|
try {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
// Normalize path for cross-platform compatibility
|
|
35
|
-
const normalizedDir = path.resolve(targetDir);
|
|
36
|
-
|
|
37
|
-
// Check if directory exists before attempting to read
|
|
38
|
-
if (!fs.existsSync(normalizedDir)) {
|
|
39
|
-
throw new Error(`Directory does not exist: ${normalizedDir}`);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
// Check for SINAPSE installation markers (use path.join for security)
|
|
43
|
-
const hasSinapseCore = fs.existsSync(path.join(normalizedDir, '.sinapse-ai'));
|
|
44
|
-
|
|
45
|
-
// If SINAPSE already installed, return immediately (highest priority)
|
|
46
|
-
if (hasSinapseCore) {
|
|
47
|
-
return 'EXISTING_SINAPSE';
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
// Check directory contents
|
|
51
|
-
const dirContents = fs.readdirSync(normalizedDir);
|
|
52
|
-
const isEmpty = dirContents.length === 0;
|
|
53
|
-
|
|
54
|
-
// Empty directory = greenfield (second priority)
|
|
55
|
-
if (isEmpty) {
|
|
56
|
-
return 'GREENFIELD';
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
// Check for project markers (third priority)
|
|
60
|
-
const hasPackageJson = fs.existsSync(path.join(normalizedDir, 'package.json'));
|
|
61
|
-
const hasGit = fs.existsSync(path.join(normalizedDir, '.git'));
|
|
62
|
-
|
|
63
|
-
// Existing project markers = brownfield
|
|
64
|
-
if (hasPackageJson || hasGit) {
|
|
65
|
-
return 'BROWNFIELD';
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
// Directory has files but no recognized markers = unknown
|
|
69
|
-
return 'UNKNOWN';
|
|
32
|
+
const type = _detectType(normalizedDir);
|
|
33
|
+
const techStack = type === 'GREENFIELD' ? _emptyStack() : _detectTechStack(normalizedDir);
|
|
34
|
+
const maturityScore = type === 'GREENFIELD' ? 0 : _calcMaturity(normalizedDir);
|
|
35
|
+
const recommendations = _buildRecommendations(type, techStack, maturityScore, normalizedDir);
|
|
70
36
|
|
|
37
|
+
return { type, techStack, maturityScore, recommendations };
|
|
71
38
|
} catch (error) {
|
|
72
|
-
|
|
39
|
+
if (error.message.startsWith('Failed to detect project type')) throw error;
|
|
73
40
|
console.error(`[detect-project-type] Error detecting project type in '${targetDir}': ${error.message}`);
|
|
74
|
-
|
|
75
|
-
// Re-throw with more context for caller to handle
|
|
76
41
|
throw new Error(`Failed to detect project type: ${error.message}`);
|
|
77
42
|
}
|
|
78
43
|
}
|
|
79
44
|
|
|
80
|
-
|
|
45
|
+
/** Core type classification (original logic). */
|
|
46
|
+
function _detectType(dir) {
|
|
47
|
+
if (fs.existsSync(path.join(dir, '.sinapse-ai'))) return 'EXISTING_SINAPSE';
|
|
48
|
+
|
|
49
|
+
const dirContents = fs.readdirSync(dir);
|
|
50
|
+
if (dirContents.length === 0) return 'GREENFIELD';
|
|
51
|
+
|
|
52
|
+
const hasPackageJson = fs.existsSync(path.join(dir, 'package.json'));
|
|
53
|
+
const hasGit = fs.existsSync(path.join(dir, '.git'));
|
|
54
|
+
if (hasPackageJson || hasGit) return 'BROWNFIELD';
|
|
55
|
+
|
|
56
|
+
return 'UNKNOWN';
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function _emptyStack() {
|
|
60
|
+
return { framework: null, language: null, database: null, testing: null, ci: null, containerized: false };
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** Detect tech stack from project files and package.json deps. */
|
|
64
|
+
function _detectTechStack(dir) {
|
|
65
|
+
const stack = _emptyStack();
|
|
66
|
+
const deps = _readDeps(dir);
|
|
67
|
+
|
|
68
|
+
// Framework detection (priority order)
|
|
69
|
+
const frameworkMap = [
|
|
70
|
+
['next', 'next'], ['nuxt', 'nuxt'], ['@angular/core', 'angular'],
|
|
71
|
+
['svelte', 'svelte'], ['vue', 'vue'], ['react', 'react'],
|
|
72
|
+
['@nestjs/core', 'nest'], ['fastify', 'fastify'], ['express', 'express'],
|
|
73
|
+
];
|
|
74
|
+
for (const [pkg, name] of frameworkMap) {
|
|
75
|
+
if (deps.has(pkg)) { stack.framework = name; break; }
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Language
|
|
79
|
+
stack.language = fs.existsSync(path.join(dir, 'tsconfig.json')) ? 'typescript' : 'javascript';
|
|
80
|
+
|
|
81
|
+
// Database
|
|
82
|
+
const dbMap = [['supabase', 'supabase'], ['prisma', 'prisma'], ['drizzle-orm', 'drizzle']];
|
|
83
|
+
for (const [pkg, name] of dbMap) {
|
|
84
|
+
if (deps.has(pkg) || deps.has(`@${pkg}/client`)) { stack.database = name; break; }
|
|
85
|
+
}
|
|
86
|
+
if (!stack.database && fs.existsSync(path.join(dir, 'supabase'))) stack.database = 'supabase';
|
|
87
|
+
if (!stack.database && fs.existsSync(path.join(dir, 'prisma'))) stack.database = 'prisma';
|
|
88
|
+
if (!stack.database && _existsGlob(dir, 'drizzle.config')) stack.database = 'drizzle';
|
|
89
|
+
|
|
90
|
+
// Testing
|
|
91
|
+
const testMap = [['vitest', 'vitest'], ['jest', 'jest'], ['mocha', 'mocha'], ['ava', 'ava']];
|
|
92
|
+
for (const [pkg, name] of testMap) {
|
|
93
|
+
if (deps.has(pkg)) { stack.testing = name; break; }
|
|
94
|
+
}
|
|
95
|
+
if (!stack.testing) {
|
|
96
|
+
if (_existsGlob(dir, 'vitest.config')) stack.testing = 'vitest';
|
|
97
|
+
else if (_existsGlob(dir, 'jest.config')) stack.testing = 'jest';
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// CI
|
|
101
|
+
if (fs.existsSync(path.join(dir, '.github', 'workflows'))) stack.ci = 'github-actions';
|
|
102
|
+
else if (fs.existsSync(path.join(dir, '.gitlab-ci.yml'))) stack.ci = 'gitlab-ci';
|
|
103
|
+
else if (fs.existsSync(path.join(dir, '.circleci'))) stack.ci = 'circleci';
|
|
104
|
+
|
|
105
|
+
// Containers
|
|
106
|
+
stack.containerized = fs.existsSync(path.join(dir, 'Dockerfile'))
|
|
107
|
+
|| fs.existsSync(path.join(dir, 'docker-compose.yml'))
|
|
108
|
+
|| fs.existsSync(path.join(dir, 'docker-compose.yaml'));
|
|
109
|
+
|
|
110
|
+
return stack;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/** Calculate maturity score (0-10). */
|
|
114
|
+
function _calcMaturity(dir) {
|
|
115
|
+
let score = 0;
|
|
116
|
+
const has = (p) => fs.existsSync(path.join(dir, p));
|
|
117
|
+
|
|
118
|
+
// Tests (+2)
|
|
119
|
+
if (has('tests') || has('test') || has('__tests__') || has('src/__tests__')) score += 2;
|
|
120
|
+
// CI/CD (+2)
|
|
121
|
+
if (has('.github/workflows') || has('.gitlab-ci.yml') || has('.circleci')) score += 2;
|
|
122
|
+
// Env example (+1)
|
|
123
|
+
if (has('.env.example') || has('.env.local.example')) score += 1;
|
|
124
|
+
// README (+1)
|
|
125
|
+
if (has('README.md') || has('readme.md')) score += 1;
|
|
126
|
+
// Docs (+1)
|
|
127
|
+
if (has('docs')) score += 1;
|
|
128
|
+
|
|
129
|
+
// >50 files (+1)
|
|
130
|
+
try {
|
|
131
|
+
const count = _countFiles(dir, 0, 60);
|
|
132
|
+
if (count > 50) score += 1;
|
|
133
|
+
} catch { /* ignore */ }
|
|
134
|
+
|
|
135
|
+
// >10 commits (+1)
|
|
136
|
+
if (has('.git')) {
|
|
137
|
+
try {
|
|
138
|
+
const { execSync } = require('child_process');
|
|
139
|
+
const out = execSync('git rev-list --count HEAD', { cwd: dir, timeout: 3000, stdio: ['pipe', 'pipe', 'pipe'] });
|
|
140
|
+
if (parseInt(out.toString().trim(), 10) > 10) score += 1;
|
|
141
|
+
} catch { /* ignore ā no git or shallow clone */ }
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// Branch protection (+1) ā check via GitHub API marker or CODEOWNERS
|
|
145
|
+
if (has('CODEOWNERS') || has('.github/CODEOWNERS')) score += 1;
|
|
146
|
+
|
|
147
|
+
return Math.min(score, 10);
|
|
148
|
+
}
|
|
81
149
|
|
|
150
|
+
/** Build actionable recommendations based on gaps. */
|
|
151
|
+
function _buildRecommendations(type, stack, maturity, dir) {
|
|
152
|
+
if (type === 'GREENFIELD') return ['Initialize project with SINAPSE scaffolding'];
|
|
153
|
+
const recs = [];
|
|
154
|
+
const has = (p) => fs.existsSync(path.join(dir, p));
|
|
155
|
+
|
|
156
|
+
if (stack.database === 'supabase') recs.push('Add RLS policies to Supabase tables');
|
|
157
|
+
if (!stack.testing) recs.push('Add a testing framework (Jest or Vitest recommended)');
|
|
158
|
+
if (!stack.ci) recs.push('Set up CI/CD with GitHub Actions');
|
|
159
|
+
if (!has('.env.example') && !has('.env.local.example')) recs.push('Create .env.example with placeholder values');
|
|
160
|
+
if (!has('README.md') && !has('readme.md')) recs.push('Add a README.md');
|
|
161
|
+
if (!has('docs')) recs.push('Create a docs/ directory for project documentation');
|
|
162
|
+
if (!has('CODEOWNERS') && !has('.github/CODEOWNERS')) recs.push('Set up CODEOWNERS for branch protection');
|
|
163
|
+
if (stack.language === 'javascript' && !has('tsconfig.json')) recs.push('Consider migrating to TypeScript');
|
|
164
|
+
|
|
165
|
+
return recs;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// āā Helpers āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
169
|
+
|
|
170
|
+
/** Read combined deps + devDeps from package.json as a Set. */
|
|
171
|
+
function _readDeps(dir) {
|
|
172
|
+
const pkgPath = path.join(dir, 'package.json');
|
|
173
|
+
if (!fs.existsSync(pkgPath)) return new Set();
|
|
174
|
+
try {
|
|
175
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
|
|
176
|
+
return new Set([...Object.keys(pkg.dependencies || {}), ...Object.keys(pkg.devDependencies || {})]);
|
|
177
|
+
} catch { return new Set(); }
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/** Check if a config file exists with common extensions. */
|
|
181
|
+
function _existsGlob(dir, baseName) {
|
|
182
|
+
return ['.js', '.ts', '.mjs', '.cjs', '.json', '.yaml', '.yml', ''].some(
|
|
183
|
+
(ext) => fs.existsSync(path.join(dir, `${baseName}${ext}`)),
|
|
184
|
+
);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/** Recursively count files up to a limit (early exit). */
|
|
188
|
+
function _countFiles(dir, current, limit) {
|
|
189
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
190
|
+
for (const entry of entries) {
|
|
191
|
+
if (entry.name.startsWith('.') || entry.name === 'node_modules') continue;
|
|
192
|
+
current += 1;
|
|
193
|
+
if (current > limit) return current;
|
|
194
|
+
if (entry.isDirectory()) current = _countFiles(path.join(dir, entry.name), current, limit);
|
|
195
|
+
if (current > limit) return current;
|
|
196
|
+
}
|
|
197
|
+
return current;
|
|
198
|
+
}
|
|
82
199
|
|
|
200
|
+
module.exports = { detectProjectType, detectProjectTypeExtended };
|
|
@@ -29,36 +29,48 @@ const SignatureLimits = {
|
|
|
29
29
|
};
|
|
30
30
|
|
|
31
31
|
/**
|
|
32
|
-
*
|
|
33
|
-
*
|
|
32
|
+
* Signature verification feature flag.
|
|
33
|
+
* Set to true AND provide SINAPSE_MANIFEST_PUBLIC_KEY env var (or replace
|
|
34
|
+
* the pinned key below) to enable manifest signature verification.
|
|
35
|
+
*/
|
|
36
|
+
const SIGNATURE_VERIFICATION_ENABLED = false;
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* PINNED PUBLIC KEY - Root of trust for manifest verification.
|
|
34
40
|
* Generated with: minisign -G -p sinapse-ai.pub -s sinapse-ai.key
|
|
35
41
|
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
42
|
+
* When SIGNATURE_VERIFICATION_ENABLED is true, the public key MUST be set.
|
|
43
|
+
* It can be provided via:
|
|
44
|
+
* 1. SINAPSE_MANIFEST_PUBLIC_KEY environment variable (base64-encoded Ed25519)
|
|
45
|
+
* 2. Hardcoded below (replace null with the actual key)
|
|
46
|
+
*
|
|
47
|
+
* Format: base64-encoded Ed25519 public key (32 bytes)
|
|
38
48
|
*/
|
|
39
49
|
const PINNED_PUBLIC_KEY = {
|
|
40
50
|
// Key ID (8 bytes, base64 encoded) - opaque identifier, not UTF-8 text
|
|
41
51
|
// This is compared as raw bytes against the signature's key ID
|
|
42
52
|
keyId: Buffer.from('SINAPSE0001').toString('base64'), // 'QUlPUzAwMDE='
|
|
43
53
|
// Ed25519 public key (32 bytes, base64 encoded)
|
|
44
|
-
//
|
|
45
|
-
publicKey:
|
|
54
|
+
// Set via env var SINAPSE_MANIFEST_PUBLIC_KEY or hardcode here when production key is generated
|
|
55
|
+
publicKey: process.env.SINAPSE_MANIFEST_PUBLIC_KEY || null,
|
|
46
56
|
// Algorithm identifier
|
|
47
57
|
algorithm: 'Ed25519',
|
|
48
58
|
};
|
|
49
59
|
|
|
50
60
|
/**
|
|
51
|
-
*
|
|
52
|
-
* @
|
|
61
|
+
* Check if signature verification is properly configured
|
|
62
|
+
* @returns {boolean} True if verification is enabled and a key is set
|
|
53
63
|
*/
|
|
54
|
-
|
|
64
|
+
function isVerificationConfigured() {
|
|
65
|
+
return SIGNATURE_VERIFICATION_ENABLED && PINNED_PUBLIC_KEY.publicKey != null;
|
|
66
|
+
}
|
|
55
67
|
|
|
56
68
|
/**
|
|
57
|
-
* Check if the pinned public key is still the placeholder
|
|
58
|
-
* @returns {boolean} True if key
|
|
69
|
+
* Check if the pinned public key is still the placeholder (legacy compat)
|
|
70
|
+
* @returns {boolean} True if key is not configured
|
|
59
71
|
*/
|
|
60
72
|
function isPlaceholderKey() {
|
|
61
|
-
return PINNED_PUBLIC_KEY.publicKey
|
|
73
|
+
return !PINNED_PUBLIC_KEY.publicKey;
|
|
62
74
|
}
|
|
63
75
|
|
|
64
76
|
/**
|
|
@@ -185,12 +197,13 @@ function verifyManifestSignature(manifestContent, signatureContent, options = {}
|
|
|
185
197
|
};
|
|
186
198
|
|
|
187
199
|
try {
|
|
188
|
-
// SECURITY: Check
|
|
200
|
+
// SECURITY: Check if verification is properly configured
|
|
189
201
|
const pubKey = options.publicKey || PINNED_PUBLIC_KEY;
|
|
190
|
-
if (!options.publicKey &&
|
|
191
|
-
result.error =
|
|
192
|
-
|
|
193
|
-
|
|
202
|
+
if (!options.publicKey && !isVerificationConfigured()) {
|
|
203
|
+
result.error = 'Signature verification not configured: ' +
|
|
204
|
+
(SIGNATURE_VERIFICATION_ENABLED
|
|
205
|
+
? 'Set SINAPSE_MANIFEST_PUBLIC_KEY env var or hardcode the Ed25519 public key.'
|
|
206
|
+
: 'SIGNATURE_VERIFICATION_ENABLED is false. Enable when production key is ready.');
|
|
194
207
|
return result;
|
|
195
208
|
}
|
|
196
209
|
|
|
@@ -372,8 +385,10 @@ module.exports = {
|
|
|
372
385
|
signatureExists,
|
|
373
386
|
loadAndVerifyManifest,
|
|
374
387
|
isPlaceholderKey,
|
|
388
|
+
isVerificationConfigured,
|
|
375
389
|
parseMinisignSignature,
|
|
376
390
|
PINNED_PUBLIC_KEY,
|
|
391
|
+
SIGNATURE_VERIFICATION_ENABLED,
|
|
377
392
|
SignatureLimits,
|
|
378
393
|
};
|
|
379
394
|
|
|
@@ -33,6 +33,12 @@ const TRANSLATIONS = {
|
|
|
33
33
|
greenfieldDesc: 'new project from scratch',
|
|
34
34
|
brownfield: 'Brownfield',
|
|
35
35
|
brownfieldDesc: 'existing project',
|
|
36
|
+
detectedProjectType: 'Detected: {type} project',
|
|
37
|
+
detectedProjectTypeWithStack: 'Detected: {type} project ({stack})',
|
|
38
|
+
detectedUpgrade: 'Detected: Existing SINAPSE project (upgrade)',
|
|
39
|
+
infraApplied: 'Infrastructure templates applied',
|
|
40
|
+
infraSkipped: 'Infrastructure templates skipped',
|
|
41
|
+
agentsMdCreated: 'AGENTS.md created',
|
|
36
42
|
|
|
37
43
|
// IDE selection
|
|
38
44
|
ideQuestion: 'Select IDE(s):',
|
|
@@ -210,6 +216,12 @@ const TRANSLATIONS = {
|
|
|
210
216
|
greenfieldDesc: 'projeto novo do zero',
|
|
211
217
|
brownfield: 'Brownfield',
|
|
212
218
|
brownfieldDesc: 'projeto existente',
|
|
219
|
+
detectedProjectType: 'Detectado: projeto {type}',
|
|
220
|
+
detectedProjectTypeWithStack: 'Detectado: projeto {type} ({stack})',
|
|
221
|
+
detectedUpgrade: 'Detectado: projeto SINAPSE existente (upgrade)',
|
|
222
|
+
infraApplied: 'Templates de infraestrutura aplicados',
|
|
223
|
+
infraSkipped: 'Templates de infraestrutura ignorados',
|
|
224
|
+
agentsMdCreated: 'AGENTS.md criado',
|
|
213
225
|
|
|
214
226
|
// IDE selection
|
|
215
227
|
ideQuestion: 'Selecione IDE(s):',
|
|
@@ -10,7 +10,6 @@
|
|
|
10
10
|
const fs = require('fs-extra');
|
|
11
11
|
const path = require('path');
|
|
12
12
|
const yaml = require('js-yaml');
|
|
13
|
-
const inquirer = require('inquirer');
|
|
14
13
|
const ora = require('ora');
|
|
15
14
|
const { spawnSync } = require('child_process');
|
|
16
15
|
const { getIDEConfig } = require('../config/ide-configs');
|
|
@@ -80,46 +79,16 @@ async function backupFile(filePath) {
|
|
|
80
79
|
* @param {boolean} options.noMerge - If true, don't offer merge option
|
|
81
80
|
* @returns {Promise<string>} Action: 'merge', 'overwrite', 'skip', or 'backup'
|
|
82
81
|
*/
|
|
83
|
-
async function promptFileExists(filePath,
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
//
|
|
89
|
-
if (
|
|
82
|
+
async function promptFileExists(filePath, _options = {}) {
|
|
83
|
+
// Story 10.38: Merge-only policy. Users who are not developers must never
|
|
84
|
+
// be able to destroy their own config by choosing "overwrite" in a prompt.
|
|
85
|
+
// If the file has a registered merge strategy, merge unconditionally.
|
|
86
|
+
// Otherwise, fall back to a timestamped backup + overwrite (never plain
|
|
87
|
+
// overwrite, never skip, never prompt).
|
|
88
|
+
if (hasMergeStrategy(filePath)) {
|
|
90
89
|
return 'merge';
|
|
91
90
|
}
|
|
92
|
-
|
|
93
|
-
// Build choices based on available options
|
|
94
|
-
const choices = [];
|
|
95
|
-
|
|
96
|
-
if (canMerge) {
|
|
97
|
-
choices.push({
|
|
98
|
-
name: 'Merge (complement existing)',
|
|
99
|
-
value: 'merge',
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
choices.push(
|
|
104
|
-
{ name: 'Overwrite completely', value: 'overwrite' },
|
|
105
|
-
{ name: 'Create backup and overwrite', value: 'backup' },
|
|
106
|
-
{ name: 'Skip', value: 'skip' },
|
|
107
|
-
);
|
|
108
|
-
|
|
109
|
-
// Default to merge for brownfield if available, otherwise backup
|
|
110
|
-
const defaultChoice = isBrownfield && canMerge ? 'merge' : 'backup';
|
|
111
|
-
|
|
112
|
-
const { action } = await inquirer.prompt([
|
|
113
|
-
{
|
|
114
|
-
type: 'list',
|
|
115
|
-
name: 'action',
|
|
116
|
-
message: `File ${path.basename(filePath)} already exists. What would you like to do?`,
|
|
117
|
-
choices,
|
|
118
|
-
default: defaultChoice,
|
|
119
|
-
},
|
|
120
|
-
]);
|
|
121
|
-
|
|
122
|
-
return action;
|
|
91
|
+
return 'backup';
|
|
123
92
|
}
|
|
124
93
|
|
|
125
94
|
/**
|
|
@@ -21,8 +21,9 @@ const {
|
|
|
21
21
|
getIDEQuestions,
|
|
22
22
|
getTechPresetQuestion,
|
|
23
23
|
} = require('./questions');
|
|
24
|
-
const { setLanguage, t } = require('./i18n');
|
|
24
|
+
const { setLanguage, t, tf } = require('./i18n');
|
|
25
25
|
const yaml = require('js-yaml');
|
|
26
|
+
const { detectProjectTypeExtended } = require('../detection/detect-project-type');
|
|
26
27
|
const { showWelcome, showCompletion, showCancellation } = require('./feedback');
|
|
27
28
|
const { generateIDEConfigs, showSuccessSummary, copySkillFiles, copyExtraCommandFiles } = require('./ide-config-generator');
|
|
28
29
|
const {
|
|
@@ -121,6 +122,19 @@ async function writeClaudeSettings(language, projectDir = process.cwd()) {
|
|
|
121
122
|
}
|
|
122
123
|
}
|
|
123
124
|
|
|
125
|
+
/** Detect system locale and return wizard language code. */
|
|
126
|
+
function detectSystemLocale() {
|
|
127
|
+
try {
|
|
128
|
+
const locale = Intl.DateTimeFormat().resolvedOptions().locale || '';
|
|
129
|
+
if (locale.startsWith('pt')) return 'pt';
|
|
130
|
+
if (locale.startsWith('en')) return 'en';
|
|
131
|
+
} catch (_e) { /* Intl not available */ }
|
|
132
|
+
const envLocale = process.env.LANG || process.env.LC_ALL || process.env.LC_MESSAGES || '';
|
|
133
|
+
if (envLocale.startsWith('pt')) return 'pt';
|
|
134
|
+
if (envLocale.startsWith('en')) return 'en';
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
|
|
124
138
|
/**
|
|
125
139
|
* Get existing language from Claude Code settings.json (Story ACT-12 - Idempotency)
|
|
126
140
|
* Returns the existing language code if found, null otherwise.
|
|
@@ -201,20 +215,32 @@ function setupCancellationHandler() {
|
|
|
201
215
|
sigintHandlerAdded = true;
|
|
202
216
|
}
|
|
203
217
|
|
|
204
|
-
/**
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
218
|
+
/** Rich project type detection with tech stack info. */
|
|
219
|
+
function detectProjectTypeFull(cwd = process.cwd()) {
|
|
220
|
+
try {
|
|
221
|
+
const extended = detectProjectTypeExtended(cwd);
|
|
222
|
+
const typeMap = { EXISTING_SINAPSE: 'upgrade', BROWNFIELD: 'brownfield', GREENFIELD: 'greenfield', UNKNOWN: 'greenfield' };
|
|
223
|
+
const type = typeMap[extended.type] || 'greenfield';
|
|
224
|
+
let label = '';
|
|
225
|
+
if (extended.techStack) {
|
|
226
|
+
const parts = [];
|
|
227
|
+
if (extended.techStack.framework) parts.push(extended.techStack.framework.charAt(0).toUpperCase() + extended.techStack.framework.slice(1));
|
|
228
|
+
if (extended.techStack.language === 'typescript') parts.push('TypeScript');
|
|
229
|
+
if (extended.techStack.database) parts.push(extended.techStack.database.charAt(0).toUpperCase() + extended.techStack.database.slice(1));
|
|
230
|
+
if (extended.techStack.testing) parts.push(extended.techStack.testing);
|
|
231
|
+
label = parts.join(' + ');
|
|
232
|
+
}
|
|
233
|
+
return { type, techStack: extended.techStack, label };
|
|
234
|
+
} catch (_err) {
|
|
235
|
+
if (fse.existsSync(path.join(cwd, '.sinapse-ai'))) return { type: 'upgrade', techStack: null, label: '' };
|
|
236
|
+
if (fse.existsSync(path.join(cwd, 'package.json'))) return { type: 'brownfield', techStack: null, label: '' };
|
|
237
|
+
return { type: 'greenfield', techStack: null, label: '' };
|
|
216
238
|
}
|
|
217
|
-
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/** Simple project type string (backward compat). */
|
|
242
|
+
function detectProjectType(cwd = process.cwd()) {
|
|
243
|
+
return detectProjectTypeFull(cwd).type;
|
|
218
244
|
}
|
|
219
245
|
|
|
220
246
|
/**
|
|
@@ -400,6 +426,45 @@ async function installGlobalAgents() {
|
|
|
400
426
|
* const answers = await runWizard();
|
|
401
427
|
* console.log(answers.projectType); // 'greenfield', 'brownfield', or 'upgrade'
|
|
402
428
|
*/
|
|
429
|
+
|
|
430
|
+
/** Generate AGENTS.md at project root. */
|
|
431
|
+
async function generateAgentsMd(targetDir = process.cwd()) {
|
|
432
|
+
const agentsPath = path.join(targetDir, 'AGENTS.md');
|
|
433
|
+
if (await fse.pathExists(agentsPath)) return false;
|
|
434
|
+
const lines = [
|
|
435
|
+
'# AGENTS.md', '', 'Universal agent reference for AI-powered development tools.', '',
|
|
436
|
+
'## Available Agents', '', '| Agent | Persona | Scope |', '|-------|---------|-------|',
|
|
437
|
+
'| `@developer` | Pixel | Code implementation |',
|
|
438
|
+
'| `@quality-gate` | Litmus | Testing and quality |',
|
|
439
|
+
'| `@architect` | Stratum | Architecture and technical design |',
|
|
440
|
+
'| `@project-lead` | Beacon | Product Management |',
|
|
441
|
+
'| `@product-lead` | Axis | Product Owner, stories/epics |',
|
|
442
|
+
'| `@sprint-lead` | Sync | Scrum Master |',
|
|
443
|
+
'| `@analyst` | Scope | Research and analysis |',
|
|
444
|
+
'| `@data-engineer` | Tensor | Database design |',
|
|
445
|
+
'| `@ux-design-expert` | Mosaic | UX/UI design |',
|
|
446
|
+
'| `@devops` | Pipeline | CI/CD, deployment |', '',
|
|
447
|
+
'## Commands', '', 'Use prefix `*` for agent commands:',
|
|
448
|
+
'- `*help` - Show available commands',
|
|
449
|
+
'- `*create-story` - Create a development story', '',
|
|
450
|
+
'---', '*Generated by SINAPSE AI*', '',
|
|
451
|
+
];
|
|
452
|
+
try { await fse.writeFile(agentsPath, lines.join('\n'), 'utf8'); return true; } catch (_e) { return false; }
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
/** Apply project infrastructure templates (never overwrites existing). */
|
|
456
|
+
function applyInfraTemplates(targetDir = process.cwd()) {
|
|
457
|
+
try {
|
|
458
|
+
const infraScript = path.join(__dirname, '..', '..', '..', '..', '.sinapse-ai', 'infrastructure', 'scripts', 'setup-project-infra.js');
|
|
459
|
+
if (!fse.existsSync(infraScript)) return { success: false, error: 'script not found' };
|
|
460
|
+
const { run } = require(infraScript);
|
|
461
|
+
run(targetDir);
|
|
462
|
+
return { success: true };
|
|
463
|
+
} catch (error) {
|
|
464
|
+
return { success: false, error: error.message };
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
|
|
403
468
|
async function runWizard(options = {}) {
|
|
404
469
|
try {
|
|
405
470
|
// Setup graceful cancellation
|
|
@@ -455,6 +520,14 @@ async function runWizard(options = {}) {
|
|
|
455
520
|
};
|
|
456
521
|
}
|
|
457
522
|
|
|
523
|
+
// Display auto-detected project type (informational)
|
|
524
|
+
if (detectedProjectType === 'upgrade') {
|
|
525
|
+
console.log(`\n${colors.primary(t('detectedUpgrade'))}`);
|
|
526
|
+
} else {
|
|
527
|
+
const typeLabel = detectedProjectType.charAt(0).toUpperCase() + detectedProjectType.slice(1);
|
|
528
|
+
console.log(`\n${colors.primary(t('detectedProjectType').replace('{type}', typeLabel))}`);
|
|
529
|
+
}
|
|
530
|
+
|
|
458
531
|
// Story 1.4: Install SINAPSE core framework (agents, tasks, workflows, templates)
|
|
459
532
|
console.log('\nš¦ Installing SINAPSE core framework...');
|
|
460
533
|
let sinapseCoreResult = null;
|
|
@@ -1126,6 +1199,34 @@ async function runWizard(options = {}) {
|
|
|
1126
1199
|
}
|
|
1127
1200
|
}
|
|
1128
1201
|
|
|
1202
|
+
// Generate AGENTS.md at project root (universal format for Claude Code + Codex)
|
|
1203
|
+
try {
|
|
1204
|
+
const agentsCreated = await generateAgentsMd(process.cwd());
|
|
1205
|
+
if (agentsCreated) {
|
|
1206
|
+
console.log(`\nā
${t('agentsMdCreated')}`);
|
|
1207
|
+
}
|
|
1208
|
+
answers.agentsMdCreated = agentsCreated;
|
|
1209
|
+
} catch (_agentsErr) {
|
|
1210
|
+
answers.agentsMdCreated = false;
|
|
1211
|
+
}
|
|
1212
|
+
|
|
1213
|
+
// Create docs/stories/ directory for story-driven development
|
|
1214
|
+
const storiesDir = path.join(process.cwd(), 'docs', 'stories');
|
|
1215
|
+
if (!await fse.pathExists(storiesDir)) {
|
|
1216
|
+
await fse.ensureDir(storiesDir);
|
|
1217
|
+
}
|
|
1218
|
+
|
|
1219
|
+
// Apply infrastructure templates (PR template, issue templates, CI, CODEOWNERS)
|
|
1220
|
+
try {
|
|
1221
|
+
const infraResult = applyInfraTemplates(process.cwd());
|
|
1222
|
+
if (infraResult.success) {
|
|
1223
|
+
console.log(`ā
${t('infraApplied')}`);
|
|
1224
|
+
}
|
|
1225
|
+
answers.infraApplied = infraResult.success;
|
|
1226
|
+
} catch (_infraErr) {
|
|
1227
|
+
answers.infraApplied = false;
|
|
1228
|
+
}
|
|
1229
|
+
|
|
1129
1230
|
// Show completion with LLM label
|
|
1130
1231
|
showCompletion({ llmLabel: llmLabel(answers.selectedLLM), llmValue: answers.selectedLLM });
|
|
1131
1232
|
|
|
@@ -1171,11 +1272,15 @@ module.exports = {
|
|
|
1171
1272
|
getExistingLanguage,
|
|
1172
1273
|
LANGUAGE_MAP,
|
|
1173
1274
|
detectProjectType,
|
|
1275
|
+
detectProjectTypeFull,
|
|
1174
1276
|
detectTechPreset,
|
|
1277
|
+
detectSystemLocale,
|
|
1175
1278
|
llmToIDEs,
|
|
1176
1279
|
llmLabel,
|
|
1177
1280
|
installGlobalAgents,
|
|
1178
1281
|
buildAgentTemplate,
|
|
1282
|
+
generateAgentsMd,
|
|
1283
|
+
applyInfraTemplates,
|
|
1179
1284
|
GLOBAL_AGENTS,
|
|
1180
1285
|
},
|
|
1181
1286
|
};
|
|
@@ -82,7 +82,7 @@ function getLLMQuestion() {
|
|
|
82
82
|
|
|
83
83
|
/**
|
|
84
84
|
* Get project type question (Story 1.3)
|
|
85
|
-
*
|
|
85
|
+
* @deprecated Project type is now auto-detected. Kept for backward compat.
|
|
86
86
|
*
|
|
87
87
|
* @returns {Object} Inquirer question object
|
|
88
88
|
*/
|
|
@@ -317,8 +317,7 @@ function buildQuestionSequence(_context = {}) {
|
|
|
317
317
|
// Language selection (first question)
|
|
318
318
|
questions.push(getLanguageQuestion());
|
|
319
319
|
|
|
320
|
-
// Story 1.2:
|
|
321
|
-
questions.push(getProjectTypeQuestion());
|
|
320
|
+
// Story 1.2: Project type is auto-detected (question removed from flow)
|
|
322
321
|
|
|
323
322
|
// Story 1.4: IDE Selection
|
|
324
323
|
questions.push(...getIDEQuestions());
|