novahiz 0.11.7 → 0.11.9

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,39 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
5
5
 
6
6
  ## [Unreleased]
7
7
 
8
+ ## [0.11.9] - 2026-10-24
9
+
10
+ ### Fixed
11
+
12
+ - **Serveurs MCP `dart` et `playwright` déclarés en échec au démarrage** - les
13
+ deux entrées générées dans `opencode.jsonc` n'avaient aucun `timeout`, donc le
14
+ harnais appliquait son défaut (~30 s). Le MCP `dart` mesure 4 à 30 s de
15
+ démarrage à froid (bundle `dart_mcp_server`), et `playwright` passe par `npx`
16
+ qui peut télécharger le paquet au premier lancement : les deux étaient coupés
17
+ en pleine connexion et rapportés `mcp connect failed: Request timed out`.
18
+ `novahiz-docs` reçoit aussi un `timeout` explicite par cohérence.
19
+ - **Pin Playwright désaligné** - `catalog/providers.json` et l'installateur
20
+ épinglaient `@playwright/mcp@0.0.82` alors que le paquet publié et installé
21
+ est `0.0.83`. Les deux sources pointent maintenant sur `0.0.83`.
22
+ - **Texte de gate faux sur l'exemption shell read-only** - l'injection annonçait
23
+ que les commandes shell read-only sont exemptées, sans dire que tout `|`,
24
+ `;`, `&`, `>`, backtick, retour ligne ou `$(...)` annule l'exemption. Un agent
25
+ qui enchaînait `Get-ChildItem | Select-Object` se croyait face à un bug alors
26
+ que la règle est délibérément conservatrice (`src/readonly.ts`). Le texte
27
+ décrit maintenant la règle réelle : une seule commande, sans métacaractère,
28
+ sinon on découpe en appels séparés.
29
+ - **`## [Unreleased]` dupliqué dans le CHANGELOG** - un second titre vide
30
+ subsistait au milieu de l'historique 0.8.x et cassait le repérage de la
31
+ section courante.
32
+
33
+ ## [0.11.8] - 2026-10-23
34
+
35
+ ### Removed
36
+
37
+ - **Support Linux et macOS retire** - Novahiz ne supporte plus que Windows.
38
+ L'installation et les MCP ne sont plus testes ni documentes pour Linux ni
39
+ macOS. La section d'installation du README ne couvre plus que Windows.
40
+
8
41
  ## [0.11.7] - 2026-10-23
9
42
 
10
43
  ### Fixed
@@ -681,8 +714,6 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
681
714
  `--sync` forces that behaviour back under npm as an escape hatch.
682
715
  Regression tests: `tests/install-defer.test.ts`.
683
716
 
684
- ## [Unreleased]
685
-
686
717
  ## [0.8.1] - 2026-10-10
687
718
 
688
719
  Patch: `novahiz upgrade` always reported "up to date" on the npm channel.
package/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  17 catégories, 94 skills, 13 gate rules, 8 MCP providers — tout déterministe, tout local, tout JSON.
6
6
 
7
- > **Version 0.11.6** — `npm install -g novahiz` pose le CLI, et le premier `novahiz` lancé termine l'installation (core puis extras). `CHANGELOG.md` et `scripts/` sont dans le tarball.
7
+ > **Version 0.11.9** - `npm install -g novahiz` pose le CLI, et le premier `novahiz` lancé termine l'installation (core puis extras). `CHANGELOG.md` et `scripts/` sont dans le tarball.
8
8
 
9
9
  ```
10
10
  ┌──────────────────────────────────────────────────────────────────────────┐
@@ -43,27 +43,6 @@
43
43
 
44
44
  ### Option 1 — npm (recommandé)
45
45
 
46
- #### Linux
47
-
48
- Sur Linux, `/usr/local/lib/node_modules` appartient à `root`. Pour éviter d'utiliser `sudo` avec npm, configurez un préfixe dans votre dossier personnel :
49
-
50
- ```bash
51
- mkdir -p ~/.npm-global
52
- npm config set prefix '~/.npm-global'
53
- echo 'export PATH=~/.npm-global/bin:$PATH' >> ~/.bashrc
54
- source ~/.bashrc
55
- npm install -g novahiz
56
- novahiz setup
57
- novahiz doctor
58
- ```
59
-
60
- Si vous préférez conserver l'installation système (nécessite `sudo`) :
61
-
62
- ```bash
63
- sudo npm install -g novahiz
64
- sudo novahiz setup
65
- ```
66
-
67
46
  #### Windows
68
47
 
69
48
  Sur Windows, aucune configuration préalable n'est nécessaire :
@@ -74,20 +53,6 @@ novahiz setup
74
53
  novahiz doctor
75
54
  ```
76
55
 
77
- #### macOS
78
-
79
- Sur macOS, aucune configuration particulière n'est nécessaire en général. Si vous obtenez une erreur de permissions sur `/usr/local/lib/node_modules`, utilisez la même méthode que sous Linux :
80
-
81
- ```bash
82
- mkdir -p ~/.npm-global
83
- npm config set prefix '~/.npm-global'
84
- echo 'export PATH=~/.npm-global/bin:$PATH' >> ~/.zshrc
85
- source ~/.zshrc
86
- npm install -g novahiz
87
- novahiz setup
88
- novahiz doctor
89
- ```
90
-
91
56
  `npm install -g` pose le CLI. Le premier `novahiz` lancé termine le reste, en deux passes : le **core** (skills, plugin, agent, commands, config, catalogue — local, sans réseau ni sudo), puis les **extras** (providers et toolchain, MCP globaux dont Playwright, vault Obsidian, rafraîchissement npm). Une seule fois.
