deepflow 0.1.1 → 0.1.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.
Files changed (3) hide show
  1. package/VERSION +1 -1
  2. package/bin/install.js +84 -41
  3. package/package.json +1 -1
package/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.1
1
+ 0.1.2
package/bin/install.js CHANGED
@@ -19,23 +19,35 @@ const c = {
19
19
  };
20
20
 
21
21
  // Paths
22
- const CLAUDE_DIR = path.join(os.homedir(), '.claude');
22
+ const GLOBAL_DIR = path.join(os.homedir(), '.claude');
23
+ const PROJECT_DIR = path.join(process.cwd(), '.claude');
23
24
  const PACKAGE_DIR = path.resolve(__dirname, '..');
24
25
 
25
26
  async function main() {
26
27
  console.log('');
27
- console.log(`${c.cyan}Installing deepflow...${c.reset}`);
28
+ console.log(`${c.cyan}deepflow installer${c.reset}`);
29
+ console.log('');
30
+
31
+ // Ask for installation level
32
+ const level = await askInstallLevel();
33
+ const CLAUDE_DIR = level === 'global' ? GLOBAL_DIR : PROJECT_DIR;
34
+ const levelLabel = level === 'global' ? 'globally' : 'in this project';
35
+
36
+ console.log('');
37
+ console.log(`Installing ${levelLabel}...`);
28
38
  console.log('');
29
39
 
30
40
  // Create directories
31
41
  const dirs = [
32
42
  'commands/df',
33
43
  'skills',
34
- 'agents',
35
- 'hooks',
36
- 'deepflow'
44
+ 'agents'
37
45
  ];
38
46
 
47
+ if (level === 'global') {
48
+ dirs.push('hooks', 'deepflow');
49
+ }
50
+
39
51
  for (const dir of dirs) {
40
52
  fs.mkdirSync(path.join(CLAUDE_DIR, dir), { recursive: true });
41
53
  }
@@ -61,55 +73,71 @@ async function main() {
61
73
  );
62
74
  log('Agents installed');
63
75
 
64
- // Copy hooks
65
- const hooksDir = path.join(PACKAGE_DIR, 'hooks');
66
- if (fs.existsSync(hooksDir)) {
67
- for (const file of fs.readdirSync(hooksDir)) {
68
- if (file.endsWith('.js')) {
69
- fs.copyFileSync(
70
- path.join(hooksDir, file),
71
- path.join(CLAUDE_DIR, 'hooks', file)
72
- );
76
+ // Copy hooks (global only - statusline requires global settings)
77
+ if (level === 'global') {
78
+ const hooksDir = path.join(PACKAGE_DIR, 'hooks');
79
+ if (fs.existsSync(hooksDir)) {
80
+ for (const file of fs.readdirSync(hooksDir)) {
81
+ if (file.endsWith('.js')) {
82
+ fs.copyFileSync(
83
+ path.join(hooksDir, file),
84
+ path.join(CLAUDE_DIR, 'hooks', file)
85
+ );
86
+ }
73
87
  }
88
+ log('Hooks installed');
74
89
  }
75
- log('Hooks installed');
76
90
  }
77
91
 
78
- // Copy VERSION
79
- const versionFile = path.join(PACKAGE_DIR, 'VERSION');
80
- if (fs.existsSync(versionFile)) {
81
- fs.copyFileSync(versionFile, path.join(CLAUDE_DIR, 'deepflow', 'VERSION'));
82
- log('Version file installed');
92
+ // Copy VERSION (global only - for update checking)
93
+ if (level === 'global') {
94
+ const versionFile = path.join(PACKAGE_DIR, 'VERSION');
95
+ if (fs.existsSync(versionFile)) {
96
+ fs.copyFileSync(versionFile, path.join(CLAUDE_DIR, 'deepflow', 'VERSION'));
97
+ log('Version file installed');
98
+ }
83
99
  }
84
100
 
85
- // Configure statusline
86
- await configureStatusline();
87
-
88
- // Trigger background update check
89
- const updateChecker = path.join(CLAUDE_DIR, 'hooks', 'df-check-update.js');
90
- if (fs.existsSync(updateChecker)) {
91
- const { spawn } = require('child_process');
92
- const child = spawn(process.execPath, [updateChecker], {
93
- detached: true,
94
- stdio: 'ignore'
95
- });
96
- child.unref();
101
+ // Configure statusline (global only)
102
+ if (level === 'global') {
103
+ await configureStatusline(CLAUDE_DIR);
104
+
105
+ // Trigger background update check
106
+ const updateChecker = path.join(CLAUDE_DIR, 'hooks', 'df-check-update.js');
107
+ if (fs.existsSync(updateChecker)) {
108
+ const { spawn } = require('child_process');
109
+ const child = spawn(process.execPath, [updateChecker], {
110
+ detached: true,
111
+ stdio: 'ignore'
112
+ });
113
+ child.unref();
114
+ }
97
115
  }
98
116
 
99
117
  console.log('');
100
118
  console.log(`${c.green}Installation complete!${c.reset}`);
101
119
  console.log('');
102
- console.log(`Installed to ${CLAUDE_DIR}:`);
120
+ console.log(`Installed to ${c.cyan}${CLAUDE_DIR}${c.reset}:`);
103
121
  console.log(' commands/df/ — /df:spec, /df:plan, /df:execute, /df:verify');
104
122
  console.log(' skills/ — gap-discovery, atomic-commits, code-completeness');
105
123
  console.log(' agents/ — reasoner');
106
- console.log(' hooks/ — statusline, update checker');
124
+ if (level === 'global') {
125
+ console.log(' hooks/ — statusline, update checker');
126
+ }
107
127
  console.log('');
128
+ if (level === 'project') {
129
+ console.log(`${c.dim}Note: Statusline is only available with global install.${c.reset}`);
130
+ console.log('');
131
+ }
108
132
  console.log('Quick start:');
109
- console.log(' 1. cd your-project');
110
- console.log(' 2. claude');
111
- console.log(' 3. Describe what you want to build');
112
- console.log(' 4. /df:spec feature-name');
133
+ if (level === 'global') {
134
+ console.log(' 1. cd your-project');
135
+ console.log(' 2. claude');
136
+ } else {
137
+ console.log(' 1. claude');
138
+ }
139
+ console.log(' 2. Describe what you want to build');
140
+ console.log(' 3. /df:spec feature-name');
113
141
  console.log('');
114
142
  }
115
143
 
@@ -130,9 +158,9 @@ function copyDir(src, dest) {
130
158
  }
131
159
  }
132
160
 
133
- async function configureStatusline() {
134
- const settingsPath = path.join(CLAUDE_DIR, 'settings.json');
135
- const hookCmd = `node "${path.join(CLAUDE_DIR, 'hooks', 'df-statusline.js')}"`;
161
+ async function configureStatusline(claudeDir) {
162
+ const settingsPath = path.join(claudeDir, 'settings.json');
163
+ const hookCmd = `node "${path.join(claudeDir, 'hooks', 'df-statusline.js')}"`;
136
164
 
137
165
  let settings = {};
138
166
 
@@ -177,6 +205,21 @@ function ask(question) {
177
205
  });
178
206
  }
179
207
 
208
+ async function askInstallLevel() {
209
+ console.log('Where do you want to install deepflow?');
210
+ console.log('');
211
+ console.log(` ${c.cyan}1${c.reset}) Global ${c.dim}(~/.claude/ - available in all projects)${c.reset}`);
212
+ console.log(` ${c.cyan}2${c.reset}) Project ${c.dim}(./.claude/ - only this project)${c.reset}`);
213
+ console.log('');
214
+
215
+ const answer = await ask('Choose [1/2]: ');
216
+
217
+ if (answer === '2') {
218
+ return 'project';
219
+ }
220
+ return 'global';
221
+ }
222
+
180
223
  function log(msg) {
181
224
  console.log(` ${c.green}✓${c.reset} ${msg}`);
182
225
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "deepflow",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "Stay in flow state - lightweight spec-driven task orchestration for Claude Code",
5
5
  "keywords": [
6
6
  "claude",