deepflow 0.1.66 → 0.1.67

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/bin/install.js CHANGED
@@ -10,11 +10,21 @@ const os = require('os');
10
10
  const readline = require('readline');
11
11
  const { execFileSync } = require('child_process');
12
12
 
13
- // Subcommand routing: `deepflow auto [...]` -> bin/deepflow-auto.sh
13
+ // Subcommand routing: `deepflow auto [...]` -> claude --agent .claude/agents/deepflow-auto.md
14
14
  if (process.argv[2] === 'auto') {
15
- const scriptPath = path.join(__dirname, 'deepflow-auto.sh');
15
+ if (!process.env.CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS) {
16
+ console.error('Error: CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS environment variable is not set.');
17
+ console.error('');
18
+ console.error('The `deepflow auto` command now uses Claude Code Agent Teams.');
19
+ console.error('To enable it, set the environment variable before running:');
20
+ console.error('');
21
+ console.error(' export CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1');
22
+ console.error(' deepflow auto');
23
+ console.error('');
24
+ process.exit(1);
25
+ }
16
26
  try {
17
- execFileSync('bash', [scriptPath, ...process.argv.slice(3)], { stdio: 'inherit' });
27
+ execFileSync('claude', ['--agent', '.claude/agents/deepflow-auto.md', ...process.argv.slice(3)], { stdio: 'inherit' });
18
28
  } catch (e) {
19
29
  process.exit(e.status || 1);
20
30
  }
@@ -150,12 +160,8 @@ async function main() {
150
160
  }
151
161
  }
152
162
 
153
- // Ensure deepflow-auto.sh is executable
154
- const autoScript = path.join(PACKAGE_DIR, 'bin', 'deepflow-auto.sh');
155
- if (fs.existsSync(autoScript)) {
156
- fs.chmodSync(autoScript, 0o755);
157
- log('deepflow-auto.sh marked executable');
158
- }
163
+ // deepflow-auto.sh has been archived; auto mode now uses Agent Teams
164
+ // via `claude --agent .claude/agents/deepflow-auto.md`
159
165
 
160
166
  // Get version from package.json (single source of truth)
161
167
  const packageJson = require(path.join(PACKAGE_DIR, 'package.json'));
@@ -9,6 +9,9 @@
9
9
 
10
10
  'use strict';
11
11
 
12
+ const fs = require('fs');
13
+ const path = require('path');
14
+
12
15
  // Each entry: [canonical name, ...aliases that also satisfy the requirement]
13
16
  const REQUIRED_SECTIONS = [
14
17
  ['Objective', 'overview', 'goal', 'goals', 'summary'],
@@ -27,7 +30,7 @@ const REQUIRED_SECTIONS = [
27
30
  * @param {'interactive'|'auto'} opts.mode
28
31
  * @returns {{ hard: string[], advisory: string[] }}
29
32
  */
30
- function validateSpec(content, { mode = 'interactive' } = {}) {
33
+ function validateSpec(content, { mode = 'interactive', specsDir = null } = {}) {
31
34
  const hard = [];
32
35
  const advisory = [];
33
36
 
@@ -135,6 +138,24 @@ function validateSpec(content, { mode = 'interactive' } = {}) {
135
138
  advisory.push(`Too many requirements (${seenIds.size}, limit 20)`);
136
139
  }
137
140
 
141
+ // (adv-e) Dependencies reference existing specs
142
+ const depsSection = extractSection(content, 'Dependencies');
143
+ if (depsSection !== null) {
144
+ const depLines = depsSection.split('\n');
145
+ for (const line of depLines) {
146
+ const depMatch = line.match(/depends_on:\s*(.+)/);
147
+ if (depMatch) {
148
+ const specName = depMatch[1].trim();
149
+ if (specsDir) {
150
+ const specPath = path.join(specsDir, `${specName}.md`);
151
+ if (!fs.existsSync(specPath)) {
152
+ advisory.push(`Dependency not found: "${specName}" (no file specs/${specName}.md)`);
153
+ }
154
+ }
155
+ }
156
+ }
157
+ }
158
+
138
159
  // ── Auto-mode escalation ─────────────────────────────────────────────
139
160
  if (mode === 'auto') {
140
161
  hard.push(...advisory.splice(0, advisory.length));
@@ -180,8 +201,6 @@ function extractSection(content, sectionName) {
180
201
 
181
202
  // ── CLI entry point ──────────────────────────────────────────────────────
182
203
  if (require.main === module) {
183
- const fs = require('fs');
184
-
185
204
  const filePath = process.argv[2];
186
205
  if (!filePath) {
187
206
  console.error('Usage: df-spec-lint.js <spec-file.md>');
@@ -190,7 +209,8 @@ if (require.main === module) {
190
209
 
191
210
  const content = fs.readFileSync(filePath, 'utf8');
192
211
  const mode = process.argv.includes('--auto') ? 'auto' : 'interactive';
193
- const result = validateSpec(content, { mode });
212
+ const specsDir = path.resolve(path.dirname(filePath));
213
+ const result = validateSpec(content, { mode, specsDir });
194
214
 
195
215
  if (result.hard.length > 0) {
196
216
  console.error('HARD invariant failures:');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "deepflow",
3
- "version": "0.1.66",
3
+ "version": "0.1.67",
4
4
  "description": "Stay in flow state - lightweight spec-driven task orchestration for Claude Code",
5
5
  "keywords": [
6
6
  "claude",
@@ -15,6 +15,11 @@
15
15
  - [Constraint 1: e.g., "Max file size 10MB"]
16
16
  - [Constraint 2: e.g., "Must work offline"]
17
17
 
18
+ ## Dependencies
19
+
20
+ <!-- Optional. List specs that must be completed before this one. -->
21
+ <!-- - depends_on: doing-other-spec-name -->
22
+
18
23
  ## Out of Scope
19
24
 
20
25
  - [Explicitly excluded: e.g., "Video upload is NOT included"]