novahiz 0.2.5 → 0.3.2

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 (54) hide show
  1. package/NOTICE.md +18 -6
  2. package/README.md +12 -7
  3. package/adapters/README.md +1 -1
  4. package/adapters/opencode/agent/novahiz.md +2 -2
  5. package/adapters/opencode/instructions.md +2 -1
  6. package/adapters/opencode/novahiz.ts +336 -40
  7. package/catalog/categories.json +282 -9
  8. package/catalog/overrides.json +727 -0
  9. package/catalog/providers.json +63 -10
  10. package/catalog/rules.json +42 -9
  11. package/docs/ARCHITECTURE.md +2 -2
  12. package/docs/CATALOG.md +4 -4
  13. package/docs/CLASSIFICATION.md +3 -1
  14. package/docs/CONFIGURATION.md +5 -5
  15. package/docs/CONVERGENCE-2026-09-25.md +5 -0
  16. package/docs/GATE.md +26 -15
  17. package/docs/HARNESSES.md +10 -6
  18. package/docs/INSTALL.md +1 -0
  19. package/docs/PROVIDERS.md +21 -6
  20. package/docs/ROADMAPS.md +29 -0
  21. package/docs/RULES.md +7 -4
  22. package/install/bootstrap.mjs +29 -24
  23. package/install/install.mjs +56 -19
  24. package/install/lib.mjs +20 -4
  25. package/mcp/novahiz-tools/README.md +5 -0
  26. package/mcp/novahiz-tools/index.mjs +78 -7
  27. package/novahiz.config.example.json +4 -3
  28. package/package.json +3 -2
  29. package/skills/gate/SKILL.md +16 -1
  30. package/skills/novahiz-analyse/SKILL.md +2 -2
  31. package/skills/novahiz-audit/SKILL.md +1 -1
  32. package/skills/novahiz-code-review/SKILL.md +1 -1
  33. package/skills/novahiz-converge/SKILL.md +1 -1
  34. package/skills/novahiz-gate/SKILL.md +2 -1
  35. package/skills/novahiz-implement/SKILL.md +2 -2
  36. package/skills/novahiz-plan/SKILL.md +2 -2
  37. package/skills/novahiz-planner/SKILL.md +5 -3
  38. package/skills/novahiz-task/SKILL.md +1 -1
  39. package/skills/prompt-rewriter/SKILL.md +18 -13
  40. package/src/cli.ts +24 -4
  41. package/src/commands/context.ts +43 -4
  42. package/src/commands/doctor.ts +26 -8
  43. package/src/commands/gate.ts +66 -85
  44. package/src/commands/graft.ts +14 -9
  45. package/src/commands/inspect.ts +28 -2
  46. package/src/commands/task.ts +30 -1
  47. package/src/exec.ts +38 -10
  48. package/src/gate-repair.ts +87 -0
  49. package/src/gate.ts +156 -14
  50. package/src/graft.ts +56 -23
  51. package/src/ledger.ts +12 -2
  52. package/src/memory.ts +14 -1
  53. package/src/prompt-rewriter.ts +357 -24
  54. package/src/spec.ts +19 -6
@@ -3,7 +3,7 @@
3
3
  "id": "playwright",
4
4
  "label": "Playwright MCP",
5
5
  "kind": "mcp",
6
- "command": ["npx", "-y", "@playwright/mcp@latest"],
6
+ "command": ["npx", "-y", "@playwright/mcp@0.0.82"],
7
7
  "source": "https://github.com/microsoft/playwright-mcp",
8
8
  "license": "Apache-2.0",
9
9
  "categories": ["browser", "design-ui"]
@@ -12,7 +12,7 @@
12
12
  "id": "security",
13
13
  "label": "Security MCP",
14
14
  "kind": "mcp",
15
- "command": ["npx", "-y", "security-mcp@latest", "serve"],
15
+ "command": ["npx", "-y", "security-mcp@1.3.7", "serve"],
16
16
  "source": "https://github.com/AbrahamOO/security-mcp",
17
17
  "license": "MIT",
18
18
  "categories": ["audit"]
@@ -21,7 +21,7 @@
21
21
  "id": "narsil",
22
22
  "label": "Narsil Code Intelligence",
23
23
  "kind": "mcp",
24
- "command": ["npx", "-y", "narsil-mcp@latest", "--repos", "."],
24
+ "command": ["npx", "-y", "narsil-mcp@1.7.0", "--repos", "."],
25
25
  "source": "https://github.com/postrv/narsil-mcp",
26
26
  "license": "MIT OR Apache-2.0",
27
27
  "categories": ["code", "review"]
@@ -30,7 +30,7 @@
30
30
  "id": "context7",
31
31
  "label": "Context7 Documentation",
32
32
  "kind": "mcp",
33
- "command": ["npx", "-y", "@upstash/context7-mcp@latest"],
33
+ "command": ["npx", "-y", "@upstash/context7-mcp@4.1.1"],
34
34
  "source": "https://github.com/upstash/context7",
35
35
  "license": "MIT",
36
36
  "categories": ["code"]
@@ -39,18 +39,71 @@
39
39
  "id": "cron",
40
40
  "label": "Cron Scheduler",
41
41
  "kind": "mcp",
