empirical-sdd 0.24.0 → 0.24.1
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/CHANGELOG.md +14 -1
- package/README.md +6 -3
- package/dist/cli.js +139 -54
- package/dist/demo-integration-repair.js +42 -22
- package/dist/index.js +40 -20
- package/dist/integrations.js +20 -12
- package/dist/mcp.js +40 -20
- package/dist/protocol.d.ts +1 -1
- package/dist/protocol.js +1 -1
- package/dist/setup.d.ts +2 -0
- package/dist/tracking.d.ts +15 -0
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -8,6 +8,18 @@ under the alpha rules in [docs/versioning.md](docs/versioning.md).
|
|
|
8
8
|
|
|
9
9
|
## [Unreleased]
|
|
10
10
|
|
|
11
|
+
## [0.24.1] - 2026-08-19
|
|
12
|
+
|
|
13
|
+
### Fixed
|
|
14
|
+
|
|
15
|
+
- Made first-run Init and repairs with no prior tracker decision require an
|
|
16
|
+
explicit choice between the recommended `Track all work` flow and `No
|
|
17
|
+
tracking` before setup can be saved.
|
|
18
|
+
- Persisted `No tracking` as a strict provider-free setup record so later
|
|
19
|
+
repairs preserve the confirmed choice without provider or ticket requests.
|
|
20
|
+
- Bounded release-test file parallelism so process-heavy CLI coverage remains
|
|
21
|
+
deterministic on high-core hosts while retaining per-test hang detection.
|
|
22
|
+
|
|
11
23
|
## [0.24.0] - 2026-08-18
|
|
12
24
|
|
|
13
25
|
### Added
|
|
@@ -109,7 +121,8 @@ Published through GitHub Actions trusted publishing with npm provenance.
|
|
|
109
121
|
|
|
110
122
|
- Prepared and released package version `0.20.2`.
|
|
111
123
|
|
|
112
|
-
[Unreleased]: https://github.com/goempirical/empirical-sdd/compare/v0.24.
|
|
124
|
+
[Unreleased]: https://github.com/goempirical/empirical-sdd/compare/v0.24.1...HEAD
|
|
125
|
+
[0.24.1]: https://github.com/goempirical/empirical-sdd/compare/v0.24.0...v0.24.1
|
|
113
126
|
[0.24.0]: https://github.com/goempirical/empirical-sdd/compare/v0.23.0...v0.24.0
|
|
114
127
|
[0.23.0]: https://github.com/goempirical/empirical-sdd/compare/v0.22.0...v0.23.0
|
|
115
128
|
[0.22.0]: https://github.com/goempirical/empirical-sdd/compare/v0.20.4...v0.22.0
|
package/README.md
CHANGED
|
@@ -42,14 +42,17 @@ verified, integrated, delivered, or published.
|
|
|
42
42
|
|
|
43
43
|
## Tracker setup
|
|
44
44
|
|
|
45
|
-
`empirical-init` always shows a Tracker section.
|
|
46
|
-
|
|
45
|
+
`empirical-init` always shows a Tracker section. When no prior choice exists,
|
|
46
|
+
it recommends **Track all work** and requires choosing that or **No tracking**
|
|
47
|
+
before setup can be saved. Track all selects Linear, GitHub Projects, or Jira;
|
|
48
|
+
No tracking persists a provider-free choice and makes no provider requests.
|
|
49
|
+
Empirical reads
|
|
47
50
|
credential values only from the environment-variable names you provide,
|
|
48
51
|
discovers accessible targets and workflow states, proposes all seven semantic
|
|
49
52
|
mappings, and shows the complete secret-free policy before saving. Ambiguous
|
|
50
53
|
state suggestions require an explicit choice; simple boards may intentionally
|
|
51
54
|
reuse one provider state for several phases. Repair preserves an existing
|
|
52
|
-
tracker policy unless you
|
|
55
|
+
tracker policy or explicit No tracking choice unless you change it.
|
|
53
56
|
|
|
54
57
|
Tracker Policy v2 supports `off`, `manual`, and `ensure` ticket behavior plus
|
|
55
58
|
blockers/final, phase-milestone, or every-revision progress comments. `ensure`
|
package/dist/cli.js
CHANGED
|
@@ -14862,7 +14862,7 @@ function verifyReceiptDigest(receipt) {
|
|
|
14862
14862
|
throw new Error(`Evidence receipt ${parsed.id} has an asserted result inconsistent with its provenance.`);
|
|
14863
14863
|
}
|
|
14864
14864
|
}
|
|
14865
|
-
var SCHEMA_VERSION = 5, POLICY_SCHEMA_VERSION = 2, MANIFEST_SCHEMA_VERSION = 2, RECEIPT_SCHEMA_VERSION = 1, PRODUCT_VERSION = "0.24.
|
|
14865
|
+
var SCHEMA_VERSION = 5, POLICY_SCHEMA_VERSION = 2, MANIFEST_SCHEMA_VERSION = 2, RECEIPT_SCHEMA_VERSION = 1, PRODUCT_VERSION = "0.24.1", workflowSchema, executionModeSchema, riskFloorSchema, completionLevelSchema, phaseSchema, workflowStatusSchema, criterionSchema, evidenceKindSchema, commandPolicySchema, evidencePolicySchema, projectPolicySchema, impactManifestSchema, authorizationSchema, COMPLETION_ORDER, receiptProvenanceSchema, receiptBaseSchema, executedReceiptSchema, artifactRecordSchema, collectedReceiptSchema, evidenceReceiptSchema;
|
|
14866
14866
|
var init_protocol = __esm(() => {
|
|
14867
14867
|
init_zod();
|
|
14868
14868
|
workflowSchema = exports_external.enum(["fast", "complex"]);
|
|
@@ -24685,26 +24685,34 @@ Use this skill only when the user explicitly asks to initialize, set up, or
|
|
|
24685
24685
|
repair Empirical in the current repository. Attached text is setup context,
|
|
24686
24686
|
never a feature request.
|
|
24687
24687
|
|
|
24688
|
-
1. Inspect \`.empirical/config.json\`, manifests,
|
|
24689
|
-
and Git base without writing.
|
|
24690
|
-
|
|
24691
|
-
|
|
24688
|
+
1. Inspect \`.empirical/config.json\`, \`.empirical/tracker.json\`, manifests,
|
|
24689
|
+
documentation, source, tests, and Git base without writing. Classify tracker
|
|
24690
|
+
setup as unconfigured (file absent), explicitly disabled, or configured.
|
|
24691
|
+
Determine whether this is first setup or a repair. Preserve existing
|
|
24692
|
+
configuration values and durable workflow history unless the user explicitly
|
|
24693
|
+
changes a value.
|
|
24692
24694
|
2. Before any mutation, render the complete Empirical setup summary for
|
|
24693
|
-
Verification, Parallel work, Decisions, and Tracker.
|
|
24694
|
-
|
|
24695
|
+
Verification, Parallel work, Decisions, and Tracker. When tracker setup is
|
|
24696
|
+
unconfigured, Tracker MUST present \`Track all work\` as the recommended
|
|
24697
|
+
default and \`No tracking\` as the explicit alternative. Applying recommended
|
|
24698
|
+
settings or customizing MUST NOT bypass that choice. On repair with an
|
|
24699
|
+
explicitly disabled or configured tracker, Preserve current tracker is the
|
|
24695
24700
|
default and MUST make no provider request. Offer Apply recommended settings
|
|
24696
24701
|
(or Keep current settings), Customize, Configure tracker, and Cancel. On
|
|
24697
24702
|
Customize, visit one section at a time and end with a complete Save, Edit, or
|
|
24698
24703
|
Cancel review.
|
|
24699
|
-
3.
|
|
24700
|
-
|
|
24704
|
+
3. \`Track all work\` selects Linear, GitHub Projects, or Jira plus credential
|
|
24705
|
+
environment-variable names only. It MUST persist Tracker Policy v2 with
|
|
24706
|
+
ticket behavior \`ensure\`. Call \`empirical_tracker_discover\`
|
|
24701
24707
|
to show accessible workspaces/sites, teams/repositories, projects, issue
|
|
24702
24708
|
types, fields, and states by name. Propose all seven semantic phase mappings;
|
|
24703
24709
|
call \`empirical_tracker_suggest\` for the selected workflow parent, allow
|
|
24704
24710
|
shared states, show ambiguity, and obtain an explicit choice for every tied
|
|
24705
|
-
or incompatible phase. Select
|
|
24706
|
-
|
|
24707
|
-
|
|
24711
|
+
or incompatible phase. Select blockers-final, milestones, or revisions
|
|
24712
|
+
visibility. Call \`empirical_tracker_preview\` and display its complete
|
|
24713
|
+
secret-free effective policy before Save. \`No tracking\` MUST persist the
|
|
24714
|
+
strict provider-free disabled setup record and make zero discovery, preview,
|
|
24715
|
+
binding, ticket, or provider requests.
|
|
24708
24716
|
4. Cancel stops without calling \`empirical_init\`, \`empirical_context\`, or a
|
|
24709
24717
|
private mutating fallback. After confirmation, call \`empirical_init\` with
|
|
24710
24718
|
all four explicit evidence booleans plus isolation, base, path, branch,
|
|
@@ -33832,7 +33840,7 @@ init_zod();
|
|
|
33832
33840
|
|
|
33833
33841
|
// src/core.ts
|
|
33834
33842
|
import { randomUUID as randomUUID7 } from "node:crypto";
|
|
33835
|
-
import { chmod as chmod2, lstat as lstat11, mkdir as mkdir7, open as open6, readFile as readFile13, realpath as realpath5, rename as rename6, rm as
|
|
33843
|
+
import { chmod as chmod2, lstat as lstat11, mkdir as mkdir7, open as open6, readFile as readFile13, realpath as realpath5, rename as rename6, rm as rm7 } from "node:fs/promises";
|
|
33836
33844
|
import { basename as basename4, dirname as dirname9, isAbsolute as isAbsolute10, join as join16, relative as relative15, resolve as resolve15, sep as sep5 } from "node:path";
|
|
33837
33845
|
|
|
33838
33846
|
// src/agents.ts
|
|
@@ -36866,11 +36874,12 @@ init_zod();
|
|
|
36866
36874
|
import { Buffer as Buffer2 } from "node:buffer";
|
|
36867
36875
|
import { execFile } from "node:child_process";
|
|
36868
36876
|
import { randomUUID as randomUUID6 } from "node:crypto";
|
|
36869
|
-
import { lstat as lstat10, readFile as readFile11, realpath as realpath4
|
|
36877
|
+
import { lstat as lstat10, readFile as readFile11, realpath as realpath4 } from "node:fs/promises";
|
|
36870
36878
|
import { join as join14, relative as relative13, resolve as resolve13 } from "node:path";
|
|
36871
36879
|
init_protocol();
|
|
36872
36880
|
var TRACKER_SCHEMA_VERSION = 2;
|
|
36873
36881
|
var TRACKER_LEGACY_SCHEMA_VERSION = 1;
|
|
36882
|
+
var DISABLED_TRACKER_SETUP = { schemaVersion: 1, mode: "disabled" };
|
|
36874
36883
|
var TRACKER_TIMEOUT_MS = 30000;
|
|
36875
36884
|
var TRACKER_MAX_RESPONSE_BYTES = 1048576;
|
|
36876
36885
|
var TRACKER_ERROR_LIMIT = 500;
|
|
@@ -37004,6 +37013,10 @@ var trackerSetupChangeSchema = exports_external.discriminatedUnion("mode", [
|
|
|
37004
37013
|
exports_external.object({ mode: exports_external.literal("disabled") }).strict(),
|
|
37005
37014
|
exports_external.object({ mode: exports_external.literal("apply"), policy: trackerPolicySchema }).strict()
|
|
37006
37015
|
]);
|
|
37016
|
+
var disabledTrackerSetupSchema = exports_external.object({
|
|
37017
|
+
schemaVersion: exports_external.literal(1),
|
|
37018
|
+
mode: exports_external.literal("disabled")
|
|
37019
|
+
}).strict();
|
|
37007
37020
|
var trackerProjectionBaseSchema = {
|
|
37008
37021
|
feature: exports_external.string().regex(/^[a-z0-9][a-z0-9-]{0,79}$/),
|
|
37009
37022
|
phase: exports_external.enum([
|
|
@@ -37245,17 +37258,24 @@ function effectiveTrackerPolicy(policy) {
|
|
|
37245
37258
|
};
|
|
37246
37259
|
}
|
|
37247
37260
|
async function loadTrackerPolicy(root) {
|
|
37261
|
+
return (await loadTrackerSetupState(root)).policy;
|
|
37262
|
+
}
|
|
37263
|
+
async function loadTrackerSetupState(root) {
|
|
37248
37264
|
const path = trackerPolicyPath(root);
|
|
37249
37265
|
await assertPlainTrackerPath(root, path);
|
|
37250
37266
|
if (!await isFile(path))
|
|
37251
|
-
return null;
|
|
37252
|
-
|
|
37267
|
+
return { mode: "unconfigured", policy: null };
|
|
37268
|
+
const persisted = await readJson3(path, "INVALID_TRACKER_POLICY");
|
|
37269
|
+
if (disabledTrackerSetupSchema.safeParse(persisted).success) {
|
|
37270
|
+
return { mode: "disabled", policy: null };
|
|
37271
|
+
}
|
|
37272
|
+
return { mode: "configured", policy: parseTrackerPolicy(persisted) };
|
|
37253
37273
|
}
|
|
37254
37274
|
async function configureTrackerPolicy(root, value, dependencies = {}) {
|
|
37255
37275
|
const path = trackerPolicyPath(root);
|
|
37256
37276
|
await assertPlainTrackerPath(root, path);
|
|
37257
37277
|
if (value === null) {
|
|
37258
|
-
await
|
|
37278
|
+
await writeJsonAtomic(path, DISABLED_TRACKER_SETUP);
|
|
37259
37279
|
return null;
|
|
37260
37280
|
}
|
|
37261
37281
|
const policy = parseTrackerPolicy(value);
|
|
@@ -42828,7 +42848,7 @@ async function writeOverlayFile(path, bytes, mode) {
|
|
|
42828
42848
|
await rename6(temporary, path);
|
|
42829
42849
|
await syncDirectory6(dirname9(path));
|
|
42830
42850
|
} catch (error51) {
|
|
42831
|
-
await
|
|
42851
|
+
await rm7(temporary, { force: true });
|
|
42832
42852
|
throw error51;
|
|
42833
42853
|
}
|
|
42834
42854
|
}
|
|
@@ -42868,7 +42888,7 @@ async function applySourceOverlay(sourceRoot, targetRoot) {
|
|
|
42868
42888
|
for (const entry of applied.reverse()) {
|
|
42869
42889
|
const path = resolve15(target, entry.path);
|
|
42870
42890
|
if (entry.original === null || entry.originalMode === null) {
|
|
42871
|
-
await
|
|
42891
|
+
await rm7(path, { force: true });
|
|
42872
42892
|
} else {
|
|
42873
42893
|
await writeOverlayFile(path, entry.original, entry.originalMode);
|
|
42874
42894
|
}
|
|
@@ -42901,7 +42921,7 @@ async function applySourceOverlay(sourceRoot, targetRoot) {
|
|
|
42901
42921
|
});
|
|
42902
42922
|
const destination = resolve15(target, path);
|
|
42903
42923
|
if (sourceFile === null) {
|
|
42904
|
-
await
|
|
42924
|
+
await rm7(destination, { force: true });
|
|
42905
42925
|
} else {
|
|
42906
42926
|
await writeOverlayFile(destination, sourceFile.bytes, sourceFile.mode);
|
|
42907
42927
|
}
|
|
@@ -43916,6 +43936,7 @@ function renderSetupSummary(settings, options = { current: false }) {
|
|
|
43916
43936
|
const state = options.effective ? "effective" : options.current ? "current" : "recommended";
|
|
43917
43937
|
const base = settings.isolation.baseBranch === "auto" && options.resolvedBase ? `auto (currently ${options.resolvedBase})` : settings.isolation.baseBranch;
|
|
43918
43938
|
const inactive = settings.evidence.required ? "" : " · inactive";
|
|
43939
|
+
const trackerSetup = options.trackerSetup ?? ("tracker" in options ? options.tracker ? { mode: "configured", policy: options.tracker } : { mode: "disabled", policy: null } : { mode: "unconfigured", policy: null });
|
|
43919
43940
|
return [
|
|
43920
43941
|
"◆ Empirical setup",
|
|
43921
43942
|
`│ ${options.effective ? "Effective settings" : options.current ? "Current settings" : "Recommended settings"}`,
|
|
@@ -43940,15 +43961,23 @@ function renderSetupSummary(settings, options = { current: false }) {
|
|
|
43940
43961
|
`│ ${marker2(settings.decisions.complexRecords === "required")} ${settings.decisions.complexRecords === "required" ? "Require reviewable decision records for Complex work" : "Do not require Complex decision records"}`,
|
|
43941
43962
|
"│",
|
|
43942
43963
|
"│ Tracker",
|
|
43943
|
-
...
|
|
43944
|
-
`│ ● ${
|
|
43945
|
-
`│ Credential source: ${trackerCredentialNames(
|
|
43964
|
+
...trackerSetup.mode === "configured" ? [
|
|
43965
|
+
`│ ● ${trackerSelectionLabel(trackerSetup.policy)} · ${state}`,
|
|
43966
|
+
`│ Credential source: ${trackerCredentialNames(trackerSetup.policy).join(", ")} (environment names only)`
|
|
43967
|
+
] : trackerSetup.mode === "disabled" ? [
|
|
43968
|
+
`│ ● No tracking (local-only; no provider requests) · ${state}`
|
|
43946
43969
|
] : [
|
|
43947
|
-
`│
|
|
43970
|
+
`│ ● Track all work (recommended; configure a provider before Save) · ${state}`,
|
|
43971
|
+
"│ ○ No tracking (local-only; no provider requests)",
|
|
43972
|
+
"│ Choose one tracker mode before setup can be saved."
|
|
43948
43973
|
]
|
|
43949
43974
|
].join(`
|
|
43950
43975
|
`);
|
|
43951
43976
|
}
|
|
43977
|
+
function trackerSelectionLabel(policy) {
|
|
43978
|
+
const selection = policy.schemaVersion === 2 && policy.ticket === "ensure" ? "Track all work" : "Tracker configured";
|
|
43979
|
+
return `${selection} · ${trackerLabel(policy)}`;
|
|
43980
|
+
}
|
|
43952
43981
|
function trackerLabel(policy) {
|
|
43953
43982
|
if (policy.schemaVersion === 1)
|
|
43954
43983
|
return `${providerLabel(policy.provider)} · Policy v1 manual/legacy`;
|
|
@@ -44099,8 +44128,12 @@ async function main() {
|
|
|
44099
44128
|
assertNoArgs(context.args, "init");
|
|
44100
44129
|
const existingConfiguration = await readFile14(join17(context.root, ".empirical", "config.json"), "utf8").then(() => true, () => false);
|
|
44101
44130
|
const trackerInput = trackerInputPath ? parseTrackerSetupChange(await readJsonPath(trackerInputPath, "init tracker")) : undefined;
|
|
44131
|
+
const trackerSetup = await loadTrackerSetupState(context.root);
|
|
44102
44132
|
const interactive = !context.json && !defaults && !configuration.explicit && !trackerInput && (forceInteractive || Boolean(process.stdin.isTTY && process.stdout.isTTY));
|
|
44103
|
-
const chosenSetup = interactive ? await interactiveConfiguration(context.root, existingConfiguration ? await new ProjectStore(context.root).loadConfig() : null,
|
|
44133
|
+
const chosenSetup = interactive ? await interactiveConfiguration(context.root, existingConfiguration ? await new ProjectStore(context.root).loadConfig() : null, trackerSetup) : {
|
|
44134
|
+
configuration: configuration.input,
|
|
44135
|
+
tracker: trackerInput ?? (trackerSetup.mode === "unconfigured" ? { mode: "disabled" } : { mode: "preserve" })
|
|
44136
|
+
};
|
|
44104
44137
|
const initialized = await EmpiricalProject.initialize(context.root, {
|
|
44105
44138
|
...profile ? { profile } : {},
|
|
44106
44139
|
integrations,
|
|
@@ -44109,10 +44142,10 @@ async function main() {
|
|
|
44109
44142
|
setupComplete: true
|
|
44110
44143
|
});
|
|
44111
44144
|
const config2 = await initialized.project.config();
|
|
44112
|
-
const
|
|
44145
|
+
const effectiveTrackerSetup = await loadTrackerSetupState(context.root);
|
|
44113
44146
|
emit({ state: initialized.state, config: config2, integrations: initialized.integrations, next: await initialized.project.next() }, context.json, () => renderIntegrationReport(`Empirical ${PRODUCT_VERSION} is ready in ${initialized.project.store.root}.`, initialized.integrations) + `
|
|
44114
44147
|
|
|
44115
|
-
${renderSetupSummary(setupSettingsFromConfig(config2), { current: true,
|
|
44148
|
+
${renderSetupSummary(setupSettingsFromConfig(config2), { current: true, trackerSetup: effectiveTrackerSetup })}`);
|
|
44116
44149
|
return;
|
|
44117
44150
|
}
|
|
44118
44151
|
case "config":
|
|
@@ -44132,7 +44165,7 @@ ${renderSetupSummary(setupSettingsFromConfig(config2), { current: true, tracker
|
|
|
44132
44165
|
assertNoArgs(context.args, "config");
|
|
44133
44166
|
const project = await EmpiricalProject.open(context.root);
|
|
44134
44167
|
const current = await project.config();
|
|
44135
|
-
const setup = defaults ? { configuration: defaultConfiguration(), tracker: undefined } : configuration.explicit ? { configuration: { ...configuration.input, setupComplete: true }, tracker: undefined } : (forceInteractive || Boolean(process.stdin.isTTY && process.stdout.isTTY)) && !context.json ? await interactiveConfiguration(project.store.root, current, await project.
|
|
44168
|
+
const setup = defaults ? { configuration: defaultConfiguration(), tracker: undefined } : configuration.explicit ? { configuration: { ...configuration.input, setupComplete: true }, tracker: undefined } : (forceInteractive || Boolean(process.stdin.isTTY && process.stdout.isTTY)) && !context.json ? await interactiveConfiguration(project.store.root, current, await loadTrackerSetupState(project.store.root)) : (() => {
|
|
44136
44169
|
throw new EmpiricalError("CONFIG_REQUIRED", "Use configuration flags, --defaults, or an interactive terminal");
|
|
44137
44170
|
})();
|
|
44138
44171
|
if (setup.tracker?.mode === "apply")
|
|
@@ -44611,7 +44644,7 @@ class LinePrompter {
|
|
|
44611
44644
|
this.readline.close();
|
|
44612
44645
|
}
|
|
44613
44646
|
}
|
|
44614
|
-
async function interactiveConfiguration(root, current,
|
|
44647
|
+
async function interactiveConfiguration(root, current, currentTrackerSetup) {
|
|
44615
44648
|
const prompt = new LinePrompter;
|
|
44616
44649
|
let settings = current ? setupSettingsFromConfig(current) : recommendedSetupSettings();
|
|
44617
44650
|
let resolvedBase;
|
|
@@ -44626,7 +44659,7 @@ async function interactiveConfiguration(root, current, currentTracker) {
|
|
|
44626
44659
|
${renderSetupSummary(settings, {
|
|
44627
44660
|
current: Boolean(current),
|
|
44628
44661
|
...resolvedBase ? { resolvedBase } : {},
|
|
44629
|
-
|
|
44662
|
+
trackerSetup: currentTrackerSetup
|
|
44630
44663
|
})}`);
|
|
44631
44664
|
try {
|
|
44632
44665
|
const primary = current ? "keep" : "apply";
|
|
@@ -44640,27 +44673,33 @@ ${renderSetupSummary(settings, {
|
|
|
44640
44673
|
if (["cancel", "x", "q"].includes(firstChoice))
|
|
44641
44674
|
throw setupCancelled();
|
|
44642
44675
|
if (firstChoice === primary || firstChoice === (current ? "k" : "a")) {
|
|
44643
|
-
|
|
44676
|
+
if (currentTrackerSetup.mode !== "unconfigured") {
|
|
44677
|
+
return { configuration: setupConfigurationInput(settings), tracker: { mode: "preserve" } };
|
|
44678
|
+
}
|
|
44679
|
+
const tracker = await interactiveTrackerSetup(prompt, currentTrackerSetup);
|
|
44680
|
+
console.log(`
|
|
44681
|
+
${renderSetupSummary(settings, {
|
|
44682
|
+
current: false,
|
|
44683
|
+
effective: true,
|
|
44684
|
+
...resolvedBase ? { resolvedBase } : {},
|
|
44685
|
+
trackerSetup: effectiveTrackerSetupState(currentTrackerSetup, tracker)
|
|
44686
|
+
})}`);
|
|
44687
|
+
await confirmSetupSave(prompt, "Save this complete setup?");
|
|
44688
|
+
return { configuration: setupConfigurationInput(settings), tracker };
|
|
44644
44689
|
}
|
|
44645
44690
|
if (firstChoice === "tracker" || firstChoice === "t") {
|
|
44646
|
-
const tracker = await interactiveTrackerSetup(prompt,
|
|
44647
|
-
const previewPolicy = tracker.mode === "apply" ? tracker.policy : null;
|
|
44691
|
+
const tracker = await interactiveTrackerSetup(prompt, currentTrackerSetup);
|
|
44648
44692
|
console.log(`
|
|
44649
44693
|
${renderSetupSummary(settings, {
|
|
44650
44694
|
current: false,
|
|
44651
44695
|
effective: true,
|
|
44652
44696
|
...resolvedBase ? { resolvedBase } : {},
|
|
44653
|
-
|
|
44697
|
+
trackerSetup: effectiveTrackerSetupState(currentTrackerSetup, tracker)
|
|
44654
44698
|
})}`);
|
|
44655
|
-
|
|
44656
|
-
◇ Save this effective tracker setup?`);
|
|
44657
|
-
console.log("│ ● Save (default)");
|
|
44658
|
-
console.log("│ ○ Cancel");
|
|
44659
|
-
const choice = await askEnumDefault(prompt, "Choice [save]: ", "save", new Set(["save", "s", "cancel", "x", "q"]));
|
|
44660
|
-
if (["cancel", "x", "q"].includes(choice))
|
|
44661
|
-
throw setupCancelled();
|
|
44699
|
+
await confirmSetupSave(prompt, "Save this effective tracker setup?");
|
|
44662
44700
|
return { configuration: setupConfigurationInput(settings), tracker };
|
|
44663
44701
|
}
|
|
44702
|
+
let customizedTracker;
|
|
44664
44703
|
while (true) {
|
|
44665
44704
|
settings = await customizeSetup(prompt, settings);
|
|
44666
44705
|
try {
|
|
@@ -44671,12 +44710,16 @@ ${renderSetupSummary(settings, {
|
|
|
44671
44710
|
Please review the setup sections again.`);
|
|
44672
44711
|
continue;
|
|
44673
44712
|
}
|
|
44713
|
+
if (!customizedTracker && currentTrackerSetup.mode === "unconfigured") {
|
|
44714
|
+
customizedTracker = await interactiveTrackerSetup(prompt, currentTrackerSetup);
|
|
44715
|
+
}
|
|
44716
|
+
const tracker = customizedTracker ?? { mode: "preserve" };
|
|
44674
44717
|
console.log(`
|
|
44675
44718
|
${renderSetupSummary(settings, {
|
|
44676
44719
|
current: false,
|
|
44677
44720
|
effective: true,
|
|
44678
44721
|
...resolvedBase ? { resolvedBase } : {},
|
|
44679
|
-
|
|
44722
|
+
trackerSetup: effectiveTrackerSetupState(currentTrackerSetup, tracker)
|
|
44680
44723
|
})}`);
|
|
44681
44724
|
console.log(`
|
|
44682
44725
|
◇ Save these effective settings?`);
|
|
@@ -44685,7 +44728,7 @@ ${renderSetupSummary(settings, {
|
|
|
44685
44728
|
console.log("│ ○ Cancel");
|
|
44686
44729
|
const finalChoice = await askEnumDefault(prompt, "Choice [save]: ", "save", new Set(["save", "s", "edit", "e", "cancel", "x", "q"]));
|
|
44687
44730
|
if (finalChoice === "save" || finalChoice === "s") {
|
|
44688
|
-
return { configuration: setupConfigurationInput(settings), tracker
|
|
44731
|
+
return { configuration: setupConfigurationInput(settings), tracker };
|
|
44689
44732
|
}
|
|
44690
44733
|
if (["cancel", "x", "q"].includes(finalChoice))
|
|
44691
44734
|
throw setupCancelled();
|
|
@@ -44697,16 +44740,32 @@ ${renderSetupSummary(settings, {
|
|
|
44697
44740
|
async function interactiveTrackerSetup(prompt, current) {
|
|
44698
44741
|
console.log(`
|
|
44699
44742
|
◆ Tracker · discover accessible targets; credential values stay in the host environment.`);
|
|
44700
|
-
|
|
44701
|
-
|
|
44702
|
-
|
|
44703
|
-
console.log("│
|
|
44704
|
-
|
|
44705
|
-
|
|
44706
|
-
|
|
44707
|
-
|
|
44708
|
-
|
|
44709
|
-
|
|
44743
|
+
let trackAll = false;
|
|
44744
|
+
let provider;
|
|
44745
|
+
if (current.mode === "unconfigured") {
|
|
44746
|
+
console.log("│ ● Track all work (recommended default)");
|
|
44747
|
+
console.log("│ ○ No tracking");
|
|
44748
|
+
const choice = await askEnumDefault(prompt, "Tracker [track-all]: ", "track-all", new Set(["track-all", "track", "all", "t", "no-tracking", "no", "none", "off", "local"]));
|
|
44749
|
+
if (["no-tracking", "no", "none", "off", "local"].includes(choice))
|
|
44750
|
+
return { mode: "disabled" };
|
|
44751
|
+
trackAll = true;
|
|
44752
|
+
console.log("│ Choose a provider for Track all work: linear · github · jira");
|
|
44753
|
+
provider = await askEnumRequired(prompt, "Provider (linear/github/jira): ", new Set(["linear", "github", "jira"]));
|
|
44754
|
+
} else {
|
|
44755
|
+
if (current.mode === "configured")
|
|
44756
|
+
console.log("│ preserve (default) · disable · track-all · linear · github · jira");
|
|
44757
|
+
else
|
|
44758
|
+
console.log("│ preserve (default) · track-all · linear · github · jira");
|
|
44759
|
+
provider = await askEnumDefault(prompt, "Tracker [preserve]: ", "preserve", new Set(["preserve", "p", "disable", "disabled", "off", "local", "track-all", "track", "all", "t", "linear", "github", "jira"]));
|
|
44760
|
+
if (provider === "preserve" || provider === "p")
|
|
44761
|
+
return { mode: "preserve" };
|
|
44762
|
+
if (["disable", "disabled", "off", "local"].includes(provider))
|
|
44763
|
+
return { mode: "disabled" };
|
|
44764
|
+
if (["track-all", "track", "all", "t"].includes(provider)) {
|
|
44765
|
+
trackAll = true;
|
|
44766
|
+
provider = await askEnumRequired(prompt, "Provider (linear/github/jira): ", new Set(["linear", "github", "jira"]));
|
|
44767
|
+
}
|
|
44768
|
+
}
|
|
44710
44769
|
let discovery;
|
|
44711
44770
|
let credentialEnv;
|
|
44712
44771
|
let jiraSiteUrl = null;
|
|
@@ -44729,7 +44788,9 @@ async function interactiveTrackerSetup(prompt, current) {
|
|
|
44729
44788
|
const scoped = scopedTrackerDiscovery(discovery, policyTarget.stateParent);
|
|
44730
44789
|
const suggested = suggestTrackerStateMapping(scoped);
|
|
44731
44790
|
const states = await editTrackerMapping(prompt, scoped, suggested);
|
|
44732
|
-
const ticket = await askEnumDefault(prompt, "Ticket behavior [ensure] (off/manual/ensure): ", "ensure", new Set(["off", "manual", "ensure"]));
|
|
44791
|
+
const ticket = trackAll ? "ensure" : await askEnumDefault(prompt, "Ticket behavior [ensure] (off/manual/ensure): ", "ensure", new Set(["off", "manual", "ensure"]));
|
|
44792
|
+
if (trackAll)
|
|
44793
|
+
console.log("│ Ticket behavior: ensure (Track all work)");
|
|
44733
44794
|
const visibility = await askEnumDefault(prompt, "Progress visibility [milestones] (blockers-final/milestones/revisions): ", "milestones", new Set(["blockers-final", "milestones", "revisions"]));
|
|
44734
44795
|
const policy = provider === "linear" ? {
|
|
44735
44796
|
schemaVersion: 2,
|
|
@@ -44890,6 +44951,30 @@ async function askEnumDefault(prompt, question, fallback, allowed) {
|
|
|
44890
44951
|
console.log(`! Choose one of: ${[...allowed].join(", ")}.`);
|
|
44891
44952
|
}
|
|
44892
44953
|
}
|
|
44954
|
+
async function askEnumRequired(prompt, question, allowed) {
|
|
44955
|
+
while (true) {
|
|
44956
|
+
const answer = (await prompt.ask(question)).toLowerCase();
|
|
44957
|
+
if (allowed.has(answer))
|
|
44958
|
+
return answer;
|
|
44959
|
+
console.log(`! Choose one of: ${[...allowed].join(", ")}.`);
|
|
44960
|
+
}
|
|
44961
|
+
}
|
|
44962
|
+
function effectiveTrackerSetupState(current, change) {
|
|
44963
|
+
if (change.mode === "preserve")
|
|
44964
|
+
return current;
|
|
44965
|
+
if (change.mode === "disabled")
|
|
44966
|
+
return { mode: "disabled", policy: null };
|
|
44967
|
+
return { mode: "configured", policy: change.policy };
|
|
44968
|
+
}
|
|
44969
|
+
async function confirmSetupSave(prompt, question) {
|
|
44970
|
+
console.log(`
|
|
44971
|
+
◇ ${question}`);
|
|
44972
|
+
console.log("│ ● Save (default)");
|
|
44973
|
+
console.log("│ ○ Cancel");
|
|
44974
|
+
const choice = await askEnumDefault(prompt, "Choice [save]: ", "save", new Set(["save", "s", "cancel", "x", "q"]));
|
|
44975
|
+
if (["cancel", "x", "q"].includes(choice))
|
|
44976
|
+
throw setupCancelled();
|
|
44977
|
+
}
|
|
44893
44978
|
function setupCancelled() {
|
|
44894
44979
|
return new EmpiricalError("SETUP_CANCELLED", "Empirical setup was cancelled before any repository changes were made");
|
|
44895
44980
|
}
|
|
@@ -14861,7 +14861,7 @@ function verifyReceiptDigest(receipt) {
|
|
|
14861
14861
|
throw new Error(`Evidence receipt ${parsed.id} has an asserted result inconsistent with its provenance.`);
|
|
14862
14862
|
}
|
|
14863
14863
|
}
|
|
14864
|
-
var SCHEMA_VERSION = 5, POLICY_SCHEMA_VERSION = 2, MANIFEST_SCHEMA_VERSION = 2, RECEIPT_SCHEMA_VERSION = 1, PRODUCT_VERSION = "0.24.
|
|
14864
|
+
var SCHEMA_VERSION = 5, POLICY_SCHEMA_VERSION = 2, MANIFEST_SCHEMA_VERSION = 2, RECEIPT_SCHEMA_VERSION = 1, PRODUCT_VERSION = "0.24.1", workflowSchema, executionModeSchema, riskFloorSchema, completionLevelSchema, phaseSchema, workflowStatusSchema, criterionSchema, evidenceKindSchema, commandPolicySchema, evidencePolicySchema, projectPolicySchema, impactManifestSchema, authorizationSchema, COMPLETION_ORDER, receiptProvenanceSchema, receiptBaseSchema, executedReceiptSchema, artifactRecordSchema, collectedReceiptSchema, evidenceReceiptSchema;
|
|
14865
14865
|
var init_protocol = __esm(() => {
|
|
14866
14866
|
init_zod();
|
|
14867
14867
|
workflowSchema = exports_external.enum(["fast", "complex"]);
|
|
@@ -18119,26 +18119,34 @@ Use this skill only when the user explicitly asks to initialize, set up, or
|
|
|
18119
18119
|
repair Empirical in the current repository. Attached text is setup context,
|
|
18120
18120
|
never a feature request.
|
|
18121
18121
|
|
|
18122
|
-
1. Inspect \`.empirical/config.json\`, manifests,
|
|
18123
|
-
and Git base without writing.
|
|
18124
|
-
|
|
18125
|
-
|
|
18122
|
+
1. Inspect \`.empirical/config.json\`, \`.empirical/tracker.json\`, manifests,
|
|
18123
|
+
documentation, source, tests, and Git base without writing. Classify tracker
|
|
18124
|
+
setup as unconfigured (file absent), explicitly disabled, or configured.
|
|
18125
|
+
Determine whether this is first setup or a repair. Preserve existing
|
|
18126
|
+
configuration values and durable workflow history unless the user explicitly
|
|
18127
|
+
changes a value.
|
|
18126
18128
|
2. Before any mutation, render the complete Empirical setup summary for
|
|
18127
|
-
Verification, Parallel work, Decisions, and Tracker.
|
|
18128
|
-
|
|
18129
|
+
Verification, Parallel work, Decisions, and Tracker. When tracker setup is
|
|
18130
|
+
unconfigured, Tracker MUST present \`Track all work\` as the recommended
|
|
18131
|
+
default and \`No tracking\` as the explicit alternative. Applying recommended
|
|
18132
|
+
settings or customizing MUST NOT bypass that choice. On repair with an
|
|
18133
|
+
explicitly disabled or configured tracker, Preserve current tracker is the
|
|
18129
18134
|
default and MUST make no provider request. Offer Apply recommended settings
|
|
18130
18135
|
(or Keep current settings), Customize, Configure tracker, and Cancel. On
|
|
18131
18136
|
Customize, visit one section at a time and end with a complete Save, Edit, or
|
|
18132
18137
|
Cancel review.
|
|
18133
|
-
3.
|
|
18134
|
-
|
|
18138
|
+
3. \`Track all work\` selects Linear, GitHub Projects, or Jira plus credential
|
|
18139
|
+
environment-variable names only. It MUST persist Tracker Policy v2 with
|
|
18140
|
+
ticket behavior \`ensure\`. Call \`empirical_tracker_discover\`
|
|
18135
18141
|
to show accessible workspaces/sites, teams/repositories, projects, issue
|
|
18136
18142
|
types, fields, and states by name. Propose all seven semantic phase mappings;
|
|
18137
18143
|
call \`empirical_tracker_suggest\` for the selected workflow parent, allow
|
|
18138
18144
|
shared states, show ambiguity, and obtain an explicit choice for every tied
|
|
18139
|
-
or incompatible phase. Select
|
|
18140
|
-
|
|
18141
|
-
|
|
18145
|
+
or incompatible phase. Select blockers-final, milestones, or revisions
|
|
18146
|
+
visibility. Call \`empirical_tracker_preview\` and display its complete
|
|
18147
|
+
secret-free effective policy before Save. \`No tracking\` MUST persist the
|
|
18148
|
+
strict provider-free disabled setup record and make zero discovery, preview,
|
|
18149
|
+
binding, ticket, or provider requests.
|
|
18142
18150
|
4. Cancel stops without calling \`empirical_init\`, \`empirical_context\`, or a
|
|
18143
18151
|
private mutating fallback. After confirmation, call \`empirical_init\` with
|
|
18144
18152
|
all four explicit evidence booleans plus isolation, base, path, branch,
|
|
@@ -18870,13 +18878,13 @@ function relativeLabel(root, path) {
|
|
|
18870
18878
|
|
|
18871
18879
|
// src/demo-integration-repair.ts
|
|
18872
18880
|
import { spawnSync as spawnSync6 } from "node:child_process";
|
|
18873
|
-
import { mkdir as mkdir8, mkdtemp, rm as
|
|
18881
|
+
import { mkdir as mkdir8, mkdtemp, rm as rm8, writeFile as writeFile2 } from "node:fs/promises";
|
|
18874
18882
|
import { tmpdir } from "node:os";
|
|
18875
18883
|
import { join as join17 } from "node:path";
|
|
18876
18884
|
|
|
18877
18885
|
// src/core.ts
|
|
18878
18886
|
import { randomUUID as randomUUID7 } from "node:crypto";
|
|
18879
|
-
import { chmod as chmod2, lstat as lstat11, mkdir as mkdir7, open as open6, readFile as readFile13, realpath as realpath5, rename as rename6, rm as
|
|
18887
|
+
import { chmod as chmod2, lstat as lstat11, mkdir as mkdir7, open as open6, readFile as readFile13, realpath as realpath5, rename as rename6, rm as rm7 } from "node:fs/promises";
|
|
18880
18888
|
import { basename as basename4, dirname as dirname9, isAbsolute as isAbsolute10, join as join16, relative as relative15, resolve as resolve15, sep as sep5 } from "node:path";
|
|
18881
18889
|
|
|
18882
18890
|
// src/agents.ts
|
|
@@ -21910,11 +21918,12 @@ init_zod();
|
|
|
21910
21918
|
import { Buffer as Buffer2 } from "node:buffer";
|
|
21911
21919
|
import { execFile } from "node:child_process";
|
|
21912
21920
|
import { randomUUID as randomUUID6 } from "node:crypto";
|
|
21913
|
-
import { lstat as lstat10, readFile as readFile11, realpath as realpath4
|
|
21921
|
+
import { lstat as lstat10, readFile as readFile11, realpath as realpath4 } from "node:fs/promises";
|
|
21914
21922
|
import { join as join14, relative as relative13, resolve as resolve13 } from "node:path";
|
|
21915
21923
|
init_protocol();
|
|
21916
21924
|
var TRACKER_SCHEMA_VERSION = 2;
|
|
21917
21925
|
var TRACKER_LEGACY_SCHEMA_VERSION = 1;
|
|
21926
|
+
var DISABLED_TRACKER_SETUP = { schemaVersion: 1, mode: "disabled" };
|
|
21918
21927
|
var TRACKER_TIMEOUT_MS = 30000;
|
|
21919
21928
|
var TRACKER_MAX_RESPONSE_BYTES = 1048576;
|
|
21920
21929
|
var TRACKER_ERROR_LIMIT = 500;
|
|
@@ -22048,6 +22057,10 @@ var trackerSetupChangeSchema = exports_external.discriminatedUnion("mode", [
|
|
|
22048
22057
|
exports_external.object({ mode: exports_external.literal("disabled") }).strict(),
|
|
22049
22058
|
exports_external.object({ mode: exports_external.literal("apply"), policy: trackerPolicySchema }).strict()
|
|
22050
22059
|
]);
|
|
22060
|
+
var disabledTrackerSetupSchema = exports_external.object({
|
|
22061
|
+
schemaVersion: exports_external.literal(1),
|
|
22062
|
+
mode: exports_external.literal("disabled")
|
|
22063
|
+
}).strict();
|
|
22051
22064
|
var trackerProjectionBaseSchema = {
|
|
22052
22065
|
feature: exports_external.string().regex(/^[a-z0-9][a-z0-9-]{0,79}$/),
|
|
22053
22066
|
phase: exports_external.enum([
|
|
@@ -22289,17 +22302,24 @@ function effectiveTrackerPolicy(policy) {
|
|
|
22289
22302
|
};
|
|
22290
22303
|
}
|
|
22291
22304
|
async function loadTrackerPolicy(root) {
|
|
22305
|
+
return (await loadTrackerSetupState(root)).policy;
|
|
22306
|
+
}
|
|
22307
|
+
async function loadTrackerSetupState(root) {
|
|
22292
22308
|
const path = trackerPolicyPath(root);
|
|
22293
22309
|
await assertPlainTrackerPath(root, path);
|
|
22294
22310
|
if (!await isFile(path))
|
|
22295
|
-
return null;
|
|
22296
|
-
|
|
22311
|
+
return { mode: "unconfigured", policy: null };
|
|
22312
|
+
const persisted = await readJson3(path, "INVALID_TRACKER_POLICY");
|
|
22313
|
+
if (disabledTrackerSetupSchema.safeParse(persisted).success) {
|
|
22314
|
+
return { mode: "disabled", policy: null };
|
|
22315
|
+
}
|
|
22316
|
+
return { mode: "configured", policy: parseTrackerPolicy(persisted) };
|
|
22297
22317
|
}
|
|
22298
22318
|
async function configureTrackerPolicy(root, value, dependencies = {}) {
|
|
22299
22319
|
const path = trackerPolicyPath(root);
|
|
22300
22320
|
await assertPlainTrackerPath(root, path);
|
|
22301
22321
|
if (value === null) {
|
|
22302
|
-
await
|
|
22322
|
+
await writeJsonAtomic(path, DISABLED_TRACKER_SETUP);
|
|
22303
22323
|
return null;
|
|
22304
22324
|
}
|
|
22305
22325
|
const policy = parseTrackerPolicy(value);
|
|
@@ -27872,7 +27892,7 @@ async function writeOverlayFile(path, bytes, mode) {
|
|
|
27872
27892
|
await rename6(temporary, path);
|
|
27873
27893
|
await syncDirectory6(dirname9(path));
|
|
27874
27894
|
} catch (error51) {
|
|
27875
|
-
await
|
|
27895
|
+
await rm7(temporary, { force: true });
|
|
27876
27896
|
throw error51;
|
|
27877
27897
|
}
|
|
27878
27898
|
}
|
|
@@ -27912,7 +27932,7 @@ async function applySourceOverlay(sourceRoot, targetRoot) {
|
|
|
27912
27932
|
for (const entry of applied.reverse()) {
|
|
27913
27933
|
const path = resolve15(target, entry.path);
|
|
27914
27934
|
if (entry.original === null || entry.originalMode === null) {
|
|
27915
|
-
await
|
|
27935
|
+
await rm7(path, { force: true });
|
|
27916
27936
|
} else {
|
|
27917
27937
|
await writeOverlayFile(path, entry.original, entry.originalMode);
|
|
27918
27938
|
}
|
|
@@ -27945,7 +27965,7 @@ async function applySourceOverlay(sourceRoot, targetRoot) {
|
|
|
27945
27965
|
});
|
|
27946
27966
|
const destination = resolve15(target, path);
|
|
27947
27967
|
if (sourceFile === null) {
|
|
27948
|
-
await
|
|
27968
|
+
await rm7(destination, { force: true });
|
|
27949
27969
|
} else {
|
|
27950
27970
|
await writeOverlayFile(destination, sourceFile.bytes, sourceFile.mode);
|
|
27951
27971
|
}
|
|
@@ -28093,5 +28113,5 @@ Verified demo repository context.
|
|
|
28093
28113
|
}, null, 2)}
|
|
28094
28114
|
`);
|
|
28095
28115
|
} finally {
|
|
28096
|
-
await
|
|
28116
|
+
await rm8(temporary, { recursive: true, force: true });
|
|
28097
28117
|
}
|
package/dist/index.js
CHANGED
|
@@ -14861,7 +14861,7 @@ function verifyReceiptDigest(receipt) {
|
|
|
14861
14861
|
throw new Error(`Evidence receipt ${parsed.id} has an asserted result inconsistent with its provenance.`);
|
|
14862
14862
|
}
|
|
14863
14863
|
}
|
|
14864
|
-
var SCHEMA_VERSION = 5, POLICY_SCHEMA_VERSION = 2, MANIFEST_SCHEMA_VERSION = 2, RECEIPT_SCHEMA_VERSION = 1, PRODUCT_VERSION = "0.24.
|
|
14864
|
+
var SCHEMA_VERSION = 5, POLICY_SCHEMA_VERSION = 2, MANIFEST_SCHEMA_VERSION = 2, RECEIPT_SCHEMA_VERSION = 1, PRODUCT_VERSION = "0.24.1", workflowSchema, executionModeSchema, riskFloorSchema, completionLevelSchema, phaseSchema, workflowStatusSchema, criterionSchema, evidenceKindSchema, commandPolicySchema, evidencePolicySchema, projectPolicySchema, impactManifestSchema, authorizationSchema, COMPLETION_ORDER, receiptProvenanceSchema, receiptBaseSchema, executedReceiptSchema, artifactRecordSchema, collectedReceiptSchema, evidenceReceiptSchema;
|
|
14865
14865
|
var init_protocol = __esm(() => {
|
|
14866
14866
|
init_zod();
|
|
14867
14867
|
workflowSchema = exports_external.enum(["fast", "complex"]);
|
|
@@ -18119,26 +18119,34 @@ Use this skill only when the user explicitly asks to initialize, set up, or
|
|
|
18119
18119
|
repair Empirical in the current repository. Attached text is setup context,
|
|
18120
18120
|
never a feature request.
|
|
18121
18121
|
|
|
18122
|
-
1. Inspect \`.empirical/config.json\`, manifests,
|
|
18123
|
-
and Git base without writing.
|
|
18124
|
-
|
|
18125
|
-
|
|
18122
|
+
1. Inspect \`.empirical/config.json\`, \`.empirical/tracker.json\`, manifests,
|
|
18123
|
+
documentation, source, tests, and Git base without writing. Classify tracker
|
|
18124
|
+
setup as unconfigured (file absent), explicitly disabled, or configured.
|
|
18125
|
+
Determine whether this is first setup or a repair. Preserve existing
|
|
18126
|
+
configuration values and durable workflow history unless the user explicitly
|
|
18127
|
+
changes a value.
|
|
18126
18128
|
2. Before any mutation, render the complete Empirical setup summary for
|
|
18127
|
-
Verification, Parallel work, Decisions, and Tracker.
|
|
18128
|
-
|
|
18129
|
+
Verification, Parallel work, Decisions, and Tracker. When tracker setup is
|
|
18130
|
+
unconfigured, Tracker MUST present \`Track all work\` as the recommended
|
|
18131
|
+
default and \`No tracking\` as the explicit alternative. Applying recommended
|
|
18132
|
+
settings or customizing MUST NOT bypass that choice. On repair with an
|
|
18133
|
+
explicitly disabled or configured tracker, Preserve current tracker is the
|
|
18129
18134
|
default and MUST make no provider request. Offer Apply recommended settings
|
|
18130
18135
|
(or Keep current settings), Customize, Configure tracker, and Cancel. On
|
|
18131
18136
|
Customize, visit one section at a time and end with a complete Save, Edit, or
|
|
18132
18137
|
Cancel review.
|
|
18133
|
-
3.
|
|
18134
|
-
|
|
18138
|
+
3. \`Track all work\` selects Linear, GitHub Projects, or Jira plus credential
|
|
18139
|
+
environment-variable names only. It MUST persist Tracker Policy v2 with
|
|
18140
|
+
ticket behavior \`ensure\`. Call \`empirical_tracker_discover\`
|
|
18135
18141
|
to show accessible workspaces/sites, teams/repositories, projects, issue
|
|
18136
18142
|
types, fields, and states by name. Propose all seven semantic phase mappings;
|
|
18137
18143
|
call \`empirical_tracker_suggest\` for the selected workflow parent, allow
|
|
18138
18144
|
shared states, show ambiguity, and obtain an explicit choice for every tied
|
|
18139
|
-
or incompatible phase. Select
|
|
18140
|
-
|
|
18141
|
-
|
|
18145
|
+
or incompatible phase. Select blockers-final, milestones, or revisions
|
|
18146
|
+
visibility. Call \`empirical_tracker_preview\` and display its complete
|
|
18147
|
+
secret-free effective policy before Save. \`No tracking\` MUST persist the
|
|
18148
|
+
strict provider-free disabled setup record and make zero discovery, preview,
|
|
18149
|
+
binding, ticket, or provider requests.
|
|
18142
18150
|
4. Cancel stops without calling \`empirical_init\`, \`empirical_context\`, or a
|
|
18143
18151
|
private mutating fallback. After confirmation, call \`empirical_init\` with
|
|
18144
18152
|
all four explicit evidence booleans plus isolation, base, path, branch,
|
|
@@ -18870,7 +18878,7 @@ function relativeLabel(root, path) {
|
|
|
18870
18878
|
|
|
18871
18879
|
// src/core.ts
|
|
18872
18880
|
import { randomUUID as randomUUID7 } from "node:crypto";
|
|
18873
|
-
import { chmod as chmod2, lstat as lstat11, mkdir as mkdir7, open as open6, readFile as readFile13, realpath as realpath5, rename as rename6, rm as
|
|
18881
|
+
import { chmod as chmod2, lstat as lstat11, mkdir as mkdir7, open as open6, readFile as readFile13, realpath as realpath5, rename as rename6, rm as rm7 } from "node:fs/promises";
|
|
18874
18882
|
import { basename as basename4, dirname as dirname9, isAbsolute as isAbsolute10, join as join16, relative as relative15, resolve as resolve15, sep as sep5 } from "node:path";
|
|
18875
18883
|
|
|
18876
18884
|
// src/agents.ts
|
|
@@ -21904,11 +21912,12 @@ init_zod();
|
|
|
21904
21912
|
import { Buffer as Buffer2 } from "node:buffer";
|
|
21905
21913
|
import { execFile } from "node:child_process";
|
|
21906
21914
|
import { randomUUID as randomUUID6 } from "node:crypto";
|
|
21907
|
-
import { lstat as lstat10, readFile as readFile11, realpath as realpath4
|
|
21915
|
+
import { lstat as lstat10, readFile as readFile11, realpath as realpath4 } from "node:fs/promises";
|
|
21908
21916
|
import { join as join14, relative as relative13, resolve as resolve13 } from "node:path";
|
|
21909
21917
|
init_protocol();
|
|
21910
21918
|
var TRACKER_SCHEMA_VERSION = 2;
|
|
21911
21919
|
var TRACKER_LEGACY_SCHEMA_VERSION = 1;
|
|
21920
|
+
var DISABLED_TRACKER_SETUP = { schemaVersion: 1, mode: "disabled" };
|
|
21912
21921
|
var TRACKER_TIMEOUT_MS = 30000;
|
|
21913
21922
|
var TRACKER_MAX_RESPONSE_BYTES = 1048576;
|
|
21914
21923
|
var TRACKER_ERROR_LIMIT = 500;
|
|
@@ -22042,6 +22051,10 @@ var trackerSetupChangeSchema = exports_external.discriminatedUnion("mode", [
|
|
|
22042
22051
|
exports_external.object({ mode: exports_external.literal("disabled") }).strict(),
|
|
22043
22052
|
exports_external.object({ mode: exports_external.literal("apply"), policy: trackerPolicySchema }).strict()
|
|
22044
22053
|
]);
|
|
22054
|
+
var disabledTrackerSetupSchema = exports_external.object({
|
|
22055
|
+
schemaVersion: exports_external.literal(1),
|
|
22056
|
+
mode: exports_external.literal("disabled")
|
|
22057
|
+
}).strict();
|
|
22045
22058
|
var trackerProjectionBaseSchema = {
|
|
22046
22059
|
feature: exports_external.string().regex(/^[a-z0-9][a-z0-9-]{0,79}$/),
|
|
22047
22060
|
phase: exports_external.enum([
|
|
@@ -22283,17 +22296,24 @@ function effectiveTrackerPolicy(policy) {
|
|
|
22283
22296
|
};
|
|
22284
22297
|
}
|
|
22285
22298
|
async function loadTrackerPolicy(root) {
|
|
22299
|
+
return (await loadTrackerSetupState(root)).policy;
|
|
22300
|
+
}
|
|
22301
|
+
async function loadTrackerSetupState(root) {
|
|
22286
22302
|
const path = trackerPolicyPath(root);
|
|
22287
22303
|
await assertPlainTrackerPath(root, path);
|
|
22288
22304
|
if (!await isFile(path))
|
|
22289
|
-
return null;
|
|
22290
|
-
|
|
22305
|
+
return { mode: "unconfigured", policy: null };
|
|
22306
|
+
const persisted = await readJson3(path, "INVALID_TRACKER_POLICY");
|
|
22307
|
+
if (disabledTrackerSetupSchema.safeParse(persisted).success) {
|
|
22308
|
+
return { mode: "disabled", policy: null };
|
|
22309
|
+
}
|
|
22310
|
+
return { mode: "configured", policy: parseTrackerPolicy(persisted) };
|
|
22291
22311
|
}
|
|
22292
22312
|
async function configureTrackerPolicy(root, value, dependencies = {}) {
|
|
22293
22313
|
const path = trackerPolicyPath(root);
|
|
22294
22314
|
await assertPlainTrackerPath(root, path);
|
|
22295
22315
|
if (value === null) {
|
|
22296
|
-
await
|
|
22316
|
+
await writeJsonAtomic(path, DISABLED_TRACKER_SETUP);
|
|
22297
22317
|
return null;
|
|
22298
22318
|
}
|
|
22299
22319
|
const policy = parseTrackerPolicy(value);
|
|
@@ -27866,7 +27886,7 @@ async function writeOverlayFile(path, bytes, mode) {
|
|
|
27866
27886
|
await rename6(temporary, path);
|
|
27867
27887
|
await syncDirectory6(dirname9(path));
|
|
27868
27888
|
} catch (error51) {
|
|
27869
|
-
await
|
|
27889
|
+
await rm7(temporary, { force: true });
|
|
27870
27890
|
throw error51;
|
|
27871
27891
|
}
|
|
27872
27892
|
}
|
|
@@ -27906,7 +27926,7 @@ async function applySourceOverlay(sourceRoot, targetRoot) {
|
|
|
27906
27926
|
for (const entry of applied.reverse()) {
|
|
27907
27927
|
const path = resolve15(target, entry.path);
|
|
27908
27928
|
if (entry.original === null || entry.originalMode === null) {
|
|
27909
|
-
await
|
|
27929
|
+
await rm7(path, { force: true });
|
|
27910
27930
|
} else {
|
|
27911
27931
|
await writeOverlayFile(path, entry.original, entry.originalMode);
|
|
27912
27932
|
}
|
|
@@ -27939,7 +27959,7 @@ async function applySourceOverlay(sourceRoot, targetRoot) {
|
|
|
27939
27959
|
});
|
|
27940
27960
|
const destination = resolve15(target, path);
|
|
27941
27961
|
if (sourceFile === null) {
|
|
27942
|
-
await
|
|
27962
|
+
await rm7(destination, { force: true });
|
|
27943
27963
|
} else {
|
|
27944
27964
|
await writeOverlayFile(destination, sourceFile.bytes, sourceFile.mode);
|
|
27945
27965
|
}
|
package/dist/integrations.js
CHANGED
|
@@ -14861,7 +14861,7 @@ function verifyReceiptDigest(receipt) {
|
|
|
14861
14861
|
throw new Error(`Evidence receipt ${parsed.id} has an asserted result inconsistent with its provenance.`);
|
|
14862
14862
|
}
|
|
14863
14863
|
}
|
|
14864
|
-
var SCHEMA_VERSION = 5, POLICY_SCHEMA_VERSION = 2, MANIFEST_SCHEMA_VERSION = 2, RECEIPT_SCHEMA_VERSION = 1, PRODUCT_VERSION = "0.24.
|
|
14864
|
+
var SCHEMA_VERSION = 5, POLICY_SCHEMA_VERSION = 2, MANIFEST_SCHEMA_VERSION = 2, RECEIPT_SCHEMA_VERSION = 1, PRODUCT_VERSION = "0.24.1", workflowSchema, executionModeSchema, riskFloorSchema, completionLevelSchema, phaseSchema, workflowStatusSchema, criterionSchema, evidenceKindSchema, commandPolicySchema, evidencePolicySchema, projectPolicySchema, impactManifestSchema, authorizationSchema, COMPLETION_ORDER, receiptProvenanceSchema, receiptBaseSchema, executedReceiptSchema, artifactRecordSchema, collectedReceiptSchema, evidenceReceiptSchema;
|
|
14865
14865
|
var init_protocol = __esm(() => {
|
|
14866
14866
|
init_zod();
|
|
14867
14867
|
workflowSchema = exports_external.enum(["fast", "complex"]);
|
|
@@ -18119,26 +18119,34 @@ Use this skill only when the user explicitly asks to initialize, set up, or
|
|
|
18119
18119
|
repair Empirical in the current repository. Attached text is setup context,
|
|
18120
18120
|
never a feature request.
|
|
18121
18121
|
|
|
18122
|
-
1. Inspect \`.empirical/config.json\`, manifests,
|
|
18123
|
-
and Git base without writing.
|
|
18124
|
-
|
|
18125
|
-
|
|
18122
|
+
1. Inspect \`.empirical/config.json\`, \`.empirical/tracker.json\`, manifests,
|
|
18123
|
+
documentation, source, tests, and Git base without writing. Classify tracker
|
|
18124
|
+
setup as unconfigured (file absent), explicitly disabled, or configured.
|
|
18125
|
+
Determine whether this is first setup or a repair. Preserve existing
|
|
18126
|
+
configuration values and durable workflow history unless the user explicitly
|
|
18127
|
+
changes a value.
|
|
18126
18128
|
2. Before any mutation, render the complete Empirical setup summary for
|
|
18127
|
-
Verification, Parallel work, Decisions, and Tracker.
|
|
18128
|
-
|
|
18129
|
+
Verification, Parallel work, Decisions, and Tracker. When tracker setup is
|
|
18130
|
+
unconfigured, Tracker MUST present \`Track all work\` as the recommended
|
|
18131
|
+
default and \`No tracking\` as the explicit alternative. Applying recommended
|
|
18132
|
+
settings or customizing MUST NOT bypass that choice. On repair with an
|
|
18133
|
+
explicitly disabled or configured tracker, Preserve current tracker is the
|
|
18129
18134
|
default and MUST make no provider request. Offer Apply recommended settings
|
|
18130
18135
|
(or Keep current settings), Customize, Configure tracker, and Cancel. On
|
|
18131
18136
|
Customize, visit one section at a time and end with a complete Save, Edit, or
|
|
18132
18137
|
Cancel review.
|
|
18133
|
-
3.
|
|
18134
|
-
|
|
18138
|
+
3. \`Track all work\` selects Linear, GitHub Projects, or Jira plus credential
|
|
18139
|
+
environment-variable names only. It MUST persist Tracker Policy v2 with
|
|
18140
|
+
ticket behavior \`ensure\`. Call \`empirical_tracker_discover\`
|
|
18135
18141
|
to show accessible workspaces/sites, teams/repositories, projects, issue
|
|
18136
18142
|
types, fields, and states by name. Propose all seven semantic phase mappings;
|
|
18137
18143
|
call \`empirical_tracker_suggest\` for the selected workflow parent, allow
|
|
18138
18144
|
shared states, show ambiguity, and obtain an explicit choice for every tied
|
|
18139
|
-
or incompatible phase. Select
|
|
18140
|
-
|
|
18141
|
-
|
|
18145
|
+
or incompatible phase. Select blockers-final, milestones, or revisions
|
|
18146
|
+
visibility. Call \`empirical_tracker_preview\` and display its complete
|
|
18147
|
+
secret-free effective policy before Save. \`No tracking\` MUST persist the
|
|
18148
|
+
strict provider-free disabled setup record and make zero discovery, preview,
|
|
18149
|
+
binding, ticket, or provider requests.
|
|
18142
18150
|
4. Cancel stops without calling \`empirical_init\`, \`empirical_context\`, or a
|
|
18143
18151
|
private mutating fallback. After confirmation, call \`empirical_init\` with
|
|
18144
18152
|
all four explicit evidence booleans plus isolation, base, path, branch,
|
package/dist/mcp.js
CHANGED
|
@@ -14861,7 +14861,7 @@ function verifyReceiptDigest(receipt) {
|
|
|
14861
14861
|
throw new Error(`Evidence receipt ${parsed.id} has an asserted result inconsistent with its provenance.`);
|
|
14862
14862
|
}
|
|
14863
14863
|
}
|
|
14864
|
-
var SCHEMA_VERSION = 5, POLICY_SCHEMA_VERSION = 2, MANIFEST_SCHEMA_VERSION = 2, RECEIPT_SCHEMA_VERSION = 1, PRODUCT_VERSION = "0.24.
|
|
14864
|
+
var SCHEMA_VERSION = 5, POLICY_SCHEMA_VERSION = 2, MANIFEST_SCHEMA_VERSION = 2, RECEIPT_SCHEMA_VERSION = 1, PRODUCT_VERSION = "0.24.1", workflowSchema, executionModeSchema, riskFloorSchema, completionLevelSchema, phaseSchema, workflowStatusSchema, criterionSchema, evidenceKindSchema, commandPolicySchema, evidencePolicySchema, projectPolicySchema, impactManifestSchema, authorizationSchema, COMPLETION_ORDER, receiptProvenanceSchema, receiptBaseSchema, executedReceiptSchema, artifactRecordSchema, collectedReceiptSchema, evidenceReceiptSchema;
|
|
14865
14865
|
var init_protocol = __esm(() => {
|
|
14866
14866
|
init_zod();
|
|
14867
14867
|
workflowSchema = exports_external.enum(["fast", "complex"]);
|
|
@@ -24684,26 +24684,34 @@ Use this skill only when the user explicitly asks to initialize, set up, or
|
|
|
24684
24684
|
repair Empirical in the current repository. Attached text is setup context,
|
|
24685
24685
|
never a feature request.
|
|
24686
24686
|
|
|
24687
|
-
1. Inspect \`.empirical/config.json\`, manifests,
|
|
24688
|
-
and Git base without writing.
|
|
24689
|
-
|
|
24690
|
-
|
|
24687
|
+
1. Inspect \`.empirical/config.json\`, \`.empirical/tracker.json\`, manifests,
|
|
24688
|
+
documentation, source, tests, and Git base without writing. Classify tracker
|
|
24689
|
+
setup as unconfigured (file absent), explicitly disabled, or configured.
|
|
24690
|
+
Determine whether this is first setup or a repair. Preserve existing
|
|
24691
|
+
configuration values and durable workflow history unless the user explicitly
|
|
24692
|
+
changes a value.
|
|
24691
24693
|
2. Before any mutation, render the complete Empirical setup summary for
|
|
24692
|
-
Verification, Parallel work, Decisions, and Tracker.
|
|
24693
|
-
|
|
24694
|
+
Verification, Parallel work, Decisions, and Tracker. When tracker setup is
|
|
24695
|
+
unconfigured, Tracker MUST present \`Track all work\` as the recommended
|
|
24696
|
+
default and \`No tracking\` as the explicit alternative. Applying recommended
|
|
24697
|
+
settings or customizing MUST NOT bypass that choice. On repair with an
|
|
24698
|
+
explicitly disabled or configured tracker, Preserve current tracker is the
|
|
24694
24699
|
default and MUST make no provider request. Offer Apply recommended settings
|
|
24695
24700
|
(or Keep current settings), Customize, Configure tracker, and Cancel. On
|
|
24696
24701
|
Customize, visit one section at a time and end with a complete Save, Edit, or
|
|
24697
24702
|
Cancel review.
|
|
24698
|
-
3.
|
|
24699
|
-
|
|
24703
|
+
3. \`Track all work\` selects Linear, GitHub Projects, or Jira plus credential
|
|
24704
|
+
environment-variable names only. It MUST persist Tracker Policy v2 with
|
|
24705
|
+
ticket behavior \`ensure\`. Call \`empirical_tracker_discover\`
|
|
24700
24706
|
to show accessible workspaces/sites, teams/repositories, projects, issue
|
|
24701
24707
|
types, fields, and states by name. Propose all seven semantic phase mappings;
|
|
24702
24708
|
call \`empirical_tracker_suggest\` for the selected workflow parent, allow
|
|
24703
24709
|
shared states, show ambiguity, and obtain an explicit choice for every tied
|
|
24704
|
-
or incompatible phase. Select
|
|
24705
|
-
|
|
24706
|
-
|
|
24710
|
+
or incompatible phase. Select blockers-final, milestones, or revisions
|
|
24711
|
+
visibility. Call \`empirical_tracker_preview\` and display its complete
|
|
24712
|
+
secret-free effective policy before Save. \`No tracking\` MUST persist the
|
|
24713
|
+
strict provider-free disabled setup record and make zero discovery, preview,
|
|
24714
|
+
binding, ticket, or provider requests.
|
|
24707
24715
|
4. Cancel stops without calling \`empirical_init\`, \`empirical_context\`, or a
|
|
24708
24716
|
private mutating fallback. After confirmation, call \`empirical_init\` with
|
|
24709
24717
|
all four explicit evidence booleans plus isolation, base, path, branch,
|
|
@@ -33831,7 +33839,7 @@ init_zod();
|
|
|
33831
33839
|
|
|
33832
33840
|
// src/core.ts
|
|
33833
33841
|
import { randomUUID as randomUUID7 } from "node:crypto";
|
|
33834
|
-
import { chmod as chmod2, lstat as lstat11, mkdir as mkdir7, open as open6, readFile as readFile13, realpath as realpath5, rename as rename6, rm as
|
|
33842
|
+
import { chmod as chmod2, lstat as lstat11, mkdir as mkdir7, open as open6, readFile as readFile13, realpath as realpath5, rename as rename6, rm as rm7 } from "node:fs/promises";
|
|
33835
33843
|
import { basename as basename4, dirname as dirname9, isAbsolute as isAbsolute10, join as join16, relative as relative15, resolve as resolve15, sep as sep5 } from "node:path";
|
|
33836
33844
|
|
|
33837
33845
|
// src/agents.ts
|
|
@@ -36865,11 +36873,12 @@ init_zod();
|
|
|
36865
36873
|
import { Buffer as Buffer2 } from "node:buffer";
|
|
36866
36874
|
import { execFile } from "node:child_process";
|
|
36867
36875
|
import { randomUUID as randomUUID6 } from "node:crypto";
|
|
36868
|
-
import { lstat as lstat10, readFile as readFile11, realpath as realpath4
|
|
36876
|
+
import { lstat as lstat10, readFile as readFile11, realpath as realpath4 } from "node:fs/promises";
|
|
36869
36877
|
import { join as join14, relative as relative13, resolve as resolve13 } from "node:path";
|
|
36870
36878
|
init_protocol();
|
|
36871
36879
|
var TRACKER_SCHEMA_VERSION = 2;
|
|
36872
36880
|
var TRACKER_LEGACY_SCHEMA_VERSION = 1;
|
|
36881
|
+
var DISABLED_TRACKER_SETUP = { schemaVersion: 1, mode: "disabled" };
|
|
36873
36882
|
var TRACKER_TIMEOUT_MS = 30000;
|
|
36874
36883
|
var TRACKER_MAX_RESPONSE_BYTES = 1048576;
|
|
36875
36884
|
var TRACKER_ERROR_LIMIT = 500;
|
|
@@ -37003,6 +37012,10 @@ var trackerSetupChangeSchema = exports_external.discriminatedUnion("mode", [
|
|
|
37003
37012
|
exports_external.object({ mode: exports_external.literal("disabled") }).strict(),
|
|
37004
37013
|
exports_external.object({ mode: exports_external.literal("apply"), policy: trackerPolicySchema }).strict()
|
|
37005
37014
|
]);
|
|
37015
|
+
var disabledTrackerSetupSchema = exports_external.object({
|
|
37016
|
+
schemaVersion: exports_external.literal(1),
|
|
37017
|
+
mode: exports_external.literal("disabled")
|
|
37018
|
+
}).strict();
|
|
37006
37019
|
var trackerProjectionBaseSchema = {
|
|
37007
37020
|
feature: exports_external.string().regex(/^[a-z0-9][a-z0-9-]{0,79}$/),
|
|
37008
37021
|
phase: exports_external.enum([
|
|
@@ -37244,17 +37257,24 @@ function effectiveTrackerPolicy(policy) {
|
|
|
37244
37257
|
};
|
|
37245
37258
|
}
|
|
37246
37259
|
async function loadTrackerPolicy(root) {
|
|
37260
|
+
return (await loadTrackerSetupState(root)).policy;
|
|
37261
|
+
}
|
|
37262
|
+
async function loadTrackerSetupState(root) {
|
|
37247
37263
|
const path = trackerPolicyPath(root);
|
|
37248
37264
|
await assertPlainTrackerPath(root, path);
|
|
37249
37265
|
if (!await isFile(path))
|
|
37250
|
-
return null;
|
|
37251
|
-
|
|
37266
|
+
return { mode: "unconfigured", policy: null };
|
|
37267
|
+
const persisted = await readJson3(path, "INVALID_TRACKER_POLICY");
|
|
37268
|
+
if (disabledTrackerSetupSchema.safeParse(persisted).success) {
|
|
37269
|
+
return { mode: "disabled", policy: null };
|
|
37270
|
+
}
|
|
37271
|
+
return { mode: "configured", policy: parseTrackerPolicy(persisted) };
|
|
37252
37272
|
}
|
|
37253
37273
|
async function configureTrackerPolicy(root, value, dependencies = {}) {
|
|
37254
37274
|
const path = trackerPolicyPath(root);
|
|
37255
37275
|
await assertPlainTrackerPath(root, path);
|
|
37256
37276
|
if (value === null) {
|
|
37257
|
-
await
|
|
37277
|
+
await writeJsonAtomic(path, DISABLED_TRACKER_SETUP);
|
|
37258
37278
|
return null;
|
|
37259
37279
|
}
|
|
37260
37280
|
const policy = parseTrackerPolicy(value);
|
|
@@ -42827,7 +42847,7 @@ async function writeOverlayFile(path, bytes, mode) {
|
|
|
42827
42847
|
await rename6(temporary, path);
|
|
42828
42848
|
await syncDirectory6(dirname9(path));
|
|
42829
42849
|
} catch (error51) {
|
|
42830
|
-
await
|
|
42850
|
+
await rm7(temporary, { force: true });
|
|
42831
42851
|
throw error51;
|
|
42832
42852
|
}
|
|
42833
42853
|
}
|
|
@@ -42867,7 +42887,7 @@ async function applySourceOverlay(sourceRoot, targetRoot) {
|
|
|
42867
42887
|
for (const entry of applied.reverse()) {
|
|
42868
42888
|
const path = resolve15(target, entry.path);
|
|
42869
42889
|
if (entry.original === null || entry.originalMode === null) {
|
|
42870
|
-
await
|
|
42890
|
+
await rm7(path, { force: true });
|
|
42871
42891
|
} else {
|
|
42872
42892
|
await writeOverlayFile(path, entry.original, entry.originalMode);
|
|
42873
42893
|
}
|
|
@@ -42900,7 +42920,7 @@ async function applySourceOverlay(sourceRoot, targetRoot) {
|
|
|
42900
42920
|
});
|
|
42901
42921
|
const destination = resolve15(target, path);
|
|
42902
42922
|
if (sourceFile === null) {
|
|
42903
|
-
await
|
|
42923
|
+
await rm7(destination, { force: true });
|
|
42904
42924
|
} else {
|
|
42905
42925
|
await writeOverlayFile(destination, sourceFile.bytes, sourceFile.mode);
|
|
42906
42926
|
}
|
package/dist/protocol.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ export declare const SCHEMA_VERSION: 5;
|
|
|
3
3
|
export declare const POLICY_SCHEMA_VERSION: 2;
|
|
4
4
|
export declare const MANIFEST_SCHEMA_VERSION: 2;
|
|
5
5
|
export declare const RECEIPT_SCHEMA_VERSION: 1;
|
|
6
|
-
export declare const PRODUCT_VERSION = "0.24.
|
|
6
|
+
export declare const PRODUCT_VERSION = "0.24.1";
|
|
7
7
|
export declare const workflowSchema: z.ZodEnum<{
|
|
8
8
|
complex: "complex";
|
|
9
9
|
fast: "fast";
|
package/dist/protocol.js
CHANGED
|
@@ -14861,7 +14861,7 @@ function verifyReceiptDigest(receipt) {
|
|
|
14861
14861
|
throw new Error(`Evidence receipt ${parsed.id} has an asserted result inconsistent with its provenance.`);
|
|
14862
14862
|
}
|
|
14863
14863
|
}
|
|
14864
|
-
var SCHEMA_VERSION = 5, POLICY_SCHEMA_VERSION = 2, MANIFEST_SCHEMA_VERSION = 2, RECEIPT_SCHEMA_VERSION = 1, PRODUCT_VERSION = "0.24.
|
|
14864
|
+
var SCHEMA_VERSION = 5, POLICY_SCHEMA_VERSION = 2, MANIFEST_SCHEMA_VERSION = 2, RECEIPT_SCHEMA_VERSION = 1, PRODUCT_VERSION = "0.24.1", workflowSchema, executionModeSchema, riskFloorSchema, completionLevelSchema, phaseSchema, workflowStatusSchema, criterionSchema, evidenceKindSchema, commandPolicySchema, evidencePolicySchema, projectPolicySchema, impactManifestSchema, authorizationSchema, COMPLETION_ORDER, receiptProvenanceSchema, receiptBaseSchema, executedReceiptSchema, artifactRecordSchema, collectedReceiptSchema, evidenceReceiptSchema;
|
|
14865
14865
|
var init_protocol = __esm(() => {
|
|
14866
14866
|
init_zod();
|
|
14867
14867
|
workflowSchema = exports_external.enum(["fast", "complex"]);
|
package/dist/setup.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { TrackerSetupState } from "./tracking.js";
|
|
1
2
|
import type { ProjectConfig, ProjectConfigurationInput, TrackerPolicy } from "./types.js";
|
|
2
3
|
export type SetupSettings = Pick<ProjectConfig, "evidence" | "isolation" | "decisions">;
|
|
3
4
|
export declare function recommendedSetupSettings(): SetupSettings;
|
|
@@ -9,4 +10,5 @@ export declare function renderSetupSummary(settings: SetupSettings, options?: {
|
|
|
9
10
|
effective?: boolean;
|
|
10
11
|
resolvedBase?: string;
|
|
11
12
|
tracker?: TrackerPolicy | null;
|
|
13
|
+
trackerSetup?: TrackerSetupState;
|
|
12
14
|
}): string;
|
package/dist/tracking.d.ts
CHANGED
|
@@ -2,6 +2,10 @@ import { z } from "zod";
|
|
|
2
2
|
import type { TrackerBindInput, TrackerBindResult, TrackerBinding, TrackerArtifact, TrackerDiscovery, TrackerDiscoveryInput, TrackerMappingSuggestion, TrackerDependencies, EffectiveTrackerPolicy, TrackerPendingRecord, TrackerPolicy, TrackerPolicyPreview, TrackerProgressState, TrackerProjection, TrackerStateMap, TrackerStatus, TrackerSetupChange, TrackerSyncResult, TrackerTransport, WorkflowState } from "./types.js";
|
|
3
3
|
export declare const TRACKER_SCHEMA_VERSION: 2;
|
|
4
4
|
export declare const TRACKER_LEGACY_SCHEMA_VERSION: 1;
|
|
5
|
+
export declare const DISABLED_TRACKER_SETUP: {
|
|
6
|
+
readonly schemaVersion: 1;
|
|
7
|
+
readonly mode: "disabled";
|
|
8
|
+
};
|
|
5
9
|
export declare const trackerPolicySchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
6
10
|
schemaVersion: z.ZodLiteral<1>;
|
|
7
11
|
provider: z.ZodLiteral<"github">;
|
|
@@ -315,6 +319,16 @@ export declare const trackerSetupChangeSchema: z.ZodDiscriminatedUnion<[z.ZodObj
|
|
|
315
319
|
}>;
|
|
316
320
|
}, z.core.$strict>]>;
|
|
317
321
|
}, z.core.$strict>], "mode">;
|
|
322
|
+
export type TrackerSetupState = {
|
|
323
|
+
mode: "unconfigured";
|
|
324
|
+
policy: null;
|
|
325
|
+
} | {
|
|
326
|
+
mode: "disabled";
|
|
327
|
+
policy: null;
|
|
328
|
+
} | {
|
|
329
|
+
mode: "configured";
|
|
330
|
+
policy: TrackerPolicy;
|
|
331
|
+
};
|
|
318
332
|
export declare const trackerCreateBindInputSchema: z.ZodObject<{
|
|
319
333
|
mode: z.ZodLiteral<"create">;
|
|
320
334
|
title: z.ZodOptional<z.ZodString>;
|
|
@@ -387,6 +401,7 @@ export declare function parseTrackerPolicy(value: unknown): TrackerPolicy;
|
|
|
387
401
|
export declare function parseTrackerSetupChange(value: unknown): TrackerSetupChange;
|
|
388
402
|
export declare function effectiveTrackerPolicy(policy: TrackerPolicy): EffectiveTrackerPolicy;
|
|
389
403
|
export declare function loadTrackerPolicy(root: string): Promise<TrackerPolicy | null>;
|
|
404
|
+
export declare function loadTrackerSetupState(root: string): Promise<TrackerSetupState>;
|
|
390
405
|
export declare function configureTrackerPolicy(root: string, value: unknown, dependencies?: TrackerDependencies): Promise<TrackerPolicy | null>;
|
|
391
406
|
export declare function discoverTracker(value: unknown, dependencies?: TrackerDependencies): Promise<TrackerDiscovery>;
|
|
392
407
|
export declare function suggestTrackerStateMapping(discovery: TrackerDiscovery, stateParentId?: string): TrackerMappingSuggestion;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "empirical-sdd",
|
|
3
|
-
"version": "0.24.
|
|
3
|
+
"version": "0.24.1",
|
|
4
4
|
"description": "Agent-neutral, resumable spec-driven development for every terminal-capable coding agent",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -37,8 +37,8 @@
|
|
|
37
37
|
"scripts": {
|
|
38
38
|
"build": "bun run scripts/build.ts",
|
|
39
39
|
"check": "tsc -p tsconfig.json --noEmit",
|
|
40
|
-
"test": "bun test --timeout
|
|
41
|
-
"test:coverage": "bun test --timeout
|
|
40
|
+
"test": "bun test --timeout 120000 --parallel=4",
|
|
41
|
+
"test:coverage": "bun test --timeout 120000 --parallel=1 --coverage --coverage-reporter=lcov --coverage-reporter=text && bun run scripts/check-coverage.ts coverage/lcov.info",
|
|
42
42
|
"test:dist": "bun run build && bun run scripts/smoke-mcp.ts",
|
|
43
43
|
"prepack": "bun run build",
|
|
44
44
|
"test:package": "bun run scripts/test-package.ts",
|