novahiz 0.11.8 → 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,31 @@ 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
+
8
33
  ## [0.11.8] - 2026-10-23
9
34
 
10
35
  ### Removed
@@ -689,8 +714,6 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
689
714
  `--sync` forces that behaviour back under npm as an escape hatch.
690
715
  Regression tests: `tests/install-defer.test.ts`.
691
716
 
692
- ## [Unreleased]
693
-
694
717
  ## [0.8.1] - 2026-10-10
695
718
 
696
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.7** — `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
  ┌──────────────────────────────────────────────────────────────────────────┐
@@ -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.8",
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",