novahiz 0.9.3 → 0.9.6

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 (74) hide show
  1. package/CHANGELOG.md +251 -0
  2. package/README.md +21 -5
  3. package/adapters/opencode/agent/novahiz.md +2 -2
  4. package/adapters/opencode/commands/novahiz-obsidian-audit.md +28 -0
  5. package/adapters/opencode/commands/novahiz-obsidian.md +27 -0
  6. package/adapters/opencode/commands/novahiz-skills-update.md +24 -7
  7. package/adapters/opencode/instructions.md +2 -2
  8. package/adapters/opencode/novahiz-plugin.ts +164 -4
  9. package/bin/veille-mensuelle.ps1 +26 -0
  10. package/catalog/categories.json +13 -11
  11. package/catalog/providers.json +14 -6
  12. package/catalog/rules.json +44 -4
  13. package/dist/cli.js +8 -3
  14. package/dist/commands/context.js +10 -0
  15. package/dist/commands/doctor.js +70 -9
  16. package/dist/commands/gate.js +10 -4
  17. package/dist/commands/inspect.js +110 -39
  18. package/dist/commands/second-memory.js +6 -1
  19. package/dist/commands/upgrade.js +8 -1
  20. package/dist/complexity.js +18 -0
  21. package/dist/deps.js +127 -0
  22. package/dist/gate-daemon.js +126 -0
  23. package/dist/gate.js +64 -6
  24. package/dist/ledger.js +29 -5
  25. package/dist/providers.js +47 -5
  26. package/dist/spec.js +5 -1
  27. package/dist/wireframe.js +595 -0
  28. package/docs/INSTALL.md +1 -1
  29. package/docs/PROVIDERS.md +26 -7
  30. package/docs/TOKENS.md +1 -1
  31. package/install/install.mjs +40 -8
  32. package/install/lib.mjs +3 -1
  33. package/mcp/argus/IMPLEMENTATION-SUMMARY.md +1 -1
  34. package/mcp/novahiz-tools/index.mjs +92 -4
  35. package/mcp/stitch-template/recommandation.md +1 -1
  36. package/package.json +1 -1
  37. package/skills/browser-session/SKILL.md +1 -1
  38. package/skills/novahiz-browser/SKILL.md +1 -1
  39. package/skills/novahiz-prd/SKILL.md +116 -0
  40. package/skills/novahiz-prd/references/prd-template.md +101 -0
  41. package/skills/novahiz-skill-craft/SKILL.md +213 -0
  42. package/skills/novahiz-skill-craft/assets/evals-template.json +39 -0
  43. package/skills/novahiz-skill-craft/assets/frontmatter-checklist.md +75 -0
  44. package/skills/novahiz-skill-craft/assets/skill-template.md +91 -0
  45. package/skills/novahiz-skill-craft/evals.json +58 -0
  46. package/skills/novahiz-skill-craft/references/evals-spec.md +136 -0
  47. package/skills/novahiz-skill-craft/references/frontmatter-spec.md +75 -0
  48. package/skills/novahiz-skill-craft/references/progressive-disclosure.md +81 -0
  49. package/skills/novahiz-skill-craft/references/schemas.md +163 -0
  50. package/skills/novahiz-skill-craft/scripts/check-memory.py +256 -0
  51. package/skills/novahiz-skill-craft/scripts/extract-description.py +243 -0
  52. package/skills/novahiz-skill-craft/scripts/generate-comparison.py +179 -0
  53. package/skills/novahiz-skill-craft/scripts/generate-grading.py +223 -0
  54. package/skills/novahiz-skill-craft/scripts/run-eval.py +265 -0
  55. package/skills/novahiz-skill-craft/scripts/scan-skill.py +213 -0
  56. package/skills/novahiz-skill-craft/scripts/validate-frontmatter.py +176 -0
  57. package/skills/novahiz-wireframe/SKILL.md +278 -0
  58. package/skills/novahiz-wireframe/references/format.md +190 -0
  59. package/skills/novahiz-wireframe/references/shape-handoff.md +92 -0
  60. package/src/cli.ts +8 -5
  61. package/src/commands/context.ts +11 -0
  62. package/src/commands/doctor.ts +67 -10
  63. package/src/commands/gate.ts +10 -4
  64. package/src/commands/inspect.ts +113 -39
  65. package/src/commands/second-memory.ts +6 -1
  66. package/src/commands/upgrade.ts +8 -1
  67. package/src/complexity.ts +19 -0
  68. package/src/deps.ts +149 -1
  69. package/src/gate-daemon.ts +140 -0
  70. package/src/gate.ts +71 -6
  71. package/src/ledger.ts +30 -5
  72. package/src/providers.ts +51 -6
  73. package/src/spec.ts +32 -1
  74. package/src/wireframe.ts +751 -0
