novahiz 0.11.6 → 0.11.7

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,18 @@ 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.7] - 2026-10-23
9
+
10
+ ### Fixed
11
+
12
+ - **MCP Novahiz ne fonctionnent pas sur Linux** - OpenCode (en mode GUI/Desktop) ne
13
+ n'hérite pas du PATH du shell, donc `node` seul ne se résolvait pas pour les MCP
14
+ locaux (`novahiz-core`, `novahiz-gate`, `novahiz-docs`, `novahiz-search`,
15
+ `novahiz-scheduler`, `novahiz-scan`). L'installateur utilise maintenant le chemin
16
+ absolu de `node` (`process.execPath`) et propage le `PATH` de l'installateur via
17
+ `environment` à chaque MCP. Le MCP `dart` est omis si le Dart SDK n'est pas
18
+ présent (`which dart` / `where dart`).
19
+
8
20
  ## [0.11.6] - 2026-10-23
9
21
 
10
22
  ### Fixed
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.4** — `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.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.
8
8
 
9
9
  ```
10
10
  ┌──────────────────────────────────────────────────────────────────────────┐
@@ -43,8 +43,48 @@
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
+ #### Windows
68
+
69
+ Sur Windows, aucune configuration préalable n'est nécessaire :
70
+
71
+ ```bash
72
+ npm install -g novahiz
73
+ novahiz setup
74
+ novahiz doctor
75
+ ```
76
+
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
+
46
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
47
86
  npm install -g novahiz
87
+ novahiz setup
48
88
  novahiz doctor
