@bradygaster/squad-sdk 0.6.2 → 0.8.0
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 +225 -0
- package/dist/adapter/client.d.ts.map +1 -0
- package/dist/adapter/client.js +397 -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 +68 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +74 -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 +258 -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 +198 -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 +37 -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 +53 -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 +369 -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 +174 -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 +47 -0
- package/dist/coordinator/index.d.ts.map +1 -0
- package/dist/coordinator/index.js +54 -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 +24 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +23 -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 +56 -0
- package/dist/ralph/index.d.ts.map +1 -0
- package/dist/ralph/index.js +61 -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 +313 -0
- package/dist/runtime/config.d.ts.map +1 -0
- package/dist/runtime/config.js +466 -0
- package/dist/runtime/config.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.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/health.d.ts +66 -0
- package/dist/runtime/health.d.ts.map +1 -0
- package/dist/runtime/health.js +111 -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/streaming.d.ts +97 -0
- package/dist/runtime/streaming.d.ts.map +1 -0
- package/dist/runtime/streaming.js +156 -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 +87 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +419 -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/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 +115 -39
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Conflict Resolution on Import (M5-9, Issue #133)
|
|
3
|
+
*/
|
|
4
|
+
import type { SquadConfig } from '../config/schema.js';
|
|
5
|
+
/** Incoming config bundle for conflict detection. */
|
|
6
|
+
export interface IncomingBundle {
|
|
7
|
+
version: string;
|
|
8
|
+
config: Partial<SquadConfig>;
|
|
9
|
+
agents?: Array<{
|
|
10
|
+
name: string;
|
|
11
|
+
charter: string;
|
|
12
|
+
}>;
|
|
13
|
+
skills?: Array<{
|
|
14
|
+
id: string;
|
|
15
|
+
content: string;
|
|
16
|
+
}>;
|
|
17
|
+
}
|
|
18
|
+
export type ConflictType = 'added' | 'modified' | 'removed';
|
|
19
|
+
export interface Conflict {
|
|
20
|
+
path: string;
|
|
21
|
+
existingValue: unknown;
|
|
22
|
+
incomingValue: unknown;
|
|
23
|
+
type: ConflictType;
|
|
24
|
+
}
|
|
25
|
+
export type ConflictStrategy = 'keep-existing' | 'use-incoming' | 'merge' | 'manual';
|
|
26
|
+
/** Detect conflicts between an existing config and an incoming bundle. */
|
|
27
|
+
export declare function detectConflicts(existing: SquadConfig, incoming: IncomingBundle): Conflict[];
|
|
28
|
+
/** Resolve conflicts using the given strategy. Returns a merged SquadConfig. */
|
|
29
|
+
export declare function resolveConflicts(existing: SquadConfig, conflicts: Conflict[], strategy: ConflictStrategy): SquadConfig;
|
|
30
|
+
/** Generate a human-readable markdown conflict report. */
|
|
31
|
+
export declare function generateConflictReport(conflicts: Conflict[]): string;
|
|
32
|
+
//# sourceMappingURL=conflicts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conflicts.d.ts","sourceRoot":"","sources":["../../src/sharing/conflicts.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAIvD,qDAAqD;AACrD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAC7B,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClD,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjD;AAED,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,CAAC;AAE5D,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;IACvB,IAAI,EAAE,YAAY,CAAC;CACpB;AAED,MAAM,MAAM,gBAAgB,GAAG,eAAe,GAAG,cAAc,GAAG,OAAO,GAAG,QAAQ,CAAC;AA2BrF,0EAA0E;AAC1E,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,WAAW,EACrB,QAAQ,EAAE,cAAc,GACvB,QAAQ,EAAE,CAuBZ;AAID,gFAAgF;AAChF,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,WAAW,EACrB,SAAS,EAAE,QAAQ,EAAE,EACrB,QAAQ,EAAE,gBAAgB,GACzB,WAAW,CA4Bb;AAID,0DAA0D;AAC1D,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,MAAM,CAqBpE"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Conflict Resolution on Import (M5-9, Issue #133)
|
|
3
|
+
*/
|
|
4
|
+
// --- Detection ---
|
|
5
|
+
/** Flatten an object into dotted key paths. */
|
|
6
|
+
function flattenObject(obj, prefix = '') {
|
|
7
|
+
const result = new Map();
|
|
8
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
9
|
+
const fullKey = prefix ? `${prefix}.${key}` : key;
|
|
10
|
+
if (value !== null && typeof value === 'object' && !Array.isArray(value)) {
|
|
11
|
+
for (const [k, v] of flattenObject(value, fullKey)) {
|
|
12
|
+
result.set(k, v);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
result.set(fullKey, value);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return result;
|
|
20
|
+
}
|
|
21
|
+
function valuesEqual(a, b) {
|
|
22
|
+
return JSON.stringify(a) === JSON.stringify(b);
|
|
23
|
+
}
|
|
24
|
+
/** Detect conflicts between an existing config and an incoming bundle. */
|
|
25
|
+
export function detectConflicts(existing, incoming) {
|
|
26
|
+
const conflicts = [];
|
|
27
|
+
const existingFlat = flattenObject(existing);
|
|
28
|
+
const incomingFlat = flattenObject(incoming.config);
|
|
29
|
+
// Check incoming keys against existing
|
|
30
|
+
for (const [path, incomingValue] of incomingFlat) {
|
|
31
|
+
const existingValue = existingFlat.get(path);
|
|
32
|
+
if (existingValue === undefined) {
|
|
33
|
+
conflicts.push({ path, existingValue: undefined, incomingValue, type: 'added' });
|
|
34
|
+
}
|
|
35
|
+
else if (!valuesEqual(existingValue, incomingValue)) {
|
|
36
|
+
conflicts.push({ path, existingValue, incomingValue, type: 'modified' });
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// Check for keys in existing that are missing from incoming (removed)
|
|
40
|
+
for (const [path, existingValue] of existingFlat) {
|
|
41
|
+
if (!incomingFlat.has(path)) {
|
|
42
|
+
conflicts.push({ path, existingValue, incomingValue: undefined, type: 'removed' });
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return conflicts;
|
|
46
|
+
}
|
|
47
|
+
// --- Resolution ---
|
|
48
|
+
/** Resolve conflicts using the given strategy. Returns a merged SquadConfig. */
|
|
49
|
+
export function resolveConflicts(existing, conflicts, strategy) {
|
|
50
|
+
if (strategy === 'keep-existing') {
|
|
51
|
+
return { ...existing };
|
|
52
|
+
}
|
|
53
|
+
if (strategy === 'manual') {
|
|
54
|
+
return { ...existing };
|
|
55
|
+
}
|
|
56
|
+
// Clone via JSON round-trip
|
|
57
|
+
const result = JSON.parse(JSON.stringify(existing));
|
|
58
|
+
for (const conflict of conflicts) {
|
|
59
|
+
if (strategy === 'use-incoming') {
|
|
60
|
+
if (conflict.type === 'removed') {
|
|
61
|
+
deletePath(result, conflict.path);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
setPath(result, conflict.path, conflict.incomingValue);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
else if (strategy === 'merge') {
|
|
68
|
+
if (conflict.type === 'added') {
|
|
69
|
+
setPath(result, conflict.path, conflict.incomingValue);
|
|
70
|
+
}
|
|
71
|
+
// 'modified' keeps existing, 'removed' keeps existing
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return result;
|
|
75
|
+
}
|
|
76
|
+
// --- Report ---
|
|
77
|
+
/** Generate a human-readable markdown conflict report. */
|
|
78
|
+
export function generateConflictReport(conflicts) {
|
|
79
|
+
if (conflicts.length === 0)
|
|
80
|
+
return '# Conflict Report\n\nNo conflicts detected.\n';
|
|
81
|
+
const lines = [
|
|
82
|
+
'# Conflict Report',
|
|
83
|
+
'',
|
|
84
|
+
`**${conflicts.length}** conflict(s) detected.`,
|
|
85
|
+
'',
|
|
86
|
+
'| # | Path | Type | Existing | Incoming |',
|
|
87
|
+
'|---|------|------|----------|----------|',
|
|
88
|
+
];
|
|
89
|
+
let i = 1;
|
|
90
|
+
for (const c of conflicts) {
|
|
91
|
+
const existing = c.existingValue === undefined ? '_(none)_' : `\`${JSON.stringify(c.existingValue)}\``;
|
|
92
|
+
const incoming = c.incomingValue === undefined ? '_(none)_' : `\`${JSON.stringify(c.incomingValue)}\``;
|
|
93
|
+
lines.push(`| ${i++} | \`${c.path}\` | ${c.type} | ${existing} | ${incoming} |`);
|
|
94
|
+
}
|
|
95
|
+
lines.push('');
|
|
96
|
+
return lines.join('\n');
|
|
97
|
+
}
|
|
98
|
+
// --- Helpers ---
|
|
99
|
+
function setPath(obj, dotPath, value) {
|
|
100
|
+
const parts = dotPath.split('.');
|
|
101
|
+
let current = obj;
|
|
102
|
+
for (let i = 0; i < parts.length - 1; i++) {
|
|
103
|
+
if (!(parts[i] in current) || typeof current[parts[i]] !== 'object') {
|
|
104
|
+
current[parts[i]] = {};
|
|
105
|
+
}
|
|
106
|
+
current = current[parts[i]];
|
|
107
|
+
}
|
|
108
|
+
current[parts[parts.length - 1]] = value;
|
|
109
|
+
}
|
|
110
|
+
function deletePath(obj, dotPath) {
|
|
111
|
+
const parts = dotPath.split('.');
|
|
112
|
+
let current = obj;
|
|
113
|
+
for (let i = 0; i < parts.length - 1; i++) {
|
|
114
|
+
if (!(parts[i] in current) || typeof current[parts[i]] !== 'object') {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
current = current[parts[i]];
|
|
118
|
+
}
|
|
119
|
+
delete current[parts[parts.length - 1]];
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=conflicts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conflicts.js","sourceRoot":"","sources":["../../src/sharing/conflicts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* M5-1: Export command (squad export)
|
|
3
|
+
* Exports Squad configuration as a portable bundle.
|
|
4
|
+
*/
|
|
5
|
+
export interface ExportOptions {
|
|
6
|
+
includeHistory?: boolean;
|
|
7
|
+
includeSkills?: boolean;
|
|
8
|
+
format?: 'json' | 'yaml';
|
|
9
|
+
anonymize?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export interface AgentCharter {
|
|
12
|
+
name: string;
|
|
13
|
+
role: string;
|
|
14
|
+
content: string;
|
|
15
|
+
}
|
|
16
|
+
export interface ExportRoutingRule {
|
|
17
|
+
pattern: string;
|
|
18
|
+
agent: string;
|
|
19
|
+
priority?: number;
|
|
20
|
+
}
|
|
21
|
+
export interface ExportMetadata {
|
|
22
|
+
version: string;
|
|
23
|
+
timestamp: string;
|
|
24
|
+
source: string;
|
|
25
|
+
}
|
|
26
|
+
export interface ExportBundle {
|
|
27
|
+
config: Record<string, unknown>;
|
|
28
|
+
agents: AgentCharter[];
|
|
29
|
+
skills: string[];
|
|
30
|
+
routingRules: ExportRoutingRule[];
|
|
31
|
+
metadata: ExportMetadata;
|
|
32
|
+
history?: Record<string, unknown>[];
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Strip secrets and sensitive patterns from text content.
|
|
36
|
+
*/
|
|
37
|
+
export declare function sanitizeContent(content: string): string;
|
|
38
|
+
/**
|
|
39
|
+
* Anonymize PII and local paths from content.
|
|
40
|
+
*/
|
|
41
|
+
export declare function anonymizeContent(content: string): string;
|
|
42
|
+
/**
|
|
43
|
+
* Export a Squad project configuration as a bundle.
|
|
44
|
+
*/
|
|
45
|
+
export declare function exportSquadConfig(projectDir: string, options?: ExportOptions): ExportBundle;
|
|
46
|
+
/**
|
|
47
|
+
* Serialize an export bundle to a string.
|
|
48
|
+
*/
|
|
49
|
+
export declare function serializeBundle(bundle: ExportBundle, format?: 'json' | 'yaml'): string;
|
|
50
|
+
//# sourceMappingURL=export.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../src/sharing/export.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,WAAW,aAAa;IAC5B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,YAAY,EAAE,iBAAiB,EAAE,CAAC;IAClC,QAAQ,EAAE,cAAc,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;CACrC;AAWD;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMvD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAQxD;AAuCD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,YAAY,CA6C3F;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAKtF"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* M5-1: Export command (squad export)
|
|
3
|
+
* Exports Squad configuration as a portable bundle.
|
|
4
|
+
*/
|
|
5
|
+
import { existsSync, readFileSync, readdirSync } from 'node:fs';
|
|
6
|
+
import { join, basename } from 'node:path';
|
|
7
|
+
const SECRET_PATTERNS = [
|
|
8
|
+
/token[=:]\s*['"]?[A-Za-z0-9_\-]{20,}/gi,
|
|
9
|
+
/secret[=:]\s*['"]?[A-Za-z0-9_\-]{20,}/gi,
|
|
10
|
+
/password[=:]\s*['"]?[^\s'"]{8,}/gi,
|
|
11
|
+
/ghp_[A-Za-z0-9]{36}/g,
|
|
12
|
+
/gho_[A-Za-z0-9]{36}/g,
|
|
13
|
+
/github_pat_[A-Za-z0-9_]{82}/g,
|
|
14
|
+
];
|
|
15
|
+
/**
|
|
16
|
+
* Strip secrets and sensitive patterns from text content.
|
|
17
|
+
*/
|
|
18
|
+
export function sanitizeContent(content) {
|
|
19
|
+
let sanitized = content;
|
|
20
|
+
for (const pattern of SECRET_PATTERNS) {
|
|
21
|
+
sanitized = sanitized.replace(pattern, '[REDACTED]');
|
|
22
|
+
}
|
|
23
|
+
return sanitized;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Anonymize PII and local paths from content.
|
|
27
|
+
*/
|
|
28
|
+
export function anonymizeContent(content) {
|
|
29
|
+
let result = sanitizeContent(content);
|
|
30
|
+
// Strip absolute paths (Unix and Windows)
|
|
31
|
+
result = result.replace(/(?:\/[\w.-]+){3,}/g, '/[path]');
|
|
32
|
+
result = result.replace(/[A-Z]:\\(?:[\w.-]+\\){2,}/gi, '[path]\\');
|
|
33
|
+
// Strip email-like patterns
|
|
34
|
+
result = result.replace(/[\w.+-]+@[\w.-]+\.\w{2,}/g, '[email]');
|
|
35
|
+
return result;
|
|
36
|
+
}
|
|
37
|
+
function readTeamConfig(projectDir) {
|
|
38
|
+
const teamFile = join(projectDir, '.ai-team', 'team.md');
|
|
39
|
+
if (existsSync(teamFile)) {
|
|
40
|
+
return { teamFile: readFileSync(teamFile, 'utf-8') };
|
|
41
|
+
}
|
|
42
|
+
return {};
|
|
43
|
+
}
|
|
44
|
+
function readAgents(projectDir) {
|
|
45
|
+
const agentsDir = join(projectDir, '.github', 'agents');
|
|
46
|
+
if (!existsSync(agentsDir))
|
|
47
|
+
return [];
|
|
48
|
+
return readdirSync(agentsDir)
|
|
49
|
+
.filter(f => f.endsWith('.md'))
|
|
50
|
+
.map(f => {
|
|
51
|
+
const content = readFileSync(join(agentsDir, f), 'utf-8');
|
|
52
|
+
const name = basename(f, '.md').replace('.agent', '');
|
|
53
|
+
return { name, role: name, content };
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
function readRoutingRules(projectDir) {
|
|
57
|
+
const routingFile = join(projectDir, '.ai-team', 'routing.md');
|
|
58
|
+
if (!existsSync(routingFile))
|
|
59
|
+
return [];
|
|
60
|
+
const content = readFileSync(routingFile, 'utf-8');
|
|
61
|
+
const rules = [];
|
|
62
|
+
const lines = content.split('\n');
|
|
63
|
+
for (const line of lines) {
|
|
64
|
+
const match = line.match(/^\s*[-*]\s+`?([^`]+)`?\s*→\s*(\w+)/);
|
|
65
|
+
if (match) {
|
|
66
|
+
rules.push({ pattern: match[1].trim(), agent: match[2].trim() });
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return rules;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Export a Squad project configuration as a bundle.
|
|
73
|
+
*/
|
|
74
|
+
export function exportSquadConfig(projectDir, options) {
|
|
75
|
+
const opts = {
|
|
76
|
+
includeHistory: options?.includeHistory ?? false,
|
|
77
|
+
includeSkills: options?.includeSkills ?? true,
|
|
78
|
+
format: options?.format ?? 'json',
|
|
79
|
+
anonymize: options?.anonymize ?? false,
|
|
80
|
+
};
|
|
81
|
+
const config = readTeamConfig(projectDir);
|
|
82
|
+
let agents = readAgents(projectDir);
|
|
83
|
+
let routingRules = readRoutingRules(projectDir);
|
|
84
|
+
const skills = [];
|
|
85
|
+
if (opts.includeSkills) {
|
|
86
|
+
const skillsDir = join(projectDir, '.ai-team', 'skills');
|
|
87
|
+
if (existsSync(skillsDir)) {
|
|
88
|
+
const skillFiles = readdirSync(skillsDir).filter(f => f.endsWith('.md'));
|
|
89
|
+
skills.push(...skillFiles.map(f => basename(f, '.md')));
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
if (opts.anonymize) {
|
|
93
|
+
agents = agents.map(a => ({
|
|
94
|
+
...a,
|
|
95
|
+
content: anonymizeContent(a.content),
|
|
96
|
+
}));
|
|
97
|
+
}
|
|
98
|
+
const bundle = {
|
|
99
|
+
config: opts.anonymize ? {} : config,
|
|
100
|
+
agents,
|
|
101
|
+
skills,
|
|
102
|
+
routingRules,
|
|
103
|
+
metadata: {
|
|
104
|
+
version: '1.0.0',
|
|
105
|
+
timestamp: new Date().toISOString(),
|
|
106
|
+
source: opts.anonymize ? '[anonymized]' : projectDir,
|
|
107
|
+
},
|
|
108
|
+
};
|
|
109
|
+
if (opts.includeHistory) {
|
|
110
|
+
bundle.history = [];
|
|
111
|
+
}
|
|
112
|
+
return bundle;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Serialize an export bundle to a string.
|
|
116
|
+
*/
|
|
117
|
+
export function serializeBundle(bundle, format) {
|
|
118
|
+
if (format === 'yaml') {
|
|
119
|
+
return toSimpleYaml(bundle);
|
|
120
|
+
}
|
|
121
|
+
return JSON.stringify(bundle, null, 2);
|
|
122
|
+
}
|
|
123
|
+
/** Minimal YAML serializer for flat/nested objects */
|
|
124
|
+
function toSimpleYaml(obj, indent = 0) {
|
|
125
|
+
const pad = ' '.repeat(indent);
|
|
126
|
+
if (obj === null || obj === undefined)
|
|
127
|
+
return `${pad}null\n`;
|
|
128
|
+
if (typeof obj === 'string')
|
|
129
|
+
return obj.includes('\n') ? `|\n${obj.split('\n').map(l => pad + ' ' + l).join('\n')}\n` : `${obj}\n`;
|
|
130
|
+
if (typeof obj === 'number' || typeof obj === 'boolean')
|
|
131
|
+
return `${obj}\n`;
|
|
132
|
+
if (Array.isArray(obj)) {
|
|
133
|
+
if (obj.length === 0)
|
|
134
|
+
return `[]\n`;
|
|
135
|
+
return obj.map(item => {
|
|
136
|
+
if (typeof item === 'object' && item !== null) {
|
|
137
|
+
const inner = toSimpleYaml(item, indent + 2).trimStart();
|
|
138
|
+
return `${pad}- ${inner}`;
|
|
139
|
+
}
|
|
140
|
+
return `${pad}- ${item}\n`;
|
|
141
|
+
}).join('');
|
|
142
|
+
}
|
|
143
|
+
if (typeof obj === 'object') {
|
|
144
|
+
const entries = Object.entries(obj);
|
|
145
|
+
if (entries.length === 0)
|
|
146
|
+
return `{}\n`;
|
|
147
|
+
return entries.map(([k, v]) => {
|
|
148
|
+
if (typeof v === 'object' && v !== null) {
|
|
149
|
+
return `${pad}${k}:\n${toSimpleYaml(v, indent + 2)}`;
|
|
150
|
+
}
|
|
151
|
+
return `${pad}${k}: ${toSimpleYaml(v)}`;
|
|
152
|
+
}).join('');
|
|
153
|
+
}
|
|
154
|
+
return `${obj}\n`;
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=export.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/sharing/export.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* M5-3: History splitting logic
|
|
3
|
+
* Separates shareable history from private data for safe export.
|
|
4
|
+
*/
|
|
5
|
+
export interface HistoryEntry {
|
|
6
|
+
id: string;
|
|
7
|
+
timestamp: string;
|
|
8
|
+
type: 'decision' | 'pattern' | 'interaction' | 'error';
|
|
9
|
+
content: string;
|
|
10
|
+
agent?: string;
|
|
11
|
+
metadata?: Record<string, unknown>;
|
|
12
|
+
}
|
|
13
|
+
export interface AgentHistory {
|
|
14
|
+
entries: HistoryEntry[];
|
|
15
|
+
source?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface SplitOptions {
|
|
18
|
+
maxAge?: number;
|
|
19
|
+
excludePatterns?: string[];
|
|
20
|
+
anonymize?: boolean;
|
|
21
|
+
}
|
|
22
|
+
export interface SplitResult {
|
|
23
|
+
exportable: AgentHistory;
|
|
24
|
+
private: AgentHistory;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Split history into exportable (shareable) and private portions.
|
|
28
|
+
*/
|
|
29
|
+
export declare function splitHistory(history: AgentHistory, options?: SplitOptions): SplitResult;
|
|
30
|
+
/**
|
|
31
|
+
* Merge imported history with existing history, deduplicating by id.
|
|
32
|
+
*/
|
|
33
|
+
export declare function mergeHistory(existing: AgentHistory, imported: AgentHistory): AgentHistory;
|
|
34
|
+
//# sourceMappingURL=history-split.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history-split.d.ts","sourceRoot":"","sources":["../../src/sharing/history-split.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,UAAU,GAAG,SAAS,GAAG,aAAa,GAAG,OAAO,CAAC;IACvD,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,YAAY,CAAC;IACzB,OAAO,EAAE,YAAY,CAAC;CACvB;AA0CD;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,WAAW,CAsCvF;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,GAAG,YAAY,CAwBzF"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* M5-3: History splitting logic
|
|
3
|
+
* Separates shareable history from private data for safe export.
|
|
4
|
+
*/
|
|
5
|
+
const PRIVATE_PATTERNS = [
|
|
6
|
+
/[\w.+-]+@[\w.-]+\.\w{2,}/g, // emails
|
|
7
|
+
/https?:\/\/[^\s)]+/g, // URLs
|
|
8
|
+
/ghp_[A-Za-z0-9]{36}/g, // GitHub PATs
|
|
9
|
+
/gho_[A-Za-z0-9]{36}/g,
|
|
10
|
+
/github_pat_[A-Za-z0-9_]{82}/g,
|
|
11
|
+
/[A-Z]:\\(?:[\w.-]+\\){2,}[\w.-]*/gi, // Windows paths
|
|
12
|
+
/(?:\/[\w.-]+){3,}/g, // Unix paths
|
|
13
|
+
];
|
|
14
|
+
/**
|
|
15
|
+
* Anonymize a single history entry's content.
|
|
16
|
+
*/
|
|
17
|
+
function anonymizeEntry(entry) {
|
|
18
|
+
let content = entry.content;
|
|
19
|
+
for (const pattern of PRIVATE_PATTERNS) {
|
|
20
|
+
content = content.replace(pattern, '[REDACTED]');
|
|
21
|
+
}
|
|
22
|
+
return {
|
|
23
|
+
...entry,
|
|
24
|
+
content,
|
|
25
|
+
agent: entry.agent,
|
|
26
|
+
metadata: undefined, // strip metadata which may contain PII
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function isExpired(entry, maxAgeDays) {
|
|
30
|
+
const entryDate = new Date(entry.timestamp);
|
|
31
|
+
const cutoff = new Date();
|
|
32
|
+
cutoff.setDate(cutoff.getDate() - maxAgeDays);
|
|
33
|
+
return entryDate < cutoff;
|
|
34
|
+
}
|
|
35
|
+
function matchesExclude(entry, patterns) {
|
|
36
|
+
return patterns.some(p => {
|
|
37
|
+
const re = new RegExp(p, 'i');
|
|
38
|
+
return re.test(entry.content) || (entry.agent && re.test(entry.agent));
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Split history into exportable (shareable) and private portions.
|
|
43
|
+
*/
|
|
44
|
+
export function splitHistory(history, options) {
|
|
45
|
+
const opts = {
|
|
46
|
+
maxAge: options?.maxAge ?? 365,
|
|
47
|
+
excludePatterns: options?.excludePatterns ?? [],
|
|
48
|
+
anonymize: options?.anonymize ?? false,
|
|
49
|
+
};
|
|
50
|
+
const exportable = [];
|
|
51
|
+
const privateEntries = [];
|
|
52
|
+
for (const entry of history.entries) {
|
|
53
|
+
// Expired entries go to private
|
|
54
|
+
if (isExpired(entry, opts.maxAge)) {
|
|
55
|
+
privateEntries.push(entry);
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
// Excluded entries go to private
|
|
59
|
+
if (matchesExclude(entry, opts.excludePatterns)) {
|
|
60
|
+
privateEntries.push(entry);
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
// Interaction and error types are private by default
|
|
64
|
+
if (entry.type === 'interaction' || entry.type === 'error') {
|
|
65
|
+
privateEntries.push(entry);
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
// Decision and pattern types are exportable
|
|
69
|
+
const processed = opts.anonymize ? anonymizeEntry(entry) : entry;
|
|
70
|
+
exportable.push(processed);
|
|
71
|
+
}
|
|
72
|
+
return {
|
|
73
|
+
exportable: { entries: exportable },
|
|
74
|
+
private: { entries: privateEntries },
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Merge imported history with existing history, deduplicating by id.
|
|
79
|
+
*/
|
|
80
|
+
export function mergeHistory(existing, imported) {
|
|
81
|
+
const seen = new Set();
|
|
82
|
+
const merged = [];
|
|
83
|
+
// Existing entries take precedence
|
|
84
|
+
for (const entry of existing.entries) {
|
|
85
|
+
if (!seen.has(entry.id)) {
|
|
86
|
+
seen.add(entry.id);
|
|
87
|
+
merged.push(entry);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// Add imported entries that don't already exist
|
|
91
|
+
for (const entry of imported.entries) {
|
|
92
|
+
if (!seen.has(entry.id)) {
|
|
93
|
+
seen.add(entry.id);
|
|
94
|
+
merged.push(entry);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// Sort by timestamp
|
|
98
|
+
merged.sort((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime());
|
|
99
|
+
return { entries: merged, source: existing.source ?? imported.source };
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=history-split.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history-split.js","sourceRoot":"","sources":["../../src/sharing/history-split.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA2BH,MAAM,gBAAgB,GAAG;IACvB,2BAA2B,EAAW,SAAS;IAC/C,qBAAqB,EAAmB,OAAO;IAC/C,sBAAsB,EAAiB,cAAc;IACrD,sBAAsB;IACtB,8BAA8B;IAC9B,oCAAoC,EAAG,gBAAgB;IACvD,oBAAoB,EAAoB,aAAa;CACtD,CAAC;AAEF;;GAEG;AACH,SAAS,cAAc,CAAC,KAAmB;IACzC,IAAI,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAC5B,KAAK,MAAM,OAAO,IAAI,gBAAgB,EAAE,CAAC;QACvC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IACnD,CAAC;IACD,OAAO;QACL,GAAG,KAAK;QACR,OAAO;QACP,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,QAAQ,EAAE,SAAS,EAAE,uCAAuC;KAC7D,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,KAAmB,EAAE,UAAkB;IACxD,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;IAC1B,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,UAAU,CAAC,CAAC;IAC9C,OAAO,SAAS,GAAG,MAAM,CAAC;AAC5B,CAAC;AAED,SAAS,cAAc,CAAC,KAAmB,EAAE,QAAkB;IAC7D,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;QACvB,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC9B,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,OAAqB,EAAE,OAAsB;IACxE,MAAM,IAAI,GAA2B;QACnC,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,GAAG;QAC9B,eAAe,EAAE,OAAO,EAAE,eAAe,IAAI,EAAE;QAC/C,SAAS,EAAE,OAAO,EAAE,SAAS,IAAI,KAAK;KACvC,CAAC;IAEF,MAAM,UAAU,GAAmB,EAAE,CAAC;IACtC,MAAM,cAAc,GAAmB,EAAE,CAAC;IAE1C,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpC,gCAAgC;QAChC,IAAI,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAClC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC3B,SAAS;QACX,CAAC;QAED,iCAAiC;QACjC,IAAI,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC;YAChD,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC3B,SAAS;QACX,CAAC;QAED,qDAAqD;QACrD,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC3D,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC3B,SAAS;QACX,CAAC;QAED,4CAA4C;QAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACjE,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO;QACL,UAAU,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE;QACnC,OAAO,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE;KACrC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,QAAsB,EAAE,QAAsB;IACzE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,MAAM,GAAmB,EAAE,CAAC;IAElC,mCAAmC;IACnC,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QACrC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACnB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,gDAAgD;IAChD,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QACrC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACnB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,oBAAoB;IACpB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IAEzF,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;AACzE,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* M5-2: Import command (squad import)
|
|
3
|
+
* Imports a Squad configuration bundle into a target project.
|
|
4
|
+
*/
|
|
5
|
+
import type { ExportBundle } from './export.js';
|
|
6
|
+
export interface ImportOptions {
|
|
7
|
+
merge?: boolean;
|
|
8
|
+
dryRun?: boolean;
|
|
9
|
+
skipValidation?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export interface ImportChange {
|
|
12
|
+
type: 'added' | 'modified' | 'skipped';
|
|
13
|
+
path: string;
|
|
14
|
+
reason?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface ImportResult {
|
|
17
|
+
success: boolean;
|
|
18
|
+
changes: ImportChange[];
|
|
19
|
+
warnings: string[];
|
|
20
|
+
}
|
|
21
|
+
export interface BundleValidationError {
|
|
22
|
+
field: string;
|
|
23
|
+
message: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Deserialize a bundle string (JSON or YAML-like) into an ExportBundle.
|
|
27
|
+
*/
|
|
28
|
+
export declare function deserializeBundle(content: string): ExportBundle;
|
|
29
|
+
/**
|
|
30
|
+
* Validate an ExportBundle for structural correctness.
|
|
31
|
+
*/
|
|
32
|
+
export declare function validateBundle(bundle: ExportBundle): BundleValidationError[];
|
|
33
|
+
/**
|
|
34
|
+
* Import a Squad configuration bundle into a target directory.
|
|
35
|
+
*/
|
|
36
|
+
export declare function importSquadConfig(bundlePath: string, targetDir: string, options?: ImportOptions): ImportResult;
|
|
37
|
+
//# sourceMappingURL=import.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import.d.ts","sourceRoot":"","sources":["../../src/sharing/import.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAqB,MAAM,aAAa,CAAC;AAEnE,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,CAAC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,CAQ/D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,qBAAqB,EAAE,CAiC5E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,aAAa,GACtB,YAAY,CA8Ed"}
|