opencode-swarm-plugin 0.44.0 → 0.44.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/bin/swarm.serve.test.ts +6 -4
- package/bin/swarm.ts +16 -10
- package/dist/compaction-prompt-scoring.js +139 -0
- package/dist/eval-capture.js +12811 -0
- package/dist/hive.d.ts.map +1 -1
- package/dist/index.js +7644 -62599
- package/dist/plugin.js +23766 -78721
- package/dist/swarm-orchestrate.d.ts.map +1 -1
- package/dist/swarm-prompts.d.ts.map +1 -1
- package/dist/swarm-review.d.ts.map +1 -1
- package/package.json +17 -5
- package/.changeset/swarm-insights-data-layer.md +0 -63
- package/.hive/analysis/eval-failure-analysis-2025-12-25.md +0 -331
- package/.hive/analysis/session-data-quality-audit.md +0 -320
- package/.hive/eval-results.json +0 -483
- package/.hive/issues.jsonl +0 -138
- package/.hive/memories.jsonl +0 -729
- package/.opencode/eval-history.jsonl +0 -327
- package/.turbo/turbo-build.log +0 -9
- package/CHANGELOG.md +0 -2286
- package/SCORER-ANALYSIS.md +0 -598
- package/docs/analysis/subagent-coordination-patterns.md +0 -902
- package/docs/analysis-socratic-planner-pattern.md +0 -504
- package/docs/planning/ADR-001-monorepo-structure.md +0 -171
- package/docs/planning/ADR-002-package-extraction.md +0 -393
- package/docs/planning/ADR-003-performance-improvements.md +0 -451
- package/docs/planning/ADR-004-message-queue-features.md +0 -187
- package/docs/planning/ADR-005-devtools-observability.md +0 -202
- package/docs/planning/ADR-007-swarm-enhancements-worktree-review.md +0 -168
- package/docs/planning/ADR-008-worker-handoff-protocol.md +0 -293
- package/docs/planning/ADR-009-oh-my-opencode-patterns.md +0 -353
- package/docs/planning/ADR-010-cass-inhousing.md +0 -1215
- package/docs/planning/ROADMAP.md +0 -368
- package/docs/semantic-memory-cli-syntax.md +0 -123
- package/docs/swarm-mail-architecture.md +0 -1147
- package/docs/testing/context-recovery-test.md +0 -470
- package/evals/ARCHITECTURE.md +0 -1189
- package/evals/README.md +0 -768
- package/evals/compaction-prompt.eval.ts +0 -149
- package/evals/compaction-resumption.eval.ts +0 -289
- package/evals/coordinator-behavior.eval.ts +0 -307
- package/evals/coordinator-session.eval.ts +0 -154
- package/evals/evalite.config.ts.bak +0 -15
- package/evals/example.eval.ts +0 -31
- package/evals/fixtures/cass-baseline.ts +0 -217
- package/evals/fixtures/compaction-cases.ts +0 -350
- package/evals/fixtures/compaction-prompt-cases.ts +0 -311
- package/evals/fixtures/coordinator-sessions.ts +0 -328
- package/evals/fixtures/decomposition-cases.ts +0 -105
- package/evals/lib/compaction-loader.test.ts +0 -248
- package/evals/lib/compaction-loader.ts +0 -320
- package/evals/lib/data-loader.evalite-test.ts +0 -289
- package/evals/lib/data-loader.test.ts +0 -345
- package/evals/lib/data-loader.ts +0 -281
- package/evals/lib/llm.ts +0 -115
- package/evals/scorers/compaction-prompt-scorers.ts +0 -145
- package/evals/scorers/compaction-scorers.ts +0 -305
- package/evals/scorers/coordinator-discipline.evalite-test.ts +0 -539
- package/evals/scorers/coordinator-discipline.ts +0 -325
- package/evals/scorers/index.test.ts +0 -146
- package/evals/scorers/index.ts +0 -328
- package/evals/scorers/outcome-scorers.evalite-test.ts +0 -27
- package/evals/scorers/outcome-scorers.ts +0 -349
- package/evals/swarm-decomposition.eval.ts +0 -121
- package/examples/commands/swarm.md +0 -745
- package/examples/plugin-wrapper-template.ts +0 -2515
- package/examples/skills/hive-workflow/SKILL.md +0 -212
- package/examples/skills/skill-creator/SKILL.md +0 -223
- package/examples/skills/swarm-coordination/SKILL.md +0 -292
- package/global-skills/cli-builder/SKILL.md +0 -344
- package/global-skills/cli-builder/references/advanced-patterns.md +0 -244
- package/global-skills/learning-systems/SKILL.md +0 -644
- package/global-skills/skill-creator/LICENSE.txt +0 -202
- package/global-skills/skill-creator/SKILL.md +0 -352
- package/global-skills/skill-creator/references/output-patterns.md +0 -82
- package/global-skills/skill-creator/references/workflows.md +0 -28
- package/global-skills/swarm-coordination/SKILL.md +0 -995
- package/global-skills/swarm-coordination/references/coordinator-patterns.md +0 -235
- package/global-skills/swarm-coordination/references/strategies.md +0 -138
- package/global-skills/system-design/SKILL.md +0 -213
- package/global-skills/testing-patterns/SKILL.md +0 -430
- package/global-skills/testing-patterns/references/dependency-breaking-catalog.md +0 -586
- package/opencode-swarm-plugin-0.30.7.tgz +0 -0
- package/opencode-swarm-plugin-0.31.0.tgz +0 -0
- package/scripts/cleanup-test-memories.ts +0 -346
- package/scripts/init-skill.ts +0 -222
- package/scripts/migrate-unknown-sessions.ts +0 -349
- package/scripts/validate-skill.ts +0 -204
- package/src/agent-mail.ts +0 -1724
- package/src/anti-patterns.test.ts +0 -1167
- package/src/anti-patterns.ts +0 -448
- package/src/compaction-capture.integration.test.ts +0 -257
- package/src/compaction-hook.test.ts +0 -838
- package/src/compaction-hook.ts +0 -1204
- package/src/compaction-observability.integration.test.ts +0 -139
- package/src/compaction-observability.test.ts +0 -187
- package/src/compaction-observability.ts +0 -324
- package/src/compaction-prompt-scorers.test.ts +0 -475
- package/src/compaction-prompt-scoring.ts +0 -300
- package/src/contributor-tools.test.ts +0 -133
- package/src/contributor-tools.ts +0 -201
- package/src/dashboard.test.ts +0 -611
- package/src/dashboard.ts +0 -462
- package/src/error-enrichment.test.ts +0 -403
- package/src/error-enrichment.ts +0 -219
- package/src/eval-capture.test.ts +0 -1015
- package/src/eval-capture.ts +0 -929
- package/src/eval-gates.test.ts +0 -306
- package/src/eval-gates.ts +0 -218
- package/src/eval-history.test.ts +0 -508
- package/src/eval-history.ts +0 -214
- package/src/eval-learning.test.ts +0 -378
- package/src/eval-learning.ts +0 -360
- package/src/eval-runner.test.ts +0 -223
- package/src/eval-runner.ts +0 -402
- package/src/export-tools.test.ts +0 -476
- package/src/export-tools.ts +0 -257
- package/src/hive.integration.test.ts +0 -2241
- package/src/hive.ts +0 -1628
- package/src/index.ts +0 -940
- package/src/learning.integration.test.ts +0 -1815
- package/src/learning.ts +0 -1079
- package/src/logger.test.ts +0 -189
- package/src/logger.ts +0 -135
- package/src/mandate-promotion.test.ts +0 -473
- package/src/mandate-promotion.ts +0 -239
- package/src/mandate-storage.integration.test.ts +0 -601
- package/src/mandate-storage.test.ts +0 -578
- package/src/mandate-storage.ts +0 -794
- package/src/mandates.ts +0 -540
- package/src/memory-tools.test.ts +0 -195
- package/src/memory-tools.ts +0 -344
- package/src/memory.integration.test.ts +0 -334
- package/src/memory.test.ts +0 -158
- package/src/memory.ts +0 -527
- package/src/model-selection.test.ts +0 -188
- package/src/model-selection.ts +0 -68
- package/src/observability-tools.test.ts +0 -359
- package/src/observability-tools.ts +0 -871
- package/src/output-guardrails.test.ts +0 -438
- package/src/output-guardrails.ts +0 -381
- package/src/pattern-maturity.test.ts +0 -1160
- package/src/pattern-maturity.ts +0 -525
- package/src/planning-guardrails.test.ts +0 -491
- package/src/planning-guardrails.ts +0 -438
- package/src/plugin.ts +0 -23
- package/src/post-compaction-tracker.test.ts +0 -251
- package/src/post-compaction-tracker.ts +0 -237
- package/src/query-tools.test.ts +0 -636
- package/src/query-tools.ts +0 -324
- package/src/rate-limiter.integration.test.ts +0 -466
- package/src/rate-limiter.ts +0 -774
- package/src/replay-tools.test.ts +0 -496
- package/src/replay-tools.ts +0 -240
- package/src/repo-crawl.integration.test.ts +0 -441
- package/src/repo-crawl.ts +0 -610
- package/src/schemas/cell-events.test.ts +0 -347
- package/src/schemas/cell-events.ts +0 -807
- package/src/schemas/cell.ts +0 -257
- package/src/schemas/evaluation.ts +0 -166
- package/src/schemas/index.test.ts +0 -199
- package/src/schemas/index.ts +0 -286
- package/src/schemas/mandate.ts +0 -232
- package/src/schemas/swarm-context.ts +0 -115
- package/src/schemas/task.ts +0 -161
- package/src/schemas/worker-handoff.test.ts +0 -302
- package/src/schemas/worker-handoff.ts +0 -131
- package/src/sessions/agent-discovery.test.ts +0 -137
- package/src/sessions/agent-discovery.ts +0 -112
- package/src/sessions/index.ts +0 -15
- package/src/skills.integration.test.ts +0 -1192
- package/src/skills.test.ts +0 -643
- package/src/skills.ts +0 -1549
- package/src/storage.integration.test.ts +0 -341
- package/src/storage.ts +0 -884
- package/src/structured.integration.test.ts +0 -817
- package/src/structured.test.ts +0 -1046
- package/src/structured.ts +0 -762
- package/src/swarm-decompose.test.ts +0 -188
- package/src/swarm-decompose.ts +0 -1302
- package/src/swarm-deferred.integration.test.ts +0 -157
- package/src/swarm-deferred.test.ts +0 -38
- package/src/swarm-insights.test.ts +0 -214
- package/src/swarm-insights.ts +0 -459
- package/src/swarm-mail.integration.test.ts +0 -970
- package/src/swarm-mail.ts +0 -739
- package/src/swarm-orchestrate.integration.test.ts +0 -282
- package/src/swarm-orchestrate.test.ts +0 -548
- package/src/swarm-orchestrate.ts +0 -3084
- package/src/swarm-prompts.test.ts +0 -1270
- package/src/swarm-prompts.ts +0 -2077
- package/src/swarm-research.integration.test.ts +0 -701
- package/src/swarm-research.test.ts +0 -698
- package/src/swarm-research.ts +0 -472
- package/src/swarm-review.integration.test.ts +0 -285
- package/src/swarm-review.test.ts +0 -879
- package/src/swarm-review.ts +0 -709
- package/src/swarm-strategies.ts +0 -407
- package/src/swarm-worktree.test.ts +0 -501
- package/src/swarm-worktree.ts +0 -575
- package/src/swarm.integration.test.ts +0 -2377
- package/src/swarm.ts +0 -38
- package/src/tool-adapter.integration.test.ts +0 -1221
- package/src/tool-availability.ts +0 -461
- package/tsconfig.json +0 -28
package/bin/swarm.serve.test.ts
CHANGED
|
@@ -11,18 +11,18 @@ describe("swarm serve command", () => {
|
|
|
11
11
|
const args = ["serve", "--port", "8080"];
|
|
12
12
|
const port = args.includes("--port")
|
|
13
13
|
? Number.parseInt(args[args.indexOf("--port") + 1])
|
|
14
|
-
:
|
|
14
|
+
: 4483;
|
|
15
15
|
|
|
16
16
|
expect(port).toBe(8080);
|
|
17
17
|
});
|
|
18
18
|
|
|
19
|
-
test("serve command defaults to port
|
|
19
|
+
test("serve command defaults to port 4483 (HIVE on phone keypad)", () => {
|
|
20
20
|
const args = ["serve"];
|
|
21
21
|
const port = args.includes("--port")
|
|
22
22
|
? Number.parseInt(args[args.indexOf("--port") + 1])
|
|
23
|
-
:
|
|
23
|
+
: 4483;
|
|
24
24
|
|
|
25
|
-
expect(port).toBe(
|
|
25
|
+
expect(port).toBe(4483);
|
|
26
26
|
});
|
|
27
27
|
|
|
28
28
|
test("serve command uses project path from CWD", () => {
|
|
@@ -32,7 +32,9 @@ describe("swarm serve command", () => {
|
|
|
32
32
|
});
|
|
33
33
|
|
|
34
34
|
test("serve command appears in help text", async () => {
|
|
35
|
+
const packageDir = import.meta.dir.replace("/bin", "");
|
|
35
36
|
const proc = spawn(["bun", "run", "bin/swarm.ts", "help"], {
|
|
37
|
+
cwd: packageDir,
|
|
36
38
|
stdout: "pipe",
|
|
37
39
|
stderr: "pipe",
|
|
38
40
|
});
|
package/bin/swarm.ts
CHANGED
|
@@ -2917,9 +2917,9 @@ ${cyan("Commands:")}
|
|
|
2917
2917
|
swarm config Show paths to generated config files
|
|
2918
2918
|
swarm agents Update AGENTS.md with skill awareness
|
|
2919
2919
|
swarm migrate Migrate PGlite database to libSQL
|
|
2920
|
-
swarm serve Start SSE server for real-time event streaming
|
|
2921
|
-
--port <n> Port to listen on (default:
|
|
2922
|
-
swarm viz
|
|
2920
|
+
swarm serve Start SSE server for real-time event streaming (port 4483 - HIVE)
|
|
2921
|
+
--port <n> Port to listen on (default: 4483)
|
|
2922
|
+
swarm viz Alias for 'swarm serve' (deprecated, use serve)
|
|
2923
2923
|
--port <n> Port to listen on (default: 4483)
|
|
2924
2924
|
swarm cells List or get cells from database (replaces 'swarm tool hive_query')
|
|
2925
2925
|
swarm log View swarm logs with filtering
|
|
@@ -4921,21 +4921,21 @@ async function evalRun() {
|
|
|
4921
4921
|
async function serve() {
|
|
4922
4922
|
p.intro("swarm serve v" + VERSION);
|
|
4923
4923
|
|
|
4924
|
-
// Parse --port flag (default
|
|
4924
|
+
// Parse --port flag (default 4483 - HIVE on phone keypad)
|
|
4925
4925
|
const portFlagIndex = process.argv.indexOf("--port");
|
|
4926
4926
|
const port = portFlagIndex !== -1
|
|
4927
|
-
? Number.parseInt(process.argv[portFlagIndex + 1]) ||
|
|
4928
|
-
:
|
|
4927
|
+
? Number.parseInt(process.argv[portFlagIndex + 1]) || 4483
|
|
4928
|
+
: 4483;
|
|
4929
4929
|
|
|
4930
4930
|
const projectPath = process.cwd();
|
|
4931
4931
|
|
|
4932
4932
|
p.log.step("Starting DurableStreamServer...");
|
|
4933
4933
|
p.log.message(dim(` Project: ${projectPath}`));
|
|
4934
|
-
p.log.message(dim(` Port: ${port}`));
|
|
4934
|
+
p.log.message(dim(` Port: ${port} (HIVE on phone keypad)`));
|
|
4935
4935
|
|
|
4936
4936
|
try {
|
|
4937
4937
|
// Import dependencies
|
|
4938
|
-
const { getSwarmMailLibSQL } = await import("swarm-mail");
|
|
4938
|
+
const { getSwarmMailLibSQL, createHiveAdapter } = await import("swarm-mail");
|
|
4939
4939
|
const { createDurableStreamAdapter, createDurableStreamServer } = await import("swarm-mail");
|
|
4940
4940
|
|
|
4941
4941
|
// Get swarm-mail adapter
|
|
@@ -4944,9 +4944,14 @@ async function serve() {
|
|
|
4944
4944
|
// Create stream adapter
|
|
4945
4945
|
const streamAdapter = createDurableStreamAdapter(swarmMail, projectPath);
|
|
4946
4946
|
|
|
4947
|
+
// Create hive adapter for cells endpoint
|
|
4948
|
+
const db = await swarmMail.getDatabase(projectPath);
|
|
4949
|
+
const hiveAdapter = createHiveAdapter(db, projectPath);
|
|
4950
|
+
|
|
4947
4951
|
// Create and start server
|
|
4948
4952
|
const server = createDurableStreamServer({
|
|
4949
4953
|
adapter: streamAdapter,
|
|
4954
|
+
hiveAdapter,
|
|
4950
4955
|
port,
|
|
4951
4956
|
projectKey: projectPath,
|
|
4952
4957
|
});
|
|
@@ -4955,8 +4960,9 @@ async function serve() {
|
|
|
4955
4960
|
|
|
4956
4961
|
p.log.success("Server started!");
|
|
4957
4962
|
p.log.message("");
|
|
4958
|
-
p.log.message(cyan(
|
|
4963
|
+
p.log.message(cyan(` Dashboard: http://localhost:5173`));
|
|
4959
4964
|
p.log.message(cyan(` SSE Endpoint: ${server.url}/streams/${encodeURIComponent(projectPath)}`));
|
|
4965
|
+
p.log.message(cyan(` Cells API: ${server.url}/cells`));
|
|
4960
4966
|
p.log.message("");
|
|
4961
4967
|
p.log.message(dim(" Press Ctrl+C to stop"));
|
|
4962
4968
|
|
|
@@ -5001,7 +5007,7 @@ async function viz() {
|
|
|
5001
5007
|
const streamAdapter = createDurableStreamAdapter(swarmMail, projectPath);
|
|
5002
5008
|
|
|
5003
5009
|
// Create hive adapter for cells endpoint
|
|
5004
|
-
const db = swarmMail.
|
|
5010
|
+
const db = await swarmMail.getDatabase(projectPath);
|
|
5005
5011
|
const hiveAdapter = createHiveAdapter(db, projectPath);
|
|
5006
5012
|
|
|
5007
5013
|
// Create and start server
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
// src/compaction-prompt-scoring.ts
|
|
2
|
+
var REAL_EPIC_ID = /mjkw[a-z0-9]{7,}/;
|
|
3
|
+
var PLACEHOLDERS = [
|
|
4
|
+
/<epic-id>/i,
|
|
5
|
+
/bd-xxx/,
|
|
6
|
+
/<path>/i,
|
|
7
|
+
/<project>/i
|
|
8
|
+
];
|
|
9
|
+
var ASCII_BOX = /[┌┐└┘─│]{3,}/;
|
|
10
|
+
var STRONG_LANGUAGE = [/\bNEVER\b/, /\bALWAYS\b/, /\bNON-NEGOTIABLE\b/];
|
|
11
|
+
function scoreEpicIdSpecificity(prompt) {
|
|
12
|
+
for (const pattern of PLACEHOLDERS) {
|
|
13
|
+
if (pattern.test(prompt.content)) {
|
|
14
|
+
return {
|
|
15
|
+
score: 0,
|
|
16
|
+
message: `Found placeholder: ${pattern.source}`
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
if (REAL_EPIC_ID.test(prompt.content)) {
|
|
21
|
+
return {
|
|
22
|
+
score: 1,
|
|
23
|
+
message: "Contains real epic ID"
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
return {
|
|
27
|
+
score: 0,
|
|
28
|
+
message: "No epic ID found"
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
function scoreActionability(prompt) {
|
|
32
|
+
const actionableTools = [
|
|
33
|
+
/swarm_status\([^)]*epic_id\s*=\s*['"]mjkw[a-z0-9]{7,}['"]/,
|
|
34
|
+
/swarmmail_inbox\(\)/
|
|
35
|
+
];
|
|
36
|
+
for (const pattern of actionableTools) {
|
|
37
|
+
if (pattern.test(prompt.content)) {
|
|
38
|
+
return {
|
|
39
|
+
score: 1,
|
|
40
|
+
message: "Contains actionable tool call with real values"
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (/swarm_status\([^)]*<epic-id>/.test(prompt.content) || /swarm_status\([^)]*<path>/.test(prompt.content)) {
|
|
45
|
+
return {
|
|
46
|
+
score: 0,
|
|
47
|
+
message: "Tool call has placeholders"
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
score: 0,
|
|
52
|
+
message: "No actionable tool calls found"
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
function scoreCoordinatorIdentity(prompt) {
|
|
56
|
+
const hasAsciiHeader = ASCII_BOX.test(prompt.content) && /(YOU ARE THE COORDINATOR|COORDINATOR MODE)/i.test(prompt.content);
|
|
57
|
+
if (!hasAsciiHeader) {
|
|
58
|
+
return {
|
|
59
|
+
score: 0,
|
|
60
|
+
message: "No ASCII header found"
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
const hasStrongLanguage = STRONG_LANGUAGE.some((pattern) => pattern.test(prompt.content));
|
|
64
|
+
if (!hasStrongLanguage) {
|
|
65
|
+
return {
|
|
66
|
+
score: 0.5,
|
|
67
|
+
message: "ASCII header present but weak language"
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
score: 1,
|
|
72
|
+
message: "ASCII header + strong mandates present"
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
function scoreForbiddenToolsPresent(prompt) {
|
|
76
|
+
const forbiddenTools = [
|
|
77
|
+
/\bEdit\b/i,
|
|
78
|
+
/\bWrite\b/i,
|
|
79
|
+
/swarmmail_reserve/,
|
|
80
|
+
/git commit/,
|
|
81
|
+
/\bbash\b/i
|
|
82
|
+
];
|
|
83
|
+
const foundTools = forbiddenTools.filter((pattern) => pattern.test(prompt.content));
|
|
84
|
+
const score = foundTools.length / forbiddenTools.length;
|
|
85
|
+
if (score === 1) {
|
|
86
|
+
return {
|
|
87
|
+
score: 1,
|
|
88
|
+
message: "All 5 forbidden tools listed"
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
if (score === 0) {
|
|
92
|
+
return {
|
|
93
|
+
score: 0,
|
|
94
|
+
message: "No forbidden tools listed (0/5)"
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
return {
|
|
98
|
+
score,
|
|
99
|
+
message: `${foundTools.length}/5 forbidden tools listed`
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
function scorePostCompactionDiscipline(prompt) {
|
|
103
|
+
const toolCallPattern = /\b(swarm_status|swarmmail_inbox|Edit|Write|Read)\b/i;
|
|
104
|
+
const match = prompt.content.match(toolCallPattern);
|
|
105
|
+
if (!match) {
|
|
106
|
+
return {
|
|
107
|
+
score: 0,
|
|
108
|
+
message: "No tool calls found"
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
const firstTool = match[1].toLowerCase();
|
|
112
|
+
if (firstTool === "swarm_status") {
|
|
113
|
+
return {
|
|
114
|
+
score: 1,
|
|
115
|
+
message: "First tool is swarm_status (correct)"
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
if (firstTool === "swarmmail_inbox") {
|
|
119
|
+
return {
|
|
120
|
+
score: 1,
|
|
121
|
+
message: "First tool is inbox (correct)"
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
return {
|
|
125
|
+
score: 0,
|
|
126
|
+
message: `First tool is ${match[1]} (should be swarm_status or inbox)`
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
export {
|
|
130
|
+
scorePostCompactionDiscipline,
|
|
131
|
+
scoreForbiddenToolsPresent,
|
|
132
|
+
scoreEpicIdSpecificity,
|
|
133
|
+
scoreCoordinatorIdentity,
|
|
134
|
+
scoreActionability,
|
|
135
|
+
STRONG_LANGUAGE,
|
|
136
|
+
REAL_EPIC_ID,
|
|
137
|
+
PLACEHOLDERS,
|
|
138
|
+
ASCII_BOX
|
|
139
|
+
};
|