49
89
  ```
50
90
 
@@ -746,6 +746,97 @@ async function main() {
746
746
  const agentsSkillsDir = join(homedir(), ".agents", "skills");
747
747
  const agentsSkillsDirLegacy = join(homedir(), ".config", ".agents", "skills");
748
748
 
749
+ // Le chemin absolu de node est essentiel : OpenCode (notamment en
750
+ // mode GUI/Desktop sur Linux) ne hérite pas du PATH du shell, donc
751
+ // `node` seul ne se résout pas. On utilise donc le chemin absolu du
752
+ // node qui lance l'installateur.
753
+ const nodeBin = process.execPath;
754
+ // On propage le PATH de l'installateur aux MCP locaux pour que `node`,
755
+ // `npx`, `dart` etc. soient trouvables même sans héritage du shell.
756
+ const mcpEnv = { PATH: process.env.PATH };
757
+
758
+ // Détermine si le Dart SDK est présent (nécessaire pour le MCP dart).
759
+ let hasDart = false;
760
+ try {
761
+ const dartCheck = spawnSync(
762
+ process.platform === "win32" ? "where" : "which",
763
+ ["dart"],
764
+ { encoding: "utf8", stdio: "pipe" }
765
+ );
766
+ hasDart = dartCheck.status === 0;
767
+ } catch {
768
+ // dart introuvable, le MCP dart sera omis
769
+ }
770
+
771
+ const mcp = {
772
+ "novahiz-docs": {
773
+ "type": "local",
774
+ "command": [nodeBin, join(home, "mcp", "novahiz-docs", "index.mjs")],
775
+ "environment": mcpEnv,
776
+ "enabled": true
777
+ },
778
+ "novahiz-search": {
779
+ "type": "local",
780
+ "command": [nodeBin, join(home, "mcp", "lodestone", "index.mjs")],
781
+ "timeout": 120000,
782
+ "environment": mcpEnv,
783
+ "enabled": true
784
+ },
785
+ // `novahiz-scheduler` is the local scheduler (mcp/clepsydre, zero npm
786
+ // dependency): it ships ready to run, no setup step.
787
+ "novahiz-scheduler": {
788
+ "type": "local",
789
+ "command": [nodeBin, join(home, "mcp", "clepsydre", "index.mjs")],
790
+ "timeout": 120000,
791
+ "environment": mcpEnv,
792
+ "enabled": true
793
+ },
794
+ "playwright": {
795
+ "type": "local",
796
+ // See playwrightBrowserFlag() in lib.mjs for the platform rule.
797
+ "command": ["npx", "-y", "@playwright/mcp@0.0.82", playwrightBrowserFlag()],
798
+ "environment": mcpEnv,
799
+ "enabled": true
800
+ },
801
+ // Trio runtime (audit 2026-10-08) : novahiz_classify (27 outils dont
802
+ // la classification du pipeline), novahiz_gate (la porte que le skill
803
+ // novahiz-gate appelle) et scan (argus). Le transform du plugin les
804
+ // inscrit aussi, mais un transform arrive apres la resolution MCP ne
805
+ // lie jamais les serveurs — en config statique la connexion est
806
+ // garantie des l'installation. Le plugin voit editor.get(id) deja
807
+ // present et les saute : aucun doublon. timeout 120s = cold start
808
+ // argus (audit 2026-09-25 P2).
809
+ "novahiz-core": {
810
+ "type": "local",
811
+ "command": [nodeBin, join(home, "mcp", "novahiz-tools", "index.mjs")],
812
+ "timeout": 120000,
813
+ "environment": mcpEnv,
814
+ "enabled": true
815
+ },
816
+ "novahiz-gate": {
817
+ "type": "local",
818
+ "command": [nodeBin, join(home, "mcp", "novahiz-gate", "index.mjs")],
819
+ "timeout": 120000,
820
+ "environment": mcpEnv,
821
+ "enabled": true
822
+ },
823
+ "novahiz-scan": {
824
+ "type": "local",
825
+ "command": [nodeBin, join(home, "mcp", "argus", "src", "cli.mjs")],
826
+ "timeout": 120000,
827
+ "environment": mcpEnv,
828
+ "enabled": true
829
+ }
830
+ };
831
+ if (hasDart) {
832
+ mcp["dart"] = {
833
+ "type": "local",
834
+ "command": ["dart", "mcp-server"],
835
+ "environment": mcpEnv,
836
+ "enabled": true
837
+ };
838
+ }
839
+
749
840
  const openCodeConfig = {
750
841
  "$schema": "https://opencode.ai/config.json",
751
842
  // T3: sans ce champ, adapters/opencode/instructions.md n'est lu par
@@ -760,64 +851,7 @@ async function main() {
760
851
  // (typescript-language-server, etc.) peuvent manquer — des entrees
761
852
  // mortes = exactement le probleme qu'on veut jamais livrer.
762
853
  "lsp": true,
763
- "mcp": {
764
- "novahiz-docs": {
765
- "type": "local",
766
- "command": ["node", join(home, "mcp", "novahiz-docs", "index.mjs")],
767
- "enabled": true
768
- },
769
- "novahiz-search": {
770
- "type": "local",
771
- "command": ["node", join(home, "mcp", "lodestone", "index.mjs")],
772
- "timeout": 120000,
773
- "enabled": true
774
- },
775
- // `novahiz-scheduler` is the local scheduler (mcp/clepsydre, zero npm
776
- // dependency): it ships ready to run, no setup step.
777
- "novahiz-scheduler": {
778
- "type": "local",
779
- "command": ["node", join(home, "mcp", "clepsydre", "index.mjs")],
780
- "timeout": 120000,
781
- "enabled": true
782
- },
783
- "playwright": {
784
- "type": "local",
785
- // See playwrightBrowserFlag() in lib.mjs for the platform rule.
786
- "command": ["npx", "-y", "@playwright/mcp@0.0.82", playwrightBrowserFlag()],
787
- "enabled": true
788
- },
789
- "dart": {
790
- "type": "local",
791
- "command": ["dart", "mcp-server"],
792
- "enabled": true
793
- },
794
- // Trio runtime (audit 2026-10-08) : novahiz_classify (27 outils dont
795
- // la classification du pipeline), novahiz_gate (la porte que le skill
796
- // novahiz-gate appelle) et scan (argus). Le transform du plugin les
797
- // inscrit aussi, mais un transform arrive apres la resolution MCP ne
798
- // lie jamais les serveurs — en config statique la connexion est
799
- // garantie des l'installation. Le plugin voit editor.get(id) deja
800
- // present et les saute : aucun doublon. timeout 120s = cold start
801
- // argus (audit 2026-09-25 P2).
802
- "novahiz-core": {
803
- "type": "local",
804
- "command": ["node", join(home, "mcp", "novahiz-tools", "index.mjs")],
805
- "timeout": 120000,
806
- "enabled": true
807
- },
808
- "novahiz-gate": {
809
- "type": "local",
810
- "command": ["node", join(home, "mcp", "novahiz-gate", "index.mjs")],
811
- "timeout": 120000,
812
- "enabled": true
813
- },
814
- "novahiz-scan": {
815
- "type": "local",
816
- "command": ["node", join(home, "mcp", "argus", "src", "cli.mjs")],
817
- "timeout": 120000,
818
- "enabled": true
819
- }
820
- },
854
+ "mcp": mcp,
821
855
  "skills": {
822
856
  "paths": [skillsDir]
823
857
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "novahiz",
3
- "version": "0.11.6",
3
+ "version": "0.11.7",
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",