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.
Files changed (565) hide show
  1. package/NOTICE.md +25 -15
  2. package/README.md +353 -355
  3. package/adapters/README.md +1 -1
  4. package/adapters/opencode/agent/novahiz.md +1 -2
  5. package/adapters/opencode/commands/novahiz-init.md +10 -0
  6. package/adapters/opencode/instructions.md +1 -1
  7. package/adapters/opencode/novahiz.ts +182 -4
  8. package/bin/novahiz.cmd +2 -2
  9. package/catalog/categories.json +1085 -1093
  10. package/catalog/overrides.json +12 -13
  11. package/catalog/providers.json +18 -34
  12. package/catalog/rules.json +15 -22
  13. package/docs/ARCHITECTURE.md +2 -2
  14. package/docs/CATALOG.md +7 -6
  15. package/docs/CONFIGURATION.md +5 -5
  16. package/docs/CONSTITUTION.md +4 -4
  17. package/docs/GATE.md +7 -11
  18. package/docs/HARNESSES.md +11 -0
  19. package/docs/INSTALL.md +7 -5
  20. package/docs/PLUGIN.md +24 -6
  21. package/docs/PROVIDERS.md +12 -10
  22. package/docs/ROADMAPS.md +4 -3
  23. package/docs/RULES.md +11 -10
  24. package/install/bootstrap.mjs +9 -19
  25. package/install/install.mjs +23 -41
  26. package/mcp/novahiz-tools/index.mjs +35 -6
  27. package/novahiz.config.example.json +1 -5
  28. package/package.json +6 -7
  29. package/skills/apple-ui-audit/SKILL.md +95 -0
  30. package/skills/apple-ui-audit/references/screen-walkthrough.md +29 -0
  31. package/skills/browser-session/SKILL.md +61 -0
  32. package/skills/browser-session/references/session-run-sheet.md +30 -0
  33. package/skills/browser-session/scripts/browser_session_preflight.mjs +74 -0
  34. package/skills/browser-session/scripts/sample-run.json +5 -0
  35. package/skills/code-standards/SKILL.md +85 -0
  36. package/skills/code-standards/references/pr-review-worksheet.md +35 -0
  37. package/skills/design-token-pipeline/SKILL.md +85 -0
  38. package/skills/design-token-pipeline/references/dtcg-sample.json +37 -0
  39. package/skills/llm-threat-review/SKILL.md +99 -0
  40. package/skills/llm-threat-review/references/review-worksheet.md +34 -0
  41. package/skills/llm-threat-review/scripts/llm_risk_lint.mjs +105 -0
  42. package/skills/novahiz-audit/SKILL.md +1 -1
  43. package/skills/novahiz-gate/SKILL.md +7 -6
  44. package/skills/novahiz-humanizer/SKILL.md +1 -1
  45. package/skills/novahiz-implement/SKILL.md +1 -1
  46. package/skills/novahiz-init/SKILL.md +112 -0
  47. package/skills/novahiz-planner/SKILL.md +1 -2
  48. package/skills/openapi-mcp-server/SKILL.md +76 -0
  49. package/skills/openapi-mcp-server/references/mcp-ship-checklist.md +30 -0
  50. package/skills/openapi-mcp-server/references/tool-worksheet.md +30 -0
  51. package/skills/openapi-mcp-server/scripts/openapi_mcp_lint.mjs +133 -0
  52. package/skills/package-risk-audit/SKILL.md +83 -0
  53. package/skills/package-risk-audit/references/intake-worksheet.md +19 -0
  54. package/skills/package-risk-audit/scripts/dep_risk_lint.mjs +131 -0
  55. package/skills/secrets-hygiene/SKILL.md +62 -0
  56. package/skills/secrets-hygiene/references/rotation-playbook.md +27 -0
  57. package/skills/secrets-hygiene/scripts/secret_scan.mjs +120 -0
  58. package/skills/skill-authoring/SKILL.md +93 -0
  59. package/skills/skill-authoring/references/skill-template.md +59 -0
  60. package/skills/skill-authoring/scripts/skill_frontmatter_lint.mjs +65 -0
  61. package/skills/skill-eval-loop/SKILL.md +103 -0
  62. package/skills/skill-eval-loop/references/negative-patterns.md +12 -0
  63. package/skills/skill-eval-loop/references/run-sheet.md +40 -0
  64. package/skills/skill-eval-loop/scripts/skill_structure_check.mjs +100 -0
  65. package/skills/ui-craft-rules/SKILL.md +96 -0
  66. package/skills/ui-slop-remover/SKILL.md +110 -0
  67. package/skills/ui-slop-remover/references/tell-catalogue.md +58 -0
  68. package/skills/ui-slop-remover/scripts/slop_lint.mjs +119 -0
  69. package/src/autodocs.ts +192 -0
  70. package/src/cli.ts +8 -1
  71. package/src/commands/autodocs.ts +250 -0
  72. package/src/commands/doctor.ts +226 -217
  73. package/src/commands/gate.ts +16 -5
  74. package/src/commands/init.ts +356 -0
  75. package/src/commands/task.ts +20 -7
  76. package/src/gate.ts +401 -401
  77. package/src/ledger.ts +39 -0
  78. package/src/targets.ts +43 -7
  79. package/bundled-skills/ab-testing/SKILL.md +0 -353
  80. package/bundled-skills/ab-testing/evals/evals.json +0 -105
  81. package/bundled-skills/ab-testing/references/sample-size-guide.md +0 -263
  82. package/bundled-skills/ab-testing/references/test-templates.md +0 -277
  83. package/bundled-skills/ad-creative/SKILL.md +0 -425
  84. package/bundled-skills/ad-creative/assets/creative-review-template.html +0 -400
  85. package/bundled-skills/ad-creative/evals/evals.json +0 -217
  86. package/bundled-skills/ad-creative/references/creative-review-page.md +0 -106
  87. package/bundled-skills/ad-creative/references/creative-roadmap.md +0 -118
  88. package/bundled-skills/ad-creative/references/generative-tools.md +0 -637
  89. package/bundled-skills/ad-creative/references/hook-system.md +0 -115
  90. package/bundled-skills/ad-creative/references/imessage-video-ads.md +0 -201
  91. package/bundled-skills/ad-creative/references/meta-creative-formats.md +0 -114
  92. package/bundled-skills/ad-creative/references/motion-video-ads.md +0 -126
  93. package/bundled-skills/ad-creative/references/platform-specs.md +0 -213
  94. package/bundled-skills/ad-creative/references/short-form-video-specs.md +0 -213
  95. package/bundled-skills/ad-creative/references/static-ad-templates.md +0 -308
  96. package/bundled-skills/ads/SKILL.md +0 -499
  97. package/bundled-skills/ads/evals/evals.json +0 -157
  98. package/bundled-skills/ads/references/abm-playbook.md +0 -93
  99. package/bundled-skills/ads/references/ad-copy-templates.md +0 -207
  100. package/bundled-skills/ads/references/audience-targeting.md +0 -243
  101. package/bundled-skills/ads/references/audit-guardrails.md +0 -83
  102. package/bundled-skills/ads/references/b2b-paid-playbook.md +0 -115
  103. package/bundled-skills/ads/references/conversion-tracking.md +0 -361
  104. package/bundled-skills/ads/references/creative-research-automation.md +0 -103
  105. package/bundled-skills/ads/references/google-ads-audit-checklist.md +0 -84
  106. package/bundled-skills/ads/references/google-search-playbook.md +0 -120
  107. package/bundled-skills/ads/references/linkedin-b2b-playbook.md +0 -107
  108. package/bundled-skills/ads/references/meta-decision-system.md +0 -176
  109. package/bundled-skills/ads/references/payback-period.md +0 -69
  110. package/bundled-skills/ads/references/platform-setup-checklists.md +0 -277
  111. package/bundled-skills/ads/references/rsa-output-spec.md +0 -88
  112. package/bundled-skills/agent-device/SKILL.md +0 -20
  113. package/bundled-skills/ai-seo/SKILL.md +0 -488
  114. package/bundled-skills/ai-seo/evals/evals.json +0 -135
  115. package/bundled-skills/ai-seo/references/agent-readiness.md +0 -57
  116. package/bundled-skills/ai-seo/references/citations-vs-recommendations.md +0 -85
  117. package/bundled-skills/ai-seo/references/content-patterns.md +0 -287
  118. package/bundled-skills/ai-seo/references/content-types.md +0 -71
  119. package/bundled-skills/ai-seo/references/format-volatility.md +0 -98
  120. package/bundled-skills/ai-seo/references/okf.md +0 -104
  121. package/bundled-skills/ai-seo/references/platform-ranking-factors.md +0 -154
  122. package/bundled-skills/ai-seo/references/youtube-ai-citations.md +0 -60
  123. package/bundled-skills/analytics/SKILL.md +0 -310
  124. package/bundled-skills/analytics/evals/evals.json +0 -90
  125. package/bundled-skills/analytics/references/event-library.md +0 -260
  126. package/bundled-skills/analytics/references/ga4-implementation.md +0 -300
  127. package/bundled-skills/analytics/references/gtm-implementation.md +0 -390
  128. package/bundled-skills/android-emulator/SKILL.md +0 -32
  129. package/bundled-skills/android-reverse-engineering/LICENSE +0 -190
  130. package/bundled-skills/android-reverse-engineering/SKILL.md +0 -313
  131. package/bundled-skills/android-reverse-engineering/references/api-extraction-patterns.md +0 -197
  132. package/bundled-skills/android-reverse-engineering/references/call-flow-analysis.md +0 -210
  133. package/bundled-skills/android-reverse-engineering/references/fernflower-usage.md +0 -115
  134. package/bundled-skills/android-reverse-engineering/references/jadx-usage.md +0 -116
  135. package/bundled-skills/android-reverse-engineering/references/kotlin-name-recovery.md +0 -108
  136. package/bundled-skills/android-reverse-engineering/references/setup-guide.md +0 -221
  137. package/bundled-skills/android-reverse-engineering/references/third_party_hosts.txt +0 -122
  138. package/bundled-skills/android-reverse-engineering/scripts/check-deps.ps1 +0 -165
  139. package/bundled-skills/android-reverse-engineering/scripts/check-deps.sh +0 -129
  140. package/bundled-skills/android-reverse-engineering/scripts/decompile.ps1 +0 -400
  141. package/bundled-skills/android-reverse-engineering/scripts/decompile.sh +0 -578
  142. package/bundled-skills/android-reverse-engineering/scripts/find-api-calls.ps1 +0 -121
  143. package/bundled-skills/android-reverse-engineering/scripts/find-api-calls.sh +0 -339
  144. package/bundled-skills/android-reverse-engineering/scripts/fingerprint.sh +0 -241
  145. package/bundled-skills/android-reverse-engineering/scripts/install-dep.ps1 +0 -345
  146. package/bundled-skills/android-reverse-engineering/scripts/install-dep.sh +0 -448
  147. package/bundled-skills/android-reverse-engineering/scripts/lookup-name.sh +0 -85
  148. package/bundled-skills/android-reverse-engineering/scripts/recover-kotlin-names.sh +0 -140
  149. package/bundled-skills/build-graph/SKILL.md +0 -38
  150. package/bundled-skills/claude-history-ingest/SKILL.md +0 -463
  151. package/bundled-skills/claude-history-ingest/references/claude-data-format.md +0 -118
  152. package/bundled-skills/codex-history-ingest/SKILL.md +0 -248
  153. package/bundled-skills/codex-history-ingest/references/codex-data-format.md +0 -82
  154. package/bundled-skills/cold-email/SKILL.md +0 -159
  155. package/bundled-skills/cold-email/evals/evals.json +0 -94
  156. package/bundled-skills/cold-email/references/benchmarks.md +0 -83
  157. package/bundled-skills/cold-email/references/follow-up-sequences.md +0 -81
  158. package/bundled-skills/cold-email/references/frameworks.md +0 -90
  159. package/bundled-skills/cold-email/references/personalization.md +0 -79
  160. package/bundled-skills/cold-email/references/subject-lines.md +0 -53
  161. package/bundled-skills/competitor-profiling/SKILL.md +0 -415
  162. package/bundled-skills/competitor-profiling/evals/evals.json +0 -85
  163. package/bundled-skills/competitor-profiling/references/templates.md +0 -167
  164. package/bundled-skills/competitor-profiling/references/tool-reference.md +0 -179
  165. package/bundled-skills/computer-use/SKILL.md +0 -41
  166. package/bundled-skills/content-strategy/SKILL.md +0 -439
  167. package/bundled-skills/content-strategy/evals/evals.json +0 -116
  168. package/bundled-skills/content-strategy/references/content-distribution.md +0 -83
  169. package/bundled-skills/content-strategy/references/headless-cms.md +0 -194
  170. package/bundled-skills/copilot-history-ingest/SKILL.md +0 -376
  171. package/bundled-skills/copilot-history-ingest/references/copilot-data-format.md +0 -321
  172. package/bundled-skills/copy-editing/SKILL.md +0 -457
  173. package/bundled-skills/copy-editing/evals/evals.json +0 -89
  174. package/bundled-skills/copy-editing/references/checklist.md +0 -66
  175. package/bundled-skills/copy-editing/references/content-refresh.md +0 -38
  176. package/bundled-skills/copy-editing/references/plain-english-alternatives.md +0 -394
  177. package/bundled-skills/copywriting/SKILL.md +0 -256
  178. package/bundled-skills/copywriting/evals/evals.json +0 -126
  179. package/bundled-skills/copywriting/references/copy-frameworks.md +0 -433
  180. package/bundled-skills/copywriting/references/natural-transitions.md +0 -272
  181. package/bundled-skills/cro/SKILL.md +0 -187
  182. package/bundled-skills/cro/evals/evals.json +0 -111
  183. package/bundled-skills/cro/references/experiments.md +0 -248
  184. package/bundled-skills/cro/references/form.md +0 -422
  185. package/bundled-skills/cross-linker/SKILL.md +0 -309
  186. package/bundled-skills/customer-research/SKILL.md +0 -305
  187. package/bundled-skills/customer-research/evals/evals.json +0 -176
  188. package/bundled-skills/customer-research/references/interviews-and-surveys.md +0 -155
  189. package/bundled-skills/customer-research/references/source-guides.md +0 -401
  190. package/bundled-skills/daily-update/SKILL.md +0 -223
  191. package/bundled-skills/dart-add-unit-test/SKILL.md +0 -122
  192. package/bundled-skills/dart-build-cli-app/SKILL.md +0 -185
  193. package/bundled-skills/dart-collect-coverage/SKILL.md +0 -141
  194. package/bundled-skills/dart-fix-runtime-errors/SKILL.md +0 -166
  195. package/bundled-skills/dart-generate-test-mocks/SKILL.md +0 -155
  196. package/bundled-skills/dart-migrate-to-checks-package/SKILL.md +0 -528
  197. package/bundled-skills/dart-resolve-package-conflicts/SKILL.md +0 -116
  198. package/bundled-skills/dart-run-static-analysis/SKILL.md +0 -104
  199. package/bundled-skills/dart-setup-ffi-assets/SKILL.md +0 -419
  200. package/bundled-skills/dart-use-doc-examples/SKILL.md +0 -96
  201. package/bundled-skills/dart-use-ffigen/SKILL.md +0 -218
  202. package/bundled-skills/dart-use-pattern-matching/SKILL.md +0 -146
  203. package/bundled-skills/dart-use-primary-constructors/SKILL.md +0 -262
  204. package/bundled-skills/dart-write-documentation/SKILL.md +0 -136
  205. package/bundled-skills/debug-issue/SKILL.md +0 -28
  206. package/bundled-skills/dogfood/SKILL.md +0 -27
  207. package/bundled-skills/eas-app-stores/SKILL.md +0 -176
  208. package/bundled-skills/eas-app-stores/agents/openai.yaml +0 -4
  209. package/bundled-skills/eas-app-stores/references/app-store-metadata.md +0 -497
  210. package/bundled-skills/eas-app-stores/references/ios-app-store.md +0 -376
  211. package/bundled-skills/eas-app-stores/references/native-ios.md +0 -167
  212. package/bundled-skills/eas-app-stores/references/play-store.md +0 -244
  213. package/bundled-skills/eas-app-stores/references/testflight.md +0 -62
  214. package/bundled-skills/eas-app-stores/references/workflows.md +0 -120
  215. package/bundled-skills/eas-hosting/SKILL.md +0 -431
  216. package/bundled-skills/eas-hosting/agents/openai.yaml +0 -4
  217. package/bundled-skills/eas-observe/SKILL.md +0 -54
  218. package/bundled-skills/eas-observe/agents/openai.yaml +0 -4
  219. package/bundled-skills/eas-observe/references/metrics.md +0 -98
  220. package/bundled-skills/eas-observe/references/queries.md +0 -403
  221. package/bundled-skills/eas-observe/references/setup.md +0 -476
  222. package/bundled-skills/eas-observe/references/third-party.md +0 -136
  223. package/bundled-skills/eas-simulator/SKILL.md +0 -208
  224. package/bundled-skills/eas-simulator/agents/openai.yaml +0 -4
  225. package/bundled-skills/eas-simulator/references/controllers.md +0 -106
  226. package/bundled-skills/eas-simulator/references/run-your-app.md +0 -224
  227. package/bundled-skills/eas-simulator/references/troubleshooting.md +0 -44
  228. package/bundled-skills/eas-update/SKILL.md +0 -146
  229. package/bundled-skills/eas-update/agents/openai.yaml +0 -4
  230. package/bundled-skills/eas-update-insights/SKILL.md +0 -238
  231. package/bundled-skills/eas-update-insights/agents/openai.yaml +0 -4
  232. package/bundled-skills/eas-update-insights/references/channel-insights-schema.md +0 -47
  233. package/bundled-skills/eas-update-insights/references/update-insights-schema.md +0 -69
  234. package/bundled-skills/eas-workflows/SKILL.md +0 -99
  235. package/bundled-skills/eas-workflows/agents/openai.yaml +0 -4
  236. package/bundled-skills/eas-workflows/scripts/fetch.js +0 -109
  237. package/bundled-skills/eas-workflows/scripts/package.json +0 -6
  238. package/bundled-skills/emails/SKILL.md +0 -311
  239. package/bundled-skills/emails/evals/evals.json +0 -93
  240. package/bundled-skills/emails/references/copy-guidelines.md +0 -113
  241. package/bundled-skills/emails/references/email-types.md +0 -515
  242. package/bundled-skills/emails/references/sequence-templates.md +0 -168
  243. package/bundled-skills/explore-codebase/SKILL.md +0 -29
  244. package/bundled-skills/expo-animation/LICENSE +0 -21
  245. package/bundled-skills/expo-animation/RECIPES.md +0 -385
  246. package/bundled-skills/expo-animation/SKILL.md +0 -267
  247. package/bundled-skills/expo-animation/agents/openai.yaml +0 -4
  248. package/bundled-skills/expo-app-clip/SKILL.md +0 -290
  249. package/bundled-skills/expo-app-clip/agents/openai.yaml +0 -4
  250. package/bundled-skills/expo-app-clip/references/native-module.md +0 -96
  251. package/bundled-skills/expo-brownfield/SKILL.md +0 -62
  252. package/bundled-skills/expo-brownfield/agents/openai.yaml +0 -4
  253. package/bundled-skills/expo-brownfield/references/brownfield-integrated.md +0 -526
  254. package/bundled-skills/expo-brownfield/references/brownfield-isolated.md +0 -451
  255. package/bundled-skills/expo-brownfield/references/comparison.md +0 -63
  256. package/bundled-skills/expo-brownfield/references/troubleshooting.md +0 -88
  257. package/bundled-skills/expo-data-fetching/SKILL.md +0 -478
  258. package/bundled-skills/expo-data-fetching/agents/openai.yaml +0 -4
  259. package/bundled-skills/expo-data-fetching/references/expo-router-loaders.md +0 -341
  260. package/bundled-skills/expo-data-fetching/references/offline-and-cancellation.md +0 -68
  261. package/bundled-skills/expo-design-system/SKILL.md +0 -376
  262. package/bundled-skills/expo-design-system/agents/openai.yaml +0 -4
  263. package/bundled-skills/expo-design-system/references/audit.md +0 -190
  264. package/bundled-skills/expo-design-system/references/native-slop.md +0 -74
  265. package/bundled-skills/expo-dev-client/SKILL.md +0 -182
  266. package/bundled-skills/expo-dev-client/agents/openai.yaml +0 -4
  267. package/bundled-skills/expo-dom/SKILL.md +0 -425
  268. package/bundled-skills/expo-dom/agents/openai.yaml +0 -4
  269. package/bundled-skills/expo-examples/SKILL.md +0 -106
  270. package/bundled-skills/expo-examples/agents/openai.yaml +0 -4
  271. package/bundled-skills/expo-examples/references/catalog.md +0 -105
  272. package/bundled-skills/expo-migrate-module/SKILL.md +0 -113
  273. package/bundled-skills/expo-migrate-module/agents/openai.yaml +0 -4
  274. package/bundled-skills/expo-migrate-module/references/compatibility.md +0 -73
  275. package/bundled-skills/expo-migrate-module/references/example.md +0 -212
  276. package/bundled-skills/expo-migrate-module/references/migration-map.md +0 -306
  277. package/bundled-skills/expo-module/SKILL.md +0 -151
  278. package/bundled-skills/expo-module/agents/openai.yaml +0 -4
  279. package/bundled-skills/expo-module/references/config-plugin.md +0 -90
  280. package/bundled-skills/expo-module/references/create-expo-module.md +0 -206
  281. package/bundled-skills/expo-module/references/lifecycle.md +0 -127
  282. package/bundled-skills/expo-module/references/module-config.md +0 -48
  283. package/bundled-skills/expo-module/references/native-module.md +0 -286
  284. package/bundled-skills/expo-module/references/native-view.md +0 -171
  285. package/bundled-skills/expo-native-ui/SKILL.md +0 -201
  286. package/bundled-skills/expo-native-ui/agents/openai.yaml +0 -4
  287. package/bundled-skills/expo-native-ui/references/controls.md +0 -231
  288. package/bundled-skills/expo-native-ui/references/gradients.md +0 -106
  289. package/bundled-skills/expo-native-ui/references/icons.md +0 -232
  290. package/bundled-skills/expo-native-ui/references/media.md +0 -193
  291. package/bundled-skills/expo-native-ui/references/storage.md +0 -121
  292. package/bundled-skills/expo-native-ui/references/visual-effects.md +0 -198
  293. package/bundled-skills/expo-native-ui/references/webgpu-three.md +0 -605
  294. package/bundled-skills/expo-overview/SKILL.md +0 -115
  295. package/bundled-skills/expo-overview/agents/openai.yaml +0 -4
  296. package/bundled-skills/expo-project-structure/SKILL.md +0 -114
  297. package/bundled-skills/expo-project-structure/agents/openai.yaml +0 -4
  298. package/bundled-skills/expo-router/SKILL.md +0 -240
  299. package/bundled-skills/expo-router/agents/openai.yaml +0 -4
  300. package/bundled-skills/expo-router/references/form-sheet.md +0 -253
  301. package/bundled-skills/expo-router/references/route-structure.md +0 -229
  302. package/bundled-skills/expo-router/references/search.md +0 -248
  303. package/bundled-skills/expo-router/references/tabs.md +0 -433
  304. package/bundled-skills/expo-router/references/toolbar-and-headers.md +0 -284
  305. package/bundled-skills/expo-router/references/zoom-transitions.md +0 -158
  306. package/bundled-skills/expo-skill-eval/SKILL.md +0 -314
  307. package/bundled-skills/expo-skill-eval/agents/visual-grader.md +0 -52
  308. package/bundled-skills/expo-skill-eval/references/design-rubric.md +0 -45
  309. package/bundled-skills/expo-skill-eval/references/runtime-matrix.md +0 -34
  310. package/bundled-skills/expo-skill-eval/scripts/check-static.sh +0 -64
  311. package/bundled-skills/expo-skill-eval/scripts/clean-fixture.sh +0 -56
  312. package/bundled-skills/expo-skill-eval/scripts/generate_viewer.py +0 -450
  313. package/bundled-skills/expo-skill-eval/scripts/latest-sdk.sh +0 -46
  314. package/bundled-skills/expo-skill-eval/scripts/make-fixture.sh +0 -95
  315. package/bundled-skills/expo-skill-eval/scripts/make-workspace.sh +0 -31
  316. package/bundled-skills/expo-skill-eval/scripts/snapshot-android.sh +0 -284
  317. package/bundled-skills/expo-skill-eval/scripts/snapshot-ios.sh +0 -132
  318. package/bundled-skills/expo-skill-eval/scripts/snapshot-web.sh +0 -61
  319. package/bundled-skills/expo-skill-feedback/SKILL.md +0 -87
  320. package/bundled-skills/expo-skill-feedback/agents/openai.yaml +0 -4
  321. package/bundled-skills/expo-skill-feedback/scripts/skill-event.cjs +0 -180
  322. package/bundled-skills/expo-skill-feedback/scripts/telemetry.cjs +0 -65
  323. package/bundled-skills/expo-skill-feedback/scripts/telemetry_common.cjs +0 -171
  324. package/bundled-skills/expo-ui/SKILL.md +0 -101
  325. package/bundled-skills/expo-ui/agents/openai.yaml +0 -4
  326. package/bundled-skills/expo-ui/references/drop-in-replacements.md +0 -27
  327. package/bundled-skills/expo-ui/references/jetpack-compose.md +0 -73
  328. package/bundled-skills/expo-ui/references/swift-ui.md +0 -73
  329. package/bundled-skills/expo-ui/references/universal.md +0 -104
  330. package/bundled-skills/expo-ui/scripts/list-components.js +0 -193
  331. package/bundled-skills/expo-upgrade/SKILL.md +0 -150
  332. package/bundled-skills/expo-upgrade/agents/openai.yaml +0 -4
  333. package/bundled-skills/expo-upgrade/references/expo-av-to-audio.md +0 -132
  334. package/bundled-skills/expo-upgrade/references/expo-av-to-video.md +0 -160
  335. package/bundled-skills/expo-upgrade/references/native-tabs.md +0 -124
  336. package/bundled-skills/expo-upgrade/references/new-architecture.md +0 -79
  337. package/bundled-skills/expo-upgrade/references/react-19.md +0 -79
  338. package/bundled-skills/expo-upgrade/references/react-compiler.md +0 -59
  339. package/bundled-skills/expo-upgrade/references/react-navigation-to-expo-router.md +0 -61
  340. package/bundled-skills/expo-web-to-native/SKILL.md +0 -91
  341. package/bundled-skills/expo-web-to-native/agents/openai.yaml +0 -4
  342. package/bundled-skills/expo-web-to-native/references/false-friends.md +0 -119
  343. package/bundled-skills/expo-web-to-native/references/native-patterns.md +0 -39
  344. package/bundled-skills/expo-web-to-native/references/run-as-goal.md +0 -48
  345. package/bundled-skills/expo-web-to-native/references/verify-on-device.md +0 -45
  346. package/bundled-skills/find-skills/SKILL.md +0 -141
  347. package/bundled-skills/flutter-add-integration-test/SKILL.md +0 -163
  348. package/bundled-skills/flutter-add-widget-preview/SKILL.md +0 -145
  349. package/bundled-skills/flutter-add-widget-test/SKILL.md +0 -154
  350. package/bundled-skills/flutter-apply-architecture-best-practices/SKILL.md +0 -162
  351. package/bundled-skills/flutter-build-responsive-layout/SKILL.md +0 -139
  352. package/bundled-skills/flutter-fix-layout-issues/SKILL.md +0 -130
  353. package/bundled-skills/flutter-implement-json-serialization/SKILL.md +0 -153
  354. package/bundled-skills/flutter-setup-declarative-routing/SKILL.md +0 -255
  355. package/bundled-skills/flutter-setup-localization/SKILL.md +0 -210
  356. package/bundled-skills/flutter-use-http-package/SKILL.md +0 -174
  357. package/bundled-skills/graph-colorize/SKILL.md +0 -180
  358. package/bundled-skills/hermes-history-ingest/SKILL.md +0 -239
  359. package/bundled-skills/hermes-history-ingest/references/hermes-data-format.md +0 -131
  360. package/bundled-skills/impl-validator/SKILL.md +0 -118
  361. package/bundled-skills/ios-simulator/SKILL.md +0 -32
  362. package/bundled-skills/json-canvas/SKILL.md +0 -244
  363. package/bundled-skills/json-canvas/references/EXAMPLES.md +0 -329
  364. package/bundled-skills/launch/SKILL.md +0 -381
  365. package/bundled-skills/launch/evals/evals.json +0 -106
  366. package/bundled-skills/llm-wiki/SKILL.md +0 -661
  367. package/bundled-skills/llm-wiki/references/WRITING.md +0 -28
  368. package/bundled-skills/llm-wiki/references/karpathy-pattern.md +0 -45
  369. package/bundled-skills/marketing-plan/SKILL.md +0 -300
  370. package/bundled-skills/marketing-plan/evals/evals.json +0 -112
  371. package/bundled-skills/marketing-plan/references/aarrr-framework.md +0 -180
  372. package/bundled-skills/marketing-plan/references/budget-planning.md +0 -168
  373. package/bundled-skills/marketing-plan/references/client-types.md +0 -373
  374. package/bundled-skills/marketing-plan/references/current-state-rubric.md +0 -255
  375. package/bundled-skills/marketing-plan/references/example-quietude.md +0 -972
  376. package/bundled-skills/marketing-plan/references/funding-stage-unlocks.md +0 -230
  377. package/bundled-skills/marketing-plan/references/growth-patterns.md +0 -190
  378. package/bundled-skills/marketing-plan/references/idea-cross-reference.md +0 -265
  379. package/bundled-skills/marketing-plan/references/measurement-framework.md +0 -213
  380. package/bundled-skills/marketing-plan/references/methodology.md +0 -363
  381. package/bundled-skills/marketing-plan/references/ops-stack-mapping.md +0 -197
  382. package/bundled-skills/marketing-plan/references/plan-template.md +0 -494
  383. package/bundled-skills/marketing-plan/references/team-and-agency-model.md +0 -278
  384. package/bundled-skills/marketing-psychology/SKILL.md +0 -455
  385. package/bundled-skills/marketing-psychology/evals/evals.json +0 -88
  386. package/bundled-skills/memory-bridge/SKILL.md +0 -163
  387. package/bundled-skills/memory-save/SKILL.md +0 -88
  388. package/bundled-skills/obsidian-bases/SKILL.md +0 -499
  389. package/bundled-skills/obsidian-bases/references/FUNCTIONS_REFERENCE.md +0 -173
  390. package/bundled-skills/obsidian-cli/SKILL.md +0 -106
  391. package/bundled-skills/obsidian-layout-adjustment/SKILL.md +0 -226
  392. package/bundled-skills/obsidian-layout-adjustment/evals/evals.json +0 -53
  393. package/bundled-skills/obsidian-layout-adjustment/references/workflow-reference.md +0 -212
  394. package/bundled-skills/obsidian-markdown/SKILL.md +0 -196
  395. package/bundled-skills/obsidian-markdown/references/CALLOUTS.md +0 -58
  396. package/bundled-skills/obsidian-markdown/references/EMBEDS.md +0 -70
  397. package/bundled-skills/obsidian-markdown/references/PROPERTIES.md +0 -61
  398. package/bundled-skills/offers/SKILL.md +0 -155
  399. package/bundled-skills/offers/evals/evals.json +0 -21
  400. package/bundled-skills/offers/references/bonus-stacking.md +0 -150
  401. package/bundled-skills/offers/references/examples.md +0 -215
  402. package/bundled-skills/offers/references/guarantee-design.md +0 -172
  403. package/bundled-skills/offers/references/offer-anatomy.md +0 -203
  404. package/bundled-skills/offers/references/offer-formats.md +0 -240
  405. package/bundled-skills/offers/references/saas-offers.md +0 -116
  406. package/bundled-skills/offers/references/scarcity-urgency.md +0 -175
  407. package/bundled-skills/offers/references/value-equation.md +0 -134
  408. package/bundled-skills/onboarding/SKILL.md +0 -261
  409. package/bundled-skills/onboarding/evals/evals.json +0 -108
  410. package/bundled-skills/onboarding/references/activation-models.md +0 -57
  411. package/bundled-skills/onboarding/references/experiments.md +0 -258
  412. package/bundled-skills/onboarding/references/minimum-path-to-value.md +0 -49
  413. package/bundled-skills/openclaw-history-ingest/SKILL.md +0 -257
  414. package/bundled-skills/openclaw-history-ingest/references/openclaw-data-format.md +0 -154
  415. package/bundled-skills/orchestration/SKILL.md +0 -69
  416. package/bundled-skills/pi-history-ingest/SKILL.md +0 -312
  417. package/bundled-skills/pricing/SKILL.md +0 -295
  418. package/bundled-skills/pricing/evals/evals.json +0 -119
  419. package/bundled-skills/pricing/references/pricing-models.md +0 -66
  420. package/bundled-skills/pricing/references/pricing-page-teardown.md +0 -85
  421. package/bundled-skills/pricing/references/research-methods.md +0 -152
  422. package/bundled-skills/pricing/references/tier-structure.md +0 -232
  423. package/bundled-skills/product-marketing/SKILL.md +0 -255
  424. package/bundled-skills/product-marketing/evals/evals.json +0 -98
  425. package/bundled-skills/prospecting/SKILL.md +0 -262
  426. package/bundled-skills/prospecting/evals/evals.json +0 -122
  427. package/bundled-skills/prospecting/references/b2b-prospecting.md +0 -106
  428. package/bundled-skills/prospecting/references/compliance.md +0 -123
  429. package/bundled-skills/prospecting/references/data-sources.md +0 -287
  430. package/bundled-skills/prospecting/references/demand-signals.md +0 -129
  431. package/bundled-skills/prospecting/references/local-prospecting.md +0 -165
  432. package/bundled-skills/prospecting/references/saas-prospecting.md +0 -123
  433. package/bundled-skills/refactor-safely/SKILL.md +0 -29
  434. package/bundled-skills/review-delta/SKILL.md +0 -46
  435. package/bundled-skills/review-pr/SKILL.md +0 -66
  436. package/bundled-skills/sales-enablement/SKILL.md +0 -359
  437. package/bundled-skills/sales-enablement/evals/evals.json +0 -91
  438. package/bundled-skills/sales-enablement/references/deck-frameworks.md +0 -263
  439. package/bundled-skills/sales-enablement/references/demo-scripts.md +0 -355
  440. package/bundled-skills/sales-enablement/references/objection-library.md +0 -270
  441. package/bundled-skills/sales-enablement/references/one-pager-templates.md +0 -208
  442. package/bundled-skills/seo-audit/SKILL.md +0 -499
  443. package/bundled-skills/seo-audit/evals/evals.json +0 -136
  444. package/bundled-skills/seo-audit/references/ai-writing-detection.md +0 -200
  445. package/bundled-skills/seo-audit/references/international-seo.md +0 -230
  446. package/bundled-skills/session-brain/SKILL.md +0 -101
  447. package/bundled-skills/session-search/SKILL.md +0 -97
  448. package/bundled-skills/social/SKILL.md +0 -413
  449. package/bundled-skills/social/evals/evals.json +0 -107
  450. package/bundled-skills/social/references/carousel-frameworks.md +0 -141
  451. package/bundled-skills/social/references/listening-sources-template.md +0 -123
  452. package/bundled-skills/social/references/listening.md +0 -283
  453. package/bundled-skills/social/references/platform-limits.md +0 -110
  454. package/bundled-skills/social/references/platforms.md +0 -170
  455. package/bundled-skills/social/references/post-templates.md +0 -179
  456. package/bundled-skills/social/references/reverse-engineering.md +0 -195
  457. package/bundled-skills/social/references/short-form-video.md +0 -237
  458. package/bundled-skills/tag-taxonomy/SKILL.md +0 -218
  459. package/bundled-skills/vault-skill-factory/SKILL.md +0 -143
  460. package/bundled-skills/video/SKILL.md +0 -346
  461. package/bundled-skills/video/evals/evals.json +0 -103
  462. package/bundled-skills/video/references/ai-video-prompting.md +0 -175
  463. package/bundled-skills/video/references/edit-anatomy.md +0 -84
  464. package/bundled-skills/wiki-agent/SKILL.md +0 -322
  465. package/bundled-skills/wiki-capture/SKILL.md +0 -337
  466. package/bundled-skills/wiki-capture/references/RAW-FORMAT.md +0 -115
  467. package/bundled-skills/wiki-context-pack/SKILL.md +0 -89
  468. package/bundled-skills/wiki-dashboard/SKILL.md +0 -472
  469. package/bundled-skills/wiki-dedup/SKILL.md +0 -320
  470. package/bundled-skills/wiki-digest/SKILL.md +0 -243
  471. package/bundled-skills/wiki-export/SKILL.md +0 -445
  472. package/bundled-skills/wiki-history-ingest/SKILL.md +0 -61
  473. package/bundled-skills/wiki-import/SKILL.md +0 -276
  474. package/bundled-skills/wiki-ingest/SKILL.md +0 -563
  475. package/bundled-skills/wiki-ingest/references/ingest-prompts.md +0 -54
  476. package/bundled-skills/wiki-ingest/references/pageindex.md +0 -72
  477. package/bundled-skills/wiki-ingest/references/url-sources.md +0 -295
  478. package/bundled-skills/wiki-lint/SKILL.md +0 -643
  479. package/bundled-skills/wiki-narrate/SKILL.md +0 -120
  480. package/bundled-skills/wiki-narrate/references/voices.md +0 -29
  481. package/bundled-skills/wiki-query/SKILL.md +0 -307
  482. package/bundled-skills/wiki-rebuild/SKILL.md +0 -212
  483. package/bundled-skills/wiki-research/SKILL.md +0 -319
  484. package/bundled-skills/wiki-setup/SKILL.md +0 -359
  485. package/bundled-skills/wiki-stage-commit/SKILL.md +0 -164
  486. package/bundled-skills/wiki-status/SKILL.md +0 -556
  487. package/bundled-skills/wiki-switch/SKILL.md +0 -115
  488. package/bundled-skills/wiki-synthesize/SKILL.md +0 -212
  489. package/bundled-skills/wiki-update/SKILL.md +0 -271
  490. package/skills/ai-security/SKILL.md +0 -132
  491. package/skills/ai-security/references/atlas-coverage.md +0 -60
  492. package/skills/ai-security/scripts/ai_threat_scanner.py +0 -373
  493. package/skills/anti-AI-design/SKILL.md +0 -72
  494. package/skills/apple-hig-audit/SKILL.md +0 -64
  495. package/skills/apple-hig-audit/references/accessibility.md +0 -78
  496. package/skills/apple-hig-audit/references/platform-specifics.md +0 -57
  497. package/skills/apple-hig-audit/references/visual-design.md +0 -68
  498. package/skills/apple-hig-audit/scripts/hig_checker.py +0 -115
  499. package/skills/apple-hig-audit/templates/hig-audit-template.md +0 -114
  500. package/skills/dependency-auditor/README.md +0 -98
  501. package/skills/dependency-auditor/SKILL.md +0 -114
  502. package/skills/dependency-auditor/assets/sample_go.mod +0 -53
  503. package/skills/dependency-auditor/assets/sample_package.json +0 -72
  504. package/skills/dependency-auditor/assets/sample_requirements.txt +0 -71
  505. package/skills/dependency-auditor/expected_outputs/sample_license_report.txt +0 -37
  506. package/skills/dependency-auditor/expected_outputs/sample_upgrade_plan.txt +0 -59
  507. package/skills/dependency-auditor/expected_outputs/sample_vulnerability_report.json +0 -71
  508. package/skills/dependency-auditor/references/dependency_management_best_practices.md +0 -46
  509. package/skills/dependency-auditor/references/license_compatibility_matrix.md +0 -57
  510. package/skills/dependency-auditor/references/vulnerability_assessment_guide.md +0 -62
  511. package/skills/dependency-auditor/scripts/dep_scanner.py +0 -595
  512. package/skills/dependency-auditor/scripts/license_checker.py +0 -442
  513. package/skills/dependency-auditor/scripts/upgrade_planner.py +0 -490
  514. package/skills/dependency-auditor/test-inventory.json +0 -421
  515. package/skills/dependency-auditor/test-project/package.json +0 -72
  516. package/skills/design-system-tokens/SKILL.md +0 -90
  517. package/skills/design-system-tokens/assets/design_system_doc_template.md +0 -129
  518. package/skills/design-system-tokens/references/component-architecture.md +0 -88
  519. package/skills/design-system-tokens/references/developer-handoff.md +0 -61
  520. package/skills/design-system-tokens/references/responsive-calculations.md +0 -72
  521. package/skills/design-system-tokens/references/token-generation.md +0 -62
  522. package/skills/design-system-tokens/scripts/design_token_generator.py +0 -315
  523. package/skills/engineering-code-standards/SKILL.md +0 -174
  524. package/skills/env-secrets-manager/SKILL.md +0 -102
  525. package/skills/env-secrets-manager/references/secret-patterns.md +0 -56
  526. package/skills/env-secrets-manager/references/validation-detection-rotation.md +0 -76
  527. package/skills/env-secrets-manager/scripts/env_auditor.py +0 -340
  528. package/skills/frontend-design-taste/SKILL.md +0 -62
  529. package/skills/mcp-server-builder/README.md +0 -42
  530. package/skills/mcp-server-builder/SKILL.md +0 -144
  531. package/skills/mcp-server-builder/references/openapi-extraction-guide.md +0 -34
  532. package/skills/mcp-server-builder/references/production-hardening-guide.md +0 -80
  533. package/skills/mcp-server-builder/references/python-server-template.md +0 -22
  534. package/skills/mcp-server-builder/references/spec-compatibility.md +0 -129
  535. package/skills/mcp-server-builder/references/typescript-server-template.md +0 -19
  536. package/skills/mcp-server-builder/references/validation-checklist.md +0 -30
  537. package/skills/mcp-server-builder/scripts/mcp_validator.py +0 -180
  538. package/skills/mcp-server-builder/scripts/openapi_to_mcp.py +0 -279
  539. package/skills/playwright-agent/SKILL.md +0 -147
  540. package/skills/skill-creator/LICENSE.txt +0 -14
  541. package/skills/skill-creator/SKILL.md +0 -471
  542. package/skills/skill-creator/agents/analyzer.md +0 -274
  543. package/skills/skill-creator/agents/comparator.md +0 -202
  544. package/skills/skill-creator/agents/grader.md +0 -223
  545. package/skills/skill-creator/assets/eval_review.html +0 -143
  546. package/skills/skill-creator/eval-viewer/generate_review.py +0 -471
  547. package/skills/skill-creator/eval-viewer/viewer.html +0 -1321
  548. package/skills/skill-creator/references/schemas.md +0 -430
  549. package/skills/skill-creator/scripts/__init__.py +0 -0
  550. package/skills/skill-creator/scripts/aggregate_benchmark.py +0 -401
  551. package/skills/skill-creator/scripts/generate_report.py +0 -322
  552. package/skills/skill-creator/scripts/improve_description.py +0 -247
  553. package/skills/skill-creator/scripts/package_skill.py +0 -136
  554. package/skills/skill-creator/scripts/quick_validate.py +0 -103
  555. package/skills/skill-creator/scripts/run_eval.py +0 -310
  556. package/skills/skill-creator/scripts/run_loop.py +0 -328
  557. package/skills/skill-creator/scripts/utils.py +0 -47
  558. package/skills/write-a-skill/SKILL.md +0 -111
  559. package/skills/write-a-skill/references/companion_tooling.md +0 -61
  560. package/skills/write-a-skill/references/description_design_patterns.md +0 -136
  561. package/skills/write-a-skill/references/progressive_disclosure_principles.md +0 -87
  562. package/skills/write-a-skill/references/quality_gates_for_skills.md +0 -158
  563. package/skills/write-a-skill/scripts/skill_description_validator.py +0 -241
  564. package/skills/write-a-skill/scripts/skill_review_checklist_runner.py +0 -257
  565. package/skills/write-a-skill/scripts/skill_structure_validator.py +0 -265
