exonous 0.0.0-stage → 2.10.4
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/README.md +100 -2
- package/assets/THIRD-PARTY-NOTICES.md +29 -0
- package/assets/adapters/opencode/exonous.js +54 -0
- package/assets/agents/exo-backend.md +22 -0
- package/assets/agents/exo-cto.md +22 -0
- package/assets/agents/exo-data-ai.md +22 -0
- package/assets/agents/exo-designer.md +22 -0
- package/assets/agents/exo-devops.md +22 -0
- package/assets/agents/exo-frontend.md +22 -0
- package/assets/agents/exo-infra.md +22 -0
- package/assets/agents/exo-mobile.md +22 -0
- package/assets/agents/exo-pm.md +22 -0
- package/assets/agents/exo-qa.md +22 -0
- package/assets/agents/exo-researcher.md +22 -0
- package/assets/agents/exo-security.md +22 -0
- package/assets/agents/roster.json +209 -0
- package/assets/agents/taxis.js +189 -0
- package/assets/editors/cursor/frontend-skills.mdc +27 -0
- package/assets/editors/hooks/cursor/hooks.json +11 -0
- package/assets/machine/PR-TEMPLATE.md +21 -0
- package/assets/machine/hooks/anamnesis.cjs +61 -0
- package/assets/machine/hooks/ethos.cjs +48 -0
- package/assets/machine/hooks/kairos.cjs +46 -0
- package/assets/machine/hooks/lib/cli-options.cjs +133 -0
- package/assets/machine/hooks/lib/memory.cjs +488 -0
- package/assets/machine/hooks/lib/metron.cjs +52 -0
- package/assets/machine/hooks/lib/paths.cjs +99 -0
- package/assets/machine/hooks/lib/payload.cjs +81 -0
- package/assets/machine/hooks/lib/pr-template-validate.cjs +103 -0
- package/assets/machine/hooks/lib/release.cjs +58 -0
- package/assets/machine/hooks/lib/repo.cjs +138 -0
- package/assets/machine/hooks/lib/sanitize.cjs +37 -0
- package/assets/machine/hooks/lib/selfupdate.cjs +354 -0
- package/assets/machine/hooks/lib/shell.cjs +722 -0
- package/assets/machine/hooks/lib/template.cjs +70 -0
- package/assets/machine/hooks/lib/token.cjs +110 -0
- package/assets/machine/hooks/lib/validate-pr-body.cjs +21 -0
- package/assets/machine/hooks/pyle.cjs +302 -0
- package/assets/rules/nomos.md +59 -0
- package/assets/rules/praxis.md +38 -0
- package/assets/skills/code-review/SKILL.md +124 -0
- package/assets/skills/commit-changes/SKILL.md +49 -0
- package/assets/skills/deliver/SKILL.md +114 -0
- package/assets/skills/deliver/references/parallel.md +37 -0
- package/assets/skills/doc/SKILL.md +140 -0
- package/assets/skills/doc/doc.mjs +277 -0
- package/assets/skills/issue-board/SKILL.md +84 -0
- package/assets/skills/issue-board/board.mjs +389 -0
- package/assets/skills/issue-board/config.example.json +9 -0
- package/assets/skills/issue-board/render.py +189 -0
- package/assets/skills/make-pr/SKILL.md +24 -0
- package/assets/skills/native-ui/SKILL.md +67 -0
- package/assets/skills/native-ui/reference/apple.md +180 -0
- package/assets/skills/native-ui/reference/mobile-feel.md +221 -0
- package/assets/skills/native-ui/reference/swift.md +289 -0
- package/assets/skills/project-memory/SKILL.md +59 -0
- package/assets/skills/project-memory/config.example.json +4 -0
- package/assets/skills/project-memory/project-memory.mjs +478 -0
- package/assets/skills/security-review/SKILL.md +102 -0
- package/assets/skills/session-handoff/SKILL.md +23 -0
- package/assets/skills/session-handoff/config.example.json +3 -0
- package/assets/skills/ui-design/SKILL.md +75 -0
- package/assets/skills/ui-design/reference/adapt.md +151 -0
- package/assets/skills/ui-design/reference/adapt.native.md +35 -0
- package/assets/skills/ui-design/reference/android.md +50 -0
- package/assets/skills/ui-design/reference/animate.md +87 -0
- package/assets/skills/ui-design/reference/audit.md +76 -0
- package/assets/skills/ui-design/reference/audit.native.md +126 -0
- package/assets/skills/ui-design/reference/bolder.md +33 -0
- package/assets/skills/ui-design/reference/clarify.md +84 -0
- package/assets/skills/ui-design/reference/colorize.md +86 -0
- package/assets/skills/ui-design/reference/craft-floor.md +25 -0
- package/assets/skills/ui-design/reference/critique.md +345 -0
- package/assets/skills/ui-design/reference/degraded/asset-producer.md +35 -0
- package/assets/skills/ui-design/reference/degraded/documenter.md +23 -0
- package/assets/skills/ui-design/reference/degraded/finish-reviewer.md +43 -0
- package/assets/skills/ui-design/reference/degraded/manual-edit-applier.md +56 -0
- package/assets/skills/ui-design/reference/delight.md +63 -0
- package/assets/skills/ui-design/reference/distill.md +98 -0
- package/assets/skills/ui-design/reference/doctor.md +49 -0
- package/assets/skills/ui-design/reference/document.md +273 -0
- package/assets/skills/ui-design/reference/extract.md +52 -0
- package/assets/skills/ui-design/reference/harden.md +122 -0
- package/assets/skills/ui-design/reference/hooks.md +114 -0
- package/assets/skills/ui-design/reference/init.md +47 -0
- package/assets/skills/ui-design/reference/ios.md +55 -0
- package/assets/skills/ui-design/reference/layout.md +81 -0
- package/assets/skills/ui-design/reference/live-setup.md +75 -0
- package/assets/skills/ui-design/reference/live.md +326 -0
- package/assets/skills/ui-design/reference/new-work.md +350 -0
- package/assets/skills/ui-design/reference/onboard.md +85 -0
- package/assets/skills/ui-design/reference/operate.md +29 -0
- package/assets/skills/ui-design/reference/optimize.md +101 -0
- package/assets/skills/ui-design/reference/overdrive.md +83 -0
- package/assets/skills/ui-design/reference/polish.md +77 -0
- package/assets/skills/ui-design/reference/quieter.md +95 -0
- package/assets/skills/ui-design/reference/routing.md +37 -0
- package/assets/skills/ui-design/reference/shape.md +43 -0
- package/assets/skills/ui-design/reference/styles/brutalist.md +45 -0
- package/assets/skills/ui-design/reference/styles/design-md.md +70 -0
- package/assets/skills/ui-design/reference/styles/direction.md +95 -0
- package/assets/skills/ui-design/reference/styles/full-output.md +42 -0
- package/assets/skills/ui-design/reference/styles/minimalist.md +64 -0
- package/assets/skills/ui-design/reference/styles/premium.md +65 -0
- package/assets/skills/ui-design/reference/styles/redesign.md +59 -0
- package/assets/skills/ui-design/reference/typeset.md +73 -0
- package/assets/skills/ui-design/reference/visualize.md +156 -0
- package/assets/skills/ui-design/scripts/ENGINE-LICENSE +191 -0
- package/assets/skills/ui-design/scripts/VERSION +1 -0
- package/assets/skills/ui-design/scripts/bin/darwin-arm64/impeccable +0 -0
- package/assets/skills/ui-design/scripts/command-metadata.json +94 -0
- package/assets/skills/ui-design/scripts/data/font-index-failures.json +121 -0
- package/assets/skills/ui-design/scripts/data/font-index.json +1 -0
- package/assets/skills/ui-design/scripts/impeccable +206 -0
- package/assets/skills/ui-design/scripts/impeccable.cmd +214 -0
- package/assets/skills/ui-design/scripts/live-browser-dom.js +167 -0
- package/assets/skills/ui-design/scripts/live-browser-ignores.js +242 -0
- package/assets/skills/ui-design/scripts/live-browser-session.js +144 -0
- package/assets/skills/ui-design/scripts/live-browser.js +12990 -0
- package/assets/skills/ui-design/scripts/modern-screenshot.umd.js +14 -0
- package/assets/skills/ui-design/scripts/ui-design +6 -0
- package/assets/skills/ui-design/scripts/ui-design.cmd +3 -0
- package/assets/skills/ui-design/scripts/ui-design.mjs +124 -0
- package/assets/skills/ui-mockup/SKILL.md +68 -0
- package/assets/skills/ui-mockup/reference/brandkit.md +101 -0
- package/assets/skills/ui-mockup/reference/image-to-code.md +83 -0
- package/assets/skills/ui-mockup/reference/mobile-comps.md +94 -0
- package/assets/skills/ui-mockup/reference/web-comps.md +83 -0
- package/assets/skills/ui-motion/SKILL.md +112 -0
- package/assets/skills/ui-motion/reference/expo.md +224 -0
- package/assets/skills/ui-motion/reference/opportunities.md +81 -0
- package/assets/skills/ui-motion/reference/prototype.md +238 -0
- package/assets/skills/ui-motion/reference/review.md +163 -0
- package/assets/skills/ui-motion/reference/toasts.md +144 -0
- package/assets/skills/ui-motion/reference/ui-libraries.md +71 -0
- package/assets/skills/ui-motion/reference/vocabulary.md +130 -0
- package/assets/skills/ui-motion/reference/web.md +294 -0
- package/assets/skills/ui-patterns/SKILL.md +105 -0
- package/assets/skills/ui-patterns/references/stacks/html-tailwind.md +40 -0
- package/assets/skills/ui-patterns/references/stacks/nextjs.md +52 -0
- package/assets/skills/ui-patterns/references/stacks/nuxt.md +100 -0
- package/assets/skills/ui-patterns/references/stacks/react-native.md +48 -0
- package/assets/skills/ui-patterns/references/stacks/react.md +49 -0
- package/assets/skills/ui-patterns/references/stacks/shadcn.md +57 -0
- package/assets/skills/ui-patterns/references/stacks/vue.md +37 -0
- package/assets/techne/.claude-plugin/marketplace.json +31 -0
- package/assets/techne/.claude-plugin/plugin.json +24 -0
- package/assets/techne/.mcp.json +8 -0
- package/assets/techne/commands/build-fix.md +48 -0
- package/assets/techne/commands/refactor-clean.md +46 -0
- package/assets/techne/commands/test-coverage.md +42 -0
- package/assets/techne/hooks/hooks.json +49 -0
- package/assets/techne/rules/angular/coding-style.md +49 -0
- package/assets/techne/rules/angular/hooks.md +23 -0
- package/assets/techne/rules/angular/patterns.md +48 -0
- package/assets/techne/rules/angular/security.md +26 -0
- package/assets/techne/rules/angular/testing.md +46 -0
- package/assets/techne/rules/arkts/coding-style.md +63 -0
- package/assets/techne/rules/arkts/hooks.md +38 -0
- package/assets/techne/rules/arkts/patterns.md +42 -0
- package/assets/techne/rules/arkts/security.md +35 -0
- package/assets/techne/rules/arkts/testing.md +39 -0
- package/assets/techne/rules/common/agents.md +6 -0
- package/assets/techne/rules/common/code-review.md +15 -0
- package/assets/techne/rules/common/coding-style.md +13 -0
- package/assets/techne/rules/common/development-workflow.md +5 -0
- package/assets/techne/rules/common/git-workflow.md +30 -0
- package/assets/techne/rules/common/hooks.md +7 -0
- package/assets/techne/rules/common/patterns.md +3 -0
- package/assets/techne/rules/common/performance.md +3 -0
- package/assets/techne/rules/common/security.md +5 -0
- package/assets/techne/rules/common/testing.md +3 -0
- package/assets/techne/rules/cpp/coding-style.md +31 -0
- package/assets/techne/rules/cpp/hooks.md +26 -0
- package/assets/techne/rules/cpp/patterns.md +31 -0
- package/assets/techne/rules/cpp/security.md +37 -0
- package/assets/techne/rules/cpp/testing.md +31 -0
- package/assets/techne/rules/csharp/coding-style.md +30 -0
- package/assets/techne/rules/csharp/hooks.md +24 -0
- package/assets/techne/rules/csharp/patterns.md +28 -0
- package/assets/techne/rules/csharp/security.md +32 -0
- package/assets/techne/rules/csharp/testing.md +27 -0
- package/assets/techne/rules/dart/coding-style.md +47 -0
- package/assets/techne/rules/dart/hooks.md +26 -0
- package/assets/techne/rules/dart/patterns.md +38 -0
- package/assets/techne/rules/dart/security.md +44 -0
- package/assets/techne/rules/dart/testing.md +39 -0
- package/assets/techne/rules/fsharp/coding-style.md +34 -0
- package/assets/techne/rules/fsharp/hooks.md +25 -0
- package/assets/techne/rules/fsharp/patterns.md +43 -0
- package/assets/techne/rules/fsharp/security.md +32 -0
- package/assets/techne/rules/fsharp/testing.md +27 -0
- package/assets/techne/rules/golang/coding-style.md +30 -0
- package/assets/techne/rules/golang/hooks.md +17 -0
- package/assets/techne/rules/golang/patterns.md +43 -0
- package/assets/techne/rules/golang/security.md +33 -0
- package/assets/techne/rules/golang/testing.md +20 -0
- package/assets/techne/rules/java/coding-style.md +51 -0
- package/assets/techne/rules/java/hooks.md +18 -0
- package/assets/techne/rules/java/patterns.md +55 -0
- package/assets/techne/rules/java/security.md +33 -0
- package/assets/techne/rules/java/testing.md +33 -0
- package/assets/techne/rules/kotlin/coding-style.md +50 -0
- package/assets/techne/rules/kotlin/hooks.md +17 -0
- package/assets/techne/rules/kotlin/patterns.md +44 -0
- package/assets/techne/rules/kotlin/security.md +34 -0
- package/assets/techne/rules/kotlin/testing.md +38 -0
- package/assets/techne/rules/nuxt/coding-style.md +20 -0
- package/assets/techne/rules/nuxt/hooks.md +16 -0
- package/assets/techne/rules/nuxt/patterns.md +46 -0
- package/assets/techne/rules/nuxt/security.md +19 -0
- package/assets/techne/rules/nuxt/testing.md +15 -0
- package/assets/techne/rules/perl/coding-style.md +33 -0
- package/assets/techne/rules/perl/hooks.md +22 -0
- package/assets/techne/rules/perl/patterns.md +43 -0
- package/assets/techne/rules/perl/security.md +39 -0
- package/assets/techne/rules/perl/testing.md +42 -0
- package/assets/techne/rules/php/coding-style.md +30 -0
- package/assets/techne/rules/php/hooks.md +24 -0
- package/assets/techne/rules/php/patterns.md +26 -0
- package/assets/techne/rules/php/security.md +27 -0
- package/assets/techne/rules/php/testing.md +28 -0
- package/assets/techne/rules/python/coding-style.md +38 -0
- package/assets/techne/rules/python/fastapi.md +57 -0
- package/assets/techne/rules/python/hooks.md +19 -0
- package/assets/techne/rules/python/patterns.md +37 -0
- package/assets/techne/rules/python/security.md +26 -0
- package/assets/techne/rules/python/testing.md +32 -0
- package/assets/techne/rules/react/coding-style.md +24 -0
- package/assets/techne/rules/react/hooks.md +62 -0
- package/assets/techne/rules/react/patterns.md +48 -0
- package/assets/techne/rules/react/security.md +45 -0
- package/assets/techne/rules/react/testing.md +42 -0
- package/assets/techne/rules/react-native/accessibility.md +14 -0
- package/assets/techne/rules/react-native/coding-style.md +16 -0
- package/assets/techne/rules/react-native/hooks.md +16 -0
- package/assets/techne/rules/react-native/patterns.md +18 -0
- package/assets/techne/rules/react-native/performance.md +14 -0
- package/assets/techne/rules/react-native/production-readiness.md +16 -0
- package/assets/techne/rules/react-native/security.md +16 -0
- package/assets/techne/rules/react-native/testing.md +14 -0
- package/assets/techne/rules/ruby/coding-style.md +40 -0
- package/assets/techne/rules/ruby/hooks.md +33 -0
- package/assets/techne/rules/ruby/patterns.md +33 -0
- package/assets/techne/rules/ruby/security.md +39 -0
- package/assets/techne/rules/ruby/testing.md +35 -0
- package/assets/techne/rules/rust/coding-style.md +41 -0
- package/assets/techne/rules/rust/hooks.md +16 -0
- package/assets/techne/rules/rust/patterns.md +42 -0
- package/assets/techne/rules/rust/security.md +33 -0
- package/assets/techne/rules/rust/testing.md +30 -0
- package/assets/techne/rules/swift/coding-style.md +30 -0
- package/assets/techne/rules/swift/hooks.md +20 -0
- package/assets/techne/rules/swift/patterns.md +30 -0
- package/assets/techne/rules/swift/security.md +22 -0
- package/assets/techne/rules/swift/testing.md +28 -0
- package/assets/techne/rules/typescript/coding-style.md +38 -0
- package/assets/techne/rules/typescript/hooks.md +14 -0
- package/assets/techne/rules/typescript/patterns.md +12 -0
- package/assets/techne/rules/typescript/security.md +14 -0
- package/assets/techne/rules/typescript/testing.md +12 -0
- package/assets/techne/rules/vue/coding-style.md +19 -0
- package/assets/techne/rules/vue/hooks.md +13 -0
- package/assets/techne/rules/vue/patterns.md +29 -0
- package/assets/techne/rules/vue/security.md +11 -0
- package/assets/techne/rules/vue/testing.md +11 -0
- package/assets/techne/rules/web/coding-style.md +25 -0
- package/assets/techne/rules/web/design-quality.md +21 -0
- package/assets/techne/rules/web/hooks.md +39 -0
- package/assets/techne/rules/web/patterns.md +23 -0
- package/assets/techne/rules/web/performance.md +25 -0
- package/assets/techne/rules/web/security.md +23 -0
- package/assets/techne/rules/web/testing.md +21 -0
- package/assets/techne/scripts/hooks/config-guard.js +50 -0
- package/assets/techne/scripts/hooks/edit-tracker.js +26 -0
- package/assets/techne/scripts/hooks/lib/shell.js +204 -0
- package/assets/techne/scripts/hooks/no-verify-guard.js +205 -0
- package/assets/techne/scripts/hooks/run.js +92 -0
- package/assets/techne/scripts/hooks/stop-checks.js +136 -0
- package/assets/techne/skills/angular/SKILL.md +34 -0
- package/assets/techne/skills/angular/reference/components-and-templates.md +63 -0
- package/assets/techne/skills/angular/reference/dependency-injection.md +44 -0
- package/assets/techne/skills/angular/reference/forms.md +97 -0
- package/assets/techne/skills/angular/reference/routing.md +50 -0
- package/assets/techne/skills/angular/reference/signals-and-state.md +59 -0
- package/assets/techne/skills/angular/reference/styling-motion-a11y.md +54 -0
- package/assets/techne/skills/angular/reference/testing.md +52 -0
- package/assets/techne/skills/angular/reference/tooling.md +31 -0
- package/assets/techne/skills/cpp/SKILL.md +27 -0
- package/assets/techne/skills/cpp/reference/coding-standards.md +160 -0
- package/assets/techne/skills/databases/SKILL.md +35 -0
- package/assets/techne/skills/databases/reference/clickhouse.md +102 -0
- package/assets/techne/skills/databases/reference/migrations.md +94 -0
- package/assets/techne/skills/databases/reference/mysql.md +101 -0
- package/assets/techne/skills/databases/reference/postgres.md +72 -0
- package/assets/techne/skills/databases/reference/prisma.md +105 -0
- package/assets/techne/skills/databases/reference/redis.md +108 -0
- package/assets/techne/skills/delivery/SKILL.md +35 -0
- package/assets/techne/skills/delivery/reference/deployment-patterns.md +58 -0
- package/assets/techne/skills/delivery/reference/docker-patterns.md +77 -0
- package/assets/techne/skills/delivery/reference/git-workflow.md +64 -0
- package/assets/techne/skills/delivery/reference/github-ops.md +67 -0
- package/assets/techne/skills/delivery/reference/jira-integration.md +53 -0
- package/assets/techne/skills/delivery/reference/kubernetes-patterns.md +67 -0
- package/assets/techne/skills/dotnet/SKILL.md +27 -0
- package/assets/techne/skills/dotnet/reference/dotnet-core.md +131 -0
- package/assets/techne/skills/flutter/SKILL.md +29 -0
- package/assets/techne/skills/flutter/reference/code-review.md +76 -0
- package/assets/techne/skills/flutter/reference/patterns.md +201 -0
- package/assets/techne/skills/go/SKILL.md +28 -0
- package/assets/techne/skills/go/reference/patterns.md +87 -0
- package/assets/techne/skills/go/reference/testing.md +142 -0
- package/assets/techne/skills/java/SKILL.md +29 -0
- package/assets/techne/skills/java/reference/java-standards.md +117 -0
- package/assets/techne/skills/java/reference/springboot.md +108 -0
- package/assets/techne/skills/kotlin/SKILL.md +35 -0
- package/assets/techne/skills/kotlin/reference/android-clean-architecture.md +115 -0
- package/assets/techne/skills/kotlin/reference/compose-multiplatform-patterns.md +113 -0
- package/assets/techne/skills/kotlin/reference/kotlin-coroutines-flows.md +93 -0
- package/assets/techne/skills/kotlin/reference/kotlin-patterns.md +74 -0
- package/assets/techne/skills/kotlin/reference/kotlin-testing.md +115 -0
- package/assets/techne/skills/ml/SKILL.md +34 -0
- package/assets/techne/skills/ml/reference/ai-regression-testing.md +99 -0
- package/assets/techne/skills/ml/reference/cost-aware-llm-pipeline.md +133 -0
- package/assets/techne/skills/ml/reference/eval-harness.md +94 -0
- package/assets/techne/skills/ml/reference/mle-workflow.md +177 -0
- package/assets/techne/skills/ml/reference/prompt-optimizer.md +107 -0
- package/assets/techne/skills/ml/reference/pytorch-patterns.md +164 -0
- package/assets/techne/skills/php/SKILL.md +27 -0
- package/assets/techne/skills/php/reference/laravel.md +142 -0
- package/assets/techne/skills/python/SKILL.md +33 -0
- package/assets/techne/skills/python/reference/django.md +104 -0
- package/assets/techne/skills/python/reference/fastapi.md +118 -0
- package/assets/techne/skills/python/reference/python-core.md +88 -0
- package/assets/techne/skills/python/reference/python-testing.md +105 -0
- package/assets/techne/skills/quality/SKILL.md +34 -0
- package/assets/techne/skills/quality/reference/benchmark.md +55 -0
- package/assets/techne/skills/quality/reference/browser-qa.md +60 -0
- package/assets/techne/skills/quality/reference/coding-standards.md +88 -0
- package/assets/techne/skills/quality/reference/e2e-testing.md +99 -0
- package/assets/techne/skills/quality/reference/tdd-workflow.md +89 -0
- package/assets/techne/skills/quality/reference/verification-loop.md +80 -0
- package/assets/techne/skills/react/SKILL.md +30 -0
- package/assets/techne/skills/react/reference/nextjs-turbopack.md +42 -0
- package/assets/techne/skills/react/reference/react-patterns.md +139 -0
- package/assets/techne/skills/react/reference/react-performance.md +101 -0
- package/assets/techne/skills/react/reference/react-testing.md +139 -0
- package/assets/techne/skills/react-native/SKILL.md +28 -0
- package/assets/techne/skills/react-native/reference/expo-patterns.md +196 -0
- package/assets/techne/skills/research/SKILL.md +35 -0
- package/assets/techne/skills/research/reference/architecture-decision-records.md +65 -0
- package/assets/techne/skills/research/reference/codebase-onboarding.md +44 -0
- package/assets/techne/skills/research/reference/deep-research.md +50 -0
- package/assets/techne/skills/research/reference/iterative-retrieval.md +62 -0
- package/assets/techne/skills/research/reference/product-lens.md +38 -0
- package/assets/techne/skills/research/reference/search-first.md +50 -0
- package/assets/techne/skills/rust/SKILL.md +28 -0
- package/assets/techne/skills/rust/reference/patterns.md +108 -0
- package/assets/techne/skills/rust/reference/testing.md +142 -0
- package/assets/techne/skills/services/SKILL.md +32 -0
- package/assets/techne/skills/services/reference/api-contracts.md +139 -0
- package/assets/techne/skills/services/reference/backend-layers.md +95 -0
- package/assets/techne/skills/services/reference/errors-and-resilience.md +146 -0
- package/assets/techne/skills/services/reference/hexagonal-boundaries.md +93 -0
- package/assets/techne/skills/services/reference/mcp-servers.md +50 -0
- package/assets/techne/skills/services/reference/nestjs.md +96 -0
- package/assets/techne/skills/swift/SKILL.md +29 -0
- package/assets/techne/skills/swift/reference/concurrency.md +83 -0
- package/assets/techne/skills/swift/reference/swiftui.md +139 -0
- package/assets/techne/skills/vue/SKILL.md +29 -0
- package/assets/techne/skills/vue/reference/nuxt4-patterns.md +90 -0
- package/assets/techne/skills/vue/reference/ui-to-vue.md +90 -0
- package/assets/techne/skills/vue/reference/vue-patterns.md +151 -0
- package/assets/techne/skills/web/SKILL.md +30 -0
- package/assets/techne/skills/web/reference/bun-runtime.md +55 -0
- package/assets/techne/skills/web/reference/frontend-patterns.md +54 -0
- package/assets/techne/skills/web/reference/seo.md +77 -0
- package/assets/techne/skills/web/reference/vite-patterns.md +96 -0
- package/bin/native.cjs +30 -0
- package/native/aarch64-apple-darwin/exonous +0 -0
- package/native/aarch64-unknown-linux-gnu/exonous +0 -0
- package/native/x86_64-apple-darwin/exonous +0 -0
- package/native/x86_64-pc-windows-msvc/exonous.exe +0 -0
- package/native/x86_64-unknown-linux-gnu/exonous +0 -0
- package/package.json +1 -6
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
{
|
|
2
|
+
"agents": [
|
|
3
|
+
"exo-designer",
|
|
4
|
+
"exo-frontend",
|
|
5
|
+
"exo-backend",
|
|
6
|
+
"exo-mobile",
|
|
7
|
+
"exo-data-ai",
|
|
8
|
+
"exo-devops",
|
|
9
|
+
"exo-infra",
|
|
10
|
+
"exo-qa",
|
|
11
|
+
"exo-security",
|
|
12
|
+
"exo-pm",
|
|
13
|
+
"exo-cto",
|
|
14
|
+
"exo-researcher"
|
|
15
|
+
],
|
|
16
|
+
"tiers": {
|
|
17
|
+
"exo-designer": "sonnet",
|
|
18
|
+
"exo-frontend": "opus",
|
|
19
|
+
"exo-backend": "opus",
|
|
20
|
+
"exo-mobile": "opus",
|
|
21
|
+
"exo-data-ai": "opus",
|
|
22
|
+
"exo-devops": "opus",
|
|
23
|
+
"exo-infra": "opus",
|
|
24
|
+
"exo-qa": "sonnet",
|
|
25
|
+
"exo-security": "sonnet",
|
|
26
|
+
"exo-pm": "sonnet",
|
|
27
|
+
"exo-cto": "sonnet",
|
|
28
|
+
"exo-researcher": "sonnet"
|
|
29
|
+
},
|
|
30
|
+
"builtins": {
|
|
31
|
+
"claude": [
|
|
32
|
+
"general-purpose",
|
|
33
|
+
"Explore",
|
|
34
|
+
"Plan",
|
|
35
|
+
"statusline-setup",
|
|
36
|
+
"output-style-setup",
|
|
37
|
+
"claude-code-guide"
|
|
38
|
+
],
|
|
39
|
+
"cursor": [
|
|
40
|
+
"generalPurpose",
|
|
41
|
+
"explore",
|
|
42
|
+
"shell",
|
|
43
|
+
"browser-use",
|
|
44
|
+
"browserUse",
|
|
45
|
+
"cursor-guide",
|
|
46
|
+
"ci-investigator",
|
|
47
|
+
"bugbot",
|
|
48
|
+
"security-review",
|
|
49
|
+
"best-of-n-runner"
|
|
50
|
+
]
|
|
51
|
+
},
|
|
52
|
+
"legacy": {
|
|
53
|
+
"exo-designer": [
|
|
54
|
+
"impeccable-asset-producer",
|
|
55
|
+
"impeccable-documenter",
|
|
56
|
+
"impeccable-finish-reviewer",
|
|
57
|
+
"impeccable-manual-edit-applier",
|
|
58
|
+
"a11y-architect"
|
|
59
|
+
],
|
|
60
|
+
"exo-frontend": [
|
|
61
|
+
"react-build-resolver",
|
|
62
|
+
"seo-specialist",
|
|
63
|
+
"gan-generator"
|
|
64
|
+
],
|
|
65
|
+
"exo-backend": [
|
|
66
|
+
"cpp-build-resolver",
|
|
67
|
+
"go-build-resolver",
|
|
68
|
+
"java-build-resolver",
|
|
69
|
+
"rust-build-resolver",
|
|
70
|
+
"django-build-resolver"
|
|
71
|
+
],
|
|
72
|
+
"exo-mobile": [
|
|
73
|
+
"dart-build-resolver",
|
|
74
|
+
"kotlin-build-resolver",
|
|
75
|
+
"swift-build-resolver",
|
|
76
|
+
"harmonyos-app-resolver"
|
|
77
|
+
],
|
|
78
|
+
"exo-data-ai": [
|
|
79
|
+
"database-reviewer",
|
|
80
|
+
"mle-reviewer",
|
|
81
|
+
"pytorch-build-resolver"
|
|
82
|
+
],
|
|
83
|
+
"exo-devops": [
|
|
84
|
+
"loop-operator",
|
|
85
|
+
"harness-optimizer"
|
|
86
|
+
],
|
|
87
|
+
"exo-infra": [
|
|
88
|
+
"network-architect",
|
|
89
|
+
"network-config-reviewer",
|
|
90
|
+
"network-troubleshooter",
|
|
91
|
+
"homelab-architect"
|
|
92
|
+
],
|
|
93
|
+
"exo-qa": [
|
|
94
|
+
"code-reviewer",
|
|
95
|
+
"cpp-reviewer",
|
|
96
|
+
"csharp-reviewer",
|
|
97
|
+
"django-reviewer",
|
|
98
|
+
"fastapi-reviewer",
|
|
99
|
+
"flutter-reviewer",
|
|
100
|
+
"fsharp-reviewer",
|
|
101
|
+
"go-reviewer",
|
|
102
|
+
"java-reviewer",
|
|
103
|
+
"kotlin-reviewer",
|
|
104
|
+
"php-reviewer",
|
|
105
|
+
"python-reviewer",
|
|
106
|
+
"react-reviewer",
|
|
107
|
+
"rust-reviewer",
|
|
108
|
+
"swift-reviewer",
|
|
109
|
+
"typescript-reviewer",
|
|
110
|
+
"vue-reviewer",
|
|
111
|
+
"tdd-guide",
|
|
112
|
+
"e2e-runner",
|
|
113
|
+
"pr-test-analyzer",
|
|
114
|
+
"silent-failure-hunter",
|
|
115
|
+
"comment-analyzer",
|
|
116
|
+
"type-design-analyzer",
|
|
117
|
+
"agent-evaluator",
|
|
118
|
+
"gan-evaluator"
|
|
119
|
+
],
|
|
120
|
+
"exo-security": [
|
|
121
|
+
"security-reviewer",
|
|
122
|
+
"healthcare-reviewer",
|
|
123
|
+
"opensource-sanitizer",
|
|
124
|
+
"opensource-forker"
|
|
125
|
+
],
|
|
126
|
+
"exo-pm": [
|
|
127
|
+
"planner",
|
|
128
|
+
"chief-of-staff",
|
|
129
|
+
"marketing-agent",
|
|
130
|
+
"spec-miner",
|
|
131
|
+
"gan-planner"
|
|
132
|
+
],
|
|
133
|
+
"exo-cto": [
|
|
134
|
+
"architect",
|
|
135
|
+
"code-architect"
|
|
136
|
+
],
|
|
137
|
+
"exo-researcher": [
|
|
138
|
+
"code-explorer",
|
|
139
|
+
"docs-lookup",
|
|
140
|
+
"doc-updater",
|
|
141
|
+
"conversation-analyzer",
|
|
142
|
+
"opensource-packager"
|
|
143
|
+
]
|
|
144
|
+
},
|
|
145
|
+
"implementers": [
|
|
146
|
+
"build-error-resolver",
|
|
147
|
+
"refactor-cleaner",
|
|
148
|
+
"code-simplifier",
|
|
149
|
+
"performance-optimizer"
|
|
150
|
+
],
|
|
151
|
+
"domainHints": {
|
|
152
|
+
"exo-mobile": "\\b(react[- ]native|expo|swiftui|swift|kotlin|android|ios|flutter|dart)\\b",
|
|
153
|
+
"exo-frontend": "(\\.(vue|tsx|jsx|css|scss|svelte)\\b|\\b(frontend|front-end|component|tailwind|nuxt|next\\.js|vue|react|ui)\\b)",
|
|
154
|
+
"exo-infra": "\\b(terraform|kubernetes|k8s|helm|network|vpc|dns|cloud ?formation|pulumi)\\b",
|
|
155
|
+
"exo-devops": "\\b(ci|cd|pipeline|github actions|workflow\\.ya?ml|dockerfile|docker|release|deploy)\\b",
|
|
156
|
+
"exo-data-ai": "\\b(sql|migration|schema|postgres|mysql|prisma|etl|pipeline data|ml|llm|embedding|pytorch)\\b"
|
|
157
|
+
},
|
|
158
|
+
"defaultImplementer": "exo-backend",
|
|
159
|
+
"nameKeywords": [
|
|
160
|
+
[
|
|
161
|
+
"exo-designer",
|
|
162
|
+
"design|ux|ui-|-ui|visual|a11y|accessib|brand"
|
|
163
|
+
],
|
|
164
|
+
[
|
|
165
|
+
"exo-mobile",
|
|
166
|
+
"mobile|ios|android|flutter|dart|swift|kotlin|expo"
|
|
167
|
+
],
|
|
168
|
+
[
|
|
169
|
+
"exo-frontend",
|
|
170
|
+
"front|react|vue|nuxt|next|css|web"
|
|
171
|
+
],
|
|
172
|
+
[
|
|
173
|
+
"exo-data-ai",
|
|
174
|
+
"data|db|sql|ml|ai-|llm|eval|model"
|
|
175
|
+
],
|
|
176
|
+
[
|
|
177
|
+
"exo-security",
|
|
178
|
+
"secur|sanitiz|vuln|threat|pentest|compliance"
|
|
179
|
+
],
|
|
180
|
+
[
|
|
181
|
+
"exo-infra",
|
|
182
|
+
"infra|network|cloud|k8s|kube|terraform|homelab"
|
|
183
|
+
],
|
|
184
|
+
[
|
|
185
|
+
"exo-devops",
|
|
186
|
+
"devops|ci|deploy|release|pipeline|harness|loop|ops"
|
|
187
|
+
],
|
|
188
|
+
[
|
|
189
|
+
"exo-qa",
|
|
190
|
+
"review|test|qa|verif|debug|check|audit|critic|evaluat"
|
|
191
|
+
],
|
|
192
|
+
[
|
|
193
|
+
"exo-pm",
|
|
194
|
+
"plan|product|pm|roadmap|spec|requirement|analyst|scrum"
|
|
195
|
+
],
|
|
196
|
+
[
|
|
197
|
+
"exo-cto",
|
|
198
|
+
"architect|cto|strateg|advisor|tech-lead"
|
|
199
|
+
],
|
|
200
|
+
[
|
|
201
|
+
"exo-researcher",
|
|
202
|
+
"research|explor|doc|writer|map|scout|librarian|intel"
|
|
203
|
+
],
|
|
204
|
+
[
|
|
205
|
+
"exo-backend",
|
|
206
|
+
"back|api|server|exec|fix|implement|build|coder|engineer|developer|resolver"
|
|
207
|
+
]
|
|
208
|
+
]
|
|
209
|
+
}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// taxis — enforces the 12 exo-* agents in Claude Code and Cursor.
|
|
3
|
+
// Usage (hook command): node taxis.js <claude|cursor>
|
|
4
|
+
// PreToolUse (Task/Agent) · Cursor subagentStart → allow roster/builtins, remap legacy names, deny the rest.
|
|
5
|
+
// SessionStart → move stray agent files (other plugins) out of ~/.claude/agents and ~/.cursor/agents
|
|
6
|
+
// into ~/.claude/exonous/agent-roles/, where exo-* agents load them as role briefs.
|
|
7
|
+
// Fails open: a guard bug must never block the user's session.
|
|
8
|
+
|
|
9
|
+
'use strict';
|
|
10
|
+
|
|
11
|
+
const fs = require('fs');
|
|
12
|
+
const os = require('os');
|
|
13
|
+
const path = require('path');
|
|
14
|
+
|
|
15
|
+
const HOME = os.homedir();
|
|
16
|
+
const ROLES_DIR = path.join(HOME, '.claude', 'exonous', 'agent-roles');
|
|
17
|
+
const AGENT_DIRS = [path.join(HOME, '.claude', 'agents'), path.join(HOME, '.cursor', 'agents')];
|
|
18
|
+
const runtime = process.argv[2] === 'cursor' ? 'cursor' : 'claude';
|
|
19
|
+
|
|
20
|
+
function loadRoster() {
|
|
21
|
+
return JSON.parse(fs.readFileSync(path.join(__dirname, 'roster.json'), 'utf8'));
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function routeByDomain(roster, text) {
|
|
25
|
+
for (const [agent, pattern] of Object.entries(roster.domainHints)) {
|
|
26
|
+
if (new RegExp(pattern, 'i').test(text)) return agent;
|
|
27
|
+
}
|
|
28
|
+
return roster.defaultImplementer;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function resolve(roster, requested, prompt) {
|
|
32
|
+
if (!requested) return { action: 'allow' };
|
|
33
|
+
const bare = requested.includes(':') ? requested.split(':').pop() : requested;
|
|
34
|
+
if (roster.agents.includes(bare)) {
|
|
35
|
+
return bare === requested ? { action: 'allow' } : { action: 'remap', target: bare };
|
|
36
|
+
}
|
|
37
|
+
if (roster.builtins[runtime].includes(requested)) return { action: 'allow' };
|
|
38
|
+
|
|
39
|
+
for (const [target, names] of Object.entries(roster.legacy)) {
|
|
40
|
+
if (names.includes(bare)) return { action: 'remap', target, legacy: bare };
|
|
41
|
+
}
|
|
42
|
+
if (roster.implementers.includes(bare)) {
|
|
43
|
+
return { action: 'remap', target: routeByDomain(roster, prompt), legacy: bare };
|
|
44
|
+
}
|
|
45
|
+
const lower = bare.toLowerCase();
|
|
46
|
+
for (const [target, pattern] of roster.nameKeywords) {
|
|
47
|
+
if (!new RegExp(pattern).test(lower)) continue;
|
|
48
|
+
const routed = target === roster.defaultImplementer ? routeByDomain(roster, prompt) : target;
|
|
49
|
+
return { action: 'remap', target: routed, legacy: bare };
|
|
50
|
+
}
|
|
51
|
+
return { action: 'deny' };
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function findBrief(name) {
|
|
55
|
+
let groups;
|
|
56
|
+
try {
|
|
57
|
+
groups = fs.readdirSync(ROLES_DIR, { withFileTypes: true }).filter((e) => e.isDirectory());
|
|
58
|
+
} catch {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
for (const group of groups) {
|
|
62
|
+
const candidate = path.join(ROLES_DIR, group.name, `${name}.md`);
|
|
63
|
+
if (fs.existsSync(candidate)) return candidate;
|
|
64
|
+
}
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function remapPrompt(prompt, legacy) {
|
|
69
|
+
if (!legacy) return prompt;
|
|
70
|
+
const brief = findBrief(legacy);
|
|
71
|
+
const header = brief
|
|
72
|
+
? `[taxis] Running the legacy \`${legacy}\` role. Read ${brief} first and follow its contract (inputs, outputs, files written); your exo-* agent guidelines still apply.`
|
|
73
|
+
: `[taxis] Requested as \`${legacy}\`.`;
|
|
74
|
+
return `${header}\n\n${prompt || ''}`;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function denyMessage(roster, requested) {
|
|
78
|
+
return `Agent "${requested}" is outside the Exonous roster. Use one of: ${roster.agents.join(', ')}.`;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function freeName(dir, file) {
|
|
82
|
+
const base = file.slice(0, -3);
|
|
83
|
+
let candidate = path.join(dir, file);
|
|
84
|
+
for (let n = 1; fs.existsSync(candidate); n += 1) candidate = path.join(dir, `${base}.${n}.md`);
|
|
85
|
+
return candidate;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function sweep(roster) {
|
|
89
|
+
let moved = 0;
|
|
90
|
+
for (const dir of AGENT_DIRS) {
|
|
91
|
+
let entries;
|
|
92
|
+
try {
|
|
93
|
+
entries = fs.readdirSync(dir);
|
|
94
|
+
} catch {
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
for (const file of entries) {
|
|
98
|
+
if (!file.endsWith('.md') || roster.agents.includes(file.slice(0, -3))) continue;
|
|
99
|
+
const src = path.join(dir, file);
|
|
100
|
+
if (!fs.lstatSync(src).isFile()) continue;
|
|
101
|
+
const group = file.startsWith('impeccable-') ? 'impeccable' : 'quarantine';
|
|
102
|
+
fs.mkdirSync(path.join(ROLES_DIR, group), { recursive: true });
|
|
103
|
+
fs.copyFileSync(src, group === 'quarantine' ? freeName(path.join(ROLES_DIR, group), file) : path.join(ROLES_DIR, group, file));
|
|
104
|
+
fs.unlinkSync(src);
|
|
105
|
+
moved += 1;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return moved;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function emit(obj) {
|
|
112
|
+
if (obj) process.stdout.write(JSON.stringify(obj));
|
|
113
|
+
process.exit(0);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Model governance: in Claude Code a per-call `model` override must match the agent's tier.
|
|
117
|
+
// Cursor model slugs are user-selected, so its calls keep their model.
|
|
118
|
+
function governModel(roster, input) {
|
|
119
|
+
const tier = roster.tiers[input.subagent_type];
|
|
120
|
+
if (runtime !== 'claude' || !tier || !input.model || input.model === tier) return input;
|
|
121
|
+
return { ...input, model: tier };
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
function handleSpawn(roster, toolInput) {
|
|
125
|
+
const requested = toolInput.subagent_type;
|
|
126
|
+
const decision = resolve(roster, requested, toolInput.prompt || '');
|
|
127
|
+
|
|
128
|
+
if (decision.action === 'allow') {
|
|
129
|
+
const governed = governModel(roster, toolInput);
|
|
130
|
+
if (governed !== toolInput) {
|
|
131
|
+
emit({ hookSpecificOutput: { hookEventName: 'PreToolUse', permissionDecision: 'allow', permissionDecisionReason: `taxis: ${requested} runs on ${governed.model}`, updatedInput: governed } });
|
|
132
|
+
}
|
|
133
|
+
emit(runtime === 'cursor' ? { permission: 'allow' } : null);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
if (decision.action === 'remap') {
|
|
137
|
+
const updated = governModel(roster, { ...toolInput, subagent_type: decision.target, prompt: remapPrompt(toolInput.prompt, decision.legacy) });
|
|
138
|
+
const reason = `taxis: ${requested} → ${decision.target}`;
|
|
139
|
+
emit(runtime === 'cursor'
|
|
140
|
+
? { permission: 'allow', updated_input: updated }
|
|
141
|
+
: { hookSpecificOutput: { hookEventName: 'PreToolUse', permissionDecision: 'allow', permissionDecisionReason: reason, updatedInput: updated } });
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
const message = denyMessage(roster, requested);
|
|
145
|
+
emit(runtime === 'cursor'
|
|
146
|
+
? { permission: 'deny', user_message: message, agent_message: message }
|
|
147
|
+
: { hookSpecificOutput: { hookEventName: 'PreToolUse', permissionDecision: 'deny', permissionDecisionReason: message } });
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
function main() {
|
|
151
|
+
let input;
|
|
152
|
+
try {
|
|
153
|
+
input = JSON.parse(fs.readFileSync(0, 'utf8') || '{}');
|
|
154
|
+
} catch {
|
|
155
|
+
emit(runtime === 'cursor' ? { permission: 'allow' } : null);
|
|
156
|
+
}
|
|
157
|
+
// Cursor also runs ~/.claude/settings.json hooks; the native ~/.cursor/hooks.json entry does the work there.
|
|
158
|
+
if (runtime === 'claude' && input.cursor_version) emit({});
|
|
159
|
+
|
|
160
|
+
const roster = loadRoster();
|
|
161
|
+
const event = String(input.hook_event_name || '').toLowerCase();
|
|
162
|
+
|
|
163
|
+
if (event === 'sessionstart') {
|
|
164
|
+
sweep(roster);
|
|
165
|
+
emit(runtime === 'cursor' ? {} : null);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
if (event === 'subagentstart') {
|
|
169
|
+
const decision = resolve(roster, input.subagent_type, input.task || '');
|
|
170
|
+
if (decision.action === 'allow') emit({ permission: 'allow' });
|
|
171
|
+
const message = decision.action === 'remap'
|
|
172
|
+
? `Agent "${input.subagent_type}" is folded into ${decision.target}; spawn ${decision.target} instead.`
|
|
173
|
+
: denyMessage(roster, input.subagent_type);
|
|
174
|
+
emit({ permission: 'deny', user_message: message });
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
if (event === 'pretooluse' && ['Task', 'Agent'].includes(input.tool_name)) {
|
|
178
|
+
handleSpawn(roster, input.tool_input || {});
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
emit(runtime === 'cursor' ? { permission: 'allow' } : null);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
try {
|
|
185
|
+
main();
|
|
186
|
+
} catch (err) {
|
|
187
|
+
process.stderr.write(`[taxis] guard error (failing open): ${err.message}\n`);
|
|
188
|
+
emit(runtime === 'cursor' ? { permission: 'allow' } : null);
|
|
189
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Mandatory design stack (ui-design + ui-motion + native-ui + ui-mockup) as the DESIGN authority for UI work; ui-patterns subordinate for charts, forms, web navigation and stack guidelines
|
|
3
|
+
alwaysApply: true
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Frontend Skills (mandatory)
|
|
7
|
+
|
|
8
|
+
On ANY frontend/UI task — pages, components, styling, layout, redesign, polish, landing, dashboard, CSS/Tailwind, React/Next/Vue UI, native screens:
|
|
9
|
+
|
|
10
|
+
**Source of truth for DESIGN** = the design stack (`~/.agents/skills/<name>/SKILL.md`, symlinked into `~/.claude/skills/` and `~/.cursor/skills/`):
|
|
11
|
+
|
|
12
|
+
1. **`ui-design`** — always first. Direction, modes, critique/audit, refine commands, live iteration, and the hook-enforced detector (`node scripts/ui-design.mjs`). Style modules in `reference/styles/` (direction for landing/portfolio/marketing, redesign for brownfield, premium/minimalist/brutalist when the brief asks). Dashboards and tools follow its Operate mode, not the style modules.
|
|
13
|
+
2. **`ui-motion`** — any animation, transition, gesture, toast, or interaction-feel work (web and Expo).
|
|
14
|
+
3. **`native-ui`** — iOS/Android/desktop-native feel, Apple-quality design, Swift/SwiftUI.
|
|
15
|
+
4. **`ui-mockup`** — image-model comps, image-to-code, brand kits — only when the brief calls for imagery.
|
|
16
|
+
|
|
17
|
+
Then:
|
|
18
|
+
|
|
19
|
+
5. **`ui-patterns`** (subordinate) — consult **only after the stack sets direction**, and only for charts/data visualization, form UX patterns, web navigation patterns, and stack implementation guidelines (Vue, Nuxt, React, Next.js, React Native, shadcn/ui, Tailwind). Never sets visual direction.
|
|
20
|
+
|
|
21
|
+
**On conflict between ui-patterns and the design stack, ALWAYS prefer the stack.**
|
|
22
|
+
|
|
23
|
+
Announce: `Using ui-design for [purpose]` — name the companion skills actually loaded (`+ ui-motion`, `+ native-ui`, `+ ui-mockup`, `+ ui-patterns`).
|
|
24
|
+
|
|
25
|
+
Before delivery, after ui-design's polish/audit pass, run the ui-patterns pre-delivery add-on (cursor-pointer on non-button clickables, chart legend + non-color encoding + table fallback, form a11y, focus on route change, z-index scale).
|
|
26
|
+
|
|
27
|
+
Skip only for pure backend/infra with zero UI surface. Existing project design systems still win for tokens/components — skills guide quality and direction, not invent a second system.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
<!-- PR body template (PT-BR). Hook checks the 5 titles below; max 30 changed files per PR. -->
|
|
2
|
+
|
|
3
|
+
## Resumo
|
|
4
|
+
|
|
5
|
+
<!-- 1–2 frases sobre o objetivo da PR -->
|
|
6
|
+
|
|
7
|
+
## Principais mudanças
|
|
8
|
+
|
|
9
|
+
<!-- bullets do que foi adicionado/alterado/removido -->
|
|
10
|
+
|
|
11
|
+
## Arquitetura & implementação
|
|
12
|
+
|
|
13
|
+
<!-- breve: decisões que ajudam a entender o diff -->
|
|
14
|
+
|
|
15
|
+
## Antes → Agora
|
|
16
|
+
|
|
17
|
+
<!-- tabela ou bullets; se não aplicável: _N/A — não aplicável a esta mudança_ -->
|
|
18
|
+
|
|
19
|
+
## Roteiro de teste
|
|
20
|
+
|
|
21
|
+
<!-- passos objetivos para validar -->
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
// anamnesis — automatic session memory hook: --event start|prompt|tool|stop|end --adapter <tool>. Always exits 0.
|
|
5
|
+
const EVENTS = ['start', 'prompt', 'tool', 'stop', 'end'];
|
|
6
|
+
// Session-start output per tool; windsurf and opencode have no channel back to the model.
|
|
7
|
+
const FORMATS = {
|
|
8
|
+
claude: (text) => JSON.stringify({ hookSpecificOutput: { hookEventName: 'SessionStart', additionalContext: text } }),
|
|
9
|
+
gemini: (text) => JSON.stringify({ hookSpecificOutput: { hookEventName: 'SessionStart', additionalContext: text } }),
|
|
10
|
+
cursor: (text) => JSON.stringify({ additional_context: text }),
|
|
11
|
+
copilot: (text) => JSON.stringify({ additionalContext: text }),
|
|
12
|
+
codex: (text) => text,
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
function arg(name) {
|
|
16
|
+
const i = process.argv.indexOf(name);
|
|
17
|
+
return i === -1 ? null : process.argv[i + 1] || null;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function readStdin() {
|
|
21
|
+
try {
|
|
22
|
+
return require('fs').readFileSync(0, 'utf8');
|
|
23
|
+
} catch {
|
|
24
|
+
return '';
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function logError(err) {
|
|
29
|
+
try {
|
|
30
|
+
const fs = require('fs');
|
|
31
|
+
const path = require('path');
|
|
32
|
+
const dir = path.join(require('./lib/paths.cjs').stateDir(), 'anamnesis');
|
|
33
|
+
fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
34
|
+
fs.writeFileSync(path.join(dir, 'last-error'), `${new Date().toISOString()} ${arg('--event')} ${arg('--adapter')}: ${err && err.stack ? err.stack : err}\n`);
|
|
35
|
+
} catch {
|
|
36
|
+
// nowhere left to report
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function main() {
|
|
41
|
+
const event = arg('--event');
|
|
42
|
+
const adapter = (arg('--adapter') || 'claude').replace(/[^\w-]/g, '');
|
|
43
|
+
if (!EVENTS.includes(event)) return;
|
|
44
|
+
let input = {};
|
|
45
|
+
try {
|
|
46
|
+
const parsed = JSON.parse(readStdin() || '{}');
|
|
47
|
+
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) input = parsed;
|
|
48
|
+
} catch {
|
|
49
|
+
// unreadable payload: cwd falls back to the process cwd
|
|
50
|
+
}
|
|
51
|
+
const brief = require('./lib/memory.cjs').handle(event, input, { agent: adapter });
|
|
52
|
+
if (brief && FORMATS[adapter]) process.stdout.write(`${FORMATS[adapter](brief)}\n`);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
try {
|
|
56
|
+
main();
|
|
57
|
+
} catch (err) {
|
|
58
|
+
// a session must go on even when memory breaks
|
|
59
|
+
logError(err);
|
|
60
|
+
}
|
|
61
|
+
process.exit(0);
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
// ethos — restates the always-on rule set on each prompt: --adapter <tool>. Always exits 0.
|
|
5
|
+
const REMINDER = 'exonous rules in force (nomos + praxis): terse; smallest change; reuse first; close scope; locate before reading; test first, fix cause, prove; commit/push only when asked.';
|
|
6
|
+
// Prompt-submit output per tool; windsurf and opencode have no channel back to the model, so they are not wired.
|
|
7
|
+
const FORMATS = {
|
|
8
|
+
claude: (text) => JSON.stringify({ hookSpecificOutput: { hookEventName: 'UserPromptSubmit', additionalContext: text } }),
|
|
9
|
+
gemini: (text) => JSON.stringify({ hookSpecificOutput: { hookEventName: 'BeforeAgent', additionalContext: text } }),
|
|
10
|
+
cursor: (text) => JSON.stringify({ additional_context: text }),
|
|
11
|
+
copilot: (text) => JSON.stringify({ additionalContext: text }),
|
|
12
|
+
codex: (text) => text,
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
function arg(name) {
|
|
16
|
+
const i = process.argv.indexOf(name);
|
|
17
|
+
return i === -1 ? null : process.argv[i + 1] || null;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function readJson(file) {
|
|
21
|
+
try {
|
|
22
|
+
return JSON.parse(require('fs').readFileSync(file, 'utf8'));
|
|
23
|
+
} catch {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** Opted out with EXONOUS_RULES_REMINDER=0 or config.json `"rulesReminder": false`. */
|
|
29
|
+
function disabled(env = process.env) {
|
|
30
|
+
if (env.EXONOUS_RULES_REMINDER === '0') return true;
|
|
31
|
+
const path = require('path');
|
|
32
|
+
const config = readJson(path.join(require('./lib/paths.cjs').exoDir(), 'config.json'));
|
|
33
|
+
return Boolean(config) && typeof config === 'object' && config.rulesReminder === false;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function main() {
|
|
37
|
+
if (disabled()) return;
|
|
38
|
+
// hasOwn, or an inherited key (`toString`, `constructor`) would write junk into the model's context.
|
|
39
|
+
const adapter = (arg('--adapter') || 'claude').replace(/[^\w-]/g, '');
|
|
40
|
+
if (Object.hasOwn(FORMATS, adapter)) process.stdout.write(`${FORMATS[adapter](REMINDER)}\n`);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
try {
|
|
44
|
+
main();
|
|
45
|
+
} catch {
|
|
46
|
+
// a prompt must go through even when the reminder cannot be written
|
|
47
|
+
}
|
|
48
|
+
process.exit(0);
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
// kairos — session hook: prints the last update note (one line) and starts a detached daily update. Always exits 0.
|
|
5
|
+
const { spawn } = require('child_process');
|
|
6
|
+
|
|
7
|
+
function arg(name) {
|
|
8
|
+
const i = process.argv.indexOf(name);
|
|
9
|
+
return i === -1 ? null : process.argv[i + 1] || null;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
// Tools that fire kairos where stdout reaches nobody (every prompt, a detached plugin spawn) only trigger the check.
|
|
13
|
+
const SILENT = ['windsurf', 'opencode'];
|
|
14
|
+
const FORMATS = {
|
|
15
|
+
cursor: (note) => JSON.stringify({ additional_context: note }),
|
|
16
|
+
gemini: (note) => JSON.stringify({ hookSpecificOutput: { hookEventName: 'SessionStart', additionalContext: note } }),
|
|
17
|
+
copilot: (note) => JSON.stringify({ additionalContext: note }),
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
function startUpdate(selfupdate, adapter) {
|
|
21
|
+
if (selfupdate.optedOut() || !selfupdate.due()) return;
|
|
22
|
+
selfupdate.markChecked();
|
|
23
|
+
spawn(process.execPath, [__filename, '--run', '--adapter', adapter], { detached: true, stdio: 'ignore', windowsHide: true }).unref();
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function main() {
|
|
27
|
+
const selfupdate = require('./lib/selfupdate.cjs');
|
|
28
|
+
if (selfupdate.notOwner()) return;
|
|
29
|
+
const adapter = (arg('--adapter') || 'claude').replace(/[^\w-]/g, '');
|
|
30
|
+
if (process.argv.includes('--run')) {
|
|
31
|
+
selfupdate.run({ background: true });
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
if (!SILENT.includes(adapter)) {
|
|
35
|
+
const note = selfupdate.takeNote();
|
|
36
|
+
if (note) process.stdout.write(`${FORMATS[adapter] ? FORMATS[adapter](note) : note}\n`);
|
|
37
|
+
}
|
|
38
|
+
startUpdate(selfupdate, adapter);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
try {
|
|
42
|
+
main();
|
|
43
|
+
} catch {
|
|
44
|
+
// a session must start even when the hook breaks
|
|
45
|
+
}
|
|
46
|
+
process.exit(0);
|