@bradygaster/squad-sdk 0.7.0 → 0.8.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/README.md +296 -296
- package/dist/adapter/client.d.ts +243 -0
- package/dist/adapter/client.d.ts.map +1 -0
- package/dist/adapter/client.js +567 -0
- package/dist/adapter/client.js.map +1 -0
- package/dist/adapter/errors.d.ts +260 -0
- package/dist/adapter/errors.d.ts.map +1 -0
- package/dist/adapter/errors.js +362 -0
- package/dist/adapter/errors.js.map +1 -0
- package/dist/adapter/types.d.ts +779 -0
- package/dist/adapter/types.d.ts.map +1 -0
- package/dist/adapter/types.js +11 -0
- package/dist/adapter/types.js.map +1 -0
- package/dist/agents/charter-compiler.d.ts +102 -0
- package/dist/agents/charter-compiler.d.ts.map +1 -0
- package/dist/agents/charter-compiler.js +157 -0
- package/dist/agents/charter-compiler.js.map +1 -0
- package/dist/agents/history-shadow.d.ts +80 -0
- package/dist/agents/history-shadow.d.ts.map +1 -0
- package/dist/agents/history-shadow.js +239 -0
- package/dist/agents/history-shadow.js.map +1 -0
- package/dist/agents/index.d.ts +71 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +183 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/lifecycle.d.ts +138 -0
- package/dist/agents/lifecycle.d.ts.map +1 -0
- package/dist/agents/lifecycle.js +284 -0
- package/dist/agents/lifecycle.js.map +1 -0
- package/dist/agents/model-selector.d.ts +80 -0
- package/dist/agents/model-selector.d.ts.map +1 -0
- package/dist/agents/model-selector.js +171 -0
- package/dist/agents/model-selector.js.map +1 -0
- package/dist/agents/onboarding.d.ts +65 -0
- package/dist/agents/onboarding.d.ts.map +1 -0
- package/dist/agents/onboarding.js +373 -0
- package/dist/agents/onboarding.js.map +1 -0
- package/dist/build/bundle.d.ts +32 -0
- package/dist/build/bundle.d.ts.map +1 -0
- package/dist/build/bundle.js +97 -0
- package/dist/build/bundle.js.map +1 -0
- package/dist/build/ci-pipeline.d.ts +51 -0
- package/dist/build/ci-pipeline.d.ts.map +1 -0
- package/dist/build/ci-pipeline.js +180 -0
- package/dist/build/ci-pipeline.js.map +1 -0
- package/dist/build/github-dist.d.ts +37 -0
- package/dist/build/github-dist.d.ts.map +1 -0
- package/dist/build/github-dist.js +117 -0
- package/dist/build/github-dist.js.map +1 -0
- package/dist/build/index.d.ts +11 -0
- package/dist/build/index.d.ts.map +1 -0
- package/dist/build/index.js +11 -0
- package/dist/build/index.js.map +1 -0
- package/dist/build/install-migration.d.ts +28 -0
- package/dist/build/install-migration.d.ts.map +1 -0
- package/dist/build/install-migration.js +103 -0
- package/dist/build/install-migration.js.map +1 -0
- package/dist/build/npm-package.d.ts +54 -0
- package/dist/build/npm-package.d.ts.map +1 -0
- package/dist/build/npm-package.js +128 -0
- package/dist/build/npm-package.js.map +1 -0
- package/dist/build/release.d.ts +108 -0
- package/dist/build/release.d.ts.map +1 -0
- package/dist/build/release.js +295 -0
- package/dist/build/release.js.map +1 -0
- package/dist/build/versioning.d.ts +38 -0
- package/dist/build/versioning.d.ts.map +1 -0
- package/dist/build/versioning.js +113 -0
- package/dist/build/versioning.js.map +1 -0
- package/dist/casting/casting-engine.d.ts +60 -0
- package/dist/casting/casting-engine.d.ts.map +1 -0
- package/dist/casting/casting-engine.js +223 -0
- package/dist/casting/casting-engine.js.map +1 -0
- package/dist/casting/casting-history.d.ts +54 -0
- package/dist/casting/casting-history.d.ts.map +1 -0
- package/dist/casting/casting-history.js +63 -0
- package/dist/casting/casting-history.js.map +1 -0
- package/dist/casting/index.d.ts +46 -0
- package/dist/casting/index.d.ts.map +1 -0
- package/dist/casting/index.js +45 -0
- package/dist/casting/index.js.map +1 -0
- package/dist/client/event-bus.d.ts +29 -0
- package/dist/client/event-bus.d.ts.map +1 -0
- package/dist/client/event-bus.js +52 -0
- package/dist/client/event-bus.js.map +1 -0
- package/dist/client/index.d.ts +100 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +170 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/session-pool.d.ts +66 -0
- package/dist/client/session-pool.d.ts.map +1 -0
- package/dist/client/session-pool.js +145 -0
- package/dist/client/session-pool.js.map +1 -0
- package/dist/config/agent-doc.d.ts +43 -0
- package/dist/config/agent-doc.d.ts.map +1 -0
- package/dist/config/agent-doc.js +158 -0
- package/dist/config/agent-doc.js.map +1 -0
- package/dist/config/agent-source.d.ts +95 -0
- package/dist/config/agent-source.d.ts.map +1 -0
- package/dist/config/agent-source.js +274 -0
- package/dist/config/agent-source.js.map +1 -0
- package/dist/config/doc-sync.d.ts +66 -0
- package/dist/config/doc-sync.d.ts.map +1 -0
- package/dist/config/doc-sync.js +270 -0
- package/dist/config/doc-sync.js.map +1 -0
- package/dist/config/feature-audit.d.ts +49 -0
- package/dist/config/feature-audit.d.ts.map +1 -0
- package/dist/config/feature-audit.js +148 -0
- package/dist/config/feature-audit.js.map +1 -0
- package/dist/config/index.d.ts +15 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +15 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/init.d.ts +61 -0
- package/dist/config/init.d.ts.map +1 -0
- package/dist/config/init.js +376 -0
- package/dist/config/init.js.map +1 -0
- package/dist/config/legacy-fallback.d.ts +83 -0
- package/dist/config/legacy-fallback.d.ts.map +1 -0
- package/dist/config/legacy-fallback.js +212 -0
- package/dist/config/legacy-fallback.js.map +1 -0
- package/dist/config/markdown-migration.d.ts +157 -0
- package/dist/config/markdown-migration.d.ts.map +1 -0
- package/dist/config/markdown-migration.js +434 -0
- package/dist/config/markdown-migration.js.map +1 -0
- package/dist/config/migration.d.ts +123 -0
- package/dist/config/migration.d.ts.map +1 -0
- package/dist/config/migration.js +273 -0
- package/dist/config/migration.js.map +1 -0
- package/dist/config/migrations/index.d.ts +36 -0
- package/dist/config/migrations/index.d.ts.map +1 -0
- package/dist/config/migrations/index.js +216 -0
- package/dist/config/migrations/index.js.map +1 -0
- package/dist/config/models.d.ts +134 -0
- package/dist/config/models.d.ts.map +1 -0
- package/dist/config/models.js +354 -0
- package/dist/config/models.js.map +1 -0
- package/dist/config/routing.d.ts +118 -0
- package/dist/config/routing.d.ts.map +1 -0
- package/dist/config/routing.js +247 -0
- package/dist/config/routing.js.map +1 -0
- package/dist/config/schema.d.ts +72 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +63 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/coordinator/coordinator.d.ts +82 -0
- package/dist/coordinator/coordinator.d.ts.map +1 -0
- package/dist/coordinator/coordinator.js +192 -0
- package/dist/coordinator/coordinator.js.map +1 -0
- package/dist/coordinator/direct-response.d.ts +83 -0
- package/dist/coordinator/direct-response.d.ts.map +1 -0
- package/dist/coordinator/direct-response.js +187 -0
- package/dist/coordinator/direct-response.js.map +1 -0
- package/dist/coordinator/fan-out.d.ts +83 -0
- package/dist/coordinator/fan-out.d.ts.map +1 -0
- package/dist/coordinator/fan-out.js +161 -0
- package/dist/coordinator/fan-out.js.map +1 -0
- package/dist/coordinator/index.d.ts +62 -0
- package/dist/coordinator/index.d.ts.map +1 -0
- package/dist/coordinator/index.js +171 -0
- package/dist/coordinator/index.js.map +1 -0
- package/dist/coordinator/response-tiers.d.ts +49 -0
- package/dist/coordinator/response-tiers.d.ts.map +1 -0
- package/dist/coordinator/response-tiers.js +149 -0
- package/dist/coordinator/response-tiers.js.map +1 -0
- package/dist/hooks/index.d.ts +103 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +279 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/index.d.ts +33 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +33 -3
- package/dist/index.js.map +1 -1
- package/dist/marketplace/backend.d.ts +35 -0
- package/dist/marketplace/backend.d.ts.map +1 -0
- package/dist/marketplace/backend.js +99 -0
- package/dist/marketplace/backend.js.map +1 -0
- package/dist/marketplace/browser.d.ts +33 -0
- package/dist/marketplace/browser.d.ts.map +1 -0
- package/dist/marketplace/browser.js +97 -0
- package/dist/marketplace/browser.js.map +1 -0
- package/dist/marketplace/extension-adapter.d.ts +51 -0
- package/dist/marketplace/extension-adapter.d.ts.map +1 -0
- package/dist/marketplace/extension-adapter.js +81 -0
- package/dist/marketplace/extension-adapter.js.map +1 -0
- package/dist/marketplace/index.d.ts +51 -0
- package/dist/marketplace/index.d.ts.map +1 -0
- package/dist/marketplace/index.js +108 -0
- package/dist/marketplace/index.js.map +1 -0
- package/dist/marketplace/packaging.d.ts +25 -0
- package/dist/marketplace/packaging.d.ts.map +1 -0
- package/dist/marketplace/packaging.js +117 -0
- package/dist/marketplace/packaging.js.map +1 -0
- package/dist/marketplace/schema.d.ts +50 -0
- package/dist/marketplace/schema.d.ts.map +1 -0
- package/dist/marketplace/schema.js +120 -0
- package/dist/marketplace/schema.js.map +1 -0
- package/dist/marketplace/security.d.ts +26 -0
- package/dist/marketplace/security.d.ts.map +1 -0
- package/dist/marketplace/security.js +199 -0
- package/dist/marketplace/security.js.map +1 -0
- package/dist/parsers.d.ts +15 -0
- package/dist/parsers.d.ts.map +1 -0
- package/dist/parsers.js +15 -0
- package/dist/parsers.js.map +1 -0
- package/dist/ralph/index.d.ts +58 -0
- package/dist/ralph/index.d.ts.map +1 -0
- package/dist/ralph/index.js +128 -0
- package/dist/ralph/index.js.map +1 -0
- package/dist/resolution.d.ts +47 -0
- package/dist/resolution.d.ts.map +1 -0
- package/dist/resolution.js +106 -0
- package/dist/resolution.js.map +1 -0
- package/dist/runtime/benchmarks.d.ts +121 -0
- package/dist/runtime/benchmarks.d.ts.map +1 -0
- package/dist/runtime/benchmarks.js +251 -0
- package/dist/runtime/benchmarks.js.map +1 -0
- package/dist/runtime/config.d.ts +314 -0
- package/dist/runtime/config.d.ts.map +1 -0
- package/dist/runtime/config.js +467 -0
- package/dist/runtime/config.js.map +1 -0
- package/dist/runtime/constants.d.ts +35 -0
- package/dist/runtime/constants.d.ts.map +1 -0
- package/dist/runtime/constants.js +58 -0
- package/dist/runtime/constants.js.map +1 -0
- package/dist/runtime/cost-tracker.d.ts +73 -0
- package/dist/runtime/cost-tracker.d.ts.map +1 -0
- package/dist/runtime/cost-tracker.js +157 -0
- package/dist/runtime/cost-tracker.js.map +1 -0
- package/dist/runtime/event-bus-otel-bridge.d.ts +19 -0
- package/dist/runtime/event-bus-otel-bridge.d.ts.map +1 -0
- package/dist/runtime/event-bus-otel-bridge.js +61 -0
- package/dist/runtime/event-bus-otel-bridge.js.map +1 -0
- package/dist/runtime/event-bus-ws-bridge.d.ts +35 -0
- package/dist/runtime/event-bus-ws-bridge.d.ts.map +1 -0
- package/dist/runtime/event-bus-ws-bridge.js +55 -0
- package/dist/runtime/event-bus-ws-bridge.js.map +1 -0
- package/dist/runtime/event-bus.d.ts +190 -0
- package/dist/runtime/event-bus.d.ts.map +1 -0
- package/dist/runtime/event-bus.js +218 -0
- package/dist/runtime/event-bus.js.map +1 -0
- package/dist/runtime/event-payloads.d.ts +108 -0
- package/dist/runtime/event-payloads.d.ts.map +1 -0
- package/dist/runtime/event-payloads.js +28 -0
- package/dist/runtime/event-payloads.js.map +1 -0
- package/dist/runtime/health.d.ts +66 -0
- package/dist/runtime/health.d.ts.map +1 -0
- package/dist/runtime/health.js +112 -0
- package/dist/runtime/health.js.map +1 -0
- package/dist/runtime/i18n.d.ts +54 -0
- package/dist/runtime/i18n.d.ts.map +1 -0
- package/dist/runtime/i18n.js +126 -0
- package/dist/runtime/i18n.js.map +1 -0
- package/dist/runtime/offline.d.ts +64 -0
- package/dist/runtime/offline.d.ts.map +1 -0
- package/dist/runtime/offline.js +108 -0
- package/dist/runtime/offline.js.map +1 -0
- package/dist/runtime/otel-bridge.d.ts +52 -0
- package/dist/runtime/otel-bridge.d.ts.map +1 -0
- package/dist/runtime/otel-bridge.js +132 -0
- package/dist/runtime/otel-bridge.js.map +1 -0
- package/dist/runtime/otel-init.d.ts +72 -0
- package/dist/runtime/otel-init.d.ts.map +1 -0
- package/dist/runtime/otel-init.js +68 -0
- package/dist/runtime/otel-init.js.map +1 -0
- package/dist/runtime/otel-metrics.d.ts +42 -0
- package/dist/runtime/otel-metrics.d.ts.map +1 -0
- package/dist/runtime/otel-metrics.js +196 -0
- package/dist/runtime/otel-metrics.js.map +1 -0
- package/dist/runtime/otel.d.ts +53 -0
- package/dist/runtime/otel.d.ts.map +1 -0
- package/dist/runtime/otel.js +127 -0
- package/dist/runtime/otel.js.map +1 -0
- package/dist/runtime/squad-observer.d.ts +75 -0
- package/dist/runtime/squad-observer.d.ts.map +1 -0
- package/dist/runtime/squad-observer.js +190 -0
- package/dist/runtime/squad-observer.js.map +1 -0
- package/dist/runtime/streaming.d.ts +106 -0
- package/dist/runtime/streaming.d.ts.map +1 -0
- package/dist/runtime/streaming.js +192 -0
- package/dist/runtime/streaming.js.map +1 -0
- package/dist/runtime/telemetry.d.ts +82 -0
- package/dist/runtime/telemetry.d.ts.map +1 -0
- package/dist/runtime/telemetry.js +120 -0
- package/dist/runtime/telemetry.js.map +1 -0
- package/dist/sharing/agent-repo.d.ts +33 -0
- package/dist/sharing/agent-repo.d.ts.map +1 -0
- package/dist/sharing/agent-repo.js +79 -0
- package/dist/sharing/agent-repo.js.map +1 -0
- package/dist/sharing/cache.d.ts +36 -0
- package/dist/sharing/cache.d.ts.map +1 -0
- package/dist/sharing/cache.js +85 -0
- package/dist/sharing/cache.js.map +1 -0
- package/dist/sharing/conflicts.d.ts +32 -0
- package/dist/sharing/conflicts.d.ts.map +1 -0
- package/dist/sharing/conflicts.js +121 -0
- package/dist/sharing/conflicts.js.map +1 -0
- package/dist/sharing/export.d.ts +50 -0
- package/dist/sharing/export.d.ts.map +1 -0
- package/dist/sharing/export.js +156 -0
- package/dist/sharing/export.js.map +1 -0
- package/dist/sharing/history-split.d.ts +34 -0
- package/dist/sharing/history-split.d.ts.map +1 -0
- package/dist/sharing/history-split.js +101 -0
- package/dist/sharing/history-split.js.map +1 -0
- package/dist/sharing/import.d.ts +37 -0
- package/dist/sharing/import.d.ts.map +1 -0
- package/dist/sharing/import.js +138 -0
- package/dist/sharing/import.js.map +1 -0
- package/dist/sharing/index.d.ts +11 -0
- package/dist/sharing/index.d.ts.map +1 -0
- package/dist/sharing/index.js +11 -0
- package/dist/sharing/index.js.map +1 -0
- package/dist/sharing/versioning.d.ts +32 -0
- package/dist/sharing/versioning.d.ts.map +1 -0
- package/dist/sharing/versioning.js +64 -0
- package/dist/sharing/versioning.js.map +1 -0
- package/dist/skills/index.d.ts +49 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +85 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/skill-loader.d.ts +56 -0
- package/dist/skills/skill-loader.d.ts.map +1 -0
- package/dist/skills/skill-loader.js +106 -0
- package/dist/skills/skill-loader.js.map +1 -0
- package/dist/skills/skill-source.d.ts +63 -0
- package/dist/skills/skill-source.d.ts.map +1 -0
- package/dist/skills/skill-source.js +199 -0
- package/dist/skills/skill-source.js.map +1 -0
- package/dist/tools/index.d.ts +95 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +475 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/types.d.ts +43 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/dist/upstream/index.d.ts +8 -0
- package/dist/upstream/index.d.ts.map +1 -0
- package/dist/upstream/index.js +7 -0
- package/dist/upstream/index.js.map +1 -0
- package/dist/upstream/resolver.d.ts +37 -0
- package/dist/upstream/resolver.d.ts.map +1 -0
- package/dist/upstream/resolver.js +234 -0
- package/dist/upstream/resolver.js.map +1 -0
- package/dist/upstream/types.d.ts +55 -0
- package/dist/upstream/types.d.ts.map +1 -0
- package/dist/upstream/types.js +11 -0
- package/dist/upstream/types.js.map +1 -0
- package/dist/utils/normalize-eol.d.ts +6 -0
- package/dist/utils/normalize-eol.d.ts.map +1 -0
- package/dist/utils/normalize-eol.js +8 -0
- package/dist/utils/normalize-eol.js.map +1 -0
- package/package.json +197 -63
|
@@ -0,0 +1,376 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Squad Initialization Module (M2-6, PRD #98)
|
|
3
|
+
*
|
|
4
|
+
* Creates new Squad projects with typed configuration.
|
|
5
|
+
* Generates squad.config.ts or squad.config.json with agent definitions.
|
|
6
|
+
*
|
|
7
|
+
* @module config/init
|
|
8
|
+
*/
|
|
9
|
+
import { mkdir, writeFile } from 'fs/promises';
|
|
10
|
+
import { join } from 'path';
|
|
11
|
+
import { existsSync } from 'fs';
|
|
12
|
+
import { MODELS } from '../runtime/constants.js';
|
|
13
|
+
// ============================================================================
|
|
14
|
+
// Default Agent Templates
|
|
15
|
+
// ============================================================================
|
|
16
|
+
/**
|
|
17
|
+
* Default agent templates for common roles.
|
|
18
|
+
*/
|
|
19
|
+
const AGENT_TEMPLATES = {
|
|
20
|
+
'lead': {
|
|
21
|
+
displayName: 'Lead',
|
|
22
|
+
description: 'Technical lead responsible for architecture, delegation, and project coordination.'
|
|
23
|
+
},
|
|
24
|
+
'developer': {
|
|
25
|
+
displayName: 'Developer',
|
|
26
|
+
description: 'Software developer focused on feature implementation and code quality.'
|
|
27
|
+
},
|
|
28
|
+
'tester': {
|
|
29
|
+
displayName: 'Tester',
|
|
30
|
+
description: 'Quality assurance specialist responsible for test coverage and validation.'
|
|
31
|
+
},
|
|
32
|
+
'scribe': {
|
|
33
|
+
displayName: 'Scribe',
|
|
34
|
+
description: 'Documentation specialist maintaining history, decisions, and technical records.'
|
|
35
|
+
},
|
|
36
|
+
'ralph': {
|
|
37
|
+
displayName: 'Ralph',
|
|
38
|
+
description: 'Persistent memory agent that maintains context across sessions.'
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
// ============================================================================
|
|
42
|
+
// Configuration Templates
|
|
43
|
+
// ============================================================================
|
|
44
|
+
/**
|
|
45
|
+
* Format a readonly string array as a single-quoted TypeScript array literal.
|
|
46
|
+
*/
|
|
47
|
+
function formatModelArray(chain) {
|
|
48
|
+
return `[${chain.map(m => `'${m}'`).join(', ')}]`;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Generate TypeScript config file content.
|
|
52
|
+
*/
|
|
53
|
+
function generateTypeScriptConfig(options) {
|
|
54
|
+
const { projectName, projectDescription, agents } = options;
|
|
55
|
+
return `import type { SquadConfig } from '@bradygaster/squad';
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Squad Configuration for ${projectName}
|
|
59
|
+
* ${projectDescription ? `\n * ${projectDescription}` : ''}
|
|
60
|
+
*/
|
|
61
|
+
const config: SquadConfig = {
|
|
62
|
+
version: '1.0.0',
|
|
63
|
+
|
|
64
|
+
models: {
|
|
65
|
+
defaultModel: '${MODELS.DEFAULT}',
|
|
66
|
+
defaultTier: 'standard',
|
|
67
|
+
fallbackChains: {
|
|
68
|
+
premium: ${formatModelArray(MODELS.FALLBACK_CHAINS.premium)},
|
|
69
|
+
standard: ${formatModelArray(MODELS.FALLBACK_CHAINS.standard)},
|
|
70
|
+
fast: ${formatModelArray(MODELS.FALLBACK_CHAINS.fast)}
|
|
71
|
+
},
|
|
72
|
+
preferSameProvider: true,
|
|
73
|
+
respectTierCeiling: true,
|
|
74
|
+
nuclearFallback: {
|
|
75
|
+
enabled: false,
|
|
76
|
+
model: '${MODELS.NUCLEAR_FALLBACK}',
|
|
77
|
+
maxRetriesBeforeNuclear: ${MODELS.NUCLEAR_MAX_RETRIES}
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
|
|
81
|
+
routing: {
|
|
82
|
+
rules: [
|
|
83
|
+
{
|
|
84
|
+
workType: 'feature-dev',
|
|
85
|
+
agents: ['@${agents[0]?.name || 'coordinator'}'],
|
|
86
|
+
confidence: 'high'
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
workType: 'bug-fix',
|
|
90
|
+
agents: ['@${agents.find(a => a.role === 'developer')?.name || agents[0]?.name || 'coordinator'}'],
|
|
91
|
+
confidence: 'high'
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
workType: 'testing',
|
|
95
|
+
agents: ['@${agents.find(a => a.role === 'tester')?.name || agents[0]?.name || 'coordinator'}'],
|
|
96
|
+
confidence: 'high'
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
workType: 'documentation',
|
|
100
|
+
agents: ['@${agents.find(a => a.role === 'scribe')?.name || agents[0]?.name || 'coordinator'}'],
|
|
101
|
+
confidence: 'high'
|
|
102
|
+
}
|
|
103
|
+
],
|
|
104
|
+
governance: {
|
|
105
|
+
eagerByDefault: true,
|
|
106
|
+
scribeAutoRuns: false,
|
|
107
|
+
allowRecursiveSpawn: false
|
|
108
|
+
}
|
|
109
|
+
},
|
|
110
|
+
|
|
111
|
+
casting: {
|
|
112
|
+
allowlistUniverses: [
|
|
113
|
+
'The Usual Suspects',
|
|
114
|
+
'Breaking Bad',
|
|
115
|
+
'The Wire',
|
|
116
|
+
'Firefly'
|
|
117
|
+
],
|
|
118
|
+
overflowStrategy: 'generic',
|
|
119
|
+
universeCapacity: {}
|
|
120
|
+
},
|
|
121
|
+
|
|
122
|
+
platforms: {
|
|
123
|
+
vscode: {
|
|
124
|
+
disableModelSelection: false,
|
|
125
|
+
scribeMode: 'sync'
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
export default config;
|
|
131
|
+
`;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Generate JSON config file content.
|
|
135
|
+
*/
|
|
136
|
+
function generateJsonConfig(options) {
|
|
137
|
+
const { agents } = options;
|
|
138
|
+
const config = {
|
|
139
|
+
version: '1.0.0',
|
|
140
|
+
models: {
|
|
141
|
+
defaultModel: MODELS.DEFAULT,
|
|
142
|
+
defaultTier: 'standard',
|
|
143
|
+
fallbackChains: {
|
|
144
|
+
premium: [...MODELS.FALLBACK_CHAINS.premium],
|
|
145
|
+
standard: [...MODELS.FALLBACK_CHAINS.standard],
|
|
146
|
+
fast: [...MODELS.FALLBACK_CHAINS.fast]
|
|
147
|
+
},
|
|
148
|
+
preferSameProvider: true,
|
|
149
|
+
respectTierCeiling: true,
|
|
150
|
+
nuclearFallback: {
|
|
151
|
+
enabled: false,
|
|
152
|
+
model: MODELS.NUCLEAR_FALLBACK,
|
|
153
|
+
maxRetriesBeforeNuclear: MODELS.NUCLEAR_MAX_RETRIES
|
|
154
|
+
}
|
|
155
|
+
},
|
|
156
|
+
routing: {
|
|
157
|
+
rules: [
|
|
158
|
+
{
|
|
159
|
+
workType: 'feature-dev',
|
|
160
|
+
agents: [`@${agents[0]?.name || 'coordinator'}`],
|
|
161
|
+
confidence: 'high'
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
workType: 'bug-fix',
|
|
165
|
+
agents: [`@${agents.find(a => a.role === 'developer')?.name || agents[0]?.name || 'coordinator'}`],
|
|
166
|
+
confidence: 'high'
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
workType: 'testing',
|
|
170
|
+
agents: [`@${agents.find(a => a.role === 'tester')?.name || agents[0]?.name || 'coordinator'}`],
|
|
171
|
+
confidence: 'high'
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
workType: 'documentation',
|
|
175
|
+
agents: [`@${agents.find(a => a.role === 'scribe')?.name || agents[0]?.name || 'coordinator'}`],
|
|
176
|
+
confidence: 'high'
|
|
177
|
+
}
|
|
178
|
+
],
|
|
179
|
+
governance: {
|
|
180
|
+
eagerByDefault: true,
|
|
181
|
+
scribeAutoRuns: false,
|
|
182
|
+
allowRecursiveSpawn: false
|
|
183
|
+
}
|
|
184
|
+
},
|
|
185
|
+
casting: {
|
|
186
|
+
allowlistUniverses: [
|
|
187
|
+
'The Usual Suspects',
|
|
188
|
+
'Breaking Bad',
|
|
189
|
+
'The Wire',
|
|
190
|
+
'Firefly'
|
|
191
|
+
],
|
|
192
|
+
overflowStrategy: 'generic',
|
|
193
|
+
universeCapacity: {}
|
|
194
|
+
},
|
|
195
|
+
platforms: {
|
|
196
|
+
vscode: {
|
|
197
|
+
disableModelSelection: false,
|
|
198
|
+
scribeMode: 'sync'
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
};
|
|
202
|
+
return JSON.stringify(config, null, 2);
|
|
203
|
+
}
|
|
204
|
+
// ============================================================================
|
|
205
|
+
// Agent Template Generation
|
|
206
|
+
// ============================================================================
|
|
207
|
+
/**
|
|
208
|
+
* Generate charter.md content for an agent.
|
|
209
|
+
*/
|
|
210
|
+
function generateCharter(agent, projectName, projectDescription) {
|
|
211
|
+
const template = AGENT_TEMPLATES[agent.role];
|
|
212
|
+
const displayName = agent.displayName || template?.displayName || titleCase(agent.name);
|
|
213
|
+
const description = template?.description || 'Team member focused on their assigned responsibilities.';
|
|
214
|
+
return `# ${displayName} — ${titleCase(agent.role)}
|
|
215
|
+
|
|
216
|
+
${description}
|
|
217
|
+
|
|
218
|
+
## Project Context
|
|
219
|
+
|
|
220
|
+
**Project:** ${projectName}
|
|
221
|
+
${projectDescription ? `**Description:** ${projectDescription}\n` : ''}
|
|
222
|
+
|
|
223
|
+
## Responsibilities
|
|
224
|
+
|
|
225
|
+
- Collaborate with team members on assigned work
|
|
226
|
+
- Maintain code quality and project standards
|
|
227
|
+
- Document decisions and progress in history
|
|
228
|
+
|
|
229
|
+
## Work Style
|
|
230
|
+
|
|
231
|
+
- Read project context and team decisions before starting work
|
|
232
|
+
- Communicate clearly with team members
|
|
233
|
+
- Follow established patterns and conventions
|
|
234
|
+
`;
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Generate initial history.md content for an agent.
|
|
238
|
+
*/
|
|
239
|
+
function generateInitialHistory(agent, projectName, projectDescription, userName) {
|
|
240
|
+
const displayName = agent.displayName || AGENT_TEMPLATES[agent.role]?.displayName || titleCase(agent.name);
|
|
241
|
+
const now = new Date().toISOString().split('T')[0];
|
|
242
|
+
return `# Project Context
|
|
243
|
+
|
|
244
|
+
${userName ? `- **Owner:** ${userName}\n` : ''}- **Project:** ${projectName}
|
|
245
|
+
${projectDescription ? `- **Description:** ${projectDescription}\n` : ''}- **Created:** ${now}
|
|
246
|
+
|
|
247
|
+
## Core Context
|
|
248
|
+
|
|
249
|
+
Agent ${displayName} initialized and ready for work.
|
|
250
|
+
|
|
251
|
+
## Recent Updates
|
|
252
|
+
|
|
253
|
+
📌 Team initialized on ${now}
|
|
254
|
+
|
|
255
|
+
## Learnings
|
|
256
|
+
|
|
257
|
+
Initial setup complete.
|
|
258
|
+
`;
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Convert kebab-case or snake_case to Title Case.
|
|
262
|
+
*/
|
|
263
|
+
function titleCase(str) {
|
|
264
|
+
return str
|
|
265
|
+
.split(/[-_]/)
|
|
266
|
+
.map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
|
|
267
|
+
.join(' ');
|
|
268
|
+
}
|
|
269
|
+
// ============================================================================
|
|
270
|
+
// Initialization Functions
|
|
271
|
+
// ============================================================================
|
|
272
|
+
/**
|
|
273
|
+
* Initialize a new Squad project.
|
|
274
|
+
*
|
|
275
|
+
* Creates:
|
|
276
|
+
* - .squad/ directory structure
|
|
277
|
+
* - squad.config.ts or squad.config.json
|
|
278
|
+
* - Agent directories with charter.md and history.md
|
|
279
|
+
* - .gitattributes for merge drivers
|
|
280
|
+
*
|
|
281
|
+
* @param options - Initialization options
|
|
282
|
+
* @returns Result with created file paths
|
|
283
|
+
*/
|
|
284
|
+
export async function initSquad(options) {
|
|
285
|
+
const { teamRoot, projectName, projectDescription, agents, configFormat = 'typescript', userName } = options;
|
|
286
|
+
const createdFiles = [];
|
|
287
|
+
const agentDirs = [];
|
|
288
|
+
// Validate inputs
|
|
289
|
+
if (!teamRoot) {
|
|
290
|
+
throw new Error('teamRoot is required');
|
|
291
|
+
}
|
|
292
|
+
if (!projectName) {
|
|
293
|
+
throw new Error('projectName is required');
|
|
294
|
+
}
|
|
295
|
+
if (!agents || agents.length === 0) {
|
|
296
|
+
throw new Error('At least one agent is required');
|
|
297
|
+
}
|
|
298
|
+
// Create .squad directory
|
|
299
|
+
const squadDir = join(teamRoot, '.squad');
|
|
300
|
+
if (!existsSync(squadDir)) {
|
|
301
|
+
await mkdir(squadDir, { recursive: true });
|
|
302
|
+
}
|
|
303
|
+
// Create agents directory
|
|
304
|
+
const agentsDir = join(squadDir, 'agents');
|
|
305
|
+
if (!existsSync(agentsDir)) {
|
|
306
|
+
await mkdir(agentsDir, { recursive: true });
|
|
307
|
+
}
|
|
308
|
+
// Create casting directory (for future casting system)
|
|
309
|
+
const castingDir = join(squadDir, 'casting');
|
|
310
|
+
if (!existsSync(castingDir)) {
|
|
311
|
+
await mkdir(castingDir, { recursive: true });
|
|
312
|
+
}
|
|
313
|
+
// Create decisions directory
|
|
314
|
+
const decisionsDir = join(squadDir, 'decisions');
|
|
315
|
+
if (!existsSync(decisionsDir)) {
|
|
316
|
+
await mkdir(decisionsDir, { recursive: true });
|
|
317
|
+
}
|
|
318
|
+
// Create skills directory
|
|
319
|
+
const skillsDir = join(squadDir, 'skills');
|
|
320
|
+
if (!existsSync(skillsDir)) {
|
|
321
|
+
await mkdir(skillsDir, { recursive: true });
|
|
322
|
+
}
|
|
323
|
+
// Generate configuration file
|
|
324
|
+
const configFileName = configFormat === 'typescript' ? 'squad.config.ts' : 'squad.config.json';
|
|
325
|
+
const configPath = join(teamRoot, configFileName);
|
|
326
|
+
const configContent = configFormat === 'typescript'
|
|
327
|
+
? generateTypeScriptConfig(options)
|
|
328
|
+
: generateJsonConfig(options);
|
|
329
|
+
await writeFile(configPath, configContent, 'utf-8');
|
|
330
|
+
createdFiles.push(configPath);
|
|
331
|
+
// Create agent directories and files
|
|
332
|
+
for (const agent of agents) {
|
|
333
|
+
const agentDir = join(agentsDir, agent.name);
|
|
334
|
+
await mkdir(agentDir, { recursive: true });
|
|
335
|
+
agentDirs.push(agentDir);
|
|
336
|
+
// Create charter.md
|
|
337
|
+
const charterPath = join(agentDir, 'charter.md');
|
|
338
|
+
const charterContent = generateCharter(agent, projectName, projectDescription);
|
|
339
|
+
await writeFile(charterPath, charterContent, 'utf-8');
|
|
340
|
+
createdFiles.push(charterPath);
|
|
341
|
+
// Create history.md
|
|
342
|
+
const historyPath = join(agentDir, 'history.md');
|
|
343
|
+
const historyContent = generateInitialHistory(agent, projectName, projectDescription, userName);
|
|
344
|
+
await writeFile(historyPath, historyContent, 'utf-8');
|
|
345
|
+
createdFiles.push(historyPath);
|
|
346
|
+
}
|
|
347
|
+
// Create .gitattributes for merge drivers
|
|
348
|
+
const gitattributesPath = join(teamRoot, '.gitattributes');
|
|
349
|
+
const gitattributesContent = `.squad/agents/*/history.md merge=union
|
|
350
|
+
.squad/decisions/*.md merge=union
|
|
351
|
+
`;
|
|
352
|
+
await writeFile(gitattributesPath, gitattributesContent, 'utf-8');
|
|
353
|
+
createdFiles.push(gitattributesPath);
|
|
354
|
+
// Create initial decisions.md
|
|
355
|
+
const decisionsPath = join(decisionsDir, 'decisions.md');
|
|
356
|
+
const decisionsContent = `# Squad Decisions
|
|
357
|
+
|
|
358
|
+
## Active Decisions
|
|
359
|
+
|
|
360
|
+
No decisions recorded yet.
|
|
361
|
+
|
|
362
|
+
## Governance
|
|
363
|
+
|
|
364
|
+
- All meaningful changes require team consensus
|
|
365
|
+
- Document architectural decisions here
|
|
366
|
+
- Keep history focused on work, decisions focused on direction
|
|
367
|
+
`;
|
|
368
|
+
await writeFile(decisionsPath, decisionsContent, 'utf-8');
|
|
369
|
+
createdFiles.push(decisionsPath);
|
|
370
|
+
return {
|
|
371
|
+
createdFiles,
|
|
372
|
+
configPath,
|
|
373
|
+
agentDirs
|
|
374
|
+
};
|
|
375
|
+
}
|
|
376
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/config/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Legacy Fallback — Backwards Compatibility (M3-9, Issue #150)
|
|
3
|
+
*
|
|
4
|
+
* Reads legacy squad.agent.md files and .ai-team/ directory structures,
|
|
5
|
+
* maps them to typed SquadConfig, and merges with any existing config
|
|
6
|
+
* (typed config always wins, legacy fills gaps).
|
|
7
|
+
*
|
|
8
|
+
* @module config/legacy-fallback
|
|
9
|
+
*/
|
|
10
|
+
import type { SquadConfig, RoutingRule } from '../runtime/config.js';
|
|
11
|
+
/**
|
|
12
|
+
* Legacy configuration extracted from squad.agent.md and .ai-team/ files.
|
|
13
|
+
*/
|
|
14
|
+
export interface LegacyConfig {
|
|
15
|
+
/** System prompt extracted from the agent doc */
|
|
16
|
+
systemPrompt?: string;
|
|
17
|
+
/** Tool names referenced in the agent doc */
|
|
18
|
+
tools: string[];
|
|
19
|
+
/** Agent definitions extracted from agent sections */
|
|
20
|
+
agents: LegacyAgentDef[];
|
|
21
|
+
/** Routing hints extracted from routing sections */
|
|
22
|
+
routingHints: string[];
|
|
23
|
+
/** Routing rules parsed from routing.md */
|
|
24
|
+
routingRules: RoutingRule[];
|
|
25
|
+
/** Model preferences found in the document */
|
|
26
|
+
modelPreferences: string[];
|
|
27
|
+
/** Source path that was loaded */
|
|
28
|
+
sourcePath: string;
|
|
29
|
+
/** Whether .ai-team/ directory was found */
|
|
30
|
+
hasAiTeamDir: boolean;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Agent definition extracted from a legacy squad.agent.md.
|
|
34
|
+
*/
|
|
35
|
+
export interface LegacyAgentDef {
|
|
36
|
+
name: string;
|
|
37
|
+
role?: string;
|
|
38
|
+
description?: string;
|
|
39
|
+
tools?: string[];
|
|
40
|
+
model?: string;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Detect whether a project uses the legacy squad.agent.md format.
|
|
44
|
+
*
|
|
45
|
+
* Checks for:
|
|
46
|
+
* - .github/agents/squad.agent.md
|
|
47
|
+
* - .ai-team/squad.agent.md
|
|
48
|
+
* - .ai-team/ directory with team.md or routing.md
|
|
49
|
+
*
|
|
50
|
+
* @param dir - Project root directory
|
|
51
|
+
* @returns true if legacy format is detected
|
|
52
|
+
*/
|
|
53
|
+
export declare function detectLegacySetup(dir: string): boolean;
|
|
54
|
+
/**
|
|
55
|
+
* Load and parse a legacy squad.agent.md file from the given directory.
|
|
56
|
+
*
|
|
57
|
+
* Search order:
|
|
58
|
+
* 1. .github/agents/squad.agent.md
|
|
59
|
+
* 2. .ai-team/squad.agent.md
|
|
60
|
+
*
|
|
61
|
+
* Also loads routing.md and team.md if present in .ai-team/ or .github/agents/.
|
|
62
|
+
*
|
|
63
|
+
* @param dir - Project root directory
|
|
64
|
+
* @returns Parsed LegacyConfig, or undefined if no legacy file found
|
|
65
|
+
*/
|
|
66
|
+
export declare function loadLegacyAgentMd(dir: string): LegacyConfig | undefined;
|
|
67
|
+
/**
|
|
68
|
+
* Merge a legacy configuration with a typed SquadConfig.
|
|
69
|
+
*
|
|
70
|
+
* The typed config **always wins** on conflict. Legacy values fill gaps
|
|
71
|
+
* where the typed config has no data.
|
|
72
|
+
*
|
|
73
|
+
* @param legacy - Legacy configuration from squad.agent.md
|
|
74
|
+
* @param config - Typed Squad configuration (takes precedence)
|
|
75
|
+
* @returns Merged configuration
|
|
76
|
+
*/
|
|
77
|
+
export declare function mergeLegacyWithConfig(legacy: LegacyConfig, config: SquadConfig): SquadConfig;
|
|
78
|
+
/**
|
|
79
|
+
* Emit a deprecation warning when legacy format is detected.
|
|
80
|
+
* Uses console.warn so it's visible but non-blocking.
|
|
81
|
+
*/
|
|
82
|
+
export declare function emitDeprecationWarning(sourcePath: string): void;
|
|
83
|
+
//# sourceMappingURL=legacy-fallback.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legacy-fallback.d.ts","sourceRoot":"","sources":["../../src/config/legacy-fallback.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EACV,WAAW,EAEX,WAAW,EAEZ,MAAM,sBAAsB,CAAC;AAS9B;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,iDAAiD;IACjD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6CAA6C;IAC7C,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,sDAAsD;IACtD,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,oDAAoD;IACpD,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,2CAA2C;IAC3C,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,8CAA8C;IAC9C,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,kCAAkC;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,YAAY,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAwBD;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAStD;AAMD;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAoDvE;AAMD;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,WAAW,GAClB,WAAW,CAuCb;AAMD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAM/D"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Legacy Fallback — Backwards Compatibility (M3-9, Issue #150)
|
|
3
|
+
*
|
|
4
|
+
* Reads legacy squad.agent.md files and .ai-team/ directory structures,
|
|
5
|
+
* maps them to typed SquadConfig, and merges with any existing config
|
|
6
|
+
* (typed config always wins, legacy fills gaps).
|
|
7
|
+
*
|
|
8
|
+
* @module config/legacy-fallback
|
|
9
|
+
*/
|
|
10
|
+
import { existsSync, readFileSync } from 'fs';
|
|
11
|
+
import { join } from 'path';
|
|
12
|
+
import { DEFAULT_CONFIG } from '../runtime/config.js';
|
|
13
|
+
import { parseAgentDoc } from './agent-doc.js';
|
|
14
|
+
import { parseRoutingMarkdown } from './routing.js';
|
|
15
|
+
// ============================================================================
|
|
16
|
+
// Detection
|
|
17
|
+
// ============================================================================
|
|
18
|
+
/** Paths to search for legacy agent files, in priority order. */
|
|
19
|
+
const LEGACY_AGENT_PATHS = [
|
|
20
|
+
join('.github', 'agents', 'squad.agent.md'),
|
|
21
|
+
join('.ai-team', 'squad.agent.md'),
|
|
22
|
+
];
|
|
23
|
+
/** Paths to search for legacy routing files. */
|
|
24
|
+
const LEGACY_ROUTING_PATHS = [
|
|
25
|
+
join('.ai-team', 'routing.md'),
|
|
26
|
+
join('.github', 'agents', 'routing.md'),
|
|
27
|
+
];
|
|
28
|
+
/** Paths to search for legacy team files. */
|
|
29
|
+
const LEGACY_TEAM_PATHS = [
|
|
30
|
+
join('.ai-team', 'team.md'),
|
|
31
|
+
join('.github', 'agents', 'team.md'),
|
|
32
|
+
];
|
|
33
|
+
/**
|
|
34
|
+
* Detect whether a project uses the legacy squad.agent.md format.
|
|
35
|
+
*
|
|
36
|
+
* Checks for:
|
|
37
|
+
* - .github/agents/squad.agent.md
|
|
38
|
+
* - .ai-team/squad.agent.md
|
|
39
|
+
* - .ai-team/ directory with team.md or routing.md
|
|
40
|
+
*
|
|
41
|
+
* @param dir - Project root directory
|
|
42
|
+
* @returns true if legacy format is detected
|
|
43
|
+
*/
|
|
44
|
+
export function detectLegacySetup(dir) {
|
|
45
|
+
for (const relPath of LEGACY_AGENT_PATHS) {
|
|
46
|
+
if (existsSync(join(dir, relPath)))
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
// Also detect bare .ai-team/ directories with team or routing files
|
|
50
|
+
for (const relPath of [...LEGACY_ROUTING_PATHS, ...LEGACY_TEAM_PATHS]) {
|
|
51
|
+
if (existsSync(join(dir, relPath)))
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
// ============================================================================
|
|
57
|
+
// Loading
|
|
58
|
+
// ============================================================================
|
|
59
|
+
/**
|
|
60
|
+
* Load and parse a legacy squad.agent.md file from the given directory.
|
|
61
|
+
*
|
|
62
|
+
* Search order:
|
|
63
|
+
* 1. .github/agents/squad.agent.md
|
|
64
|
+
* 2. .ai-team/squad.agent.md
|
|
65
|
+
*
|
|
66
|
+
* Also loads routing.md and team.md if present in .ai-team/ or .github/agents/.
|
|
67
|
+
*
|
|
68
|
+
* @param dir - Project root directory
|
|
69
|
+
* @returns Parsed LegacyConfig, or undefined if no legacy file found
|
|
70
|
+
*/
|
|
71
|
+
export function loadLegacyAgentMd(dir) {
|
|
72
|
+
// Find the agent doc
|
|
73
|
+
let agentMdPath;
|
|
74
|
+
let agentMdContent;
|
|
75
|
+
for (const relPath of LEGACY_AGENT_PATHS) {
|
|
76
|
+
const fullPath = join(dir, relPath);
|
|
77
|
+
if (existsSync(fullPath)) {
|
|
78
|
+
agentMdPath = fullPath;
|
|
79
|
+
agentMdContent = readFileSync(fullPath, 'utf-8');
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (!agentMdPath || !agentMdContent) {
|
|
84
|
+
return undefined;
|
|
85
|
+
}
|
|
86
|
+
// Parse the agent doc
|
|
87
|
+
const parsed = parseAgentDoc(agentMdContent);
|
|
88
|
+
// Extract agent definitions from the document
|
|
89
|
+
const agents = extractAgentDefs(agentMdContent, parsed);
|
|
90
|
+
// Try to load routing.md
|
|
91
|
+
let routingRules = [];
|
|
92
|
+
for (const relPath of LEGACY_ROUTING_PATHS) {
|
|
93
|
+
const fullPath = join(dir, relPath);
|
|
94
|
+
if (existsSync(fullPath)) {
|
|
95
|
+
const routingContent = readFileSync(fullPath, 'utf-8');
|
|
96
|
+
const routingConfig = parseRoutingMarkdown(routingContent);
|
|
97
|
+
routingRules = routingConfig.rules;
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// Check for .ai-team directory
|
|
102
|
+
const hasAiTeamDir = existsSync(join(dir, '.ai-team')) &&
|
|
103
|
+
(existsSync(join(dir, '.ai-team', 'team.md')) ||
|
|
104
|
+
existsSync(join(dir, '.ai-team', 'routing.md')));
|
|
105
|
+
return {
|
|
106
|
+
systemPrompt: agentMdContent,
|
|
107
|
+
tools: parsed.tools,
|
|
108
|
+
agents,
|
|
109
|
+
routingHints: parsed.routingHints,
|
|
110
|
+
routingRules,
|
|
111
|
+
modelPreferences: parsed.modelPreferences,
|
|
112
|
+
sourcePath: agentMdPath,
|
|
113
|
+
hasAiTeamDir,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
// ============================================================================
|
|
117
|
+
// Merging
|
|
118
|
+
// ============================================================================
|
|
119
|
+
/**
|
|
120
|
+
* Merge a legacy configuration with a typed SquadConfig.
|
|
121
|
+
*
|
|
122
|
+
* The typed config **always wins** on conflict. Legacy values fill gaps
|
|
123
|
+
* where the typed config has no data.
|
|
124
|
+
*
|
|
125
|
+
* @param legacy - Legacy configuration from squad.agent.md
|
|
126
|
+
* @param config - Typed Squad configuration (takes precedence)
|
|
127
|
+
* @returns Merged configuration
|
|
128
|
+
*/
|
|
129
|
+
export function mergeLegacyWithConfig(legacy, config) {
|
|
130
|
+
// Emit deprecation warning
|
|
131
|
+
emitDeprecationWarning(legacy.sourcePath);
|
|
132
|
+
// Merge routing rules: config wins, legacy fills gaps
|
|
133
|
+
const configWorkTypes = new Set((config.routing?.rules ?? []).map((r) => r.workType));
|
|
134
|
+
const legacyRulesFiltered = legacy.routingRules.filter((r) => !configWorkTypes.has(r.workType));
|
|
135
|
+
const mergedRoutingRules = [
|
|
136
|
+
...(config.routing?.rules ?? []),
|
|
137
|
+
...legacyRulesFiltered,
|
|
138
|
+
];
|
|
139
|
+
// Merge model preferences: config wins
|
|
140
|
+
const mergedModels = {
|
|
141
|
+
...config.models,
|
|
142
|
+
};
|
|
143
|
+
if (legacy.modelPreferences.length > 0 &&
|
|
144
|
+
config.models.defaultModel === DEFAULT_CONFIG.models.defaultModel) {
|
|
145
|
+
// Only use legacy model if config still has the default
|
|
146
|
+
mergedModels.defaultModel = legacy.modelPreferences[0];
|
|
147
|
+
}
|
|
148
|
+
// Build merged routing
|
|
149
|
+
const mergedRouting = {
|
|
150
|
+
...config.routing,
|
|
151
|
+
rules: mergedRoutingRules,
|
|
152
|
+
};
|
|
153
|
+
return {
|
|
154
|
+
...config,
|
|
155
|
+
models: mergedModels,
|
|
156
|
+
routing: mergedRouting,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
// ============================================================================
|
|
160
|
+
// Deprecation Warning
|
|
161
|
+
// ============================================================================
|
|
162
|
+
/**
|
|
163
|
+
* Emit a deprecation warning when legacy format is detected.
|
|
164
|
+
* Uses console.warn so it's visible but non-blocking.
|
|
165
|
+
*/
|
|
166
|
+
export function emitDeprecationWarning(sourcePath) {
|
|
167
|
+
console.warn(`[squad] DEPRECATION: Legacy squad.agent.md detected at "${sourcePath}". ` +
|
|
168
|
+
'Migrate to squad.config.ts for typed configuration. ' +
|
|
169
|
+
'Run `squad init --migrate` to auto-convert.');
|
|
170
|
+
}
|
|
171
|
+
// ============================================================================
|
|
172
|
+
// Internal Helpers
|
|
173
|
+
// ============================================================================
|
|
174
|
+
/**
|
|
175
|
+
* Extract agent definitions from squad.agent.md content.
|
|
176
|
+
* Looks for patterns like "**AgentName** — Role" or "### AgentName" sections.
|
|
177
|
+
*/
|
|
178
|
+
function extractAgentDefs(content, parsed) {
|
|
179
|
+
const agents = [];
|
|
180
|
+
const seen = new Set();
|
|
181
|
+
// Pattern 1: ### Agent sections (common in squad.agent.md)
|
|
182
|
+
const sectionPattern = /^###\s+(\w+)\s*(?:[-—]\s*(.+))?$/gm;
|
|
183
|
+
let match;
|
|
184
|
+
while ((match = sectionPattern.exec(content)) !== null) {
|
|
185
|
+
const name = match[1].toLowerCase();
|
|
186
|
+
const role = match[2]?.trim();
|
|
187
|
+
if (!seen.has(name) && name.length > 1) {
|
|
188
|
+
seen.add(name);
|
|
189
|
+
agents.push({ name, role });
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
// Pattern 2: **Name** — Role (bold name with dash)
|
|
193
|
+
const boldPattern = /\*\*(\w+)\*\*\s*[-—]\s*(.+)/g;
|
|
194
|
+
while ((match = boldPattern.exec(content)) !== null) {
|
|
195
|
+
const name = match[1].toLowerCase();
|
|
196
|
+
const role = match[2].trim();
|
|
197
|
+
if (!seen.has(name) && name.length > 1) {
|
|
198
|
+
seen.add(name);
|
|
199
|
+
agents.push({ name, role });
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// If the parsed doc itself has a name, add it as the coordinator
|
|
203
|
+
if (parsed.name && !seen.has(parsed.name.toLowerCase())) {
|
|
204
|
+
agents.unshift({
|
|
205
|
+
name: parsed.name.toLowerCase(),
|
|
206
|
+
role: parsed.description ?? 'coordinator',
|
|
207
|
+
tools: parsed.tools,
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
return agents;
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=legacy-fallback.js.map
|