agentic-engineering-harness 0.4.16
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/LICENSE +201 -0
- package/README.md +273 -0
- package/dist/agents/audit.d.ts +12 -0
- package/dist/agents/audit.js +14 -0
- package/dist/agents/audit.js.map +1 -0
- package/dist/agents/compiler.d.ts +8 -0
- package/dist/agents/compiler.js +103 -0
- package/dist/agents/compiler.js.map +1 -0
- package/dist/agents/config.d.ts +6 -0
- package/dist/agents/config.js +161 -0
- package/dist/agents/config.js.map +1 -0
- package/dist/agents/escalation.d.ts +9 -0
- package/dist/agents/escalation.js +75 -0
- package/dist/agents/escalation.js.map +1 -0
- package/dist/agents/exceptionDetection.d.ts +24 -0
- package/dist/agents/exceptionDetection.js +42 -0
- package/dist/agents/exceptionDetection.js.map +1 -0
- package/dist/agents/findings.d.ts +14 -0
- package/dist/agents/findings.js +40 -0
- package/dist/agents/findings.js.map +1 -0
- package/dist/agents/gitCheckpoint.d.ts +6 -0
- package/dist/agents/gitCheckpoint.js +61 -0
- package/dist/agents/gitCheckpoint.js.map +1 -0
- package/dist/agents/jsonc.d.ts +1 -0
- package/dist/agents/jsonc.js +42 -0
- package/dist/agents/jsonc.js.map +1 -0
- package/dist/agents/outputContracts.d.ts +161 -0
- package/dist/agents/outputContracts.js +16 -0
- package/dist/agents/outputContracts.js.map +1 -0
- package/dist/agents/parallelism.d.ts +14 -0
- package/dist/agents/parallelism.js +54 -0
- package/dist/agents/parallelism.js.map +1 -0
- package/dist/agents/permissions.d.ts +5 -0
- package/dist/agents/permissions.js +30 -0
- package/dist/agents/permissions.js.map +1 -0
- package/dist/agents/qualityConvergence.d.ts +44 -0
- package/dist/agents/qualityConvergence.js +77 -0
- package/dist/agents/qualityConvergence.js.map +1 -0
- package/dist/agents/recovery.d.ts +13 -0
- package/dist/agents/recovery.js +35 -0
- package/dist/agents/recovery.js.map +1 -0
- package/dist/agents/reviewLifecycle.d.ts +30 -0
- package/dist/agents/reviewLifecycle.js +233 -0
- package/dist/agents/reviewLifecycle.js.map +1 -0
- package/dist/agents/routing.d.ts +9 -0
- package/dist/agents/routing.js +37 -0
- package/dist/agents/routing.js.map +1 -0
- package/dist/agents/structuredOutput.d.ts +1 -0
- package/dist/agents/structuredOutput.js +54 -0
- package/dist/agents/structuredOutput.js.map +1 -0
- package/dist/agents/types.d.ts +207 -0
- package/dist/agents/types.js +2 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +221 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/config.d.ts +3 -0
- package/dist/core/config.js +59 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/doctor.d.ts +8 -0
- package/dist/core/doctor.js +59 -0
- package/dist/core/doctor.js.map +1 -0
- package/dist/core/git.d.ts +8 -0
- package/dist/core/git.js +47 -0
- package/dist/core/git.js.map +1 -0
- package/dist/core/init.d.ts +1 -0
- package/dist/core/init.js +52 -0
- package/dist/core/init.js.map +1 -0
- package/dist/core/quick.d.ts +20 -0
- package/dist/core/quick.js +49 -0
- package/dist/core/quick.js.map +1 -0
- package/dist/core/repair.d.ts +8 -0
- package/dist/core/repair.js +7 -0
- package/dist/core/repair.js.map +1 -0
- package/dist/core/run.d.ts +38 -0
- package/dist/core/run.js +165 -0
- package/dist/core/run.js.map +1 -0
- package/dist/core/sdd.d.ts +10 -0
- package/dist/core/sdd.js +88 -0
- package/dist/core/sdd.js.map +1 -0
- package/dist/core/seal.d.ts +3 -0
- package/dist/core/seal.js +74 -0
- package/dist/core/seal.js.map +1 -0
- package/dist/core/triage.d.ts +22 -0
- package/dist/core/triage.js +38 -0
- package/dist/core/triage.js.map +1 -0
- package/dist/core/types.d.ts +354 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/verify.d.ts +6 -0
- package/dist/core/verify.js +51 -0
- package/dist/core/verify.js.map +1 -0
- package/dist/delivery/finalize.d.ts +17 -0
- package/dist/delivery/finalize.js +71 -0
- package/dist/delivery/finalize.js.map +1 -0
- package/dist/delivery/handoff.d.ts +39 -0
- package/dist/delivery/handoff.js +250 -0
- package/dist/delivery/handoff.js.map +1 -0
- package/dist/entry.d.ts +2 -0
- package/dist/entry.js +112 -0
- package/dist/entry.js.map +1 -0
- package/dist/evals/runner.d.ts +4 -0
- package/dist/evals/runner.js +112 -0
- package/dist/evals/runner.js.map +1 -0
- package/dist/evals/scoring.d.ts +3 -0
- package/dist/evals/scoring.js +41 -0
- package/dist/evals/scoring.js.map +1 -0
- package/dist/evals/types.d.ts +46 -0
- package/dist/evals/types.js +2 -0
- package/dist/evals/types.js.map +1 -0
- package/dist/issues/intake.d.ts +114 -0
- package/dist/issues/intake.js +213 -0
- package/dist/issues/intake.js.map +1 -0
- package/dist/memory/benchmark.d.ts +33 -0
- package/dist/memory/benchmark.js +69 -0
- package/dist/memory/benchmark.js.map +1 -0
- package/dist/metrics/runMetrics.d.ts +9 -0
- package/dist/metrics/runMetrics.js +34 -0
- package/dist/metrics/runMetrics.js.map +1 -0
- package/dist/metrics/usage.d.ts +3 -0
- package/dist/metrics/usage.js +53 -0
- package/dist/metrics/usage.js.map +1 -0
- package/dist/provenance/generate.d.ts +30 -0
- package/dist/provenance/generate.js +96 -0
- package/dist/provenance/generate.js.map +1 -0
- package/dist/providers/engram.d.ts +8 -0
- package/dist/providers/engram.js +14 -0
- package/dist/providers/engram.js.map +1 -0
- package/dist/providers/graphify.d.ts +9 -0
- package/dist/providers/graphify.js +28 -0
- package/dist/providers/graphify.js.map +1 -0
- package/dist/providers/paseo.d.ts +8 -0
- package/dist/providers/paseo.js +14 -0
- package/dist/providers/paseo.js.map +1 -0
- package/dist/providers/types.d.ts +41 -0
- package/dist/providers/types.js +2 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/telemetry/events.d.ts +2 -0
- package/dist/telemetry/events.js +29 -0
- package/dist/telemetry/events.js.map +1 -0
- package/dist/telemetry/otlp.d.ts +3 -0
- package/dist/telemetry/otlp.js +57 -0
- package/dist/telemetry/otlp.js.map +1 -0
- package/dist/toolchain/config.d.ts +10 -0
- package/dist/toolchain/config.js +54 -0
- package/dist/toolchain/config.js.map +1 -0
- package/dist/toolchain/doctor.d.ts +8 -0
- package/dist/toolchain/doctor.js +56 -0
- package/dist/toolchain/doctor.js.map +1 -0
- package/dist/toolchain/mise.d.ts +10 -0
- package/dist/toolchain/mise.js +61 -0
- package/dist/toolchain/mise.js.map +1 -0
- package/dist/toolchain/resolve.d.ts +8 -0
- package/dist/toolchain/resolve.js +159 -0
- package/dist/toolchain/resolve.js.map +1 -0
- package/dist/toolchain/setup.d.ts +7 -0
- package/dist/toolchain/setup.js +141 -0
- package/dist/toolchain/setup.js.map +1 -0
- package/dist/toolchain/types.d.ts +95 -0
- package/dist/toolchain/types.js +2 -0
- package/dist/toolchain/types.js.map +1 -0
- package/dist/utils/process.d.ts +15 -0
- package/dist/utils/process.js +94 -0
- package/dist/utils/process.js.map +1 -0
- package/dist/validators/commands.d.ts +2 -0
- package/dist/validators/commands.js +28 -0
- package/dist/validators/commands.js.map +1 -0
- package/dist/validators/constraints.d.ts +6 -0
- package/dist/validators/constraints.js +30 -0
- package/dist/validators/constraints.js.map +1 -0
- package/dist/validators/diffScope.d.ts +2 -0
- package/dist/validators/diffScope.js +36 -0
- package/dist/validators/diffScope.js.map +1 -0
- package/dist/validators/evidence.d.ts +6 -0
- package/dist/validators/evidence.js +8 -0
- package/dist/validators/evidence.js.map +1 -0
- package/dist/validators/external.d.ts +3 -0
- package/dist/validators/external.js +22 -0
- package/dist/validators/external.js.map +1 -0
- package/dist/validators/gherkin.d.ts +3 -0
- package/dist/validators/gherkin.js +59 -0
- package/dist/validators/gherkin.js.map +1 -0
- package/dist/validators/graphify.d.ts +4 -0
- package/dist/validators/graphify.js +108 -0
- package/dist/validators/graphify.js.map +1 -0
- package/dist/validators/opa.d.ts +3 -0
- package/dist/validators/opa.js +43 -0
- package/dist/validators/opa.js.map +1 -0
- package/dist/validators/openapi.d.ts +25 -0
- package/dist/validators/openapi.js +98 -0
- package/dist/validators/openapi.js.map +1 -0
- package/dist/validators/registry.d.ts +2 -0
- package/dist/validators/registry.js +36 -0
- package/dist/validators/registry.js.map +1 -0
- package/dist/validators/toolCommand.d.ts +5 -0
- package/dist/validators/toolCommand.js +33 -0
- package/dist/validators/toolCommand.js.map +1 -0
- package/dist/validators/types.d.ts +13 -0
- package/dist/validators/types.js +2 -0
- package/dist/validators/types.js.map +1 -0
- package/dist/workers/agentPrompt.d.ts +3 -0
- package/dist/workers/agentPrompt.js +84 -0
- package/dist/workers/agentPrompt.js.map +1 -0
- package/dist/workers/direct.d.ts +13 -0
- package/dist/workers/direct.js +30 -0
- package/dist/workers/direct.js.map +1 -0
- package/dist/workers/factory.d.ts +4 -0
- package/dist/workers/factory.js +10 -0
- package/dist/workers/factory.js.map +1 -0
- package/dist/workers/paseo.d.ts +14 -0
- package/dist/workers/paseo.js +29 -0
- package/dist/workers/paseo.js.map +1 -0
- package/dist/workers/podman.d.ts +13 -0
- package/dist/workers/podman.js +22 -0
- package/dist/workers/podman.js.map +1 -0
- package/dist/workers/prompt.d.ts +4 -0
- package/dist/workers/prompt.js +4 -0
- package/dist/workers/prompt.js.map +1 -0
- package/dist/workers/types.d.ts +11 -0
- package/dist/workers/types.js +2 -0
- package/dist/workers/types.js.map +1 -0
- package/docs/ARCHITECTURE.md +47 -0
- package/docs/EVALS.md +28 -0
- package/docs/MEMORY.md +28 -0
- package/docs/OBSERVABILITY.md +18 -0
- package/docs/OSS_STACK.md +27 -0
- package/docs/PASEO.md +9 -0
- package/docs/PUBLISHING.md +110 -0
- package/docs/SDD.md +35 -0
- package/docs/SECURITY.md +21 -0
- package/docs/V0.2.md +42 -0
- package/docs/V0.3.md +40 -0
- package/docs/V0.4.11.md +30 -0
- package/docs/V0.4.12.md +88 -0
- package/docs/V0.4.13.md +203 -0
- package/docs/V0.4.14.md +209 -0
- package/docs/V0.4.15.md +365 -0
- package/docs/V0.4.16.md +229 -0
- package/docs/V0.4.md +28 -0
- package/docs/VALIDATION.md +23 -0
- package/package.json +18 -0
- package/policies/core/dependency-policy.rego +12 -0
- package/policies/core/schema-policy.rego +12 -0
- package/policies/core/trust-boundary.rego +17 -0
- package/presets/agents/default.jsonc +80 -0
- package/presets/docker.yaml +4 -0
- package/presets/dotnet.yaml +12 -0
- package/presets/expo.yaml +6 -0
- package/presets/generic.yaml +3 -0
- package/presets/nextjs.yaml +8 -0
- package/presets/node.yaml +6 -0
- package/presets/pnpm.yaml +6 -0
- package/presets/postgres.yaml +4 -0
- package/schemas/agent-output-planner.schema.json +1 -0
- package/schemas/agent-topology.schema.json +37 -0
- package/schemas/project.schema.json +36 -0
- package/schemas/quick-contract.schema.json +17 -0
- package/schemas/task-contract.schema.json +18 -0
- package/schemas/toolchain.schema.json +70 -0
- package/schemas/validation-report.schema.json +15 -0
- package/skills/acceptance-traceability/SKILL.md +13 -0
- package/skills/deterministic-validation/SKILL.md +15 -0
- package/skills/engineering-workflow/SKILL.md +108 -0
- package/skills/finding-dedup/SKILL.md +12 -0
- package/skills/github-delivery-lifecycle/SKILL.md +16 -0
- package/skills/implementation-worker/SKILL.md +17 -0
- package/skills/lead-engineer/SKILL.md +30 -0
- package/skills/memory-hygiene/SKILL.md +22 -0
- package/skills/prompt-drift-audit/SKILL.md +10 -0
- package/skills/recovery-classifier/SKILL.md +13 -0
- package/skills/routing-normalizer/SKILL.md +17 -0
- package/skills/sdd/SKILL.md +21 -0
- package/skills/simplify/SKILL.md +16 -0
- package/skills/verification-planning/SKILL.md +17 -0
- package/skills/worktree-lifecycle/SKILL.md +18 -0
- package/templates/AGENTS.md +37 -0
- package/templates/agents.source.jsonc +39 -0
- package/templates/otel-collector.yaml +21 -0
- package/templates/project.yaml +196 -0
- package/templates/toolchain.yaml +127 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { RunMetrics, ValidationReport } from "../core/types.js";
|
|
2
|
+
export interface EvalVariant {
|
|
3
|
+
name: string;
|
|
4
|
+
command?: string;
|
|
5
|
+
env?: Record<string, string>;
|
|
6
|
+
}
|
|
7
|
+
export interface EvalCase {
|
|
8
|
+
version: 1;
|
|
9
|
+
id: string;
|
|
10
|
+
taskId: string;
|
|
11
|
+
baseRef: string;
|
|
12
|
+
fixtureDir?: string;
|
|
13
|
+
setupCommands?: string[];
|
|
14
|
+
runCommand?: string;
|
|
15
|
+
variants?: EvalVariant[];
|
|
16
|
+
expectations?: {
|
|
17
|
+
status?: "PASS" | "FAIL";
|
|
18
|
+
maxRepairs?: number;
|
|
19
|
+
maxHumanInterventions?: number;
|
|
20
|
+
maxCostUsd?: number;
|
|
21
|
+
requiredChecks?: string[];
|
|
22
|
+
};
|
|
23
|
+
weights?: {
|
|
24
|
+
status?: number;
|
|
25
|
+
firstPass?: number;
|
|
26
|
+
repairs?: number;
|
|
27
|
+
interventions?: number;
|
|
28
|
+
efficiency?: number;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export interface EvalResult {
|
|
32
|
+
version: 1;
|
|
33
|
+
caseId: string;
|
|
34
|
+
variant: string;
|
|
35
|
+
taskId: string;
|
|
36
|
+
baseRef: string;
|
|
37
|
+
status: "PASS" | "FAIL";
|
|
38
|
+
commandExitCode: number;
|
|
39
|
+
metrics?: RunMetrics;
|
|
40
|
+
report?: ValidationReport;
|
|
41
|
+
score: number;
|
|
42
|
+
scoreBreakdown: Record<string, number>;
|
|
43
|
+
startedAt: string;
|
|
44
|
+
finishedAt: string;
|
|
45
|
+
resultFile?: string;
|
|
46
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/evals/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { type TriageEvidence } from "../core/triage.js";
|
|
3
|
+
import type { HarnessProjectConfig, TaskContract } from "../core/types.js";
|
|
4
|
+
export interface GithubIssueSnapshot {
|
|
5
|
+
version: 1;
|
|
6
|
+
provider: "github";
|
|
7
|
+
repository: string;
|
|
8
|
+
number: number;
|
|
9
|
+
url: string;
|
|
10
|
+
title: string;
|
|
11
|
+
body: string;
|
|
12
|
+
state: string;
|
|
13
|
+
labels: string[];
|
|
14
|
+
createdAt: string;
|
|
15
|
+
updatedAt: string;
|
|
16
|
+
fetchedAt: string;
|
|
17
|
+
contentSha256: string;
|
|
18
|
+
}
|
|
19
|
+
export interface IssueInspection {
|
|
20
|
+
snapshot: GithubIssueSnapshot;
|
|
21
|
+
evidence: TriageEvidence;
|
|
22
|
+
preliminaryMode: "quick" | "spec";
|
|
23
|
+
reasons: string[];
|
|
24
|
+
acceptance: string[];
|
|
25
|
+
}
|
|
26
|
+
export interface IssuePreparationResult {
|
|
27
|
+
taskId: string;
|
|
28
|
+
mode: "quick" | "spec";
|
|
29
|
+
contract: TaskContract;
|
|
30
|
+
snapshot: GithubIssueSnapshot;
|
|
31
|
+
normalizedBy: "planner" | "deterministic";
|
|
32
|
+
traceability?: string;
|
|
33
|
+
}
|
|
34
|
+
declare const issuePlanSchema: z.ZodObject<{
|
|
35
|
+
classification: z.ZodEnum<{
|
|
36
|
+
ready: "ready";
|
|
37
|
+
requires_product_decision: "requires_product_decision";
|
|
38
|
+
spec_contradiction: "spec_contradiction";
|
|
39
|
+
}>;
|
|
40
|
+
rationale: z.ZodString;
|
|
41
|
+
problem: z.ZodString;
|
|
42
|
+
desiredOutcome: z.ZodString;
|
|
43
|
+
requirements: z.ZodArray<z.ZodObject<{
|
|
44
|
+
text: z.ZodString;
|
|
45
|
+
source: z.ZodDefault<z.ZodEnum<{
|
|
46
|
+
explicit: "explicit";
|
|
47
|
+
"repository-derived": "repository-derived";
|
|
48
|
+
}>>;
|
|
49
|
+
validators: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
50
|
+
}, z.core.$strip>>;
|
|
51
|
+
acceptance: z.ZodArray<z.ZodObject<{
|
|
52
|
+
title: z.ZodString;
|
|
53
|
+
requirementIndexes: z.ZodArray<z.ZodNumber>;
|
|
54
|
+
given: z.ZodString;
|
|
55
|
+
when: z.ZodString;
|
|
56
|
+
then: z.ZodString;
|
|
57
|
+
}, z.core.$strip>>;
|
|
58
|
+
scope: z.ZodObject<{
|
|
59
|
+
allowed: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
60
|
+
forbidden: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
61
|
+
domains: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
62
|
+
}, z.core.$strip>;
|
|
63
|
+
risk: z.ZodEnum<{
|
|
64
|
+
high: "high";
|
|
65
|
+
medium: "medium";
|
|
66
|
+
low: "low";
|
|
67
|
+
}>;
|
|
68
|
+
flags: z.ZodDefault<z.ZodArray<z.ZodEnum<{
|
|
69
|
+
security: "security";
|
|
70
|
+
architecture: "architecture";
|
|
71
|
+
authentication: "authentication";
|
|
72
|
+
authorization: "authorization";
|
|
73
|
+
schema: "schema";
|
|
74
|
+
migration: "migration";
|
|
75
|
+
"public-api": "public-api";
|
|
76
|
+
"breaking-change": "breaking-change";
|
|
77
|
+
"new-dependency": "new-dependency";
|
|
78
|
+
"cross-module": "cross-module";
|
|
79
|
+
ambiguous: "ambiguous";
|
|
80
|
+
}>>>;
|
|
81
|
+
constraints: z.ZodObject<{
|
|
82
|
+
breakingApiChanges: z.ZodBoolean;
|
|
83
|
+
newDependencies: z.ZodBoolean;
|
|
84
|
+
schemaChanges: z.ZodBoolean;
|
|
85
|
+
}, z.core.$strip>;
|
|
86
|
+
design: z.ZodObject<{
|
|
87
|
+
currentState: z.ZodString;
|
|
88
|
+
proposedDesign: z.ZodString;
|
|
89
|
+
risks: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
90
|
+
}, z.core.$strip>;
|
|
91
|
+
tasks: z.ZodArray<z.ZodObject<{
|
|
92
|
+
title: z.ZodString;
|
|
93
|
+
requirementIndexes: z.ZodArray<z.ZodNumber>;
|
|
94
|
+
scope: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
95
|
+
}, z.core.$strip>>;
|
|
96
|
+
nonGoals: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
97
|
+
unresolved: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
98
|
+
}, z.core.$strip>;
|
|
99
|
+
export type IssueIntakePlan = z.infer<typeof issuePlanSchema>;
|
|
100
|
+
export declare function inspectGithubIssue(root: string, config: HarnessProjectConfig, issueNumber: number): Promise<IssueInspection>;
|
|
101
|
+
export declare function prepareGithubIssueTask(root: string, config: HarnessProjectConfig, issueNumber: number, options?: {
|
|
102
|
+
refresh?: boolean;
|
|
103
|
+
force?: boolean;
|
|
104
|
+
usePlanner?: boolean;
|
|
105
|
+
}): Promise<IssuePreparationResult>;
|
|
106
|
+
export declare function verifyGithubIssueDrift(root: string, config: HarnessProjectConfig, contract: TaskContract): Promise<{
|
|
107
|
+
ok: boolean;
|
|
108
|
+
message: string;
|
|
109
|
+
remote?: GithubIssueSnapshot;
|
|
110
|
+
}>;
|
|
111
|
+
export declare function taskIdForIssue(issueNumber: number): string;
|
|
112
|
+
export declare function issueContentSha256(title: string, body: string): string;
|
|
113
|
+
export declare function normalizeIssueDeterministically(snapshot: GithubIssueSnapshot): IssueIntakePlan;
|
|
114
|
+
export {};
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import crypto from "node:crypto";
|
|
2
|
+
import fs from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import YAML from "yaml";
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
import { loadResolvedAgentTopology } from "../agents/config.js";
|
|
7
|
+
import { executionSelectionForAgent } from "../agents/routing.js";
|
|
8
|
+
import { extractMarkedJson } from "../agents/structuredOutput.js";
|
|
9
|
+
import { loadTaskContract } from "../core/config.js";
|
|
10
|
+
import { getCurrentBranch } from "../core/git.js";
|
|
11
|
+
import { createQuickContract, validateQuickTaskContract } from "../core/quick.js";
|
|
12
|
+
import { formatTraceabilityMatrix, validateSddChange } from "../core/sdd.js";
|
|
13
|
+
import { sealTask, verifyTaskSeal } from "../core/seal.js";
|
|
14
|
+
import { triageChange } from "../core/triage.js";
|
|
15
|
+
import { githubRequest, inferGithubRepository, loadDeliveryRecord, resolveGithubTokenOptional, seedDeliveryRecordFromIssue } from "../delivery/handoff.js";
|
|
16
|
+
import { executeAgentPrompt } from "../workers/agentPrompt.js";
|
|
17
|
+
const flagSchema = z.enum(["architecture", "security", "authentication", "authorization", "schema", "migration", "public-api", "breaking-change", "new-dependency", "cross-module", "ambiguous"]);
|
|
18
|
+
const issuePlanSchema = z.object({
|
|
19
|
+
classification: z.enum(["ready", "requires_product_decision", "spec_contradiction"]), rationale: z.string().min(1), problem: z.string().min(1), desiredOutcome: z.string().min(1),
|
|
20
|
+
requirements: z.array(z.object({ text: z.string().min(1), source: z.enum(["explicit", "repository-derived"]).default("explicit"), validators: z.array(z.string().min(1)).optional() })).min(1),
|
|
21
|
+
acceptance: z.array(z.object({ title: z.string().min(1), requirementIndexes: z.array(z.number().int().positive()).min(1), given: z.string().min(1), when: z.string().min(1), then: z.string().min(1) })).min(1),
|
|
22
|
+
scope: z.object({ allowed: z.array(z.string().min(1)).default([]), forbidden: z.array(z.string().min(1)).default([]), domains: z.array(z.string().min(1)).default([]) }), risk: z.enum(["low", "medium", "high"]), flags: z.array(flagSchema).default([]),
|
|
23
|
+
constraints: z.object({ breakingApiChanges: z.boolean(), newDependencies: z.boolean(), schemaChanges: z.boolean() }), design: z.object({ currentState: z.string().min(1), proposedDesign: z.string().min(1), risks: z.array(z.string()).default([]) }),
|
|
24
|
+
tasks: z.array(z.object({ title: z.string().min(1), requirementIndexes: z.array(z.number().int().positive()).min(1), scope: z.array(z.string()).default([]) })).min(1), nonGoals: z.array(z.string()).default([]), unresolved: z.array(z.string()).default([])
|
|
25
|
+
});
|
|
26
|
+
export async function inspectGithubIssue(root, config, issueNumber) {
|
|
27
|
+
if (config.workflow?.issueIntake?.enabled === false)
|
|
28
|
+
throw new Error("GitHub issue intake is disabled by workflow.issueIntake.enabled=false.");
|
|
29
|
+
const snapshot = await fetchGithubIssueSnapshot(root, config, issueNumber);
|
|
30
|
+
if (config.workflow?.issueIntake?.requireOpen !== false && snapshot.state !== "open")
|
|
31
|
+
throw new Error(`ISSUE_NOT_OPEN: GitHub issue #${issueNumber} is ${snapshot.state}.`);
|
|
32
|
+
const acceptance = extractAcceptance(snapshot.body);
|
|
33
|
+
const evidence = deriveTriageEvidence(snapshot);
|
|
34
|
+
const decision = triageChange(config, evidence);
|
|
35
|
+
return { snapshot, evidence, preliminaryMode: decision.mode, reasons: decision.reasons, acceptance };
|
|
36
|
+
}
|
|
37
|
+
export async function prepareGithubIssueTask(root, config, issueNumber, options = {}) {
|
|
38
|
+
const inspection = await inspectGithubIssue(root, config, issueNumber);
|
|
39
|
+
const snapshot = inspection.snapshot;
|
|
40
|
+
const taskId = taskIdForIssue(issueNumber);
|
|
41
|
+
const existing = await tryLoadTask(root, config, taskId);
|
|
42
|
+
if (existing?.issue?.provider === "github") {
|
|
43
|
+
if (existing.issue.repository !== snapshot.repository || existing.issue.number !== issueNumber)
|
|
44
|
+
throw new Error(`ISSUE_SOURCE_MISMATCH: ${taskId} is already bound to a different issue.`);
|
|
45
|
+
if (existing.issue.contentSha256 !== snapshot.contentSha256 && !options.refresh)
|
|
46
|
+
throw new Error(`ISSUE_DRIFT: GitHub issue #${issueNumber} changed after it was frozen. Re-run with --refresh after reviewing the issue change.`);
|
|
47
|
+
if (existing.issue.contentSha256 === snapshot.contentSha256 && !options.refresh) {
|
|
48
|
+
const seal = await verifyTaskSeal(root, existing, config.validation?.requireSeal ?? true);
|
|
49
|
+
if ((config.validation?.requireSeal ?? true) && seal.status !== "PASS")
|
|
50
|
+
throw new Error(`LOCAL_CONTRACT_DRIFT: ${seal.message}`);
|
|
51
|
+
await seedDeliveryRecordFromIssue(root, config, existing, { repository: snapshot.repository, issueNumber: snapshot.number, issueUrl: snapshot.url });
|
|
52
|
+
return { taskId, mode: existing.mode ?? "spec", contract: existing, snapshot, normalizedBy: "deterministic" };
|
|
53
|
+
}
|
|
54
|
+
if (options.refresh) {
|
|
55
|
+
const delivery = await loadDeliveryRecord(root, config, taskId);
|
|
56
|
+
if (delivery?.paseo?.workspaceId && !options.force)
|
|
57
|
+
throw new Error("ISSUE_REFRESH_BLOCKED: an implementation workspace already exists. Review/close that workspace or use --force explicitly.");
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
const plannerNeeded = inspection.preliminaryMode === "spec" || inspection.acceptance.length === 0;
|
|
61
|
+
const normalized = plannerNeeded && options.usePlanner !== false ? await normalizeIssueWithPlanner(root, config, snapshot).catch(() => ({ plan: normalizeIssueDeterministically(snapshot), normalizedBy: "deterministic" })) : { plan: normalizeIssueDeterministically(snapshot), normalizedBy: "deterministic" };
|
|
62
|
+
const plan = normalized.plan;
|
|
63
|
+
if (plan.classification === "spec_contradiction")
|
|
64
|
+
throw new Error(`SPEC_CONTRADICTION: ${[plan.rationale, ...plan.unresolved].filter(Boolean).join("; ")}`);
|
|
65
|
+
if (plan.classification === "requires_product_decision")
|
|
66
|
+
throw new Error(`REQUIRES_PRODUCT_DECISION: ${[plan.rationale, ...plan.unresolved].filter(Boolean).join("; ")}`);
|
|
67
|
+
const finalDecision = triageChange(config, { request: `${snapshot.title}\n${snapshot.body}`, files: plan.scope.allowed, domains: plan.scope.domains, risk: plan.risk, flags: plan.flags });
|
|
68
|
+
const snapshotPath = issueSnapshotPath(config, taskId);
|
|
69
|
+
await writeSnapshot(root, snapshotPath, snapshot);
|
|
70
|
+
const originatingBranch = await getCurrentBranch(root) ?? config.validation?.baseRef ?? "main";
|
|
71
|
+
let contract;
|
|
72
|
+
let traceability;
|
|
73
|
+
if (finalDecision.quickEligible && plan.acceptance.length > 0) {
|
|
74
|
+
const quick = await createQuickContract(root, config, taskId, { title: snapshot.title, request: `${snapshot.title}\n\n${snapshot.body}`.trim(), scope: plan.scope.allowed, acceptance: plan.acceptance.map((item) => `${item.title}: ${item.then}`), domains: plan.scope.domains, risk: "low", flags: [] });
|
|
75
|
+
contract = { ...quick.contract, source: { ...(quick.contract.source ?? {}), issue: snapshotPath }, issue: issueMetadata(snapshot, snapshotPath), git: { ...quick.contract.git, baseRef: originatingBranch, originatingBranch }, scope: { ...quick.contract.scope, forbidden: plan.scope.forbidden } };
|
|
76
|
+
await writeContract(root, config, contract);
|
|
77
|
+
const quickValidation = validateQuickTaskContract(config, contract);
|
|
78
|
+
if (!quickValidation.ok)
|
|
79
|
+
throw new Error(`Issue-derived QuickContract failed validation: ${quickValidation.issues.join("; ")}`);
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
contract = await writeIssueDerivedSdd(root, config, snapshot, snapshotPath, plan, originatingBranch);
|
|
83
|
+
const validation = await validateSddChange(root, taskId, config);
|
|
84
|
+
if (!validation.ok)
|
|
85
|
+
throw new Error(`Issue-derived SDD failed validation: ${[...validation.missing, ...validation.issues].join("; ")}`);
|
|
86
|
+
traceability = formatTraceabilityMatrix(validation.requirements);
|
|
87
|
+
}
|
|
88
|
+
await sealTask(root, config, contract);
|
|
89
|
+
await seedDeliveryRecordFromIssue(root, config, contract, { repository: snapshot.repository, issueNumber: snapshot.number, issueUrl: snapshot.url });
|
|
90
|
+
return { taskId, mode: contract.mode ?? "spec", contract, snapshot, normalizedBy: normalized.normalizedBy, traceability };
|
|
91
|
+
}
|
|
92
|
+
export async function verifyGithubIssueDrift(root, config, contract) {
|
|
93
|
+
if (!contract.issue || contract.issue.provider !== "github" || config.workflow?.issueIntake?.verifyDriftOnRun === false)
|
|
94
|
+
return { ok: true, message: "No GitHub issue drift check required." };
|
|
95
|
+
let remote;
|
|
96
|
+
try {
|
|
97
|
+
remote = await fetchGithubIssueSnapshot(root, config, contract.issue.number, contract.issue.repository);
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
throw new Error(`BLOCKED_EXTERNAL: cannot verify GitHub issue #${contract.issue.number} before execution: ${String(error)}`);
|
|
101
|
+
}
|
|
102
|
+
if (remote.contentSha256 !== contract.issue.contentSha256)
|
|
103
|
+
return { ok: false, message: `ISSUE_DRIFT: GitHub issue #${contract.issue.number} title/body changed after freeze (${contract.issue.contentSha256.slice(0, 12)} -> ${remote.contentSha256.slice(0, 12)}).`, remote };
|
|
104
|
+
return { ok: true, message: `GitHub issue #${contract.issue.number} still matches the frozen intake snapshot.`, remote };
|
|
105
|
+
}
|
|
106
|
+
export function taskIdForIssue(issueNumber) { if (!Number.isInteger(issueNumber) || issueNumber <= 0)
|
|
107
|
+
throw new Error("Issue number must be a positive integer."); return `GH-${issueNumber}`; }
|
|
108
|
+
export function issueContentSha256(title, body) { return crypto.createHash("sha256").update(JSON.stringify({ title: title.trim(), body: body.replace(/\r\n/g, "\n").trim() })).digest("hex"); }
|
|
109
|
+
export function normalizeIssueDeterministically(snapshot) {
|
|
110
|
+
const acceptance = extractAcceptance(snapshot.body);
|
|
111
|
+
const bullets = extractUsefulBullets(snapshot.body);
|
|
112
|
+
const requirementTexts = unique((acceptance.length ? acceptance : bullets).filter(Boolean)).slice(0, 20);
|
|
113
|
+
const fallbackRequirement = snapshot.body.trim() ? `${snapshot.title}: ${firstMeaningfulParagraph(snapshot.body)}` : snapshot.title;
|
|
114
|
+
const requirements = (requirementTexts.length ? requirementTexts : [fallbackRequirement]).map((text) => ({ text, source: "explicit", validators: ["gherkin"] }));
|
|
115
|
+
const paths = extractFilePaths(snapshot.body);
|
|
116
|
+
const domains = inferDomains(snapshot.labels, snapshot.body);
|
|
117
|
+
const request = `${snapshot.title}\n${snapshot.body}`;
|
|
118
|
+
const preliminary = triageChange({ version: 1, project: { name: "issue-normalizer" } }, { request, files: paths, domains, risk: inferRisk(snapshot.labels), flags: [] });
|
|
119
|
+
const risk = preliminary.quickEligible ? "low" : inferRisk(snapshot.labels) === "low" ? "medium" : inferRisk(snapshot.labels);
|
|
120
|
+
const scenarios = requirements.map((item, index) => ({ title: `Satisfy requirement ${index + 1}`, requirementIndexes: [index + 1], given: `the repository is evaluated against frozen GitHub issue #${snapshot.number}`, when: "the issue implementation is completed", then: item.text }));
|
|
121
|
+
const constraints = inferConstraints(request);
|
|
122
|
+
return { classification: snapshot.body.trim() || snapshot.title.trim() ? "ready" : "requires_product_decision", rationale: "Requirements were normalized from the explicit issue text; repository-specific planning may refine implementation details without changing the frozen issue intent.", problem: firstMeaningfulParagraph(snapshot.body) || snapshot.title, desiredOutcome: snapshot.title, requirements, acceptance: scenarios, scope: { allowed: paths.length ? paths : ["**"], forbidden: [], domains }, risk, flags: inferFlags(request), constraints, design: { currentState: "Use the existing repository architecture and nearby implementation patterns as the baseline.", proposedDesign: "Implement the frozen issue requirements with the smallest architecture-consistent change; routed planning may choose concrete files and tests.", risks: [] }, tasks: requirements.map((_, index) => ({ title: `Implement requirement ${index + 1}`, requirementIndexes: [index + 1], scope: paths })), nonGoals: [], unresolved: [] };
|
|
123
|
+
}
|
|
124
|
+
async function normalizeIssueWithPlanner(root, config, snapshot) {
|
|
125
|
+
if (!config.agents)
|
|
126
|
+
throw new Error("No agent topology configured for issue normalization.");
|
|
127
|
+
const topology = await loadResolvedAgentTopology(root, config, config.agents.activeProfile);
|
|
128
|
+
const plannerName = config.workflow?.issueIntake?.plannerAgent ?? Object.values(topology.agents).find((agent) => agent.role === "planner" && !agent.disabled)?.name ?? "planner";
|
|
129
|
+
if (!topology.agents[plannerName])
|
|
130
|
+
throw new Error(`Issue intake planner '${plannerName}' is not available.`);
|
|
131
|
+
const selection = executionSelectionForAgent(topology, plannerName);
|
|
132
|
+
const provisional = { version: 1, task: { id: taskIdForIssue(snapshot.number), title: snapshot.title }, git: { baseRef: config.validation?.baseRef ?? "main" }, scope: { allowed: ["**"], forbidden: [], frozen: [] }, routing: { intent: "plan", domains: [], risk: "medium" }, constraints: { breakingApiChanges: false, newDependencies: false, schemaChanges: false } };
|
|
133
|
+
const prompt = `Normalize GitHub issue #${snapshot.number} from ${snapshot.repository} into an engineering intake plan. You are read-only. Inspect the repository to resolve implementation details and existing conventions, but never invent a product decision that cannot be derived from the issue/repository. Classify as requires_product_decision or spec_contradiction only when genuinely unavoidable.\n\nFrozen issue snapshot:\n${JSON.stringify(snapshot, null, 2)}\n\nReturn exactly this JSON shape on one final line beginning AEH_RESULT_JSON=:\n${issuePlanContractDescription()}`;
|
|
134
|
+
const session = await executeAgentPrompt(root, config, provisional, selection, prompt);
|
|
135
|
+
if (session.exitCode !== 0)
|
|
136
|
+
throw new Error(`Issue planner exited with ${session.exitCode}: ${session.stderr || session.stdout}`);
|
|
137
|
+
return { plan: issuePlanSchema.parse(extractMarkedJson(session.stdout, session.stderr)), normalizedBy: "planner" };
|
|
138
|
+
}
|
|
139
|
+
async function fetchGithubIssueSnapshot(root, config, issueNumber, repositoryOverride) {
|
|
140
|
+
const github = config.delivery?.github;
|
|
141
|
+
const repository = repositoryOverride ?? github?.repository ?? await inferGithubRepository(root);
|
|
142
|
+
const apiBase = (github?.apiBaseUrl ?? "https://api.github.com").replace(/\/$/, "");
|
|
143
|
+
const token = resolveGithubTokenOptional(github?.tokenEnv);
|
|
144
|
+
const issue = await githubRequest(apiBase, token, `/repos/${repository}/issues/${issueNumber}`);
|
|
145
|
+
if (issue.pull_request)
|
|
146
|
+
throw new Error(`GitHub #${issueNumber} is a pull request, not an issue.`);
|
|
147
|
+
const body = issue.body ?? "";
|
|
148
|
+
return { version: 1, provider: "github", repository, number: issue.number, url: issue.html_url, title: issue.title, body, state: issue.state, labels: (issue.labels ?? []).map((label) => typeof label === "string" ? label : label.name ?? "").filter(Boolean), createdAt: issue.created_at, updatedAt: issue.updated_at, fetchedAt: new Date().toISOString(), contentSha256: issueContentSha256(issue.title, body) };
|
|
149
|
+
}
|
|
150
|
+
async function writeIssueDerivedSdd(root, config, snapshot, snapshotPath, plan, originatingBranch) {
|
|
151
|
+
const taskId = taskIdForIssue(snapshot.number);
|
|
152
|
+
const specsDir = config.sdd?.specsDir ?? "specs";
|
|
153
|
+
const dir = path.join(root, specsDir, "changes", taskId);
|
|
154
|
+
await fs.mkdir(dir, { recursive: true });
|
|
155
|
+
const requirementIds = plan.requirements.map((_, index) => `${taskId}-R${index + 1}`);
|
|
156
|
+
const requirementLines = plan.requirements.map((item, index) => `- ${requirementIds[index]} — ${item.text} _(${item.source})_`).join("\n");
|
|
157
|
+
const proposal = `# ${taskId}: ${snapshot.title}\n\n## Source\n\nGitHub issue #${snapshot.number}: ${snapshot.url}\nFrozen content SHA-256: \`${snapshot.contentSha256}\`\n\n## Problem\n\n${plan.problem}\n\n## Desired outcome\n\n${plan.desiredOutcome}\n\n## Requirements\n\n${requirementLines}\n\n## Scope\n\n${plan.scope.allowed.map((item) => `- \`${item}\``).join("\n") || "- Repository-defined scope"}\n\n## Non-goals\n\n${plan.nonGoals.map((item) => `- ${item}`).join("\n") || "- No additional behavior beyond the frozen issue requirements."}\n`;
|
|
158
|
+
const spec = `# Specification: ${snapshot.title}\n\n## Frozen source\n\nGitHub issue #${snapshot.number}; content SHA-256 \`${snapshot.contentSha256}\`.\n\n## Requirements\n\n${plan.requirements.map((item, index) => `### ${requirementIds[index]}\n\n${item.text}\n\nSource classification: **${item.source}**.`).join("\n\n")}\n\n## Invariants\n\n- The frozen issue snapshot and this sealed SDD define the run intent.\n- Repository architecture/security invariants remain in force unless the issue explicitly authorizes a change.\n`;
|
|
159
|
+
const design = `# Design: ${snapshot.title}\n\n## Current state\n\n${plan.design.currentState}\n\n## Proposed design\n\n${plan.design.proposedDesign}\n\n## Requirement mapping\n\n${requirementIds.map((id) => `- ${id} — implement using routed specialists within the declared scope.`).join("\n")}\n\n## Data/API impact\n\n- breakingApiChanges: ${plan.constraints.breakingApiChanges}\n- newDependencies: ${plan.constraints.newDependencies}\n- schemaChanges: ${plan.constraints.schemaChanges}\n\n## Risks and trade-offs\n\n${plan.design.risks.map((item) => `- ${item}`).join("\n") || "- No additional issue-specific risks were identified during intake."}\n`;
|
|
160
|
+
const tasks = { version: 1, task: taskId, items: plan.tasks.map((item, index) => ({ id: index + 1, title: item.title, status: "pending", requirements: item.requirementIndexes.map((value) => requirementIds[value - 1]).filter(Boolean), scope: item.scope })) };
|
|
161
|
+
const acceptance = `@${taskId}\nFeature: ${gherkinText(snapshot.title)}\n\n${plan.acceptance.map((item, index) => { const tags = item.requirementIndexes.map((value) => requirementIds[value - 1]).filter(Boolean).map((id) => `@${id}`).join(" "); return ` ${tags}\n Scenario: ${gherkinText(item.title || `Acceptance ${index + 1}`)}\n Given ${gherkinText(item.given)}\n When ${gherkinText(item.when)}\n Then ${gherkinText(item.then)}`; }).join("\n\n")}\n`;
|
|
162
|
+
const files = { "proposal.md": proposal, "spec.md": spec, "design.md": design, "tasks.yaml": YAML.stringify(tasks), "acceptance.feature": acceptance };
|
|
163
|
+
for (const [name, content] of Object.entries(files))
|
|
164
|
+
await fs.writeFile(path.join(dir, name), content);
|
|
165
|
+
const rel = (name) => path.relative(root, path.join(dir, name)).replaceAll("\\", "/");
|
|
166
|
+
const contract = { version: 1, mode: "spec", task: { id: taskId, title: snapshot.title }, source: { proposal: rel("proposal.md"), spec: rel("spec.md"), design: rel("design.md"), tasks: rel("tasks.yaml"), acceptance: rel("acceptance.feature"), issue: snapshotPath }, issue: issueMetadata(snapshot, snapshotPath), git: { baseRef: originatingBranch, originatingBranch }, scope: { allowed: plan.scope.allowed.length ? plan.scope.allowed : ["**"], forbidden: plan.scope.forbidden, frozen: [] }, routing: { intent: "implement", domains: plan.scope.domains, risk: plan.risk }, requirements: plan.requirements.map((item, index) => ({ id: requirementIds[index], description: item.text, validators: item.validators?.length ? item.validators : ["gherkin"] })), constraints: plan.constraints, repair: { maxAttempts: config.orchestration?.worker?.maxRepairAttempts ?? 2 } };
|
|
167
|
+
await writeContract(root, config, contract);
|
|
168
|
+
return contract;
|
|
169
|
+
}
|
|
170
|
+
function issueMetadata(snapshot, snapshotPath) { return { provider: "github", repository: snapshot.repository, number: snapshot.number, url: snapshot.url, state: snapshot.state, fetchedAt: snapshot.fetchedAt, updatedAt: snapshot.updatedAt, contentSha256: snapshot.contentSha256, snapshotPath }; }
|
|
171
|
+
async function writeContract(root, config, contract) { const dir = path.resolve(root, config.sdd?.contractsDir ?? ".harness/contracts"); await fs.mkdir(dir, { recursive: true }); await fs.writeFile(path.join(dir, `${contract.task.id}.yaml`), YAML.stringify(contract)); }
|
|
172
|
+
async function writeSnapshot(root, relative, snapshot) { const file = path.resolve(root, relative); await fs.mkdir(path.dirname(file), { recursive: true }); await fs.writeFile(file, `${JSON.stringify(snapshot, null, 2)}\n`); }
|
|
173
|
+
function issueSnapshotPath(config, taskId) { return path.posix.join((config.workflow?.issueIntake?.snapshotDir ?? ".harness/issues").replaceAll("\\", "/"), `${taskId}.json`); }
|
|
174
|
+
async function tryLoadTask(root, config, taskId) { try {
|
|
175
|
+
return await loadTaskContract(root, taskId, config);
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
return undefined;
|
|
179
|
+
} }
|
|
180
|
+
function deriveTriageEvidence(snapshot) { const request = `${snapshot.title}\n${snapshot.body}`; return { request, files: extractFilePaths(snapshot.body), domains: inferDomains(snapshot.labels, snapshot.body), risk: inferRisk(snapshot.labels), flags: inferFlags(request) }; }
|
|
181
|
+
function inferRisk(labels) { const lower = labels.map((item) => item.toLowerCase()); if (lower.some((item) => /risk[:/-]?high|high[- ]risk|severity[:/-]?high/.test(item)))
|
|
182
|
+
return "high"; if (lower.some((item) => /risk[:/-]?medium|medium[- ]risk|severity[:/-]?medium/.test(item)))
|
|
183
|
+
return "medium"; return "low"; }
|
|
184
|
+
function inferDomains(labels, body) { const known = ["backend", "frontend", "web", "mobile", "data", "database", "api", "security", "auth", "architecture", "ops", "devops", "docs", "test", "e2e"]; const haystack = `${labels.join(" ")} ${body}`.toLowerCase(); return known.filter((domain) => new RegExp(`\\b${domain.replace("-", "[- ]")}\\b`, "i").test(haystack)); }
|
|
185
|
+
function inferFlags(request) { const flags = []; const tests = [["architecture", /\barchitecture|architectural|cross[- ]module|large refactor\b/i], ["security", /\bsecurity|tenant isolation\b/i], ["authentication", /\bauthentication|login|sign[- ]in\b/i], ["authorization", /\bauthorization|permission|role|rbac\b/i], ["schema", /\bschema|table|column\b/i], ["migration", /\bmigration\b/i], ["public-api", /\bpublic api|api contract\b/i], ["breaking-change", /\bbreaking change|backward compat\b/i], ["new-dependency", /\bnew dependency|add dependency|package upgrade\b/i], ["cross-module", /\bcross[- ]module\b/i], ["ambiguous", /\bto be decided|tbd|unclear\b/i]]; for (const [flag, pattern] of tests)
|
|
186
|
+
if (pattern.test(request))
|
|
187
|
+
flags.push(flag); return flags; }
|
|
188
|
+
function inferConstraints(request) { return { breakingApiChanges: /\bbreaking change|break public api|incompatible api\b/i.test(request), newDependencies: /\badd (a )?(new )?dependenc|new dependency|install package\b/i.test(request), schemaChanges: /\bmigration|schema change|add (a )?(table|column)|alter table\b/i.test(request) }; }
|
|
189
|
+
function extractAcceptance(body) { const sections = extractSections(body); const preferred = Object.entries(sections).filter(([heading]) => /accept|definition of done|expected|requirements?|success criteria/i.test(heading)).flatMap(([, lines]) => extractBullets(lines.join("\n"))); return unique(preferred).slice(0, 20); }
|
|
190
|
+
function extractUsefulBullets(body) { return unique(extractBullets(body)).filter((item) => item.length >= 5).slice(0, 20); }
|
|
191
|
+
function extractBullets(text) { return text.split(/\r?\n/).map((line) => line.match(/^\s*[-*+]\s+(?:\[[ xX]\]\s*)?(.+?)\s*$/)?.[1]?.trim()).filter((value) => Boolean(value)); }
|
|
192
|
+
function extractSections(body) { const sections = { "": [] }; let current = ""; for (const line of body.split(/\r?\n/)) {
|
|
193
|
+
const heading = line.match(/^#{1,6}\s+(.+?)\s*$/);
|
|
194
|
+
if (heading) {
|
|
195
|
+
current = heading[1].toLowerCase();
|
|
196
|
+
sections[current] ??= [];
|
|
197
|
+
}
|
|
198
|
+
else
|
|
199
|
+
sections[current].push(line);
|
|
200
|
+
} return sections; }
|
|
201
|
+
function extractFilePaths(body) { const values = new Set(); for (const match of body.matchAll(/`([^`]+)`/g)) {
|
|
202
|
+
const value = match[1].trim();
|
|
203
|
+
if (looksLikePath(value))
|
|
204
|
+
values.add(value);
|
|
205
|
+
} for (const match of body.matchAll(/(?:^|\s)((?:[A-Za-z0-9_.-]+\/)+[A-Za-z0-9_.@*-]+(?:\.[A-Za-z0-9*]+)?)/gm))
|
|
206
|
+
if (looksLikePath(match[1]))
|
|
207
|
+
values.add(match[1]); return [...values].slice(0, 20); }
|
|
208
|
+
function looksLikePath(value) { return !value.includes(" ") && !value.startsWith("http") && (value.includes("/") || /\.[A-Za-z0-9]{1,8}$/.test(value)); }
|
|
209
|
+
function firstMeaningfulParagraph(body) { return body.split(/\n\s*\n/).map((item) => item.replace(/^#+\s*/gm, "").trim()).find((item) => item && !/^[-*+]\s/.test(item))?.slice(0, 1000) ?? ""; }
|
|
210
|
+
function unique(values) { return [...new Set(values.map((value) => value.trim()).filter(Boolean))]; }
|
|
211
|
+
function gherkinText(value) { return value.replace(/\s+/g, " ").replace(/^\s*(Given|When|Then|And)\s+/i, "").trim().replace(/:/g, " - "); }
|
|
212
|
+
function issuePlanContractDescription() { return JSON.stringify({ classification: "ready | requires_product_decision | spec_contradiction", rationale: "string", problem: "string", desiredOutcome: "string", requirements: [{ text: "observable requirement", source: "explicit | repository-derived", validators: ["gherkin"] }], acceptance: [{ title: "scenario", requirementIndexes: [1], given: "precondition", when: "action", then: "observable result" }], scope: { allowed: ["repo/paths/or/globs"], forbidden: [], domains: ["backend"] }, risk: "low | medium | high", flags: ["architecture | security | authentication | authorization | schema | migration | public-api | breaking-change | new-dependency | cross-module | ambiguous"], constraints: { breakingApiChanges: false, newDependencies: false, schemaChanges: false }, design: { currentState: "repository evidence", proposedDesign: "bounded approach", risks: [] }, tasks: [{ title: "task", requirementIndexes: [1], scope: ["paths"] }], nonGoals: [], unresolved: [] }, null, 2); }
|
|
213
|
+
//# sourceMappingURL=intake.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intake.js","sourceRoot":"","sources":["../../src/issues/intake.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { HarnessProjectConfig } from "../core/types.js";
|
|
2
|
+
export interface MemoryBenchmarkCase {
|
|
3
|
+
version: 1;
|
|
4
|
+
id: string;
|
|
5
|
+
query: string;
|
|
6
|
+
expectedTerms: string[];
|
|
7
|
+
forbiddenTerms: string[];
|
|
8
|
+
}
|
|
9
|
+
export interface MemoryBenchmarkCaseResult {
|
|
10
|
+
caseId: string;
|
|
11
|
+
success: boolean;
|
|
12
|
+
latencyMs: number;
|
|
13
|
+
recall: number;
|
|
14
|
+
contamination: number;
|
|
15
|
+
score: number;
|
|
16
|
+
output: string;
|
|
17
|
+
}
|
|
18
|
+
export interface MemoryBenchmarkProviderResult {
|
|
19
|
+
provider: string;
|
|
20
|
+
score: number;
|
|
21
|
+
averageRecall: number;
|
|
22
|
+
averageContamination: number;
|
|
23
|
+
averageLatencyMs: number;
|
|
24
|
+
cases: MemoryBenchmarkCaseResult[];
|
|
25
|
+
}
|
|
26
|
+
export interface MemoryBenchmarkReport {
|
|
27
|
+
version: 1;
|
|
28
|
+
createdAt: string;
|
|
29
|
+
project: string;
|
|
30
|
+
providers: MemoryBenchmarkProviderResult[];
|
|
31
|
+
}
|
|
32
|
+
export declare function runMemoryBenchmark(root: string, config: HarnessProjectConfig): Promise<MemoryBenchmarkReport>;
|
|
33
|
+
export declare function scoreMemoryOutput(item: MemoryBenchmarkCase, success: boolean, latencyMs: number, output: string): MemoryBenchmarkCaseResult;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import YAML from "yaml";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
import { runProcess } from "../utils/process.js";
|
|
6
|
+
const caseSchema = z.object({
|
|
7
|
+
version: z.literal(1),
|
|
8
|
+
id: z.string().min(1),
|
|
9
|
+
query: z.string().min(1),
|
|
10
|
+
expectedTerms: z.array(z.string()).default([]),
|
|
11
|
+
forbiddenTerms: z.array(z.string()).default([])
|
|
12
|
+
});
|
|
13
|
+
export async function runMemoryBenchmark(root, config) {
|
|
14
|
+
const providers = config.memory?.benchmark?.providers ?? [];
|
|
15
|
+
if (!providers.length)
|
|
16
|
+
throw new Error("No memory benchmark providers are configured in memory.benchmark.providers.");
|
|
17
|
+
const cases = await loadCases(root, config);
|
|
18
|
+
if (!cases.length)
|
|
19
|
+
throw new Error("No memory benchmark cases found.");
|
|
20
|
+
const results = [];
|
|
21
|
+
for (const provider of providers) {
|
|
22
|
+
const caseResults = [];
|
|
23
|
+
for (const item of cases) {
|
|
24
|
+
const command = provider.command.replaceAll("{query}", shellQuote(item.query)).replaceAll("{caseId}", item.id);
|
|
25
|
+
const execution = await runProcess(command, { cwd: root, timeoutMs: (provider.timeoutSeconds ?? 60) * 1000 });
|
|
26
|
+
const output = `${execution.stdout}\n${execution.stderr}`.trim();
|
|
27
|
+
caseResults.push(scoreMemoryOutput(item, execution.exitCode === 0, execution.durationMs, output));
|
|
28
|
+
}
|
|
29
|
+
const divisor = Math.max(1, caseResults.length);
|
|
30
|
+
results.push({
|
|
31
|
+
provider: provider.name,
|
|
32
|
+
score: round(caseResults.reduce((sum, item) => sum + item.score, 0) / divisor),
|
|
33
|
+
averageRecall: round(caseResults.reduce((sum, item) => sum + item.recall, 0) / divisor),
|
|
34
|
+
averageContamination: round(caseResults.reduce((sum, item) => sum + item.contamination, 0) / divisor),
|
|
35
|
+
averageLatencyMs: round(caseResults.reduce((sum, item) => sum + item.latencyMs, 0) / divisor),
|
|
36
|
+
cases: caseResults
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
results.sort((a, b) => b.score - a.score || a.averageLatencyMs - b.averageLatencyMs);
|
|
40
|
+
const report = { version: 1, createdAt: new Date().toISOString(), project: config.project.name, providers: results };
|
|
41
|
+
const dir = path.resolve(root, config.memory?.benchmark?.resultsDir ?? ".harness/memory-benchmarks");
|
|
42
|
+
await fs.mkdir(dir, { recursive: true });
|
|
43
|
+
await fs.writeFile(path.join(dir, `${Date.now()}.json`), `${JSON.stringify(report, null, 2)}\n`);
|
|
44
|
+
return report;
|
|
45
|
+
}
|
|
46
|
+
export function scoreMemoryOutput(item, success, latencyMs, output) {
|
|
47
|
+
const normalized = output.toLocaleLowerCase();
|
|
48
|
+
const expected = item.expectedTerms.map((term) => term.toLocaleLowerCase());
|
|
49
|
+
const forbidden = item.forbiddenTerms.map((term) => term.toLocaleLowerCase());
|
|
50
|
+
const recall = expected.length ? expected.filter((term) => normalized.includes(term)).length / expected.length : (success ? 1 : 0);
|
|
51
|
+
const contamination = forbidden.length ? forbidden.filter((term) => normalized.includes(term)).length / forbidden.length : 0;
|
|
52
|
+
const latencyPenalty = Math.min(10, latencyMs / 1000);
|
|
53
|
+
const score = success ? Math.max(0, recall * 100 - contamination * 40 - latencyPenalty) : 0;
|
|
54
|
+
return { caseId: item.id, success, latencyMs, recall: round(recall), contamination: round(contamination), score: round(score), output: trim(output) };
|
|
55
|
+
}
|
|
56
|
+
async function loadCases(root, config) {
|
|
57
|
+
const dir = path.resolve(root, config.memory?.benchmark?.casesDir ?? "memory-benchmarks");
|
|
58
|
+
const names = await fs.readdir(dir).catch(() => []);
|
|
59
|
+
const cases = [];
|
|
60
|
+
for (const name of names.filter((value) => /\.ya?ml$/i.test(value)).sort()) {
|
|
61
|
+
const raw = YAML.parse(await fs.readFile(path.join(dir, name), "utf8"));
|
|
62
|
+
cases.push(caseSchema.parse(raw));
|
|
63
|
+
}
|
|
64
|
+
return cases;
|
|
65
|
+
}
|
|
66
|
+
function shellQuote(value) { return `'${value.replaceAll("'", "'\\''")}'`; }
|
|
67
|
+
function trim(value) { return value.length <= 8_000 ? value : `${value.slice(0, 8_000)}\n...[truncated]`; }
|
|
68
|
+
function round(value) { return Math.round(value * 1000) / 1000; }
|
|
69
|
+
//# sourceMappingURL=benchmark.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"benchmark.js","sourceRoot":"","sources":["../../src/memory/benchmark.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { HarnessProjectConfig, RunMetrics, UsageMetrics } from "../core/types.js";
|
|
2
|
+
export declare function countHumanInterventions(root: string, config: HarnessProjectConfig, taskId: string, since: string): Promise<number>;
|
|
3
|
+
export declare function buildRunMetrics(input: {
|
|
4
|
+
firstPassSuccess: boolean;
|
|
5
|
+
repairCount: number;
|
|
6
|
+
humanInterventions: number;
|
|
7
|
+
durationMs: number;
|
|
8
|
+
usage?: UsageMetrics;
|
|
9
|
+
}): RunMetrics;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
export async function countHumanInterventions(root, config, taskId, since) {
|
|
4
|
+
const relative = config.telemetry?.localEventsFile ?? ".harness/telemetry/events.ndjson";
|
|
5
|
+
try {
|
|
6
|
+
const raw = await fs.readFile(path.resolve(root, relative), "utf8");
|
|
7
|
+
return raw.split(/\r?\n/).filter(Boolean).reduce((count, line) => {
|
|
8
|
+
try {
|
|
9
|
+
const event = JSON.parse(line);
|
|
10
|
+
if (event.name !== "harness.human.intervention")
|
|
11
|
+
return count;
|
|
12
|
+
if (event.at && event.at < since)
|
|
13
|
+
return count;
|
|
14
|
+
return event.attributes?.taskId === taskId ? count + 1 : count;
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return count;
|
|
18
|
+
}
|
|
19
|
+
}, 0);
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return 0;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export function buildRunMetrics(input) {
|
|
26
|
+
return {
|
|
27
|
+
firstPassSuccess: input.firstPassSuccess,
|
|
28
|
+
repairCount: input.repairCount,
|
|
29
|
+
humanInterventions: input.humanInterventions,
|
|
30
|
+
durationMs: input.durationMs,
|
|
31
|
+
usage: input.usage ?? {}
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=runMetrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runMetrics.js","sourceRoot":"","sources":["../../src/metrics/runMetrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,IAAY,EAAE,MAA4B,EAAE,MAAc,EAAE,KAAa;IACrH,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,EAAE,eAAe,IAAI,kCAAkC,CAAC;IACzF,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;QACpE,OAAO,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YAC/D,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAyE,CAAC;gBACvG,IAAI,KAAK,CAAC,IAAI,KAAK,4BAA4B;oBAAE,OAAO,KAAK,CAAC;gBAC9D,IAAI,KAAK,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,KAAK;oBAAE,OAAO,KAAK,CAAC;gBAC/C,OAAO,KAAK,CAAC,UAAU,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YACjE,CAAC;YAAC,MAAM,CAAC;gBAAC,OAAO,KAAK,CAAC;YAAC,CAAC;QAC3B,CAAC,EAAE,CAAC,CAAC,CAAC;IACR,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,CAAC,CAAC;IAAC,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAM/B;IACC,OAAO;QACL,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;QACxC,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;QAC5C,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE;KACzB,CAAC;AACJ,CAAC"}
|