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
package/install/bootstrap.mjs
CHANGED
|
@@ -63,7 +63,6 @@ function detectShell() {
|
|
|
63
63
|
|
|
64
64
|
function generateOpenCodeJson(configDir, NovahizHome) {
|
|
65
65
|
const skillsDir = join(configDir, "skills");
|
|
66
|
-
const bundledDir = join(NovahizHome, "bundled-skills");
|
|
67
66
|
const agentsSkillsDir = join(homedir(), ".config", ".agents", "skills");
|
|
68
67
|
|
|
69
68
|
const config = {
|
|
@@ -90,18 +89,13 @@ function generateOpenCodeJson(configDir, NovahizHome) {
|
|
|
90
89
|
command: ["npx", "@playwright/mcp@latest", "--browser=msedge"],
|
|
91
90
|
enabled: true,
|
|
92
91
|
},
|
|
93
|
-
expo: {
|
|
94
|
-
type: "remote",
|
|
95
|
-
url: "https://mcp.expo.dev/mcp",
|
|
96
|
-
enabled: true,
|
|
97
|
-
},
|
|
98
92
|
},
|
|
99
93
|
skills: {
|
|
100
94
|
paths: [skillsDir],
|
|
101
95
|
},
|
|
102
96
|
plugin: [
|
|
103
|
-
"@mohak34/opencode-notifier@0.
|
|
104
|
-
"@tarquinen/opencode-dcp@
|
|
97
|
+
"@mohak34/opencode-notifier@0.3.0",
|
|
98
|
+
"@tarquinen/opencode-dcp@3.2.0",
|
|
105
99
|
join(NovahizHome, "adapters", "opencode", "novahiz.ts"),
|
|
106
100
|
],
|
|
107
101
|
compaction: {
|
|
@@ -112,11 +106,6 @@ function generateOpenCodeJson(configDir, NovahizHome) {
|
|
|
112
106
|
shell: detectShell(),
|
|
113
107
|
};
|
|
114
108
|
|
|
115
|
-
// Add bundled-skills if it exists
|
|
116
|
-
if (existsSync(bundledDir)) {
|
|
117
|
-
config.skills.paths.push(bundledDir);
|
|
118
|
-
}
|
|
119
|
-
|
|
120
109
|
// Add .agents/skills if it exists
|
|
121
110
|
if (existsSync(agentsSkillsDir)) {
|
|
122
111
|
config.skills.paths.push(agentsSkillsDir);
|
|
@@ -151,8 +140,8 @@ async function main() {
|
|
|
151
140
|
// 3. Install opencode globally if not present
|
|
152
141
|
if (!which("opencode")) {
|
|
153
142
|
log("Installing opencode globally...");
|
|
154
|
-
if (!run("npm", ["install", "-g", "opencode"])) {
|
|
155
|
-
error("Failed to install opencode. Try: npm install -g opencode");
|
|
143
|
+
if (!run("npm", ["install", "-g", "opencode-ai"])) {
|
|
144
|
+
error("Failed to install opencode. Try: npm install -g opencode-ai");
|
|
156
145
|
process.exit(1);
|
|
157
146
|
}
|
|
158
147
|
log("opencode installed");
|
|
@@ -179,8 +168,9 @@ async function main() {
|
|
|
179
168
|
log("Installing MCP servers...");
|
|
180
169
|
const mcpServers = [
|
|
181
170
|
{ pkg: "@upstash/context7-mcp", bin: "context7-mcp" },
|
|
182
|
-
{ pkg: "
|
|
183
|
-
{ pkg: "
|
|
171
|
+
{ pkg: "narsil-mcp", bin: "narsil-mcp" },
|
|
172
|
+
{ pkg: "mcp-cron", bin: "mcp-cron" },
|
|
173
|
+
{ pkg: "security-mcp", bin: "security-mcp" },
|
|
184
174
|
];
|
|
185
175
|
|
|
186
176
|
for (const server of mcpServers) {
|
|
@@ -200,8 +190,8 @@ async function main() {
|
|
|
200
190
|
log("");
|
|
201
191
|
log("Installing opencode plugins...");
|
|
202
192
|
const plugins = [
|
|
203
|
-
"@mohak34/opencode-notifier@0.
|
|
204
|
-
"@tarquinen/opencode-dcp@
|
|
193
|
+
"@mohak34/opencode-notifier@0.3.0",
|
|
194
|
+
"@tarquinen/opencode-dcp@3.2.0",
|
|
205
195
|
];
|
|
206
196
|
|
|
207
197
|
for (const plugin of plugins) {
|
package/install/install.mjs
CHANGED
|
@@ -29,7 +29,6 @@ const CORE_ITEMS = [
|
|
|
29
29
|
"mcp",
|
|
30
30
|
"adapters",
|
|
31
31
|
"skills",
|
|
32
|
-
"bundled-skills",
|
|
33
32
|
"docs",
|
|
34
33
|
"package.json",
|
|
35
34
|
"tsconfig.json",
|
|
@@ -42,10 +41,12 @@ const CORE_ITEMS = [
|
|
|
42
41
|
function defaultConfig(skillsDir) {
|
|
43
42
|
return {
|
|
44
43
|
dbPath: "novahiz.sqlite",
|
|
45
|
-
skillRoots: ["./skills"
|
|
44
|
+
skillRoots: ["./skills"],
|
|
46
45
|
gate: {
|
|
47
46
|
enabled: true,
|
|
48
47
|
mode: "block",
|
|
48
|
+
// Kept for schema compatibility only — the kill-switch name is hardcoded
|
|
49
|
+
// to NOVAHIZ_GATE in the CLI, MCP gate, and plugin (see src/spec.ts).
|
|
49
50
|
envEscape: "NOVAHIZ_GATE",
|
|
50
51
|
tools: ["edit", "write", "patch", "apply_patch", "bash", "shell"]
|
|
51
52
|
},
|
|
@@ -85,16 +86,20 @@ async function main() {
|
|
|
85
86
|
|
|
86
87
|
// Check for opencode and auto-install if missing
|
|
87
88
|
if (!which("opencode")) {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
89
|
+
if (dryRun) {
|
|
90
|
+
note("opencode not detected. Would install globally (npm install -g opencode-ai).");
|
|
91
|
+
} else {
|
|
92
|
+
note("opencode not detected. Global installation...");
|
|
93
|
+
const installResult = spawnSync("npm", ["install", "-g", "opencode-ai"], {
|
|
94
|
+
encoding: "utf8",
|
|
95
|
+
stdio: "inherit"
|
|
96
|
+
});
|
|
97
|
+
if (installResult.status !== 0) {
|
|
98
|
+
process.stderr.write("Failed to install opencode. Try: npm install -g opencode-ai\n");
|
|
99
|
+
process.exit(1);
|
|
100
|
+
}
|
|
101
|
+
note("opencode installed successfully.");
|
|
96
102
|
}
|
|
97
|
-
note("opencode installed successfully.");
|
|
98
103
|
} else {
|
|
99
104
|
note("opencode detected.");
|
|
100
105
|
}
|
|
@@ -195,19 +200,6 @@ async function main() {
|
|
|
195
200
|
} else {
|
|
196
201
|
note(`No skills folder found at ${skillsSource}`);
|
|
197
202
|
}
|
|
198
|
-
|
|
199
|
-
// Copy bundled-skills
|
|
200
|
-
const bundledSource = existsSync(join(home, "bundled-skills")) ? join(home, "bundled-skills") : join(root, "bundled-skills");
|
|
201
|
-
if (existsSync(bundledSource)) {
|
|
202
|
-
const bundledTarget = join(home, "bundled-skills");
|
|
203
|
-
note(`Installing bundled-skills in ${bundledTarget}`);
|
|
204
|
-
if (!dryRun) {
|
|
205
|
-
const result = copyInto(bundledSource, bundledTarget, true);
|
|
206
|
-
created.push(...result.created);
|
|
207
|
-
backups.push(...result.backups);
|
|
208
|
-
note(` ${result.total} files copied`);
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
203
|
}
|
|
212
204
|
|
|
213
205
|
const pluginSource = join(home, "adapters", "opencode", "novahiz.ts");
|
|
@@ -319,8 +311,9 @@ async function main() {
|
|
|
319
311
|
// Install MCP servers globally
|
|
320
312
|
const mcpServers = [
|
|
321
313
|
{ pkg: "@upstash/context7-mcp", bin: "context7-mcp", name: "context7" },
|
|
322
|
-
{ pkg: "
|
|
323
|
-
{ pkg: "
|
|
314
|
+
{ pkg: "narsil-mcp", bin: "narsil-mcp", name: "narsil" },
|
|
315
|
+
{ pkg: "mcp-cron", bin: "mcp-cron", name: "cron" },
|
|
316
|
+
{ pkg: "security-mcp", bin: "security-mcp", name: "security" },
|
|
324
317
|
];
|
|
325
318
|
|
|
326
319
|
if (!dryRun) {
|
|
@@ -349,8 +342,8 @@ async function main() {
|
|
|
349
342
|
|
|
350
343
|
// Install opencode plugins globally
|
|
351
344
|
const plugins = [
|
|
352
|
-
"@mohak34/opencode-notifier@0.
|
|
353
|
-
"@tarquinen/opencode-dcp@
|
|
345
|
+
"@mohak34/opencode-notifier@0.3.0",
|
|
346
|
+
"@tarquinen/opencode-dcp@3.2.0",
|
|
354
347
|
];
|
|
355
348
|
|
|
356
349
|
if (!dryRun) {
|
|
@@ -374,7 +367,6 @@ async function main() {
|
|
|
374
367
|
const configPath = join(configDir, "opencode.jsonc");
|
|
375
368
|
if (!existsSync(configPath)) {
|
|
376
369
|
note(`\nCreating ${configPath}`);
|
|
377
|
-
const bundledDir = join(home, "bundled-skills");
|
|
378
370
|
const agentsSkillsDir = join(homedir(), ".config", ".agents", "skills");
|
|
379
371
|
|
|
380
372
|
const openCodeConfig = {
|
|
@@ -400,19 +392,14 @@ async function main() {
|
|
|
400
392
|
"type": "local",
|
|
401
393
|
"command": ["npx", "@playwright/mcp@latest", "--browser=msedge"],
|
|
402
394
|
"enabled": true
|
|
403
|
-
},
|
|
404
|
-
"expo": {
|
|
405
|
-
"type": "remote",
|
|
406
|
-
"url": "https://mcp.expo.dev/mcp",
|
|
407
|
-
"enabled": true
|
|
408
395
|
}
|
|
409
396
|
},
|
|
410
397
|
"skills": {
|
|
411
398
|
"paths": [skillsDir]
|
|
412
399
|
},
|
|
413
400
|
"plugin": [
|
|
414
|
-
"@mohak34/opencode-notifier@0.
|
|
415
|
-
"@tarquinen/opencode-dcp@
|
|
401
|
+
"@mohak34/opencode-notifier@0.3.0",
|
|
402
|
+
"@tarquinen/opencode-dcp@3.2.0",
|
|
416
403
|
join(home, "adapters", "opencode", "novahiz.ts")
|
|
417
404
|
],
|
|
418
405
|
"compaction": {
|
|
@@ -423,11 +410,6 @@ async function main() {
|
|
|
423
410
|
"shell": process.platform === "win32" ? "pwsh" : "bash"
|
|
424
411
|
};
|
|
425
412
|
|
|
426
|
-
// Add bundled-skills if it exists
|
|
427
|
-
if (existsSync(bundledDir)) {
|
|
428
|
-
openCodeConfig.skills.paths.push(bundledDir);
|
|
429
|
-
}
|
|
430
|
-
|
|
431
413
|
// Add .agents/skills if it exists
|
|
432
414
|
if (existsSync(agentsSkillsDir)) {
|
|
433
415
|
openCodeConfig.skills.paths.push(agentsSkillsDir);
|
|
@@ -11,7 +11,7 @@ import { rankSkills } from "../../src/relevance.ts";
|
|
|
11
11
|
import { openDb } from "../../src/db.ts";
|
|
12
12
|
import { enabledProviders } from "../../src/providers.ts";
|
|
13
13
|
import { checkDependencies } from "../../src/deps.ts";
|
|
14
|
-
import { activeTask, addTodos, amendTodo, blockTodo, buildWorkPackets, completeTodo, createTask, dropTodo, getTask, getTodo, insertTodo, ledgerSummary, listTodos, recordTodoDone, reorderTodos, resume, reviewDue, reviewTask, revisionSignals, startTodo } from "../../src/ledger.ts";
|
|
14
|
+
import { activeTask, addTodos, amendTodo, blockTodo, buildWorkPackets, completeTodo, createTask, dropTask, dropTodo, getTask, getTodo, insertTodo, ledgerSummary, listTodos, recordTodoDone, reorderTodos, resume, reviewDue, reviewTask, revisionSignals, startTodo } from "../../src/ledger.ts";
|
|
15
15
|
import { DEFAULT_LIMIT_CHARS, DEFAULT_LIMIT_LINES, ensureMemoryRoot, getSlot, listSlots, memoryRoot, parseSlotInput, rebuildIndex, writeEntry } from "../../src/memory.ts";
|
|
16
16
|
|
|
17
17
|
const SUPPORTED_PROTOCOLS = ["2024-11-05", "2025-06-18"];
|
|
@@ -63,7 +63,8 @@ const TOOLS = [
|
|
|
63
63
|
filePath: { type: "string", description: "Alias of file. Some harnesses rename the parameter when they surface the tool." },
|
|
64
64
|
tool: { type: "string", description: "edit, write or patch." },
|
|
65
65
|
content: { type: "string", description: "The edited content, used for content-aware rules." },
|
|
66
|
-
|
|
66
|
+
prompt: { type: "string", description: "Optional prompt used to auto-classify when categories is omitted or empty." },
|
|
67
|
+
categories: { type: "array", items: { type: "string" }, description: "Category ids. When omitted or empty, inferred from prompt, content, or file path." },
|
|
67
68
|
loaded: { type: "array", items: { type: "string" } }
|
|
68
69
|
}
|
|
69
70
|
}
|
|
@@ -118,7 +119,7 @@ const TOOLS = [
|
|
|
118
119
|
description: "What to do with the ledger."
|
|
119
120
|
},
|
|
120
121
|
title: { type: "string", description: "Task title for action new." },
|
|
121
|
-
id: { type: "string", description: "Task id (new) or todo id (start, done, block)." },
|
|
122
|
+
id: { type: "string", description: "Task id (new) or todo/task id (start, done, block, drop)." },
|
|
122
123
|
task: { type: "string", description: "Task id. Defaults to the active task." },
|
|
123
124
|
session: { type: "string", description: "Session id used to scope the active task." },
|
|
124
125
|
label: { type: "string", description: "Todo label for action todo." },
|
|
@@ -329,12 +330,34 @@ function callTool(name, args) {
|
|
|
329
330
|
if (args?.tool !== undefined && typeof args.tool !== "string") {
|
|
330
331
|
throw new Error("Invalid params: tool must be a string");
|
|
331
332
|
}
|
|
333
|
+
if (args?.prompt !== undefined && typeof args.prompt !== "string") {
|
|
334
|
+
throw new Error("Invalid params: prompt must be a string");
|
|
335
|
+
}
|
|
336
|
+
if (typeof args?.prompt === "string" && args.prompt.length > MAX_PROMPT_LEN) {
|
|
337
|
+
throw new Error(`Invalid params: prompt exceeds ${MAX_PROMPT_LEN} characters`);
|
|
338
|
+
}
|
|
339
|
+
// Auto-classify when categories is omitted or empty: seed from prompt,
|
|
340
|
+
// fall back to content, then file path. Explicit categories always win.
|
|
341
|
+
let categories = args?.categories ? args.categories.map(String) : [];
|
|
342
|
+
if (categories.length === 0) {
|
|
343
|
+
const seed =
|
|
344
|
+
(typeof args?.prompt === "string" && args.prompt.length > 0 ? args.prompt : "") ||
|
|
345
|
+
(typeof args?.content === "string" && args.content.length > 0 ? args.content : "") ||
|
|
346
|
+
file;
|
|
347
|
+
try {
|
|
348
|
+
categories = classify(spec, seed).categories.map((entry) => entry.id);
|
|
349
|
+
} catch {
|
|
350
|
+
// Fail closed on classify errors: keep empty categories so
|
|
351
|
+
// evaluateGate still runs path/content rules instead of crashing.
|
|
352
|
+
categories = [];
|
|
353
|
+
}
|
|
354
|
+
}
|
|
332
355
|
const index = loadInstalledSkills(spec);
|
|
333
356
|
const result = evaluateGate({
|
|
334
357
|
tool: String(args?.tool ?? "edit"),
|
|
335
358
|
filePath: file,
|
|
336
359
|
content: typeof args?.content === "string" ? args.content : "",
|
|
337
|
-
categories
|
|
360
|
+
categories,
|
|
338
361
|
loadedSkills: args?.loaded ? args.loaded.map(String) : [],
|
|
339
362
|
installedSkills: index.skills,
|
|
340
363
|
installedIndexAvailable: index.available,
|
|
@@ -472,8 +495,14 @@ function callTool(name, args) {
|
|
|
472
495
|
const position = raw === undefined || raw === "" ? "end" : /^\d+$/.test(String(raw)) ? Number(raw) : String(raw);
|
|
473
496
|
return toolResult(insertTodo(db, taskId, normalizeTodo(args), position));
|
|
474
497
|
}
|
|
475
|
-
|
|
476
|
-
|
|
498
|
+
if (action === "drop") {
|
|
499
|
+
const dropId = String(args?.id ?? "");
|
|
500
|
+
const reason = args?.reason ? String(args.reason) : "";
|
|
501
|
+
if (getTask(db, dropId)) return toolResult({ task: dropTask(db, dropId, reason) });
|
|
502
|
+
if (getTodo(db, dropId)) return toolResult({ todo: dropTodo(db, dropId, reason) });
|
|
503
|
+
throw new Error(`unknown id: ${dropId} (expected a task id or todo id)`);
|
|
504
|
+
}
|
|
505
|
+
if (action === "reorder") {
|
|
477
506
|
const taskId = args?.task ? String(args.task) : activeTask(db, session)?.id;
|
|
478
507
|
if (!taskId) return toolResult("no active task", true);
|
|
479
508
|
const order = Array.isArray(args?.order) ? args.order.map(String) : [];
|
|
@@ -2,11 +2,7 @@
|
|
|
2
2
|
"dbPath": "novahiz.sqlite",
|
|
3
3
|
"skillRoots": [
|
|
4
4
|
"./skills",
|
|
5
|
-
"~/.config/opencode/skills"
|
|
6
|
-
"~/.agents/skills",
|
|
7
|
-
"~/.config/.agents/skills",
|
|
8
|
-
"~/.config/marketingskills/skills",
|
|
9
|
-
"~/.config/humanizer"
|
|
5
|
+
"~/.config/opencode/skills"
|
|
10
6
|
],
|
|
11
7
|
"gate": {
|
|
12
8
|
"enabled": true,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "novahiz",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.5",
|
|
4
4
|
"description": "Enforce AI agent skills before every file edit: prompt classifier, skill catalog, and pre-edit gate.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -27,11 +27,11 @@
|
|
|
27
27
|
"access": "public"
|
|
28
28
|
},
|
|
29
29
|
"bin": {
|
|
30
|
-
"novahiz": "
|
|
31
|
-
"novahiz-bootstrap": "
|
|
32
|
-
"novahiz-install": "
|
|
33
|
-
"novahiz-uninstall": "
|
|
34
|
-
"novahiz-mcp": "
|
|
30
|
+
"novahiz": "bin/novahiz.mjs",
|
|
31
|
+
"novahiz-bootstrap": "install/bootstrap.mjs",
|
|
32
|
+
"novahiz-install": "install/install.mjs",
|
|
33
|
+
"novahiz-uninstall": "install/uninstall.mjs",
|
|
34
|
+
"novahiz-mcp": "mcp/novahiz-tools/index.mjs"
|
|
35
35
|
},
|
|
36
36
|
"engines": {
|
|
37
37
|
"node": ">=22.18.0"
|
|
@@ -59,7 +59,6 @@
|
|
|
59
59
|
"install",
|
|
60
60
|
"mcp",
|
|
61
61
|
"skills",
|
|
62
|
-
"bundled-skills",
|
|
63
62
|
"docs",
|
|
64
63
|
"README.md",
|
|
65
64
|
"NOTICE.md",
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: "apple-ui-audit"
|
|
3
|
+
description: "Audit iOS/macOS/watchOS/visionOS interfaces against Apple HIG and Liquid Glass (iOS 26): navigation hierarchy, materials, controls, accessibility settings, screenshots vs binary. Use when reviewing an Apple-platform mockup or build for HIG compliance, contrast, tap targets, reduced transparency, or App Store UI review readiness."
|
|
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
|
+
# apple-ui-audit
|
|
13
|
+
|
|
14
|
+
Structured review of an Apple-platform interface against the Human Interface Guidelines and current Liquid Glass guidance (iOS 26 / 2025-2026). The report lists findings with severity and a fix direction.
|
|
15
|
+
|
|
16
|
+
## Scope
|
|
17
|
+
|
|
18
|
+
SwiftUI, UIKit, AppKit screens; mockups intended for App Store submission; cross-platform (iOS/iPadOS/macOS/tvOS/watchOS/visionOS) consistency checks. Web UI that only *looks* iOS-like is out of scope (use `ui-slop-remover` / `ui-craft-rules`).
|
|
19
|
+
|
|
20
|
+
## 1. Navigation and hierarchy
|
|
21
|
+
|
|
22
|
+
- Content layer vs navigation layer clearly separated. Tab bars, sidebars, toolbars sit in the functional layer above content.
|
|
23
|
+
- One obvious primary path per screen; no competing equal-weight actions.
|
|
24
|
+
- Standard back / dismiss patterns; no custom chrome that fights system gestures.
|
|
25
|
+
- Search and navigation work the same way across iPhone, iPad, Mac where the HIG expects it.
|
|
26
|
+
- Sidebar / inspector safe areas: content peeks correctly; nothing clipped under Liquid Glass.
|
|
27
|
+
|
|
28
|
+
## 2. Liquid Glass (when targeting latest OS)
|
|
29
|
+
|
|
30
|
+
Primary references: Apple "Adopting Liquid Glass", HIG Materials.
|
|
31
|
+
|
|
32
|
+
| Check | Fail signal |
|
|
33
|
+
|---|---|
|
|
34
|
+
| Use system components first | Custom opaque bars fighting the system material |
|
|
35
|
+
| Glass on controls/navigation, not content layer | Decorative glass cards in body content |
|
|
36
|
+
| Sparingly on custom controls | Every cell frosted |
|
|
37
|
+
| Regular vs clear variant | Clear over bright text without dimming |
|
|
38
|
+
| Reduce Transparency path | Broken layout when the setting strips blur |
|
|
39
|
+
| Scroll edge effect | Unreadable controls over scrolling content |
|
|
40
|
+
| Color on controls | Hard-coded brand color with no light/dark/increase-contrast variants |
|
|
41
|
+
|
|
42
|
+
Rebuild with latest SDK, run on latest OS, then judge. App Review 2.3 rejects marketing shots whose glass the binary does not ship.
|
|
43
|
+
|
|
44
|
+
## 3. Controls and touch
|
|
45
|
+
|
|
46
|
+
- Minimum tap targets per HIG (44×44 pt default; follow current platform tables).
|
|
47
|
+
- Standard control sizes: do not hard-code metrics that the system now updates.
|
|
48
|
+
- Toolbars: no empty spacer hacks; hide the whole item, not an empty shell.
|
|
49
|
+
- Tab bar auto-minimize: intentional opt-in, tested both scroll directions.
|
|
50
|
+
- Focus engine / keyboard / remote (tvOS) paths for every actionable control.
|
|
51
|
+
|
|
52
|
+
## 4. Color, type, and accessibility
|
|
53
|
+
|
|
54
|
+
- System colors or custom colors with light, dark, and increased-contrast variants.
|
|
55
|
+
- Dynamic Type: no fixed-height labels that clip at accessibility sizes.
|
|
56
|
+
- Test matrix: Reduce Transparency, Reduce Motion, Increase Contrast, Bold Text, larger text, VoiceOver, Switch Control.
|
|
57
|
+
- Liquid Glass fallback under those settings must remain legible and navigable.
|
|
58
|
+
- Contrast on frosted surfaces: measure. Blur alone does not guarantee a ratio.
|
|
59
|
+
- State must remain readable without color.
|
|
60
|
+
|
|
61
|
+
## 5. Motion and materials
|
|
62
|
+
|
|
63
|
+
- Prefer system transitions; custom morphs respect Reduce Motion.
|
|
64
|
+
- `GlassEffectContainer` (where applicable) for combined custom glass performance.
|
|
65
|
+
- Profile scroll hitching and modal latency on representative devices.
|
|
66
|
+
|
|
67
|
+
## 6. Store readiness (UI-adjacent)
|
|
68
|
+
|
|
69
|
+
- Screenshots match the submitted build (current chrome, not last year's).
|
|
70
|
+
- Privacy manifest present when required; AI features disclosed where guidelines require.
|
|
71
|
+
- No mock-only UI in the listing.
|
|
72
|
+
|
|
73
|
+
## Report format
|
|
74
|
+
|
|
75
|
+
```
|
|
76
|
+
## Apple UI audit
|
|
77
|
+
Verdict: PASS | PASS_WITH_FIXES | FAIL
|
|
78
|
+
|
|
79
|
+
### Blockers
|
|
80
|
+
- [HIGH] screen:path : finding
|
|
81
|
+
HIG / doc: ...
|
|
82
|
+
Fix: ...
|
|
83
|
+
|
|
84
|
+
### Should fix
|
|
85
|
+
- ...
|
|
86
|
+
|
|
87
|
+
### Notes / accepted risk
|
|
88
|
+
- ...
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Each finding cites a screen path and a guideline source (HIG section or Apple doc title). No finding without a location.
|
|
92
|
+
|
|
93
|
+
## Sources
|
|
94
|
+
|
|
95
|
+
Apple Human Interface Guidelines; Adopting Liquid Glass; Materials (Liquid Glass + standard materials); App Review guidelines (2.3 screenshots, privacy). Original Novahiz checklist synthesis.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Screen walkthrough template
|
|
2
|
+
|
|
3
|
+
Copy into the audit report. One block per screen (home, detail, search, modal, settings, empty, error).
|
|
4
|
+
|
|
5
|
+
## Screen: <name>
|
|
6
|
+
|
|
7
|
+
| Check | Pass? | Evidence |
|
|
8
|
+
|---|---|---|
|
|
9
|
+
| Nav vs content layers separated | | |
|
|
10
|
+
| Primary action obvious | | |
|
|
11
|
+
| Liquid Glass only on chrome/controls | | |
|
|
12
|
+
| Reduce Transparency still legible | | |
|
|
13
|
+
| Reduce Motion: no essential motion | | |
|
|
14
|
+
| Tap targets ≥ platform minimum | | |
|
|
15
|
+
| Dynamic Type no clip | | |
|
|
16
|
+
| VoiceOver labels on controls | | |
|
|
17
|
+
| Light / dark / increase contrast | | |
|
|
18
|
+
| Empty + error states designed | | |
|
|
19
|
+
| Screenshot matches current build | | |
|
|
20
|
+
|
|
21
|
+
Findings:
|
|
22
|
+
|
|
23
|
+
- [severity] what / where / fix
|
|
24
|
+
|
|
25
|
+
Matrix (run at least one device per class):
|
|
26
|
+
|
|
27
|
+
- Current OS plus one older supported OS
|
|
28
|
+
- Light and dark
|
|
29
|
+
- Accessibility settings toggled on as listed above
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: "browser-session"
|
|
3
|
+
description: "Drive a persistent Microsoft Edge browser session for research and verification: navigate, snapshot, click, fill, console and network inspection, keep login state across runs. Use when automating a web page, checking a UI in the real browser, or reusing an authenticated session."
|
|
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
|
+
# browser-session
|
|
13
|
+
|
|
14
|
+
All browser work goes through the Playwright MCP tools (`playwright_browser_*`). The profile is persistent at `C:\Users\hiz\.opencode\playwright-profile` so cookies and logins survive restarts.
|
|
15
|
+
|
|
16
|
+
## Hard rules
|
|
17
|
+
|
|
18
|
+
1. **Never launch Chrome, Chromium, or any manual browser process.** Use only the MCP tools, which run Microsoft Edge (`--browser=msedge`). If Edge is missing, fall back to another non-Chromium engine via the same MCP server.
|
|
19
|
+
2. Never disable or redirect `--user-data-dir`. Never purge the profile folder without the user's explicit consent.
|
|
20
|
+
3. Never open an ephemeral context when the task needs saved login state.
|
|
21
|
+
4. If the profile looks corrupted, stop and propose a backup before any reset.
|
|
22
|
+
|
|
23
|
+
## Session loop
|
|
24
|
+
|
|
25
|
+
1. **Snapshot first.** Prefer `playwright_browser_snapshot` over screenshots when you need to act. The accessibility tree gives stable element refs for clicks and fills.
|
|
26
|
+
2. **Navigate** with a full URL (`playwright_browser_navigate`). Wait for the content you care about with `playwright_browser_wait_for` (text visible or gone) rather than fixed sleeps.
|
|
27
|
+
3. **Act** via ref from the snapshot: `click`, `type`, `fill_form`, `select_option`, `press_key`. One logical action, then re-snapshot before the next if the DOM may have changed.
|
|
28
|
+
4. **Read** with `find` (search the snapshot for text/regex) before capturing a whole new tree when you only need one node.
|
|
29
|
+
5. **Inspect when debugging:** `console_messages` (level `error` first), `network_requests` / `network_request` for failed calls and payloads.
|
|
30
|
+
6. **Screenshot** only to show the user something visual (`take_screenshot`, save under a clear filename). Screenshots are not for finding elements.
|
|
31
|
+
|
|
32
|
+
## Authenticated flows
|
|
33
|
+
|
|
34
|
+
The persistent profile keeps sessions. On login pages:
|
|
35
|
+
|
|
36
|
+
- Check whether you are already signed in (snapshot the account menu or user name) before typing credentials.
|
|
37
|
+
- Never hard-code passwords in prompts or scripts. Ask the user to complete credential entry in the open browser when possible.
|
|
38
|
+
- After login, re-navigate to the deep link you actually need; do not assume the redirect landed where you wanted.
|
|
39
|
+
|
|
40
|
+
## Rate limits and failures
|
|
41
|
+
|
|
42
|
+
- Repeated identical navigations can hit HTTP 429. Back off (seconds, then minutes), vary the path only if the target allows it, and tell the user rather than hammering.
|
|
43
|
+
- On navigation error, capture console + last network response once, then stop and report. Do not retry in a tight loop.
|
|
44
|
+
- Dialogs: `handle_dialog` explicitly (accept or dismiss with prompt text). Ignored dialogs block the page.
|
|
45
|
+
|
|
46
|
+
## When the task needs a dev server
|
|
47
|
+
|
|
48
|
+
Start the app server in an **external terminal** before any browser interaction. Point the browser at the real origin. Do not claim a UI works from code reading alone; load it, snapshot it, act on it.
|
|
49
|
+
|
|
50
|
+
## Checklist
|
|
51
|
+
|
|
52
|
+
- [ ] MCP tools only; Edge; persistent profile untouched.
|
|
53
|
+
- [ ] Snapshot taken before each interaction sequence.
|
|
54
|
+
- [ ] Waits are content-based, not fixed sleeps.
|
|
55
|
+
- [ ] Console and network checked if anything failed.
|
|
56
|
+
- [ ] Credentials never written into the repo or chat.
|
|
57
|
+
- [ ] Result reported from observed browser state, not assumed.
|
|
58
|
+
|
|
59
|
+
## Sources
|
|
60
|
+
|
|
61
|
+
Novahiz global Playwright rules (`instructions.md`, persistent profile + Edge-only policy). Playwright MCP tool set (snapshot, navigate, click, type, console, network, dialogs). Original synthesis for this skill body.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Browser session run sheet
|
|
2
|
+
|
|
3
|
+
Task: __________________ URL / app: __________________ Date: __________________
|
|
4
|
+
|
|
5
|
+
## Preconditions
|
|
6
|
+
|
|
7
|
+
- [ ] Dev server up in external terminal (if local app)
|
|
8
|
+
- [ ] Using `playwright_browser_*` only (no chrome/chromium launch)
|
|
9
|
+
- [ ] Persistent profile path unchanged
|
|
10
|
+
|
|
11
|
+
## Steps
|
|
12
|
+
|
|
13
|
+
| # | Intent | Tool / ref | Expected observation | OK? |
|
|
14
|
+
|---|---|---|---|---|
|
|
15
|
+
| 1 | | snapshot / navigate | | |
|
|
16
|
+
| 2 | | find / click | | |
|
|
17
|
+
| 3 | | fill / type | | |
|
|
18
|
+
| 4 | | wait_for text | | |
|
|
19
|
+
|
|
20
|
+
## Failures
|
|
21
|
+
|
|
22
|
+
| Symptom | Console | Network (status) | Action taken |
|
|
23
|
+
|---|---|---|---|
|
|
24
|
+
| | | | |
|
|
25
|
+
|
|
26
|
+
## Verdict
|
|
27
|
+
|
|
28
|
+
- [ ] Goal observed in browser (state described from snapshot/screenshot)
|
|
29
|
+
- [ ] Login state kept for next run
|
|
30
|
+
- [ ] No rate-limit / no profile reset
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* browser-session: preflight check that MCP browser rules are respected in a run log.
|
|
4
|
+
* Input: JSON array of steps [{tool, url?, note?}...]
|
|
5
|
+
* Flags violations: manual chrome/chromium launch, user-data-dir override, ephemeral context.
|
|
6
|
+
*
|
|
7
|
+
* Usage: node scripts/browser_session_preflight.mjs <run.json>
|
|
8
|
+
* Exit 1 on HIGH violation.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { readFileSync, existsSync } from "node:fs";
|
|
12
|
+
|
|
13
|
+
const path = process.argv[2];
|
|
14
|
+
if (!path) {
|
|
15
|
+
console.error('usage: node scripts/browser_session_preflight.mjs <run.json>');
|
|
16
|
+
process.exit(2);
|
|
17
|
+
}
|
|
18
|
+
if (!existsSync(path)) {
|
|
19
|
+
console.error(`missing: ${path}`);
|
|
20
|
+
process.exit(1);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
let steps;
|
|
24
|
+
try {
|
|
25
|
+
steps = JSON.parse(readFileSync(path, "utf8"));
|
|
26
|
+
} catch (e) {
|
|
27
|
+
console.error(`HIGH\tinvalid-json\t${e.message}`);
|
|
28
|
+
process.exit(1);
|
|
29
|
+
}
|
|
30
|
+
if (!Array.isArray(steps)) {
|
|
31
|
+
console.error("HIGH\tnot-array\troot must be an array of steps");
|
|
32
|
+
process.exit(1);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const findings = [];
|
|
36
|
+
const push = (level, id, msg, i) => findings.push({ level, id, msg, i });
|
|
37
|
+
|
|
38
|
+
steps.forEach((step, i) => {
|
|
39
|
+
const tool = String(step.tool || "");
|
|
40
|
+
const blob = JSON.stringify(step).toLowerCase();
|
|
41
|
+
|
|
42
|
+
if (/chrome|chromium/.test(blob) && !/msedge|edge/.test(blob)) {
|
|
43
|
+
push("HIGH", "forbidden-browser", `step ${i}: chrome/chromium reference`, i);
|
|
44
|
+
}
|
|
45
|
+
if (/user-data-dir/.test(blob) && !/playwright-profile/.test(blob)) {
|
|
46
|
+
push("HIGH", "profile-override", `step ${i}: user-data-dir override or foreign profile`, i);
|
|
47
|
+
}
|
|
48
|
+
if (/newcontext|ephemeral|incognito/.test(blob)) {
|
|
49
|
+
push("HIGH", "ephemeral-context", `step ${i}: ephemeral context would drop login state`, i);
|
|
50
|
+
}
|
|
51
|
+
if (/rmdir|rimraf|remove.*profile|purge/.test(blob)) {
|
|
52
|
+
push("HIGH", "profile-purge", `step ${i}: profile purge requires explicit user consent`, i);
|
|
53
|
+
}
|
|
54
|
+
if (tool && !tool.startsWith("playwright_browser_")) {
|
|
55
|
+
push("MED", "non-mcp-tool", `step ${i}: tool ${tool} is outside playwright_browser_*`, i);
|
|
56
|
+
}
|
|
57
|
+
if (tool === "playwright_browser_type" || tool === "playwright_browser_fill_form") {
|
|
58
|
+
if (blob.includes("password") && blob.includes("value")) {
|
|
59
|
+
push("MED", "credential-in-log", `step ${i}: looks like a stored credential in the step payload`, i);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (tool === "playwright_browser_navigate" && !step.url) {
|
|
63
|
+
push("HIGH", "navigate-no-url", `step ${i}: navigate without url`, i);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
for (const level of ["HIGH", "MED", "LOW"]) {
|
|
68
|
+
for (const f of findings.filter((x) => x.level === level)) {
|
|
69
|
+
console.log(`${level}\t${f.id}\t${f.msg}`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
const high = findings.filter((f) => f.level === "HIGH").length;
|
|
73
|
+
console.error(`browser_session_preflight: ${steps.length} steps, ${findings.length} findings (${high} HIGH)`);
|
|
74
|
+
process.exit(high > 0 ? 1 : 0);
|