42
- "command": ["npx", "-y", "mcp-cron@latest"],
43
- "source": "https://github.com/jolks/mcp-cron",
44
- "license": "AGPL-3.0-only",
45
- "categories": ["devops"]
42
+ "command": ["python", "C:/path/to/scheduler-mcp/main.py"],
43
+ "source": "https://github.com/PhialsBasement/scheduler-mcp",
44
+ "license": "MIT",
45
+ "categories": ["devops"],
46
+ "purpose": "MIT scheduler clone (requirements pin mcp<2); no npm package exists. Clone PhialsBasement/scheduler-mcp, install its requirements into a venv, then point `command` at that venv's python and your clone's main.py (setup in docs/PROVIDERS.md). Shipped disabled: enable it after the local setup."
46
47
  },
47
48
  {
48
49
  "id": "novahiz",
49
50
  "label": "novahiz",
50
51
  "kind": "mcp",
51
- "command": ["node", "C:/Users/hiz/.config/novahiz/mcp/novahiz-tools/index.mjs"],
52
+ "command": ["node", "~/.config/novahiz/mcp/novahiz-tools/index.mjs"],
52
53
  "source": "https://github.com/novahiz/novahiz",
53
54
  "license": "Apache-2.0",
54
- "categories": ["code", "planning"]
55
+ "categories": ["code", "planning"],
56
+ "purpose": "Novahiz stdio MCP (novahiz_providers, novahiz_deps, memory tools). The opencode plugin resolves this path from the home directory itself; edit the command for other harnesses."
57
+ },
58
+ {
59
+ "id": "dart",
60
+ "label": "Dart / Flutter MCP",
61
+ "kind": "mcp",
62
+ "command": ["dart", "mcp-server"],
63
+ "requires": ["dart"],
64
+ "source": "https://github.com/dart-lang/ai/tree/main/pkgs/dart_mcp_server",
65
+ "license": "BSD-3-Clause",
66
+ "categories": ["code", "debug", "design-ui", "flutter"],
67
+ "purpose": "Official Dart SDK MCP: analyzer diagnostics, symbols, test launch, runtime inspection."
68
+ },
69
+ {
70
+ "id": "flutter-skills",
71
+ "label": "Flutter agent skills",
72
+ "kind": "skill",
73
+ "install": ["npx", "-y", "skills@1.7.0", "add", "flutter/agent-plugins", "--skill", "*", "-g", "-a", "opencode", "-y"],
74
+ "source": "https://github.com/flutter/agent-plugins",
75
+ "license": "BSD-3-Clause",
76
+ "categories": ["code", "design-ui", "flutter"],
77
+ "purpose": "25 official Flutter/Dart agent skills (layouts, tests, architecture, routing, l10n)."
78
+ },
79
+ {
80
+ "id": "dart-skills",
81
+ "label": "Dart agent skills",
82
+ "kind": "skill",
83
+ "install": ["npx", "-y", "skills@1.7.0", "add", "dart-lang/skills", "--skill", "*", "-g", "-a", "opencode", "-y"],
84
+ "source": "https://github.com/dart-lang/skills",
85
+ "license": "BSD-3-Clause",
86
+ "categories": ["code", "debug", "flutter"],
87
+ "purpose": "15 official Dart skills (subset of flutter/agent-plugins, kept for provenance)."
88
+ },
89
+ {
90
+ "id": "expo-skills",
91
+ "label": "Expo agent skills",
92
+ "kind": "skill",
93
+ "install": ["npx", "-y", "skills@1.7.0", "add", "expo/skills", "--skill", "expo-overview", "expo-project-structure", "expo-router", "expo-animation", "expo-native-ui", "expo-design-system", "expo-ui", "expo-data-fetching", "expo-dom", "expo-web-to-native", "expo-module", "expo-brownfield", "expo-dev-client", "expo-examples", "expo-app-clip", "expo-upgrade", "expo-skill-feedback", "-g", "-a", "opencode", "-y"],
94
+ "source": "https://github.com/expo/skills",
95
+ "license": "MIT",
96
+ "categories": ["code", "expo"],
97
+ "purpose": "17 official Expo framework skills (expo-* group); the 7 eas-* paid-service skills are excluded. Installed to ~/.agents/skills; when git clone fails, fetch the tarball from codeload.github.com and copy the skill folders."
98
+ },
99
+ {
100
+ "id": "impeccable",
101
+ "label": "Impeccable design skill",
102
+ "kind": "skill",
103
+ "install": ["npx", "-y", "skills@1.7.0", "add", "pbakaus/impeccable", "--skill", "impeccable", "-g", "-a", "opencode", "-y"],
104
+ "source": "https://github.com/pbakaus/impeccable",
105
+ "license": "Apache-2.0",
106
+ "categories": ["design-ui"],
107
+ "purpose": "Upstream Impeccable skill (critique, audit and polish playbooks) required by gate rule R14. Installed to ~/.agents/skills; rerun the command to update."
55
108
  }
56
109
  ]
@@ -16,8 +16,6 @@
16
16
  "match": "any",
17
17
  "promptCategories": ["browser"],
