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 [...]` ->
|
|
13
|
+
// Subcommand routing: `deepflow auto [...]` -> claude --agent .claude/agents/deepflow-auto.md
|
|
14
14
|
if (process.argv[2] === 'auto') {
|
|
15
|
-
|
|
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('
|
|
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
|
-
//
|
|
154
|
-
|
|
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'));
|
package/hooks/df-spec-lint.js
CHANGED
|
@@ -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
|
|
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
|
@@ -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"]
|
|
File without changes
|