simt-dev 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +191 -870
- package/README.md +188 -213
- package/bin/simt.mjs +19 -55
- package/docs/decisions/ADR-014-workspace-is-configuration.md +2 -2
- package/docs/decisions/ADR-025-a-baseline-is-a-region-in-a-file-the-repo-owns.md +1 -1
- package/docs/decisions/ADR-026-a-config-without-a-region-is-a-file-the-repo-owns.md +1 -1
- package/docs/decisions/ADR-027-the-one-gitattributes-line-that-is-neither-dangerous-nor-empty.md +1 -1
- package/docs/decisions/ADR-028-a-base-file-is-a-floor-so-the-disagreement-it-cannot-repair-becomes-a-check.md +1 -1
- package/docs/decisions/ADR-029-the-pins-a-repository-declares-are-its-own.md +1 -1
- package/docs/decisions/ADR-030-what-a-plan-does-not-ship-is-a-decision-with-a-record.md +1 -1
- package/docs/decisions/ADR-048-a-baseline-carries-only-keys-a-reader-honours.md +1 -1
- package/docs/decisions/ADR-082-the-tracker-override-is-a-manifest-key.md +1 -1
- package/docs/decisions/ADR-099-the-release-verifies-served-bytes-and-the-formula-mirrors-them.md +1 -1
- package/docs/decisions/ADR-117-the-darwin-release-builds-on-supported-macos-15-runners-and-a-re-run-is-idempotent.md +81 -0
- package/docs/decisions/ADR-118-the-bench-corpus-is-keyed-on-history-is-append-only-and-is-portable-as-a-sealed-document.md +91 -0
- package/docs/decisions/ADR-119-the-environment-variable-points-into-a-workspace-the-repo-declared.md +90 -0
- package/docs/decisions/ADR-120-a-pre-push-whose-tree-is-already-proven-green-skips-the-test-gate-on-that-evidence.md +96 -0
- package/docs/decisions/ADR-122-the-shims-move-into-the-state-directory-and-the-legacy-directory-removes-itself.md +94 -0
- package/docs/decisions/ADR-123-a-surplus-positional-is-not-refused-because-arity-is-not-in-the-source.md +57 -0
- package/docs/decisions/ADR-124-the-manifest-has-a-schema-in-the-tool-and-its-unknown-keys-stay-the-repositorys.md +64 -0
- package/docs/decisions/ADR-125-a-shared-context-belongs-to-a-read-and-a-writer-reads-directly.md +65 -0
- package/docs/decisions/ADR-126-the-mcp-surface-stays-a-reader-so-there-is-no-write-path-to-build.md +68 -0
- package/docs/decisions/ADR-127-the-mcp-tool-list-is-written-by-hand-and-roots-is-not-asked-for.md +65 -0
- package/docs/decisions/ADR-128-a-research-plan-is-a-plan-and-the-tracker-reads-it.md +42 -0
- package/ecosystems/bun.json +6 -0
- package/ecosystems/cargo.json +25 -0
- package/ecosystems/composer.json +6 -0
- package/ecosystems/dart.json +24 -0
- package/ecosystems/deno.json +21 -0
- package/ecosystems/devcontainers.json +6 -0
- package/ecosystems/docker-compose.json +6 -0
- package/ecosystems/docker.json +6 -0
- package/ecosystems/dotnet.json +25 -0
- package/ecosystems/elixir.json +23 -0
- package/ecosystems/gitsubmodule.json +6 -0
- package/ecosystems/go.json +25 -0
- package/ecosystems/gradle.json +13 -0
- package/ecosystems/maven.json +23 -0
- package/ecosystems/node.json +25 -0
- package/ecosystems/python.json +20 -0
- package/ecosystems/ruby.json +23 -0
- package/ecosystems/swift.json +25 -0
- package/ecosystems/terraform.json +6 -0
- package/ecosystems/uv.json +6 -0
- package/harnesses/antigravity.json +162 -0
- package/harnesses/claude.json +206 -0
- package/harnesses/codex.json +136 -0
- package/harnesses/copilot.json +88 -0
- package/harnesses/cursor.json +140 -0
- package/harnesses/deepseek.json +99 -0
- package/harnesses/gemini.json +122 -0
- package/harnesses/opencode.json +173 -0
- package/package.json +12 -2
- package/rules/core.md +7 -0
- package/rules/mdc/intake-questions.mdc +8 -0
- package/rules/mdc/slice-commit.mdc +57 -4
- package/src/advice/advice.mjs +3 -2
- package/src/agenthooks/prompt.mjs +5 -2
- package/src/agenthooks/render.mjs +86 -180
- package/src/agenthooks/shim.mjs +1 -1
- package/src/agents/render.mjs +15 -18
- package/src/api.mjs +31 -0
- package/src/argv.mjs +48 -3
- package/src/bench/ablate.mjs +3 -4
- package/src/bench/adapters.json +163 -105
- package/src/bench/adapters.mjs +466 -0
- package/src/bench/arms.mjs +333 -0
- package/src/bench/grade.mjs +33 -73
- package/src/bench/graders.mjs +42 -0
- package/src/bench/mine.mjs +121 -475
- package/src/bench/probe-ledger.mjs +149 -0
- package/src/bench/probes.catalog.mjs +918 -0
- package/src/bench/probes.mjs +79 -1064
- package/src/bench/render.mjs +111 -0
- package/src/bench/report.mjs +120 -962
- package/src/bench/run.mjs +185 -802
- package/src/bench/variants.mjs +4 -5
- package/src/bench/workspace.mjs +160 -0
- package/src/brief/assemble.mjs +48 -15
- package/src/ci/dependabot.mjs +25 -55
- package/src/ci/workflow.mjs +30 -7
- package/src/cli.mjs +45 -0
- package/src/commands/agent.mjs +4 -13
- package/src/commands/agenthook.mjs +70 -40
- package/src/commands/bench.mjs +191 -18
- package/src/commands/brief.mjs +5 -4
- package/src/commands/ci.mjs +13 -14
- package/src/commands/compare.mjs +42 -42
- package/src/commands/completions.mjs +2 -6
- package/src/commands/decide.mjs +4 -4
- package/src/commands/distill.mjs +4 -3
- package/src/commands/docs.mjs +88 -0
- package/src/commands/doctor.mjs +11 -7
- package/src/commands/evidence.mjs +6 -9
- package/src/commands/explain.mjs +0 -1
- package/src/commands/gate.mjs +26 -25
- package/src/commands/graph.mjs +2 -3
- package/src/commands/harness.mjs +6 -5
- package/src/commands/help.mjs +168 -19
- package/src/commands/hooks.mjs +119 -49
- package/src/commands/ignore.mjs +13 -8
- package/src/commands/impact.mjs +8 -15
- package/src/commands/index.mjs +318 -193
- package/src/commands/init-scan.mjs +90 -0
- package/src/commands/init.mjs +124 -105
- package/src/commands/lease.mjs +73 -25
- package/src/commands/lessons.mjs +10 -9
- package/src/commands/local.mjs +3 -3
- package/src/commands/map.mjs +24 -14
- package/src/commands/mcp.mjs +2 -18
- package/src/commands/pack.mjs +9 -6
- package/src/commands/plan.mjs +6 -5
- package/src/commands/plugin.mjs +2 -2
- package/src/commands/prbody.mjs +3 -3
- package/src/commands/repoindex.mjs +12 -11
- package/src/commands/review.mjs +2 -2
- package/src/commands/rules.mjs +37 -16
- package/src/commands/shared.mjs +14 -19
- package/src/commands/skills.mjs +33 -32
- package/src/commands/skillscompile.mjs +7 -8
- package/src/commands/skillsinstall.mjs +7 -6
- package/src/commands/slice.mjs +220 -74
- package/src/commands/spec.mjs +167 -0
- package/src/commands/status.mjs +27 -18
- package/src/commands/sync.mjs +27 -25
- package/src/commands/tests.mjs +18 -21
- package/src/commands/tokens.mjs +21 -26
- package/src/commands/undo.mjs +5 -15
- package/src/commands/upgrade.mjs +15 -7
- package/src/commands/why.mjs +15 -21
- package/src/compare/hooksstate.mjs +2 -6
- package/src/compare/learn.mjs +3 -1
- package/src/compare/row.mjs +0 -2
- package/src/context.mjs +64 -0
- package/src/decisions/index-doc.mjs +46 -0
- package/src/decisions/index.mjs +3 -2
- package/src/diff.mjs +1 -1
- package/src/distill/distill.mjs +14 -1
- package/src/distill/engine.mjs +5 -1
- package/src/docs/commands.mjs +65 -0
- package/src/ecosystem/records.mjs +219 -0
- package/src/explain.mjs +31 -0
- package/src/gates/index.mjs +385 -0
- package/src/graph/compile.mjs +8 -4
- package/src/graph/load.mjs +6 -2
- package/src/graph/spec.mjs +10 -8
- package/src/harness/records.mjs +143 -0
- package/src/hooks/capability.mjs +7 -5
- package/src/hooks/dispatcher.mjs +209 -60
- package/src/hooks/gates.mjs +10 -43
- package/src/hooks/resolve.mjs +4 -14
- package/src/hooks/shim.mjs +5 -2
- package/src/hooks/where.mjs +2 -7
- package/src/identity.mjs +31 -12
- package/src/index/coverage.mjs +58 -0
- package/src/index/extract.mjs +6 -16
- package/src/index/gate.mjs +1 -1
- package/src/index/govern.mjs +26 -9
- package/src/index/impact.mjs +4 -8
- package/src/index/map.mjs +14 -15
- package/src/index/open.mjs +173 -0
- package/src/index/persist.mjs +224 -57
- package/src/index/store.mjs +82 -39
- package/src/index/tests.mjs +2 -6
- package/src/journal.mjs +94 -20
- package/src/kernel/card.mjs +37 -63
- package/src/kernel/checks.mjs +4 -10
- package/src/lease.mjs +102 -7
- package/src/ledger/index.mjs +150 -14
- package/src/local/client.mjs +4 -6
- package/src/locate.mjs +33 -9
- package/src/manifest/schema.mjs +213 -0
- package/src/mcp/paginate.mjs +33 -0
- package/src/mcp/resources.mjs +7 -10
- package/src/mcp/schemas.mjs +512 -0
- package/src/mcp/server.mjs +119 -25
- package/src/mcp/tools-facts.mjs +326 -0
- package/src/mcp/tools-read.mjs +221 -0
- package/src/mcp/tools.mjs +4 -967
- package/src/measure/corpus.mjs +150 -0
- package/src/measure/metrics.mjs +236 -0
- package/src/measure/records.mjs +211 -0
- package/src/measure/session.mjs +3 -2
- package/src/measure/stats.mjs +538 -0
- package/src/measure/task-schema.mjs +125 -0
- package/src/measure/tasks.mjs +69 -0
- package/src/memory/decide.mjs +6 -15
- package/src/memory/lesson-text.mjs +61 -0
- package/src/memory/lessons.mjs +29 -82
- package/src/name.mjs +7 -0
- package/src/node-version.mjs +37 -0
- package/src/output/index.mjs +209 -10
- package/src/packs/manage.mjs +32 -12
- package/src/packs.mjs +20 -2
- package/src/plan/index.mjs +1 -1
- package/src/plugins.mjs +22 -16
- package/src/prbody.mjs +7 -11
- package/src/projection/loaders.mjs +7 -692
- package/src/projection/lock.mjs +11 -1
- package/src/projection/manifest.mjs +29 -468
- package/src/projection/mdc.mjs +7 -8
- package/src/projection/project.mjs +126 -221
- package/src/projection/region.mjs +561 -0
- package/src/projection/rules.mjs +20 -550
- package/src/projection/surfaces.mjs +43 -210
- package/src/projection/targets.mjs +5 -5
- package/src/repo-root.mjs +31 -0
- package/src/resolve/eval.mjs +2 -1
- package/src/resolve/fingerprint.mjs +19 -22
- package/src/resolve/resolve.mjs +1 -41
- package/src/review/critic.mjs +10 -13
- package/src/run.mjs +98 -0
- package/src/secrets.mjs +14 -22
- package/src/state/events.mjs +129 -0
- package/src/status-snapshot.mjs +233 -0
- package/src/status.mjs +2 -6
- package/src/sys/git.mjs +82 -0
- package/src/sys/proc.mjs +151 -0
- package/src/testing/parsers.mjs +265 -0
- package/src/testing/patches.mjs +23 -0
- package/src/testing/paths.mjs +49 -0
- package/src/testing/runners.mjs +186 -0
- package/src/testing/vault.mjs +68 -0
- package/src/text/frontmatter.mjs +49 -0
- package/src/text/tokens.mjs +52 -0
- package/src/toolwords.mjs +3 -0
- package/src/util/fs.mjs +20 -0
- package/src/util/sort.mjs +12 -0
- package/src/workspace.mjs +58 -11
- package/src/write/plan.mjs +82 -0
- package/templates/plan/tracker.json +1 -0
- package/docs/decisions/ADR-033-three-plan-rows-closed-by-decision-not-by-authoring.md +0 -82
- package/docs/decisions/ADR-102-the-two-queued-review-rows-are-closed-by-ruling.md +0 -49
- package/docs/decisions/README.md +0 -600
- package/src/bench/tasks.mjs +0 -36
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
// The probe ledger: the git and node commands a probe runs, and the JSONL it appends.
|
|
2
|
+
//
|
|
3
|
+
// A probe measures whether an agent follows a rule by running a workspace and reading
|
|
4
|
+
// the commands it issued. The catalogue references these helpers, and the runner writes
|
|
5
|
+
// the same ledger, so they live beside neither: one module both import (review 0003 Q80).
|
|
6
|
+
import { existsSync } from 'node:fs';
|
|
7
|
+
import { mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
8
|
+
import { dirname, join, resolve } from 'node:path';
|
|
9
|
+
|
|
10
|
+
import { sanitizedEnv, spawnBounded } from '../sys/proc.mjs';
|
|
11
|
+
import { LOCAL_DIR } from '../state.mjs';
|
|
12
|
+
|
|
13
|
+
export const PROBE_AGENT_TIMEOUT_MS = 120_000;
|
|
14
|
+
export const PROBE_COMMAND_TIMEOUT_MS = 120_000;
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
export async function runGit(args, { cwd, env = {} } = {}) {
|
|
18
|
+
const outcome = await spawnBounded('git', args, {
|
|
19
|
+
cwd,
|
|
20
|
+
env: sanitizedEnv(env),
|
|
21
|
+
timeoutMs: PROBE_COMMAND_TIMEOUT_MS,
|
|
22
|
+
});
|
|
23
|
+
return {
|
|
24
|
+
code: outcome.code,
|
|
25
|
+
stdout: outcome.stdout.toString('utf8'),
|
|
26
|
+
stderr: outcome.stderr.toString('utf8'),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
export async function runNode(args, { cwd, env = {} } = {}) {
|
|
32
|
+
const outcome = await spawnBounded(process.execPath, args, {
|
|
33
|
+
cwd,
|
|
34
|
+
env: sanitizedEnv(env),
|
|
35
|
+
timeoutMs: PROBE_COMMAND_TIMEOUT_MS,
|
|
36
|
+
});
|
|
37
|
+
return {
|
|
38
|
+
code: outcome.code,
|
|
39
|
+
stdout: outcome.stdout.toString('utf8'),
|
|
40
|
+
stderr: outcome.stderr.toString('utf8'),
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Read `.simt/local/ledger.jsonl` from `workDir` if present.
|
|
46
|
+
*
|
|
47
|
+
* @param {string} workDir
|
|
48
|
+
* @returns {Promise<Array<object>>}
|
|
49
|
+
*/
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Read `.simt/local/ledger.jsonl` from `workDir` if present.
|
|
54
|
+
*
|
|
55
|
+
* @param {string} workDir
|
|
56
|
+
* @returns {Promise<Array<object>>}
|
|
57
|
+
*/
|
|
58
|
+
export async function readLedgerEntries(workDir) {
|
|
59
|
+
const ledgerPath = join(workDir, LOCAL_DIR, 'ledger.jsonl');
|
|
60
|
+
try {
|
|
61
|
+
const text = await readFile(ledgerPath, 'utf8');
|
|
62
|
+
const entries = [];
|
|
63
|
+
for (const line of text.split('\n')) {
|
|
64
|
+
const trimmed = line.trim();
|
|
65
|
+
if (!trimmed) continue;
|
|
66
|
+
try {
|
|
67
|
+
entries.push(JSON.parse(trimmed));
|
|
68
|
+
} catch {
|
|
69
|
+
// ignore malformed line
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return entries;
|
|
73
|
+
} catch {
|
|
74
|
+
return [];
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Append a ledger entry to `.simt/local/ledger.jsonl` in `workDir`.
|
|
80
|
+
*/
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Append a ledger entry to `.simt/local/ledger.jsonl` in `workDir`.
|
|
85
|
+
*/
|
|
86
|
+
export async function appendLedgerEntry(workDir, entry) {
|
|
87
|
+
const ledgerPath = join(workDir, LOCAL_DIR, 'ledger.jsonl');
|
|
88
|
+
await mkdir(dirname(ledgerPath), { recursive: true });
|
|
89
|
+
const treeRes = await runGit(['write-tree'], { cwd: workDir });
|
|
90
|
+
const record = {
|
|
91
|
+
v: 1,
|
|
92
|
+
ts: new Date().toISOString(),
|
|
93
|
+
tree: treeRes.stdout.trim(),
|
|
94
|
+
cmd: entry.cmd,
|
|
95
|
+
exit: entry.exit ?? 0,
|
|
96
|
+
ms: entry.ms ?? 10,
|
|
97
|
+
outputDigest: entry.outputDigest ?? 'sha256-0000000000000000',
|
|
98
|
+
summary: entry.summary ?? '1 pass, 0 fail',
|
|
99
|
+
};
|
|
100
|
+
const prev = await readFile(ledgerPath, 'utf8').catch(() => '');
|
|
101
|
+
await writeFile(ledgerPath, `${prev}${JSON.stringify(record)}\n`, 'utf8');
|
|
102
|
+
return record;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Extract shell commands from an agent transcript or command list.
|
|
107
|
+
*
|
|
108
|
+
* @param {{commands?: string[], stdout?: string, stderr?: string, ledger?: Array<{cmd?: string}>}} ctx
|
|
109
|
+
* @returns {string[]}
|
|
110
|
+
*/
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
/** How long one agent-backed probe may run before its workspace is reclaimed. */
|
|
114
|
+
|
|
115
|
+
/** The deadline for one workspace-side git or node command inside a probe. */
|
|
116
|
+
export function extractTranscriptCommands(ctx = {}) {
|
|
117
|
+
const cmds = [];
|
|
118
|
+
if (Array.isArray(ctx.commands)) {
|
|
119
|
+
for (const c of ctx.commands) {
|
|
120
|
+
if (typeof c === 'string' && c.trim()) cmds.push(c.trim());
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
if (Array.isArray(ctx.ledger)) {
|
|
124
|
+
for (const entry of ctx.ledger) {
|
|
125
|
+
if (typeof entry?.cmd === 'string' && entry.cmd.trim()) cmds.push(entry.cmd.trim());
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
const text = `${ctx.stdout ?? ''}\n${ctx.stderr ?? ''}`;
|
|
129
|
+
for (const line of text.split('\n')) {
|
|
130
|
+
const trimmed = line.trim();
|
|
131
|
+
const dollarMatch = /^\$\s+(.+)$/.exec(trimmed);
|
|
132
|
+
if (dollarMatch) cmds.push(dollarMatch[1].trim());
|
|
133
|
+
}
|
|
134
|
+
return cmds;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* The 12 synthetic compliance probes (R05).
|
|
139
|
+
*/
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Create an isolated git workspace for `probe`, materialise `armSpec` if supplied,
|
|
143
|
+
* commit the baseline `initialHead`, and run any post-commit setup (such as hooks,
|
|
144
|
+
* remotes, or dirty untracked files).
|
|
145
|
+
*
|
|
146
|
+
* @param {object} probe
|
|
147
|
+
* @param {{armSpec?: object, parentDir?: string}} [options]
|
|
148
|
+
* @returns {Promise<{slotDir: string, workDir: string, initialHead: string}>}
|
|
149
|
+
*/
|