tickmarkr 2.8.4 → 2.8.6
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/dist/adapters/claude-code.js +3 -2
- package/dist/adapters/codex-commit-check.d.ts +4 -3
- package/dist/adapters/codex-commit-check.js +44 -29
- package/dist/adapters/codex.d.ts +2 -2
- package/dist/adapters/codex.js +38 -32
- package/dist/adapters/cursor-agent.js +2 -1
- package/dist/adapters/grok.js +2 -1
- package/dist/adapters/kimi.js +11 -9
- package/dist/adapters/model-lints.js +4 -3
- package/dist/adapters/opencode.js +2 -1
- package/dist/adapters/pi.js +3 -2
- package/dist/adapters/qwen.js +2 -1
- package/dist/adapters/registry.js +2 -1
- package/dist/adapters/types.d.ts +10 -1
- package/dist/adapters/types.js +18 -3
- package/dist/cli/commands/approve.js +9 -28
- package/dist/cli/commands/doctor.d.ts +49 -5
- package/dist/cli/commands/doctor.js +956 -94
- package/dist/cli/commands/fleet.js +11 -3
- package/dist/cli/commands/init.js +27 -19
- package/dist/cli/commands/status.js +9 -6
- package/dist/cli/commands/verify.js +12 -3
- package/dist/compile/gsd.js +4 -3
- package/dist/compile/index.js +4 -1
- package/dist/compile/native.js +8 -6
- package/dist/config/config.d.ts +15 -0
- package/dist/config/config.js +67 -5
- package/dist/drivers/host-env.d.ts +3 -0
- package/dist/drivers/host-env.js +47 -0
- package/dist/drivers/orca.js +3 -1
- package/dist/drivers/subprocess.d.ts +1 -1
- package/dist/drivers/subprocess.js +4 -3
- package/dist/gates/baseline.d.ts +1 -1
- package/dist/gates/baseline.js +4 -3
- package/dist/gates/cache.js +2 -4
- package/dist/graph/schema.js +3 -1
- package/dist/run/daemon.js +54 -4
- package/dist/run/git-trust.d.ts +11 -0
- package/dist/run/git-trust.js +1 -1
- package/dist/run/git.d.ts +13 -1
- package/dist/run/git.js +34 -14
- package/dist/run/journal.d.ts +15 -1
- package/dist/run/journal.js +83 -17
- package/dist/run/lock.d.ts +5 -0
- package/dist/run/lock.js +202 -9
- package/dist/run/protocol.d.ts +1 -1
- package/dist/tui/cockpit/live-store.js +12 -2
- package/package.json +1 -1
- package/skills/tickmarkr-auto/SKILL.md +65 -21
- package/skills/tickmarkr-loop/SKILL.md +65 -21
- package/skills/tickmarkr-overseer/SKILL.md +88 -32
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { graphDefinitionHash, loadGraph, saveGraph, taskDefinitionFingerprint } from "../../graph/graph.js";
|
|
2
2
|
import { filesGlob } from "../../graph/files-glob.js";
|
|
3
|
-
import { execFileSync } from "node:child_process";
|
|
4
3
|
import { userInfo } from "node:os";
|
|
5
4
|
import { allAdapters } from "../../adapters/registry.js";
|
|
6
5
|
import { channelKey } from "../../adapters/types.js";
|
|
7
6
|
import { loadConfig } from "../../config/config.js";
|
|
8
7
|
import { integrationBranch } from "../../run/merge.js";
|
|
8
|
+
import { gitSync } from "../../run/git.js";
|
|
9
9
|
import { integrationAnchor } from "../../run/daemon.js";
|
|
10
10
|
import { separabilityErrors, surfaceErrors, taskBudgetErrors } from "../../compile/collateral.js";
|
|
11
11
|
import { GATE_NAMES } from "../../graph/schema.js";
|
|
@@ -444,15 +444,10 @@ function mergedSiblingExempt(cwd, events, status, siblingId, requesterRef) {
|
|
|
444
444
|
if (commit === undefined || !FULL_OBJECT_ID.test(commit))
|
|
445
445
|
return false;
|
|
446
446
|
const ref = requesterRef();
|
|
447
|
-
|
|
448
|
-
execFileSync("git", ["rev-parse", "--verify", ref], { cwd, stdio: "ignore" });
|
|
449
|
-
execFileSync("git", ["merge-base", "--is-ancestor", commit, ref], { cwd, stdio: "ignore" });
|
|
450
|
-
}
|
|
451
|
-
catch {
|
|
452
|
-
return false;
|
|
453
|
-
}
|
|
454
|
-
return true;
|
|
447
|
+
return gitOk(cwd, "rev-parse", "--verify", ref) && gitOk(cwd, "merge-base", "--is-ancestor", commit, ref);
|
|
455
448
|
}
|
|
449
|
+
/** Queue row 2 item b: approve's git runs through the protected path; a trust refusal throws, never reads as false. */
|
|
450
|
+
const gitOk = (cwd, ...args) => gitSync(cwd, args).status === 0;
|
|
456
451
|
/** The conflicting unordered pairs of separabilityErrors, in its exact emission order. */
|
|
457
452
|
function separabilityPairs(tasks) {
|
|
458
453
|
const byId = new Map(tasks.map((t) => [t.id, t.deps ?? []]));
|
|
@@ -531,27 +526,13 @@ function failedTaskCommitsAhead(cwd, journal, runId, taskId) {
|
|
|
531
526
|
const preservedRef = preserved?.data.ref;
|
|
532
527
|
let ref = taskRef;
|
|
533
528
|
if (preservedRef) {
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
529
|
+
if (gitOk(cwd, "rev-parse", "--verify", taskRef) && gitOk(cwd, "merge-base", "--is-ancestor", taskRef, preservedRef))
|
|
530
|
+
ref = preservedRef;
|
|
531
|
+
else if (!gitOk(cwd, "rev-parse", "--verify", taskRef))
|
|
537
532
|
ref = preservedRef;
|
|
538
|
-
}
|
|
539
|
-
catch {
|
|
540
|
-
try {
|
|
541
|
-
execFileSync("git", ["rev-parse", "--verify", taskRef], { cwd, stdio: "ignore" });
|
|
542
|
-
}
|
|
543
|
-
catch {
|
|
544
|
-
ref = preservedRef;
|
|
545
|
-
}
|
|
546
|
-
}
|
|
547
|
-
}
|
|
548
|
-
try {
|
|
549
|
-
const out = execFileSync("git", ["rev-list", "--count", `${integration.base}..${ref}`], { cwd, encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] });
|
|
550
|
-
return { ref, base, count: Number.parseInt(out.trim(), 10) || 0 };
|
|
551
|
-
}
|
|
552
|
-
catch {
|
|
553
|
-
return { ref, base, count: 0 };
|
|
554
533
|
}
|
|
534
|
+
const out = gitSync(cwd, ["rev-list", "--count", `${integration.base}..${ref}`]);
|
|
535
|
+
return { ref, base, count: out.status === 0 ? Number.parseInt(out.stdout.trim(), 10) || 0 : 0 };
|
|
555
536
|
}
|
|
556
537
|
// The status is command OUTPUT, not a typed sibling result: the registered approve function returns
|
|
557
538
|
// one primitive string and the dispatcher prints those bytes unchanged. A compact sentinel followed
|
|
@@ -52,6 +52,23 @@ type OrcaCapability = {
|
|
|
52
52
|
* stderr (Electron timestamps), so the row is byte-stable across runs.
|
|
53
53
|
*/
|
|
54
54
|
export declare function probeOrcaCapability(cwd: string, opts?: Pick<DoctorOpts, "orcaStatusProbe" | "orcaHooksStatusProbe" | "resolveOrcaBinary" | "orcaEnv">): Promise<OrcaCapability>;
|
|
55
|
+
/** D-2102 add.39: the seams for a Node without stripTypeScriptTypes, and for a child that does not answer in time. */
|
|
56
|
+
export type ParseSeam = {
|
|
57
|
+
strip?: "absent";
|
|
58
|
+
timeoutMs?: number;
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* D-2102 add.37 and add.39: the config's text with its TypeScript types erased (offsets unchanged), once a real
|
|
62
|
+
* parser accepts it — or why not. The source reaches PARSE_CHILD on stdin through process.execPath with no shell
|
|
63
|
+
* and no temp file. A spawn error, a timeout, a non-zero exit, a missing or malformed answer, or erased text of
|
|
64
|
+
* another length reads "doctor could not check <file>'s syntax"; a TypeScript config on a Node without
|
|
65
|
+
* stripTypeScriptTypes (below 22.13) reads unverifiable; nothing here throws.
|
|
66
|
+
*/
|
|
67
|
+
export declare function realParse(source: string, configPath: string, seam?: ParseSeam): {
|
|
68
|
+
text: string;
|
|
69
|
+
} | {
|
|
70
|
+
why: string;
|
|
71
|
+
};
|
|
55
72
|
export declare function runnerIgnoreFinding(cwd: string): {
|
|
56
73
|
verdict: "pass" | "warn";
|
|
57
74
|
detail: string;
|
|
@@ -61,16 +78,43 @@ export declare function runnerIgnoreFinding(cwd: string): {
|
|
|
61
78
|
* repos a hand-edit (SentioQ run 2 paid a whole run first); --fix applies the ignore
|
|
62
79
|
* where a safe textual edit exists and refuses loudly otherwise.
|
|
63
80
|
*
|
|
64
|
-
* Safety contract:
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
*
|
|
81
|
+
* Safety contract (queue row 197; D-2102 add.8 and add.30): the canonical entries the config's own literal
|
|
82
|
+
* ignore list lacks go into that array as complete string-literal elements (never a coverage array or a
|
|
83
|
+
* scalar), beside the state dir's canonical entry, else first; a jest element that is exactly an unanchored
|
|
84
|
+
* entry for either directory (the SentioQ run-2 shape) is replaced by its canonical twin; a jest config with
|
|
85
|
+
* no testPathIgnorePatterns gets the property, preserving jest's default /node_modules/ ignore, as before
|
|
86
|
+
* this change (a JSON config with its key quoted), and a vitest config without test.exclude gets one that
|
|
87
|
+
* keeps Vitest 3.2.7's default excludes ahead of the two entries — inside a new test object where it has
|
|
88
|
+
* none (D-2102 add.31). A config doctor could not read or any other element is manual with the file
|
|
89
|
+
* byte-unchanged. The write is verified by
|
|
90
|
+
* re-running the same rule on the written file (and JSON.parse for a .json config); a write that does not
|
|
91
|
+
* turn the row green is REVERTED byte-for-byte and reported as manual. Never touches package.json.
|
|
69
92
|
*/
|
|
70
93
|
export declare function applyRunnerIgnore(cwd: string): {
|
|
71
94
|
action: "none" | "wrote" | "manual";
|
|
72
95
|
detail: string;
|
|
73
96
|
};
|
|
97
|
+
type EnvLike = NodeJS.ProcessEnv | Record<string, string | undefined>;
|
|
98
|
+
/**
|
|
99
|
+
* Queue row 196 (D-2102 add.1): the host decides where seats run. herdr or Orca markers (classifyHost)
|
|
100
|
+
* name that driver; with neither, seats run headless on the subprocess driver with no daemon board.
|
|
101
|
+
* Only the exact claude-desktop entry point names Claude Desktop — a cli entry point is a terminal seat
|
|
102
|
+
* and no Claude variable alone is a host. Panes configured where no pane host exists cannot be honored.
|
|
103
|
+
*/
|
|
104
|
+
export declare function hostRows(env: EnvLike, llm: "pane" | "headless"): {
|
|
105
|
+
verdict: "pass" | "warn";
|
|
106
|
+
key: string;
|
|
107
|
+
detail: string;
|
|
108
|
+
}[];
|
|
109
|
+
/**
|
|
110
|
+
* Queue row 196 (D-2102 add.1): gates inherit the launching locale. The effective value is LC_ALL, else
|
|
111
|
+
* LC_CTYPE, else LANG (an empty value counts as unset). Unset, C or POSIX is the C-locale fallback;
|
|
112
|
+
* C.UTF-8 is a UTF-8 locale and passes. Advisory only — doctor never sets or writes a locale.
|
|
113
|
+
*/
|
|
114
|
+
export declare function localeFinding(env: EnvLike): {
|
|
115
|
+
verdict: "pass" | "warn";
|
|
116
|
+
detail: string;
|
|
117
|
+
};
|
|
74
118
|
/**
|
|
75
119
|
* Q140s(b) / operator directive (D-OBS-10): the repo's package manager must resolve in
|
|
76
120
|
* THIS process's environment — the same class of environment the daemon spawns gates
|