92
57
 
93
58
  **Pourquoi au premier lancement et pas dans le postinstall ?** npm 11.16+ ne lance un script de lifecycle que si le paquet y est explicitement autorisé, et une installation globale n'a pas de `package.json` où l'inscrire : npm avertit (`npm warn allow-scripts novahiz`) et saute le script. Le CLI fait donc le même travail à son premier appel, ce qui fonctionne quelle que soit la version de npm. Pour que tout se passe pendant le `npm install` :
@@ -1707,7 +1707,7 @@ async function setup(ctx: Context): Promise<Cleanup> {
1707
1707
  await log("warn", "Ledger state is invalid JSON, enforcement injected without the task summary");
1708
1708
  }
1709
1709
  }
1710
- lines.push("The gate blocks edit/write/patch/apply_patch/bash/shell until the required skills are loaded via skill({id:\"...\"}). Read-only shell commands (status/log/diff/ls/Get-Content/...) are exempt.");
1710
+ lines.push("The gate blocks edit/write/patch/apply_patch/bash/shell until the required skills are loaded via skill({id:\"...\"}). A shell command is exempt only when it is provably read-only: one command (status/log/diff/ls/Get-Content/...) and no pipe, ';', '&', '>', backtick, newline or $(...) - split a chained command into separate calls instead of joining it.");
1711
1711
  lines.push("The gate is content-aware: novahiz-humanizer, ui-slop-remover and ui-craft-rules are required only on frontend design tasks (R13), and impeccable on the same design selectors (R14).");
1712
1712
  lines.push("Config edited = opencode restart required (config read at import).");
1713
1713
  lines.push("Memory lives in project-memory/ under the project root (cwd): index.json + fixed-size slots (8000 chars / 200 lines) with compact → archive → new-slot rotation. Use the MCP memory_* tools: memory_search to find relevant slots first, then memory_get to read, memory_write to append, memory_update to correct, memory_archive to retire.");
@@ -3,7 +3,7 @@
3
3
  "id": "playwright",
4
4
  "label": "Playwright MCP",
5
5
  "kind": "mcp",
6
- "command": ["npx", "-y", "@playwright/mcp@0.0.82"],
6
+ "command": ["npx", "-y", "@playwright/mcp@0.0.83"],
7
7
  "source": "https://github.com/microsoft/playwright-mcp",
8
8
  "license": "Apache-2.0",
9
9
  "categories": ["browser", "design-ui"]
@@ -604,9 +604,9 @@ async function main() {
604
604
  const entry = providers.find((provider) => provider.id === "playwright");
605
605
  const command = Array.isArray(entry?.command) ? entry.command : [];
606
606
  const pin = command.find((token) => typeof token === "string" && token.includes("@playwright/mcp"));
607
- return typeof pin === "string" ? pin : "@playwright/mcp@0.0.82";
607
+ return typeof pin === "string" ? pin : "@playwright/mcp@0.0.83";
608
608
  } catch {
609
- return "@playwright/mcp@0.0.82";
609
+ return "@playwright/mcp@0.0.83";
610
610
  }
611
611
  })();
612
612
  const mcpServers = [
@@ -772,6 +772,7 @@ async function main() {
772
772
  "novahiz-docs": {
773
773
  "type": "local",
774
774
  "command": [nodeBin, join(home, "mcp", "novahiz-docs", "index.mjs")],
775
+ "timeout": 120000,
775
776
  "environment": mcpEnv,
776
777
  "enabled": true
777
778
  },
@@ -794,7 +795,9 @@ async function main() {
794
795
  "playwright": {
795
796
  "type": "local",
796
797
  // See playwrightBrowserFlag() in lib.mjs for the platform rule.
797
- "command": ["npx", "-y", "@playwright/mcp@0.0.82", playwrightBrowserFlag()],
798
+ // timeout 180s : npx telecharge le paquet au premier lancement.
799
+ "command": ["npx", "-y", "@playwright/mcp@0.0.83", playwrightBrowserFlag()],
800
+ "timeout": 180000,
798
801
  "environment": mcpEnv,
799
802
  "enabled": true
800
803
  },
@@ -832,6 +835,10 @@ async function main() {
832
835
  mcp["dart"] = {
833
836
  "type": "local",
834
837
  "command": ["dart", "mcp-server"],
838
+ // Mesure 2026-10-24 : demarrage a froid 4-30 s (bundle
839
+ // dart_mcp_server 1.2.1) ; sans timeout explicite le harness coupe
840
+ // vers 30 s et le serveur est declare en echec.
841
+ "timeout": 180000,
835
842
  "environment": mcpEnv,
836
843
  "enabled": true
837
844
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "novahiz",
3
- "version": "0.11.7",
3
+ "version": "0.11.9",
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",