opencode-swarm 7.179.0 → 7.180.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/.opencode/skills/execute/SKILL.md +9 -8
- package/.opencode/skills/running-tests/SKILL.md +41 -36
- package/.opencode/skills/writing-tests/SKILL.md +11 -4
- package/binaries/win32-arm64/swarm-sandbox-runner.exe +0 -0
- package/binaries/win32-x64/swarm-sandbox-runner.exe +0 -0
- package/dist/agents/explorer.d.ts +1 -1
- package/dist/background/pr-event-subscribers.d.ts +2 -0
- package/dist/background/pr-feedback-event-queue.d.ts +7 -0
- package/dist/background/pr-feedback-loop.d.ts +162 -0
- package/dist/cli/{coder-settlement-7pt3a0y0.js → coder-settlement-34z9xgnx.js} +13 -13
- package/dist/cli/{config-doctor-82w4bp4b.js → config-doctor-tkfrwztz.js} +2 -2
- package/dist/cli/{core-9rqzs794.js → core-z9ybzpvr.js} +4 -5
- package/dist/cli/{curation-policy-c7mdsf7m.js → curation-policy-gwzmjmt7.js} +6 -5
- package/dist/cli/{curator-drift-d93pwt8h.js → curator-drift-3bbn011w.js} +22 -12
- package/dist/cli/curator-llm-factory-e162g7xp.js +74 -0
- package/dist/cli/{curator-m8act07j.js → curator-zv4qs07j.js} +46 -44
- package/dist/cli/{dispatch-3rwdxpp2.js → dispatch-p5zjg5e6.js} +1 -1
- package/dist/cli/{evidence-summary-service-a99bgje1.js → evidence-summary-service-wrfth5tr.js} +22 -20
- package/dist/cli/{explorer-z0cf5cz0.js → explorer-m50sfrp7.js} +1 -1
- package/dist/cli/{gate-evidence-yssmxba5.js → gate-evidence-adqbxnm7.js} +8 -8
- package/dist/cli/guardrail-explain-dn96802k.js +75 -0
- package/dist/cli/{guardrail-log-j2wtq7p2.js → guardrail-log-rcza6v3y.js} +6 -6
- package/dist/cli/{guardrail-reset-07byr7nr.js → guardrail-reset-fjn42e0n.js} +46 -44
- package/dist/cli/hive-promoter-hgqqn7qw.js +89 -0
- package/dist/cli/{index-7zmbtxw1.js → index-06crt1ej.js} +2 -2
- package/dist/cli/{index-wrt875kh.js → index-0725jpp7.js} +1 -1
- package/dist/cli/{index-f2v90gfc.js → index-0v1rtanv.js} +24 -165
- package/dist/cli/{index-0bc8jdnv.js → index-1hzqyx13.js} +9 -1
- package/dist/cli/{index-80q47hpw.js → index-1p8fk9jb.js} +2 -2
- package/dist/cli/{index-1rwyfvq2.js → index-2h0qng38.js} +3 -3
- package/dist/cli/{index-amf88k1e.js → index-3jap3516.js} +1 -1
- package/dist/cli/{index-8815e95e.js → index-5gmn0a3j.js} +8 -8
- package/dist/cli/{index-yagqxt2p.js → index-5m378633.js} +4 -4
- package/dist/cli/{index-0h3cr7pn.js → index-5yc5n4ae.js} +1 -1
- package/dist/cli/{index-pxtye2ng.js → index-7pj0x345.js} +50 -48
- package/dist/cli/{index-etmwjgre.js → index-7w6dnpvc.js} +46 -44
- package/dist/cli/{index-6tnkvqr9.js → index-8b1f2t5q.js} +8 -10
- package/dist/cli/{index-cvg402ha.js → index-91dhg3wr.js} +2 -2
- package/dist/cli/{index-3pzwsesm.js → index-92m05mew.js} +2 -2
- package/dist/cli/{index-6r92fw88.js → index-93vk5s7v.js} +8 -8
- package/dist/cli/{index-ne9zamcs.js → index-989v83pb.js} +1 -1
- package/dist/cli/{index-g6nyk713.js → index-aspxz5r5.js} +1 -1
- package/dist/cli/index-b9z9gvx0.js +339 -0
- package/dist/cli/{index-2b0ktpbf.js → index-bdpgfep1.js} +5 -5
- package/dist/cli/{index-nzekzzs2.js → index-bv4b8tpa.js} +5 -5
- package/dist/cli/{index-n1tcj1q7.js → index-bx70zs8d.js} +187 -47
- package/dist/cli/{index-kmhnkn6t.js → index-caj76d0f.js} +6 -8
- package/dist/cli/{index-549wxbe1.js → index-cjapb4hy.js} +1 -1
- package/dist/cli/{index-3hne91yd.js → index-cxgr6ad5.js} +13 -15
- package/dist/cli/{index-kanxpgf8.js → index-dcttq1mn.js} +2 -2
- package/dist/cli/{index-twtez316.js → index-defq2crz.js} +13 -3
- package/dist/cli/{index-d66zb40k.js → index-dnbqmay5.js} +3054 -1454
- package/dist/cli/index-ejhxgyvm.js +147 -0
- package/dist/cli/{index-hwcra3y9.js → index-ekgc71m1.js} +10 -10
- package/dist/cli/{index-s4bkey0q.js → index-gc6h1fmf.js} +4 -4
- package/dist/cli/index-gx2vp8gx.js +100 -0
- package/dist/cli/{index-zgvzbz48.js → index-hamqvzqn.js} +69 -13
- package/dist/cli/{index-h59vsbch.js → index-htrb9ec3.js} +1 -1
- package/dist/cli/{index-yfpswnjt.js → index-jmrsfhwq.js} +3 -3
- package/dist/cli/{index-9p1pqykb.js → index-jrfv2am8.js} +7 -7
- package/dist/cli/{index-pskba939.js → index-jscqefqm.js} +1 -1
- package/dist/cli/{index-wvpsm8ja.js → index-kp654qcw.js} +32 -17
- package/dist/cli/{index-tmy46dtd.js → index-mhrn7hbb.js} +8 -7
- package/dist/cli/{index-h4nh6s8b.js → index-nhxykfyy.js} +1 -1
- package/dist/cli/{index-ndwbb3xm.js → index-pnt98k7z.js} +7 -7
- package/dist/cli/{index-1c1dbwze.js → index-rdec0y3z.js} +1 -1
- package/dist/cli/{index-qxk5qkfh.js → index-ret97f1t.js} +5 -5
- package/dist/cli/{index-sv4y1cma.js → index-v1sc1gxv.js} +6 -6
- package/dist/cli/{index-a11ztzs5.js → index-vmthakz0.js} +1 -1
- package/dist/cli/{index-09wm3963.js → index-x6kjbjya.js} +9 -7
- package/dist/cli/{index-1sz02k85.js → index-zptq8mp1.js} +4 -103
- package/dist/cli/{index-34bwqcea.js → index-zvxy0mev.js} +1 -1
- package/dist/cli/{index-zz7gzw57.js → index-zxdawwc7.js} +88 -4
- package/dist/cli/index.js +47 -45
- package/dist/cli/{knowledge-escalator-yx97q9c1.js → knowledge-escalator-x8vcmb6k.js} +16 -15
- package/dist/cli/{knowledge-events-p269fyvv.js → knowledge-events-naf9kyyc.js} +14 -13
- package/dist/cli/{knowledge-link-gfz47ves.js → knowledge-link-g0q25hqv.js} +5 -4
- package/dist/cli/{knowledge-store-36zemyqa.js → knowledge-store-dnv0ph42.js} +6 -5
- package/dist/cli/{knowledge-validator-rd20yq41.js → knowledge-validator-a1rfzkmv.js} +8 -7
- package/dist/cli/{mcp-sg9zrkz2.js → mcp-hnb0m05a.js} +1 -1
- package/dist/cli/{pending-delegations-8p2gf4kt.js → pending-delegations-05p6cmbh.js} +13 -12
- package/dist/cli/{pr-subscriptions-4dj9r71h.js → pr-subscriptions-a2djfzyx.js} +13 -12
- package/dist/cli/{pr-workflow-gate-8dgz5z1h.js → pr-workflow-gate-wkmx8nr6.js} +48 -44
- package/dist/cli/{runner-16b691ba.js → runner-hkbds12j.js} +6 -5
- package/dist/cli/{scan-cursor-nx0jv9ya.js → scan-cursor-4khfn5pm.js} +8 -8
- package/dist/cli/{schema-q6gsrxwz.js → schema-a5zb02h8.js} +3 -1
- package/dist/cli/{scope-persistence-1k4xsyh7.js → scope-persistence-nsw324ce.js} +18 -17
- package/dist/cli/{server-shhxq34t.js → server-exj4wt8j.js} +54 -52
- package/dist/cli/{skill-generator-6j7tq2tb.js → skill-generator-r2cdtx7b.js} +18 -17
- package/dist/cli/{snapshot-coordination-init-h8n8w1cm.js → snapshot-coordination-init-sad6q0a2.js} +46 -44
- package/dist/cli/speckit-checkoff-46g9sqak.js +31 -0
- package/dist/cli/{workspace-snapshot-rfnn80dg.js → workspace-snapshot-4m2ex1ey.js} +4 -5
- package/dist/cli/{worktree-collision-ownership-97jzh4ra.js → worktree-collision-ownership-4znkfq1t.js} +16 -16
- package/dist/cli/{worktree-isolation-g4w74ccb.js → worktree-isolation-mv9ee00v.js} +46 -44
- package/dist/commands/pr-feedback-loop.d.ts +1 -0
- package/dist/commands/registry.d.ts +10 -2
- package/dist/config/schema.d.ts +27 -0
- package/dist/hooks/delegation-tracker.d.ts +6 -1
- package/dist/hooks/pr-workflow-gate.d.ts +1 -1
- package/dist/index.js +639 -606
- package/dist/lang/backends/go.d.ts +2 -0
- package/dist/mutation/engine.d.ts +1 -0
- package/dist/sdd/effective-spec.d.ts +35 -22
- package/dist/sdd/speckit-checkoff.d.ts +113 -0
- package/dist/session/hydration-ownership.d.ts +83 -0
- package/dist/session/snapshot-coordination-init.d.ts +2 -1
- package/dist/session/snapshot-reader.d.ts +25 -7
- package/dist/state.d.ts +32 -2
- package/dist/test-impact/analyzer.d.ts +46 -4
- package/dist/test-impact/constants.d.ts +4 -0
- package/dist/tools/mutation-test.d.ts +11 -5
- package/dist/tools/test-runner.d.ts +34 -6
- package/opencode-swarm.schema.json +40 -0
- package/package.json +1 -1
- package/dist/cli/curator-llm-factory-cbm1ny30.js +0 -72
- package/dist/cli/guardrail-explain-ffwmhf7s.js +0 -73
- package/dist/cli/hive-promoter-ewrz7vh1.js +0 -87
- package/dist/cli/index-4ddpvd5c.js +0 -94
|
@@ -10,6 +10,8 @@
|
|
|
10
10
|
* `typescript.ts` for the rationale; backend-purity test enforces.
|
|
11
11
|
*/
|
|
12
12
|
import type { LanguageBackend } from '../backend';
|
|
13
|
+
/** Avoid spending unbounded time parsing an attacker-controlled source file. */
|
|
14
|
+
export declare const MAX_IMPORT_SOURCE_BYTES: number;
|
|
13
15
|
declare function extractImports(_sourceFile: string, source: string): string[];
|
|
14
16
|
/**
|
|
15
17
|
* Build the Go backend from the registered profile.
|
|
@@ -95,6 +95,7 @@ export declare const _internals: {
|
|
|
95
95
|
* `args.executable === 'git'`) keeps working for `git`-flavored callers.
|
|
96
96
|
*/
|
|
97
97
|
resolveGitExecutable: typeof resolveGitExecutable;
|
|
98
|
+
beforeRestoreWrite: () => void;
|
|
98
99
|
};
|
|
99
100
|
export declare function executeMutation(patch: MutationPatch, testCommand: string[], testFiles: string[], workingDir: string, options?: MutationExecutionOptions): Promise<MutationResult>;
|
|
100
101
|
export declare function computeReport(results: MutationResult[], durationMs: number, budgetMs?: number): MutationReport;
|
|
@@ -47,31 +47,36 @@ export interface SpeckitDetection {
|
|
|
47
47
|
features: SpeckitFeatureEntry[];
|
|
48
48
|
}
|
|
49
49
|
/**
|
|
50
|
-
* Discriminated union returned by {@link resolveSpeckitProjection}
|
|
50
|
+
* Discriminated union returned by {@link resolveSpeckitProjection}.
|
|
51
51
|
*
|
|
52
|
-
* Each kind carries exactly the information the command layer
|
|
52
|
+
* Each kind carries exactly the information the command layer needs to
|
|
53
53
|
* produce the correct error message per FR-008, FR-012, FR-013 without re-detecting.
|
|
54
54
|
*
|
|
55
|
+
* Issue #2501 (Spec-Kit v2): the `ambiguous` kind is GONE — with more than one
|
|
56
|
+
* detected feature and no `options.feature`, the projector now projects ALL
|
|
57
|
+
* features into one effective spec with feature-scoped requirement ids
|
|
58
|
+
* (`<featureId>/FR-###`). Selecting a single feature (explicit `options.feature`)
|
|
59
|
+
* keeps the v1 single-feature, bare-id output byte-for-byte.
|
|
60
|
+
*
|
|
55
61
|
* - `not_speckit` — no `.specify/` marker at the repo root (A-001).
|
|
56
62
|
* - `empty` — marker present but no `specs/NNN/spec.md` feature dirs (FR-012).
|
|
57
|
-
* - `ambiguous` — more than one feature and no `options.feature` given (FR-008);
|
|
58
|
-
* `features` = sorted feature ids for naming in the error message.
|
|
59
63
|
* - `unknown_feature` — `options.feature` was given but matches no detected feature.
|
|
60
|
-
* - `zero_requirements`—
|
|
61
|
-
* requirements (covers unreadable/oversized *input* files too)
|
|
64
|
+
* - `zero_requirements`— a projected feature's spec.md yielded zero parsable functional
|
|
65
|
+
* requirements (covers unreadable/oversized *input* files too)
|
|
66
|
+
* (FR-013). In multi-feature mode the whole projection refuses —
|
|
67
|
+
* a partially-dropped feature must never project silently.
|
|
62
68
|
* - `too_large` — requirements parsed, but the projected *output* exceeds the byte
|
|
63
69
|
* cap and is refused; `bytes` is the projected size. Distinct from
|
|
64
70
|
* zero_requirements so the command layer reports the real reason.
|
|
65
|
-
* - `ok` — a valid projection was built; `spec` is ready for use
|
|
66
|
-
*
|
|
71
|
+
* - `ok` — a valid projection was built; `spec` is ready for use.
|
|
72
|
+
* `features` lists the projected feature dir names and
|
|
73
|
+
* `namespaced` is true when ids are feature-scoped (multi-feature
|
|
74
|
+
* projection; single-feature output stays bare-id v1 form).
|
|
67
75
|
*/
|
|
68
76
|
export type SpeckitResolution = {
|
|
69
77
|
kind: 'not_speckit';
|
|
70
78
|
} | {
|
|
71
79
|
kind: 'empty';
|
|
72
|
-
} | {
|
|
73
|
-
kind: 'ambiguous';
|
|
74
|
-
features: string[];
|
|
75
80
|
} | {
|
|
76
81
|
kind: 'unknown_feature';
|
|
77
82
|
feature: string;
|
|
@@ -86,7 +91,14 @@ export type SpeckitResolution = {
|
|
|
86
91
|
} | {
|
|
87
92
|
kind: 'ok';
|
|
88
93
|
spec: EffectiveSpec;
|
|
89
|
-
|
|
94
|
+
features: string[];
|
|
95
|
+
namespaced: boolean;
|
|
96
|
+
/**
|
|
97
|
+
* Rendered requirement ids per feature, in projection order (parallel to
|
|
98
|
+
* `features`). Basis for the check-off ledger's story-index mapping
|
|
99
|
+
* (#2501 Part B: `[US n]` on a task line maps to the n-th requirement).
|
|
100
|
+
*/
|
|
101
|
+
featureRequirementIds: string[][];
|
|
90
102
|
};
|
|
91
103
|
/**
|
|
92
104
|
* Detect whether `directory` is a GitHub Spec-Kit project (FR-001, A-001).
|
|
@@ -113,10 +125,11 @@ export declare function detectSpeckit(directory: string): SpeckitDetection;
|
|
|
113
125
|
* re-running detection:
|
|
114
126
|
* - `not_speckit` — no `.specify/` marker (A-001).
|
|
115
127
|
* - `empty` — marker present but no feature dirs (FR-012).
|
|
116
|
-
* - `ambiguous` — multiple features, no `options.feature` (FR-008).
|
|
117
128
|
* - `unknown_feature` — `options.feature` not among detected features.
|
|
118
129
|
* - `zero_requirements` — feature found but yields zero parsable FRs, or spec.md unreadable
|
|
119
|
-
* (FR-013; covers oversized files too).
|
|
130
|
+
* (FR-013; covers oversized *input* files too).
|
|
131
|
+
* - `too_large` — requirements parsed, but the projected output exceeds the byte
|
|
132
|
+
* cap (FR-013; `bytes` is the projected size).
|
|
120
133
|
* - `ok` — valid EffectiveSpec built (FR-002, FR-003, FR-004, FR-005).
|
|
121
134
|
*
|
|
122
135
|
* This function is the single source of truth for feature selection logic.
|
|
@@ -126,15 +139,16 @@ export declare function resolveSpeckitProjection(directory: string, options?: {
|
|
|
126
139
|
feature?: string;
|
|
127
140
|
}): SpeckitResolution;
|
|
128
141
|
/**
|
|
129
|
-
* Project
|
|
142
|
+
* Project Spec-Kit feature(s) into an EffectiveSpec (FR-002, FR-003, FR-004, FR-005;
|
|
143
|
+
* #2501 multi-feature).
|
|
130
144
|
*
|
|
131
145
|
* Delegates all selection and build logic to {@link resolveSpeckitProjection} — that function
|
|
132
146
|
* is the single source of truth for feature selection. This wrapper preserves the existing
|
|
133
147
|
* `EffectiveSpec | null` contract so all call sites (task 2.2, tests) are unchanged.
|
|
134
148
|
*
|
|
135
|
-
* Returns null when resolution is anything other than `ok` (not_speckit, empty,
|
|
136
|
-
* unknown_feature, zero_requirements). Callers that need the failure reason
|
|
137
|
-
* {@link resolveSpeckitProjection} directly.
|
|
149
|
+
* Returns null when resolution is anything other than `ok` (not_speckit, empty,
|
|
150
|
+
* unknown_feature, zero_requirements, too_large). Callers that need the failure reason
|
|
151
|
+
* should call {@link resolveSpeckitProjection} directly.
|
|
138
152
|
*/
|
|
139
153
|
export declare function buildSpeckitProjectionSync(directory: string, options?: {
|
|
140
154
|
feature?: string;
|
|
@@ -254,10 +268,9 @@ export declare function writeProjectedSpecSync(directory: string, options?: {
|
|
|
254
268
|
* - Missing required spec.md sections (`SPECKIT_REQUIRED_SECTIONS`).
|
|
255
269
|
* - `tasks.md` task lines that carry no `[US#]` user-story reference (FR-007).
|
|
256
270
|
*
|
|
257
|
-
* For other resolution kinds (`not_speckit`, `empty`, `
|
|
258
|
-
* `
|
|
259
|
-
*
|
|
260
|
-
* as task 2.2 (plan.md task 2.3 requirement: no second messaging scheme).
|
|
271
|
+
* For other resolution kinds (`not_speckit`, `empty`, `unknown_feature`,
|
|
272
|
+
* `too_large`) the command layer uses {@link formatSpeckitError} on the
|
|
273
|
+
* returned resolution — same messaging path as the project command.
|
|
261
274
|
*/
|
|
262
275
|
export declare function validateSpeckit(directory: string, options?: {
|
|
263
276
|
feature?: string;
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
export declare const SPECKIT_CHECKOFF_LEDGER_REL: string;
|
|
2
|
+
/** One captured Spec-Kit task line in the ledger. */
|
|
3
|
+
export interface SpeckitCheckoffTaskEntry {
|
|
4
|
+
taskId: string;
|
|
5
|
+
/** Canonical requirement refs (namespaced in multi-feature mode, bare otherwise). */
|
|
6
|
+
frRefs: string[];
|
|
7
|
+
/** Trimmed snapshot of the task line at projection time (staleness + locate basis). */
|
|
8
|
+
lineSnapshot: string;
|
|
9
|
+
initiallyChecked: boolean;
|
|
10
|
+
/** ISO timestamp when Swarm checked this task off (absent until then). */
|
|
11
|
+
swarmCheckedAt?: string;
|
|
12
|
+
}
|
|
13
|
+
/** Per-feature ledger record. */
|
|
14
|
+
export interface SpeckitCheckoffFeatureRecord {
|
|
15
|
+
featureId: string;
|
|
16
|
+
/** Posix path of tasks.md relative to the project root. */
|
|
17
|
+
tasksRelPath: string;
|
|
18
|
+
/** sha256 over the trimmed task lines at projection time (staleness basis). */
|
|
19
|
+
taskLinesDigest: string;
|
|
20
|
+
tasks: SpeckitCheckoffTaskEntry[];
|
|
21
|
+
}
|
|
22
|
+
export interface SpeckitCheckoffLedger {
|
|
23
|
+
version: 1;
|
|
24
|
+
namespaced: boolean;
|
|
25
|
+
projectedAt: string;
|
|
26
|
+
features: SpeckitCheckoffFeatureRecord[];
|
|
27
|
+
}
|
|
28
|
+
/** Per-feature outcome of one propagation run. */
|
|
29
|
+
export interface SpeckitCheckoffFeatureResult {
|
|
30
|
+
featureId: string;
|
|
31
|
+
tasksRelPath: string;
|
|
32
|
+
checked: string[];
|
|
33
|
+
reopenedSkipped: string[];
|
|
34
|
+
stale: boolean;
|
|
35
|
+
refused: string[];
|
|
36
|
+
}
|
|
37
|
+
export interface SpeckitCheckoffResult {
|
|
38
|
+
ran: boolean;
|
|
39
|
+
reason?: string;
|
|
40
|
+
features: SpeckitCheckoffFeatureResult[];
|
|
41
|
+
/** True when the completed task matched no ledger task anywhere (reported, not guessed). */
|
|
42
|
+
unmatched?: boolean;
|
|
43
|
+
}
|
|
44
|
+
declare function sha256(text: string): string;
|
|
45
|
+
declare function readBounded(filePath: string): string | null;
|
|
46
|
+
/** Parse the T### checkbox lines of a tasks.md into task entries (no writes). */
|
|
47
|
+
export declare function parseSpeckitTasksContent(content: string, namespaced: boolean, featureId: string): {
|
|
48
|
+
tasks: SpeckitCheckoffTaskEntry[];
|
|
49
|
+
taskLinesDigest: string;
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Build and atomically write the check-off ledger for a successful Spec-Kit
|
|
53
|
+
* projection. Called from `writeProjectedSpecSync` (both write paths); the
|
|
54
|
+
* projection write stays authoritative — a ledger failure is logged, never
|
|
55
|
+
* thrown to the caller.
|
|
56
|
+
*
|
|
57
|
+
* Task→requirement mapping basis (#2501): Spec-Kit task lines reference user
|
|
58
|
+
* STORIES (`[US n]`), not necessarily FR ids. The ledger derives each task's
|
|
59
|
+
* requirement refs from (a) any explicit FR refs on the line, plus (b) the
|
|
60
|
+
* story-index mapping: `[US n]` maps to the feature's n-th requirement in
|
|
61
|
+
* projection order (`featureRequirementIds`, captured at projection time).
|
|
62
|
+
* Out-of-range story indices map to nothing (the task reports unmatched rather
|
|
63
|
+
* than guessing).
|
|
64
|
+
*/
|
|
65
|
+
export declare function writeSpeckitCheckoffLedger(root: string, resolution: {
|
|
66
|
+
features: string[];
|
|
67
|
+
namespaced: boolean;
|
|
68
|
+
featureRequirementIds: string[][];
|
|
69
|
+
spec: {
|
|
70
|
+
sourcePaths: string[];
|
|
71
|
+
};
|
|
72
|
+
}): void;
|
|
73
|
+
export interface ApplyCheckoffEditOutcome {
|
|
74
|
+
applied: boolean;
|
|
75
|
+
content: string;
|
|
76
|
+
reason: string;
|
|
77
|
+
}
|
|
78
|
+
export declare function applyCheckoffEdit(taskEntry: SpeckitCheckoffTaskEntry, _baselineContent: string, currentContent: string): ApplyCheckoffEditOutcome;
|
|
79
|
+
/**
|
|
80
|
+
* Propagate one completed plan task's check-off into the source tasks.md files.
|
|
81
|
+
*
|
|
82
|
+
* `completed.frRefs` are the task's requirement refs (plan `fr_refs`); refs are
|
|
83
|
+
* also mined from `completed.text` (descriptions often carry the natural ids).
|
|
84
|
+
* Never throws for expected refusal paths; structural I/O failures throw only
|
|
85
|
+
* from the atomic-write core and are caught by {@link
|
|
86
|
+
* maybePropagateSpeckitCheckoff}.
|
|
87
|
+
*/
|
|
88
|
+
export declare function propagateSpeckitCheckoff(directory: string, completed: {
|
|
89
|
+
taskId: string;
|
|
90
|
+
frRefs: string[];
|
|
91
|
+
text: string;
|
|
92
|
+
}, options: {
|
|
93
|
+
enabled: boolean;
|
|
94
|
+
}): Promise<SpeckitCheckoffResult>;
|
|
95
|
+
/**
|
|
96
|
+
* Fail-open wrapper for the plan-manager wiring: loads the plugin config,
|
|
97
|
+
* no-ops unless `speckit_checkoff.enabled`, and never lets a check-off failure
|
|
98
|
+
* propagate into the task-status update (AGENTS.md #5/#9 — bookkeeping is
|
|
99
|
+
* advisory to the durable plan write).
|
|
100
|
+
*/
|
|
101
|
+
export declare function maybePropagateSpeckitCheckoff(directory: string, completed: {
|
|
102
|
+
taskId: string;
|
|
103
|
+
frRefs: string[];
|
|
104
|
+
text: string;
|
|
105
|
+
}): Promise<void>;
|
|
106
|
+
/** DI seam for tests/checks (repo convention: restore in afterEach). */
|
|
107
|
+
export declare const _internals: {
|
|
108
|
+
applyCheckoffEdit: typeof applyCheckoffEdit;
|
|
109
|
+
parseSpeckitTasksContent: typeof parseSpeckitTasksContent;
|
|
110
|
+
readBounded: typeof readBounded;
|
|
111
|
+
sha256: typeof sha256;
|
|
112
|
+
};
|
|
113
|
+
export {};
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project-owned, generation-fenced hydration state (issue #2667).
|
|
3
|
+
*
|
|
4
|
+
* The live maps on `swarmState` are process-resident and keyed by sessionID;
|
|
5
|
+
* hydration is a per-PROJECT operation. This module owns the per-project
|
|
6
|
+
* registries that scope a hydration's blast radius to the project that
|
|
7
|
+
* initiated it and fence stale generations from publishing over newer state:
|
|
8
|
+
*
|
|
9
|
+
* - `projectHydrationGenerations` — monotonic counter per canonical project
|
|
10
|
+
* key, bumped ONLY when a hydration is initiated (`beginHydrationScope`).
|
|
11
|
+
* Session creation NEVER bumps it; new sessions stamp `current + 1` so a
|
|
12
|
+
* session created while generation `g` is latest survives any later apply
|
|
13
|
+
* at `g`.
|
|
14
|
+
* - `rehydrationCaches` — the plan/evidence rehydration cache, keyed per
|
|
15
|
+
* project (replaces the former process-singleton `_rehydrationCache`).
|
|
16
|
+
* - `hydratedAggregateKeys` — the toolAggregates keys each project's last
|
|
17
|
+
* hydration published, so a re-hydration replaces only its own keys.
|
|
18
|
+
*
|
|
19
|
+
* Fence rule: a hydration whose scope generation `g` satisfies
|
|
20
|
+
* `projectHydrationGenerations[K] > g` is REJECTED before any mutation —
|
|
21
|
+
* some newer hydration began for that project. Stamp rule: an accepted
|
|
22
|
+
* hydration at `g` evicts only sessions owned by `K` with
|
|
23
|
+
* `hydrationStamp <= g`.
|
|
24
|
+
*
|
|
25
|
+
* All maps are bounded (FIFO) with an explicit reset path
|
|
26
|
+
* (`clearHydrationOwnershipState`, called by `resetSwarmState`) per
|
|
27
|
+
* AGENTS.md invariant 8.
|
|
28
|
+
*/
|
|
29
|
+
/** Upper bound for tracked per-project registries (matches MAX_READY_ROOTS). */
|
|
30
|
+
export declare const MAX_TRACKED_PROJECTS = 32;
|
|
31
|
+
/** Upper bound for the raw-spelling → canonical-key memo. */
|
|
32
|
+
export declare const MAX_DIRECTORY_KEY_MEMO = 64;
|
|
33
|
+
/** Opaque cache payload owned by state.ts; opaque here by design. */
|
|
34
|
+
export type ProjectRehydrationCache = unknown;
|
|
35
|
+
/** Fence token captured when a hydration is initiated; see beginHydrationScope. */
|
|
36
|
+
export interface HydrationScope {
|
|
37
|
+
projectKey: string;
|
|
38
|
+
generation: number;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Resolve the canonical project key for a directory spelling through a
|
|
42
|
+
* module-owned bounded memo: exactly ONE realpath-equivalent resolution per
|
|
43
|
+
* distinct spelling per process; every later call is a pure Map hit.
|
|
44
|
+
*
|
|
45
|
+
* The memo is keyed by `canonicalRootKeyLexical` (the shared filesystem-free
|
|
46
|
+
* lexical alias key, per the path-identity ratchet — raw resolved paths must
|
|
47
|
+
* not key project maps) so distinct spellings memoize independently while
|
|
48
|
+
* lexically-identical spellings share one entry — whose canonical resolution
|
|
49
|
+
* is identical anyway.
|
|
50
|
+
*
|
|
51
|
+
* `canonicalProjectKey` itself is intentionally NOT memoized (it calls
|
|
52
|
+
* `canonicalRootKeyFresh`, bypassing the shared `canonicalRootMemo`), which
|
|
53
|
+
* is why this memo exists — `beginHydrationScope`/`startAgentSession` sit on
|
|
54
|
+
* the plugin-init and chat.message hot paths. A symlink retargeted
|
|
55
|
+
* mid-process yields a second key: fail-safe isolation (separate ownership
|
|
56
|
+
* buckets), never corruption. `canonicalProjectKey` never throws (lexical
|
|
57
|
+
* `path.resolve` fallback on realpath failure) — that fallback is accepted.
|
|
58
|
+
*/
|
|
59
|
+
export declare function hydrationProjectKey(directory: string): string;
|
|
60
|
+
/**
|
|
61
|
+
* Begin a hydration scope: bump the project's generation counter and return
|
|
62
|
+
* the fence token. The token must be captured when the hydration is
|
|
63
|
+
* INITIATED (e.g. at `loadSnapshot` entry) and carried into
|
|
64
|
+
* `rehydrateState`, which refuses to apply it once any newer generation has
|
|
65
|
+
* begun.
|
|
66
|
+
*/
|
|
67
|
+
export declare function beginHydrationScope(directory: string): HydrationScope;
|
|
68
|
+
/** Latest initiated hydration generation for a project (0 when never). */
|
|
69
|
+
export declare function currentHydrationGeneration(projectKey: string): number;
|
|
70
|
+
/**
|
|
71
|
+
* Stamp value for a session created NOW under `projectKey`:
|
|
72
|
+
* `current + 1`, i.e. newer than any already-initiated hydration, so an
|
|
73
|
+
* in-flight or late apply at the current generation can never evict it.
|
|
74
|
+
*/
|
|
75
|
+
export declare function nextSessionHydrationStamp(projectKey: string): number;
|
|
76
|
+
export declare function getRehydrationCache(projectKey: string): ProjectRehydrationCache | undefined;
|
|
77
|
+
export declare function setRehydrationCache(projectKey: string, cache: ProjectRehydrationCache): void;
|
|
78
|
+
/** Record the aggregate keys a project's hydration published (replace set). */
|
|
79
|
+
export declare function recordHydratedAggregateKeys(projectKey: string, keys: Set<string>): void;
|
|
80
|
+
/** The aggregate keys the project's last hydration published (empty if none). */
|
|
81
|
+
export declare function hydratedAggregateKeysFor(projectKey: string): Set<string>;
|
|
82
|
+
/** Reset every registry (invariant 8: bounded state with an explicit reset). */
|
|
83
|
+
export declare function clearHydrationOwnershipState(): void;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
/** Post-resolution SQLite snapshot import/readiness lifecycle (#2481). */
|
|
2
|
+
import { type HydrationScope } from './hydration-ownership.js';
|
|
2
3
|
import type { SnapshotData } from './snapshot-writer.js';
|
|
3
4
|
type ReadinessState = 'running' | 'succeeded' | 'failed' | 'timed_out' | 'closing';
|
|
4
5
|
interface ReadinessEntry {
|
|
@@ -41,7 +42,7 @@ export declare function closeSnapshotCoordinationInitialization(directory: strin
|
|
|
41
42
|
export declare function markSnapshotCoordinationClosing(directory: string): void;
|
|
42
43
|
export declare const _snapshotCoordinationInternals: {
|
|
43
44
|
entries: Map<string, ReadinessEntry>;
|
|
44
|
-
initialize: (directory: string) => Promise<void>;
|
|
45
|
+
initialize: (directory: string, scope?: HydrationScope) => Promise<void>;
|
|
45
46
|
renameLegacySnapshot: (from: string, to: string) => void;
|
|
46
47
|
writeProjection: (directory: string, snapshot: SnapshotData) => Promise<void>;
|
|
47
48
|
timeoutMs: number;
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* Reads .swarm/session/state.json and rehydrates swarmState on plugin init.
|
|
4
4
|
*/
|
|
5
5
|
import type { AgentSessionState } from '../state';
|
|
6
|
+
import { type HydrationScope } from './hydration-ownership.js';
|
|
6
7
|
import type { SerializedAgentSession, SnapshotData } from './snapshot-writer';
|
|
7
8
|
/**
|
|
8
9
|
* Transient session fields that must be reset on rehydration.
|
|
@@ -33,7 +34,19 @@ export declare function readSnapshot(directory: string): Promise<SnapshotData |
|
|
|
33
34
|
export declare function readSnapshotFileStrict(directory: string, relativePath: string): Promise<SnapshotData>;
|
|
34
35
|
/**
|
|
35
36
|
* Rehydrate swarmState from a SnapshotData object.
|
|
36
|
-
*
|
|
37
|
+
*
|
|
38
|
+
* Issue #2667 — project-owned and generation-fenced:
|
|
39
|
+
* - With a `directory`, this replaces ONLY the state owned by that project
|
|
40
|
+
* (sessions whose `owningProjectKey` matches and whose `hydrationStamp` is
|
|
41
|
+
* at or below the applying generation). Other projects' live state — and
|
|
42
|
+
* this project's sessions created after the hydration began — survive.
|
|
43
|
+
* - With an explicit `scope` captured at initiation, the apply is refused
|
|
44
|
+
* outright (zero mutation) once any NEWER hydration has begun for the
|
|
45
|
+
* project, so a late/timed-out callback cannot publish over newer state.
|
|
46
|
+
* - WITHOUT a `directory`, the legacy process-global clear-all semantics are
|
|
47
|
+
* preserved verbatim (direct-test path only; every production caller passes
|
|
48
|
+
* a directory).
|
|
49
|
+
*
|
|
37
50
|
* Does NOT touch activeToolCalls or pendingEvents (remain at defaults).
|
|
38
51
|
*
|
|
39
52
|
* activeAgent and delegationChains are restored only for session IDs that are
|
|
@@ -41,16 +54,21 @@ export declare function readSnapshotFileStrict(directory: string, relativePath:
|
|
|
41
54
|
* eviction existed can carry far more activeAgent entries than agentSessions
|
|
42
55
|
* (sessions were evicted but their satellite entries never were); restoring
|
|
43
56
|
* those wholesale would resurrect the ghosts into memory and re-serialize them
|
|
44
|
-
* into every subsequent snapshot forever.
|
|
45
|
-
* before any turn is in flight; a session that resumes afterwards gets its
|
|
46
|
-
* entry re-established by chat.message (delegation-tracker), and until then
|
|
47
|
-
* tool-path readers fall back to ORCHESTRATOR_NAME — the same treatment a
|
|
48
|
-
* fresh process gives an unknown session.
|
|
57
|
+
* into every subsequent snapshot forever.
|
|
49
58
|
*/
|
|
50
|
-
export
|
|
59
|
+
export interface RehydrateOutcome {
|
|
60
|
+
applied: boolean;
|
|
61
|
+
reason?: 'superseded';
|
|
62
|
+
}
|
|
63
|
+
export declare function rehydrateState(snapshot: SnapshotData, directory?: string, scope?: HydrationScope): Promise<RehydrateOutcome>;
|
|
51
64
|
/**
|
|
52
65
|
* Load snapshot from disk and rehydrate swarmState.
|
|
53
66
|
* Called on plugin init to restore state from previous session.
|
|
54
67
|
* NEVER throws - swallows any errors silently.
|
|
68
|
+
*
|
|
69
|
+
* Issue #2667: a hydration scope is captured at entry so the eventual
|
|
70
|
+
* rehydrateState apply is generation-fenced — a loadSnapshot whose 5 s init
|
|
71
|
+
* timeout (src/index.ts) abandoned the await is refused once any newer
|
|
72
|
+
* hydration for the same project has begun.
|
|
55
73
|
*/
|
|
56
74
|
export declare function loadSnapshot(directory: string): Promise<void>;
|
package/dist/state.d.ts
CHANGED
|
@@ -448,6 +448,30 @@ export interface AgentSessionState {
|
|
|
448
448
|
lastProviderRecoveryFingerprint?: string;
|
|
449
449
|
/** Timestamp when session was rehydrated from snapshot (0 if never rehydrated) */
|
|
450
450
|
sessionRehydratedAt: number;
|
|
451
|
+
/**
|
|
452
|
+
* Canonical project key that owns this session's live state. Written ONLY
|
|
453
|
+
* by `startAgentSession` (from its `directory` argument) and by
|
|
454
|
+
* `rehydrateState` (from the HYDRATING directory). A hydration for project
|
|
455
|
+
* K evicts only sessions whose `owningProjectKey` is K.
|
|
456
|
+
*
|
|
457
|
+
* DELIBERATELY NOT SNAPSHOTTED: `serializeAgentSession` is field-explicit
|
|
458
|
+
* so this never round-trips. Ownership is defined by which project's
|
|
459
|
+
* plugin instance created/restored the session, never by snapshot bytes —
|
|
460
|
+
* a snapshot is per-project on disk, so the hydrating directory is the
|
|
461
|
+
* only trustworthy attribution source. `undefined` = unowned (created
|
|
462
|
+
* without a directory): such sessions survive every hydration — fail-open
|
|
463
|
+
* toward preservation.
|
|
464
|
+
*/
|
|
465
|
+
owningProjectKey?: string;
|
|
466
|
+
/**
|
|
467
|
+
* Hydration generation this session was created/restored AT.
|
|
468
|
+
* `startAgentSession` stamps `currentGeneration + 1` (newer than any
|
|
469
|
+
* in-flight hydration); `rehydrateState` stamps its applying generation.
|
|
470
|
+
* A hydration at generation `g` evicts only owned sessions with
|
|
471
|
+
* `hydrationStamp <= g`, so live sessions created after `g` began always
|
|
472
|
+
* survive. Also never snapshotted.
|
|
473
|
+
*/
|
|
474
|
+
hydrationStamp?: number;
|
|
451
475
|
/** Pattern type to detection count mapping */
|
|
452
476
|
prmPatternCounts: Map<string, number>;
|
|
453
477
|
/** Current escalation level (0=none, 1=guidance, 2=strong guidance, 3=hard stop) */
|
|
@@ -1357,9 +1381,15 @@ export declare function buildRehydrationCache(directory: string): Promise<void>;
|
|
|
1357
1381
|
* Merge rules:
|
|
1358
1382
|
* - evidence-derived state: only applied if it advances past existing state
|
|
1359
1383
|
* - plan-only derived state: only applied if it advances past existing state
|
|
1360
|
-
* No-op when
|
|
1384
|
+
* No-op when no cache exists for the session's project.
|
|
1385
|
+
*
|
|
1386
|
+
* Issue #2667: the cache is project-owned. `projectKey` wins when given;
|
|
1387
|
+
* otherwise it resolves from `session.owningProjectKey`. New callers must
|
|
1388
|
+
* ensure ownership is stamped on the session (or pass the key explicitly)
|
|
1389
|
+
* BEFORE calling — a session with no project context intentionally gets no
|
|
1390
|
+
* cache application rather than another project's data.
|
|
1361
1391
|
*/
|
|
1362
|
-
export declare function applyRehydrationCache(session: AgentSessionState): void;
|
|
1392
|
+
export declare function applyRehydrationCache(session: AgentSessionState, projectKey?: string): void;
|
|
1363
1393
|
/**
|
|
1364
1394
|
* Rehydrates session workflow state from durable swarm files.
|
|
1365
1395
|
* Builds (or refreshes) the rehydration cache from disk, then applies it
|
|
@@ -1,4 +1,20 @@
|
|
|
1
1
|
import { validateProjectRoot } from '../evidence/manager.js';
|
|
2
|
+
/**
|
|
3
|
+
* Impact analysis is advisory and must never turn a caller's request into an
|
|
4
|
+
* unbounded workspace scan. These limits are deliberately larger than the
|
|
5
|
+
* 50-file execution cap: a normal repository may have more test files than a
|
|
6
|
+
* single invocation may safely execute, but a pathological repository must
|
|
7
|
+
* still fail closed before it consumes unbounded memory or CPU.
|
|
8
|
+
*/
|
|
9
|
+
export declare const MAX_IMPACT_TEST_FILES = 4096;
|
|
10
|
+
export declare const MAX_IMPACT_TEST_FILE_BYTES: number;
|
|
11
|
+
export declare const MAX_IMPACT_GO_MOD_BYTES: number;
|
|
12
|
+
export declare const MAX_IMPACT_SCAN_BYTES: number;
|
|
13
|
+
export declare const MAX_IMPACT_WALK_ENTRIES = 100000;
|
|
14
|
+
export declare const MAX_IMPACT_SCAN_DEPTH = 32;
|
|
15
|
+
export declare const MAX_IMPACT_CACHE_BYTES: number;
|
|
16
|
+
export declare const MAX_IMPACT_MAP_SOURCES = 10000;
|
|
17
|
+
export declare const MAX_IMPACT_MAP_REFERENCES = 100000;
|
|
2
18
|
export interface TestImpactResult {
|
|
3
19
|
impactedTests: string[];
|
|
4
20
|
unrelatedTests: string[];
|
|
@@ -6,9 +22,24 @@ export interface TestImpactResult {
|
|
|
6
22
|
impactMap: Record<string, string[]>;
|
|
7
23
|
budgetExceeded?: boolean;
|
|
8
24
|
}
|
|
25
|
+
export type ImpactCacheStatus = 'fresh' | 'missing' | 'corrupt' | 'legacy' | 'stale' | 'rebuilt_missing' | 'rebuilt_corrupt' | 'rebuilt_legacy' | 'rebuilt_stale' | 'overflow' | 'overflow_unverified' | 'missing_unverified' | 'corrupt_unverified' | 'legacy_unverified' | 'fresh_unverified';
|
|
26
|
+
export interface ImpactCacheInspection {
|
|
27
|
+
status: ImpactCacheStatus;
|
|
28
|
+
cachePath: string;
|
|
29
|
+
}
|
|
30
|
+
interface TestFileIdentity {
|
|
31
|
+
path: string;
|
|
32
|
+
size: number;
|
|
33
|
+
mtimeMs: number;
|
|
34
|
+
digest: string;
|
|
35
|
+
}
|
|
9
36
|
declare function normalizePath(p: string): string;
|
|
10
|
-
declare function isCacheStale(impactMap: Record<string, string[]>, generatedAtMs: number): boolean;
|
|
37
|
+
declare function isCacheStale(impactMap: Record<string, string[]>, generatedAtMs: number, testFiles?: TestFileIdentity[], cwd?: string): boolean;
|
|
11
38
|
declare function resolveRelativeImport(fromDir: string, importPath: string): string | null;
|
|
39
|
+
declare function findGoModule(fromDir: string): {
|
|
40
|
+
moduleRoot: string;
|
|
41
|
+
modulePath: string;
|
|
42
|
+
} | null;
|
|
12
43
|
/**
|
|
13
44
|
* Test-only: clear the go-module memoization cache. Production code
|
|
14
45
|
* should never need this — the cache is per-call-graph scoped, but tests
|
|
@@ -17,7 +48,10 @@ declare function resolveRelativeImport(fromDir: string, importPath: string): str
|
|
|
17
48
|
declare function _clearGoModuleCache(): void;
|
|
18
49
|
declare function findTestFilesSync(cwd: string): string[];
|
|
19
50
|
declare function extractImports(content: string): string[];
|
|
20
|
-
declare function buildImpactMapInternal(cwd: string): Promise<Record<string, string[]>>;
|
|
51
|
+
declare function buildImpactMapInternal(cwd: string, testFilesOverride?: string[]): Promise<Record<string, string[]>>;
|
|
52
|
+
export declare function getImpactCacheStatus(cwd: string, options?: {
|
|
53
|
+
verify?: boolean;
|
|
54
|
+
}): ImpactCacheInspection;
|
|
21
55
|
export declare const _internals: {
|
|
22
56
|
validateProjectRoot: typeof validateProjectRoot;
|
|
23
57
|
normalizePath: typeof normalizePath;
|
|
@@ -25,11 +59,14 @@ export declare const _internals: {
|
|
|
25
59
|
resolveRelativeImport: typeof resolveRelativeImport;
|
|
26
60
|
findTestFilesSync: typeof findTestFilesSync;
|
|
27
61
|
extractImports: typeof extractImports;
|
|
62
|
+
findGoModule: typeof findGoModule;
|
|
28
63
|
buildImpactMapInternal: typeof buildImpactMapInternal;
|
|
29
64
|
buildImpactMap: typeof buildImpactMap;
|
|
30
65
|
loadImpactMap: typeof loadImpactMap;
|
|
66
|
+
loadImpactMapWithStatus: typeof loadImpactMapWithStatus;
|
|
31
67
|
saveImpactMap: typeof saveImpactMap;
|
|
32
68
|
analyzeImpact: typeof analyzeImpact;
|
|
69
|
+
getImpactCacheStatus: typeof getImpactCacheStatus;
|
|
33
70
|
_clearGoModuleCache: typeof _clearGoModuleCache;
|
|
34
71
|
};
|
|
35
72
|
export declare function buildImpactMap(cwd: string): Promise<Record<string, string[]>>;
|
|
@@ -38,7 +75,12 @@ export interface LoadImpactMapOptions {
|
|
|
38
75
|
* Use for estimation-only reads where slight staleness is acceptable. */
|
|
39
76
|
skipRebuild?: boolean;
|
|
40
77
|
}
|
|
78
|
+
export interface ImpactMapLoadResult {
|
|
79
|
+
map: Record<string, string[]>;
|
|
80
|
+
status: ImpactCacheStatus;
|
|
81
|
+
}
|
|
82
|
+
export declare function loadImpactMapWithStatus(cwd: string, options?: LoadImpactMapOptions): Promise<ImpactMapLoadResult>;
|
|
41
83
|
export declare function loadImpactMap(cwd: string, options?: LoadImpactMapOptions): Promise<Record<string, string[]>>;
|
|
42
|
-
declare function saveImpactMap(cwd: string, impactMap: Record<string, string[]
|
|
43
|
-
export declare function analyzeImpact(changedFiles: string[], cwd: string, budget?: number): Promise<TestImpactResult>;
|
|
84
|
+
declare function saveImpactMap(cwd: string, impactMap: Record<string, string[]>, testFiles?: string[]): Promise<void>;
|
|
85
|
+
export declare function analyzeImpact(changedFiles: string[], cwd: string, budget?: number, impactMapOverride?: Record<string, string[]>): Promise<TestImpactResult>;
|
|
44
86
|
export {};
|
|
@@ -1,8 +1,14 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as path from 'node:path';
|
|
2
2
|
import { createSwarmTool } from './create-tool';
|
|
3
|
-
|
|
3
|
+
declare function normalizeWorkspaceFile(value: unknown, cwd: string, requireExisting: boolean): {
|
|
4
|
+
value: string;
|
|
5
|
+
absolute: string;
|
|
6
|
+
} | {
|
|
7
|
+
error: string;
|
|
8
|
+
};
|
|
4
9
|
export declare const _internals: {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
};
|
|
10
|
+
pathRelative: typeof path.relative;
|
|
11
|
+
normalizeWorkspaceFile: typeof normalizeWorkspaceFile;
|
|
8
12
|
};
|
|
13
|
+
export declare const mutation_test: ReturnType<typeof createSwarmTool>;
|
|
14
|
+
export {};
|