@alisio/plugin-swarm 0.0.0-stage → 0.1.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/.agents/agents/swarm-architect.md +20 -0
- package/.agents/agents/swarm-cleaner.md +20 -0
- package/.agents/agents/swarm-coder.md +20 -0
- package/.agents/agents/swarm-hardener.md +20 -0
- package/.agents/agents/swarm-lieutenant.md +20 -0
- package/.agents/agents/swarm-qa.md +20 -0
- package/.agents/agents/swarm-refactorer.md +20 -0
- package/.agents/agents/swarm-specifier.md +20 -0
- package/.agents/skills/swarm-architecture-rules/SKILL.md +43 -0
- package/.agents/skills/swarm-clarification/SKILL.md +42 -0
- package/.agents/skills/swarm-cleaner-metrics/SKILL.md +44 -0
- package/.agents/skills/swarm-engineering-constitution/SKILL.md +44 -0
- package/.agents/skills/swarm-gherkin-spec/SKILL.md +43 -0
- package/.agents/skills/swarm-handoff-protocol/SKILL.md +45 -0
- package/.agents/skills/swarm-lieutenant/SKILL.md +41 -0
- package/.agents/skills/swarm-mutation-hardening/SKILL.md +43 -0
- package/.agents/skills/swarm-qa-acceptance/SKILL.md +42 -0
- package/.agents/skills/swarm-tdd-slice/SKILL.md +44 -0
- package/.agents/skills/swarm-toolchain-profile/SKILL.md +41 -0
- package/LICENSE +21 -0
- package/README.es.md +337 -0
- package/README.md +322 -2
- package/assets/approval-flow.svg +1 -0
- package/assets/architecture.svg +1 -0
- package/assets/audit-states.svg +1 -0
- package/assets/dashboard.css +964 -0
- package/assets/dashboard.html +123 -0
- package/assets/dashboard.js +965 -0
- package/assets/dashboard.svg +1 -0
- package/assets/handoff-sequence.svg +1 -0
- package/assets/pack-pipelines.svg +1 -0
- package/assets/packs/four-pack/pack.json +18 -0
- package/assets/packs/six-pack/pack.json +22 -0
- package/assets/packs/two-pack/pack.json +14 -0
- package/assets/screenshots/dashboard-board-dark.png +0 -0
- package/assets/screenshots/dashboard-board-light.png +0 -0
- package/assets/screenshots/dashboard-documents-diff.png +0 -0
- package/assets/screenshots/dashboard-empty-state.png +0 -0
- package/assets/screenshots/dashboard-phone.png +0 -0
- package/assets/screenshots/dashboard-reject-dialog.png +0 -0
- package/assets/screenshots/dashboard-transcript-tail.png +0 -0
- package/assets/screenshots/dashboard-work-queue.png +0 -0
- package/assets/task-states.svg +1 -0
- package/assets/toolchains/node-ts.json +61 -0
- package/cover.svg +46 -0
- package/dist/adapters/child-session-runner.d.ts +36 -0
- package/dist/adapters/child-session-runner.d.ts.map +1 -0
- package/dist/adapters/child-session-runner.js +156 -0
- package/dist/adapters/child-session-runner.js.map +1 -0
- package/dist/adapters/fs-board-store.d.ts +11 -0
- package/dist/adapters/fs-board-store.d.ts.map +1 -0
- package/dist/adapters/fs-board-store.js +27 -0
- package/dist/adapters/fs-board-store.js.map +1 -0
- package/dist/adapters/fs-handoff-store.d.ts +36 -0
- package/dist/adapters/fs-handoff-store.d.ts.map +1 -0
- package/dist/adapters/fs-handoff-store.js +254 -0
- package/dist/adapters/fs-handoff-store.js.map +1 -0
- package/dist/adapters/fs-task-state-store.d.ts +16 -0
- package/dist/adapters/fs-task-state-store.d.ts.map +1 -0
- package/dist/adapters/fs-task-state-store.js +66 -0
- package/dist/adapters/fs-task-state-store.js.map +1 -0
- package/dist/adapters/git-worktree.d.ts +31 -0
- package/dist/adapters/git-worktree.d.ts.map +1 -0
- package/dist/adapters/git-worktree.js +209 -0
- package/dist/adapters/git-worktree.js.map +1 -0
- package/dist/adapters/process-exec.d.ts +36 -0
- package/dist/adapters/process-exec.d.ts.map +1 -0
- package/dist/adapters/process-exec.js +138 -0
- package/dist/adapters/process-exec.js.map +1 -0
- package/dist/adapters/process-gate-runner.d.ts +39 -0
- package/dist/adapters/process-gate-runner.d.ts.map +1 -0
- package/dist/adapters/process-gate-runner.js +242 -0
- package/dist/adapters/process-gate-runner.js.map +1 -0
- package/dist/adapters/unavailable-runner.d.ts +4 -0
- package/dist/adapters/unavailable-runner.d.ts.map +1 -0
- package/dist/adapters/unavailable-runner.js +12 -0
- package/dist/adapters/unavailable-runner.js.map +1 -0
- package/dist/app/audit.d.ts +23 -0
- package/dist/app/audit.d.ts.map +1 -0
- package/dist/app/audit.js +9 -0
- package/dist/app/audit.js.map +1 -0
- package/dist/app/budget.d.ts +29 -0
- package/dist/app/budget.d.ts.map +1 -0
- package/dist/app/budget.js +78 -0
- package/dist/app/budget.js.map +1 -0
- package/dist/app/chat-store.d.ts +18 -0
- package/dist/app/chat-store.d.ts.map +1 -0
- package/dist/app/chat-store.js +48 -0
- package/dist/app/chat-store.js.map +1 -0
- package/dist/app/documents.d.ts +33 -0
- package/dist/app/documents.d.ts.map +1 -0
- package/dist/app/documents.js +63 -0
- package/dist/app/documents.js.map +1 -0
- package/dist/app/forge.d.ts +106 -0
- package/dist/app/forge.d.ts.map +1 -0
- package/dist/app/forge.js +420 -0
- package/dist/app/forge.js.map +1 -0
- package/dist/app/operator.d.ts +46 -0
- package/dist/app/operator.d.ts.map +1 -0
- package/dist/app/operator.js +168 -0
- package/dist/app/operator.js.map +1 -0
- package/dist/app/pidfile.d.ts +18 -0
- package/dist/app/pidfile.d.ts.map +1 -0
- package/dist/app/pidfile.js +56 -0
- package/dist/app/pidfile.js.map +1 -0
- package/dist/app/project.d.ts +93 -0
- package/dist/app/project.d.ts.map +1 -0
- package/dist/app/project.js +291 -0
- package/dist/app/project.js.map +1 -0
- package/dist/app/prompts.d.ts +48 -0
- package/dist/app/prompts.d.ts.map +1 -0
- package/dist/app/prompts.js +88 -0
- package/dist/app/prompts.js.map +1 -0
- package/dist/app/pump.d.ts +144 -0
- package/dist/app/pump.d.ts.map +1 -0
- package/dist/app/pump.js +707 -0
- package/dist/app/pump.js.map +1 -0
- package/dist/app/services.d.ts +112 -0
- package/dist/app/services.d.ts.map +1 -0
- package/dist/app/services.js +323 -0
- package/dist/app/services.js.map +1 -0
- package/dist/app/state.d.ts +70 -0
- package/dist/app/state.d.ts.map +1 -0
- package/dist/app/state.js +96 -0
- package/dist/app/state.js.map +1 -0
- package/dist/args.d.ts +10 -0
- package/dist/args.d.ts.map +1 -0
- package/dist/args.js +33 -0
- package/dist/args.js.map +1 -0
- package/dist/coordinator.d.ts +80 -0
- package/dist/coordinator.d.ts.map +1 -0
- package/dist/coordinator.js +481 -0
- package/dist/coordinator.js.map +1 -0
- package/dist/dashboard/api.d.ts +28 -0
- package/dist/dashboard/api.d.ts.map +1 -0
- package/dist/dashboard/api.js +178 -0
- package/dist/dashboard/api.js.map +1 -0
- package/dist/dashboard/auth.d.ts +13 -0
- package/dist/dashboard/auth.d.ts.map +1 -0
- package/dist/dashboard/auth.js +36 -0
- package/dist/dashboard/auth.js.map +1 -0
- package/dist/dashboard/open.d.ts +7 -0
- package/dist/dashboard/open.d.ts.map +1 -0
- package/dist/dashboard/open.js +17 -0
- package/dist/dashboard/open.js.map +1 -0
- package/dist/dashboard/server.d.ts +28 -0
- package/dist/dashboard/server.d.ts.map +1 -0
- package/dist/dashboard/server.js +176 -0
- package/dist/dashboard/server.js.map +1 -0
- package/dist/doctor.d.ts +28 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +108 -0
- package/dist/doctor.js.map +1 -0
- package/dist/domain/attention.d.ts +20 -0
- package/dist/domain/attention.d.ts.map +1 -0
- package/dist/domain/attention.js +41 -0
- package/dist/domain/attention.js.map +1 -0
- package/dist/domain/envelope.d.ts +37 -0
- package/dist/domain/envelope.d.ts.map +1 -0
- package/dist/domain/envelope.js +106 -0
- package/dist/domain/envelope.js.map +1 -0
- package/dist/domain/handoff.d.ts +57 -0
- package/dist/domain/handoff.d.ts.map +1 -0
- package/dist/domain/handoff.js +191 -0
- package/dist/domain/handoff.js.map +1 -0
- package/dist/domain/identifiers.d.ts +18 -0
- package/dist/domain/identifiers.d.ts.map +1 -0
- package/dist/domain/identifiers.js +70 -0
- package/dist/domain/identifiers.js.map +1 -0
- package/dist/domain/pack.d.ts +45 -0
- package/dist/domain/pack.d.ts.map +1 -0
- package/dist/domain/pack.js +207 -0
- package/dist/domain/pack.js.map +1 -0
- package/dist/domain/pipeline.d.ts +33 -0
- package/dist/domain/pipeline.d.ts.map +1 -0
- package/dist/domain/pipeline.js +50 -0
- package/dist/domain/pipeline.js.map +1 -0
- package/dist/domain/task.d.ts +26 -0
- package/dist/domain/task.d.ts.map +1 -0
- package/dist/domain/task.js +154 -0
- package/dist/domain/task.js.map +1 -0
- package/dist/domain/taskstate.d.ts +37 -0
- package/dist/domain/taskstate.d.ts.map +1 -0
- package/dist/domain/taskstate.js +98 -0
- package/dist/domain/taskstate.js.map +1 -0
- package/dist/gates/dry.d.ts +14 -0
- package/dist/gates/dry.d.ts.map +1 -0
- package/dist/gates/dry.js +71 -0
- package/dist/gates/dry.js.map +1 -0
- package/dist/gates/parsers.d.ts +34 -0
- package/dist/gates/parsers.d.ts.map +1 -0
- package/dist/gates/parsers.js +120 -0
- package/dist/gates/parsers.js.map +1 -0
- package/dist/index.d.ts +45 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +207 -0
- package/dist/index.js.map +1 -0
- package/dist/options.d.ts +13 -0
- package/dist/options.d.ts.map +1 -0
- package/dist/options.js +27 -0
- package/dist/options.js.map +1 -0
- package/dist/panel.d.ts +5 -0
- package/dist/panel.d.ts.map +1 -0
- package/dist/panel.js +52 -0
- package/dist/panel.js.map +1 -0
- package/dist/ports/agent-runner.d.ts +51 -0
- package/dist/ports/agent-runner.d.ts.map +1 -0
- package/dist/ports/agent-runner.js +2 -0
- package/dist/ports/agent-runner.js.map +1 -0
- package/dist/ports/board-store.d.ts +7 -0
- package/dist/ports/board-store.d.ts.map +1 -0
- package/dist/ports/board-store.js +2 -0
- package/dist/ports/board-store.js.map +1 -0
- package/dist/ports/clock.d.ts +5 -0
- package/dist/ports/clock.d.ts.map +1 -0
- package/dist/ports/clock.js +2 -0
- package/dist/ports/clock.js.map +1 -0
- package/dist/ports/gate-runner.d.ts +34 -0
- package/dist/ports/gate-runner.d.ts.map +1 -0
- package/dist/ports/gate-runner.js +2 -0
- package/dist/ports/gate-runner.js.map +1 -0
- package/dist/ports/handoff-store.d.ts +39 -0
- package/dist/ports/handoff-store.d.ts.map +1 -0
- package/dist/ports/handoff-store.js +2 -0
- package/dist/ports/handoff-store.js.map +1 -0
- package/dist/ports/isolation.d.ts +43 -0
- package/dist/ports/isolation.d.ts.map +1 -0
- package/dist/ports/isolation.js +2 -0
- package/dist/ports/isolation.js.map +1 -0
- package/dist/ports/notifier.d.ts +28 -0
- package/dist/ports/notifier.d.ts.map +1 -0
- package/dist/ports/notifier.js +2 -0
- package/dist/ports/notifier.js.map +1 -0
- package/dist/ports/task-state-store.d.ts +10 -0
- package/dist/ports/task-state-store.d.ts.map +1 -0
- package/dist/ports/task-state-store.js +2 -0
- package/dist/ports/task-state-store.js.map +1 -0
- package/dist/refs.d.ts +10 -0
- package/dist/refs.d.ts.map +1 -0
- package/dist/refs.js +19 -0
- package/dist/refs.js.map +1 -0
- package/dist/resources.d.ts +55 -0
- package/dist/resources.d.ts.map +1 -0
- package/dist/resources.js +255 -0
- package/dist/resources.js.map +1 -0
- package/dist/status.d.ts +18 -0
- package/dist/status.d.ts.map +1 -0
- package/dist/status.js +60 -0
- package/dist/status.js.map +1 -0
- package/dist/storage.d.ts +18 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +79 -0
- package/dist/storage.js.map +1 -0
- package/dist/toolchains/profile.d.ts +21 -0
- package/dist/toolchains/profile.d.ts.map +1 -0
- package/dist/toolchains/profile.js +60 -0
- package/dist/toolchains/profile.js.map +1 -0
- package/dist/toolchains/thresholds.d.ts +29 -0
- package/dist/toolchains/thresholds.d.ts.map +1 -0
- package/dist/toolchains/thresholds.js +45 -0
- package/dist/toolchains/thresholds.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/package.json +51 -3
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/** Closed set of built-in output parsers a profile may name (data, never code). */
|
|
2
|
+
export declare const parserNames: readonly ["exit-code", "istanbul-summary", "eslint-complexity", "stryker-json"];
|
|
3
|
+
export type ParserName = (typeof parserNames)[number];
|
|
4
|
+
export declare const commandNames: readonly ["test", "coverage", "complexity", "mutation", "acceptance"];
|
|
5
|
+
export type CommandName = (typeof commandNames)[number];
|
|
6
|
+
export interface ToolchainCommand {
|
|
7
|
+
/** Argument vector run without a shell. */
|
|
8
|
+
argv: string[];
|
|
9
|
+
parser: ParserName;
|
|
10
|
+
/** Report file (relative to the working directory) the parser reads instead of stdout. */
|
|
11
|
+
report?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface Toolchain {
|
|
14
|
+
schemaVersion: 1;
|
|
15
|
+
id: string;
|
|
16
|
+
description: string;
|
|
17
|
+
detect: string[];
|
|
18
|
+
commands: Partial<Record<CommandName, ToolchainCommand>>;
|
|
19
|
+
}
|
|
20
|
+
export declare function parseToolchain(input: unknown): Toolchain;
|
|
21
|
+
//# sourceMappingURL=profile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../../src/toolchains/profile.ts"],"names":[],"mappings":"AAEA,mFAAmF;AACnF,eAAO,MAAM,WAAW,YACtB,WAAW,EACX,kBAAkB,EAClB,mBAAmB,EACnB,cAAc,CACN,CAAC;AACX,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAEtD,eAAO,MAAM,YAAY,YAAI,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,CAAU,CAAC;AAClG,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAExD,MAAM,WAAW,gBAAgB;IAC/B,2CAA2C;IAC3C,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,EAAE,UAAU,CAAC;IACnB,0FAA0F;IAC1F,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,aAAa,EAAE,CAAC,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC,CAAC;CAC1D;AAMD,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,CA8CxD"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { assertRelativePath } from "../domain/identifiers.js";
|
|
2
|
+
/** Closed set of built-in output parsers a profile may name (data, never code). */
|
|
3
|
+
export const parserNames = [
|
|
4
|
+
"exit-code",
|
|
5
|
+
"istanbul-summary",
|
|
6
|
+
"eslint-complexity",
|
|
7
|
+
"stryker-json",
|
|
8
|
+
];
|
|
9
|
+
export const commandNames = ["test", "coverage", "complexity", "mutation", "acceptance"];
|
|
10
|
+
const idPattern = /^[a-z][a-z0-9-]{0,31}$/;
|
|
11
|
+
const isRecord = (value) => Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
12
|
+
export function parseToolchain(input) {
|
|
13
|
+
if (!isRecord(input))
|
|
14
|
+
throw new Error("A toolchain profile must be a JSON object");
|
|
15
|
+
for (const key of Object.keys(input)) {
|
|
16
|
+
if (!["schemaVersion", "id", "description", "detect", "commands"].includes(key)) {
|
|
17
|
+
throw new Error(`Unknown key "${key}" in toolchain profile`);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
if (input.schemaVersion !== 1)
|
|
21
|
+
throw new Error("Unsupported toolchain schemaVersion (expected 1)");
|
|
22
|
+
if (typeof input.id !== "string" || !idPattern.test(input.id)) {
|
|
23
|
+
throw new Error("Invalid toolchain id: use lowercase letters, digits or hyphens");
|
|
24
|
+
}
|
|
25
|
+
if (typeof input.description !== "string" || !input.description.trim()) {
|
|
26
|
+
throw new Error("A toolchain profile needs a description");
|
|
27
|
+
}
|
|
28
|
+
const detect = Array.isArray(input.detect)
|
|
29
|
+
? input.detect.map((p) => assertRelativePath(p))
|
|
30
|
+
: [];
|
|
31
|
+
if (!isRecord(input.commands))
|
|
32
|
+
throw new Error("A toolchain profile needs commands");
|
|
33
|
+
const commands = {};
|
|
34
|
+
for (const [name, raw] of Object.entries(input.commands)) {
|
|
35
|
+
if (!commandNames.includes(name)) {
|
|
36
|
+
throw new Error(`Unknown command "${name}" in toolchain profile`);
|
|
37
|
+
}
|
|
38
|
+
if (!isRecord(raw))
|
|
39
|
+
throw new Error(`Invalid command ${name}: expected an object`);
|
|
40
|
+
for (const key of Object.keys(raw)) {
|
|
41
|
+
if (key !== "argv" && key !== "parser" && key !== "report")
|
|
42
|
+
throw new Error(`Unknown key "${key}" in command ${name}`);
|
|
43
|
+
}
|
|
44
|
+
if (!Array.isArray(raw.argv) ||
|
|
45
|
+
raw.argv.length === 0 ||
|
|
46
|
+
!raw.argv.every((item) => typeof item === "string" && item.length > 0 && !item.includes("\0"))) {
|
|
47
|
+
throw new Error(`Invalid argv for command ${name}: expected a non-empty array of strings`);
|
|
48
|
+
}
|
|
49
|
+
if (!parserNames.includes(raw.parser)) {
|
|
50
|
+
throw new Error(`Invalid parser for command ${name}`);
|
|
51
|
+
}
|
|
52
|
+
commands[name] = {
|
|
53
|
+
argv: raw.argv,
|
|
54
|
+
parser: raw.parser,
|
|
55
|
+
...(raw.report !== undefined ? { report: assertRelativePath(raw.report) } : {}),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
return { schemaVersion: 1, id: input.id, description: input.description, detect, commands };
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=profile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile.js","sourceRoot":"","sources":["../../src/toolchains/profile.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Thresholds } from "../domain/pack.js";
|
|
2
|
+
export interface FunctionMetric {
|
|
3
|
+
file: string;
|
|
4
|
+
name: string;
|
|
5
|
+
/** Cyclomatic complexity, at least 1. */
|
|
6
|
+
complexity: number;
|
|
7
|
+
/** Line/branch coverage as a fraction from 0 to 1. */
|
|
8
|
+
coverage: number;
|
|
9
|
+
}
|
|
10
|
+
export interface Measurements {
|
|
11
|
+
/** Overall coverage in percent. */
|
|
12
|
+
coverage?: number;
|
|
13
|
+
/** Mutation score in percent on changed code. */
|
|
14
|
+
mutation?: number;
|
|
15
|
+
functions?: FunctionMetric[];
|
|
16
|
+
}
|
|
17
|
+
export interface ThresholdFailure {
|
|
18
|
+
gate: "coverage" | "complexity" | "crap" | "mutation";
|
|
19
|
+
message: string;
|
|
20
|
+
}
|
|
21
|
+
export interface ThresholdResult {
|
|
22
|
+
passed: boolean;
|
|
23
|
+
failures: ThresholdFailure[];
|
|
24
|
+
}
|
|
25
|
+
/** The published CRAP formula: `CC^2 * (1 - coverage)^3 + CC`. */
|
|
26
|
+
export declare function crap(complexity: number, coverage: number): number;
|
|
27
|
+
/** Compare measurements with pack thresholds (inclusive boundaries). Unmeasured metrics are skipped. */
|
|
28
|
+
export declare function evaluateThresholds(thresholds: Thresholds, measured: Measurements): ThresholdResult;
|
|
29
|
+
//# sourceMappingURL=thresholds.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thresholds.d.ts","sourceRoot":"","sources":["../../src/toolchains/thresholds.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,yCAAyC;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,sDAAsD;IACtD,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,mCAAmC;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iDAAiD;IACjD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,cAAc,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,UAAU,GAAG,YAAY,GAAG,MAAM,GAAG,UAAU,CAAC;IACtD,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,gBAAgB,EAAE,CAAC;CAC9B;AAED,kEAAkE;AAClE,wBAAgB,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAQjE;AAID,wGAAwG;AACxG,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,YAAY,GACrB,eAAe,CA+BjB"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/** The published CRAP formula: `CC^2 * (1 - coverage)^3 + CC`. */
|
|
2
|
+
export function crap(complexity, coverage) {
|
|
3
|
+
if (!Number.isFinite(complexity) || complexity < 1) {
|
|
4
|
+
throw new Error("Invalid complexity: expected a number of at least 1");
|
|
5
|
+
}
|
|
6
|
+
if (!Number.isFinite(coverage) || coverage < 0 || coverage > 1) {
|
|
7
|
+
throw new Error("Invalid coverage: expected a fraction from 0 to 1");
|
|
8
|
+
}
|
|
9
|
+
return complexity ** 2 * (1 - coverage) ** 3 + complexity;
|
|
10
|
+
}
|
|
11
|
+
const round = (value) => (Math.round(value * 100) / 100).toString();
|
|
12
|
+
/** Compare measurements with pack thresholds (inclusive boundaries). Unmeasured metrics are skipped. */
|
|
13
|
+
export function evaluateThresholds(thresholds, measured) {
|
|
14
|
+
const failures = [];
|
|
15
|
+
if (measured.coverage !== undefined && measured.coverage < thresholds.coverage) {
|
|
16
|
+
failures.push({
|
|
17
|
+
gate: "coverage",
|
|
18
|
+
message: `Coverage ${round(measured.coverage)}% is below ${thresholds.coverage}%`,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
if (measured.mutation !== undefined && measured.mutation < thresholds.mutation) {
|
|
22
|
+
failures.push({
|
|
23
|
+
gate: "mutation",
|
|
24
|
+
message: `Mutation score ${round(measured.mutation)}% is below ${thresholds.mutation}%`,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
for (const fn of measured.functions ?? []) {
|
|
28
|
+
const where = `${fn.file}#${fn.name}`;
|
|
29
|
+
if (fn.complexity > thresholds.complexity) {
|
|
30
|
+
failures.push({
|
|
31
|
+
gate: "complexity",
|
|
32
|
+
message: `${where} has complexity ${fn.complexity} (limit ${thresholds.complexity})`,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
const score = crap(fn.complexity, fn.coverage);
|
|
36
|
+
if (score > thresholds.crap) {
|
|
37
|
+
failures.push({
|
|
38
|
+
gate: "crap",
|
|
39
|
+
message: `${where} has CRAP ${round(score)} (limit ${thresholds.crap})`,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return { passed: failures.length === 0, failures };
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=thresholds.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thresholds.js","sourceRoot":"","sources":["../../src/toolchains/thresholds.ts"],"names":[],"mappings":"AA6BA,kEAAkE;AAClE,MAAM,UAAU,IAAI,CAAC,UAAkB,EAAE,QAAgB;IACvD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;QAC/D,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,UAAU,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC;AAC5D,CAAC;AAED,MAAM,KAAK,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;AAEpF,wGAAwG;AACxG,MAAM,UAAU,kBAAkB,CAChC,UAAsB,EACtB,QAAsB;IAEtB,MAAM,QAAQ,GAAuB,EAAE,CAAC;IACxC,IAAI,QAAQ,CAAC,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,QAAQ,GAAG,UAAU,CAAC,QAAQ,EAAE,CAAC;QAC/E,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,YAAY,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,cAAc,UAAU,CAAC,QAAQ,GAAG;SAClF,CAAC,CAAC;IACL,CAAC;IACD,IAAI,QAAQ,CAAC,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,QAAQ,GAAG,UAAU,CAAC,QAAQ,EAAE,CAAC;QAC/E,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,kBAAkB,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,cAAc,UAAU,CAAC,QAAQ,GAAG;SACxF,CAAC,CAAC;IACL,CAAC;IACD,KAAK,MAAM,EAAE,IAAI,QAAQ,CAAC,SAAS,IAAI,EAAE,EAAE,CAAC;QAC1C,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;QACtC,IAAI,EAAE,CAAC,UAAU,GAAG,UAAU,CAAC,UAAU,EAAE,CAAC;YAC1C,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE,GAAG,KAAK,mBAAmB,EAAE,CAAC,UAAU,WAAW,UAAU,CAAC,UAAU,GAAG;aACrF,CAAC,CAAC;QACL,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC;QAC/C,IAAI,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC;YAC5B,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,GAAG,KAAK,aAAa,KAAK,CAAC,KAAK,CAAC,WAAW,UAAU,CAAC,IAAI,GAAG;aACxE,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,OAAO,UAAU,CAAC"}
|
package/dist/version.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,54 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@alisio/plugin-swarm",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "Runs a handoff-driven swarm of specialised agents, each in its own git worktree, with durable handoffs, deterministic quality gates and a human approval gate.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"alisio-plugin",
|
|
7
|
+
"agent-swarm",
|
|
8
|
+
"multi-agent",
|
|
9
|
+
"git-worktree",
|
|
10
|
+
"methodology"
|
|
11
|
+
],
|
|
12
|
+
"license": "MIT",
|
|
13
|
+
"repository": {
|
|
14
|
+
"type": "git",
|
|
15
|
+
"url": "git+https://github.com/GustavoGutierrez/alisio-plugins.git",
|
|
16
|
+
"directory": "packages/plugin-swarm"
|
|
17
|
+
},
|
|
18
|
+
"homepage": "https://github.com/GustavoGutierrez/alisio-plugins/tree/main/packages/plugin-swarm#readme",
|
|
19
|
+
"bugs": {
|
|
20
|
+
"url": "https://github.com/GustavoGutierrez/alisio-plugins/issues"
|
|
21
|
+
},
|
|
22
|
+
"type": "module",
|
|
23
|
+
"engines": {
|
|
24
|
+
"node": ">=22.16"
|
|
25
|
+
},
|
|
26
|
+
"exports": {
|
|
27
|
+
".": {
|
|
28
|
+
"types": "./dist/index.d.ts",
|
|
29
|
+
"import": "./dist/index.js"
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
"files": [
|
|
33
|
+
"dist",
|
|
34
|
+
".agents",
|
|
35
|
+
"assets",
|
|
36
|
+
"README.md",
|
|
37
|
+
"README.es.md",
|
|
38
|
+
"LICENSE",
|
|
39
|
+
"cover.svg"
|
|
40
|
+
],
|
|
41
|
+
"peerDependencies": {
|
|
42
|
+
"@alisio/sdk": "^0.4.5"
|
|
43
|
+
},
|
|
44
|
+
"devDependencies": {
|
|
45
|
+
"@alisio/sdk": "0.4.5",
|
|
46
|
+
"typescript": "7.0.2",
|
|
47
|
+
"vitest": "5.0.1"
|
|
48
|
+
},
|
|
49
|
+
"scripts": {
|
|
50
|
+
"build": "tsc -p tsconfig.json",
|
|
51
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
52
|
+
"test": "vitest run"
|
|
53
|
+
}
|
|
6
54
|
}
|