package/CHANGELOG.md CHANGED
@@ -3,6 +3,257 @@
3
3
  All notable changes to Novahiz are documented in this file.
4
4
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
5
5
 
6
+ ## [Unreleased]
7
+
8
+ ## [0.9.6] - 2026-10-15
9
+
10
+ ### Added
11
+
12
+ - **`PRODUCT.md` and `DESIGN.md`** - the product context and the visual-system
13
+ record `impeccable` asks for, both written from sources in the repository
14
+ (`README.md`, `docs/CONSTITUTION.md`, `src/render.ts`) with anything they do
15
+ not settle marked "not determined" instead of guessed. `novahiz doctor` runs
16
+ from a project now finds both instead of two `fail` rows; when doctor runs
17
+ from the Novahiz home both rows are skipped by design
18
+ (`impeccableChecks` returns early when `cwd === home`).
19
+
20
+ - **`when.pathExcludes`** - a rule-level *negative* selector, the counterpart of
21
+ `pathGlobs`. A rule carrying it never applies to a matching path, whatever the
22
+ other selectors say. With `match: "any"` a prompt category alone fired on any
23
+ file, so `design-ui` demanded the frontend design skills on unit tests, and
24
+ inclusion-only selectors could not express "never on tests" (`**/*.tsx` also
25
+ matches `tests/Foo.test.tsx`). Applied to the five design-scoped rules
26
+ (R11-accessibility, R13-design-craft, R14-impeccable, R16-stitch-fidelity,
27
+ R17-wireframe), which now skip `**/tests/**`, `**/__tests__/**`,
28
+ `**/*.test.*` and `**/*.spec.*`. R9-code-review and R10-security are
29
+ untouched — a test is still code — and R15-token-economy keeps its own
30
+ `**/tests/token-economy.test.ts` target.
31
+
32
+ ### Changed
33
+
34
+ - **The installer states its own limit** - `install.mjs` now prints that
35
+ `deps --install` is an install-only pass: packs already present are left
36
+ untouched, and `/novahiz-skills-update` (`deps --install --update`) is what
37
+ refreshes them. Installation and update stay separate commands by choice — a
38
+ reinstall must not overwrite local skill edits — but the choice was previously
39
+ only written down in `docs/PROVIDERS.md`, not shown to the person installing.
40
+
41
+ ### Fixed
42
+
43
+ - **`doctor` no longer advises a command that cannot help** - the "Referenced
44
+ skills" row counted every absent non-shipped skill as a pack skill and
45
+ answered "run /novahiz-skills-update, or novahiz deps --install". Measured on
46
+ the 0.9.5 install: the 7 skills it named are `eas-app-stores`, `eas-hosting`,
47
+ `eas-observe`, `eas-simulator`, `eas-update`, `eas-update-insights`,
48
+ `eas-workflows`, referenced as `defaultSkills` by the `test` and `devops`
49
+ categories, while `catalog/providers.json` ships four skill packs only
50
+ (`flutter-skills`, `dart-skills`, `expo-skills`, `impeccable`) and the expo
51
+ command names 20 `expo-*` skills, no `eas-*`. `deps --install` accordingly
52
+ returned `install: []` and exited 0 - nothing to install. The row now reads
53
+ each pack's `install` argv (`--skill` list, or `--skill *` resolved to the
54
+ repo's leading segment, so `dart-lang/skills` covers `dart-*`), and skills no
55
+ pack can deliver are named as such instead of being sent after a command that
56
+ installs nothing. New `tests/doctor-referenced-skills.test.ts` pins the
57
+ contract - eight cases, none existed before.
58
+
59
+ ## [0.9.5] - 2026-10-15
60
+
61
+ > 0.9.4 was prepared on 2026-10-14 but never tagged nor published to npm
62
+ > (the registry went straight from 0.9.3 to 0.9.5). Its changes are included
63
+ > here and remain described under their own heading below.
64
+
65
+ ### Added
66
+
67
+ - **Wireframe-first design pipeline** - new `novahiz_wireframe` MCP tool and
68
+ `src/wireframe.ts` module
69
+ (`init/screen/section/sections/plan/review/index/attach/mark/status`).
70
+ Each screen gets a subfolder of ordered, annotated sections plus a
71
+ regenerated `INDEX.md`; `attach` returns the whole wireframe as the
72
+ attachment block fed to `impeccable shape`. `sections` creates a whole
73
+ batch in one call (one `INDEX` rebuild instead of one per section, existing
74
+ names skipped); `plan` classifies the screen and says whether it needs
75
+ several sections and why; `review` reports the sections that were
76
+ forgotten and gates approval (`mark` refuses while `verdict != pass`).
77
+ Sections are renumbered from the highest existing index instead of
78
+ `length + 1`. Gate rule `R17-wireframe` and the `wireframe` roadmap step
79
+ (before `impeccable-shape`) make the sequence mandatory on `design-ui`
80
+ work and on screen/page/component paths. New skill `novahiz-wireframe`,
81
+ tested by `tests/wireframe.test.ts`.
82
+ - **`novahiz deps` reports real dependency health** - the single provider
83
+ check is replaced by a four-part `dependencyReport`: toolchain probing
84
+ (node, npm, npx, uv, python), local MCP entrypoint `existsSync`, npm home
85
+ health (declared deps resolved + lockfile present), and provider
86
+ prerequisites. `novahiz_deps` returns the same shape.
87
+ - **Core toolchain bootstrap** - `deps --install` can now install `uv` and
88
+ Python on win32 / darwin / linux. The argv lives in `src/deps.ts`
89
+ (`coreBootstrap`), not in the catalog, and runs through a plain spawn:
90
+ `runScript`'s allowlist deliberately refuses shells and package managers,
91
+ so catalog data can never widen it. `--core-only` installs only toolchain
92
+ and npm health; the installer uses it when providers are declined.
93
+ - **Idempotent provider installs** - a new `installedWhen` field on a
94
+ provider lists skill ids whose combined presence marks the pack already
95
+ installed; when all of them are on disk the install command is skipped, so
96
+ a second `deps --install --yes` runs nothing. Providers without the field
97
+ keep the historical always-run behaviour.
98
+ - **Gate rule `R18-skill-craft`** - `novahiz-skill-craft` is now actually
99
+ required on any `SKILL.md` edit, matching what its own description
100
+ already promised.
101
+ - **Skills `novahiz-prd` and `novahiz-skill-craft`** ship in the package.
102
+ - **Commands `novahiz-obsidian` and `novahiz-obsidian-audit`**, plus
103
+ `bin/veille-mensuelle.ps1`.
104
+ - **A real refresh path for the provider skill packs** - `deps --install
105
+ --update` and a per-provider `update` command in `catalog/providers.json`.
106
+ `deps --install` drops every pack whose `installedWhen` markers are all on
107
+ disk, so it could only fill gaps: `/novahiz-skills-update` called it and
108
+ therefore refreshed nothing, which is why flutter/dart/expo were never
109
+ actually updated. `updateCommands()` reads the provider's `update` command
110
+ instead and applies no `installedWhen` gate. For the skills CLI that command
111
+ is the upstream `skills update -g -y`, already present in the pinned
112
+ `skills@1.7.0`. An identical argv shared by several providers is deduplicated
113
+ and records the packs it covers under `covers`, in the dry-run plan and in
114
+ the result, so a skipped pack can no longer be mistaken for an updated one.
115
+ `/novahiz-skills-update` gained an explicit step 4 running it.
116
+ - **The Flutter skill pack is installed from its official repository** -
117
+ `flutter/agent-plugins` is now recorded as `flutter/skills`, the name used by
118
+ the Flutter blog post *Introducing Skills for Dart and Flutter*. The two
119
+ resolve to the same repository (identical `main` HEAD `0ef3972` and branch
120
+ list), so this is a provenance correction, not a source change.
121
+
122
+ ### Fixed
123
+
124
+ - **`tests/plugin-warmstart.test.ts` failed `tsc --noEmit`** with three real
125
+ type errors: the `editor` parameter shadowed the `editor` binding, making
126
+ `typeof editor` self-referential (TS2502), and `await cleanup()` was called
127
+ on the `void | Cleanup` union without a guard (TS2349, twice). The previous
128
+ session reported this file as type-clean; that report was wrong.
129
+ - **`Agent harness copy outdated`** — the last non-blocking `doctor` failure —
130
+ is repaired by `node install/install.mjs --yes` alone. Only the rewrite of
131
+ `novahiz.config.json` is gated on `--force`; the plugin, agent and command
132
+ copies are not, so a plain run refreshes them while the config reports
133
+ `Existing config preserved`.
134
+
135
+ ### Changed
136
+
137
+ - **`novahiz sync` is now listed in `--help`** - the command existed
138
+ (`case "sync"` → `commandSync()`), and both `gate.ts:498` and
139
+ `gate-repair.ts:87` pointed users at it, but it was missing from the help
140
+ output.
141
+ - **The installer no longer backs up the published package inside its own
142
+ home** - the home is a copy of what npm already holds, so preserving its
143
+ previous version only accumulated `*.novahiz-bak` (235 of the 320 found by
144
+ the audit). Backups are kept only where they carry something that exists
145
+ nowhere else: `catalog/` (user-edited configuration) and the files written
146
+ into the opencode config dir, which are exactly what `novahiz uninstall`
147
+ restores (`uninstall.mjs:53`).
148
+ - **`scripts` is part of `CORE_ITEMS`** - `package.json` copied into the home
149
+ declares `ci:local = node scripts/ci-local.mjs`, but the directory was
150
+ never copied, so `npm run ci:local` failed there.
151
+ - **Windows PATH staleness is no longer reported as a missing dependency** -
152
+ the parent process may predate the install (opencode started before uv or
153
+ Python landed), so its inherited PATH hides binaries that ARE on disk.
154
+ `toolchainStatus` reloads PATH from the registry (Machine + User) once and
155
+ re-probes. `python` is probed with `--version` rather than `where python`,
156
+ because the `WindowsApps` execution alias answers on machines without any
157
+ Python.
158
+ - **The installer asks about providers by default** (`true` instead of
159
+ `false`) and adds a `--no-deps-install` flag. Automatic dependency
160
+ installation now defaults to on (`autoInstall !== false`); when providers
161
+ are declined the toolchain and npm health still install, being system
162
+ dependencies rather than optional providers.
163
+ - **`npm install` runs with `--ignore-scripts`** and `npm_config_global=false`,
164
+ scoped to the Novahiz home, so nothing in the home re-enters the
165
+ installer.
166
+
167
+ ### Notes
168
+
169
+ - `novahiz deps` and the `novahiz_deps` tool change their JSON contract:
170
+ `{node, platform, dependencies}` becomes
171
+ `{node, platform, toolchain, dependencies, entrypoints, npm}`, and the
172
+ dry-run `plan` becomes `{core, npm, bootstrap, install}`. Anything parsing
173
+ the old shape must be updated.
174
+
175
+ ## [0.9.4] - 2026-10-14
176
+
177
+ ### Fixed
178
+
179
+ - **No absolute machine path is shipped any more** - the tree handed to every
180
+ member of the community carried the drive letters, the folders and the
181
+ account name of the machine Novahiz was developed on, so the system was
182
+ broken on arrival for anyone else.
183
+ - `adapters/opencode/instructions.md` (the system prompt injected into every
184
+ session), `skills/novahiz-browser/SKILL.md` and
185
+ `skills/browser-session/SKILL.md` pointed the Playwright profile at a
186
+ hardcoded `C:\Users\<account>\.opencode\playwright-profile`. The profile
187
+ rule was unusable and the browser profile wrong for every other user. All
188
+ three now use `~/.opencode/playwright-profile`.
189
+ - `docs/TOKENS.md`, `docs/audit-2026-09-25.md`,
190
+ `mcp/argus/IMPLEMENTATION-SUMMARY.md` and
191
+ `mcp/stitch-template/recommandation.md` presented absolute paths as
192
+ instructions to run. They now use `~` or `<NOVAHIZ_HOME>`.
193
+ - The placeholders shipped to the agent were corrupted:
194
+ `node NNovahiz-home>/src/cli.ts classify "Nrequest>"` and
195
+ `skill({ name: "Nskill>" })` in `adapters/opencode/agent/novahiz.md`. They
196
+ are restored to `<Novahiz-home>`, `<request>` and `<skill>`, so the first
197
+ step of the pipeline is executable as written.
198
+
199
+ - **Home resolution no longer yields a ghost home** - `src/cli.ts`,
200
+ `src/commands/upgrade.ts` and `src/commands/second-memory.ts` built the home
201
+ from `process.env.HOME || process.env.USERPROFILE || ""`. When both are
202
+ absent - a Windows service, the gate daemon child, a container - the joined
203
+ result was a path relative to the cwd, so `detectTarget`, `runSync` and the
204
+ Stitch recommendation all operated silently on a directory that does not
205
+ exist. All three now resolve through `NovahizHome()` or `homedir()`.
206
+
207
+ - **The C3 index guard fires on Windows** - `src/gate.ts` compared the
208
+ protected `build/installed-skills.json` and `build/catalog.json` suffixes
209
+ spelled with `/` against a path carrying the platform separator, so the guard
210
+ never triggered on Windows. Those two files define what the gate requires and
211
+ were editable like ordinary build output on the platform most of the
212
+ community installs on. The path is now normalised before comparison.
213
+
214
+ - **The gate daemon stops flashing a console window on Windows** -
215
+ `adapters/opencode/novahiz-plugin.ts` spawned it without `windowsHide: true`,
216
+ the only spawn site in the file missing it.
217
+
218
+ - **Duplicated `NOVAHIZ_HOME` reads** in `src/spec.ts` and `install/lib.mjs`
219
+ collapse into one canonical read. A user who exported the older variable name
220
+ silently kept the default home while believing they had redirected it.
221
+
222
+ - **`novahiz doctor` stops failing at home root on project context** -
223
+ `src/commands/doctor.ts` resolved `PRODUCT.md` and `DESIGN.md` against the
224
+ novahiz home, producing two permanent rows no command could close. The rows
225
+ are scoped to a project directory and remain unchanged inside one.
226
+
227
+ - **A plan that declares its dependencies by label no longer wedges** -
228
+ `src/ledger.ts` resolved each dependency by todo id only, while
229
+ `novahiz task plan` accepts labels ("T2", "P5"). Every label-declared
230
+ dependency read as unfinished and blocked its dependent step for the whole
231
+ life of the task. Resolution now accepts both, and fails closed on an
232
+ unknown or ambiguous reference.
233
+
234
+ ### Added
235
+
236
+ - **A persistent gate daemon** (`src/gate-daemon.ts`, wired in
237
+ `adapters/opencode/novahiz-plugin.ts`) replaces one Node process spawn per
238
+ gate call. Every request re-executes `commandGate`, which re-reads
239
+ `rules.json`, `categories.json` and the skill index from disk, so no verdict
240
+ can go stale; any daemon failure returns as `spawnError` and the existing
241
+ deny path applies unchanged. Measured on this machine: one-shot median 331 ms
242
+ against 8.1 ms warm.
243
+
244
+ ### Changed
245
+
246
+ - **Portability is enforced by a test** - `tests/portability-paths.test.ts`
247
+ fails the build on an absolute machine path, a machine account name, an MCP
248
+ command the catalog cannot resolve to an absolute path, or a regression of
249
+ the C3 guard. It ships a negative proof: an injected path makes it fail by
250
+ file and line.
251
+
252
+ - **`.novahiz-install.json` and `novahiz.config.json` are no longer tracked** -
253
+ the install manifest embedded the absolute paths and the account name of the
254
+ machine that ran the installer, and was published with them. Both are
255
+ machine-local state regenerated on demand, and are now ignored.
256
+
6
257
  ## [0.9.3] - 2026-10-11
