@gravirei/reis 2.6.1 → 2.6.2

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
@@ -1,5 +1,23 @@
1
1
  # Changelog
2
2
 
3
+ ## [2.6.2] - 2026-01-26
4
+
5
+ ### 🐛 Critical Bug Fix
6
+
7
+ #### Subagents Not Installed/Updated on `npm install`
8
+ - **Added `postinstall` script** to automatically install REIS files when package is installed
9
+ - **Subagents now always update** to latest version (previously skipped if files existed)
10
+ - **Fixed missing `reis_plan_reviewer.md`** subagent not being installed
11
+ - Added `--silent` flag support for clean postinstall output
12
+
13
+ ### 📦 What Changed
14
+
15
+ - `npm install -g @gravirei/reis` now automatically installs all subagents
16
+ - Subagent files are always overwritten to stay in sync with package version
17
+ - Silent mode: no output during `npm install` (cleaner experience)
18
+
19
+ ---
20
+
3
21
  ## [2.6.1] - 2026-01-26
4
22
 
5
23
  ### 🐛 Bug Fixes
package/lib/install.js CHANGED
@@ -19,7 +19,8 @@ ${chalk.white.bold(' ██ ██ ███████ ██ ████
19
19
  `;
20
20
 
21
21
  // Check if running in CI environment or sudo (where stdin is not available)
22
- const isCIEnvironment = process.env.CI === 'true' || process.argv.includes('--silent');
22
+ const isSilentMode = process.argv.includes('--silent');
23
+ const isCIEnvironment = process.env.CI === 'true' || isSilentMode;
23
24
  const isSudo = process.getuid && process.getuid() === 0;
24
25
  // Check if stdin is actually readable (not just isTTY)
25
26
  const hasInteractiveStdin = process.stdin.isTTY && !process.stdin.destroyed && typeof process.stdin.read === 'function';
@@ -28,29 +29,39 @@ const isInteractive = !isCIEnvironment && !isSudo && hasInteractiveStdin;
28
29
  // Main installation function
29
30
  async function install() {
30
31
  try {
31
- // Always show banner
32
- console.log(banner);
32
+ // Show banner unless in silent mode
33
+ if (!isSilentMode) {
34
+ console.log(banner);
35
+ }
33
36
 
34
37
  // Check for non-interactive modes
35
38
  if (isCIEnvironment) {
36
- console.log(chalk.gray('Running in CI mode - installing automatically...\n'));
37
- await performInstallation();
39
+ if (!isSilentMode) {
40
+ console.log(chalk.gray('Running in CI mode - installing automatically...\n'));
41
+ }
42
+ await performInstallation(false, isSilentMode);
38
43
  return;
39
44
  }
40
45
 
41
46
  if (isSudo) {
42
- console.log(chalk.gray('Running with sudo - installing automatically...\n'));
43
- await performInstallation();
47
+ if (!isSilentMode) {
48
+ console.log(chalk.gray('Running with sudo - installing automatically...\n'));
49
+ }
50
+ await performInstallation(false, isSilentMode);
44
51
  return;
45
52
  }
46
53
 
47
54
  // Interactive mode - show prompt
48
- console.log(chalk.white('This will install REIS files to ~/.rovodev/reis/\n'));
55
+ if (!isSilentMode) {
56
+ console.log(chalk.white('This will install REIS files to ~/.rovodev/reis/\n'));
57
+ }
49
58
 
50
59
  // Double-check we can actually prompt
51
60
  if (!isInteractive) {
52
- console.log(chalk.gray('Non-interactive mode detected - installing automatically...\n'));
53
- await performInstallation();
61
+ if (!isSilentMode) {
62
+ console.log(chalk.gray('Non-interactive mode detected - installing automatically...\n'));
63
+ }
64
+ await performInstallation(false, isSilentMode);
54
65
  return;
55
66
  }
56
67
 
@@ -71,11 +82,13 @@ async function install() {
71
82
  }
72
83
 
73
84
  console.log('');
74
- await performInstallation();
85
+ await performInstallation(false, false);
75
86
  } catch (promptError) {
76
87
  // inquirer failed, install anyway
77
- console.log(chalk.gray('Prompt failed - installing automatically...\n'));
78
- await performInstallation();
88
+ if (!isSilentMode) {
89
+ console.log(chalk.gray('Prompt failed - installing automatically...\n'));
90
+ }
91
+ await performInstallation(false, isSilentMode);
79
92
  }
80
93
 
81
94
  } catch (error) {
@@ -124,13 +137,15 @@ async function performInstallation(overwrite = false, silent = false) {
124
137
  }
125
138
 
126
139
  // Copy subagents from subagents/ to ~/.rovodev/subagents/
140
+ // ALWAYS overwrite subagents - they should stay up-to-date with package version
127
141
  const subagentsSourceDir = path.join(packageDir, 'subagents');
128
142
  if (fs.existsSync(subagentsSourceDir)) {
129
143
  const subagentFiles = fs.readdirSync(subagentsSourceDir);
130
144
  subagentFiles.forEach(file => {
131
145
  const src = path.join(subagentsSourceDir, file);
132
146
  const dest = path.join(subagentsDir, file);
133
- if (copyFile(src, dest, overwrite)) {
147
+ // Always overwrite subagent files to ensure they're up-to-date
148
+ if (copyFile(src, dest, true)) {
134
149
  fileCount++;
135
150
  }
136
151
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gravirei/reis",
3
- "version": "2.6.1",
3
+ "version": "2.6.2",
4
4
  "description": "Roadmap Execution & Implementation System v2.0 - Wave-based execution with checkpoints, metrics, and visualization for Atlassian Rovo Dev",
5
5
  "main": "lib/index.js",
6
6
  "bin": {
@@ -8,7 +8,8 @@
8
8
  },
9
9
  "scripts": {
10
10
  "test": "mocha test/**/*.test.js --timeout 5000",
11
- "test:watch": "mocha test/**/*.test.js --watch"
11
+ "test:watch": "mocha test/**/*.test.js --watch",
12
+ "postinstall": "node lib/install.js --silent"
12
13
  },
13
14
  "keywords": [
14
15
  "reis",