novahiz 0.2.2 → 0.2.5
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/NOTICE.md +25 -15
- package/README.md +353 -355
- package/adapters/README.md +1 -1
- package/adapters/opencode/agent/novahiz.md +1 -2
- package/adapters/opencode/commands/novahiz-init.md +10 -0
- package/adapters/opencode/instructions.md +1 -1
- package/adapters/opencode/novahiz.ts +182 -4
- package/bin/novahiz.cmd +2 -2
- package/catalog/categories.json +1085 -1093
- package/catalog/overrides.json +12 -13
- package/catalog/providers.json +18 -34
- package/catalog/rules.json +15 -22
- package/docs/ARCHITECTURE.md +2 -2
- package/docs/CATALOG.md +7 -6
- package/docs/CONFIGURATION.md +5 -5
- package/docs/CONSTITUTION.md +4 -4
- package/docs/GATE.md +7 -11
- package/docs/HARNESSES.md +11 -0
- package/docs/INSTALL.md +7 -5
- package/docs/PLUGIN.md +24 -6
- package/docs/PROVIDERS.md +12 -10
- package/docs/ROADMAPS.md +4 -3
- package/docs/RULES.md +11 -10
- package/install/bootstrap.mjs +9 -19
- package/install/install.mjs +23 -41
- package/mcp/novahiz-tools/index.mjs +35 -6
- package/novahiz.config.example.json +1 -5
- package/package.json +6 -7
- package/skills/apple-ui-audit/SKILL.md +95 -0
- package/skills/apple-ui-audit/references/screen-walkthrough.md +29 -0
- package/skills/browser-session/SKILL.md +61 -0
- package/skills/browser-session/references/session-run-sheet.md +30 -0
- package/skills/browser-session/scripts/browser_session_preflight.mjs +74 -0
- package/skills/browser-session/scripts/sample-run.json +5 -0
- package/skills/code-standards/SKILL.md +85 -0
- package/skills/code-standards/references/pr-review-worksheet.md +35 -0
- package/skills/design-token-pipeline/SKILL.md +85 -0
- package/skills/design-token-pipeline/references/dtcg-sample.json +37 -0
- package/skills/llm-threat-review/SKILL.md +99 -0
- package/skills/llm-threat-review/references/review-worksheet.md +34 -0
- package/skills/llm-threat-review/scripts/llm_risk_lint.mjs +105 -0
- package/skills/novahiz-audit/SKILL.md +1 -1
- package/skills/novahiz-gate/SKILL.md +7 -6
- package/skills/novahiz-humanizer/SKILL.md +1 -1
- package/skills/novahiz-implement/SKILL.md +1 -1
- package/skills/novahiz-init/SKILL.md +112 -0
- package/skills/novahiz-planner/SKILL.md +1 -2
- package/skills/openapi-mcp-server/SKILL.md +76 -0
- package/skills/openapi-mcp-server/references/mcp-ship-checklist.md +30 -0
- package/skills/openapi-mcp-server/references/tool-worksheet.md +30 -0
- package/skills/openapi-mcp-server/scripts/openapi_mcp_lint.mjs +133 -0
- package/skills/package-risk-audit/SKILL.md +83 -0
- package/skills/package-risk-audit/references/intake-worksheet.md +19 -0
- package/skills/package-risk-audit/scripts/dep_risk_lint.mjs +131 -0
- package/skills/secrets-hygiene/SKILL.md +62 -0
- package/skills/secrets-hygiene/references/rotation-playbook.md +27 -0
- package/skills/secrets-hygiene/scripts/secret_scan.mjs +120 -0
- package/skills/skill-authoring/SKILL.md +93 -0
- package/skills/skill-authoring/references/skill-template.md +59 -0
- package/skills/skill-authoring/scripts/skill_frontmatter_lint.mjs +65 -0
- package/skills/skill-eval-loop/SKILL.md +103 -0
- package/skills/skill-eval-loop/references/negative-patterns.md +12 -0
- package/skills/skill-eval-loop/references/run-sheet.md +40 -0
- package/skills/skill-eval-loop/scripts/skill_structure_check.mjs +100 -0
- package/skills/ui-craft-rules/SKILL.md +96 -0
- package/skills/ui-slop-remover/SKILL.md +110 -0
- package/skills/ui-slop-remover/references/tell-catalogue.md +58 -0
- package/skills/ui-slop-remover/scripts/slop_lint.mjs +119 -0
- package/src/autodocs.ts +192 -0
- package/src/cli.ts +8 -1
- package/src/commands/autodocs.ts +250 -0
- package/src/commands/doctor.ts +226 -217
- package/src/commands/gate.ts +16 -5
- package/src/commands/init.ts +356 -0
- package/src/commands/task.ts +20 -7
- package/src/gate.ts +401 -401
- package/src/ledger.ts +39 -0
- package/src/targets.ts +43 -7
- package/bundled-skills/ab-testing/SKILL.md +0 -353
- package/bundled-skills/ab-testing/evals/evals.json +0 -105
- package/bundled-skills/ab-testing/references/sample-size-guide.md +0 -263
- package/bundled-skills/ab-testing/references/test-templates.md +0 -277
- package/bundled-skills/ad-creative/SKILL.md +0 -425
- package/bundled-skills/ad-creative/assets/creative-review-template.html +0 -400
- package/bundled-skills/ad-creative/evals/evals.json +0 -217
- package/bundled-skills/ad-creative/references/creative-review-page.md +0 -106
- package/bundled-skills/ad-creative/references/creative-roadmap.md +0 -118
- package/bundled-skills/ad-creative/references/generative-tools.md +0 -637
- package/bundled-skills/ad-creative/references/hook-system.md +0 -115
- package/bundled-skills/ad-creative/references/imessage-video-ads.md +0 -201
- package/bundled-skills/ad-creative/references/meta-creative-formats.md +0 -114
- package/bundled-skills/ad-creative/references/motion-video-ads.md +0 -126
- package/bundled-skills/ad-creative/references/platform-specs.md +0 -213
- package/bundled-skills/ad-creative/references/short-form-video-specs.md +0 -213
- package/bundled-skills/ad-creative/references/static-ad-templates.md +0 -308
- package/bundled-skills/ads/SKILL.md +0 -499
- package/bundled-skills/ads/evals/evals.json +0 -157
- package/bundled-skills/ads/references/abm-playbook.md +0 -93
- package/bundled-skills/ads/references/ad-copy-templates.md +0 -207
- package/bundled-skills/ads/references/audience-targeting.md +0 -243
- package/bundled-skills/ads/references/audit-guardrails.md +0 -83
- package/bundled-skills/ads/references/b2b-paid-playbook.md +0 -115
- package/bundled-skills/ads/references/conversion-tracking.md +0 -361
- package/bundled-skills/ads/references/creative-research-automation.md +0 -103
- package/bundled-skills/ads/references/google-ads-audit-checklist.md +0 -84
- package/bundled-skills/ads/references/google-search-playbook.md +0 -120
- package/bundled-skills/ads/references/linkedin-b2b-playbook.md +0 -107
- package/bundled-skills/ads/references/meta-decision-system.md +0 -176
- package/bundled-skills/ads/references/payback-period.md +0 -69
- package/bundled-skills/ads/references/platform-setup-checklists.md +0 -277
- package/bundled-skills/ads/references/rsa-output-spec.md +0 -88
- package/bundled-skills/agent-device/SKILL.md +0 -20
- package/bundled-skills/ai-seo/SKILL.md +0 -488
- package/bundled-skills/ai-seo/evals/evals.json +0 -135
- package/bundled-skills/ai-seo/references/agent-readiness.md +0 -57
- package/bundled-skills/ai-seo/references/citations-vs-recommendations.md +0 -85
- package/bundled-skills/ai-seo/references/content-patterns.md +0 -287
- package/bundled-skills/ai-seo/references/content-types.md +0 -71
- package/bundled-skills/ai-seo/references/format-volatility.md +0 -98
- package/bundled-skills/ai-seo/references/okf.md +0 -104
- package/bundled-skills/ai-seo/references/platform-ranking-factors.md +0 -154
- package/bundled-skills/ai-seo/references/youtube-ai-citations.md +0 -60
- package/bundled-skills/analytics/SKILL.md +0 -310
- package/bundled-skills/analytics/evals/evals.json +0 -90
- package/bundled-skills/analytics/references/event-library.md +0 -260
- package/bundled-skills/analytics/references/ga4-implementation.md +0 -300
- package/bundled-skills/analytics/references/gtm-implementation.md +0 -390
- package/bundled-skills/android-emulator/SKILL.md +0 -32
- package/bundled-skills/android-reverse-engineering/LICENSE +0 -190
- package/bundled-skills/android-reverse-engineering/SKILL.md +0 -313
- package/bundled-skills/android-reverse-engineering/references/api-extraction-patterns.md +0 -197
- package/bundled-skills/android-reverse-engineering/references/call-flow-analysis.md +0 -210
- package/bundled-skills/android-reverse-engineering/references/fernflower-usage.md +0 -115
- package/bundled-skills/android-reverse-engineering/references/jadx-usage.md +0 -116
- package/bundled-skills/android-reverse-engineering/references/kotlin-name-recovery.md +0 -108
- package/bundled-skills/android-reverse-engineering/references/setup-guide.md +0 -221
- package/bundled-skills/android-reverse-engineering/references/third_party_hosts.txt +0 -122
- package/bundled-skills/android-reverse-engineering/scripts/check-deps.ps1 +0 -165
- package/bundled-skills/android-reverse-engineering/scripts/check-deps.sh +0 -129
- package/bundled-skills/android-reverse-engineering/scripts/decompile.ps1 +0 -400
- package/bundled-skills/android-reverse-engineering/scripts/decompile.sh +0 -578
- package/bundled-skills/android-reverse-engineering/scripts/find-api-calls.ps1 +0 -121
- package/bundled-skills/android-reverse-engineering/scripts/find-api-calls.sh +0 -339
- package/bundled-skills/android-reverse-engineering/scripts/fingerprint.sh +0 -241
- package/bundled-skills/android-reverse-engineering/scripts/install-dep.ps1 +0 -345
- package/bundled-skills/android-reverse-engineering/scripts/install-dep.sh +0 -448
- package/bundled-skills/android-reverse-engineering/scripts/lookup-name.sh +0 -85
- package/bundled-skills/android-reverse-engineering/scripts/recover-kotlin-names.sh +0 -140
- package/bundled-skills/build-graph/SKILL.md +0 -38
- package/bundled-skills/claude-history-ingest/SKILL.md +0 -463
- package/bundled-skills/claude-history-ingest/references/claude-data-format.md +0 -118
- package/bundled-skills/codex-history-ingest/SKILL.md +0 -248
- package/bundled-skills/codex-history-ingest/references/codex-data-format.md +0 -82
- package/bundled-skills/cold-email/SKILL.md +0 -159
- package/bundled-skills/cold-email/evals/evals.json +0 -94
- package/bundled-skills/cold-email/references/benchmarks.md +0 -83
- package/bundled-skills/cold-email/references/follow-up-sequences.md +0 -81
- package/bundled-skills/cold-email/references/frameworks.md +0 -90
- package/bundled-skills/cold-email/references/personalization.md +0 -79
- package/bundled-skills/cold-email/references/subject-lines.md +0 -53
- package/bundled-skills/competitor-profiling/SKILL.md +0 -415
- package/bundled-skills/competitor-profiling/evals/evals.json +0 -85
- package/bundled-skills/competitor-profiling/references/templates.md +0 -167
- package/bundled-skills/competitor-profiling/references/tool-reference.md +0 -179
- package/bundled-skills/computer-use/SKILL.md +0 -41
- package/bundled-skills/content-strategy/SKILL.md +0 -439
- package/bundled-skills/content-strategy/evals/evals.json +0 -116
- package/bundled-skills/content-strategy/references/content-distribution.md +0 -83
- package/bundled-skills/content-strategy/references/headless-cms.md +0 -194
- package/bundled-skills/copilot-history-ingest/SKILL.md +0 -376
- package/bundled-skills/copilot-history-ingest/references/copilot-data-format.md +0 -321
- package/bundled-skills/copy-editing/SKILL.md +0 -457
- package/bundled-skills/copy-editing/evals/evals.json +0 -89
- package/bundled-skills/copy-editing/references/checklist.md +0 -66
- package/bundled-skills/copy-editing/references/content-refresh.md +0 -38
- package/bundled-skills/copy-editing/references/plain-english-alternatives.md +0 -394
- package/bundled-skills/copywriting/SKILL.md +0 -256
- package/bundled-skills/copywriting/evals/evals.json +0 -126
- package/bundled-skills/copywriting/references/copy-frameworks.md +0 -433
- package/bundled-skills/copywriting/references/natural-transitions.md +0 -272
- package/bundled-skills/cro/SKILL.md +0 -187
- package/bundled-skills/cro/evals/evals.json +0 -111
- package/bundled-skills/cro/references/experiments.md +0 -248
- package/bundled-skills/cro/references/form.md +0 -422
- package/bundled-skills/cross-linker/SKILL.md +0 -309
- package/bundled-skills/customer-research/SKILL.md +0 -305
- package/bundled-skills/customer-research/evals/evals.json +0 -176
- package/bundled-skills/customer-research/references/interviews-and-surveys.md +0 -155
- package/bundled-skills/customer-research/references/source-guides.md +0 -401
- package/bundled-skills/daily-update/SKILL.md +0 -223
- package/bundled-skills/dart-add-unit-test/SKILL.md +0 -122
- package/bundled-skills/dart-build-cli-app/SKILL.md +0 -185
- package/bundled-skills/dart-collect-coverage/SKILL.md +0 -141
- package/bundled-skills/dart-fix-runtime-errors/SKILL.md +0 -166
- package/bundled-skills/dart-generate-test-mocks/SKILL.md +0 -155
- package/bundled-skills/dart-migrate-to-checks-package/SKILL.md +0 -528
- package/bundled-skills/dart-resolve-package-conflicts/SKILL.md +0 -116
- package/bundled-skills/dart-run-static-analysis/SKILL.md +0 -104
- package/bundled-skills/dart-setup-ffi-assets/SKILL.md +0 -419
- package/bundled-skills/dart-use-doc-examples/SKILL.md +0 -96
- package/bundled-skills/dart-use-ffigen/SKILL.md +0 -218
- package/bundled-skills/dart-use-pattern-matching/SKILL.md +0 -146
- package/bundled-skills/dart-use-primary-constructors/SKILL.md +0 -262
- package/bundled-skills/dart-write-documentation/SKILL.md +0 -136
- package/bundled-skills/debug-issue/SKILL.md +0 -28
- package/bundled-skills/dogfood/SKILL.md +0 -27
- package/bundled-skills/eas-app-stores/SKILL.md +0 -176
- package/bundled-skills/eas-app-stores/agents/openai.yaml +0 -4
- package/bundled-skills/eas-app-stores/references/app-store-metadata.md +0 -497
- package/bundled-skills/eas-app-stores/references/ios-app-store.md +0 -376
- package/bundled-skills/eas-app-stores/references/native-ios.md +0 -167
- package/bundled-skills/eas-app-stores/references/play-store.md +0 -244
- package/bundled-skills/eas-app-stores/references/testflight.md +0 -62
- package/bundled-skills/eas-app-stores/references/workflows.md +0 -120
- package/bundled-skills/eas-hosting/SKILL.md +0 -431
- package/bundled-skills/eas-hosting/agents/openai.yaml +0 -4
- package/bundled-skills/eas-observe/SKILL.md +0 -54
- package/bundled-skills/eas-observe/agents/openai.yaml +0 -4
- package/bundled-skills/eas-observe/references/metrics.md +0 -98
- package/bundled-skills/eas-observe/references/queries.md +0 -403
- package/bundled-skills/eas-observe/references/setup.md +0 -476
- package/bundled-skills/eas-observe/references/third-party.md +0 -136
- package/bundled-skills/eas-simulator/SKILL.md +0 -208
- package/bundled-skills/eas-simulator/agents/openai.yaml +0 -4
- package/bundled-skills/eas-simulator/references/controllers.md +0 -106
- package/bundled-skills/eas-simulator/references/run-your-app.md +0 -224
- package/bundled-skills/eas-simulator/references/troubleshooting.md +0 -44
- package/bundled-skills/eas-update/SKILL.md +0 -146
- package/bundled-skills/eas-update/agents/openai.yaml +0 -4
- package/bundled-skills/eas-update-insights/SKILL.md +0 -238
- package/bundled-skills/eas-update-insights/agents/openai.yaml +0 -4
- package/bundled-skills/eas-update-insights/references/channel-insights-schema.md +0 -47
- package/bundled-skills/eas-update-insights/references/update-insights-schema.md +0 -69
- package/bundled-skills/eas-workflows/SKILL.md +0 -99
- package/bundled-skills/eas-workflows/agents/openai.yaml +0 -4
- package/bundled-skills/eas-workflows/scripts/fetch.js +0 -109
- package/bundled-skills/eas-workflows/scripts/package.json +0 -6
- package/bundled-skills/emails/SKILL.md +0 -311
- package/bundled-skills/emails/evals/evals.json +0 -93
- package/bundled-skills/emails/references/copy-guidelines.md +0 -113
- package/bundled-skills/emails/references/email-types.md +0 -515
- package/bundled-skills/emails/references/sequence-templates.md +0 -168
- package/bundled-skills/explore-codebase/SKILL.md +0 -29
- package/bundled-skills/expo-animation/LICENSE +0 -21
- package/bundled-skills/expo-animation/RECIPES.md +0 -385
- package/bundled-skills/expo-animation/SKILL.md +0 -267
- package/bundled-skills/expo-animation/agents/openai.yaml +0 -4
- package/bundled-skills/expo-app-clip/SKILL.md +0 -290
- package/bundled-skills/expo-app-clip/agents/openai.yaml +0 -4
- package/bundled-skills/expo-app-clip/references/native-module.md +0 -96
- package/bundled-skills/expo-brownfield/SKILL.md +0 -62
- package/bundled-skills/expo-brownfield/agents/openai.yaml +0 -4
- package/bundled-skills/expo-brownfield/references/brownfield-integrated.md +0 -526
- package/bundled-skills/expo-brownfield/references/brownfield-isolated.md +0 -451
- package/bundled-skills/expo-brownfield/references/comparison.md +0 -63
- package/bundled-skills/expo-brownfield/references/troubleshooting.md +0 -88
- package/bundled-skills/expo-data-fetching/SKILL.md +0 -478
- package/bundled-skills/expo-data-fetching/agents/openai.yaml +0 -4
- package/bundled-skills/expo-data-fetching/references/expo-router-loaders.md +0 -341
- package/bundled-skills/expo-data-fetching/references/offline-and-cancellation.md +0 -68
- package/bundled-skills/expo-design-system/SKILL.md +0 -376
- package/bundled-skills/expo-design-system/agents/openai.yaml +0 -4
- package/bundled-skills/expo-design-system/references/audit.md +0 -190
- package/bundled-skills/expo-design-system/references/native-slop.md +0 -74
- package/bundled-skills/expo-dev-client/SKILL.md +0 -182
- package/bundled-skills/expo-dev-client/agents/openai.yaml +0 -4
- package/bundled-skills/expo-dom/SKILL.md +0 -425
- package/bundled-skills/expo-dom/agents/openai.yaml +0 -4
- package/bundled-skills/expo-examples/SKILL.md +0 -106
- package/bundled-skills/expo-examples/agents/openai.yaml +0 -4
- package/bundled-skills/expo-examples/references/catalog.md +0 -105
- package/bundled-skills/expo-migrate-module/SKILL.md +0 -113
- package/bundled-skills/expo-migrate-module/agents/openai.yaml +0 -4
- package/bundled-skills/expo-migrate-module/references/compatibility.md +0 -73
- package/bundled-skills/expo-migrate-module/references/example.md +0 -212
- package/bundled-skills/expo-migrate-module/references/migration-map.md +0 -306
- package/bundled-skills/expo-module/SKILL.md +0 -151
- package/bundled-skills/expo-module/agents/openai.yaml +0 -4
- package/bundled-skills/expo-module/references/config-plugin.md +0 -90
- package/bundled-skills/expo-module/references/create-expo-module.md +0 -206
- package/bundled-skills/expo-module/references/lifecycle.md +0 -127
- package/bundled-skills/expo-module/references/module-config.md +0 -48
- package/bundled-skills/expo-module/references/native-module.md +0 -286
- package/bundled-skills/expo-module/references/native-view.md +0 -171
- package/bundled-skills/expo-native-ui/SKILL.md +0 -201
- package/bundled-skills/expo-native-ui/agents/openai.yaml +0 -4
- package/bundled-skills/expo-native-ui/references/controls.md +0 -231
- package/bundled-skills/expo-native-ui/references/gradients.md +0 -106
- package/bundled-skills/expo-native-ui/references/icons.md +0 -232
- package/bundled-skills/expo-native-ui/references/media.md +0 -193
- package/bundled-skills/expo-native-ui/references/storage.md +0 -121
- package/bundled-skills/expo-native-ui/references/visual-effects.md +0 -198
- package/bundled-skills/expo-native-ui/references/webgpu-three.md +0 -605
- package/bundled-skills/expo-overview/SKILL.md +0 -115
- package/bundled-skills/expo-overview/agents/openai.yaml +0 -4
- package/bundled-skills/expo-project-structure/SKILL.md +0 -114
- package/bundled-skills/expo-project-structure/agents/openai.yaml +0 -4
- package/bundled-skills/expo-router/SKILL.md +0 -240
- package/bundled-skills/expo-router/agents/openai.yaml +0 -4
- package/bundled-skills/expo-router/references/form-sheet.md +0 -253
- package/bundled-skills/expo-router/references/route-structure.md +0 -229
- package/bundled-skills/expo-router/references/search.md +0 -248
- package/bundled-skills/expo-router/references/tabs.md +0 -433
- package/bundled-skills/expo-router/references/toolbar-and-headers.md +0 -284
- package/bundled-skills/expo-router/references/zoom-transitions.md +0 -158
- package/bundled-skills/expo-skill-eval/SKILL.md +0 -314
- package/bundled-skills/expo-skill-eval/agents/visual-grader.md +0 -52
- package/bundled-skills/expo-skill-eval/references/design-rubric.md +0 -45
- package/bundled-skills/expo-skill-eval/references/runtime-matrix.md +0 -34
- package/bundled-skills/expo-skill-eval/scripts/check-static.sh +0 -64
- package/bundled-skills/expo-skill-eval/scripts/clean-fixture.sh +0 -56
- package/bundled-skills/expo-skill-eval/scripts/generate_viewer.py +0 -450
- package/bundled-skills/expo-skill-eval/scripts/latest-sdk.sh +0 -46
- package/bundled-skills/expo-skill-eval/scripts/make-fixture.sh +0 -95
- package/bundled-skills/expo-skill-eval/scripts/make-workspace.sh +0 -31
- package/bundled-skills/expo-skill-eval/scripts/snapshot-android.sh +0 -284
- package/bundled-skills/expo-skill-eval/scripts/snapshot-ios.sh +0 -132
- package/bundled-skills/expo-skill-eval/scripts/snapshot-web.sh +0 -61
- package/bundled-skills/expo-skill-feedback/SKILL.md +0 -87
- package/bundled-skills/expo-skill-feedback/agents/openai.yaml +0 -4
- package/bundled-skills/expo-skill-feedback/scripts/skill-event.cjs +0 -180
- package/bundled-skills/expo-skill-feedback/scripts/telemetry.cjs +0 -65
- package/bundled-skills/expo-skill-feedback/scripts/telemetry_common.cjs +0 -171
- package/bundled-skills/expo-ui/SKILL.md +0 -101
- package/bundled-skills/expo-ui/agents/openai.yaml +0 -4
- package/bundled-skills/expo-ui/references/drop-in-replacements.md +0 -27
- package/bundled-skills/expo-ui/references/jetpack-compose.md +0 -73
- package/bundled-skills/expo-ui/references/swift-ui.md +0 -73
- package/bundled-skills/expo-ui/references/universal.md +0 -104
- package/bundled-skills/expo-ui/scripts/list-components.js +0 -193
- package/bundled-skills/expo-upgrade/SKILL.md +0 -150
- package/bundled-skills/expo-upgrade/agents/openai.yaml +0 -4
- package/bundled-skills/expo-upgrade/references/expo-av-to-audio.md +0 -132
- package/bundled-skills/expo-upgrade/references/expo-av-to-video.md +0 -160
- package/bundled-skills/expo-upgrade/references/native-tabs.md +0 -124
- package/bundled-skills/expo-upgrade/references/new-architecture.md +0 -79
- package/bundled-skills/expo-upgrade/references/react-19.md +0 -79
- package/bundled-skills/expo-upgrade/references/react-compiler.md +0 -59
- package/bundled-skills/expo-upgrade/references/react-navigation-to-expo-router.md +0 -61
- package/bundled-skills/expo-web-to-native/SKILL.md +0 -91
- package/bundled-skills/expo-web-to-native/agents/openai.yaml +0 -4
- package/bundled-skills/expo-web-to-native/references/false-friends.md +0 -119
- package/bundled-skills/expo-web-to-native/references/native-patterns.md +0 -39
- package/bundled-skills/expo-web-to-native/references/run-as-goal.md +0 -48
- package/bundled-skills/expo-web-to-native/references/verify-on-device.md +0 -45
- package/bundled-skills/find-skills/SKILL.md +0 -141
- package/bundled-skills/flutter-add-integration-test/SKILL.md +0 -163
- package/bundled-skills/flutter-add-widget-preview/SKILL.md +0 -145
- package/bundled-skills/flutter-add-widget-test/SKILL.md +0 -154
- package/bundled-skills/flutter-apply-architecture-best-practices/SKILL.md +0 -162
- package/bundled-skills/flutter-build-responsive-layout/SKILL.md +0 -139
- package/bundled-skills/flutter-fix-layout-issues/SKILL.md +0 -130
- package/bundled-skills/flutter-implement-json-serialization/SKILL.md +0 -153
- package/bundled-skills/flutter-setup-declarative-routing/SKILL.md +0 -255
- package/bundled-skills/flutter-setup-localization/SKILL.md +0 -210
- package/bundled-skills/flutter-use-http-package/SKILL.md +0 -174
- package/bundled-skills/graph-colorize/SKILL.md +0 -180
- package/bundled-skills/hermes-history-ingest/SKILL.md +0 -239
- package/bundled-skills/hermes-history-ingest/references/hermes-data-format.md +0 -131
- package/bundled-skills/impl-validator/SKILL.md +0 -118
- package/bundled-skills/ios-simulator/SKILL.md +0 -32
- package/bundled-skills/json-canvas/SKILL.md +0 -244
- package/bundled-skills/json-canvas/references/EXAMPLES.md +0 -329
- package/bundled-skills/launch/SKILL.md +0 -381
- package/bundled-skills/launch/evals/evals.json +0 -106
- package/bundled-skills/llm-wiki/SKILL.md +0 -661
- package/bundled-skills/llm-wiki/references/WRITING.md +0 -28
- package/bundled-skills/llm-wiki/references/karpathy-pattern.md +0 -45
- package/bundled-skills/marketing-plan/SKILL.md +0 -300
- package/bundled-skills/marketing-plan/evals/evals.json +0 -112
- package/bundled-skills/marketing-plan/references/aarrr-framework.md +0 -180
- package/bundled-skills/marketing-plan/references/budget-planning.md +0 -168
- package/bundled-skills/marketing-plan/references/client-types.md +0 -373
- package/bundled-skills/marketing-plan/references/current-state-rubric.md +0 -255
- package/bundled-skills/marketing-plan/references/example-quietude.md +0 -972
- package/bundled-skills/marketing-plan/references/funding-stage-unlocks.md +0 -230
- package/bundled-skills/marketing-plan/references/growth-patterns.md +0 -190
- package/bundled-skills/marketing-plan/references/idea-cross-reference.md +0 -265
- package/bundled-skills/marketing-plan/references/measurement-framework.md +0 -213
- package/bundled-skills/marketing-plan/references/methodology.md +0 -363
- package/bundled-skills/marketing-plan/references/ops-stack-mapping.md +0 -197
- package/bundled-skills/marketing-plan/references/plan-template.md +0 -494
- package/bundled-skills/marketing-plan/references/team-and-agency-model.md +0 -278
- package/bundled-skills/marketing-psychology/SKILL.md +0 -455
- package/bundled-skills/marketing-psychology/evals/evals.json +0 -88
- package/bundled-skills/memory-bridge/SKILL.md +0 -163
- package/bundled-skills/memory-save/SKILL.md +0 -88
- package/bundled-skills/obsidian-bases/SKILL.md +0 -499
- package/bundled-skills/obsidian-bases/references/FUNCTIONS_REFERENCE.md +0 -173
- package/bundled-skills/obsidian-cli/SKILL.md +0 -106
- package/bundled-skills/obsidian-layout-adjustment/SKILL.md +0 -226
- package/bundled-skills/obsidian-layout-adjustment/evals/evals.json +0 -53
- package/bundled-skills/obsidian-layout-adjustment/references/workflow-reference.md +0 -212
- package/bundled-skills/obsidian-markdown/SKILL.md +0 -196
- package/bundled-skills/obsidian-markdown/references/CALLOUTS.md +0 -58
- package/bundled-skills/obsidian-markdown/references/EMBEDS.md +0 -70
- package/bundled-skills/obsidian-markdown/references/PROPERTIES.md +0 -61
- package/bundled-skills/offers/SKILL.md +0 -155
- package/bundled-skills/offers/evals/evals.json +0 -21
- package/bundled-skills/offers/references/bonus-stacking.md +0 -150
- package/bundled-skills/offers/references/examples.md +0 -215
- package/bundled-skills/offers/references/guarantee-design.md +0 -172
- package/bundled-skills/offers/references/offer-anatomy.md +0 -203
- package/bundled-skills/offers/references/offer-formats.md +0 -240
- package/bundled-skills/offers/references/saas-offers.md +0 -116
- package/bundled-skills/offers/references/scarcity-urgency.md +0 -175
- package/bundled-skills/offers/references/value-equation.md +0 -134
- package/bundled-skills/onboarding/SKILL.md +0 -261
- package/bundled-skills/onboarding/evals/evals.json +0 -108
- package/bundled-skills/onboarding/references/activation-models.md +0 -57
- package/bundled-skills/onboarding/references/experiments.md +0 -258
- package/bundled-skills/onboarding/references/minimum-path-to-value.md +0 -49
- package/bundled-skills/openclaw-history-ingest/SKILL.md +0 -257
- package/bundled-skills/openclaw-history-ingest/references/openclaw-data-format.md +0 -154
- package/bundled-skills/orchestration/SKILL.md +0 -69
- package/bundled-skills/pi-history-ingest/SKILL.md +0 -312
- package/bundled-skills/pricing/SKILL.md +0 -295
- package/bundled-skills/pricing/evals/evals.json +0 -119
- package/bundled-skills/pricing/references/pricing-models.md +0 -66
- package/bundled-skills/pricing/references/pricing-page-teardown.md +0 -85
- package/bundled-skills/pricing/references/research-methods.md +0 -152
- package/bundled-skills/pricing/references/tier-structure.md +0 -232
- package/bundled-skills/product-marketing/SKILL.md +0 -255
- package/bundled-skills/product-marketing/evals/evals.json +0 -98
- package/bundled-skills/prospecting/SKILL.md +0 -262
- package/bundled-skills/prospecting/evals/evals.json +0 -122
- package/bundled-skills/prospecting/references/b2b-prospecting.md +0 -106
- package/bundled-skills/prospecting/references/compliance.md +0 -123
- package/bundled-skills/prospecting/references/data-sources.md +0 -287
- package/bundled-skills/prospecting/references/demand-signals.md +0 -129
- package/bundled-skills/prospecting/references/local-prospecting.md +0 -165
- package/bundled-skills/prospecting/references/saas-prospecting.md +0 -123
- package/bundled-skills/refactor-safely/SKILL.md +0 -29
- package/bundled-skills/review-delta/SKILL.md +0 -46
- package/bundled-skills/review-pr/SKILL.md +0 -66
- package/bundled-skills/sales-enablement/SKILL.md +0 -359
- package/bundled-skills/sales-enablement/evals/evals.json +0 -91
- package/bundled-skills/sales-enablement/references/deck-frameworks.md +0 -263
- package/bundled-skills/sales-enablement/references/demo-scripts.md +0 -355
- package/bundled-skills/sales-enablement/references/objection-library.md +0 -270
- package/bundled-skills/sales-enablement/references/one-pager-templates.md +0 -208
- package/bundled-skills/seo-audit/SKILL.md +0 -499
- package/bundled-skills/seo-audit/evals/evals.json +0 -136
- package/bundled-skills/seo-audit/references/ai-writing-detection.md +0 -200
- package/bundled-skills/seo-audit/references/international-seo.md +0 -230
- package/bundled-skills/session-brain/SKILL.md +0 -101
- package/bundled-skills/session-search/SKILL.md +0 -97
- package/bundled-skills/social/SKILL.md +0 -413
- package/bundled-skills/social/evals/evals.json +0 -107
- package/bundled-skills/social/references/carousel-frameworks.md +0 -141
- package/bundled-skills/social/references/listening-sources-template.md +0 -123
- package/bundled-skills/social/references/listening.md +0 -283
- package/bundled-skills/social/references/platform-limits.md +0 -110
- package/bundled-skills/social/references/platforms.md +0 -170
- package/bundled-skills/social/references/post-templates.md +0 -179
- package/bundled-skills/social/references/reverse-engineering.md +0 -195
- package/bundled-skills/social/references/short-form-video.md +0 -237
- package/bundled-skills/tag-taxonomy/SKILL.md +0 -218
- package/bundled-skills/vault-skill-factory/SKILL.md +0 -143
- package/bundled-skills/video/SKILL.md +0 -346
- package/bundled-skills/video/evals/evals.json +0 -103
- package/bundled-skills/video/references/ai-video-prompting.md +0 -175
- package/bundled-skills/video/references/edit-anatomy.md +0 -84
- package/bundled-skills/wiki-agent/SKILL.md +0 -322
- package/bundled-skills/wiki-capture/SKILL.md +0 -337
- package/bundled-skills/wiki-capture/references/RAW-FORMAT.md +0 -115
- package/bundled-skills/wiki-context-pack/SKILL.md +0 -89
- package/bundled-skills/wiki-dashboard/SKILL.md +0 -472
- package/bundled-skills/wiki-dedup/SKILL.md +0 -320
- package/bundled-skills/wiki-digest/SKILL.md +0 -243
- package/bundled-skills/wiki-export/SKILL.md +0 -445
- package/bundled-skills/wiki-history-ingest/SKILL.md +0 -61
- package/bundled-skills/wiki-import/SKILL.md +0 -276
- package/bundled-skills/wiki-ingest/SKILL.md +0 -563
- package/bundled-skills/wiki-ingest/references/ingest-prompts.md +0 -54
- package/bundled-skills/wiki-ingest/references/pageindex.md +0 -72
- package/bundled-skills/wiki-ingest/references/url-sources.md +0 -295
- package/bundled-skills/wiki-lint/SKILL.md +0 -643
- package/bundled-skills/wiki-narrate/SKILL.md +0 -120
- package/bundled-skills/wiki-narrate/references/voices.md +0 -29
- package/bundled-skills/wiki-query/SKILL.md +0 -307
- package/bundled-skills/wiki-rebuild/SKILL.md +0 -212
- package/bundled-skills/wiki-research/SKILL.md +0 -319
- package/bundled-skills/wiki-setup/SKILL.md +0 -359
- package/bundled-skills/wiki-stage-commit/SKILL.md +0 -164
- package/bundled-skills/wiki-status/SKILL.md +0 -556
- package/bundled-skills/wiki-switch/SKILL.md +0 -115
- package/bundled-skills/wiki-synthesize/SKILL.md +0 -212
- package/bundled-skills/wiki-update/SKILL.md +0 -271
- package/skills/ai-security/SKILL.md +0 -132
- package/skills/ai-security/references/atlas-coverage.md +0 -60
- package/skills/ai-security/scripts/ai_threat_scanner.py +0 -373
- package/skills/anti-AI-design/SKILL.md +0 -72
- package/skills/apple-hig-audit/SKILL.md +0 -64
- package/skills/apple-hig-audit/references/accessibility.md +0 -78
- package/skills/apple-hig-audit/references/platform-specifics.md +0 -57
- package/skills/apple-hig-audit/references/visual-design.md +0 -68
- package/skills/apple-hig-audit/scripts/hig_checker.py +0 -115
- package/skills/apple-hig-audit/templates/hig-audit-template.md +0 -114
- package/skills/dependency-auditor/README.md +0 -98
- package/skills/dependency-auditor/SKILL.md +0 -114
- package/skills/dependency-auditor/assets/sample_go.mod +0 -53
- package/skills/dependency-auditor/assets/sample_package.json +0 -72
- package/skills/dependency-auditor/assets/sample_requirements.txt +0 -71
- package/skills/dependency-auditor/expected_outputs/sample_license_report.txt +0 -37
- package/skills/dependency-auditor/expected_outputs/sample_upgrade_plan.txt +0 -59
- package/skills/dependency-auditor/expected_outputs/sample_vulnerability_report.json +0 -71
- package/skills/dependency-auditor/references/dependency_management_best_practices.md +0 -46
- package/skills/dependency-auditor/references/license_compatibility_matrix.md +0 -57
- package/skills/dependency-auditor/references/vulnerability_assessment_guide.md +0 -62
- package/skills/dependency-auditor/scripts/dep_scanner.py +0 -595
- package/skills/dependency-auditor/scripts/license_checker.py +0 -442
- package/skills/dependency-auditor/scripts/upgrade_planner.py +0 -490
- package/skills/dependency-auditor/test-inventory.json +0 -421
- package/skills/dependency-auditor/test-project/package.json +0 -72
- package/skills/design-system-tokens/SKILL.md +0 -90
- package/skills/design-system-tokens/assets/design_system_doc_template.md +0 -129
- package/skills/design-system-tokens/references/component-architecture.md +0 -88
- package/skills/design-system-tokens/references/developer-handoff.md +0 -61
- package/skills/design-system-tokens/references/responsive-calculations.md +0 -72
- package/skills/design-system-tokens/references/token-generation.md +0 -62
- package/skills/design-system-tokens/scripts/design_token_generator.py +0 -315
- package/skills/engineering-code-standards/SKILL.md +0 -174
- package/skills/env-secrets-manager/SKILL.md +0 -102
- package/skills/env-secrets-manager/references/secret-patterns.md +0 -56
- package/skills/env-secrets-manager/references/validation-detection-rotation.md +0 -76
- package/skills/env-secrets-manager/scripts/env_auditor.py +0 -340
- package/skills/frontend-design-taste/SKILL.md +0 -62
- package/skills/mcp-server-builder/README.md +0 -42
- package/skills/mcp-server-builder/SKILL.md +0 -144
- package/skills/mcp-server-builder/references/openapi-extraction-guide.md +0 -34
- package/skills/mcp-server-builder/references/production-hardening-guide.md +0 -80
- package/skills/mcp-server-builder/references/python-server-template.md +0 -22
- package/skills/mcp-server-builder/references/spec-compatibility.md +0 -129
- package/skills/mcp-server-builder/references/typescript-server-template.md +0 -19
- package/skills/mcp-server-builder/references/validation-checklist.md +0 -30
- package/skills/mcp-server-builder/scripts/mcp_validator.py +0 -180
- package/skills/mcp-server-builder/scripts/openapi_to_mcp.py +0 -279
- package/skills/playwright-agent/SKILL.md +0 -147
- package/skills/skill-creator/LICENSE.txt +0 -14
- package/skills/skill-creator/SKILL.md +0 -471
- package/skills/skill-creator/agents/analyzer.md +0 -274
- package/skills/skill-creator/agents/comparator.md +0 -202
- package/skills/skill-creator/agents/grader.md +0 -223
- package/skills/skill-creator/assets/eval_review.html +0 -143
- package/skills/skill-creator/eval-viewer/generate_review.py +0 -471
- package/skills/skill-creator/eval-viewer/viewer.html +0 -1321
- package/skills/skill-creator/references/schemas.md +0 -430
- package/skills/skill-creator/scripts/__init__.py +0 -0
- package/skills/skill-creator/scripts/aggregate_benchmark.py +0 -401
- package/skills/skill-creator/scripts/generate_report.py +0 -322
- package/skills/skill-creator/scripts/improve_description.py +0 -247
- package/skills/skill-creator/scripts/package_skill.py +0 -136
- package/skills/skill-creator/scripts/quick_validate.py +0 -103
- package/skills/skill-creator/scripts/run_eval.py +0 -310
- package/skills/skill-creator/scripts/run_loop.py +0 -328
- package/skills/skill-creator/scripts/utils.py +0 -47
- package/skills/write-a-skill/SKILL.md +0 -111
- package/skills/write-a-skill/references/companion_tooling.md +0 -61
- package/skills/write-a-skill/references/description_design_patterns.md +0 -136
- package/skills/write-a-skill/references/progressive_disclosure_principles.md +0 -87
- package/skills/write-a-skill/references/quality_gates_for_skills.md +0 -158
- package/skills/write-a-skill/scripts/skill_description_validator.py +0 -241
- package/skills/write-a-skill/scripts/skill_review_checklist_runner.py +0 -257
- package/skills/write-a-skill/scripts/skill_structure_validator.py +0 -265
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* secrets-hygiene: high-signal secret patterns on staged/tracked text files.
|
|
4
|
+
* Offline regex pass. Not a substitute for gitleaks/TruffleHog in CI.
|
|
5
|
+
*
|
|
6
|
+
* Usage: node scripts/secret_scan.mjs <file-or-dir> [...]
|
|
7
|
+
* Exit 1 if any HIGH finding.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { readFileSync, readdirSync, statSync } from "node:fs";
|
|
11
|
+
import { join, extname, basename } from "node:path";
|
|
12
|
+
|
|
13
|
+
const EXTS = new Set([
|
|
14
|
+
".js", ".mjs", ".cjs", ".ts", ".tsx", ".jsx", ".py", ".rb", ".go", ".rs",
|
|
15
|
+
".java", ".kt", ".php", ".cs", ".sh", ".bash", ".zsh", ".env", ".yml",
|
|
16
|
+
".yaml", ".json", ".toml", ".ini", ".cfg", ".conf", ".properties", ".tf",
|
|
17
|
+
".md", ".txt", ".xml", ".html", ".css",
|
|
18
|
+
]);
|
|
19
|
+
|
|
20
|
+
const IGNORE_DIRS = new Set(["node_modules", ".git", "dist", "build", "target", ".next", "coverage"]);
|
|
21
|
+
|
|
22
|
+
const RULES = [
|
|
23
|
+
{
|
|
24
|
+
id: "aws-access-key-id",
|
|
25
|
+
level: "HIGH",
|
|
26
|
+
re: /\b(?:AKIA|ASIA)[A-Z0-9]{16}\b/g,
|
|
27
|
+
msg: "AWS access key id",
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
id: "github-pat",
|
|
31
|
+
level: "HIGH",
|
|
32
|
+
re: /\bghp_[A-Za-z0-9]{36,}\b|\bgithub_pat_[A-Za-z0-9_]{22,}\b/g,
|
|
33
|
+
msg: "GitHub token",
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
id: "slack-token",
|
|
37
|
+
level: "HIGH",
|
|
38
|
+
re: /\bxox[baprs]-[A-Za-z0-9-]{10,}\b/g,
|
|
39
|
+
msg: "Slack token",
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
id: "private-key-block",
|
|
43
|
+
level: "HIGH",
|
|
44
|
+
re: /-----BEGIN (?:RSA |EC |OPENSSH |DSA )?PRIVATE KEY-----/g,
|
|
45
|
+
msg: "PEM private key block",
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
id: "generic-assign-secret",
|
|
49
|
+
level: "MED",
|
|
50
|
+
re: /\b(?:api[_-]?key|secret|password|passwd|token)\s*[:=]\s*['"][^'"]{12,}['"]/gi,
|
|
51
|
+
msg: "Hardcoded secret-like assignment",
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
id: "jwt-compact",
|
|
55
|
+
level: "MED",
|
|
56
|
+
re: /\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g,
|
|
57
|
+
msg: "JWT-looking string",
|
|
58
|
+
},
|
|
59
|
+
];
|
|
60
|
+
|
|
61
|
+
const ALLOW_SUBSTR = ["EXAMPLE", "example", "placeholder", "YOUR_", "xxxx", "dummy", "sample", "REPLACE"];
|
|
62
|
+
|
|
63
|
+
function walk(path, out = []) {
|
|
64
|
+
const st = statSync(path);
|
|
65
|
+
if (st.isDirectory()) {
|
|
66
|
+
if (IGNORE_DIRS.has(basename(path))) return out;
|
|
67
|
+
for (const name of readdirSync(path)) walk(join(path, name), out);
|
|
68
|
+
} else if (EXTS.has(extname(path).toLowerCase()) || basename(path).startsWith(".env")) {
|
|
69
|
+
out.push(path);
|
|
70
|
+
}
|
|
71
|
+
return out;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function scanFile(file) {
|
|
75
|
+
let text;
|
|
76
|
+
try {
|
|
77
|
+
text = readFileSync(file, "utf8");
|
|
78
|
+
} catch {
|
|
79
|
+
return [];
|
|
80
|
+
}
|
|
81
|
+
const findings = [];
|
|
82
|
+
for (const rule of RULES) {
|
|
83
|
+
const re = new RegExp(rule.re.source, rule.re.flags.includes("g") ? rule.re.flags : rule.re.flags + "g");
|
|
84
|
+
let m;
|
|
85
|
+
const seen = new Set();
|
|
86
|
+
while ((m = re.exec(text)) !== null) {
|
|
87
|
+
const match = m[0];
|
|
88
|
+
if (ALLOW_SUBSTR.some((a) => match.includes(a))) continue;
|
|
89
|
+
const line = text.slice(0, m.index).split(/\r?\n/).length;
|
|
90
|
+
const key = `${rule.id}:${line}`;
|
|
91
|
+
if (seen.has(key)) continue;
|
|
92
|
+
seen.add(key);
|
|
93
|
+
findings.push({ file, line, ...rule });
|
|
94
|
+
if (findings.length > 50) break;
|
|
95
|
+
}
|
|
96
|
+
if (findings.length > 50) break;
|
|
97
|
+
}
|
|
98
|
+
return findings;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const roots = process.argv.slice(2);
|
|
102
|
+
if (roots.length === 0) {
|
|
103
|
+
console.error("usage: node scripts/secret_scan.mjs <file-or-dir> [...]");
|
|
104
|
+
process.exit(2);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const files = roots.flatMap((r) => walk(r));
|
|
108
|
+
const all = files.flatMap(scanFile);
|
|
109
|
+
const byLevel = { HIGH: [], MED: [], LOW: [] };
|
|
110
|
+
for (const f of all) byLevel[f.level].push(f);
|
|
111
|
+
|
|
112
|
+
for (const level of ["HIGH", "MED", "LOW"]) {
|
|
113
|
+
for (const f of byLevel[level]) {
|
|
114
|
+
console.log(`${level}\t${f.id}\t${f.file}:${f.line}\t${f.msg}`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
const high = byLevel.HIGH.length;
|
|
119
|
+
console.error(`secret_scan: ${files.length} files, ${all.length} findings (${high} HIGH)`);
|
|
120
|
+
process.exit(high > 0 ? 1 : 0);
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: "skill-authoring"
|
|
3
|
+
description: "Write or rewrite an agent SKILL.md: frontmatter contract, description as routing (what + when + differentiator), progressive disclosure, lean body, references and scripts layout, ship checklist. Use when creating a skill, fixing under/over-triggering, or restructuring a long SKILL.md."
|
|
4
|
+
license: "Apache-2.0"
|
|
5
|
+
metadata:
|
|
6
|
+
author: Novahiz
|
|
7
|
+
organization: Novahiz
|
|
8
|
+
version: "1.0.0"
|
|
9
|
+
date: September 2026
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# skill-authoring
|
|
13
|
+
|
|
14
|
+
A skill is a folder: `SKILL.md` plus optional `scripts/`, `references/`, `assets/`. Agents load metadata always, body on match, files and scripts only when needed. Write for that loading order.
|
|
15
|
+
|
|
16
|
+
## Frontmatter contract
|
|
17
|
+
|
|
18
|
+
```yaml
|
|
19
|
+
---
|
|
20
|
+
name: kebab-case-name # ≤64, matches folder, [a-z0-9-]
|
|
21
|
+
description: What it does. Use when ... Trigger phrases. Differentiator vs sibling skills. # ≤1024
|
|
22
|
+
license: Apache-2.0
|
|
23
|
+
metadata:
|
|
24
|
+
author: ...
|
|
25
|
+
---
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
- Quote the description if it contains `: ` so strict YAML parsers do not see a nested map.
|
|
29
|
+
- Avoid `<` `>` in frontmatter; they can leak into prompts.
|
|
30
|
+
- Invalid YAML often fails silently (skill never loads).
|
|
31
|
+
|
|
32
|
+
## Description is the router
|
|
33
|
+
|
|
34
|
+
The model sees only name + description before deciding to open the file.
|
|
35
|
+
|
|
36
|
+
| Include | Avoid |
|
|
37
|
+
|---|---|
|
|
38
|
+
| What the skill does | Step-by-step “how” (model will follow the short version and skip the body) |
|
|
39
|
+
| When to use (triggers, file types, user phrasings) | Empty praise (“helps with projects”) |
|
|
40
|
+
| Differentiator from a sibling skill | Competing skills’ full menus |
|
|
41
|
+
|
|
42
|
+
Pattern: `X via Y. Use for [situations]. [When not / other skill instead if needed].`
|
|
43
|
+
|
|
44
|
+
If it does not trigger: fix description first (95% of the time). If it triggers wrong: narrow or add negatives. Fix the body only when explicit invocation produces wrong work.
|
|
45
|
+
|
|
46
|
+
## Progressive disclosure layout
|
|
47
|
+
|
|
48
|
+
```text
|
|
49
|
+
my-skill/
|
|
50
|
+
SKILL.md # workflow, checklists, pointers
|
|
51
|
+
references/*.md # deep detail, one level deep
|
|
52
|
+
scripts/* # deterministic work; output enters context, source need not
|
|
53
|
+
assets/* # templates
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
- Keep body scannable; when it grows past usefulness, move detail to `references/` and say **when** to open each file.
|
|
57
|
+
- No chains: `SKILL.md → a.md → b.md → c.md`.
|
|
58
|
+
- Long reference: table of contents at the top.
|
|
59
|
+
- Scripts for anything fragile or repeated; prose for judgment calls.
|
|
60
|
+
|
|
61
|
+
## Body shape
|
|
62
|
+
|
|
63
|
+
1. What this does / when it applies (one short block).
|
|
64
|
+
2. Ordered workflow with state checks before actions.
|
|
65
|
+
3. Verify → fix → re-verify loop stated explicitly.
|
|
66
|
+
4. Output format if the consumer expects structure.
|
|
67
|
+
5. Pointers: “For X, read `references/x.md`.”
|
|
68
|
+
6. Sources / constraints that must stay visible.
|
|
69
|
+
|
|
70
|
+
Match strictness to fragility: heuristics for open-ended work; exact steps and scripts for install, migrations, gates.
|
|
71
|
+
|
|
72
|
+
## Composition
|
|
73
|
+
|
|
74
|
+
- One skill, one concern.
|
|
75
|
+
- If skill A produces artifacts skill B reads, document the file shape in both.
|
|
76
|
+
- Shared config file beats hidden coupling.
|
|
77
|
+
- Document tool needs (`allowed-tools` only where the host supports it; not universal).
|
|
78
|
+
|
|
79
|
+
## Ship checklist
|
|
80
|
+
|
|
81
|
+
- [ ] `name` matches folder; kebab-case.
|
|
82
|
+
- [ ] description: what + when + differentiator; under limit; quoted if needed.
|
|
83
|
+
- [ ] body has workflow, verification loop, failure notes.
|
|
84
|
+
- [ ] references linked with explicit “when to read”.
|
|
85
|
+
- [ ] scripts runnable; errors actionable.
|
|
86
|
+
- [ ] no secrets, no absolute machine paths, no time bombs.
|
|
87
|
+
- [ ] humanizer pass on design-frontend prose (R13); outside design it is optional, not gate-required.
|
|
88
|
+
- [ ] implicit trigger test + explicit execution test (`skill-eval-loop`).
|
|
89
|
+
- [ ] versioned with the repo.
|
|
90
|
+
|
|
91
|
+
## Sources
|
|
92
|
+
|
|
93
|
+
Anthropic Agent Skills engineering notes and platform docs (progressive disclosure, description guidance); agentskills.io description optimization; Microsoft Agent Skills structure fields; community skill-authoring guides distilled to routing and disclosure rules. Original Novahiz synthesis; no upstream skill text reused wholesale.
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# SKILL.md template
|
|
2
|
+
|
|
3
|
+
Copy into `skills/<name>/SKILL.md`. Fill every bracket. Delete optional blocks you do not need.
|
|
4
|
+
|
|
5
|
+
```markdown
|
|
6
|
+
---
|
|
7
|
+
name: "<folder-name>"
|
|
8
|
+
description: "<What it does>. Use when <situations and trigger phrases>. <Differentiator vs sibling skill>."
|
|
9
|
+
license: "Apache-2.0"
|
|
10
|
+
metadata:
|
|
11
|
+
author: Novahiz
|
|
12
|
+
organization: Novahiz
|
|
13
|
+
version: "1.0.0"
|
|
14
|
+
date: September 2026
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
# <folder-name>
|
|
18
|
+
|
|
19
|
+
<One or two lines: goal of the skill and when it ends.>
|
|
20
|
+
|
|
21
|
+
## Workflow
|
|
22
|
+
|
|
23
|
+
1. <State check before action.>
|
|
24
|
+
2. <Action.>
|
|
25
|
+
3. <Verify what you did.>
|
|
26
|
+
4. <Fix and re-verify if needed.>
|
|
27
|
+
|
|
28
|
+
## Checklist
|
|
29
|
+
|
|
30
|
+
- [ ] <Acceptance item>
|
|
31
|
+
- [ ] <Acceptance item>
|
|
32
|
+
|
|
33
|
+
## References
|
|
34
|
+
|
|
35
|
+
- For <deep topic>, read `references/<file>.md`.
|
|
36
|
+
- For <repeatable task>, run `scripts/<tool>.mjs`.
|
|
37
|
+
|
|
38
|
+
## Sources
|
|
39
|
+
|
|
40
|
+
<Primary sources used. Original synthesis note.>
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Description formula
|
|
44
|
+
|
|
45
|
+
`<What>. Use when <trigger>. <Differentiator>.`
|
|
46
|
+
|
|
47
|
+
Keep under 1024 characters. Quote the whole string in YAML if it contains a colon.
|
|
48
|
+
|
|
49
|
+
## Folder
|
|
50
|
+
|
|
51
|
+
```text
|
|
52
|
+
skills/<name>/
|
|
53
|
+
SKILL.md
|
|
54
|
+
scripts/ # optional
|
|
55
|
+
references/ # optional, one level deep
|
|
56
|
+
assets/ # optional templates
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Name must match folder. After writing, run `scripts/skill_frontmatter_lint.mjs`.
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* skill-authoring: validate SKILL.md frontmatter + body shape.
|
|
4
|
+
* Usage: node scripts/skill_frontmatter_lint.mjs <path/to/SKILL.md> [...]
|
|
5
|
+
* Exit 1 if any HIGH finding.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { readFileSync, existsSync } from "node:fs";
|
|
9
|
+
|
|
10
|
+
function parse(text) {
|
|
11
|
+
const m = /^---\r?\n([\s\S]*?)\r?\n---/.exec(text);
|
|
12
|
+
if (!m) return { ok: false };
|
|
13
|
+
const fields = {};
|
|
14
|
+
for (const line of m[1].split(/\r?\n/)) {
|
|
15
|
+
const kv = /^([A-Za-z0-9_]+):\s*(.*)$/.exec(line);
|
|
16
|
+
if (!kv) continue;
|
|
17
|
+
let v = kv[2].trim();
|
|
18
|
+
if ((v.startsWith('"') && v.endsWith('"')) || (v.startsWith("'") && v.endsWith("'"))) v = v.slice(1, -1);
|
|
19
|
+
fields[kv[1]] = v;
|
|
20
|
+
}
|
|
21
|
+
return { ok: true, fields, body: text.slice(m[0].length) };
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function lint(path) {
|
|
25
|
+
const out = [];
|
|
26
|
+
const push = (level, id, msg) => out.push({ level, id, path, msg });
|
|
27
|
+
if (!existsSync(path)) {
|
|
28
|
+
push("HIGH", "missing-file", "not found");
|
|
29
|
+
return out;
|
|
30
|
+
}
|
|
31
|
+
const text = readFileSync(path, "utf8");
|
|
32
|
+
const p = parse(text);
|
|
33
|
+
if (!p.ok) {
|
|
34
|
+
push("HIGH", "no-frontmatter", "missing --- frontmatter block");
|
|
35
|
+
return out;
|
|
36
|
+
}
|
|
37
|
+
const f = p.fields;
|
|
38
|
+
if (!f.name) push("HIGH", "no-name", "missing name");
|
|
39
|
+
else {
|
|
40
|
+
if (!/^[a-z0-9]+(-[a-z0-9]+)*$/.test(f.name)) push("HIGH", "name-format", "name must be lowercase kebab-case");
|
|
41
|
+
if (f.name.length > 64) push("HIGH", "name-length", "name > 64 chars");
|
|
42
|
+
}
|
|
43
|
+
if (!f.description) push("HIGH", "no-description", "missing description");
|
|
44
|
+
else {
|
|
45
|
+
if (f.description.length > 1024) push("HIGH", "description-length", `description ${f.description.length} > 1024`);
|
|
46
|
+
if (/[<>]/.test(f.description)) push("HIGH", "description-xml", "description contains < or >");
|
|
47
|
+
if (!/use when|use for|when to use|trigger/i.test(f.description)) push("MED", "description-when", "description should say when to use it");
|
|
48
|
+
}
|
|
49
|
+
if (/[<>]/.test(text.replace(/^---[\s\S]*?---/, ""))) push("LOW", "body-xml", "body contains angle brackets; verify intentional");
|
|
50
|
+
if (!/##/.test(p.body)) push("MED", "no-sections", "body has no ## sections");
|
|
51
|
+
return out;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const files = process.argv.slice(2);
|
|
55
|
+
if (!files.length) {
|
|
56
|
+
console.error("usage: node scripts/skill_frontmatter_lint.mjs <SKILL.md> [...]");
|
|
57
|
+
process.exit(2);
|
|
58
|
+
}
|
|
59
|
+
const all = files.flatMap(lint);
|
|
60
|
+
for (const level of ["HIGH", "MED", "LOW"]) {
|
|
61
|
+
for (const f of all.filter((x) => x.level === level)) console.log(`${level}\t${f.id}\t${f.path}\t${f.msg}`);
|
|
62
|
+
}
|
|
63
|
+
const high = all.filter((f) => f.level === "HIGH").length;
|
|
64
|
+
console.error(`skill_frontmatter_lint: ${files.length} files, ${all.length} findings (${high} HIGH)`);
|
|
65
|
+
process.exit(high > 0 ? 1 : 0);
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: "skill-eval-loop"
|
|
3
|
+
description: "Measure whether an agent skill actually helps: prompt sets with should/should-not trigger, with/without skill runs, deterministic checks, rubric grading, CI regressions. Use when hardening a SKILL.md, deciding if a rewrite improved quality, or adding a quality gate for skills."
|
|
4
|
+
license: "Apache-2.0"
|
|
5
|
+
metadata:
|
|
6
|
+
author: Novahiz
|
|
7
|
+
organization: Novahiz
|
|
8
|
+
version: "1.0.0"
|
|
9
|
+
date: September 2026
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# skill-eval-loop
|
|
13
|
+
|
|
14
|
+
Skill quality is a measured delta, not a feeling. Define done, run with and without the skill, score, and keep the score across versions.
|
|
15
|
+
|
|
16
|
+
## What an eval is
|
|
17
|
+
|
|
18
|
+
`prompt → captured run (trace + artifacts) → checks → score you can compare over time`
|
|
19
|
+
|
|
20
|
+
Three layers, cheapest first:
|
|
21
|
+
|
|
22
|
+
1. **Deterministic checks**: files exist, commands ran in order, JSONL events, exit codes.
|
|
23
|
+
2. **Rubric / judge**: qualitative structure and style; schema-constrained JSON output; blind to which condition produced the text when comparing A/B.
|
|
24
|
+
3. **Regression diff**: baseline snapshot vs current; fail CI when score or trigger rate drops past a threshold.
|
|
25
|
+
|
|
26
|
+
## Prompt set
|
|
27
|
+
|
|
28
|
+
Start with 10-20 rows, grow from real failures.
|
|
29
|
+
|
|
30
|
+
| Column | Meaning |
|
|
31
|
+
|---|---|
|
|
32
|
+
| id | stable key |
|
|
33
|
+
| prompt | user-style request |
|
|
34
|
+
| expect_trigger | yes / no |
|
|
35
|
+
| must_steps | commands or artifacts that prove success (optional) |
|
|
36
|
+
| must_not | failures that count as regression |
|
|
37
|
+
|
|
38
|
+
Include negative prompts (nearby topics that must not load the skill). Without negatives, a broader description always looks “better” until production noise appears.
|
|
39
|
+
|
|
40
|
+
## Trigger testing
|
|
41
|
+
|
|
42
|
+
- Explicit load: invoke the skill directly; fix the **body** if output is wrong.
|
|
43
|
+
- Implicit load: paraphrase the user ask without naming the skill; fix the **description** if it never fires.
|
|
44
|
+
- Over-trigger: unrelated prompts must not load it; narrow description or add a do-not-use clause.
|
|
45
|
+
|
|
46
|
+
Description problems look like body problems until you separate these two tests.
|
|
47
|
+
|
|
48
|
+
## With / without skill
|
|
49
|
+
|
|
50
|
+
For quality claims, run each prompt twice under the same model and temperature: skill injected vs not. Score both with the same judge and rubric. Report mean, spread, and delta. Overlapping spreads at low N mean “add runs,” not “no effect.”
|
|
51
|
+
|
|
52
|
+
- Development: 3 runs per prompt.
|
|
53
|
+
- Decision-grade: 10+ runs, 1-3 judges, judge temperature near 0.
|
|
54
|
+
- Judge sees rubric + output; ideally not which arm is which.
|
|
55
|
+
|
|
56
|
+
## Deterministic traces
|
|
57
|
+
|
|
58
|
+
Prefer harnesses that emit JSONL events (command executions, file writes). Assert on:
|
|
59
|
+
|
|
60
|
+
- required commands present and ordered
|
|
61
|
+
- forbidden commands absent
|
|
62
|
+
- artifact paths exist
|
|
63
|
+
- no extra files outside allowed set
|
|
64
|
+
|
|
65
|
+
These fail fast and explain themselves without another model call.
|
|
66
|
+
|
|
67
|
+
## Rubric grading
|
|
68
|
+
|
|
69
|
+
When checks cannot see “is this good structure,” add a second pass that only reads the repo (or the answer) and returns a fixed schema: `overall_pass`, `score`, per-check ids. Same schema every version so you can diff fields, not prose.
|
|
70
|
+
|
|
71
|
+
## CI gate
|
|
72
|
+
|
|
73
|
+
```text
|
|
74
|
+
baseline.json + current run → report diff → fail on:
|
|
75
|
+
- trigger rate drop on should-trigger set
|
|
76
|
+
- any must_steps regression
|
|
77
|
+
- composite score drop > agreed epsilon
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Keep the baseline in-repo or artifact storage. Update baseline only in the PR that intentionally changes behavior, with a note.
|
|
81
|
+
|
|
82
|
+
## Loop
|
|
83
|
+
|
|
84
|
+
1. Manual explore: force the skill, list every miss.
|
|
85
|
+
2. Turn each miss into a row (should or should-not).
|
|
86
|
+
3. Freeze deterministic checks.
|
|
87
|
+
4. Add rubric only where rules cannot.
|
|
88
|
+
5. Record baseline; wire CI.
|
|
89
|
+
6. On every SKILL.md edit, run the set before merge.
|
|
90
|
+
|
|
91
|
+
## Checklist
|
|
92
|
+
|
|
93
|
+
- [ ] Definition of done written before prompts.
|
|
94
|
+
- [ ] Mix of trigger and non-trigger prompts.
|
|
95
|
+
- [ ] With/without arm for quality claims.
|
|
96
|
+
- [ ] Deterministic checks cover steps and artifacts.
|
|
97
|
+
- [ ] Rubric JSON schema stable across versions.
|
|
98
|
+
- [ ] Baseline + diff in CI.
|
|
99
|
+
- [ ] New failures always become new rows.
|
|
100
|
+
|
|
101
|
+
## Sources
|
|
102
|
+
|
|
103
|
+
OpenAI developer guidance on skill evals (JSONL traces, schema rubrics, small prompt sets); SkillBenchmark / SkillsBench style with-vs-without and blind judging; arXiv framework for skill utility evaluation. Original Novahiz synthesis.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Negative prompt patterns
|
|
2
|
+
|
|
3
|
+
Add rows here whenever a false trigger is found in production or eval.
|
|
4
|
+
|
|
5
|
+
| Skill | Prompt that must NOT trigger | Why it looked related | Fix applied |
|
|
6
|
+
|---|---|---|---|
|
|
7
|
+
| skill-eval-loop | "write a new skill from scratch" | same "skill" word | description steers authoring to skill-authoring |
|
|
8
|
+
| openapi-mcp-server | "explain what MCP is" | MCP keyword | description is build-oriented |
|
|
9
|
+
| browser-session | "install playwright" | playwright keyword | description is session/automation oriented |
|
|
10
|
+
| skill-authoring | "measure skill quality" | skill keyword | description points eval work to skill-eval-loop |
|
|
11
|
+
|
|
12
|
+
Keep this file next to the prompt set (`prompts.csv`). One row per false positive; re-run the negative set after every description edit.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# Eval run sheet
|
|
2
|
+
|
|
3
|
+
Skill: ______________ Version / commit: ______________ Date: ______________
|
|
4
|
+
|
|
5
|
+
## Config
|
|
6
|
+
|
|
7
|
+
- Model / harness:
|
|
8
|
+
- Temperature:
|
|
9
|
+
- Runs per prompt (dev 3 / ship 10+):
|
|
10
|
+
- Judges:
|
|
11
|
+
- Baseline file:
|
|
12
|
+
|
|
13
|
+
## Prompt set summary
|
|
14
|
+
|
|
15
|
+
| Class | Count | Pass |
|
|
16
|
+
|---|---|---|
|
|
17
|
+
| should trigger | | |
|
|
18
|
+
| should not | | |
|
|
19
|
+
| deterministic must_steps | | |
|
|
20
|
+
|
|
21
|
+
## Results
|
|
22
|
+
|
|
23
|
+
| Metric | Baseline | Current | Delta | Verdict |
|
|
24
|
+
|---|---|---|---|---|
|
|
25
|
+
| Trigger rate (should) | | | | |
|
|
26
|
+
| False trigger rate | | | | |
|
|
27
|
+
| must_steps pass | | | | |
|
|
28
|
+
| Rubric mean (with skill) | | | | |
|
|
29
|
+
| Rubric mean (without) | | | | |
|
|
30
|
+
| Skill delta | | | | |
|
|
31
|
+
|
|
32
|
+
## Decision
|
|
33
|
+
|
|
34
|
+
- [ ] Ship (no blocking regression)
|
|
35
|
+
- [ ] Hold (fix description or body first)
|
|
36
|
+
- [ ] Update baseline (intentional behavior change; note why: ________)
|
|
37
|
+
|
|
38
|
+
## Notes / new rows to add
|
|
39
|
+
|
|
40
|
+
-
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* skill-eval-loop: structural + routing checks for a SKILL.md before eval runs.
|
|
4
|
+
* Validates frontmatter shape and prints a prompt-set template if missing.
|
|
5
|
+
*
|
|
6
|
+
* Usage: node scripts/skill_structure_check.mjs <path/to/SKILL.md> [prompts.csv]
|
|
7
|
+
* Exit 1 on structural HIGH failures.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { readFileSync, writeFileSync, existsSync } from "node:fs";
|
|
11
|
+
import { basename, dirname, join } from "node:path";
|
|
12
|
+
|
|
13
|
+
function parseFrontmatter(text) {
|
|
14
|
+
const m = /^---\r?\n([\s\S]*?)\r?\n---/.exec(text);
|
|
15
|
+
if (!m) return { ok: false, error: "missing YAML frontmatter --- block" };
|
|
16
|
+
const body = m[1];
|
|
17
|
+
const fields = {};
|
|
18
|
+
for (const line of body.split(/\r?\n/)) {
|
|
19
|
+
const kv = /^([A-Za-z0-9_-]+):\s*(.*)$/.exec(line);
|
|
20
|
+
if (!kv) continue;
|
|
21
|
+
let v = kv[2].trim();
|
|
22
|
+
if (
|
|
23
|
+
(v.startsWith('"') && v.endsWith('"')) ||
|
|
24
|
+
(v.startsWith("'") && v.endsWith("'"))
|
|
25
|
+
) {
|
|
26
|
+
v = v.slice(1, -1);
|
|
27
|
+
}
|
|
28
|
+
fields[kv[1]] = v;
|
|
29
|
+
}
|
|
30
|
+
return { ok: true, fields, bodyStart: m[0].length };
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const TEMPLATE = `id,prompt,expect_trigger,must_steps,must_not
|
|
34
|
+
t1,"Primary request that should load the skill",yes,"",
|
|
35
|
+
t2,"Paraphrase of the same intent",yes,"",
|
|
36
|
+
t3,"Nearby topic that must NOT trigger",no,"",
|
|
37
|
+
t4,"Edge case discovered in manual testing",yes,"",
|
|
38
|
+
`;
|
|
39
|
+
|
|
40
|
+
const skillPath = process.argv[2];
|
|
41
|
+
if (!skillPath) {
|
|
42
|
+
console.error("usage: node scripts/skill_structure_check.mjs <path/to/SKILL.md> [prompts.csv]");
|
|
43
|
+
process.exit(2);
|
|
44
|
+
}
|
|
45
|
+
if (!existsSync(skillPath)) {
|
|
46
|
+
console.error(`missing: ${skillPath}`);
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const text = readFileSync(skillPath, "utf8");
|
|
51
|
+
const findings = [];
|
|
52
|
+
const push = (level, id, msg) => findings.push({ level, id, msg });
|
|
53
|
+
|
|
54
|
+
const fm = parseFrontmatter(text);
|
|
55
|
+
if (!fm.ok) {
|
|
56
|
+
push("HIGH", "no-frontmatter", fm.error);
|
|
57
|
+
} else {
|
|
58
|
+
const f = fm.fields;
|
|
59
|
+
const dir = basename(dirname(skillPath));
|
|
60
|
+
if (!f.name) push("HIGH", "no-name", "frontmatter missing name");
|
|
61
|
+
else {
|
|
62
|
+
if (f.name !== dir) push("HIGH", "name-dir-mismatch", `name "${f.name}" != folder "${dir}"`);
|
|
63
|
+
if (!/^[a-z0-9]+(-[a-z0-9]+)*$/.test(f.name)) push("HIGH", "name-format", "name must be lowercase kebab");
|
|
64
|
+
if (f.name.length > 64) push("HIGH", "name-length", "name > 64 chars");
|
|
65
|
+
}
|
|
66
|
+
if (!f.description) push("HIGH", "no-description", "frontmatter missing description");
|
|
67
|
+
else {
|
|
68
|
+
if (f.description.length > 1024) push("HIGH", "description-length", `description ${f.description.length} > 1024`);
|
|
69
|
+
if (/[<>]/.test(f.description)) push("HIGH", "description-xml", "description contains < or >");
|
|
70
|
+
if (!/use when|when |trigger|for /i.test(f.description)) {
|
|
71
|
+
push("MED", "description-when", "description should say when to use it");
|
|
72
|
+
}
|
|
73
|
+
if (/^(helps with|does stuff)/i.test(f.description.trim())) {
|
|
74
|
+
push("HIGH", "description-vague", "description too vague to route");
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const body = text.slice(fm.bodyStart || 0);
|
|
80
|
+
const lines = text.split(/\r?\n/).length;
|
|
81
|
+
if (lines > 500) push("MED", "long-skill", `SKILL.md is ${lines} lines; move detail to references/`);
|
|
82
|
+
if (/\n##\s+(Sources|Quellen)/i.test("\n" + body) === false && !/## Sources/i.test(body)) {
|
|
83
|
+
// soft only: many skills include Sources
|
|
84
|
+
}
|
|
85
|
+
if (!/##/.test(body)) push("MED", "no-sections", "body has no ## sections; hard to scan");
|
|
86
|
+
|
|
87
|
+
const promptsArg = process.argv[3];
|
|
88
|
+
if (promptsArg && !existsSync(promptsArg)) {
|
|
89
|
+
writeFileSync(promptsArg, TEMPLATE, "utf8");
|
|
90
|
+
console.error(`created prompt template: ${promptsArg}`);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
for (const level of ["HIGH", "MED", "LOW"]) {
|
|
94
|
+
for (const f of findings.filter((x) => x.level === level)) {
|
|
95
|
+
console.log(`${level}\t${f.id}\t${f.msg}`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
const high = findings.filter((f) => f.level === "HIGH").length;
|
|
99
|
+
console.error(`skill_structure_check: ${findings.length} findings (${high} HIGH)`);
|
|
100
|
+
process.exit(high > 0 ? 1 : 0);
|