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 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.0...HEAD
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. Keep Local-only to make no
46
- provider requests, or select Linear, GitHub Projects, or Jira. Empirical reads
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 explicitly change or disable it.
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.0", workflowSchema, executionModeSchema, riskFloorSchema, completionLevelSchema, phaseSchema, workflowStatusSchema, criterionSchema, evidenceKindSchema, commandPolicySchema, evidencePolicySchema, projectPolicySchema, impactManifestSchema, authorizationSchema, COMPLETION_ORDER, receiptProvenanceSchema, receiptBaseSchema, executedReceiptSchema, artifactRecordSchema, collectedReceiptSchema, evidenceReceiptSchema;
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, documentation, source, tests,
24689
- and Git base without writing. Determine whether this is first setup or a
24690
- repair. Preserve existing configuration values and durable workflow history
24691
- unless the user explicitly changes a value.
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. Tracker MUST show an
24694
- explicit Local-only option. On repair, Preserve current tracker is the
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. Tracker configuration selects Linear, GitHub Projects, or Jira plus
24700
- credential environment-variable names only. Call \`empirical_tracker_discover\`
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 off/manual/ensure ticket behavior and blockers-final,
24706
- milestones, or revisions visibility. Call \`empirical_tracker_preview\` and
24707
- display its complete secret-free effective policy before Save.
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 rm8 } from "node:fs/promises";
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, rm as rm7 } from "node:fs/promises";
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
- return parseTrackerPolicy(await readJson3(path, "INVALID_TRACKER_POLICY"));
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 rm7(path, { force: true });
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 rm8(temporary, { force: true });
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 rm8(path, { force: true });
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 rm8(destination, { force: true });
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
- ...options.tracker ? [
43944
- `│ ● ${trackerLabel(options.tracker)} · ${state}`,
43945
- `│ Credential source: ${trackerCredentialNames(options.tracker).join(", ")} (environment names only)`
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
- `│ Local-only (disabled; no provider requests) · ${state}`
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, existingConfiguration ? await loadTrackerPolicy(context.root) : null) : { configuration: configuration.input, tracker: trackerInput };
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 tracker = await initialized.project.trackerPolicy();
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, tracker })}`);
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.trackerPolicy()) : (() => {
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, currentTracker) {
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
- tracker: currentTracker
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
- return { configuration: setupConfigurationInput(settings), tracker: { mode: "preserve" } };
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, currentTracker);
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
- tracker: previewPolicy
44697
+ trackerSetup: effectiveTrackerSetupState(currentTrackerSetup, tracker)
44654
44698
  })}`);
44655
- console.log(`
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
- tracker: currentTracker
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: { mode: "preserve" } };
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
- if (current)
44701
- console.log("│ preserve (default) · disable · linear · github · jira");
44702
- else
44703
- console.log("│ local (default) · linear · github · jira");
44704
- const fallback = current ? "preserve" : "local";
44705
- const provider = await askEnumDefault(prompt, `Tracker [${fallback}]: `, fallback, new Set(["preserve", "p", "disable", "disabled", "off", "local", "linear", "github", "jira"]));
44706
- if (provider === "preserve" || provider === "p")
44707
- return { mode: "preserve" };
44708
- if (["disable", "disabled", "off", "local"].includes(provider))
44709
- return { mode: "disabled" };
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.0", workflowSchema, executionModeSchema, riskFloorSchema, completionLevelSchema, phaseSchema, workflowStatusSchema, criterionSchema, evidenceKindSchema, commandPolicySchema, evidencePolicySchema, projectPolicySchema, impactManifestSchema, authorizationSchema, COMPLETION_ORDER, receiptProvenanceSchema, receiptBaseSchema, executedReceiptSchema, artifactRecordSchema, collectedReceiptSchema, evidenceReceiptSchema;
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, documentation, source, tests,
18123
- and Git base without writing. Determine whether this is first setup or a
18124
- repair. Preserve existing configuration values and durable workflow history
18125
- unless the user explicitly changes a value.
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. Tracker MUST show an
18128
- explicit Local-only option. On repair, Preserve current tracker is the
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. Tracker configuration selects Linear, GitHub Projects, or Jira plus
18134
- credential environment-variable names only. Call \`empirical_tracker_discover\`
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 off/manual/ensure ticket behavior and blockers-final,
18140
- milestones, or revisions visibility. Call \`empirical_tracker_preview\` and
18141
- display its complete secret-free effective policy before Save.
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 rm9, writeFile as writeFile2 } from "node:fs/promises";
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 rm8 } from "node:fs/promises";
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, rm as rm7 } from "node:fs/promises";
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
- return parseTrackerPolicy(await readJson3(path, "INVALID_TRACKER_POLICY"));
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 rm7(path, { force: true });
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 rm8(temporary, { force: true });
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 rm8(path, { force: true });
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 rm8(destination, { force: true });
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 rm9(temporary, { recursive: true, force: true });
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.0", workflowSchema, executionModeSchema, riskFloorSchema, completionLevelSchema, phaseSchema, workflowStatusSchema, criterionSchema, evidenceKindSchema, commandPolicySchema, evidencePolicySchema, projectPolicySchema, impactManifestSchema, authorizationSchema, COMPLETION_ORDER, receiptProvenanceSchema, receiptBaseSchema, executedReceiptSchema, artifactRecordSchema, collectedReceiptSchema, evidenceReceiptSchema;
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, documentation, source, tests,
18123
- and Git base without writing. Determine whether this is first setup or a
18124
- repair. Preserve existing configuration values and durable workflow history
18125
- unless the user explicitly changes a value.
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. Tracker MUST show an
18128
- explicit Local-only option. On repair, Preserve current tracker is the
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. Tracker configuration selects Linear, GitHub Projects, or Jira plus
18134
- credential environment-variable names only. Call \`empirical_tracker_discover\`
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 off/manual/ensure ticket behavior and blockers-final,
18140
- milestones, or revisions visibility. Call \`empirical_tracker_preview\` and
18141
- display its complete secret-free effective policy before Save.
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 rm8 } from "node:fs/promises";
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, rm as rm7 } from "node:fs/promises";
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
- return parseTrackerPolicy(await readJson3(path, "INVALID_TRACKER_POLICY"));
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 rm7(path, { force: true });
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 rm8(temporary, { force: true });
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 rm8(path, { force: true });
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 rm8(destination, { force: true });
27962
+ await rm7(destination, { force: true });
27943
27963
  } else {
27944
27964
  await writeOverlayFile(destination, sourceFile.bytes, sourceFile.mode);
27945
27965
  }
@@ -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.0", workflowSchema, executionModeSchema, riskFloorSchema, completionLevelSchema, phaseSchema, workflowStatusSchema, criterionSchema, evidenceKindSchema, commandPolicySchema, evidencePolicySchema, projectPolicySchema, impactManifestSchema, authorizationSchema, COMPLETION_ORDER, receiptProvenanceSchema, receiptBaseSchema, executedReceiptSchema, artifactRecordSchema, collectedReceiptSchema, evidenceReceiptSchema;
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, documentation, source, tests,
18123
- and Git base without writing. Determine whether this is first setup or a
18124
- repair. Preserve existing configuration values and durable workflow history
18125
- unless the user explicitly changes a value.
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. Tracker MUST show an
18128
- explicit Local-only option. On repair, Preserve current tracker is the
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. Tracker configuration selects Linear, GitHub Projects, or Jira plus
18134
- credential environment-variable names only. Call \`empirical_tracker_discover\`
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 off/manual/ensure ticket behavior and blockers-final,
18140
- milestones, or revisions visibility. Call \`empirical_tracker_preview\` and
18141
- display its complete secret-free effective policy before Save.
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.0", workflowSchema, executionModeSchema, riskFloorSchema, completionLevelSchema, phaseSchema, workflowStatusSchema, criterionSchema, evidenceKindSchema, commandPolicySchema, evidencePolicySchema, projectPolicySchema, impactManifestSchema, authorizationSchema, COMPLETION_ORDER, receiptProvenanceSchema, receiptBaseSchema, executedReceiptSchema, artifactRecordSchema, collectedReceiptSchema, evidenceReceiptSchema;
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, documentation, source, tests,
24688
- and Git base without writing. Determine whether this is first setup or a
24689
- repair. Preserve existing configuration values and durable workflow history
24690
- unless the user explicitly changes a value.
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. Tracker MUST show an
24693
- explicit Local-only option. On repair, Preserve current tracker is the
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. Tracker configuration selects Linear, GitHub Projects, or Jira plus
24699
- credential environment-variable names only. Call \`empirical_tracker_discover\`
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 off/manual/ensure ticket behavior and blockers-final,
24705
- milestones, or revisions visibility. Call \`empirical_tracker_preview\` and
24706
- display its complete secret-free effective policy before Save.
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 rm8 } from "node:fs/promises";
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, rm as rm7 } from "node:fs/promises";
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
- return parseTrackerPolicy(await readJson3(path, "INVALID_TRACKER_POLICY"));
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 rm7(path, { force: true });
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 rm8(temporary, { force: true });
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 rm8(path, { force: true });
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 rm8(destination, { force: true });
42923
+ await rm7(destination, { force: true });
42904
42924
  } else {
42905
42925
  await writeOverlayFile(destination, sourceFile.bytes, sourceFile.mode);
42906
42926
  }
@@ -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.0";
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.0", workflowSchema, executionModeSchema, riskFloorSchema, completionLevelSchema, phaseSchema, workflowStatusSchema, criterionSchema, evidenceKindSchema, commandPolicySchema, evidencePolicySchema, projectPolicySchema, impactManifestSchema, authorizationSchema, COMPLETION_ORDER, receiptProvenanceSchema, receiptBaseSchema, executedReceiptSchema, artifactRecordSchema, collectedReceiptSchema, evidenceReceiptSchema;
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;
@@ -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.0",
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 60000",
41
- "test:coverage": "bun test --timeout 60000 --coverage --coverage-reporter=lcov --coverage-reporter=text && bun run scripts/check-coverage.ts coverage/lcov.info",
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",