novahiz 0.8.0 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,21 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
5
5
 
6
6
  ## [Unreleased]
7
7
 
8
+ ## [0.8.1] - 2026-10-10
9
+
10
+ Patch: `novahiz upgrade` always reported "up to date" on the npm channel.
11
+
12
+ ### Fixed
13
+
14
+ - **`novahiz upgrade` reads the published version again**
15
+ (`src/commands/upgrade.ts`): the `npm view` call ran with `stdio: "ignore"`,
16
+ which makes `spawnSync` return `stdout: null` — `latest` was always empty,
17
+ `compareVersions(local, "")` always won, and the command printed
18
+ `up to date (npm latest: )` even when a newer release existed, so `--apply`
19
+ could never trigger. The call now captures stdout (`"pipe"`), with a
20
+ regression test spawning `npm --version` locally (no network). Inherited
21
+ since 0.7.1.
22
+
8
23
  ## [0.8.0] - 2026-10-09
9
24
 
10
25
  Minor release: total Impeccable coverage on the design roadmap, a repair
package/README.md CHANGED
@@ -2,9 +2,9 @@
2
2
 
3
3
  > **Couche d'application sans dépendance pour les agents de code IA** — classe les prompts, attribue des roadmaps d'exécution, bloque les éditions non sûres tant que les bonnes skills ne sont pas chargées, et persiste les décisions d'une session à l'autre — tout cela de façon déterministe, sans appel de modèle.
4
4
 
5
- 17 catégories, 99 skills, 13 gate rules, 8 MCP providers — tout déterministe, tout local, tout JSON.
5
+ 17 catégories, 94 skills, 13 gate rules, 8 MCP providers — tout déterministe, tout local, tout JSON.
6
6
 
7
- > **Version 0.6.0** — publiée sur npm (`npm install -g --allow-scripts=novahiz novahiz` installe et configure tout : core, plugin, agent, skills packs et Playwright MCP). `CHANGELOG.md` et `scripts/` sont dans le tarball.
7
+ > **Version 0.8.0** — publiée sur npm (`npm install -g --allow-scripts=novahiz novahiz` installe et configure tout : core, plugin, agent, skills packs et Playwright MCP). `CHANGELOG.md` et `scripts/` sont dans le tarball.
8
8
 
9
9
  ```
10
10
  ┌──────────────────────────────────────────────────────────────────────────┐
@@ -35,7 +35,7 @@
35
35
  └─ tier, skills ──────│ └─ block : charger les skills nommées, retry une fois
36
36
  ```
37
37
 
38
- **17 catégories**, **99 skills**, **13 gate rules**, **8 MCP providers** — tout déterministe, tout local, tout JSON.
38
+ **17 catégories**, **94 skills**, **13 gate rules**, **8 MCP providers** — tout déterministe, tout local, tout JSON.
39
39
 
40
40
  ---
41
41
 
@@ -66,7 +66,7 @@ npm antérieur à 11.16 exécute les scripts par défaut : `npm install -g novah
66
66
  Puis vérifiez :
67
67
 
68
68
  ```bash
69
- novahiz doctor # Santé : 15 checks (17 avec --deep)
69
+ novahiz doctor # Santé : 17 checks (22 avec --deep)
70
70
  novahiz classify "fix the auth bug"
71
71
  ```
72
72
 
@@ -197,6 +197,8 @@ Huit catégories (`code`, `debug`, `browser`, `design-ui`, `database-supabase`,
197
197
 
198
198
  Clarify renvoie le travail au plan quand une réponse change l'architecture ; converge le renvoie aux tâches quand il trouve un écart. `flutter` et `expo` gardent les six mêmes étapes et insèrent leurs skills qualité autour d'implement. Le **tier** du classifier filtre la suite : `trivial` n'exécute presque rien, `lite` garde implement et converge, `full` parcourt toute la roadmap. Référence complète : [docs/ROADMAPS.md](docs/ROADMAPS.md).
199
199
 
200
+ La roadmap `design-ui` porte en plus la couverture totale du playbook Impeccable : 23 étapes `skill` optionnelles couvrant l'intégralité des commandes officielles (`init`, `document`, `shape`, `critique`, ciblées `layout` → `generate`, `audit`, `harden`, `polish`, boucle `detect → verify`), avec les libellés des descriptions publiées sur [impeccable.style/cheatsheet](https://impeccable.style/cheatsheet). Elles forment une checklist pour l'agent ; l'application des règles design reste portée par `R14-impeccable`. `impeccable-live` est volontairement hors roadmap (session navigateur en direct, pas un chemin de code).
201
+
200
202
  ```mermaid
201
203
  flowchart LR
202
204
  subgraph "Fonctionnalité (code)"
@@ -310,7 +312,7 @@ Deux pièces complémentaires : la session consomme moins sans perdre en puissan
310
312
 