7
258
 
8
259
  ### Changed
package/README.md CHANGED
@@ -314,7 +314,7 @@ Deux pièces complémentaires : la session consomme moins sans perdre en puissan
314
314
 
315
315
  ## Skills installées
316
316
 
317
- Novahiz livre 94 skills couvrant toutes les catégories — 46 dans le cœur du dépôt, les autres dans les packs officiels installés par défaut au setup :
317
+ Novahiz livre 95 skills au total — le cœur du dépôt, plus les packs officiels installés par défaut au setup :
318
318
 
319
319
  | Catégorie | Skills | Objectif |
320
320
  |-----------|--------|----------|
@@ -327,9 +327,11 @@ Novahiz livre 94 skills couvrant toutes les catégories — 46 dans le cœur du
327
327
  | `browser` | novahiz-browser, browser-session, novahiz-web-extract, ... | Automatisation web, captures, extraction |
328
328
  | `audit` | novahiz-security, package-risk-audit, llm-threat-review, ... | Sécurité, conformité, vulnérabilités |
329
329
  | `expo` | expo-overview, expo-router, expo-module, expo-dev-client, ... | Expo / React Native : routes, modules natifs, builds |
330
- | `devops` | eas-workflows, eas-app-stores, novahiz-release, ... | CI/CD, déploiements, releases versionnées |
330
+ | `devops` | novahiz-release, novahiz-init, ... | Releases versionnées, onboarding, installation |
331
331
 