@@ -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.2.8",
104
- "@tarquinen/opencode-dcp@latest",
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: "@anthropic-ai/narsil-mcp", bin: "narsil-mcp" },
183
- { pkg: "@anthropic-ai/mcp-cron", bin: "mcp-cron" },
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.2.8",
204
- "@tarquinen/opencode-dcp@latest",
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) {
@@ -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", "./bundled-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
- note("opencode not detected. Global installation...");
89
- const installResult = spawnSync("npm", ["install", "-g", "opencode"], {
90
- encoding: "utf8",
91
- stdio: "inherit"
92
- });
93
- if (installResult.status !== 0) {
94
- process.stderr.write("Failed to install opencode. Try: npm install -g opencode\n");
95
- process.exit(1);
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: "@anthropic-ai/narsil-mcp", bin: "narsil-mcp", name: "narsil" },
323
- { pkg: "@anthropic-ai/mcp-cron", bin: "mcp-cron", name: "cron" },
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.2.8",
353
- "@tarquinen/opencode-dcp@latest",
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.2.8",
415
- "@tarquinen/opencode-dcp@latest",
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
- categories: { type: "array", items: { type: "string" } },
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: args?.categories ? args.categories.map(String) : [],
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
- if (action === "drop") return toolResult(dropTodo(db, String(args?.id ?? ""), args?.reason ? String(args.reason) : ""));
476
- if (action === "reorder") {
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.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": "./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"
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);
@@ -0,0 +1,5 @@
1
+ [
2
+ { "tool": "playwright_browser_navigate", "url": "http://localhost:3000" },
3
+ { "tool": "playwright_browser_snapshot" },
4
+ { "tool": "playwright_browser_click", "target": "ref=e1" }
5
+ ]