311
313
  ## Skills installées
312
314
 
313
- Novahiz livre 99 skills couvrant toutes les catégories :
315
+ 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 :
314
316
 
315
317
  | Catégorie | Skills | Objectif |
316
318
  |-----------|--------|----------|
@@ -344,7 +346,9 @@ Novahiz auto-enregistre les serveurs MCP externes selon la catégorie du prompt
344
346
  | novahiz-scheduler | `mcp/clepsydre/index.mjs` (local, zéro dépendance) | Apache-2.0 | devops |
345
347
  | dart | `dart mcp-server` (Dart SDK) | BSD-3-Clause | code, debug, design-ui, flutter |
346
348
 
347
- Packs de skills (installés depuis les dépôts officiels, jamais vendorés) : `flutter/agent-plugins` (25 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`). Voir [docs/PROVIDERS.md](docs/PROVIDERS.md).
349
+ 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`).
350
+
351
+ **`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).
348
352
 
349
353
  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).
350
354
 
@@ -374,7 +378,7 @@ Voir [docs/CONFIGURATION.md](docs/CONFIGURATION.md) pour toutes les options.
374
378
  | Commande | Objectif |
375
379
  |----------|----------|
376
380
  | `novahiz init` | Installation en une passe |
377
- | `novahiz doctor` | Diagnostic de santé 15-check (17 avec `--deep`) |
381
+ | `novahiz doctor` | Diagnostic de santé 17-check (22 avec `--deep`) |
378
382
  | `novahiz status` | Classification + état du gate actuels |
379
383
  | `novahiz classify <text>` | Classer un prompt |
380
384
  | `novahiz gate` | Vérifier si une édition est autorisée |
@@ -64,8 +64,12 @@ function readLocalVersion(root) {
64
64
  return "unknown";
65
65
  }
66
66
  }
67
- /** npm sous Windows est npm.cmd : spawnSync a besoin du shell, sinon ENOENT. */
68
- function runNpm(args, stdio) {
67
+ /** npm sous Windows est npm.cmd : spawnSync a besoin du shell, sinon ENOENT.
68
+ * `pipe` capture stdout/stderr (obligatoire pour `npm view` : `ignore`
69
+ * retourne stdout=null et `latest` restait toujours vide), `inherit` pour
70
+ * les sorties visibles de l'utilisateur (installation). Exporte pour le
71
+ * test de regression. */
72
+ export function runNpm(args, stdio) {
69
73
  const result = spawnSync("npm", args, {
70
74
  encoding: "utf8",
71
75
  stdio,
@@ -79,7 +83,7 @@ function runNpm(args, stdio) {
79
83
  }
80
84
  function npmFlow(parsed, root) {
81
85
  const local = readLocalVersion(root);
82
- const view = runNpm(["view", "novahiz", "version"], "ignore");
86
+ const view = runNpm(["view", "novahiz", "version"], "pipe");
83
87
  if (view.status !== 0) {
84
88
  process.stderr.write(`novahiz upgrade: npm view failed (${view.stderr.trim() || `exit ${view.status}`}).\n`);
85
89
  process.exitCode = 1;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "novahiz",
3
- "version": "0.8.0",
3
+ "version": "0.8.1",
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",
@@ -71,8 +71,12 @@ function readLocalVersion(root: string): string {
71
71
  }
72
72
  }
73
73
 
74
- /** npm sous Windows est npm.cmd : spawnSync a besoin du shell, sinon ENOENT. */
75
- function runNpm(args: string[], stdio: "inherit" | "ignore"): { status: number; stdout: string; stderr: string } {
74
+ /** npm sous Windows est npm.cmd : spawnSync a besoin du shell, sinon ENOENT.
75
+ * `pipe` capture stdout/stderr (obligatoire pour `npm view` : `ignore`
76
+ * retourne stdout=null et `latest` restait toujours vide), `inherit` pour
77
+ * les sorties visibles de l'utilisateur (installation). Exporte pour le
78
+ * test de regression. */
79
+ export function runNpm(args: string[], stdio: "inherit" | "pipe"): { status: number; stdout: string; stderr: string } {
76
80
  const result = spawnSync("npm", args, {
77
81
  encoding: "utf8",
78
82
  stdio,
@@ -87,7 +91,7 @@ function runNpm(args: string[], stdio: "inherit" | "ignore"): { status: number;
87
91
 
88
92
  function npmFlow(parsed: Parsed, root: string): void {
89
93
  const local = readLocalVersion(root);
90
- const view = runNpm(["view", "novahiz", "version"], "ignore");
94
+ const view = runNpm(["view", "novahiz", "version"], "pipe");
91
95
  if (view.status !== 0) {
92
96
  process.stderr.write(`novahiz upgrade: npm view failed (${view.stderr.trim() || `exit ${view.status}`}).\n`);
93
97
  process.exitCode = 1;