@ngxtm/devkit 2.1.0 → 3.0.1
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 +57 -197
- package/cli/detect.js +292 -0
- package/cli/index.js +204 -92
- package/cli/init.js +245 -0
- package/cli/update.js +243 -0
- package/cli/utils.js +195 -0
- package/hooks/lib/__tests__/ck-config-utils.test.cjs +10 -0
- package/hooks/lib/__tests__/statusline-integration.test.cjs +46 -75
- package/hooks/scout-block/tests/test-monorepo-scenarios.cjs +2 -2
- package/hooks/tests/test-ckignore.cjs +7 -2
- package/package.json +16 -20
- package/rules-index.json +76 -0
- package/scripts/generate-index.js +223 -0
- package/scripts/merge-commands.js +290 -0
- package/scripts/organize-rules.js +226 -0
- package/templates/base/hooks/lib/ck-config-utils.cjs +769 -0
- package/templates/base/hooks/lib/ck-paths.cjs +110 -0
- package/templates/base/hooks/lib/colors.cjs +95 -0
- package/templates/base/hooks/lib/config-counter.cjs +103 -0
- package/templates/base/hooks/lib/context-builder.cjs +600 -0
- package/templates/base/hooks/lib/context-tracker.cjs +335 -0
- package/templates/base/hooks/lib/privacy-checker.cjs +297 -0
- package/templates/base/hooks/lib/project-detector.cjs +430 -0
- package/templates/base/hooks/lib/scout-checker.cjs +172 -0
- package/templates/base/hooks/lib/transcript-parser.cjs +164 -0
- package/templates/base/hooks/privacy-block.cjs +145 -0
- package/agents/backend-engineer.md +0 -154
- package/agents/brainstormer.md +0 -169
- package/agents/business-analyst.md +0 -166
- package/agents/database-architect.md +0 -159
- package/agents/debugger.md +0 -155
- package/agents/designer.md +0 -150
- package/agents/devops-engineer.md +0 -155
- package/agents/docs-manager.md +0 -171
- package/agents/frontend-engineer.md +0 -159
- package/agents/game-engineer.md +0 -148
- package/agents/mobile-engineer.md +0 -149
- package/agents/performance-engineer.md +0 -152
- package/agents/planner.md +0 -161
- package/agents/project-manager.md +0 -160
- package/agents/researcher.md +0 -146
- package/agents/reviewer.md +0 -155
- package/agents/scouter.md +0 -157
- package/agents/security-engineer.md +0 -154
- package/agents/tech-lead.md +0 -159
- package/agents/tester.md +0 -157
- package/agents-claudekit/brainstormer.md +0 -113
- package/agents-claudekit/code-reviewer.md +0 -157
- package/agents-claudekit/code-simplifier.md +0 -42
- package/agents-claudekit/copywriter.md +0 -110
- package/agents-claudekit/database-admin.md +0 -92
- package/agents-claudekit/debugger.md +0 -137
- package/agents-claudekit/docs-manager.md +0 -208
- package/agents-claudekit/fullstack-developer.md +0 -95
- package/agents-claudekit/git-manager.md +0 -394
- package/agents-claudekit/journal-writer.md +0 -113
- package/agents-claudekit/mcp-manager.md +0 -93
- package/agents-claudekit/planner.md +0 -108
- package/agents-claudekit/project-manager.md +0 -125
- package/agents-claudekit/researcher.md +0 -38
- package/agents-claudekit/scout-external.md +0 -141
- package/agents-claudekit/scout.md +0 -107
- package/agents-claudekit/tester.md +0 -105
- package/agents-claudekit/ui-ux-designer.md +0 -236
- package/commands/ask.md +0 -64
- package/commands/brainstorm.md +0 -64
- package/commands/code.md +0 -64
- package/commands/cook.md +0 -64
- package/commands/debug.md +0 -64
- package/commands/design/fast.md +0 -134
- package/commands/fix/fast.md +0 -84
- package/commands/fix/hard.md +0 -116
- package/commands/fix.md +0 -64
- package/commands/plan/fast.md +0 -78
- package/commands/plan/hard.md +0 -131
- package/commands/plan.md +0 -64
- package/commands/test.md +0 -64
- package/hooks/tests/test-modularization-hook.cjs +0 -126
- package/matrix-skills/_index.yaml +0 -275
- package/matrix-skills/ai-ml.yaml +0 -353
- package/matrix-skills/architecture.yaml +0 -93
- package/matrix-skills/backend.yaml +0 -280
- package/matrix-skills/cloud.yaml +0 -112
- package/matrix-skills/data.yaml +0 -74
- package/matrix-skills/design.yaml +0 -98
- package/matrix-skills/devops.yaml +0 -200
- package/matrix-skills/frontend.yaml +0 -200
- package/matrix-skills/gaming.yaml +0 -39
- package/matrix-skills/languages.yaml +0 -160
- package/matrix-skills/management.yaml +0 -50
- package/matrix-skills/mcp.yaml +0 -82
- package/matrix-skills/mobile.yaml +0 -85
- package/matrix-skills/performance.yaml +0 -23
- package/matrix-skills/planning.yaml +0 -117
- package/matrix-skills/quality.yaml +0 -195
- package/matrix-skills/research.yaml +0 -106
- package/matrix-skills/security.yaml +0 -293
- package/matrix-skills/tools.yaml +0 -352
- package/output-styles/coding-level-0-eli5.md +0 -103
- package/output-styles/coding-level-1-junior.md +0 -124
- package/output-styles/coding-level-2-mid.md +0 -146
- package/output-styles/coding-level-3-senior.md +0 -148
- package/output-styles/coding-level-4-lead.md +0 -159
- package/output-styles/coding-level-5-god.md +0 -91
- package/rules/README.md +0 -141
- package/rules/metadata.json +0 -54
- package/settings.json +0 -3
- package/statusline.cjs +0 -500
- package/statusline.ps1 +0 -307
- package/statusline.sh +0 -237
- package/workflows/development-rules.md +0 -42
- package/workflows/documentation-management.md +0 -121
- package/workflows/orchestration-protocol.md +0 -16
- package/workflows/primary-workflow.md +0 -45
- /package/{commands → merged-commands}/ask/fast.md +0 -0
- /package/{commands → merged-commands}/ask/hard.md +0 -0
- /package/{commands-claudekit → merged-commands}/ask.md +0 -0
- /package/{commands → merged-commands}/auto.md +0 -0
- /package/{commands-claudekit → merged-commands}/bootstrap/auto/fast.md +0 -0
- /package/{commands-claudekit → merged-commands}/bootstrap/auto/parallel.md +0 -0
- /package/{commands-claudekit → merged-commands}/bootstrap/auto.md +0 -0
- /package/{commands-claudekit → merged-commands}/bootstrap.md +0 -0
- /package/{commands → merged-commands}/brainstorm/fast.md +0 -0
- /package/{commands → merged-commands}/brainstorm/hard.md +0 -0
- /package/{commands-claudekit → merged-commands}/brainstorm.md +0 -0
- /package/{commands-claudekit → merged-commands}/ck-help.md +0 -0
- /package/{commands-claudekit → merged-commands}/code/auto.md +0 -0
- /package/{commands → merged-commands}/code/fast.md +0 -0
- /package/{commands → merged-commands}/code/hard.md +0 -0
- /package/{commands-claudekit → merged-commands}/code/no-test.md +0 -0
- /package/{commands-claudekit → merged-commands}/code/parallel.md +0 -0
- /package/{commands-claudekit → merged-commands}/code.md +0 -0
- /package/{commands-claudekit → merged-commands}/coding-level.md +0 -0
- /package/{commands-claudekit → merged-commands}/content/cro.md +0 -0
- /package/{commands-claudekit → merged-commands}/content/enhance.md +0 -0
- /package/{commands-claudekit → merged-commands}/content/fast.md +0 -0
- /package/{commands-claudekit → merged-commands}/content/good.md +0 -0
- /package/{commands-claudekit → merged-commands}/cook/auto/fast.md +0 -0
- /package/{commands-claudekit → merged-commands}/cook/auto/parallel.md +0 -0
- /package/{commands-claudekit → merged-commands}/cook/auto.md +0 -0
- /package/{commands → merged-commands}/cook/fast.md +0 -0
- /package/{commands → merged-commands}/cook/hard.md +0 -0
- /package/{commands-claudekit → merged-commands}/cook.md +0 -0
- /package/{commands → merged-commands}/debug/fast.md +0 -0
- /package/{commands → merged-commands}/debug/hard.md +0 -0
- /package/{commands-claudekit → merged-commands}/debug.md +0 -0
- /package/{commands → merged-commands}/deploy/check.md +0 -0
- /package/{commands → merged-commands}/deploy/preview.md +0 -0
- /package/{commands → merged-commands}/deploy/production.md +0 -0
- /package/{commands → merged-commands}/deploy/rollback.md +0 -0
- /package/{commands → merged-commands}/deploy.md +0 -0
- /package/{commands-claudekit → merged-commands}/design/3d.md +0 -0
- /package/{commands-claudekit → merged-commands}/design/describe.md +0 -0
- /package/{commands-claudekit → merged-commands}/design/fast.md +0 -0
- /package/{commands-claudekit → merged-commands}/design/good.md +0 -0
- /package/{commands → merged-commands}/design/hard.md +0 -0
- /package/{commands-claudekit → merged-commands}/design/screenshot.md +0 -0
- /package/{commands-claudekit → merged-commands}/design/video.md +0 -0
- /package/{commands → merged-commands}/design.md +0 -0
- /package/{commands → merged-commands}/docs/audit.md +0 -0
- /package/{commands → merged-commands}/docs/business.md +0 -0
- /package/{commands → merged-commands}/docs/core.md +0 -0
- /package/{commands-claudekit → merged-commands}/docs/init.md +0 -0
- /package/{commands-claudekit → merged-commands}/docs/summarize.md +0 -0
- /package/{commands-claudekit → merged-commands}/docs/update.md +0 -0
- /package/{commands → merged-commands}/docs.md +0 -0
- /package/{commands-claudekit → merged-commands}/fix/ci.md +0 -0
- /package/{commands-claudekit → merged-commands}/fix/fast.md +0 -0
- /package/{commands-claudekit → merged-commands}/fix/hard.md +0 -0
- /package/{commands-claudekit → merged-commands}/fix/logs.md +0 -0
- /package/{commands-claudekit → merged-commands}/fix/parallel.md +0 -0
- /package/{commands-claudekit → merged-commands}/fix/test.md +0 -0
- /package/{commands-claudekit → merged-commands}/fix/types.md +0 -0
- /package/{commands-claudekit → merged-commands}/fix/ui.md +0 -0
- /package/{commands-claudekit → merged-commands}/fix.md +0 -0
- /package/{commands-claudekit → merged-commands}/git/cm.md +0 -0
- /package/{commands-claudekit → merged-commands}/git/cp.md +0 -0
- /package/{commands-claudekit → merged-commands}/git/merge.md +0 -0
- /package/{commands-claudekit → merged-commands}/git/pr.md +0 -0
- /package/{commands-claudekit → merged-commands}/integrate/polar.md +0 -0
- /package/{commands-claudekit → merged-commands}/integrate/sepay.md +0 -0
- /package/{commands-claudekit → merged-commands}/journal.md +0 -0
- /package/{commands-claudekit → merged-commands}/kanban.md +0 -0
- /package/{commands-claudekit → merged-commands}/plan/archive.md +0 -0
- /package/{commands-claudekit → merged-commands}/plan/ci.md +0 -0
- /package/{commands-claudekit → merged-commands}/plan/cro.md +0 -0
- /package/{commands-claudekit → merged-commands}/plan/fast.md +0 -0
- /package/{commands-claudekit → merged-commands}/plan/hard.md +0 -0
- /package/{commands-claudekit → merged-commands}/plan/parallel.md +0 -0
- /package/{commands-claudekit → merged-commands}/plan/two.md +0 -0
- /package/{commands-claudekit → merged-commands}/plan/validate.md +0 -0
- /package/{commands-claudekit → merged-commands}/plan.md +0 -0
- /package/{commands-claudekit → merged-commands}/preview.md +0 -0
- /package/{commands-claudekit → merged-commands}/review/codebase/parallel.md +0 -0
- /package/{commands-claudekit → merged-commands}/review/codebase.md +0 -0
- /package/{commands → merged-commands}/review/fast.md +0 -0
- /package/{commands → merged-commands}/review/hard.md +0 -0
- /package/{commands → merged-commands}/review.md +0 -0
- /package/{commands-claudekit → merged-commands}/scout/ext.md +0 -0
- /package/{commands-claudekit → merged-commands}/scout.md +0 -0
- /package/{commands-claudekit → merged-commands}/skill/add.md +0 -0
- /package/{commands-claudekit → merged-commands}/skill/create.md +0 -0
- /package/{commands-claudekit → merged-commands}/skill/fix-logs.md +0 -0
- /package/{commands-claudekit → merged-commands}/skill/optimize/auto.md +0 -0
- /package/{commands-claudekit → merged-commands}/skill/optimize.md +0 -0
- /package/{commands-claudekit → merged-commands}/skill/plan.md +0 -0
- /package/{commands-claudekit → merged-commands}/skill/update.md +0 -0
- /package/{commands → merged-commands}/test/fast.md +0 -0
- /package/{commands → merged-commands}/test/hard.md +0 -0
- /package/{commands-claudekit → merged-commands}/test/ui.md +0 -0
- /package/{commands-claudekit → merged-commands}/test.md +0 -0
- /package/{commands-claudekit → merged-commands}/use-mcp.md +0 -0
- /package/{commands-claudekit → merged-commands}/watzup.md +0 -0
- /package/{commands-claudekit → merged-commands}/worktree.md +0 -0
- /package/{rules → templates/dart/rules}/dart/best-practices/SKILL.md +0 -0
- /package/{rules → templates/dart/rules}/dart/language/SKILL.md +0 -0
- /package/{rules → templates/dart/rules}/dart/tooling/SKILL.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/auto-route-navigation/SKILL.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/auto-route-navigation/references/REFERENCE.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/auto-route-navigation/references/router-config.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/bloc-state-management/SKILL.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/bloc-state-management/references/REFERENCE.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/bloc-state-management/references/auth-bloc-example.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/bloc-state-management/references/equatable-usage.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/bloc-state-management/references/property-based-state.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/bloc.rule.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/cicd/SKILL.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/cicd/references/advanced-workflow.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/cicd/references/fastlane.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/cicd/references/github-actions.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/dependency-injection/SKILL.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/dependency-injection/references/REFERENCE.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/dependency-injection/references/modules.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/error-handling/SKILL.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/error-handling/references/REFERENCE.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/error-handling/references/error-mapping.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/feature-based-clean-architecture/SKILL.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/feature-based-clean-architecture/references/REFERENCE.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/feature-based-clean-architecture/references/folder-structure.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/getx-navigation/SKILL.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/getx-navigation/references/app-pages.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/getx-navigation/references/middleware-example.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/getx-state-management/SKILL.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/getx-state-management/references/binding-example.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/getx-state-management/references/reactive-vs-simple.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/go-router-navigation/SKILL.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/idiomatic-flutter/SKILL.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/layer-based-clean-architecture/SKILL.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/layer-based-clean-architecture/references/REFERENCE.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/layer-based-clean-architecture/references/repository-mapping.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/localization/SKILL.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/localization/references/REFERENCE.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/localization/references/sheet-loader.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/navigator-v1-navigation/SKILL.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/navigator-v1-navigation/references/on-generate-route.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/performance/SKILL.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/retrofit-networking/SKILL.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/retrofit-networking/references/REFERENCE.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/retrofit-networking/references/token-refresh.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/riverpod-state-management/SKILL.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/riverpod-state-management/references/architecture.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/riverpod-state-management/references/best-practices.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/riverpod-state-management/references/testing.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/riverpod.rule.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/security/SKILL.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/security/references/REFERENCE.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/security/references/network-security.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/testing/SKILL.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/testing/references/REFERENCE.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/testing/references/bloc-testing.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/testing/references/integration-testing.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/testing/references/robot-pattern.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/testing/references/unit-testing.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/testing/references/widget-testing.md +0 -0
- /package/{rules → templates/flutter/rules}/flutter/widgets/SKILL.md +0 -0
- /package/{rules → templates/golang/rules}/golang/chi-router/SKILL.md +0 -0
- /package/{rules → templates/golang/rules}/golang/chi-router/references/REFERENCE.md +0 -0
- /package/{rules → templates/golang/rules}/golang/chi-router/references/routing-patterns.md +0 -0
- /package/{rules → templates/golang/rules}/golang/cobra-cli/SKILL.md +0 -0
- /package/{rules → templates/golang/rules}/golang/cobra-cli/references/REFERENCE.md +0 -0
- /package/{rules → templates/golang/rules}/golang/cobra-cli/references/command-patterns.md +0 -0
- /package/{rules → templates/golang/rules}/golang/core/SKILL.md +0 -0
- /package/{rules → templates/golang/rules}/golang/core/references/REFERENCE.md +0 -0
- /package/{rules → templates/golang/rules}/golang/core/references/concurrency-patterns.md +0 -0
- /package/{rules → templates/golang/rules}/golang/core/references/error-handling.md +0 -0
- /package/{rules → templates/golang/rules}/golang/echo-framework/SKILL.md +0 -0
- /package/{rules → templates/golang/rules}/golang/echo-framework/references/REFERENCE.md +0 -0
- /package/{rules → templates/golang/rules}/golang/echo-framework/references/middleware-patterns.md +0 -0
- /package/{rules → templates/golang/rules}/golang/echo-framework/references/routing-patterns.md +0 -0
- /package/{rules → templates/golang/rules}/golang/ent-orm/SKILL.md +0 -0
- /package/{rules → templates/golang/rules}/golang/ent-orm/references/REFERENCE.md +0 -0
- /package/{rules → templates/golang/rules}/golang/ent-orm/references/schema-patterns.md +0 -0
- /package/{rules → templates/golang/rules}/golang/fiber-framework/SKILL.md +0 -0
- /package/{rules → templates/golang/rules}/golang/fiber-framework/references/REFERENCE.md +0 -0
- /package/{rules → templates/golang/rules}/golang/fiber-framework/references/routing-patterns.md +0 -0
- /package/{rules → templates/golang/rules}/golang/gin-framework/SKILL.md +0 -0
- /package/{rules → templates/golang/rules}/golang/gin-framework/references/REFERENCE.md +0 -0
- /package/{rules → templates/golang/rules}/golang/gin-framework/references/middleware-patterns.md +0 -0
- /package/{rules → templates/golang/rules}/golang/gorm-orm/SKILL.md +0 -0
- /package/{rules → templates/golang/rules}/golang/gorm-orm/references/REFERENCE.md +0 -0
- /package/{rules → templates/golang/rules}/golang/gorm-orm/references/model-definitions.md +0 -0
- /package/{rules → templates/golang/rules}/golang/gorm-orm/references/query-patterns.md +0 -0
- /package/{rules → templates/golang/rules}/golang/grpc/SKILL.md +0 -0
- /package/{rules → templates/golang/rules}/golang/grpc/references/REFERENCE.md +0 -0
- /package/{rules → templates/golang/rules}/golang/grpc/references/service-patterns.md +0 -0
- /package/{rules → templates/golang/rules}/golang/testify/SKILL.md +0 -0
- /package/{rules → templates/golang/rules}/golang/testify/references/REFERENCE.md +0 -0
- /package/{rules → templates/golang/rules}/golang/testify/references/assert-patterns.md +0 -0
- /package/{rules → templates/golang/rules}/golang/validator/SKILL.md +0 -0
- /package/{rules → templates/golang/rules}/golang/validator/references/REFERENCE.md +0 -0
- /package/{rules → templates/golang/rules}/golang/validator/references/validation-tags.md +0 -0
- /package/{rules → templates/golang/rules}/golang/viper-config/SKILL.md +0 -0
- /package/{rules → templates/golang/rules}/golang/viper-config/references/REFERENCE.md +0 -0
- /package/{rules → templates/golang/rules}/golang/viper-config/references/config-loading.md +0 -0
- /package/{rules → templates/golang/rules}/golang/wire-di/SKILL.md +0 -0
- /package/{rules → templates/golang/rules}/golang/wire-di/references/REFERENCE.md +0 -0
- /package/{rules → templates/golang/rules}/golang/wire-di/references/provider-patterns.md +0 -0
- /package/{rules → templates/golang/rules}/golang/zap-logging/SKILL.md +0 -0
- /package/{rules → templates/golang/rules}/golang/zap-logging/references/REFERENCE.md +0 -0
- /package/{rules → templates/golang/rules}/golang/zap-logging/references/logger-config.md +0 -0
- /package/{rules → templates/java/rules}/java/build-gradle/SKILL.md +0 -0
- /package/{rules → templates/java/rules}/java/build-gradle/references/REFERENCE.md +0 -0
- /package/{rules → templates/java/rules}/java/build-gradle/references/kotlin-dsl.md +0 -0
- /package/{rules → templates/java/rules}/java/build-gradle/references/task-configuration.md +0 -0
- /package/{rules → templates/java/rules}/java/build-maven/SKILL.md +0 -0
- /package/{rules → templates/java/rules}/java/build-maven/references/REFERENCE.md +0 -0
- /package/{rules → templates/java/rules}/java/build-maven/references/dependency-management.md +0 -0
- /package/{rules → templates/java/rules}/java/build-maven/references/lifecycle-phases.md +0 -0
- /package/{rules → templates/java/rules}/java/graalvm-native/SKILL.md +0 -0
- /package/{rules → templates/java/rules}/java/graalvm-native/references/REFERENCE.md +0 -0
- /package/{rules → templates/java/rules}/java/java-collections-streams/SKILL.md +0 -0
- /package/{rules → templates/java/rules}/java/java-collections-streams/references/REFERENCE.md +0 -0
- /package/{rules → templates/java/rules}/java/java-collections-streams/references/collectors-patterns.md +0 -0
- /package/{rules → templates/java/rules}/java/java-collections-streams/references/stream-pipelines.md +0 -0
- /package/{rules → templates/java/rules}/java/java-concurrency/SKILL.md +0 -0
- /package/{rules → templates/java/rules}/java/java-concurrency/references/REFERENCE.md +0 -0
- /package/{rules → templates/java/rules}/java/java-concurrency/references/completable-future.md +0 -0
- /package/{rules → templates/java/rules}/java/java-concurrency/references/executor-patterns.md +0 -0
- /package/{rules → templates/java/rules}/java/java-concurrency/references/virtual-threads.md +0 -0
- /package/{rules → templates/java/rules}/java/java-core-language/SKILL.md +0 -0
- /package/{rules → templates/java/rules}/java/java-core-language/references/REFERENCE.md +0 -0
- /package/{rules → templates/java/rules}/java/java-core-language/references/jvm-memory-model.md +0 -0
- /package/{rules → templates/java/rules}/java/java-core-language/references/modern-java-features.md +0 -0
- /package/{rules → templates/java/rules}/java/java-project-structure/SKILL.md +0 -0
- /package/{rules → templates/java/rules}/java/java-project-structure/references/REFERENCE.md +0 -0
- /package/{rules → templates/java/rules}/java/java-project-structure/references/maven-project-layout.md +0 -0
- /package/{rules → templates/java/rules}/java/java-project-structure/references/module-system.md +0 -0
- /package/{rules → templates/java/rules}/java/micronaut-core/SKILL.md +0 -0
- /package/{rules → templates/java/rules}/java/micronaut-core/references/REFERENCE.md +0 -0
- /package/{rules → templates/java/rules}/java/micronaut-reactive/SKILL.md +0 -0
- /package/{rules → templates/java/rules}/java/micronaut-reactive/references/REFERENCE.md +0 -0
- /package/{rules → templates/java/rules}/java/quarkus-core/SKILL.md +0 -0
- /package/{rules → templates/java/rules}/java/quarkus-core/references/REFERENCE.md +0 -0
- /package/{rules → templates/java/rules}/java/quarkus-reactive/SKILL.md +0 -0
- /package/{rules → templates/java/rules}/java/quarkus-reactive/references/REFERENCE.md +0 -0
- /package/{rules → templates/java/rules}/java/spring-batch/SKILL.md +0 -0
- /package/{rules → templates/java/rules}/java/spring-batch/references/REFERENCE.md +0 -0
- /package/{rules → templates/java/rules}/java/spring-boot-architecture/SKILL.md +0 -0
- /package/{rules → templates/java/rules}/java/spring-boot-architecture/references/REFERENCE.md +0 -0
- /package/{rules → templates/java/rules}/java/spring-boot-architecture/references/auto-configuration.md +0 -0
- /package/{rules → templates/java/rules}/java/spring-boot-architecture/references/configuration-properties.md +0 -0
- /package/{rules → templates/java/rules}/java/spring-boot-web/SKILL.md +0 -0
- /package/{rules → templates/java/rules}/java/spring-boot-web/references/REFERENCE.md +0 -0
- /package/{rules → templates/java/rules}/java/spring-cloud/SKILL.md +0 -0
- /package/{rules → templates/java/rules}/java/spring-cloud/references/REFERENCE.md +0 -0
- /package/{rules → templates/java/rules}/java/spring-data-jpa/SKILL.md +0 -0
- /package/{rules → templates/java/rules}/java/spring-data-jpa/references/REFERENCE.md +0 -0
- /package/{rules → templates/java/rules}/java/spring-security/SKILL.md +0 -0
- /package/{rules → templates/java/rules}/java/spring-security/references/REFERENCE.md +0 -0
- /package/{rules → templates/java/rules}/java/spring-security/references/jwt-auth-flow.md +0 -0
- /package/{rules → templates/java/rules}/java/testing-junit-mockito/SKILL.md +0 -0
- /package/{rules → templates/java/rules}/java/testing-junit-mockito/references/REFERENCE.md +0 -0
- /package/{rules → templates/java/rules}/java/testing-junit-mockito/references/junit5-patterns.md +0 -0
- /package/{rules → templates/java/rules}/java/testing-junit-mockito/references/mockito-patterns.md +0 -0
- /package/{rules → templates/java/rules}/java/testing-junit-mockito/references/spring-boot-testing.md +0 -0
- /package/{rules → templates/javascript/rules}/javascript/best-practices/SKILL.md +0 -0
- /package/{rules → templates/javascript/rules}/javascript/best-practices/references/REFERENCE.md +0 -0
- /package/{rules → templates/javascript/rules}/javascript/language/SKILL.md +0 -0
- /package/{rules → templates/javascript/rules}/javascript/language/references/REFERENCE.md +0 -0
- /package/{rules → templates/javascript/rules}/javascript/tooling/SKILL.md +0 -0
- /package/{rules → templates/javascript/rules}/javascript/tooling/references/REFERENCE.md +0 -0
- /package/{rules → templates/nestjs/rules}/nestjs/api-standards/SKILL.md +0 -0
- /package/{rules → templates/nestjs/rules}/nestjs/api-standards/references/pagination-wrapper.md +0 -0
- /package/{rules → templates/nestjs/rules}/nestjs/architecture/SKILL.md +0 -0
- /package/{rules → templates/nestjs/rules}/nestjs/architecture/references/dynamic-module.md +0 -0
- /package/{rules → templates/nestjs/rules}/nestjs/caching/SKILL.md +0 -0
- /package/{rules → templates/nestjs/rules}/nestjs/caching/references/REFERENCE.md +0 -0
- /package/{rules → templates/nestjs/rules}/nestjs/caching/references/cache-patterns.md +0 -0
- /package/{rules → templates/nestjs/rules}/nestjs/configuration/SKILL.md +0 -0
- /package/{rules → templates/nestjs/rules}/nestjs/configuration/references/REFERENCE.md +0 -0
- /package/{rules → templates/nestjs/rules}/nestjs/configuration/references/config-patterns.md +0 -0
- /package/{rules → templates/nestjs/rules}/nestjs/controllers-services/SKILL.md +0 -0
- /package/{rules → templates/nestjs/rules}/nestjs/controllers-services/references/REFERENCE.md +0 -0
- /package/{rules → templates/nestjs/rules}/nestjs/controllers-services/references/controller-patterns.md +0 -0
- /package/{rules → templates/nestjs/rules}/nestjs/controllers-services/references/service-patterns.md +0 -0
- /package/{rules → templates/nestjs/rules}/nestjs/database/SKILL.md +0 -0
- /package/{rules → templates/nestjs/rules}/nestjs/database/references/REFERENCE.md +0 -0
- /package/{rules → templates/nestjs/rules}/nestjs/database/references/typeorm-patterns.md +0 -0
- /package/{rules → templates/nestjs/rules}/nestjs/deployment/SKILL.md +0 -0
- /package/{rules → templates/nestjs/rules}/nestjs/deployment/references/REFERENCE.md +0 -0
- /package/{rules → templates/nestjs/rules}/nestjs/deployment/references/deployment-patterns.md +0 -0
- /package/{rules → templates/nestjs/rules}/nestjs/documentation/SKILL.md +0 -0
- /package/{rules → templates/nestjs/rules}/nestjs/documentation/references/REFERENCE.md +0 -0
- /package/{rules → templates/nestjs/rules}/nestjs/documentation/references/swagger-patterns.md +0 -0
- /package/{rules → templates/nestjs/rules}/nestjs/error-handling/SKILL.md +0 -0
- /package/{rules → templates/nestjs/rules}/nestjs/error-handling/references/REFERENCE.md +0 -0
- /package/{rules → templates/nestjs/rules}/nestjs/error-handling/references/exception-filters.md +0 -0
- /package/{rules → templates/nestjs/rules}/nestjs/file-uploads/SKILL.md +0 -0
- /package/{rules → templates/nestjs/rules}/nestjs/file-uploads/references/REFERENCE.md +0 -0
- /package/{rules → templates/nestjs/rules}/nestjs/file-uploads/references/upload-patterns.md +0 -0
- /package/{rules → templates/nestjs/rules}/nestjs/observability/SKILL.md +0 -0
- /package/{rules → templates/nestjs/rules}/nestjs/observability/references/REFERENCE.md +0 -0
- /package/{rules → templates/nestjs/rules}/nestjs/observability/references/logging-metrics.md +0 -0
- /package/{rules → templates/nestjs/rules}/nestjs/performance/SKILL.md +0 -0
- /package/{rules → templates/nestjs/rules}/nestjs/performance/references/REFERENCE.md +0 -0
- /package/{rules → templates/nestjs/rules}/nestjs/performance/references/performance-patterns.md +0 -0
- /package/{rules → templates/nestjs/rules}/nestjs/real-time/SKILL.md +0 -0
- /package/{rules → templates/nestjs/rules}/nestjs/real-time/references/REFERENCE.md +0 -0
- /package/{rules → templates/nestjs/rules}/nestjs/real-time/references/websocket-patterns.md +0 -0
- /package/{rules → templates/nestjs/rules}/nestjs/scheduling/SKILL.md +0 -0
- /package/{rules → templates/nestjs/rules}/nestjs/scheduling/references/REFERENCE.md +0 -0
- /package/{rules → templates/nestjs/rules}/nestjs/scheduling/references/scheduling-patterns.md +0 -0
- /package/{rules → templates/nestjs/rules}/nestjs/search/SKILL.md +0 -0
- /package/{rules → templates/nestjs/rules}/nestjs/search/references/REFERENCE.md +0 -0
- /package/{rules → templates/nestjs/rules}/nestjs/search/references/search-patterns.md +0 -0
- /package/{rules → templates/nestjs/rules}/nestjs/security/SKILL.md +0 -0
- /package/{rules → templates/nestjs/rules}/nestjs/security/references/REFERENCE.md +0 -0
- /package/{rules → templates/nestjs/rules}/nestjs/security/references/authentication.md +0 -0
- /package/{rules → templates/nestjs/rules}/nestjs/testing/SKILL.md +0 -0
- /package/{rules → templates/nestjs/rules}/nestjs/testing/references/REFERENCE.md +0 -0
- /package/{rules → templates/nestjs/rules}/nestjs/testing/references/unit-testing.md +0 -0
- /package/{rules → templates/nestjs/rules}/nestjs/transport/SKILL.md +0 -0
- /package/{rules → templates/nestjs/rules}/nestjs/transport/references/REFERENCE.md +0 -0
- /package/{rules → templates/nestjs/rules}/nestjs/transport/references/microservices-patterns.md +0 -0
- /package/{rules → templates/nextjs/rules}/nextjs/app-router/SKILL.md +0 -0
- /package/{rules → templates/nextjs/rules}/nextjs/app-router/references/REFERENCE.md +0 -0
- /package/{rules → templates/nextjs/rules}/nextjs/app-router/references/routing-patterns.md +0 -0
- /package/{rules → templates/nextjs/rules}/nextjs/architecture/SKILL.md +0 -0
- /package/{rules → templates/nextjs/rules}/nextjs/architecture/references/fsd-structure.md +0 -0
- /package/{rules → templates/nextjs/rules}/nextjs/authentication/SKILL.md +0 -0
- /package/{rules → templates/nextjs/rules}/nextjs/authentication/references/auth-implementation.md +0 -0
- /package/{rules → templates/nextjs/rules}/nextjs/caching/SKILL.md +0 -0
- /package/{rules → templates/nextjs/rules}/nextjs/caching/references/REFERENCE.md +0 -0
- /package/{rules → templates/nextjs/rules}/nextjs/caching/references/cache-strategies.md +0 -0
- /package/{rules → templates/nextjs/rules}/nextjs/data-access-layer/SKILL.md +0 -0
- /package/{rules → templates/nextjs/rules}/nextjs/data-access-layer/references/patterns.md +0 -0
- /package/{rules → templates/nextjs/rules}/nextjs/data-fetching/SKILL.md +0 -0
- /package/{rules → templates/nextjs/rules}/nextjs/data-fetching/references/REFERENCE.md +0 -0
- /package/{rules → templates/nextjs/rules}/nextjs/data-fetching/references/fetch-patterns.md +0 -0
- /package/{rules → templates/nextjs/rules}/nextjs/internationalization/SKILL.md +0 -0
- /package/{rules → templates/nextjs/rules}/nextjs/internationalization/references/REFERENCE.md +0 -0
- /package/{rules → templates/nextjs/rules}/nextjs/internationalization/references/i18n-patterns.md +0 -0
- /package/{rules → templates/nextjs/rules}/nextjs/optimization/SKILL.md +0 -0
- /package/{rules → templates/nextjs/rules}/nextjs/optimization/references/REFERENCE.md +0 -0
- /package/{rules → templates/nextjs/rules}/nextjs/optimization/references/optimization-patterns.md +0 -0
- /package/{rules → templates/nextjs/rules}/nextjs/rendering/SKILL.md +0 -0
- /package/{rules → templates/nextjs/rules}/nextjs/rendering/references/REFERENCE.md +0 -0
- /package/{rules → templates/nextjs/rules}/nextjs/rendering/references/rendering-modes.md +0 -0
- /package/{rules → templates/nextjs/rules}/nextjs/server-actions/SKILL.md +0 -0
- /package/{rules → templates/nextjs/rules}/nextjs/server-actions/references/REFERENCE.md +0 -0
- /package/{rules → templates/nextjs/rules}/nextjs/server-actions/references/action-patterns.md +0 -0
- /package/{rules → templates/nextjs/rules}/nextjs/server-components/SKILL.md +0 -0
- /package/{rules → templates/nextjs/rules}/nextjs/server-components/references/REFERENCE.md +0 -0
- /package/{rules → templates/nextjs/rules}/nextjs/server-components/references/component-patterns.md +0 -0
- /package/{rules → templates/nextjs/rules}/nextjs/state-management/SKILL.md +0 -0
- /package/{rules → templates/nextjs/rules}/nextjs/state-management/references/REFERENCE.md +0 -0
- /package/{rules → templates/nextjs/rules}/nextjs/state-management/references/state-patterns.md +0 -0
- /package/{rules → templates/nextjs/rules}/nextjs/styling/SKILL.md +0 -0
- /package/{rules → templates/nextjs/rules}/nextjs/styling/references/implementation.md +0 -0
- /package/{rules → templates/react/rules}/react/component-patterns/SKILL.md +0 -0
- /package/{rules → templates/react/rules}/react/component-patterns/references/REFERENCE.md +0 -0
- /package/{rules → templates/react/rules}/react/hooks/SKILL.md +0 -0
- /package/{rules → templates/react/rules}/react/hooks/references/REFERENCE.md +0 -0
- /package/{rules → templates/react/rules}/react/hooks.rule.md +0 -0
- /package/{rules → templates/react/rules}/react/performance/SKILL.md +0 -0
- /package/{rules → templates/react/rules}/react/performance/references/REFERENCE.md +0 -0
- /package/{rules → templates/react/rules}/react/security/SKILL.md +0 -0
- /package/{rules → templates/react/rules}/react/security/references/REFERENCE.md +0 -0
- /package/{rules → templates/react/rules}/react/state-management/SKILL.md +0 -0
- /package/{rules → templates/react/rules}/react/state-management/references/REFERENCE.md +0 -0
- /package/{rules → templates/react/rules}/react/testing/SKILL.md +0 -0
- /package/{rules → templates/react/rules}/react/testing/references/REFERENCE.md +0 -0
- /package/{rules → templates/react/rules}/react/tooling/SKILL.md +0 -0
- /package/{rules → templates/react/rules}/react/typescript/SKILL.md +0 -0
- /package/{rules → templates/rust/rules}/rust/actix-web/SKILL.md +0 -0
- /package/{rules → templates/rust/rules}/rust/actix-web/references/REFERENCE.md +0 -0
- /package/{rules → templates/rust/rules}/rust/actix-web/references/handler-patterns.md +0 -0
- /package/{rules → templates/rust/rules}/rust/async-graphql/SKILL.md +0 -0
- /package/{rules → templates/rust/rules}/rust/async-graphql/references/REFERENCE.md +0 -0
- /package/{rules → templates/rust/rules}/rust/async-graphql/references/schema-patterns.md +0 -0
- /package/{rules → templates/rust/rules}/rust/axum/SKILL.md +0 -0
- /package/{rules → templates/rust/rules}/rust/axum/references/REFERENCE.md +0 -0
- /package/{rules → templates/rust/rules}/rust/axum/references/handler-patterns.md +0 -0
- /package/{rules → templates/rust/rules}/rust/bevy/SKILL.md +0 -0
- /package/{rules → templates/rust/rules}/rust/bevy/references/REFERENCE.md +0 -0
- /package/{rules → templates/rust/rules}/rust/bevy/references/ecs-patterns.md +0 -0
- /package/{rules → templates/rust/rules}/rust/clap/SKILL.md +0 -0
- /package/{rules → templates/rust/rules}/rust/clap/references/REFERENCE.md +0 -0
- /package/{rules → templates/rust/rules}/rust/clap/references/derive-patterns.md +0 -0
- /package/{rules → templates/rust/rules}/rust/core/SKILL.md +0 -0
- /package/{rules → templates/rust/rules}/rust/core/references/REFERENCE.md +0 -0
- /package/{rules → templates/rust/rules}/rust/core/references/error-handling.md +0 -0
- /package/{rules → templates/rust/rules}/rust/diesel-orm/SKILL.md +0 -0
- /package/{rules → templates/rust/rules}/rust/diesel-orm/references/REFERENCE.md +0 -0
- /package/{rules → templates/rust/rules}/rust/diesel-orm/references/schema-patterns.md +0 -0
- /package/{rules → templates/rust/rules}/rust/rocket/SKILL.md +0 -0
- /package/{rules → templates/rust/rules}/rust/rocket/references/REFERENCE.md +0 -0
- /package/{rules → templates/rust/rules}/rust/rocket/references/handler-patterns.md +0 -0
- /package/{rules → templates/rust/rules}/rust/sea-orm/SKILL.md +0 -0
- /package/{rules → templates/rust/rules}/rust/sea-orm/references/REFERENCE.md +0 -0
- /package/{rules → templates/rust/rules}/rust/sea-orm/references/entity-patterns.md +0 -0
- /package/{rules → templates/rust/rules}/rust/serde-serialization/SKILL.md +0 -0
- /package/{rules → templates/rust/rules}/rust/serde-serialization/references/REFERENCE.md +0 -0
- /package/{rules → templates/rust/rules}/rust/serde-serialization/references/serialization-patterns.md +0 -0
- /package/{rules → templates/rust/rules}/rust/sqlx-database/SKILL.md +0 -0
- /package/{rules → templates/rust/rules}/rust/sqlx-database/references/REFERENCE.md +0 -0
- /package/{rules → templates/rust/rules}/rust/sqlx-database/references/query-patterns.md +0 -0
- /package/{rules → templates/rust/rules}/rust/tauri/SKILL.md +0 -0
- /package/{rules → templates/rust/rules}/rust/tauri/references/REFERENCE.md +0 -0
- /package/{rules → templates/rust/rules}/rust/tauri/references/command-patterns.md +0 -0
- /package/{rules → templates/rust/rules}/rust/tokio-runtime/SKILL.md +0 -0
- /package/{rules → templates/rust/rules}/rust/tokio-runtime/references/REFERENCE.md +0 -0
- /package/{rules → templates/rust/rules}/rust/tokio-runtime/references/async-patterns.md +0 -0
- /package/{rules → templates/rust/rules}/rust/tokio-runtime/references/synchronization.md +0 -0
- /package/{rules → templates/rust/rules}/rust/tonic/SKILL.md +0 -0
- /package/{rules → templates/rust/rules}/rust/tonic/references/REFERENCE.md +0 -0
- /package/{rules → templates/rust/rules}/rust/tonic/references/service-patterns.md +0 -0
- /package/{rules → templates/rust/rules}/rust/tracing/SKILL.md +0 -0
- /package/{rules → templates/rust/rules}/rust/tracing/references/REFERENCE.md +0 -0
- /package/{rules → templates/rust/rules}/rust/tracing/references/instrumentation.md +0 -0
- /package/{rules → templates/typescript/rules}/typescript/best-practices/SKILL.md +0 -0
- /package/{rules → templates/typescript/rules}/typescript/best-practices/references/REFERENCE.md +0 -0
- /package/{rules → templates/typescript/rules}/typescript/language/SKILL.md +0 -0
- /package/{rules → templates/typescript/rules}/typescript/language/references/REFERENCE.md +0 -0
- /package/{rules → templates/typescript/rules}/typescript/patterns.rule.md +0 -0
- /package/{rules → templates/typescript/rules}/typescript/security/SKILL.md +0 -0
- /package/{rules → templates/typescript/rules}/typescript/security/references/REFERENCE.md +0 -0
- /package/{rules → templates/typescript/rules}/typescript/tooling/SKILL.md +0 -0
- /package/{rules → templates/typescript/rules}/typescript/tooling/references/REFERENCE.md +0 -0
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
/**
|
|
5
5
|
* Integration Tests for Statusline Main Script
|
|
6
6
|
* Tests the complete statusline.cjs with sample JSON input
|
|
7
|
-
* Run: node
|
|
7
|
+
* Run: node hooks/lib/__tests__/statusline-integration.test.cjs
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
const fs = require('fs');
|
|
@@ -12,6 +12,12 @@ const path = require('path');
|
|
|
12
12
|
const os = require('os');
|
|
13
13
|
const { execSync } = require('child_process');
|
|
14
14
|
|
|
15
|
+
// Determine the correct statusline.cjs path (at project root)
|
|
16
|
+
const statuslinePath = path.resolve(__dirname, '..', '..', '..', 'statusline.cjs');
|
|
17
|
+
|
|
18
|
+
// Check if running on Windows
|
|
19
|
+
const isWindows = process.platform === 'win32';
|
|
20
|
+
|
|
15
21
|
let passed = 0;
|
|
16
22
|
let failed = 0;
|
|
17
23
|
const failures = [];
|
|
@@ -47,6 +53,29 @@ function assertContains(actual, search, msg = '') {
|
|
|
47
53
|
}
|
|
48
54
|
}
|
|
49
55
|
|
|
56
|
+
/**
|
|
57
|
+
* Cross-platform helper to run statusline with JSON input
|
|
58
|
+
* Uses temp file approach to avoid shell quoting issues on Windows
|
|
59
|
+
*/
|
|
60
|
+
function runStatusline(jsonInput, extraEnv = {}, options = {}) {
|
|
61
|
+
const tmpFile = path.join(os.tmpdir(), `statusline-test-${Date.now()}-${Math.random().toString(36).substring(7)}.json`);
|
|
62
|
+
try {
|
|
63
|
+
fs.writeFileSync(tmpFile, jsonInput);
|
|
64
|
+
const cmd = isWindows
|
|
65
|
+
? `type "${tmpFile}" | node "${statuslinePath}"`
|
|
66
|
+
: `cat "${tmpFile}" | node "${statuslinePath}"`;
|
|
67
|
+
return execSync(cmd, {
|
|
68
|
+
encoding: 'utf8',
|
|
69
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
70
|
+
env: { ...process.env, ...extraEnv },
|
|
71
|
+
shell: true,
|
|
72
|
+
...options
|
|
73
|
+
});
|
|
74
|
+
} finally {
|
|
75
|
+
try { fs.unlinkSync(tmpFile); } catch {}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
50
79
|
console.log('\n═══════════════════════════════════════════════════════');
|
|
51
80
|
console.log('STATUSLINE INTEGRATION TESTS');
|
|
52
81
|
console.log('═══════════════════════════════════════════════════════\n');
|
|
@@ -64,10 +93,7 @@ const minimalInput = JSON.stringify({
|
|
|
64
93
|
});
|
|
65
94
|
|
|
66
95
|
try {
|
|
67
|
-
const result =
|
|
68
|
-
encoding: 'utf8',
|
|
69
|
-
stdio: ['pipe', 'pipe', 'pipe']
|
|
70
|
-
});
|
|
96
|
+
const result = runStatusline(minimalInput);
|
|
71
97
|
|
|
72
98
|
test('Minimal input produces output', () => {
|
|
73
99
|
assertTrue(result.length > 0, 'Should produce some output');
|
|
@@ -109,11 +135,7 @@ try {
|
|
|
109
135
|
context_window: { context_window_size: 200000 }
|
|
110
136
|
});
|
|
111
137
|
|
|
112
|
-
const gitResult =
|
|
113
|
-
encoding: 'utf8',
|
|
114
|
-
cwd: tmpDir,
|
|
115
|
-
stdio: ['pipe', 'pipe', 'pipe']
|
|
116
|
-
});
|
|
138
|
+
const gitResult = runStatusline(gitInput);
|
|
117
139
|
|
|
118
140
|
test('Git input processed without error', () => {
|
|
119
141
|
assertTrue(gitResult.length > 0, 'Should produce output for git repo');
|
|
@@ -153,10 +175,7 @@ const contextInput = JSON.stringify({
|
|
|
153
175
|
});
|
|
154
176
|
|
|
155
177
|
try {
|
|
156
|
-
const contextResult =
|
|
157
|
-
encoding: 'utf8',
|
|
158
|
-
stdio: ['pipe', 'pipe', 'pipe']
|
|
159
|
-
});
|
|
178
|
+
const contextResult = runStatusline(contextInput);
|
|
160
179
|
|
|
161
180
|
test('Context window data processed', () => {
|
|
162
181
|
assertTrue(contextResult.length > 0, 'Should process context window data');
|
|
@@ -180,8 +199,6 @@ try {
|
|
|
180
199
|
|
|
181
200
|
console.log('\nTEST 4: JSON with Cost Info\n');
|
|
182
201
|
|
|
183
|
-
process.env.CLAUDE_BILLING_MODE = 'api';
|
|
184
|
-
|
|
185
202
|
const costInput = JSON.stringify({
|
|
186
203
|
model: { display_name: 'Claude' },
|
|
187
204
|
workspace: { current_dir: '/home/user' },
|
|
@@ -194,11 +211,7 @@ const costInput = JSON.stringify({
|
|
|
194
211
|
});
|
|
195
212
|
|
|
196
213
|
try {
|
|
197
|
-
const costResult =
|
|
198
|
-
encoding: 'utf8',
|
|
199
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
200
|
-
env: { ...process.env, CLAUDE_BILLING_MODE: 'api' }
|
|
201
|
-
});
|
|
214
|
+
const costResult = runStatusline(costInput, { CLAUDE_BILLING_MODE: 'api' });
|
|
202
215
|
|
|
203
216
|
test('Cost info displayed in API mode', () => {
|
|
204
217
|
assertTrue(costResult.length > 0, 'Should display cost info');
|
|
@@ -222,10 +235,7 @@ try {
|
|
|
222
235
|
console.log('\nTEST 5: Invalid JSON Handling\n');
|
|
223
236
|
|
|
224
237
|
try {
|
|
225
|
-
const invalidResult =
|
|
226
|
-
encoding: 'utf8',
|
|
227
|
-
stdio: ['pipe', 'pipe', 'pipe']
|
|
228
|
-
});
|
|
238
|
+
const invalidResult = runStatusline('not valid json');
|
|
229
239
|
|
|
230
240
|
test('Invalid JSON produces fallback output', () => {
|
|
231
241
|
assertTrue(invalidResult.length > 0, 'Should produce fallback output');
|
|
@@ -247,10 +257,7 @@ try {
|
|
|
247
257
|
console.log('\nTEST 6: Empty Input Handling\n');
|
|
248
258
|
|
|
249
259
|
try {
|
|
250
|
-
const emptyResult =
|
|
251
|
-
encoding: 'utf8',
|
|
252
|
-
stdio: ['pipe', 'pipe', 'pipe']
|
|
253
|
-
});
|
|
260
|
+
const emptyResult = runStatusline('');
|
|
254
261
|
|
|
255
262
|
test('Empty input handled', () => {
|
|
256
263
|
// Should either error gracefully or produce fallback
|
|
@@ -281,10 +288,7 @@ const multilineInput = JSON.stringify({
|
|
|
281
288
|
});
|
|
282
289
|
|
|
283
290
|
try {
|
|
284
|
-
const multilineResult =
|
|
285
|
-
encoding: 'utf8',
|
|
286
|
-
stdio: ['pipe', 'pipe', 'pipe']
|
|
287
|
-
});
|
|
291
|
+
const multilineResult = runStatusline(multilineInput);
|
|
288
292
|
|
|
289
293
|
test('Multi-line output generates content', () => {
|
|
290
294
|
assertTrue(multilineResult.length > 0, 'Should generate output');
|
|
@@ -322,10 +326,7 @@ const expandInput = JSON.stringify({
|
|
|
322
326
|
});
|
|
323
327
|
|
|
324
328
|
try {
|
|
325
|
-
const expandResult =
|
|
326
|
-
encoding: 'utf8',
|
|
327
|
-
stdio: ['pipe', 'pipe', 'pipe']
|
|
328
|
-
});
|
|
329
|
+
const expandResult = runStatusline(expandInput);
|
|
329
330
|
|
|
330
331
|
test('Home directory expanded to tilde', () => {
|
|
331
332
|
assertTrue(expandResult.includes('~') || expandResult.includes('projects'), 'Should expand or contain path');
|
|
@@ -352,11 +353,7 @@ const colorInput = JSON.stringify({
|
|
|
352
353
|
|
|
353
354
|
try {
|
|
354
355
|
// Test with NO_COLOR=1
|
|
355
|
-
const noColorResult =
|
|
356
|
-
encoding: 'utf8',
|
|
357
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
358
|
-
env: { ...process.env, NO_COLOR: '1' }
|
|
359
|
-
});
|
|
356
|
+
const noColorResult = runStatusline(colorInput, { NO_COLOR: '1' });
|
|
360
357
|
|
|
361
358
|
test('NO_COLOR=1 produces output', () => {
|
|
362
359
|
assertTrue(noColorResult.length > 0, 'Should produce output with NO_COLOR=1');
|
|
@@ -390,11 +387,7 @@ const wideInput = JSON.stringify({
|
|
|
390
387
|
|
|
391
388
|
let wideLines = 0;
|
|
392
389
|
try {
|
|
393
|
-
const wideResult =
|
|
394
|
-
encoding: 'utf8',
|
|
395
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
396
|
-
env: { ...process.env, COLUMNS: '160' }
|
|
397
|
-
});
|
|
390
|
+
const wideResult = runStatusline(wideInput, { COLUMNS: '160' });
|
|
398
391
|
wideLines = wideResult.trim().split('\n').length;
|
|
399
392
|
|
|
400
393
|
test('Wide terminal (160 cols) produces output', () => {
|
|
@@ -425,11 +418,7 @@ const narrowInput = JSON.stringify({
|
|
|
425
418
|
});
|
|
426
419
|
|
|
427
420
|
try {
|
|
428
|
-
const narrowResult =
|
|
429
|
-
encoding: 'utf8',
|
|
430
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
431
|
-
env: { ...process.env, COLUMNS: '80' }
|
|
432
|
-
});
|
|
421
|
+
const narrowResult = runStatusline(narrowInput, { COLUMNS: '80' });
|
|
433
422
|
const narrowLines = narrowResult.trim().split('\n').length;
|
|
434
423
|
|
|
435
424
|
test('Narrow terminal (80 cols) produces output', () => {
|
|
@@ -463,11 +452,7 @@ const longPathInput = JSON.stringify({
|
|
|
463
452
|
});
|
|
464
453
|
|
|
465
454
|
try {
|
|
466
|
-
const longPathResult =
|
|
467
|
-
encoding: 'utf8',
|
|
468
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
469
|
-
env: { ...process.env, COLUMNS: '100' }
|
|
470
|
-
});
|
|
455
|
+
const longPathResult = runStatusline(longPathInput, { COLUMNS: '100' });
|
|
471
456
|
|
|
472
457
|
test('Long path produces output without crash', () => {
|
|
473
458
|
assertTrue(longPathResult.length > 0, 'Should produce output');
|
|
@@ -497,11 +482,7 @@ const longModelInput = JSON.stringify({
|
|
|
497
482
|
});
|
|
498
483
|
|
|
499
484
|
try {
|
|
500
|
-
const longModelResult =
|
|
501
|
-
encoding: 'utf8',
|
|
502
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
503
|
-
env: { ...process.env, COLUMNS: '100' }
|
|
504
|
-
});
|
|
485
|
+
const longModelResult = runStatusline(longModelInput, { COLUMNS: '100' });
|
|
505
486
|
|
|
506
487
|
test('Long model name produces output', () => {
|
|
507
488
|
assertTrue(longModelResult.length > 0, 'Should produce output');
|
|
@@ -580,10 +561,7 @@ const agentTodoInput = JSON.stringify({
|
|
|
580
561
|
});
|
|
581
562
|
|
|
582
563
|
try {
|
|
583
|
-
const agentTodoResult =
|
|
584
|
-
encoding: 'utf8',
|
|
585
|
-
stdio: ['pipe', 'pipe', 'pipe']
|
|
586
|
-
});
|
|
564
|
+
const agentTodoResult = runStatusline(agentTodoInput);
|
|
587
565
|
|
|
588
566
|
test('Agent/Todo tracking produces output', () => {
|
|
589
567
|
assertTrue(agentTodoResult.length > 0, 'Should produce output');
|
|
@@ -624,10 +602,7 @@ const zeroContextInput = JSON.stringify({
|
|
|
624
602
|
});
|
|
625
603
|
|
|
626
604
|
try {
|
|
627
|
-
const zeroResult =
|
|
628
|
-
encoding: 'utf8',
|
|
629
|
-
stdio: ['pipe', 'pipe', 'pipe']
|
|
630
|
-
});
|
|
605
|
+
const zeroResult = runStatusline(zeroContextInput);
|
|
631
606
|
|
|
632
607
|
test('Zero context produces output', () => {
|
|
633
608
|
assertTrue(zeroResult.length > 0, 'Should produce output');
|
|
@@ -638,11 +613,7 @@ try {
|
|
|
638
613
|
|
|
639
614
|
// Test with very small terminal
|
|
640
615
|
try {
|
|
641
|
-
const tinyResult =
|
|
642
|
-
encoding: 'utf8',
|
|
643
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
644
|
-
env: { ...process.env, COLUMNS: '40' }
|
|
645
|
-
});
|
|
616
|
+
const tinyResult = runStatusline(wideInput, { COLUMNS: '40' });
|
|
646
617
|
|
|
647
618
|
test('Very narrow terminal (40 cols) handles gracefully', () => {
|
|
648
619
|
assertTrue(tinyResult.length > 0, 'Should produce output even at 40 cols');
|
|
@@ -138,9 +138,9 @@ const scenarios = [
|
|
|
138
138
|
desc: 'Grep in src'
|
|
139
139
|
},
|
|
140
140
|
{
|
|
141
|
-
input: { tool_name: 'Glob', tool_input: { pattern: '
|
|
141
|
+
input: { tool_name: 'Glob', tool_input: { pattern: 'src/**/*.ts' } },
|
|
142
142
|
expected: 'ALLOWED',
|
|
143
|
-
desc: 'Glob
|
|
143
|
+
desc: 'Glob scoped .ts files in src'
|
|
144
144
|
},
|
|
145
145
|
{
|
|
146
146
|
input: { tool_name: 'Bash', tool_input: { command: 'find packages -name "*.json" | head' } },
|
|
@@ -9,7 +9,7 @@ const { execSync } = require('child_process');
|
|
|
9
9
|
const fs = require('fs');
|
|
10
10
|
const path = require('path');
|
|
11
11
|
|
|
12
|
-
const scriptPath = path.join(__dirname, '..', 'scout-block
|
|
12
|
+
const scriptPath = path.join(__dirname, '..', 'scout-block.cjs');
|
|
13
13
|
const ckignorePath = path.join(__dirname, '..', '..', '.ckignore');
|
|
14
14
|
const ckignoreBackupPath = ckignorePath + '.backup';
|
|
15
15
|
|
|
@@ -23,7 +23,7 @@ if (fs.existsSync(ckignorePath)) {
|
|
|
23
23
|
function runTest(name, input, expected) {
|
|
24
24
|
try {
|
|
25
25
|
const inputJson = JSON.stringify(input);
|
|
26
|
-
execSync(`
|
|
26
|
+
execSync(`node "${scriptPath}"`, {
|
|
27
27
|
input: inputJson,
|
|
28
28
|
encoding: 'utf-8',
|
|
29
29
|
stdio: ['pipe', 'pipe', 'pipe']
|
|
@@ -48,6 +48,11 @@ function restoreCkignore() {
|
|
|
48
48
|
if (fs.existsSync(ckignoreBackupPath)) {
|
|
49
49
|
fs.unlinkSync(ckignoreBackupPath);
|
|
50
50
|
}
|
|
51
|
+
} else {
|
|
52
|
+
// If there was no original .ckignore, remove the test-created one
|
|
53
|
+
if (fs.existsSync(ckignorePath)) {
|
|
54
|
+
fs.unlinkSync(ckignorePath);
|
|
55
|
+
}
|
|
51
56
|
}
|
|
52
57
|
}
|
|
53
58
|
|
package/package.json
CHANGED
|
@@ -1,36 +1,32 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ngxtm/devkit",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "
|
|
5
|
-
"main": "cli/
|
|
3
|
+
"version": "3.0.1",
|
|
4
|
+
"description": "Per-project AI skills with smart tech detection - lightweight and context-optimized",
|
|
5
|
+
"main": "cli/index.js",
|
|
6
6
|
"bin": {
|
|
7
7
|
"devkit": "cli/index.js"
|
|
8
8
|
},
|
|
9
9
|
"scripts": {
|
|
10
|
-
"
|
|
10
|
+
"build": "npm run merge-commands && npm run organize-rules && npm run generate-index",
|
|
11
|
+
"merge-commands": "node scripts/merge-commands.js",
|
|
12
|
+
"organize-rules": "node scripts/organize-rules.js",
|
|
11
13
|
"generate-index": "node scripts/generate-index.js",
|
|
14
|
+
"test": "node cli/index.js detect",
|
|
12
15
|
"sync": "python scripts/sync_all.py",
|
|
13
|
-
"validate": "python scripts/validate_skills.py"
|
|
14
|
-
"update-matrix": "python scripts/update_matrix.py"
|
|
16
|
+
"validate": "python scripts/validate_skills.py"
|
|
15
17
|
},
|
|
16
18
|
"files": [
|
|
17
19
|
"cli/",
|
|
18
|
-
"
|
|
19
|
-
"
|
|
20
|
-
"commands/",
|
|
21
|
-
"commands-claudekit/",
|
|
20
|
+
"merged-commands/",
|
|
21
|
+
"templates/",
|
|
22
22
|
"skills/",
|
|
23
|
-
"
|
|
24
|
-
"rules
|
|
23
|
+
"scripts/merge-commands.js",
|
|
24
|
+
"scripts/organize-rules.js",
|
|
25
|
+
"scripts/generate-index.js",
|
|
25
26
|
"hooks/",
|
|
26
|
-
"
|
|
27
|
-
"
|
|
28
|
-
"
|
|
29
|
-
"statusline.cjs",
|
|
30
|
-
"statusline.ps1",
|
|
31
|
-
"statusline.sh",
|
|
32
|
-
"SKILLS_INDEX.md",
|
|
33
|
-
"skills-index.json"
|
|
27
|
+
"skills-index.json",
|
|
28
|
+
"rules-index.json",
|
|
29
|
+
"SKILLS_INDEX.md"
|
|
34
30
|
],
|
|
35
31
|
"keywords": [
|
|
36
32
|
"ai",
|
package/rules-index.json
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "1.0.0",
|
|
3
|
+
"generatedAt": "2026-01-28T15:40:42.094Z",
|
|
4
|
+
"templates": {
|
|
5
|
+
"dart": {
|
|
6
|
+
"path": "templates/dart/rules",
|
|
7
|
+
"rules": [
|
|
8
|
+
"dart"
|
|
9
|
+
],
|
|
10
|
+
"sizeKB": 4
|
|
11
|
+
},
|
|
12
|
+
"flutter": {
|
|
13
|
+
"path": "templates/flutter/rules",
|
|
14
|
+
"rules": [
|
|
15
|
+
"flutter"
|
|
16
|
+
],
|
|
17
|
+
"sizeKB": 89
|
|
18
|
+
},
|
|
19
|
+
"golang": {
|
|
20
|
+
"path": "templates/golang/rules",
|
|
21
|
+
"rules": [
|
|
22
|
+
"golang"
|
|
23
|
+
],
|
|
24
|
+
"sizeKB": 141
|
|
25
|
+
},
|
|
26
|
+
"java": {
|
|
27
|
+
"path": "templates/java/rules",
|
|
28
|
+
"rules": [
|
|
29
|
+
"java"
|
|
30
|
+
],
|
|
31
|
+
"sizeKB": 150
|
|
32
|
+
},
|
|
33
|
+
"javascript": {
|
|
34
|
+
"path": "templates/javascript/rules",
|
|
35
|
+
"rules": [
|
|
36
|
+
"javascript"
|
|
37
|
+
],
|
|
38
|
+
"sizeKB": 12
|
|
39
|
+
},
|
|
40
|
+
"nestjs": {
|
|
41
|
+
"path": "templates/nestjs/rules",
|
|
42
|
+
"rules": [
|
|
43
|
+
"nestjs"
|
|
44
|
+
],
|
|
45
|
+
"sizeKB": 105
|
|
46
|
+
},
|
|
47
|
+
"nextjs": {
|
|
48
|
+
"path": "templates/nextjs/rules",
|
|
49
|
+
"rules": [
|
|
50
|
+
"nextjs"
|
|
51
|
+
],
|
|
52
|
+
"sizeKB": 74
|
|
53
|
+
},
|
|
54
|
+
"react": {
|
|
55
|
+
"path": "templates/react/rules",
|
|
56
|
+
"rules": [
|
|
57
|
+
"react"
|
|
58
|
+
],
|
|
59
|
+
"sizeKB": 34
|
|
60
|
+
},
|
|
61
|
+
"rust": {
|
|
62
|
+
"path": "templates/rust/rules",
|
|
63
|
+
"rules": [
|
|
64
|
+
"rust"
|
|
65
|
+
],
|
|
66
|
+
"sizeKB": 134
|
|
67
|
+
},
|
|
68
|
+
"typescript": {
|
|
69
|
+
"path": "templates/typescript/rules",
|
|
70
|
+
"rules": [
|
|
71
|
+
"typescript"
|
|
72
|
+
],
|
|
73
|
+
"sizeKB": 17
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Generate Skills Index
|
|
5
|
+
*
|
|
6
|
+
* Scans all skills and creates a single SKILLS_INDEX.md file
|
|
7
|
+
* containing summaries of all available skills.
|
|
8
|
+
*
|
|
9
|
+
* This allows Claude to know what skills exist without loading
|
|
10
|
+
* all 3500+ files into context.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
const fs = require('fs');
|
|
14
|
+
const path = require('path');
|
|
15
|
+
|
|
16
|
+
const SKILLS_DIR = path.join(__dirname, '..', 'skills');
|
|
17
|
+
const OUTPUT_FILE = path.join(__dirname, '..', 'SKILLS_INDEX.md');
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Parse YAML frontmatter from markdown file
|
|
21
|
+
*/
|
|
22
|
+
function parseFrontmatter(content) {
|
|
23
|
+
const match = content.match(/^---\n([\s\S]*?)\n---/);
|
|
24
|
+
if (!match) return {};
|
|
25
|
+
|
|
26
|
+
const yaml = match[1];
|
|
27
|
+
const result = {};
|
|
28
|
+
|
|
29
|
+
// Simple YAML parser for name/description
|
|
30
|
+
const lines = yaml.split('\n');
|
|
31
|
+
for (const line of lines) {
|
|
32
|
+
const colonIndex = line.indexOf(':');
|
|
33
|
+
if (colonIndex > 0) {
|
|
34
|
+
const key = line.slice(0, colonIndex).trim();
|
|
35
|
+
let value = line.slice(colonIndex + 1).trim();
|
|
36
|
+
// Remove quotes if present
|
|
37
|
+
if ((value.startsWith('"') && value.endsWith('"')) ||
|
|
38
|
+
(value.startsWith("'") && value.endsWith("'"))) {
|
|
39
|
+
value = value.slice(1, -1);
|
|
40
|
+
}
|
|
41
|
+
result[key] = value;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return result;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Get first paragraph after frontmatter as description fallback
|
|
50
|
+
*/
|
|
51
|
+
function getFirstParagraph(content) {
|
|
52
|
+
// Remove frontmatter
|
|
53
|
+
const withoutFrontmatter = content.replace(/^---[\s\S]*?---\n*/, '');
|
|
54
|
+
// Remove title
|
|
55
|
+
const withoutTitle = withoutFrontmatter.replace(/^#[^\n]*\n*/, '');
|
|
56
|
+
// Get first non-empty paragraph
|
|
57
|
+
const paragraphs = withoutTitle.split(/\n\n+/);
|
|
58
|
+
for (const p of paragraphs) {
|
|
59
|
+
const trimmed = p.trim();
|
|
60
|
+
if (trimmed && !trimmed.startsWith('#') && !trimmed.startsWith('```')) {
|
|
61
|
+
// Limit to 200 chars
|
|
62
|
+
return trimmed.slice(0, 200) + (trimmed.length > 200 ? '...' : '');
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return '';
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Scan a skill directory and extract metadata
|
|
70
|
+
*/
|
|
71
|
+
function scanSkill(skillPath, skillName) {
|
|
72
|
+
const skillFile = path.join(skillPath, 'SKILL.md');
|
|
73
|
+
const agentsFile = path.join(skillPath, 'AGENTS.md');
|
|
74
|
+
|
|
75
|
+
let content = '';
|
|
76
|
+
let sourceFile = '';
|
|
77
|
+
|
|
78
|
+
if (fs.existsSync(skillFile)) {
|
|
79
|
+
content = fs.readFileSync(skillFile, 'utf-8');
|
|
80
|
+
sourceFile = 'SKILL.md';
|
|
81
|
+
} else if (fs.existsSync(agentsFile)) {
|
|
82
|
+
content = fs.readFileSync(agentsFile, 'utf-8');
|
|
83
|
+
sourceFile = 'AGENTS.md';
|
|
84
|
+
} else {
|
|
85
|
+
// Try to find any .md file
|
|
86
|
+
const files = fs.readdirSync(skillPath).filter(f => f.endsWith('.md'));
|
|
87
|
+
if (files.length > 0) {
|
|
88
|
+
content = fs.readFileSync(path.join(skillPath, files[0]), 'utf-8');
|
|
89
|
+
sourceFile = files[0];
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (!content) {
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const frontmatter = parseFrontmatter(content);
|
|
98
|
+
|
|
99
|
+
return {
|
|
100
|
+
name: frontmatter.name || skillName,
|
|
101
|
+
description: frontmatter.description || getFirstParagraph(content),
|
|
102
|
+
path: `skills/${skillName}`,
|
|
103
|
+
sourceFile
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Categorize skills based on name patterns
|
|
109
|
+
*/
|
|
110
|
+
function categorizeSkill(name) {
|
|
111
|
+
const lowerName = name.toLowerCase();
|
|
112
|
+
|
|
113
|
+
if (/react|next|remix|vue|angular|svelte/.test(lowerName)) return 'Frontend Frameworks';
|
|
114
|
+
if (/node|express|nest|fastify|hono/.test(lowerName)) return 'Backend/Node.js';
|
|
115
|
+
if (/python|django|flask|fastapi/.test(lowerName)) return 'Python';
|
|
116
|
+
if (/database|postgres|mysql|mongo|redis|sql/.test(lowerName)) return 'Databases';
|
|
117
|
+
if (/docker|kubernetes|k8s|ci|cd|deploy|aws|cloud|terraform/.test(lowerName)) return 'DevOps/Cloud';
|
|
118
|
+
if (/test|jest|playwright|cypress|vitest/.test(lowerName)) return 'Testing';
|
|
119
|
+
if (/security|auth|owasp|crypto/.test(lowerName)) return 'Security';
|
|
120
|
+
if (/ai|agent|llm|mcp|prompt|openai|anthropic/.test(lowerName)) return 'AI/Agents';
|
|
121
|
+
if (/mobile|react-native|flutter|ios|android/.test(lowerName)) return 'Mobile';
|
|
122
|
+
if (/git|review|debug|refactor|documentation/.test(lowerName)) return 'Development Tools';
|
|
123
|
+
if (/api|rest|graphql|grpc/.test(lowerName)) return 'API Design';
|
|
124
|
+
if (/css|tailwind|style|animation|ui|ux/.test(lowerName)) return 'UI/Styling';
|
|
125
|
+
if (/typescript|javascript|js|ts/.test(lowerName)) return 'TypeScript/JavaScript';
|
|
126
|
+
|
|
127
|
+
return 'Other';
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Main function
|
|
132
|
+
*/
|
|
133
|
+
function generateIndex() {
|
|
134
|
+
console.log('Scanning skills directory...');
|
|
135
|
+
|
|
136
|
+
if (!fs.existsSync(SKILLS_DIR)) {
|
|
137
|
+
console.error('Skills directory not found:', SKILLS_DIR);
|
|
138
|
+
process.exit(1);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
const skillDirs = fs.readdirSync(SKILLS_DIR, { withFileTypes: true })
|
|
142
|
+
.filter(d => d.isDirectory() && !d.name.startsWith('.'))
|
|
143
|
+
.map(d => d.name)
|
|
144
|
+
.sort();
|
|
145
|
+
|
|
146
|
+
console.log(`Found ${skillDirs.length} skill directories`);
|
|
147
|
+
|
|
148
|
+
const skills = [];
|
|
149
|
+
const categorized = {};
|
|
150
|
+
|
|
151
|
+
for (const skillName of skillDirs) {
|
|
152
|
+
const skillPath = path.join(SKILLS_DIR, skillName);
|
|
153
|
+
const skillInfo = scanSkill(skillPath, skillName);
|
|
154
|
+
|
|
155
|
+
if (skillInfo) {
|
|
156
|
+
skills.push(skillInfo);
|
|
157
|
+
|
|
158
|
+
const category = categorizeSkill(skillName);
|
|
159
|
+
if (!categorized[category]) {
|
|
160
|
+
categorized[category] = [];
|
|
161
|
+
}
|
|
162
|
+
categorized[category].push(skillInfo);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
console.log(`Extracted metadata from ${skills.length} skills`);
|
|
167
|
+
|
|
168
|
+
// Generate markdown
|
|
169
|
+
let output = `# Skills Index
|
|
170
|
+
|
|
171
|
+
> Auto-generated index of ${skills.length} available skills.
|
|
172
|
+
> Use this to discover skills without loading all files into context.
|
|
173
|
+
>
|
|
174
|
+
> **To use a skill**: Read the full skill at \`~/.claude/skills/<skill-name>/SKILL.md\`
|
|
175
|
+
|
|
176
|
+
## Quick Reference
|
|
177
|
+
|
|
178
|
+
| Category | Count |
|
|
179
|
+
|----------|-------|
|
|
180
|
+
`;
|
|
181
|
+
|
|
182
|
+
// Sort categories by count
|
|
183
|
+
const sortedCategories = Object.entries(categorized)
|
|
184
|
+
.sort((a, b) => b[1].length - a[1].length);
|
|
185
|
+
|
|
186
|
+
for (const [category, categorySkills] of sortedCategories) {
|
|
187
|
+
output += `| ${category} | ${categorySkills.length} |\n`;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
output += `\n---\n\n`;
|
|
191
|
+
|
|
192
|
+
// Output by category
|
|
193
|
+
for (const [category, categorySkills] of sortedCategories) {
|
|
194
|
+
output += `## ${category}\n\n`;
|
|
195
|
+
|
|
196
|
+
for (const skill of categorySkills) {
|
|
197
|
+
const desc = skill.description
|
|
198
|
+
? skill.description.replace(/\n/g, ' ').slice(0, 150)
|
|
199
|
+
: 'No description';
|
|
200
|
+
output += `### ${skill.name}\n`;
|
|
201
|
+
output += `\`${skill.path}\`\n\n`;
|
|
202
|
+
output += `${desc}${skill.description && skill.description.length > 150 ? '...' : ''}\n\n`;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// Write output
|
|
207
|
+
fs.writeFileSync(OUTPUT_FILE, output);
|
|
208
|
+
console.log(`\nGenerated: ${OUTPUT_FILE}`);
|
|
209
|
+
console.log(`File size: ${(fs.statSync(OUTPUT_FILE).size / 1024).toFixed(1)} KB`);
|
|
210
|
+
|
|
211
|
+
// Also generate a compact JSON version for programmatic use
|
|
212
|
+
const jsonOutput = path.join(__dirname, '..', 'skills-index.json');
|
|
213
|
+
const jsonData = skills.map(s => ({
|
|
214
|
+
name: s.name,
|
|
215
|
+
path: s.path,
|
|
216
|
+
description: s.description ? s.description.slice(0, 200) : ''
|
|
217
|
+
}));
|
|
218
|
+
fs.writeFileSync(jsonOutput, JSON.stringify(jsonData, null, 2));
|
|
219
|
+
console.log(`Generated: ${jsonOutput}`);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// Run
|
|
223
|
+
generateIndex();
|