@tiic-tech/openworkflow 0.1.1 → 0.1.2
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/dist/adapters/codex/src/cleanCodexAdapter.js +4 -1
- package/dist/adapters/codex/src/cleanCodexAdapter.js.map +1 -1
- package/dist/adapters/codex/src/constants.d.ts +1 -0
- package/dist/adapters/codex/src/constants.js +2 -0
- package/dist/adapters/codex/src/constants.js.map +1 -0
- package/dist/adapters/codex/src/generateCommands.js +14 -9
- package/dist/adapters/codex/src/generateCommands.js.map +1 -1
- package/dist/adapters/codex/src/generateSkills.js +13 -0
- package/dist/adapters/codex/src/generateSkills.js.map +1 -1
- package/dist/adapters/codex/src/generatedFiles.js +1 -1
- package/dist/adapters/codex/src/manifest.js +11 -2
- package/dist/adapters/codex/src/manifest.js.map +1 -1
- package/dist/adapters/codex/src/templates.d.ts +0 -1
- package/dist/adapters/codex/src/templates.js +0 -1
- package/dist/adapters/codex/src/templates.js.map +1 -1
- package/dist/adapters/src/registry.d.ts +20 -0
- package/dist/adapters/src/registry.js +81 -0
- package/dist/adapters/src/registry.js.map +1 -0
- package/dist/cli/src/commands/brief.d.ts +46 -0
- package/dist/cli/src/commands/brief.js +294 -0
- package/dist/cli/src/commands/brief.js.map +1 -0
- package/dist/cli/src/commands/check.d.ts +42 -0
- package/dist/cli/src/commands/check.js +326 -0
- package/dist/cli/src/commands/check.js.map +1 -0
- package/dist/cli/src/commands/clean.js +46 -1
- package/dist/cli/src/commands/clean.js.map +1 -1
- package/dist/cli/src/commands/context.d.ts +1 -0
- package/dist/cli/src/commands/context.js +471 -0
- package/dist/cli/src/commands/context.js.map +1 -0
- package/dist/cli/src/commands/doctor.js +122 -12
- package/dist/cli/src/commands/doctor.js.map +1 -1
- package/dist/cli/src/commands/draft.d.ts +1 -0
- package/dist/cli/src/commands/draft.js +175 -0
- package/dist/cli/src/commands/draft.js.map +1 -0
- package/dist/cli/src/commands/gitAutomation.d.ts +1 -0
- package/dist/cli/src/commands/gitAutomation.js +378 -0
- package/dist/cli/src/commands/gitAutomation.js.map +1 -0
- package/dist/cli/src/commands/handoff.d.ts +22 -0
- package/dist/cli/src/commands/handoff.js +122 -0
- package/dist/cli/src/commands/handoff.js.map +1 -0
- package/dist/cli/src/commands/init.js +52 -1
- package/dist/cli/src/commands/init.js.map +1 -1
- package/dist/cli/src/commands/inspect.d.ts +23 -0
- package/dist/cli/src/commands/inspect.js +157 -0
- package/dist/cli/src/commands/inspect.js.map +1 -0
- package/dist/cli/src/commands/register.d.ts +1 -0
- package/dist/cli/src/commands/register.js +251 -0
- package/dist/cli/src/commands/register.js.map +1 -0
- package/dist/cli/src/commands/resume.d.ts +59 -0
- package/dist/cli/src/commands/resume.js +280 -0
- package/dist/cli/src/commands/resume.js.map +1 -0
- package/dist/cli/src/commands/shared.js +6 -2
- package/dist/cli/src/commands/shared.js.map +1 -1
- package/dist/cli/src/commands/summaries.d.ts +1 -0
- package/dist/cli/src/commands/summaries.js +77 -0
- package/dist/cli/src/commands/summaries.js.map +1 -0
- package/dist/cli/src/commands/summarize.d.ts +1 -0
- package/dist/cli/src/commands/summarize.js +316 -0
- package/dist/cli/src/commands/summarize.js.map +1 -0
- package/dist/cli/src/commands/sync.js +135 -12
- package/dist/cli/src/commands/sync.js.map +1 -1
- package/dist/cli/src/commands/validate.js +25 -1
- package/dist/cli/src/commands/validate.js.map +1 -1
- package/dist/cli/src/dev/verifyAgentE2E.d.ts +2 -0
- package/dist/cli/src/dev/verifyAgentE2E.js +391 -0
- package/dist/cli/src/dev/verifyAgentE2E.js.map +1 -0
- package/dist/cli/src/dev/verifyCleanCommand.js +213 -2
- package/dist/cli/src/dev/verifyCleanCommand.js.map +1 -1
- package/dist/cli/src/dev/verifyRuntimeSurface.js +4940 -54
- package/dist/cli/src/dev/verifyRuntimeSurface.js.map +1 -1
- package/dist/cli/src/dev/verifyWorkflowE2E.js +477 -45
- package/dist/cli/src/dev/verifyWorkflowE2E.js.map +1 -1
- package/dist/cli/src/index.js +184 -6
- package/dist/cli/src/index.js.map +1 -1
- package/dist/cli/src/report.d.ts +26 -0
- package/dist/cli/src/report.js +17 -0
- package/dist/cli/src/report.js.map +1 -0
- package/dist/core/src/artifacts/readiness.d.ts +7 -0
- package/dist/core/src/artifacts/readiness.js +240 -0
- package/dist/core/src/artifacts/readiness.js.map +1 -0
- package/dist/core/src/artifacts/registry.d.ts +9 -2
- package/dist/core/src/artifacts/registry.js +687 -60
- package/dist/core/src/artifacts/registry.js.map +1 -1
- package/dist/core/src/commands/registry.js +1425 -146
- package/dist/core/src/commands/registry.js.map +1 -1
- package/dist/core/src/contracts/index.d.ts +1 -1
- package/dist/core/src/fs/index.d.ts +24 -0
- package/dist/core/src/fs/index.js +48 -1
- package/dist/core/src/fs/index.js.map +1 -1
- package/dist/core/src/git/autonomousSimulator.d.ts +46 -0
- package/dist/core/src/git/autonomousSimulator.js +163 -0
- package/dist/core/src/git/autonomousSimulator.js.map +1 -0
- package/dist/core/src/git/branchIdentity.d.ts +19 -0
- package/dist/core/src/git/branchIdentity.js +75 -0
- package/dist/core/src/git/branchIdentity.js.map +1 -0
- package/dist/core/src/git/draftPrPilot.d.ts +47 -0
- package/dist/core/src/git/draftPrPilot.js +196 -0
- package/dist/core/src/git/draftPrPilot.js.map +1 -0
- package/dist/core/src/git/localEvidenceReader.d.ts +21 -0
- package/dist/core/src/git/localEvidenceReader.js +142 -0
- package/dist/core/src/git/localEvidenceReader.js.map +1 -0
- package/dist/core/src/git/localGitAutomation.d.ts +68 -0
- package/dist/core/src/git/localGitAutomation.js +470 -0
- package/dist/core/src/git/localGitAutomation.js.map +1 -0
- package/dist/core/src/git/mergeReadinessCheckpoint.d.ts +31 -0
- package/dist/core/src/git/mergeReadinessCheckpoint.js +110 -0
- package/dist/core/src/git/mergeReadinessCheckpoint.js.map +1 -0
- package/dist/core/src/git/prReadySummary.d.ts +16 -0
- package/dist/core/src/git/prReadySummary.js +144 -0
- package/dist/core/src/git/prReadySummary.js.map +1 -0
- package/dist/core/src/git/remoteReadonlyPlanner.d.ts +60 -0
- package/dist/core/src/git/remoteReadonlyPlanner.js +223 -0
- package/dist/core/src/git/remoteReadonlyPlanner.js.map +1 -0
- package/dist/core/src/onboarding/agentsGuide.d.ts +32 -0
- package/dist/core/src/onboarding/agentsGuide.js +164 -0
- package/dist/core/src/onboarding/agentsGuide.js.map +1 -0
- package/dist/core/src/validators/validateOpenWorkflow.js +1331 -15
- package/dist/core/src/validators/validateOpenWorkflow.js.map +1 -1
- package/dist/core/src/validators/validateRepositoryContracts.js +2321 -306
- package/dist/core/src/validators/validateRepositoryContracts.js.map +1 -1
- package/dist/core/src/workflow/cleanOpenWorkflow.d.ts +2 -0
- package/dist/core/src/workflow/cleanOpenWorkflow.js +97 -8
- package/dist/core/src/workflow/cleanOpenWorkflow.js.map +1 -1
- package/dist/core/src/workflow/doctorOpenWorkflow.d.ts +7 -0
- package/dist/core/src/workflow/doctorOpenWorkflow.js +26 -0
- package/dist/core/src/workflow/doctorOpenWorkflow.js.map +1 -0
- package/dist/core/src/workflow/initOpenWorkflow.d.ts +7 -0
- package/dist/core/src/workflow/initOpenWorkflow.js +96 -8
- package/dist/core/src/workflow/initOpenWorkflow.js.map +1 -1
- package/dist/core/src/workflow/planningQueueResume.d.ts +105 -0
- package/dist/core/src/workflow/planningQueueResume.js +596 -0
- package/dist/core/src/workflow/planningQueueResume.js.map +1 -0
- package/dist/core/src/workflow/readWorkflowConfig.d.ts +6 -0
- package/dist/core/src/workflow/readWorkflowConfig.js +28 -0
- package/dist/core/src/workflow/readWorkflowConfig.js.map +1 -0
- package/dist/core/src/workflow/summaryHealth.d.ts +60 -0
- package/dist/core/src/workflow/summaryHealth.js +713 -0
- package/dist/core/src/workflow/summaryHealth.js.map +1 -0
- package/dist/core/src/workflow/syncOpenWorkflow.d.ts +22 -0
- package/dist/core/src/workflow/syncOpenWorkflow.js +235 -0
- package/dist/core/src/workflow/syncOpenWorkflow.js.map +1 -0
- package/package.json +2 -1
- package/references/artifact-authoring-templates.md +14 -12
- package/references/artifact-instruction-envelope.md +133 -0
- package/references/coder-continuous-growth-loop.md +68 -0
- package/references/gh-operation-governance.md +114 -0
- package/references/git-automation-governance.md +324 -0
- package/references/git-version-control-governance.md +227 -0
- package/references/internal-coder-protocol.md +202 -0
- package/references/issue-governance.md +115 -0
- package/references/planning-artifact-contracts.md +595 -0
- package/references/planning-skill-runtime-exposure.md +159 -0
- package/references/proto-redesign-artifact-contracts.md +217 -0
- package/references/proto2html-artifact-contracts.md +113 -0
- package/references/skill-system-lifecycle.md +198 -0
- package/references/validation-trust-domains.md +286 -0
- package/references/workflow-blueprint-runtime-alignment.md +287 -0
- package/schemas/atom-tasks.schema.json +101 -0
- package/schemas/candidate-changes.schema.json +323 -0
- package/schemas/current-state.schema.json +113 -0
- package/schemas/html-prototype.schema.json +288 -0
- package/schemas/openworkflow-contract.schema.json +9 -1
- package/schemas/proto-prompt-pack.schema.json +1333 -0
- package/schemas/prototype-evidence.schema.json +684 -142
- package/schemas/selected-change.schema.json +104 -0
- package/schemas/validation-target.schema.json +187 -1
- package/schemas/validation.schema.json +187 -1
- package/schemas/vision-session.schema.json +151 -0
- package/skills/analyze-changes/SKILL.md +92 -0
- package/skills/analyze-changes/agents/openai.yaml +4 -0
- package/skills/analyze-changes/references/analysis-protocol.md +116 -0
- package/skills/build-proto-prompt/SKILL.md +125 -0
- package/skills/build-proto-prompt/references/output-boundary.md +54 -0
- package/skills/build-proto-prompt/references/prompt-pack-compiler-protocol.md +80 -0
- package/skills/build-prototype/SKILL.md +162 -38
- package/skills/build-prototype/agents/openai.yaml +2 -2
- package/skills/build-prototype/references/philosophy-engine.md +61 -0
- package/skills/build-prototype/references/strategic-prompt-pack-protocol.md +365 -0
- package/skills/build-prototype/references/vision2prompt/01_input_contract.md +84 -0
- package/skills/build-prototype/references/vision2prompt/02_vision_decomposition.md +108 -0
- package/skills/build-prototype/references/vision2prompt/03_strategy_hypothesis_generation.md +89 -0
- package/skills/build-prototype/references/vision2prompt/04_product_system_extraction.md +78 -0
- package/skills/build-prototype/references/vision2prompt/05_prototype_prompt_schema.md +189 -0
- package/skills/build-prototype/references/vision2prompt/06_output_templates.md +125 -0
- package/skills/build-prototype/references/vision2prompt/07_quality_rubric.md +171 -0
- package/skills/build-validation/SKILL.md +136 -54
- package/skills/build-validation/references/prototype-validation-target-rubric.md +35 -0
- package/skills/build-validation/references/return-to-vision-gate.md +32 -0
- package/skills/build-vision/SKILL.md +192 -0
- package/skills/build-vision/references/proto-readiness-rubric.md +48 -0
- package/skills/build-vision/references/vision-interview-protocol.md +48 -0
- package/skills/coder/SKILL.md +204 -0
- package/skills/decompose-to-changes/SKILL.md +176 -0
- package/skills/decompose-to-changes/agents/openai.yaml +4 -0
- package/skills/decompose-to-changes/references/decomposition-protocol.md +278 -0
- package/skills/prompt2proto/SKILL.md +157 -0
- package/skills/prompt2proto/agents/openai.yaml +4 -0
- package/skills/prompt2proto/references/00_role_philosophy_engine.md +96 -0
- package/skills/prompt2proto/references/01_input_contract.md +53 -0
- package/skills/prompt2proto/references/02_prompt_pack_readiness.md +50 -0
- package/skills/prompt2proto/references/03_visual_translation_workflow.md +64 -0
- package/skills/prompt2proto/references/04_output_contract.md +67 -0
- package/skills/prompt2proto/references/05_quality_rubric.md +46 -0
- package/skills/proto2html/SKILL.md +136 -0
- package/skills/proto2html/agents/openai.yaml +4 -0
- package/skills/proto2html/references/proto2html-protocol.md +115 -0
- package/skills/run-team/SKILL.md +4 -0
- package/skills/select-change/SKILL.md +200 -0
- package/skills/select-change/agents/openai.yaml +4 -0
- package/skills/select-change/references/selection-protocol.md +281 -0
- package/skills/tune-prototype/SKILL.md +121 -0
- package/skills/tune-prototype/agents/openai.yaml +4 -0
- package/skills/tune-prototype/references/refined-prompt-pack-protocol.md +161 -0
|
@@ -0,0 +1,470 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
3
|
+
import { dirname } from "node:path";
|
|
4
|
+
import { promisify } from "node:util";
|
|
5
|
+
import { dumpYaml, parseYaml } from "../contracts/yaml.js";
|
|
6
|
+
import { assessBranchIdentity } from "./branchIdentity.js";
|
|
7
|
+
const execFileAsync = promisify(execFile);
|
|
8
|
+
export async function ensureLocalFeatBranch(options) {
|
|
9
|
+
const dryRun = options.dryRun !== false;
|
|
10
|
+
const branchBoundary = options.branchBoundary.trim();
|
|
11
|
+
const base = emptyResult(dryRun, branchBoundary);
|
|
12
|
+
const branchError = validateBranchBoundary(branchBoundary);
|
|
13
|
+
if (branchError) {
|
|
14
|
+
return { ...base, errors: [branchError] };
|
|
15
|
+
}
|
|
16
|
+
const insideWorkTree = await gitCapture(options.root, ["rev-parse", "--is-inside-work-tree"]);
|
|
17
|
+
if (!insideWorkTree.ok || insideWorkTree.stdout.trim() !== "true") {
|
|
18
|
+
return { ...base, errors: ["root must be inside a git work tree"] };
|
|
19
|
+
}
|
|
20
|
+
const gitBranchCheck = await gitCapture(options.root, ["check-ref-format", "--branch", branchBoundary]);
|
|
21
|
+
if (!gitBranchCheck.ok) {
|
|
22
|
+
return { ...base, errors: ["branch boundary must be accepted by git check-ref-format --branch"] };
|
|
23
|
+
}
|
|
24
|
+
const currentBranchResult = await gitCapture(options.root, ["branch", "--show-current"]);
|
|
25
|
+
const currentBranch = currentBranchResult.ok && currentBranchResult.stdout.trim().length > 0
|
|
26
|
+
? currentBranchResult.stdout.trim()
|
|
27
|
+
: null;
|
|
28
|
+
const dirtyPaths = await readDirtyPaths(options.root);
|
|
29
|
+
const branchMatchesCurrent = currentBranch === branchBoundary;
|
|
30
|
+
const branchIdentity = options.planId
|
|
31
|
+
? assessBranchIdentity(options.planId, branchBoundary, options.branchIdentityException, "branch")
|
|
32
|
+
: null;
|
|
33
|
+
const withState = {
|
|
34
|
+
...base,
|
|
35
|
+
currentBranch,
|
|
36
|
+
branchMatchesCurrent,
|
|
37
|
+
branchOwnsPlan: branchIdentity?.owns_plan ?? null,
|
|
38
|
+
branchIdentity,
|
|
39
|
+
dirtyPaths,
|
|
40
|
+
};
|
|
41
|
+
if (branchIdentity && !branchIdentity.ok) {
|
|
42
|
+
return { ...withState, errors: branchIdentity.errors };
|
|
43
|
+
}
|
|
44
|
+
if (dirtyPaths.length > 0) {
|
|
45
|
+
return {
|
|
46
|
+
...withState,
|
|
47
|
+
errors: ["working tree has uncommitted paths; resolve them before local branch automation"],
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
if (currentBranch === branchBoundary) {
|
|
51
|
+
return { ...withState, ok: true, action: "already_on_branch" };
|
|
52
|
+
}
|
|
53
|
+
const branchExists = await gitExitCode(options.root, ["show-ref", "--verify", "--quiet", `refs/heads/${branchBoundary}`]) === 0;
|
|
54
|
+
const args = branchExists ? ["switch", branchBoundary] : ["switch", "-c", branchBoundary];
|
|
55
|
+
const action = branchExists ? "checkout_existing_branch" : "create_branch";
|
|
56
|
+
const preview = { command: "git", args };
|
|
57
|
+
if (dryRun) {
|
|
58
|
+
return { ...withState, ok: true, action, preview };
|
|
59
|
+
}
|
|
60
|
+
const mutation = await gitCapture(options.root, args);
|
|
61
|
+
if (!mutation.ok) {
|
|
62
|
+
return { ...withState, action, preview, errors: [mutation.stderr || mutation.stdout || `git ${args.join(" ")} failed`] };
|
|
63
|
+
}
|
|
64
|
+
const afterBranch = await gitCapture(options.root, ["branch", "--show-current"]);
|
|
65
|
+
return {
|
|
66
|
+
...withState,
|
|
67
|
+
ok: true,
|
|
68
|
+
currentBranch: afterBranch.ok && afterBranch.stdout.trim().length > 0 ? afterBranch.stdout.trim() : branchBoundary,
|
|
69
|
+
action,
|
|
70
|
+
preview,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
export async function commitSelectedChange(options) {
|
|
74
|
+
const dryRun = options.dryRun !== false;
|
|
75
|
+
const base = emptyCommitResult(options, dryRun);
|
|
76
|
+
const rootCheck = await validateGitRoot(options.root);
|
|
77
|
+
if (!rootCheck.ok) {
|
|
78
|
+
return { ...base, errors: rootCheck.errors };
|
|
79
|
+
}
|
|
80
|
+
const commitInputError = validateCommitInputs(options);
|
|
81
|
+
if (commitInputError) {
|
|
82
|
+
return { ...base, errors: [commitInputError] };
|
|
83
|
+
}
|
|
84
|
+
const currentBranch = await readCurrentBranch(options.root);
|
|
85
|
+
const dirtyPaths = await readDirtyPaths(options.root);
|
|
86
|
+
const normalizedAllowedPaths = options.allowedPaths.map(normalizeRepoPath);
|
|
87
|
+
const unrelatedDirtyPaths = dirtyPaths.filter((path) => !isAllowedDirtyPath(path, normalizedAllowedPaths));
|
|
88
|
+
const includedPaths = dirtyPaths.filter((path) => isAllowedDirtyPath(path, normalizedAllowedPaths));
|
|
89
|
+
const withState = { ...base, currentBranch, dirtyPaths, includedPaths, unrelatedDirtyPaths };
|
|
90
|
+
if (options.branchBoundary && currentBranch !== options.branchBoundary) {
|
|
91
|
+
return { ...withState, errors: [`current branch ${currentBranch ?? "(detached)"} does not match branch boundary ${options.branchBoundary}`] };
|
|
92
|
+
}
|
|
93
|
+
if (options.branchBoundary) {
|
|
94
|
+
const branchIdentity = assessBranchIdentity(options.planId, options.branchBoundary, options.branchIdentityException, "commit");
|
|
95
|
+
if (!branchIdentity.ok) {
|
|
96
|
+
return { ...withState, errors: branchIdentity.errors };
|
|
97
|
+
}
|
|
98
|
+
if (branchIdentity.warnings.length > 0) {
|
|
99
|
+
withState.warnings.push(...branchIdentity.warnings);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
if (options.validationEvidence.length === 0) {
|
|
103
|
+
return { ...withState, errors: ["validation evidence is required before local commit automation"] };
|
|
104
|
+
}
|
|
105
|
+
if (dirtyPaths.length === 0) {
|
|
106
|
+
return { ...withState, errors: ["no dirty paths are available to commit"] };
|
|
107
|
+
}
|
|
108
|
+
if (unrelatedDirtyPaths.length > 0) {
|
|
109
|
+
return {
|
|
110
|
+
...withState,
|
|
111
|
+
warnings: [...withState.warnings, ...scopeGuidanceForUnrelatedPaths(unrelatedDirtyPaths)],
|
|
112
|
+
errors: ["working tree contains dirty paths outside the selected change scope"],
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
const normalizedEvidencePath = options.evidencePath ? normalizeRepoPath(options.evidencePath) : null;
|
|
116
|
+
if (options.commitEvidence && options.requireEvidenceBackfill) {
|
|
117
|
+
if (!normalizedEvidencePath) {
|
|
118
|
+
return { ...withState, errors: ["strict selected-change commit evidence requires an evidence path"] };
|
|
119
|
+
}
|
|
120
|
+
const backfillPreflight = await resolveCommitEvidenceBackfillTargets(options, normalizedEvidencePath);
|
|
121
|
+
if (!backfillPreflight.ok) {
|
|
122
|
+
return {
|
|
123
|
+
...withState,
|
|
124
|
+
evidencePath: normalizedEvidencePath,
|
|
125
|
+
errors: [`strict selected-change commit evidence backfill is required: ${backfillPreflight.reason}`],
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
const commitArgs = ["commit", "-m", options.commitMessage];
|
|
130
|
+
const preview = { command: "git", args: commitArgs };
|
|
131
|
+
if (dryRun) {
|
|
132
|
+
return { ...withState, ok: true, action: "commit_selected_change", preview };
|
|
133
|
+
}
|
|
134
|
+
const addResult = await gitCapture(options.root, ["add", "--", ...includedPaths]);
|
|
135
|
+
if (!addResult.ok) {
|
|
136
|
+
return { ...withState, preview, errors: [addResult.stderr || addResult.stdout || "git add failed"] };
|
|
137
|
+
}
|
|
138
|
+
const commitResult = await gitCapture(options.root, commitArgs);
|
|
139
|
+
if (!commitResult.ok) {
|
|
140
|
+
return { ...withState, preview, errors: [commitResult.stderr || commitResult.stdout || "git commit failed"] };
|
|
141
|
+
}
|
|
142
|
+
const primaryCommit = await readHeadCommit(options.root);
|
|
143
|
+
if (options.evidencePath && options.commitEvidence) {
|
|
144
|
+
const evidencePath = normalizeRepoPath(options.evidencePath);
|
|
145
|
+
const evidence = buildCommitEvidence(options, primaryCommit);
|
|
146
|
+
const absoluteEvidencePath = `${options.root}/${evidencePath}`;
|
|
147
|
+
await mkdir(dirname(absoluteEvidencePath), { recursive: true });
|
|
148
|
+
await writeFile(absoluteEvidencePath, dumpYaml(evidence), "utf8");
|
|
149
|
+
const backfill = await backfillCommitEvidence(options, evidencePath);
|
|
150
|
+
const evidenceAddResult = await gitCapture(options.root, ["add", "--", evidencePath, ...backfill.updatedPaths]);
|
|
151
|
+
if (!evidenceAddResult.ok) {
|
|
152
|
+
return {
|
|
153
|
+
...withState,
|
|
154
|
+
preview,
|
|
155
|
+
primaryCommit,
|
|
156
|
+
evidenceBackfilledPaths: backfill.updatedPaths,
|
|
157
|
+
warnings: [...withState.warnings, ...backfill.warnings],
|
|
158
|
+
errors: [evidenceAddResult.stderr || evidenceAddResult.stdout || "git add evidence failed"],
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
const evidenceMessage = `${options.planId}/${options.candidateId} Record commit evidence`;
|
|
162
|
+
const evidenceCommitResult = await gitCapture(options.root, ["commit", "-m", evidenceMessage]);
|
|
163
|
+
if (!evidenceCommitResult.ok) {
|
|
164
|
+
return {
|
|
165
|
+
...withState,
|
|
166
|
+
preview,
|
|
167
|
+
primaryCommit,
|
|
168
|
+
evidenceBackfilledPaths: backfill.updatedPaths,
|
|
169
|
+
warnings: [...withState.warnings, ...backfill.warnings],
|
|
170
|
+
errors: [evidenceCommitResult.stderr || evidenceCommitResult.stdout || "git commit evidence failed"],
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
const evidenceCommit = await readHeadCommit(options.root);
|
|
174
|
+
return {
|
|
175
|
+
...withState,
|
|
176
|
+
ok: true,
|
|
177
|
+
action: "commit_selected_change",
|
|
178
|
+
preview,
|
|
179
|
+
primaryCommit,
|
|
180
|
+
evidenceCommit,
|
|
181
|
+
headCommit: evidenceCommit,
|
|
182
|
+
evidencePath,
|
|
183
|
+
evidenceBackfilledPaths: backfill.updatedPaths,
|
|
184
|
+
warnings: [...withState.warnings, ...backfill.warnings],
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
return {
|
|
188
|
+
...withState,
|
|
189
|
+
ok: true,
|
|
190
|
+
action: "commit_selected_change",
|
|
191
|
+
preview,
|
|
192
|
+
primaryCommit,
|
|
193
|
+
headCommit: primaryCommit,
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
async function backfillCommitEvidence(options, evidencePath) {
|
|
197
|
+
const targets = await resolveCommitEvidenceBackfillTargets(options, evidencePath);
|
|
198
|
+
if (!targets.ok) {
|
|
199
|
+
return { updatedPaths: [], warnings: [`commit evidence backfill skipped: ${targets.reason}`] };
|
|
200
|
+
}
|
|
201
|
+
const updatedPaths = [];
|
|
202
|
+
if (!targets.queueEvidence.includes(evidencePath)) {
|
|
203
|
+
targets.queueEvidence.push(evidencePath);
|
|
204
|
+
await writeFile(`${options.root}/${targets.queuePath}`, dumpYaml(targets.queue), "utf8");
|
|
205
|
+
updatedPaths.push(targets.queuePath);
|
|
206
|
+
}
|
|
207
|
+
if (!targets.selectedEvidence.includes(evidencePath)) {
|
|
208
|
+
targets.selectedEvidence.push(evidencePath);
|
|
209
|
+
await writeFile(`${options.root}/${targets.selectedChangePath}`, dumpYaml(targets.selectedChange), "utf8");
|
|
210
|
+
updatedPaths.push(targets.selectedChangePath);
|
|
211
|
+
}
|
|
212
|
+
return { updatedPaths, warnings: [] };
|
|
213
|
+
}
|
|
214
|
+
async function resolveCommitEvidenceBackfillTargets(options, evidencePath) {
|
|
215
|
+
const queuePath = options.queuePath ? normalizeRepoPath(options.queuePath) : null;
|
|
216
|
+
const selectedChangePath = options.selectedChangePath ? normalizeRepoPath(options.selectedChangePath) : null;
|
|
217
|
+
if (!queuePath) {
|
|
218
|
+
return { ok: false, reason: "queue path was not provided" };
|
|
219
|
+
}
|
|
220
|
+
if (!selectedChangePath) {
|
|
221
|
+
return { ok: false, reason: "selected-change path was not provided" };
|
|
222
|
+
}
|
|
223
|
+
if (pathEscapesRepo(queuePath) || pathEscapesRepo(selectedChangePath) || pathEscapesRepo(evidencePath)) {
|
|
224
|
+
return { ok: false, reason: "queue, selected-change, and evidence paths must be repo-relative" };
|
|
225
|
+
}
|
|
226
|
+
const selectedChangeDir = dirname(selectedChangePath);
|
|
227
|
+
if (!(evidencePath === `${selectedChangeDir}/LOCAL_COMMIT_EVIDENCE.yaml` || evidencePath.startsWith(`${selectedChangeDir}/`))) {
|
|
228
|
+
return { ok: false, reason: "evidence path is outside the selected-change folder" };
|
|
229
|
+
}
|
|
230
|
+
let queue;
|
|
231
|
+
let selectedChange;
|
|
232
|
+
try {
|
|
233
|
+
queue = readYamlRecord(await readFile(`${options.root}/${queuePath}`, "utf8"));
|
|
234
|
+
selectedChange = readYamlRecord(await readFile(`${options.root}/${selectedChangePath}`, "utf8"));
|
|
235
|
+
}
|
|
236
|
+
catch (error) {
|
|
237
|
+
return { ok: false, reason: `could not read planning artifacts: ${error instanceof Error ? error.message : String(error)}` };
|
|
238
|
+
}
|
|
239
|
+
const candidate = array(queue.changes).map(record).find((item) => item.id === options.candidateId);
|
|
240
|
+
if (!candidate) {
|
|
241
|
+
return { ok: false, reason: `candidate ${options.candidateId} was not found in queue` };
|
|
242
|
+
}
|
|
243
|
+
if (candidate.status !== "done") {
|
|
244
|
+
return { ok: false, reason: `candidate ${options.candidateId} status is not done` };
|
|
245
|
+
}
|
|
246
|
+
const queueCompletion = recordOrNull(candidate.completion);
|
|
247
|
+
if (!queueCompletion) {
|
|
248
|
+
return { ok: false, reason: `candidate ${options.candidateId} has no completion object` };
|
|
249
|
+
}
|
|
250
|
+
const selectedCompletion = recordOrNull(selectedChange.completion);
|
|
251
|
+
if (!selectedCompletion) {
|
|
252
|
+
return { ok: false, reason: "selected-change artifact has no completion object" };
|
|
253
|
+
}
|
|
254
|
+
const queueEvidence = arrayOrNull(queueCompletion.evidence);
|
|
255
|
+
if (!queueEvidence) {
|
|
256
|
+
return { ok: false, reason: `candidate ${options.candidateId} completion.evidence is not an array` };
|
|
257
|
+
}
|
|
258
|
+
const selectedEvidence = arrayOrNull(selectedCompletion.evidence);
|
|
259
|
+
if (!selectedEvidence) {
|
|
260
|
+
return { ok: false, reason: "selected-change completion.evidence is not an array" };
|
|
261
|
+
}
|
|
262
|
+
return {
|
|
263
|
+
ok: true,
|
|
264
|
+
queuePath,
|
|
265
|
+
selectedChangePath,
|
|
266
|
+
queue,
|
|
267
|
+
selectedChange,
|
|
268
|
+
queueEvidence,
|
|
269
|
+
selectedEvidence,
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
async function validateGitRoot(root) {
|
|
273
|
+
const insideWorkTree = await gitCapture(root, ["rev-parse", "--is-inside-work-tree"]);
|
|
274
|
+
if (!insideWorkTree.ok || insideWorkTree.stdout.trim() !== "true") {
|
|
275
|
+
return { ok: false, errors: ["root must be inside a git work tree"] };
|
|
276
|
+
}
|
|
277
|
+
return { ok: true, errors: [] };
|
|
278
|
+
}
|
|
279
|
+
function validateCommitInputs(options) {
|
|
280
|
+
if (options.planId.trim().length === 0 || options.candidateId.trim().length === 0 || options.selectedChangeId.trim().length === 0) {
|
|
281
|
+
return "plan id, candidate id, and selected change id are required";
|
|
282
|
+
}
|
|
283
|
+
if (!options.commitMessage.includes(options.planId) || !options.commitMessage.includes(options.candidateId)) {
|
|
284
|
+
return "commit message must include the plan id and candidate id";
|
|
285
|
+
}
|
|
286
|
+
if (options.allowedPaths.length === 0) {
|
|
287
|
+
return "allowed paths are required before local commit automation";
|
|
288
|
+
}
|
|
289
|
+
if (options.allowedPaths.some((path) => normalizeRepoPath(path).startsWith(".."))) {
|
|
290
|
+
return "allowed paths must stay inside the repository";
|
|
291
|
+
}
|
|
292
|
+
return null;
|
|
293
|
+
}
|
|
294
|
+
function emptyCommitResult(options, dryRun) {
|
|
295
|
+
return {
|
|
296
|
+
ok: false,
|
|
297
|
+
dryRun,
|
|
298
|
+
planId: options.planId,
|
|
299
|
+
candidateId: options.candidateId,
|
|
300
|
+
selectedChangeId: options.selectedChangeId,
|
|
301
|
+
currentBranch: null,
|
|
302
|
+
dirtyPaths: [],
|
|
303
|
+
includedPaths: [],
|
|
304
|
+
unrelatedDirtyPaths: [],
|
|
305
|
+
validationEvidence: options.validationEvidence,
|
|
306
|
+
action: null,
|
|
307
|
+
preview: null,
|
|
308
|
+
primaryCommit: null,
|
|
309
|
+
evidenceCommit: null,
|
|
310
|
+
headCommit: null,
|
|
311
|
+
evidencePath: options.evidencePath ? normalizeRepoPath(options.evidencePath) : null,
|
|
312
|
+
evidenceBackfilledPaths: [],
|
|
313
|
+
errors: [],
|
|
314
|
+
warnings: [],
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
function buildCommitEvidence(options, primaryCommit) {
|
|
318
|
+
return {
|
|
319
|
+
schema_version: "0.1.0",
|
|
320
|
+
contract_id: `local_commit_evidence:${options.selectedChangeId}`,
|
|
321
|
+
contract_type: "planning",
|
|
322
|
+
planning_artifact_type: "implementation_evidence",
|
|
323
|
+
title: `Local commit evidence for ${options.selectedChangeId}`,
|
|
324
|
+
status: "current",
|
|
325
|
+
source_plan_id: options.planId,
|
|
326
|
+
source_candidate_id: options.candidateId,
|
|
327
|
+
selected_change_id: options.selectedChangeId,
|
|
328
|
+
primary_commit: primaryCommit,
|
|
329
|
+
validation_evidence: options.validationEvidence,
|
|
330
|
+
coder_gate: {
|
|
331
|
+
status: "recorded",
|
|
332
|
+
enforcement: "guidance_only",
|
|
333
|
+
evidence_binding: "LOCAL_COMMIT_EVIDENCE.yaml",
|
|
334
|
+
validation_evidence_ref: "validation_evidence",
|
|
335
|
+
summary: "Coder governance evidence is bound to this local commit evidence record when the selected change involves source edits.",
|
|
336
|
+
},
|
|
337
|
+
audit_notes: [
|
|
338
|
+
"Selected changes must have at least one local commit.",
|
|
339
|
+
"Additional evidence commits are allowed when they preserve selected-change traceability.",
|
|
340
|
+
"Remote push, PR creation, Issue mutation, and merge are not part of this local automation.",
|
|
341
|
+
],
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
async function readCurrentBranch(root) {
|
|
345
|
+
const currentBranchResult = await gitCapture(root, ["branch", "--show-current"]);
|
|
346
|
+
return currentBranchResult.ok && currentBranchResult.stdout.trim().length > 0
|
|
347
|
+
? currentBranchResult.stdout.trim()
|
|
348
|
+
: null;
|
|
349
|
+
}
|
|
350
|
+
async function readHeadCommit(root) {
|
|
351
|
+
const head = await gitCapture(root, ["rev-parse", "HEAD"]);
|
|
352
|
+
return head.ok && head.stdout.trim().length > 0 ? head.stdout.trim() : null;
|
|
353
|
+
}
|
|
354
|
+
function emptyResult(dryRun, branchBoundary) {
|
|
355
|
+
return {
|
|
356
|
+
ok: false,
|
|
357
|
+
dryRun,
|
|
358
|
+
branchBoundary,
|
|
359
|
+
currentBranch: null,
|
|
360
|
+
branchMatchesCurrent: null,
|
|
361
|
+
branchOwnsPlan: null,
|
|
362
|
+
branchIdentity: null,
|
|
363
|
+
dirtyPaths: [],
|
|
364
|
+
action: null,
|
|
365
|
+
preview: null,
|
|
366
|
+
errors: [],
|
|
367
|
+
warnings: [],
|
|
368
|
+
};
|
|
369
|
+
}
|
|
370
|
+
function validateBranchBoundary(branch) {
|
|
371
|
+
if (branch.length === 0) {
|
|
372
|
+
return "branch boundary must be non-empty";
|
|
373
|
+
}
|
|
374
|
+
if (branch.includes(" ") || branch.startsWith("/") || branch.endsWith("/") || branch.startsWith("-")) {
|
|
375
|
+
return "branch boundary must be a branch-like string without spaces, leading dash, or leading/trailing slashes";
|
|
376
|
+
}
|
|
377
|
+
if (branch.includes("..") || /[~^:?*[\\]/.test(branch)) {
|
|
378
|
+
return "branch boundary must not contain git ref control characters";
|
|
379
|
+
}
|
|
380
|
+
return null;
|
|
381
|
+
}
|
|
382
|
+
async function readDirtyPaths(root) {
|
|
383
|
+
const status = await gitCapture(root, ["status", "--porcelain"]);
|
|
384
|
+
if (!status.ok || status.stdout.trim().length === 0) {
|
|
385
|
+
return [];
|
|
386
|
+
}
|
|
387
|
+
return status.stdout.split("\n").map(parseStatusPath).filter((line) => line.length > 0);
|
|
388
|
+
}
|
|
389
|
+
function parseStatusPath(line) {
|
|
390
|
+
const path = line.slice(3).trim();
|
|
391
|
+
const renameTarget = path.includes(" -> ") ? path.split(" -> ").pop() ?? path : path;
|
|
392
|
+
return normalizeRepoPath(renameTarget.replace(/^"|"$/g, ""));
|
|
393
|
+
}
|
|
394
|
+
function normalizeRepoPath(path) {
|
|
395
|
+
return path.replace(/\\/g, "/").replace(/^\.?\//, "").replace(/\/+$/g, "");
|
|
396
|
+
}
|
|
397
|
+
function pathEscapesRepo(path) {
|
|
398
|
+
return path === ".." || path.startsWith("../") || path.startsWith("/") || path.includes("://");
|
|
399
|
+
}
|
|
400
|
+
function isAllowedDirtyPath(path, allowedPaths) {
|
|
401
|
+
return allowedPaths.some((allowedPath) => path === allowedPath || path.startsWith(`${allowedPath}/`));
|
|
402
|
+
}
|
|
403
|
+
function scopeGuidanceForUnrelatedPaths(paths) {
|
|
404
|
+
const workflowOutputs = paths.filter(isLikelyOpenWorkflowOutputPath);
|
|
405
|
+
if (workflowOutputs.length === 0) {
|
|
406
|
+
return [];
|
|
407
|
+
}
|
|
408
|
+
return [
|
|
409
|
+
`dirty paths look like OpenWorkflow command outputs outside selected-change owned_paths: ${workflowOutputs.join(", ")}`,
|
|
410
|
+
"If these outputs are expected for the selected change, add the exact file or containing command-output folder to the candidate owned_paths and rerun git-automation commit; otherwise revert or move the unrelated output before committing.",
|
|
411
|
+
];
|
|
412
|
+
}
|
|
413
|
+
function isLikelyOpenWorkflowOutputPath(path) {
|
|
414
|
+
if (!path.startsWith(".openworkflow/")) {
|
|
415
|
+
return false;
|
|
416
|
+
}
|
|
417
|
+
return path === ".openworkflow/CURRENT_STATE.yaml"
|
|
418
|
+
|| path.endsWith("/SUMMARY.yaml")
|
|
419
|
+
|| path.endsWith("_INDEX.yaml")
|
|
420
|
+
|| path.endsWith("/DECISION.yaml")
|
|
421
|
+
|| path.endsWith("/VISION_CONTRACT.yaml")
|
|
422
|
+
|| path.endsWith("/VALIDATION_INDEX.yaml");
|
|
423
|
+
}
|
|
424
|
+
function readYamlRecord(content) {
|
|
425
|
+
return record(parseYaml(content));
|
|
426
|
+
}
|
|
427
|
+
function record(value) {
|
|
428
|
+
return value && typeof value === "object" && !Array.isArray(value) ? value : {};
|
|
429
|
+
}
|
|
430
|
+
function recordOrNull(value) {
|
|
431
|
+
return value && typeof value === "object" && !Array.isArray(value) ? value : null;
|
|
432
|
+
}
|
|
433
|
+
function array(value) {
|
|
434
|
+
return Array.isArray(value) ? value : [];
|
|
435
|
+
}
|
|
436
|
+
function arrayOrNull(value) {
|
|
437
|
+
return Array.isArray(value) ? value : null;
|
|
438
|
+
}
|
|
439
|
+
async function gitExitCode(root, args) {
|
|
440
|
+
try {
|
|
441
|
+
await execFileAsync("git", args, { cwd: root });
|
|
442
|
+
return 0;
|
|
443
|
+
}
|
|
444
|
+
catch (error) {
|
|
445
|
+
if (isExecError(error) && typeof error.code === "number") {
|
|
446
|
+
return error.code;
|
|
447
|
+
}
|
|
448
|
+
return null;
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
async function gitCapture(root, args) {
|
|
452
|
+
try {
|
|
453
|
+
const { stdout, stderr } = await execFileAsync("git", args, { cwd: root });
|
|
454
|
+
return { ok: true, stdout, stderr };
|
|
455
|
+
}
|
|
456
|
+
catch (error) {
|
|
457
|
+
if (isExecError(error)) {
|
|
458
|
+
return {
|
|
459
|
+
ok: false,
|
|
460
|
+
stdout: typeof error.stdout === "string" ? error.stdout : "",
|
|
461
|
+
stderr: typeof error.stderr === "string" ? error.stderr : "",
|
|
462
|
+
};
|
|
463
|
+
}
|
|
464
|
+
return { ok: false, stdout: "", stderr: error instanceof Error ? error.message : String(error) };
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
function isExecError(error) {
|
|
468
|
+
return error instanceof Error;
|
|
469
|
+
}
|
|
470
|
+
//# sourceMappingURL=localGitAutomation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"localGitAutomation.js","sourceRoot":"","sources":["../../../../packages/core/src/git/localGitAutomation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export type MergeFastForwardStatus = "fast_forward" | "already_merged" | "non_fast_forward" | "unknown";
|
|
2
|
+
export interface MergeReadinessCheckpointOptions {
|
|
3
|
+
root: string;
|
|
4
|
+
targetRemote: string;
|
|
5
|
+
targetBase: string;
|
|
6
|
+
targetBranch: string;
|
|
7
|
+
baseHead: string | null;
|
|
8
|
+
branchHead: string | null;
|
|
9
|
+
validationEvidence: string[];
|
|
10
|
+
}
|
|
11
|
+
export interface MergeReadinessCheckpoint {
|
|
12
|
+
target: {
|
|
13
|
+
remote: string;
|
|
14
|
+
base: string;
|
|
15
|
+
branch: string;
|
|
16
|
+
baseHead: string | null;
|
|
17
|
+
branchHead: string | null;
|
|
18
|
+
};
|
|
19
|
+
mergeBase: string | null;
|
|
20
|
+
fastForward: MergeFastForwardStatus;
|
|
21
|
+
conflictProbe: {
|
|
22
|
+
attempted: boolean;
|
|
23
|
+
method: "git merge-tree --write-tree";
|
|
24
|
+
clean: boolean | null;
|
|
25
|
+
exitCode: number | null;
|
|
26
|
+
conflictFiles: string[];
|
|
27
|
+
};
|
|
28
|
+
requiredValidations: string[];
|
|
29
|
+
stopReasons: string[];
|
|
30
|
+
}
|
|
31
|
+
export declare function buildMergeReadinessCheckpoint(options: MergeReadinessCheckpointOptions): Promise<MergeReadinessCheckpoint>;
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { promisify } from "node:util";
|
|
3
|
+
const execFileAsync = promisify(execFile);
|
|
4
|
+
export async function buildMergeReadinessCheckpoint(options) {
|
|
5
|
+
const mergeBase = await gitCaptureTrim(options.root, ["merge-base", options.targetBase, options.targetBranch]);
|
|
6
|
+
const fastForward = await fastForwardStatus(options.root, options.targetBase, options.targetBranch, mergeBase);
|
|
7
|
+
const probe = mergeBase
|
|
8
|
+
? await probeMergeTree(options.root, options.targetBase, options.targetBranch)
|
|
9
|
+
: {
|
|
10
|
+
attempted: false,
|
|
11
|
+
method: "git merge-tree --write-tree",
|
|
12
|
+
clean: null,
|
|
13
|
+
exitCode: null,
|
|
14
|
+
conflictFiles: [],
|
|
15
|
+
};
|
|
16
|
+
const requiredValidations = requiredValidationEvidence(options.validationEvidence, probe.conflictFiles);
|
|
17
|
+
const stopReasons = [
|
|
18
|
+
...(!mergeBase ? [`merge base is unknown for ${options.targetBase} and ${options.targetBranch}`] : []),
|
|
19
|
+
...(probe.conflictFiles.length > 0
|
|
20
|
+
? [`merge conflict checkpoint requires isolated worktree resolution before merge: ${probe.conflictFiles.join(", ")}`]
|
|
21
|
+
: []),
|
|
22
|
+
];
|
|
23
|
+
return {
|
|
24
|
+
target: {
|
|
25
|
+
remote: options.targetRemote,
|
|
26
|
+
base: options.targetBase,
|
|
27
|
+
branch: options.targetBranch,
|
|
28
|
+
baseHead: options.baseHead,
|
|
29
|
+
branchHead: options.branchHead,
|
|
30
|
+
},
|
|
31
|
+
mergeBase,
|
|
32
|
+
fastForward,
|
|
33
|
+
conflictProbe: probe,
|
|
34
|
+
requiredValidations,
|
|
35
|
+
stopReasons,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
async function fastForwardStatus(root, base, branch, mergeBase) {
|
|
39
|
+
if (!mergeBase) {
|
|
40
|
+
return "unknown";
|
|
41
|
+
}
|
|
42
|
+
if (await gitExitCode(root, ["merge-base", "--is-ancestor", base, branch]) === 0) {
|
|
43
|
+
return "fast_forward";
|
|
44
|
+
}
|
|
45
|
+
if (await gitExitCode(root, ["merge-base", "--is-ancestor", branch, base]) === 0) {
|
|
46
|
+
return "already_merged";
|
|
47
|
+
}
|
|
48
|
+
return "non_fast_forward";
|
|
49
|
+
}
|
|
50
|
+
async function probeMergeTree(root, base, branch) {
|
|
51
|
+
const result = await gitCaptureStatus(root, ["merge-tree", "--write-tree", base, branch]);
|
|
52
|
+
return {
|
|
53
|
+
attempted: true,
|
|
54
|
+
method: "git merge-tree --write-tree",
|
|
55
|
+
clean: result.code === 0,
|
|
56
|
+
exitCode: result.code,
|
|
57
|
+
conflictFiles: conflictFilesFromMergeTree(result.output),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
function requiredValidationEvidence(validationEvidence, conflictFiles) {
|
|
61
|
+
if (conflictFiles.length > 0) {
|
|
62
|
+
return [
|
|
63
|
+
"explicit user approval for isolated conflict-resolution worktree",
|
|
64
|
+
"conflict-resolution evidence naming resolved files",
|
|
65
|
+
"rerun selected validation commands before any later approved merge",
|
|
66
|
+
"local merge-readiness evidence before remote merge execution",
|
|
67
|
+
];
|
|
68
|
+
}
|
|
69
|
+
return validationEvidence.length > 0
|
|
70
|
+
? validationEvidence
|
|
71
|
+
: ["rerun selected validation commands before any later approved merge"];
|
|
72
|
+
}
|
|
73
|
+
function conflictFilesFromMergeTree(output) {
|
|
74
|
+
const files = new Set();
|
|
75
|
+
for (const line of output.split("\n")) {
|
|
76
|
+
const stageMatch = /^\d{6}\s+[0-9a-f]{40}\s+[123]\t(.+)$/.exec(line);
|
|
77
|
+
if (stageMatch?.[1]) {
|
|
78
|
+
files.add(stageMatch[1]);
|
|
79
|
+
}
|
|
80
|
+
const conflictMatch = /CONFLICT \([^)]+\): .* in (.+)$/.exec(line);
|
|
81
|
+
if (conflictMatch?.[1]) {
|
|
82
|
+
files.add(conflictMatch[1]);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return [...files].sort();
|
|
86
|
+
}
|
|
87
|
+
async function gitCaptureTrim(root, args) {
|
|
88
|
+
const result = await gitCaptureStatus(root, args);
|
|
89
|
+
const output = result.output.trim();
|
|
90
|
+
return result.code === 0 && output ? output.split("\n")[0] ?? null : null;
|
|
91
|
+
}
|
|
92
|
+
async function gitExitCode(root, args) {
|
|
93
|
+
return (await gitCaptureStatus(root, args)).code;
|
|
94
|
+
}
|
|
95
|
+
async function gitCaptureStatus(root, args) {
|
|
96
|
+
try {
|
|
97
|
+
const { stdout, stderr } = await execFileAsync("git", args, { cwd: root });
|
|
98
|
+
return { code: 0, output: `${stdout}${stderr}` };
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
if (error && typeof error === "object" && "code" in error) {
|
|
102
|
+
const code = typeof error.code === "number" ? error.code : null;
|
|
103
|
+
const stdout = "stdout" in error && typeof error.stdout === "string" ? error.stdout : "";
|
|
104
|
+
const stderr = "stderr" in error && typeof error.stderr === "string" ? error.stderr : "";
|
|
105
|
+
return { code, output: `${stdout}${stderr}` };
|
|
106
|
+
}
|
|
107
|
+
return { code: null, output: error instanceof Error ? error.message : String(error) };
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=mergeReadinessCheckpoint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mergeReadinessCheckpoint.js","sourceRoot":"","sources":["../../../../packages/core/src/git/mergeReadinessCheckpoint.ts"],"names":[],"mappings":"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"}
|