symbolic-scribe-harness 0.1.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.
@@ -0,0 +1,12 @@
1
+ ---
2
+ description: "Health-check the harness: kernel load, MCP wiring, memory backend, host adapter."
3
+ ---
4
+
5
+ Run a full health check and print a PASS/FAIL table.
6
+
7
+ 1. Kernel loads and `kernelInfo().version` matches package.json.
8
+ 2. The MCP server starts and lists its tools.
9
+ 3. The memory backend is reachable.
10
+ 4. The configured host adapter is present.
11
+
12
+ Exit non-zero if any check fails.
@@ -0,0 +1,13 @@
1
+ ---
2
+ description: Run the release-readiness umbrella + draft a tweet-length announcement.
3
+ ---
4
+
5
+ Run the release-readiness check.
6
+
7
+ 1. `harness validate` — umbrella check, must be green.
8
+ 2. `harness sbom` — emit the SBOM artifact.
9
+ 3. `harness score` — the scorecard must be >= 70 (B grade).
10
+ 4. If any gate is red, REFUSE to draft and name the specific blocker.
11
+ 5. Otherwise: draft the GitHub release body from the conventional-commit log since the last tag, grouped by feat/fix/docs/chore.
12
+
13
+ Never push or tag in this command; the operator decides when to ship.
@@ -0,0 +1,16 @@
1
+ ---
2
+ description: "Maintainer triage: what changed, what is risky, what to review first."
3
+ ---
4
+
5
+ Triage the current repo state.
6
+
7
+ 1. `git status` to see what is uncommitted.
8
+ 2. `git log --oneline -20` to see the recent history.
9
+ 3. `git diff HEAD~1` for the latest commit.
10
+ 4. Report:
11
+ - headline risk
12
+ - files most likely to regress
13
+ - smallest test the team should run before merging
14
+ - any permissions widened in the diff
15
+
16
+ Do not auto-fix; surface findings only.
@@ -0,0 +1,44 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "Bash(npx symbolic-scribe-harness*)",
5
+ "mcp__symbolic-scribe-harness__*",
6
+ "mcp__code_index__*",
7
+ "Bash(npm test*)",
8
+ "Bash(npm run*)",
9
+ "Bash(git diff*)",
10
+ "Bash(git status*)",
11
+ "Bash(git log*)",
12
+ "Bash(git show*)",
13
+ "Bash(cargo bench*)",
14
+ "Bash(cargo test*)"
15
+ ],
16
+ "deny": [
17
+ "Read(./.env)",
18
+ "Read(./.env.*)",
19
+ "Bash(git push*)",
20
+ "Bash(rm -rf*)",
21
+ "Bash(npm publish*)"
22
+ ]
23
+ },
24
+ "mcpServers": {
25
+ "symbolic-scribe-harness": {
26
+ "command": "npx",
27
+ "args": [
28
+ "-y",
29
+ "symbolic-scribe-harness@latest",
30
+ "mcp",
31
+ "start"
32
+ ]
33
+ },
34
+ "code_index": {
35
+ "command": "npx",
36
+ "args": [
37
+ "-y",
38
+ "symbolic-scribe-harness@latest",
39
+ "mcp",
40
+ "index"
41
+ ]
42
+ }
43
+ }
44
+ }
@@ -0,0 +1,14 @@
1
+ ---
2
+ name: memory-inspect
3
+ description: Search and inspect the harness memory namespace (HNSW + emergent-time decay).
4
+ ---
5
+
6
+ # memory-inspect
7
+
8
+ Inspect what the harness has learned.
9
+
10
+ - `search <query>` — semantic nearest-neighbour over the namespace
11
+ - `list` — recent patterns with decay weight
12
+ - `forget <id>` — evict a pattern
13
+
14
+ Use this before planning so the harness reuses prior trajectories instead of starting cold.
@@ -0,0 +1,15 @@
1
+ ---
2
+ name: plan-change
3
+ description: "Turn a feature request into a minimal, file-level implementation plan before any code."
4
+ ---
5
+
6
+ # plan-change
7
+
8
+ Produce an implementation plan for a requested change.
9
+
10
+ 1. Restate the goal in one sentence.
11
+ 2. List the files to touch and why.
12
+ 3. Name the smallest interface that satisfies it.
13
+ 4. Flag anything that ripples beyond three files or widens a permission.
14
+
15
+ Hand the plan to the implementer; do not write code in this step.
package/CLAUDE.md ADDED
@@ -0,0 +1,34 @@
1
+ # symbolic-scribe-harness
2
+
3
+ My AI agent harness
4
+
5
+ > Repo Maintainer harness · domain: `engineering/repo-maintenance`. Generated with [create-agent-harness](https://github.com/ruvnet/agent-harness-generator).
6
+
7
+ ## Behavioral rules
8
+
9
+ - Use the harness's MCP tools (`mcp__symbolic-scribe-harness__*`) for orchestration
10
+ - Memory and routing are handled by the kernel — you don't need to learn them
11
+ - Defer destructive operations to the user
12
+
13
+ ## Agents
14
+
15
+ | Agent | Tier | Role |
16
+ |---|---|---|
17
+ | `maintainer` | opus | Triages the repo state — what changed, what is risky, what to review first. |
18
+ | `benchmarker` | sonnet | Runs the perf gates and reports regressions. |
19
+ | `release` | opus | Drafts the GitHub release body + runs the readiness gates. |
20
+ | `security` | opus | Flags risky MCP grants, leaked secrets, dangerous diffs. |
21
+ ## Skills
22
+
23
+ - `/memory-inspect` — Search and inspect the harness memory namespace (HNSW + emergent-time decay).
24
+ - `/plan-change` — Turn a feature request into a minimal, file-level implementation plan before any code.
25
+
26
+ ## Commands
27
+
28
+ - `doctor` — Health-check the harness: kernel load, MCP wiring, memory backend, host adapter.
29
+ - `repo-triage` — Maintainer triage: what changed, what is risky, what to review first.
30
+ - `release-check` — Run the release-readiness umbrella + draft a tweet-length announcement.
31
+
32
+ ## Architecture
33
+
34
+ This harness uses [@metaharness/kernel](https://www.npmjs.com/package/@metaharness/kernel) — a Rust-compiled WASM module with a NAPI-RS native fallback — so the same code runs identically on every platform.
package/README.md ADDED
@@ -0,0 +1,30 @@
1
+ # symbolic-scribe-harness
2
+
3
+ My AI agent harness
4
+
5
+ > **Repo Maintainer** — Maintainer triages the diff → benchmarker reports regressions → release drafts the GH release body → security flags risky MCP grants. Drop into any repo and run.
6
+ >
7
+ > Generated with [`create-agent-harness`](https://github.com/ruvnet/agent-harness-generator). WASM kernel, multi-host support, witness-signed releases.
8
+
9
+ ## Install
10
+
11
+ ```bash
12
+ npm install -g symbolic-scribe-harness
13
+ symbolic-scribe-harness init
14
+ symbolic-scribe-harness doctor
15
+ ```
16
+
17
+ ## Agents
18
+
19
+ | Agent | Role |
20
+ |---|---|
21
+ | `maintainer` | Triages the repo state — what changed, what is risky, what to review first. |
22
+ | `benchmarker` | Runs the perf gates and reports regressions. |
23
+ | `release` | Drafts the GitHub release body + runs the readiness gates. |
24
+ | `security` | Flags risky MCP grants, leaked secrets, dangerous diffs. |
25
+
26
+ This harness ships with the **claude-code** adapter.
27
+
28
+ ## License
29
+
30
+ MIT
package/bin/cli.js ADDED
@@ -0,0 +1,100 @@
1
+ #!/usr/bin/env node
2
+ // SPDX-License-Identifier: MIT
3
+ // Generated by metaharness — the `symbolic-scribe-harness` CLI entry point.
4
+ //
5
+ // This is plain ESM JavaScript on purpose: it runs as-is via `npx symbolic-scribe-harness`
6
+ // with NO build step. `npm run build` (tsc) is only needed if you extend the
7
+ // TypeScript in src/. The published package ships this file directly (see the
8
+ // "bin" + "files" fields in package.json), so `npx symbolic-scribe-harness` works the moment
9
+ // `npm install` has resolved @metaharness/kernel + @metaharness/host-claude-code.
10
+
11
+ import { loadKernel } from '@metaharness/kernel';
12
+ import adapter from '@metaharness/host-claude-code';
13
+
14
+ const HARNESS_NAME = 'symbolic-scribe-harness';
15
+
16
+ /** `symbolic-scribe-harness init` — boot the kernel + host adapter and report status. */
17
+ async function init() {
18
+ const kernel = await loadKernel();
19
+ const info = kernel.kernelInfo();
20
+ console.log(`${HARNESS_NAME} — kernel ${info.version} (${kernel.backend})`);
21
+ console.log(`Host adapter: ${adapter.name}`);
22
+ console.log(`Run \`${HARNESS_NAME} doctor\` to verify the install.`);
23
+ return 0;
24
+ }
25
+
26
+ /** `symbolic-scribe-harness doctor` — verify the install end-to-end (kernel + host resolve). */
27
+ async function doctor() {
28
+ const kernel = await loadKernel();
29
+ const info = kernel.kernelInfo();
30
+ const checks = [
31
+ ['kernel loads', !!kernel],
32
+ ['kernel reports a version', typeof info.version === 'string' && info.version.length > 0],
33
+ ['kernel backend is native|wasm|js', ['native', 'wasm', 'js'].includes(kernel.backend)],
34
+ ['host adapter has a name', typeof adapter?.name === 'string' && adapter.name.length > 0],
35
+ ];
36
+ let ok = true;
37
+ for (const [label, pass] of checks) {
38
+ console.log(`${pass ? 'PASS' : 'FAIL'} ${label}`);
39
+ if (!pass) ok = false;
40
+ }
41
+ console.log(
42
+ ok
43
+ ? `\n${HARNESS_NAME}: all checks passed (kernel ${info.version}, ${kernel.backend} backend, host ${adapter.name})`
44
+ : `\n${HARNESS_NAME}: doctor found problems`,
45
+ );
46
+ return ok ? 0 : 1;
47
+ }
48
+
49
+ /**
50
+ * Dispatch one CLI invocation. Exported (not just run on import) so a test can
51
+ * drive it without spawning a subprocess. Returns the intended exit code.
52
+ */
53
+ export async function run(argv) {
54
+ const cmd = argv[0] ?? 'init';
55
+ switch (cmd) {
56
+ case 'init':
57
+ return init();
58
+ case 'doctor':
59
+ return doctor();
60
+ case '--version':
61
+ case '-v': {
62
+ const kernel = await loadKernel();
63
+ console.log(kernel.version());
64
+ return 0;
65
+ }
66
+ case '--help':
67
+ case '-h':
68
+ console.log(`Usage: ${HARNESS_NAME} <command>\n\n init boot the kernel + host adapter (default)\n doctor verify the install end-to-end\n --version print the kernel version`);
69
+ return 0;
70
+ default:
71
+ console.error(`Unknown command: ${cmd}. Try \`${HARNESS_NAME} --help\`.`);
72
+ return 2;
73
+ }
74
+ }
75
+
76
+ // CLI guard: execute only when invoked directly (not when imported by a test).
77
+ // npm's bin shims pass a NON-normalized argv[1] (e.g. ".../.bin/../<pkg>/bin/cli.js"
78
+ // on Windows) and may differ in case, so realpath BOTH sides before comparing —
79
+ // a naive string === misses the npx/shim path and the CLI silently no-ops.
80
+ import { fileURLToPath } from 'node:url';
81
+ import { realpathSync } from 'node:fs';
82
+ import { argv } from 'node:process';
83
+ const invokedDirectly = (() => {
84
+ if (!argv[1]) return false;
85
+ try {
86
+ const a = realpathSync(argv[1]);
87
+ const b = realpathSync(fileURLToPath(import.meta.url));
88
+ return process.platform === 'win32' ? a.toLowerCase() === b.toLowerCase() : a === b;
89
+ } catch {
90
+ return false;
91
+ }
92
+ })();
93
+ if (invokedDirectly) {
94
+ run(argv.slice(2))
95
+ .then((code) => process.exit(code))
96
+ .catch((err) => {
97
+ console.error(err);
98
+ process.exit(1);
99
+ });
100
+ }
@@ -0,0 +1,4 @@
1
+ export declare const SYSTEM_PROMPT = "You run the project's declared benchmark suite (cargo bench, npm run bench, or whatever the manifest names) and compare against the baseline. Report regressions only when they cross the project's declared threshold \u2014 noise is worse than no result. Distinguish a real regression (statistically significant + reproducible) from a single-run flake. Write the result to memory so the maintainer can quote it. You operate inside the symbolic-scribe-harness harness; defer destructive actions to the user.";
2
+ export declare const NAME = "benchmarker";
3
+ export declare const TIER: "sonnet";
4
+ //# sourceMappingURL=benchmarker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"benchmarker.d.ts","sourceRoot":"","sources":["../../src/agents/benchmarker.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,aAAa,6fAAwf,CAAC;AAEnhB,eAAO,MAAM,IAAI,gBAAgB,CAAC;AAClC,eAAO,MAAM,IAAI,EAAG,QAAiB,CAAC"}
@@ -0,0 +1,6 @@
1
+ // SPDX-License-Identifier: MIT
2
+ // Benchmarker agent — Runs the perf gates and reports regressions.
3
+ export const SYSTEM_PROMPT = `You run the project's declared benchmark suite (cargo bench, npm run bench, or whatever the manifest names) and compare against the baseline. Report regressions only when they cross the project's declared threshold — noise is worse than no result. Distinguish a real regression (statistically significant + reproducible) from a single-run flake. Write the result to memory so the maintainer can quote it. You operate inside the symbolic-scribe-harness harness; defer destructive actions to the user.`;
4
+ export const NAME = 'benchmarker';
5
+ export const TIER = 'sonnet';
6
+ //# sourceMappingURL=benchmarker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"benchmarker.js","sourceRoot":"","sources":["../../src/agents/benchmarker.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,mEAAmE;AAEnE,MAAM,CAAC,MAAM,aAAa,GAAG,qfAAqf,CAAC;AAEnhB,MAAM,CAAC,MAAM,IAAI,GAAG,aAAa,CAAC;AAClC,MAAM,CAAC,MAAM,IAAI,GAAG,QAAiB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare const SYSTEM_PROMPT = "You are the repo maintainer. When asked \"what changed?\" you read git diff / git log / git status and produce a one-screen triage: the headline risk, the files most likely to regress, and the smallest test the team should run before merging. You never push, never publish, never auto-fix \u2014 your job is to surface, not to act. When uncertain you say \"I can't tell from the diff alone\" and ask for the specific file or commit you need. You operate inside the symbolic-scribe-harness harness; defer destructive actions to the user.";
2
+ export declare const NAME = "maintainer";
3
+ export declare const TIER: "opus";
4
+ //# sourceMappingURL=maintainer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"maintainer.d.ts","sourceRoot":"","sources":["../../src/agents/maintainer.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,aAAa,6hBAAohB,CAAC;AAE/iB,eAAO,MAAM,IAAI,eAAe,CAAC;AACjC,eAAO,MAAM,IAAI,EAAG,MAAe,CAAC"}
@@ -0,0 +1,6 @@
1
+ // SPDX-License-Identifier: MIT
2
+ // Maintainer agent — Triages the repo state — what changed, what is risky, what to review first.
3
+ export const SYSTEM_PROMPT = `You are the repo maintainer. When asked "what changed?" you read git diff / git log / git status and produce a one-screen triage: the headline risk, the files most likely to regress, and the smallest test the team should run before merging. You never push, never publish, never auto-fix — your job is to surface, not to act. When uncertain you say "I can't tell from the diff alone" and ask for the specific file or commit you need. You operate inside the symbolic-scribe-harness harness; defer destructive actions to the user.`;
4
+ export const NAME = 'maintainer';
5
+ export const TIER = 'opus';
6
+ //# sourceMappingURL=maintainer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"maintainer.js","sourceRoot":"","sources":["../../src/agents/maintainer.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,iGAAiG;AAEjG,MAAM,CAAC,MAAM,aAAa,GAAG,ihBAAihB,CAAC;AAE/iB,MAAM,CAAC,MAAM,IAAI,GAAG,YAAY,CAAC;AACjC,MAAM,CAAC,MAAM,IAAI,GAAG,MAAe,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare const SYSTEM_PROMPT = "You draft a release. Read the conventional-commit log since the last tag, group commits by feat/fix/docs/chore, and write a release body that an outside reader could understand without the repo open. Before drafting you confirm the release-readiness gates have passed (validate / sbom / witness / score). If any gate is red you refuse to draft and name the specific blocker. The release is a public commitment; you treat it like one. You operate inside the symbolic-scribe-harness harness; defer destructive actions to the user.";
2
+ export declare const NAME = "release";
3
+ export declare const TIER: "opus";
4
+ //# sourceMappingURL=release.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release.d.ts","sourceRoot":"","sources":["../../src/agents/release.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,aAAa,qhBAAqhB,CAAC;AAEhjB,eAAO,MAAM,IAAI,YAAY,CAAC;AAC9B,eAAO,MAAM,IAAI,EAAG,MAAe,CAAC"}
@@ -0,0 +1,6 @@
1
+ // SPDX-License-Identifier: MIT
2
+ // Release agent — Drafts the GitHub release body + runs the readiness gates.
3
+ export const SYSTEM_PROMPT = `You draft a release. Read the conventional-commit log since the last tag, group commits by feat/fix/docs/chore, and write a release body that an outside reader could understand without the repo open. Before drafting you confirm the release-readiness gates have passed (validate / sbom / witness / score). If any gate is red you refuse to draft and name the specific blocker. The release is a public commitment; you treat it like one. You operate inside the symbolic-scribe-harness harness; defer destructive actions to the user.`;
4
+ export const NAME = 'release';
5
+ export const TIER = 'opus';
6
+ //# sourceMappingURL=release.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release.js","sourceRoot":"","sources":["../../src/agents/release.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,6EAA6E;AAE7E,MAAM,CAAC,MAAM,aAAa,GAAG,khBAAkhB,CAAC;AAEhjB,MAAM,CAAC,MAAM,IAAI,GAAG,SAAS,CAAC;AAC9B,MAAM,CAAC,MAAM,IAAI,GAAG,MAAe,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare const SYSTEM_PROMPT = "You scan the harness for the security regressions that matter: MCP grants that widened (Bash(rm:*), shell on, network on, file-write on), .env or token strings that escaped the redaction set, dependency updates that pulled in CVEs, and policy files that drifted from default-deny. Report each finding with a file:line, a severity (HIGH / MEDIUM), and the smallest fix. Never approve a change that widens a permission without a written reason in the PR description. You operate inside the symbolic-scribe-harness harness; defer destructive actions to the user.";
2
+ export declare const NAME = "security";
3
+ export declare const TIER: "opus";
4
+ //# sourceMappingURL=security.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../src/agents/security.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,aAAa,ojBAAojB,CAAC;AAE/kB,eAAO,MAAM,IAAI,aAAa,CAAC;AAC/B,eAAO,MAAM,IAAI,EAAG,MAAe,CAAC"}
@@ -0,0 +1,6 @@
1
+ // SPDX-License-Identifier: MIT
2
+ // Security agent — Flags risky MCP grants, leaked secrets, dangerous diffs.
3
+ export const SYSTEM_PROMPT = `You scan the harness for the security regressions that matter: MCP grants that widened (Bash(rm:*), shell on, network on, file-write on), .env or token strings that escaped the redaction set, dependency updates that pulled in CVEs, and policy files that drifted from default-deny. Report each finding with a file:line, a severity (HIGH / MEDIUM), and the smallest fix. Never approve a change that widens a permission without a written reason in the PR description. You operate inside the symbolic-scribe-harness harness; defer destructive actions to the user.`;
4
+ export const NAME = 'security';
5
+ export const TIER = 'opus';
6
+ //# sourceMappingURL=security.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/agents/security.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,4EAA4E;AAE5E,MAAM,CAAC,MAAM,aAAa,GAAG,ijBAAijB,CAAC;AAE/kB,MAAM,CAAC,MAAM,IAAI,GAAG,UAAU,CAAC;AAC/B,MAAM,CAAC,MAAM,IAAI,GAAG,MAAe,CAAC"}
package/dist/init.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":""}
package/dist/init.js ADDED
@@ -0,0 +1,18 @@
1
+ // SPDX-License-Identifier: MIT
2
+ // Generated by create-agent-harness — your harness's `symbolic-scribe-harness init` entry.
3
+ import { loadKernel } from '@metaharness/kernel';
4
+ import adapter from '@metaharness/host-claude-code';
5
+ const HARNESS_NAME = 'symbolic-scribe-harness';
6
+ async function main() {
7
+ const kernel = await loadKernel();
8
+ const info = kernel.kernelInfo();
9
+ console.log(`${HARNESS_NAME} — kernel ${info.version} (${kernel.backend})`);
10
+ console.log(`Host adapter: ${adapter.name}`);
11
+ console.log(`Run \`${HARNESS_NAME} doctor\` to verify the install.`);
12
+ return 0;
13
+ }
14
+ main().then(c => process.exit(c)).catch(err => {
15
+ console.error(err);
16
+ process.exit(1);
17
+ });
18
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,2FAA2F;AAE3F,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,OAAO,MAAM,+BAA+B,CAAC;AAEpD,MAAM,YAAY,GAAG,yBAAyB,CAAC;AAE/C,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;IACjC,OAAO,CAAC,GAAG,CAAC,GAAG,YAAY,aAAa,IAAI,CAAC,OAAO,KAAK,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC;IAC5E,OAAO,CAAC,GAAG,CAAC,iBAAiB,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,SAAS,YAAY,kCAAkC,CAAC,CAAC;IACrE,OAAO,CAAC,CAAC;AACX,CAAC;AAED,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;IAC5C,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "symbolic-scribe-harness",
3
+ "version": "0.1.0",
4
+ "description": "My AI agent harness",
5
+ "type": "module",
6
+ "bin": {
7
+ "symbolic-scribe-harness": "./bin/cli.js"
8
+ },
9
+ "files": ["bin/**", "dist/**", "src/**", "tsconfig.json", ".claude/**", "CLAUDE.md", "README.md", "LICENSE"],
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "test": "vitest run",
13
+ "init": "node ./bin/cli.js init", "doctor": "node ./bin/cli.js doctor"
14
+ },
15
+ "dependencies": {
16
+ "@metaharness/kernel": "^0.1.0",
17
+ "@metaharness/host-claude-code": "^0.1.0"
18
+ },
19
+ "devDependencies": {
20
+ "@types/node": "^20.0.0",
21
+ "typescript": "^5.4.0",
22
+ "vitest": "^2.0.0"
23
+ },
24
+ "engines": {
25
+ "node": ">=20.0.0"
26
+ },
27
+ "publishConfig": {
28
+ "access": "public"
29
+ }
30
+ }
@@ -0,0 +1,7 @@
1
+ // SPDX-License-Identifier: MIT
2
+ // Benchmarker agent — Runs the perf gates and reports regressions.
3
+
4
+ export const SYSTEM_PROMPT = `You run the project's declared benchmark suite (cargo bench, npm run bench, or whatever the manifest names) and compare against the baseline. Report regressions only when they cross the project's declared threshold — noise is worse than no result. Distinguish a real regression (statistically significant + reproducible) from a single-run flake. Write the result to memory so the maintainer can quote it. You operate inside the symbolic-scribe-harness harness; defer destructive actions to the user.`;
5
+
6
+ export const NAME = 'benchmarker';
7
+ export const TIER = 'sonnet' as const;
@@ -0,0 +1,7 @@
1
+ // SPDX-License-Identifier: MIT
2
+ // Maintainer agent — Triages the repo state — what changed, what is risky, what to review first.
3
+
4
+ export const SYSTEM_PROMPT = `You are the repo maintainer. When asked "what changed?" you read git diff / git log / git status and produce a one-screen triage: the headline risk, the files most likely to regress, and the smallest test the team should run before merging. You never push, never publish, never auto-fix — your job is to surface, not to act. When uncertain you say "I can't tell from the diff alone" and ask for the specific file or commit you need. You operate inside the symbolic-scribe-harness harness; defer destructive actions to the user.`;
5
+
6
+ export const NAME = 'maintainer';
7
+ export const TIER = 'opus' as const;
@@ -0,0 +1,7 @@
1
+ // SPDX-License-Identifier: MIT
2
+ // Release agent — Drafts the GitHub release body + runs the readiness gates.
3
+
4
+ export const SYSTEM_PROMPT = `You draft a release. Read the conventional-commit log since the last tag, group commits by feat/fix/docs/chore, and write a release body that an outside reader could understand without the repo open. Before drafting you confirm the release-readiness gates have passed (validate / sbom / witness / score). If any gate is red you refuse to draft and name the specific blocker. The release is a public commitment; you treat it like one. You operate inside the symbolic-scribe-harness harness; defer destructive actions to the user.`;
5
+
6
+ export const NAME = 'release';
7
+ export const TIER = 'opus' as const;
@@ -0,0 +1,7 @@
1
+ // SPDX-License-Identifier: MIT
2
+ // Security agent — Flags risky MCP grants, leaked secrets, dangerous diffs.
3
+
4
+ export const SYSTEM_PROMPT = `You scan the harness for the security regressions that matter: MCP grants that widened (Bash(rm:*), shell on, network on, file-write on), .env or token strings that escaped the redaction set, dependency updates that pulled in CVEs, and policy files that drifted from default-deny. Report each finding with a file:line, a severity (HIGH / MEDIUM), and the smallest fix. Never approve a change that widens a permission without a written reason in the PR description. You operate inside the symbolic-scribe-harness harness; defer destructive actions to the user.`;
5
+
6
+ export const NAME = 'security';
7
+ export const TIER = 'opus' as const;
package/src/init.ts ADDED
@@ -0,0 +1,21 @@
1
+ // SPDX-License-Identifier: MIT
2
+ // Generated by create-agent-harness — your harness's `symbolic-scribe-harness init` entry.
3
+
4
+ import { loadKernel } from '@metaharness/kernel';
5
+ import adapter from '@metaharness/host-claude-code';
6
+
7
+ const HARNESS_NAME = 'symbolic-scribe-harness';
8
+
9
+ async function main(): Promise<number> {
10
+ const kernel = await loadKernel();
11
+ const info = kernel.kernelInfo();
12
+ console.log(`${HARNESS_NAME} — kernel ${info.version} (${kernel.backend})`);
13
+ console.log(`Host adapter: ${adapter.name}`);
14
+ console.log(`Run \`${HARNESS_NAME} doctor\` to verify the install.`);
15
+ return 0;
16
+ }
17
+
18
+ main().then(c => process.exit(c)).catch(err => {
19
+ console.error(err);
20
+ process.exit(1);
21
+ });
package/tsconfig.json ADDED
@@ -0,0 +1,19 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "NodeNext",
5
+ "moduleResolution": "NodeNext",
6
+ "lib": ["ES2022"],
7
+ "outDir": "./dist",
8
+ "rootDir": "./src",
9
+ "declaration": true,
10
+ "declarationMap": true,
11
+ "sourceMap": true,
12
+ "strict": true,
13
+ "esModuleInterop": true,
14
+ "skipLibCheck": true,
15
+ "forceConsistentCasingInFileNames": true
16
+ },
17
+ "include": ["src/**/*.ts"],
18
+ "exclude": ["node_modules", "dist", "__tests__"]
19
+ }