332
- Lancer `npx novahiz skills --all` pour voir la liste complète.
332
+ Le décompte exact se relit à tout moment : `novahiz sync` (index) et `novahiz doctor` (ligne `Referenced skills`). `npx novahiz skills --all` donne la liste complète.
333
+
334
+ > Les skills `eas-*` (workflows, stores, hosting, observe, update) sont des packs **payants** upstream : elles ne sont pas installées par défaut et `novahiz doctor` les exclut de `Referenced skills` par conception.
333
335
 
334
336
  ---
335
337
 
@@ -348,9 +350,22 @@ Novahiz auto-enregistre les serveurs MCP externes selon la catégorie du prompt
348
350
  | novahiz-scheduler | `mcp/clepsydre/index.mjs` (local, zéro dépendance) | Apache-2.0 | devops |
349
351
  | dart | `dart mcp-server` (Dart SDK) | BSD-3-Clause | code, debug, design-ui, flutter |
350
352
 
351
- Packs de skills (installés depuis les dépôts officiels, jamais vendorés, et livrés **par défaut** au setup via `providers.autoInstall`) : `flutter/agent-plugins` (10 skills), `dart-lang/skills` (15 skills), `expo/skills` (19 skills, le groupe `expo-*` seulement ; les services payants `eas-*` exclus), `pbakaus/impeccable` (1 skill, la skill design upstream `impeccable`).
353
+ Packs de skills (installés depuis les dépôts officiels, jamais vendorés, et livrés **par défaut** au setup via `providers.autoInstall`) : [`flutter/skills`](https://github.com/flutter/skills) (10 skills), `dart-lang/skills` (15 skills), `expo/skills` (19 skills, le groupe `expo-*` seulement ; les services payants `eas-*` exclus), `pbakaus/impeccable` (1 skill, la skill design upstream `impeccable`).
354
+
355
+ **`git` est requis** par le CLI officiel des skills : sans lui, l'installation des packs échoue silencieusement et les skills manquent au premier lancement. `novahiz doctor` le nomme (ligne `git (skill packs)`).
356
+
357
+ ### Installer, puis mettre à jour : deux étapes distinctes
358
+
359
+ `deps --install` ne **remplit que les trous**. Dès qu'un pack est présent, sa commande d'installation est écartée (marqueur `installedWhen` satisfait) — sinon une seconde passe réinstallerait inutilement 45 skills. Conséquence directe : **cette même commande ne peut jamais rafraîchir un pack déjà installé.**
360
+
361
+ ```
362
+ novahiz deps --install # installe ce qui manque (packs absents)
363
+ novahiz deps --install --update # rafraîchit tout depuis upstream
364
+ ```
365
+
366
+ `--update` exécute la commande `update` déclarée par chaque provider — pour le CLI des skills, la sous-commande officielle `skills update -g -y`, qui parcourt les quatre sources (dart, flutter, expo, impeccable) en une passe. Contrairement à l'installation, **elle n'est jamais écartée** : rafraîchir un pack à jour est exactement le travail demandé.
352
367
 
353
- **`git` est requis** par le CLI officiel des skills : sans lui, l'installation des packs échoue silencieusement et les skills manquent au premier lancement. `novahiz doctor` le nomme (ligne `git (skill packs)`), et **`/novahiz-skills-update`** — ou `novahiz deps --install` — réinstalle proprement tous les packs depuis leurs providers officiels. Voir [docs/PROVIDERS.md](docs/PROVIDERS.md).
368
+ `/novahiz-skills-update` enchaîne les deux. Chaque plan porte `step: "update"` et, quand une même commande couvre plusieurs packs, la liste `covers` — on ne peut donc pas confondre un pack écarté et un pack mis à jour. Voir [docs/PROVIDERS.md](docs/PROVIDERS.md).
354
369
 
355
370
  Dépôts upstream et provenance complète des providers MCP et plugins opencode : [docs/PROVIDERS.md](docs/PROVIDERS.md), [docs/HARNESSES.md](docs/HARNESSES.md), [NOTICE.md](NOTICE.md).
356
371
 
@@ -396,6 +411,7 @@ Voir [docs/CONFIGURATION.md](docs/CONFIGURATION.md) pour toutes les options.
396
411
  | `novahiz roadmap` | Afficher la roadmap d'exécution |
397
412
  | `novahiz dispatch` | Générer des work packets |
398
413
  | `novahiz sync` | Reconstruire l'index des skills installées |
414
+ | `novahiz deps --install [--update]` | Installer les packs de skills manquants, ou les rafraîchir tous avec `--update` (voir [Providers](#providers)) |
399
415
  | `novahiz clean` | Supprimer les vieux logs |
400
416
  | `novahiz upgrade` | Pull du dernier + rebuild |
401
417
  | `novahiz version` | Afficher la version |
@@ -16,8 +16,8 @@ Clarification questions must be asked in the same language as the user's input p
16
16
 
17
17
  Work in this order for every request:
18
18
 
19
- 1. Classify. Call the `novahiz_classify` MCP tool with the user request, or run `node NNovahiz-home>/src/cli.ts classify "Nrequest>"`. Read the returned categories and required skills.
20
- 2. Load skills. Load every required skill with `skill({ name: "Nskill>" })` before touching any file. The gate enforces this: `edit`, `write`, `patch`, `apply_patch`, and shell writes are blocked until the required skills are loaded.
19
+ 1. Classify. Call the `novahiz_classify` MCP tool with the user request, or run `node <Novahiz-home>/src/cli.ts classify "<request>"`. Read the returned categories and required skills.
20
+ 2. Load skills. Load every required skill with `skill({ name: "<skill>" })` before touching any file. The gate enforces this: `edit`, `write`, `patch`, `apply_patch`, and shell writes are blocked until the required skills are loaded.
21
21
  3. Plan. For anything beyond a trivial change, write a short todo list with acceptance criteria.
22
22
  4. Execute. Make the change. Prefer small, reversible edits. Keep architecture modular, scalable, and maintainable.
23
23
  5. Verify. Run the relevant tests or commands. Report what you ran and what it returned. Never claim a result you did not observe.
@@ -0,0 +1,28 @@
1
+ ---
2
+ description: Audit AND auto-fix the whole Obsidian data arborescence: structure, links, coherence. Runs doctor --apply (category by category), then sync --apply, then lint. Arguments: $ARGUMENTS
3
+ ---
4
+
5
+ 1. Locate the Novahiz home: `NOVAHIZ_HOME` if set, otherwise `~/.config/novahiz`. The CLI is `<home>/src/cli.ts`.
6
+
7
+ 2. Run `node src/cli.ts second-memory doctor --apply $ARGUMENTS` from the Novahiz home. This **auto-fixes** everything category by category: missing folders created, MOCs created, links repaired, root notes relocated, naming fixed. Every moved file is backed up first. Pass `--no-plugins` to skip the mandatory plugin check, `--json` for structured output.
8
+
9
+ 3. The command exits 1 while issues remain and 0 when the vault is clean. For each `[fail]` check:
10
+ - `skeleton` — the vault is missing `INDEX.md`, `STRUCTURE.md` or a system folder: auto-recreated by `doctor --apply`.
11
+ - `arborescence` — a note sits at the vault root, a folder has no `_MOC.md`, a child MOC is not linked from its parent, a domain is only partially materialised, or `INDEX.md → ## Categories` does not list exactly the active domains. Auto-fixed by `doctor --apply`.
12
+ - `links` — broken wikilinks or orphans: auto-fixed by `doctor --apply` (runs the `fix` repairs).
13
+ - `plugins` — a mandatory community plugin is missing or disabled: auto-fixed by `doctor --apply`.
14
+ - `outside-tree folders` (warn) — a top-level folder is not in `catalog/vault-structure.json`. Doctor does not move folders: report them and migrate their notes by hand.
15
+ - `memory` (warn) — project memory has pending changes: auto-fixed by `sync --apply` below.
16
+
17
+ 4. Then the **global coherence pass** — from the project directory, beyond what doctor checks structurally:
18
+ - `node src/cli.ts second-memory sync --apply`: pending slot pulls/pushes AND `novahiz-docs/` mirror drift are auto-applied. Mirror drift means the repo docs moved ahead of the vault.
19
+ - Verify the active project's binding exists (`vault.json` at the memory root `sync` uses —
20
+ `project-memory/vault.json` or `~/.config/project-memory/vault.json`) and its chain is
21
+ materialised (`Code/<branch>/<project>/{docs,journal,decisions}/`). A memory root without a binding
22
+ means `project-init` never ran: notes then fall back to content-keyword routing and may
23
+ land in `Inbox` or a wrong branch. Report every note found outside the bound chain, but
24
+ NEVER move a note automatically — propose the move and wait for consent.
25
+ - Consistency across the three layers (repo `novahiz-docs/` ↔ vault `docs/` chain ↔ vault `memory/` chain): same project folder spelling everywhere, no duplicate project folders (a leftover `general/` or old-chain folder next to the real one), no empty bound folder left after a rebind.
26
+ - When doctor passes but something still looks off, run the strict pass: `node src/cli.ts second-memory lint`.
27
+
28
+ 5. Report what the audit found, what was actually repaired (with the backup location), what remains — including coherence suggestions you did not apply. Never claim a repair you did not run.
@@ -0,0 +1,27 @@
1
+ ---
2
+ description: Initialize Obsidian vault structure for the active project. Arguments: $ARGUMENTS
3
+ ---
4
+
5
+ 1. Locate the Novahiz home: `NOVAHIZ_HOME` if set, otherwise `~/.config/novahiz`. The CLI is `<home>/src/cli.ts`.
6
+
7
+ 2. If `$ARGUMENTS` is `init` (or empty), first run the preview from the project directory (the active project — its cwd gives the name, its dependencies the routing):
8
+
9
+ `node src/cli.ts second-memory project-init --dry-run --json`
10
+
11
+ Show the routed chain and the mirrored files. Unless the user only wanted the preview, run it for real:
12
+
13
+ `node src/cli.ts second-memory project-init --json`
14
+
15
+ Extra flags when the routing must be forced: `--project <name>`, `--domain <Domain> --branch <Branch>` (both together).
16
+
17
+ 3. What it does — additive and idempotent, nothing existing is overwritten:
18
+ - creates the project chain `Code/<branch>/{memory,docs}/<project>/` (folders, `_MOC.md` links at every level, `INDEX.md` entry, domain activated whole);
19
+ - writes the routing binding in a `vault.json` sidecar at the memory root `sync` uses
20
+ (`project-memory/vault.json` in the project, or `~/.config/project-memory/` when that
21
+ global root exists — future `second-memory sync` runs send this project's slots and doc
22
+ mirror to the bound chain instead of guessing by content keywords);
23
+ - mirrors `novahiz-docs/*.md` into the docs chain (source of truth stays the repo).
24
+
25
+ 4. Exit codes: 0 created or nothing to do; 1 when the vault is absent (run `node src/cli.ts second-memory init` first), when routing is impossible from the project signal (rerun with `--domain`/`--branch`), or on an unknown flag.
26
+
27
+ 5. Report the bound chain (`Code/.../<project>/`), the binding line, and every file created or mirrored. If the branch picked by the keywords looks wrong, rerun with `--domain <D> --branch <B>` before any note exists. Never claim a folder you did not create.
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: Reinstall every optional skill pack (dart, flutter, expo, impeccable) cleanly from their official providers. Arguments: $ARGUMENTS
2
+ description: Install any missing skill pack and refresh every installed pack (dart, flutter, expo, impeccable) from their official providers. Arguments: $ARGUMENTS
3
3
  ---
4
4
 
5
5
  1. Locate the Novahiz home: `NOVAHIZ_HOME` if set, otherwise `~/.config/novahiz`.
@@ -9,21 +9,38 @@ description: Reinstall every optional skill pack (dart, flutter, expo, impeccabl
9
9
  silently. If git is missing, tell the user to install it first
10
10
  (Windows: `winget install Git.Git`) and stop.
11
11
 
12
- 3. Reinstall/update every provider from the official registry
13
- (`catalog/providers.json` - dart-lang/skills, flutter/agent-plugins,
12
+ 3. Install whatever pack is missing from the official registry
13
+ (`catalog/providers.json` - dart-lang/skills, flutter/skills,
14
14
  expo/skills, pbakaus/impeccable, plus the provider MCP servers):
15
15
 
16
16
  `node <home>/src/cli.ts deps --install --yes`
17
17
 
18
- 4. Refresh the Impeccable CLI and engine from npm (official package):
18
+ This step only *fills gaps*. Every pack already on disk is skipped by
19
+ design (`installedWhen` satisfied), so it can never bring an installed
20
+ pack up to date — that is what step 4 is for.
21
+
22
+ 4. Refresh the installed packs from upstream. This is the real update: it
23
+ runs each provider's `update` command, which for the skills CLI is the
24
+ upstream `skills update -g -y` subcommand and covers dart, flutter, expo
25
+ and impeccable in one pass:
26
+
27
+ `node <home>/src/cli.ts deps --install --update --yes`
28
+
29
+ Confirm the JSON reports `"step": "update"` with `"ok": true` (a shared
30
+ command lists every provider under `covers`). If it reports
31
+ `"step": "install"` instead, the `--update` flag did not reach the CLI —
32
+ stop and say so rather than reporting an update that never ran.
33
+
34
+ 5. Refresh the Impeccable CLI and engine from npm (official package):
19
35
 
20
36
  `npm install -g impeccable`
21
37
  `impeccable install --global --yes --force`
22
38
 
23
- 5. Realign the skill index:
39
+ 6. Realign the skill index:
24
40
 
25
41
  `node <home>/src/cli.ts sync`
26
42
 
27
- 6. Verify with `node <home>/src/cli.ts doctor`: the `Referenced skills` row
43
+ 7. Verify with `node <home>/src/cli.ts doctor`: the `Referenced skills` row
28
44
  must show every pack present (the 7 `eas-*` paid-service skills stay
29
- excluded by design). Report what was reinstalled.
45
+ excluded by design). Report what was installed and what was updated,
46
+ separately — never call a skipped pack an update.
@@ -30,11 +30,11 @@ Do **not** consult it for trivial edits, unrelated questions, or when the prompt
30
30
 
31
31
  Playwright uses a **persistent profile** that preserves data across sessions (cookies, localStorage, sessionStorage, history, logged-in sessions).
32
32
 
33
- **Profile folder:** `C:\Users\hiz\.opencode\playwright-profile`
33
+ **Profile folder:** `~/.opencode/playwright-profile`
34
34
 
35
35
  ### Rules
36
36
  1. **NEVER use Chrome or Chromium** — Use only Microsoft Edge via the Playwright MCP server (`--browser=msedge`). Never launch `chrome.exe`, `chromium`, or any Chromium-based process manually or programmatically. All browser automation goes through the MCP tools (`playwright_browser_*`). If Edge is not installed, fall back to another non-Chromium browser (Firefox, WebKit) via the Playwright MCP server.
37
- 2. Never disable `--user-data-dir` in the Playwright MCP config. The profile must always point to `C:/Users/hiz/.opencode/playwright-profile`.
37
+ 2. Never disable `--user-data-dir` in the Playwright MCP config. The profile must always point to `~/.opencode/playwright-profile`.
38
38
  3. Never purge this folder without explicit user consent.
39
39
  4. Never launch Playwright with an ephemeral context (without user-data-dir) for tasks requiring persistence.
40
40
  5. If the profile is corrupted or causes issues, inform the user and propose a backup before any reset.