18
18
  "pathGlobs": [
19
- "**/*.spec.ts",
20
- "**/*.spec.js",
21
19
  "**/*.e2e.ts",
22
20
  "**/*.e2e.js",
23
21
  "**/*.pw.ts",
@@ -32,7 +30,23 @@
32
30
  "id": "R6-Novahiz",
33
31
  "description": "Load Novahiz pipeline skills for any task triggering the workflow.",
34
32
  "when": {
35
- "promptCategories": ["code", "debug", "review", "audit", "browser", "design-ui", "database-supabase", "docs-writing", "planning", "devops", "data", "general"]
33
+ "promptCategories": [
34
+ "code",
35
+ "debug",
36
+ "review",
37
+ "audit",
38
+ "browser",
39
+ "design-ui",
40
+ "database-supabase",
41
+ "docs-writing",
42
+ "planning",
43
+ "devops",
44
+ "data",
45
+ "general",
46
+ "flutter",
47
+ "expo",
48
+ "test"
49
+ ]
36
50
  },
37
51
  "require": ["novahiz-plan", "novahiz-clarify", "novahiz-analyse", "novahiz-implement", "novahiz-converge"]
38
52
  },
@@ -48,17 +62,19 @@
48
62
  "id": "R8-docs",
49
63
  "description": "Load novahiz-docs when editing project documentation.",
50
64
  "when": {
51
- "pathGlobs": ["novahiz-docs/**/*.md"]
65
+ "pathGlobs": ["**/novahiz-docs/**/*.md"]
52
66
  },
53
67
  "require": ["novahiz-docs"]
54
68
  },
55
69
  {
56
70
  "id": "R9-code-review",
57
- "description": "Load novahiz-code-review on any code review task.",
71
+ "description": "Load novahiz-code-review on code review tasks or code edits of 200+ characters (small touch-ups skip the review).",
58
72
  "when": {
59
73
  "match": "any",
60
74
  "promptCategories": ["review"],
61
- "fileClasses": ["code"]
75
+ "fileClasses": ["code"],
76
+ "pathGlobs": ["**/*.tsx", "**/*.jsx", "**/*.vue", "**/*.svelte", "**/*.astro"],
77
+ "minChange": 200
62
78
  },
63
79
  "require": ["novahiz-code-review"]
64
80
  },
@@ -67,13 +83,13 @@
67
83
  "description": "Load novahiz-security on any security audit or hardening task.",
68
84
  "when": {
69
85
  "match": "any",
70
- "promptCategories": ["audit", "security"]
86
+ "promptCategories": ["audit"]
71
87
  },
72
88
  "require": ["novahiz-security"]
73
89
  },
74
90
  {
75
91
  "id": "R11-accessibility",
76
- "description": "Load novahiz-wcag-audit on any a11y audit or WCAG task.",
92
+ "description": "Load novahiz-wcag-audit on design-ui work and on audit prompts, where accessibility is in scope.",
77
93
  "when": {
78
94
  "match": "any",
79
95
  "promptCategories": ["design-ui", "audit"]
@@ -105,5 +121,22 @@
105
121
  ]
106
122
  },
107
123
  "require": ["novahiz-humanizer", "ui-slop-remover", "ui-craft-rules"]
124
+ },
125
+ {
126
+ "id": "R14-impeccable",
127
+ "description": "Load the impeccable design skill on frontend design tasks so critique/audit/polish playbooks stay available.",
128
+ "when": {
129
+ "match": "any",
130
+ "promptCategories": ["design-ui"],
131
+ "pathGlobs": [
132
+ "**/*.css",
133
+ "**/*.scss",
134
+ "**/*.sass",
135
+ "**/*.less",
136
+ "**/*.html",
137
+ "**/*.htm"
138
+ ]
139
+ },
140
+ "require": ["impeccable"]
108
141
  }
109
- ]
142
+ ]
@@ -41,8 +41,8 @@ Novahiz has one core and thin adapters. The core holds every decision. An adapte
41
41
 
42
42
  Three versioned JSON files under `catalog/`:
43
43
 
44
- - `categories.json` — lists 15 categories with keywords, required skills, and execution roadmaps.
45
- - `rules.json` — lists 6 pre-edit rules with conditions (file class, path glob, prompt category, content match) and required skills.
44
+ - `categories.json` — lists 17 categories with keywords, required skills, and execution roadmaps.
45
+ - `rules.json` — lists 11 pre-edit rules with conditions (file class, path glob, prompt category, content match) and required skills.
46
46
  - `providers.json` — lists external MCP servers with their purpose and the categories they serve.
47
47
  - `overrides.json` — carries manual skill curation (power, stars, tags, categories).
48
48
 
package/docs/CATALOG.md CHANGED
@@ -6,9 +6,9 @@ The catalog is the knowledge base of Novahiz. It defines what categories exist,
6
6
 
7
7
  ```
8
8
  catalog/
9
- ├── categories.json # 15 categories with keywords, skills, roadmaps
10
- ├── rules.json # 6 pre-edit rules (file class + content triggers)
11
- ├── providers.json # 6 external MCP servers and skill packs
9
+ ├── categories.json # 17 categories with keywords, skills, roadmaps
10
+ ├── rules.json # 11 pre-edit rules (file class + content triggers)
11
+ ├── providers.json # 11 external providers (7 MCP + 4 skill packs)
12
12
  └── overrides.json # Manual skill curation (power, stars, tags)
13
13
  ```
14
14
 
@@ -23,7 +23,7 @@ Each category is a JSON object:
23
23
  "priority": 57,
24
24
  "keywords": ["supabase", "postgres", "sql", "rls", "migration", ...],
25
25
  "negativeKeywords": ["mockup", "landing"],
26
- "defaultSkills": ["supabase", "supabase-postgres-best-practices"],
26
+ "defaultSkills": ["novahiz-supabase", "novahiz-postgres"],
27
27
  "roadmap": {
28
28
  "id": "schema",
29
29
  "steps": [
@@ -75,10 +75,12 @@ The classifier is the brain of Novahiz. It maps a natural language prompt to cat
75
75
 
76
76
  ## Categories
77
77
 
78
- Novahiz defines 15 categories, each with its own keywords, priority, and roadmap:
78
+ Novahiz defines 17 categories, each with its own keywords, priority, and roadmap:
79
79
 
80
80
  | Category | Priority | Keywords (examples) | Roadmap |
81
81
  |----------|----------|---------------------|---------|
82
+ | `flutter` | 61 | flutter, dart, widget, pubspec, riverpod | `flutter-feature` (10 steps) |
83
+ | `expo` | 61 | expo, react native, expo router, eas build | `expo-feature` (11 steps) |
82
84
  | `code` | 60 | code, function, class, typescript, react, api | `feature` (7 steps) |
83
85
  | `debug` | 58 | bug, error, crash, fix, regression | `bugfix` (7 steps) |
84
86
  | `database-supabase` | 57 | supabase, postgres, sql, rls, migration | `schema` (9 steps) |
@@ -25,7 +25,7 @@ These files live in `catalog/` and are part of the git repository:
25
25
  "enabled": true,
26
26
  "mode": "block",
27
27
  "envEscape": "NOVAHIZ_GATE",
28
- "tools": ["edit", "write", "patch", "apply_patch", "bash", "shell"],
28
+ "tools": ["edit", "write", "patch", "apply_patch", "bash", "shell", "cron_add_command_task", "cron_update_command_task", "cron_update_task", "cron_run_task_now"],
29
29
  "ignoreFiles": ["**/node_modules/**", "**/dist/**", ...],
30
30
  "placeholders": true,
31
31
  "trace": {
@@ -41,7 +41,7 @@ These files live in `catalog/` and are part of the git repository:
41
41
  "providers": {
42
42
  "autoRegister": true,
43
43
  "autoInstall": false,
44
- "disabled": []
44
+ "disabled": ["cron"]
45
45
  },
46
46
  "ledger": {
47
47
  "enabled": true,
@@ -62,14 +62,14 @@ These files live in `catalog/` and are part of the git repository:
62
62
  | `gate.enabled` | `true` | Enable/disable the gate |
63
63
  | `gate.mode` | `block` | `block`, `warn`, or `audit` |
64
64
  | `gate.envEscape` | `NOVAHIZ_GATE` | Schema field only. The kill-switch name is hardcoded to `NOVAHIZ_GATE` in the CLI, MCP gate, and plugin; a config value cannot redirect it. |
65
- | `gate.tools` | `[edit, write, patch, ...]` | Tools to intercept |
65
+ | `gate.tools` | `[edit, write, patch, apply_patch, bash, shell, cron_add_command_task, cron_update_command_task, cron_update_task, cron_run_task_now]` | Tools to intercept |
66
66
  | `gate.placeholders` | `true` | Block edits with placeholder markers |
67
67
  | `classify.minScore` | `1` | Minimum score to match a category |
68
68
  | `classify.maxCategories` | `3` | Maximum categories per prompt |
69
69
  | `classify.fallbackCategory` | `general` | Fallback when no category matches |
70
70
  | `providers.autoRegister` | `true` | Auto-register MCP providers |
71
71
  | `providers.autoInstall` | `false` | Auto-install provider dependencies |
72
- | `providers.disabled` | `[]` | Providers to skip |
72
+ | `providers.disabled` | `["cron"]` | Providers to skip (`cron` needs a local scheduler clone first) |
73
73
  | `ledger.enabled` | `true` | Enable the task ledger |
74
74
  | `ledger.review.edits` | `3` | Force review after N edits |
75
75
  | `ledger.review.todos` | `2` | Force review after N completed todos |
@@ -88,7 +88,7 @@ These files live in `catalog/` and are part of the git repository:
88
88
 
89
89
  The installer generates `opencode.jsonc` with:
90
90
 
91
- - MCP server registrations (context7, narsil, cron, playwright, supabase)
91
+ - MCP server registrations (context7, narsil, cron, playwright, security, dart, novahiz)
92
92
  - Skill paths
93
93
  - Plugin list
94
94
  - Compaction settings
@@ -0,0 +1,5 @@
1
+ # Convergence audit 2026-09-25
2
+ SATISFAIT: LOW plugin (b3ccf5d), GATE_TOOLS (a3edbe0), regles/tests (64d266b), Orca (49d3ce3), audit sub-agents (b3).
3
+ DEFERE (utilisateur accepte): P0-P2 audit recommendations (16 items: gate tier/content, kill-switch, skills index, plugin session, capture-cli, postinstall, bootstrap, cron, narsil, auth, env, index rebuild, docs sync, R8, test cat, .tsx, dedup, purge).
4
+ NON EVALUE: runtime Edge/Orca, conversations, CVE dependances.
5
+ ACTION: redemarrer opencode (plugin/config changes).
package/docs/GATE.md CHANGED
@@ -14,14 +14,14 @@ The gate is the enforcement mechanism. It inspects every file edit and decides w
14
14
  ┌─────────────────────────────────────────────────────────────┐
15
15
  │ FILE CLASSIFICATION │
16
16
  │ │
17
- │ src/components/Hero.tsx → "code" │
17
+ │ src/components/Hero.tsx → "design" │
18
18
  │ │
19
19
  │ Rules: │
20
- │ • *.ts, *.tsx, *.js, *.jsx, *.py, *.go, ... → "code" │
21
- │ • *.css, *.scss, *.html, *.vue, *.svelte → "design" │
20
+ │ • *.ts, *.js, *.py, *.go, *.sql, *.sh, ... → "code" │
21
+ │ • *.css, *.scss, *.html, *.vue, *.svelte, *.tsx → "design" │
22
22
  │ • *.md, *.txt, *.rst → "text" │
23
- │ • *.json, *.yaml, *.toml → "config" │
24
- │ • *.csv, *.sql, *.db → "data" │
23
+ │ • *.json, *.yaml, *.toml, *.csv → "data" │
24
+ │ • *.env, *.ini, *.cfg, dotfiles → "config" │
25
25
  └──────────────────────────┬──────────────────────────────────┘
26
26
  │
27
27
  ▼
@@ -38,6 +38,11 @@ The gate is the enforcement mechanism. It inspects every file edit and decides w
38
38
  │ + ui-slop-remover + ui-craft-rules │
39
39
  │ (Humanizer and ui-slop-remover are design-only.) │
40
40
  │ │
41
+ │ R14-impeccable: │
42
+ │ match: any │
43
+ │ promptCategories: ["design-ui"] OR pathGlobs: css/html │
44
+ │ → require impeccable (critique/audit/polish playbooks) │
45
+ │ │
41
46
  │ R3-supabase: │
42
47
  │ promptCategories: ["database-supabase"] │
43
48
  │ → Was the prompt classified as Supabase? │
@@ -59,14 +64,17 @@ The gate is the enforcement mechanism. It inspects every file edit and decides w
59
64
  │ Primary category: database-supabase │
60
65
  │ Roadmap: schema │
61
66
  │ │
62
- │ Non-optional skill steps: │
67
+ │ Non-optional skill steps (kind: "skill" only): │
63
68
  │ • plan → novahiz-plan │
64
69
  │ • clarify → novahiz-clarify │
65
70
  │ • inspect → novahiz-analyse │
66
71
  │ • load → novahiz-supabase │
67
- │ • migration → novahiz-implement │
68
72
  │ • security → novahiz-postgres │
69
- │ • converge → novahiz-converge │
73
+ │ │
74
+ │ Skipped (kind is not "skill"): │
75
+ │ • migration (edit), test (verify), converge (verify), │
76
+ │ document (advisory) — listed in the roadmap, never │
77
+ │ added to requiredSkills │
70
78
  └──────────────────────────┬──────────────────────────────────┘
71
79
  │
72
80
  ▼
@@ -100,8 +108,8 @@ The gate is the enforcement mechanism. It inspects every file edit and decides w
100
108
  │ VERDICT │
101
109
  │ │
102
110
  │ allow: false │
103
- │ missingSkills: ["supabase", "supabase-postgres-best-..."] │
104
- │ reasons: ["missing skill: supabase"] │
111
+ │ missingSkills: ["novahiz-supabase", "novahiz-postgres"] │
112
+ │ reasons: ["missing skill: novahiz-supabase"] │
105
113
  │ │
106
114
  │ Exit code: 2 → ADAPTER THROWS → MODEL SEES ERROR │
107
115
  └─────────────────────────────────────────────────────────────┘
@@ -113,11 +121,14 @@ The gate classifies files by extension:
113
121
 
114
122
  | Class | Extensions |
115
123
  |-------|------------|
116
- | `code` | `.ts`, `.tsx`, `.js`, `.jsx`, `.py`, `.go`, `.rs`, `.java`, `.kt`, `.swift`, `.php`, `.dart`, `.rb`, `.c`, `.cpp`, `.h` |
117
- | `design` | `.css`, `.scss`, `.sass`, `.less`, `.styl`, `.html`, `.vue`, `.svelte`, `.astro` |
118
- | `text` | `.md`, `.txt`, `.rst`, `.adoc` |
119
- | `config` | `.json`, `.yaml`, `.yml`, `.toml`, `.ini`, `.env` |
120
- | `data` | `.csv`, `.sql`, `.db`, `.sqlite` |
124
+ | `code` | `.ts`, `.js`, `.mjs`, `.cjs`, `.py`, `.go`, `.rs`, `.java`, `.kt`, `.swift`, `.php`, `.dart`, `.rb`, `.c`, `.cpp`, `.h`, `.sh`, `.ps1`, `.sql` |
125
+ | `design` | `.css`, `.scss`, `.sass`, `.less`, `.styl`, `.html`, `.htm`, `.vue`, `.svelte`, `.astro`, `.jsx`, `.tsx` |
126
+ | `text` | `.md`, `.mdx`, `.txt`, `.rst`, `.adoc` |
127
+ | `data` | `.json`, `.jsonc`, `.yaml`, `.yml`, `.toml`, `.csv`, `.tsv`, `.xml` |
128
+ | `config` | `.env`, `.ini`, `.cfg`, `.conf`, dotfiles (`.gitignore`, `.eslintrc.json`, …) |
129
+ | `other` | anything else (including `.db` and `.sqlite`, which have no mapping) |
130
+
131
+ Note the deliberate differences from intuition: `.tsx`/`.jsx` are `design` (component styling surfaces), `.json`/`.yaml` are `data`, and `.sql` is `code`.
121
132
 
122
133
  ## Rule selectors
123
134
 
package/docs/HARNESSES.md CHANGED
@@ -19,14 +19,18 @@ Source: opencode plugin docs (`~/.config/opencode/plugins/`).
19
19
 
20
20
  ### Third-party opencode plugins
21
21
 
22
- Besides the Novahiz adapter, the bootstrap and installer may pin these packages in `opencode.jsonc` under `plugin[]`. They ship from npm and are not vendored here.
22
+ Besides the Novahiz adapter, no third-party plugin is installed. The bootstrap and installer no longer pin any package under `plugin[]` — these were removed on 2026-09-26 and must not come back:
23
23
 
24
- | Package | Repository | License |
25
- | --- | --- | --- |
26
- | `@mohak34/opencode-notifier` | https://github.com/mohak34/opencode-notifier | MIT |
27
- | `@tarquinen/opencode-dcp` | https://github.com/Opencode-DCP/opencode-dynamic-context-pruning | AGPL-3.0-or-later |
24
+ | Package | Repository | License | Status |
25
+ | --- | --- | --- | --- |
26
+ | `@mohak34/opencode-notifier` | https://github.com/mohak34/opencode-notifier | MIT | removed 2026-09-26 |
27
+ | `@tarquinen/opencode-dcp` | https://github.com/Opencode-DCP/opencode-dynamic-context-pruning | AGPL-3.0-or-later | removed 2026-09-26 |
28
28
 
29
- `opencode-dcp` is AGPL-3.0-or-later. Installing it accepts that license for the plugin package. Full provider MCP provenance lives in [PROVIDERS.md](PROVIDERS.md) and `catalog/providers.json`.
29
+ Full provider MCP provenance lives in [PROVIDERS.md](PROVIDERS.md) and `catalog/providers.json`.
30
+
31
+ ### Official Flutter / Dart providers
32
+
33
+ The installer can register the Dart MCP (`dart mcp-server`) and, with `--flutter-skills`, install the official skill packs into `~/.agents/skills` (merged into `skills.paths`). Nothing is vendored here; commands and licences are in [PROVIDERS.md](PROVIDERS.md) and `NOTICE.md`. After a config change, restart opencode so the new MCP entry is read at import.
30
34
 
31
35
  ## Other clients
32
36
 
package/docs/INSTALL.md CHANGED
@@ -37,6 +37,7 @@ Restart opencode afterward. The plugin in `~/.config/opencode/plugins/novahiz.ts
37
37
  - `--no-skills` skips the skills copy.
38
38
  - `--force-skills` recopies a skill even when another scanned root already provides it.
39
39
  - `--install-providers` runs the provider dependency bootstrap and install commands.
40
+ - `--flutter-skills` installs the official skill packs from `flutter/agent-plugins` and `dart-lang/skills` via `npx skills add -g -a opencode` (upstream licences apply; nothing is vendored).
40
41
  - `--force` rewrites `novahiz.config.json` (the previous file is backed up as `novahiz.config.json.novahiz-bak`).
41
42
  - `--yes` skips every prompt. Use it in scripts and CI, where there is no terminal to answer.
42
43
  - `--interactive` forces the prompts even when the output is not a terminal.
package/docs/PROVIDERS.md CHANGED
@@ -40,16 +40,30 @@ MCP servers, with provenance from `catalog/providers.json`:
40
40
  | --- | --- | --- | --- | --- |
41
41
  | `playwright` | `@playwright/mcp` | [microsoft/playwright-mcp](https://github.com/microsoft/playwright-mcp) | Apache-2.0 | browser, design-ui |
42
42
  | `security` | `security-mcp` | [AbrahamOO/security-mcp](https://github.com/AbrahamOO/security-mcp) | MIT | audit |
43
- | `narsil` | `narsil-mcp` | [postrv/narsil-mcp](https://github.com/postrv/narsil-mcp) | MIT OR Apache-2.0 | code, debug, review, audit |
44
- | `context7` | `@upstash/context7-mcp` | [upstash/context7](https://github.com/upstash/context7) | MIT | code, research |
45
- | `cron` | `mcp-cron` | [jolks/mcp-cron](https://github.com/jolks/mcp-cron) | AGPL-3.0-only | devops, general |
43
+ | `narsil` | `narsil-mcp` | [postrv/narsil-mcp](https://github.com/postrv/narsil-mcp) | MIT OR Apache-2.0 | code, review |
44
+ | `context7` | `@upstash/context7-mcp` | [upstash/context7](https://github.com/upstash/context7) | MIT | code |
45
+ | `cron` | `scheduler-mcp` (local venv) | [PhialsBasement/scheduler-mcp](https://github.com/PhialsBasement/scheduler-mcp) | MIT | devops |
46
46
  | `novahiz` | local (`mcp/novahiz-tools`) | [novahiz/novahiz](https://github.com/novahiz/novahiz) | Apache-2.0 | code, planning |
47
+ | `dart` | `dart mcp-server` (Dart SDK) | [dart-lang/ai · dart_mcp_server](https://github.com/dart-lang/ai/tree/main/pkgs/dart_mcp_server) | BSD-3-Clause | code, debug, design-ui, flutter |
47
48
 
48
- `cron` is AGPL-3.0-only. Enabling it means you accept that license for the install command, not for Novahiz itself.
49
+ `cron` runs `scheduler-mcp` (MIT) from a local clone with its own virtualenv. It replaced the former AGPL `mcp-cron` npm package; there is no npm install step for it. It ships disabled because the `command` has to point at your own clone: install the upstream requirements into a venv, set `command` to that venv's python plus your clone's `main.py`, then remove `cron` from `providers.disabled`.
50
+
51
+ `dart` requires the Dart SDK on `PATH` (`requires: ["dart"]`). Without it the MCP entry still registers, but the server fails to start; disable it or install the SDK.
49
52
 
50
53
  Skill and command packs:
51
54
 
52
- None are bundled. Design and text skills ship as ordinary skills under the `Novahiz-*` prefix (or the catalog), not as providers.
55
+ | Id | Install command | Upstream | License | Categories |
56
+ | --- | --- | --- | --- | --- |
57
+ | `flutter-skills` | `npx skills add flutter/agent-plugins --skill '*' -g -a opencode -y` | [flutter/agent-plugins](https://github.com/flutter/agent-plugins) | BSD-3-Clause | code, design-ui, flutter |
58
+ | `dart-skills` | `npx skills add dart-lang/skills --skill '*' -g -a opencode -y` | [dart-lang/skills](https://github.com/dart-lang/skills) | BSD-3-Clause | code, debug, flutter |
59
+ | `expo-skills` | `npx skills add expo/skills --skill expo-overview ... -g -a opencode -y` | [expo/skills](https://github.com/expo/skills) | MIT | code, expo |
60
+ | `impeccable` | `npx skills add pbakaus/impeccable --skill impeccable -g -a opencode -y` | [pbakaus/impeccable](https://github.com/pbakaus/impeccable) | Apache-2.0 | design-ui |
61
+
62
+ Installed skills land under `~/.agents/skills` for OpenCode. They are referenced by install command, never vendored in this repository. `dart-lang/skills` is a subset of `flutter/agent-plugins` (same 15 Dart skills); both are listed for provenance.
63
+
64
+ `expo-skills` names the 17 `expo-*` skills explicitly; the 7 `eas-*` skills (paid EAS services) are excluded. When `npx skills add` cannot reach the repo (git clone failures), fetch the tarball from `codeload.github.com` and copy the skill folders into `~/.agents/skills`, then run `Novahiz sync` — that fallback was used on this machine.
65
+
66
+ `impeccable` is the one design skill referenced as a provider: gate rule R14 requires it, and it installs from upstream under its own Apache-2.0 terms instead of being vendored. The other design and text skills ship as ordinary Novahiz skills under `skills/`, not as providers.
53
67
 
54
68
  ## Mapping
55
69
 
@@ -79,7 +93,7 @@ Control it in `novahiz.config.json`:
79
93
 
80
94
  - `autoRegister`: register missing MCP servers on startup.
81
95
  - `autoInstall`: run the official install commands during `node install/install.mjs`.
82
- - `disabled`: provider ids to skip.
96
+ - `disabled`: provider ids to skip. `cron` ships disabled by default; enable it after the local scheduler setup described above.
83
97
 
84
98
  Run the install commands on demand:
85
99
 
@@ -95,6 +109,7 @@ Installation is opt-in on purpose. The commands download third-party packages, i
95
109
  Each provider declares its prerequisites in `requires` (the executable it needs) and, when it can be bootstrapped, a per-platform `bootstrap` command. No provider currently declares a `bootstrap`; `Novahiz deps --install` supports the field for future entries.
96
110
 
97
111
  - `npx` based providers need `npx`, which ships with Node.
112
+ - `dart` needs the Dart SDK on `PATH` (`dart --version`). Flutter installs ship it.
98
113
 
99
114
  `Novahiz deps` checks every prerequisite and reports what is missing. `Novahiz deps --install` first bootstraps a missing prerequisite through its official installer, then runs each provider's install command. The installer runs the check on every install and, when `providers.autoInstall` is true or `--install-providers` is passed, runs the installs too.
100
115
 
package/docs/ROADMAPS.md CHANGED
@@ -6,6 +6,8 @@ A roadmap is an ordered list of steps attached to a category. The classifier pic
6
6
 
7
7
  Eight categories run the same pipeline: `code`, `debug`, `browser`, `design-ui`, `database-supabase`, `planning`, `devops`, and `data`. Every stage is a skill, and `novahiz-planner` is the orchestrator that fixes the order.
8
8
 
9
+ `flutter` (`flutter-feature`) follows the same six stages and inserts three non-optional quality skills: `flutter-apply-architecture-best-practices`, `dart-run-static-analysis` before implement, then `dart-add-unit-test` after implement, plus a final self-review. On `lite` and `trivial` tiers those architecture/analyze/test steps are filtered like every other roadmap (lite keeps only implement and converge).
10
+
9
11
  | # | Stage | Skill | Produces |
10
12
  |---|---|---|---|
11
13
  | 1 | Plan | `novahiz-plan` | direction, scope, dependency order, slicing strategy, risks |
@@ -19,6 +21,32 @@ Stages 1 to 4 write no application file; they produce a plan and decisions. Clar
19
21
 
20
22
  `review` runs analyse and then the diff review. `audit` and `test` keep their own steps and end on a converge. `research` drives a single gather step.
21
23
 
24
+ ## Expo (progressive gate)
25
+
26
+ `expo` (`expo-feature`, 11 steps) runs the six stages and inserts four **optional** `expo-*` skills between analyse and implement: `expo-router` (routes, links, modals), `expo-module` (native code), `expo-dev-client` (dev client / EAS build), `expo-upgrade` (SDK upgrades). Optional steps guide without blocking — only the pipeline skills are enforced — and `expo-overview` loads through `defaultSkills` as the entry point. `flutter` is excluded through negative keywords, so a prompt naming both picks the right category.
27
+
28
+ Task-to-skill routing, the full `expo-*` pack (17 skills, `eas-*` paid services excluded):
29
+
30
+ | Task | Skill |
31
+ |------|-------|
32
+ | Any Expo request (entry point) | `expo-overview` |
33
+ | Routes, links, modals, tabs | `expo-router` |
34
+ | Folder structure, file-based layout | `expo-project-structure` |
35
+ | Native modules (Swift / Kotlin) | `expo-module` |
36
+ | Dev client, EAS build setup | `expo-dev-client` |
37
+ | SDK upgrade | `expo-upgrade` |
38
+ | Animations, gestures | `expo-animation` |
39
+ | Data fetching, caching | `expo-data-fetching` |
40
+ | Design system, tokens | `expo-design-system` |
41
+ | Native-feeling styling | `expo-native-ui` |
42
+ | `@expo/ui` components | `expo-ui` |
43
+ | Web → native migration | `expo-web-to-native` |
44
+ | DOM components | `expo-dom` |
45
+ | Brownfield (existing app) | `expo-brownfield` |
46
+ | Example patterns | `expo-examples` |
47
+ | App Clip (iOS) | `expo-app-clip` |
48
+ | Feedback / telemetry control | `expo-skill-feedback` |
49
+
22
50
  ## Model
23
51
 
24
52
  Roadmaps live inline in `catalog/categories.json`:
@@ -60,6 +88,7 @@ When several categories match, the one with the highest score provides the roadm
60
88
  - Both skills are required on design-ui prompts and style file edits (css/scss/less/html).
61
89
  - Outside frontend design, neither skill is required by the gate.
62
90
  - The design-ui roadmap also carries an optional `design-craft` step for guidance; it does not block.
91
+ - `R14-impeccable` requires the `impeccable` skill on the same design selectors. The design-ui roadmap adds optional `impeccable-critique`, `impeccable-audit`, and `impeccable-polish` steps after implement, and the flutter roadmap an optional `impeccable-critique` step for UI work; optional steps guide without blocking.
63
92
 
64
93
  Rules express this with `when.contentMatches` (`prose`, `style`, or a regex), `when.contentExcludes`, `when.minChange`, and `when.match` (`any` or `all`) to combine the class, path, and category selectors.
65
94
 
package/docs/RULES.md CHANGED
@@ -34,15 +34,18 @@ Content conditions are combined with AND against the selectors. A rule with `con
34
34
  | Id | Condition | Requires |
35
35
  | --- | --- | --- |
36
36
  | R3-supabase | a Supabase path or a Supabase prompt | `novahiz-supabase`, `novahiz-postgres` |
37
- | R4-playwright | a browser prompt category, or a browser test path (`**/*.spec.ts`, `**/e2e/**`, `**/playwright/**`, …) | `novahiz-browser` |
37
+ | R4-playwright | a browser prompt category, or a browser test path (`**/*.e2e.ts`, `**/e2e/**`, `**/playwright/**`, `**/*.cy.ts`, …) | `novahiz-browser` |
38
38
  | R6-Novahiz | a prompt in a workflow category | pipeline skills (`novahiz-plan`, `novahiz-clarify`, `novahiz-analyse`, `novahiz-implement`, `novahiz-converge`) |
39
- | R9-code-review | a review prompt or a code file under review | `novahiz-code-review` |
40
- | R10-security | an audit or security prompt | `novahiz-security` |
39
+ | R7-assessment | an `assessment` prompt | assessment pipeline skills (`novahiz-assess-intake`, `novahiz-assess-research`, `novahiz-assess-define`, `novahiz-assess-shape`, `novahiz-assess-decide`) |
40
+ | R8-docs | a documentation file under `novahiz-docs/` (`**/novahiz-docs/**/*.md`, relative or absolute) | `novahiz-docs` |
41
+ | R9-code-review | a review prompt, any code file, or a `.tsx`/`.jsx`/`.vue`/`.svelte`/`.astro` file | `novahiz-code-review` |
42
+ | R10-security | an audit prompt | `novahiz-security` |
41
43
  | R11-accessibility | a design-ui or audit prompt | `novahiz-wcag-audit` |
42
44
  | R12-web-extract | a research prompt | `novahiz-web-extract` |
43
45
  | R13-design-craft | a design-ui prompt or a style file (css/scss/less/html) | `novahiz-humanizer`, `ui-slop-remover`, `ui-craft-rules` |
46
+ | R14-impeccable | a design-ui prompt or a style file (css/scss/less/html) | `impeccable` |
44
47
 
45
- `novahiz-humanizer` and `ui-slop-remover` are required only by R13, on frontend design tasks. They are not required on ordinary text, docs, or code edits.
48
+ `novahiz-humanizer` and `ui-slop-remover` are required only by R13, on frontend design tasks. They are not required on ordinary text, docs, or code edits. `impeccable` loads under R14 on the same selectors, so the critique, audit, and polish playbooks stay reachable after UI work.
46
49
 
47
50
  ## Resolution
48
51