@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,378 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { dirname, join, resolve } from "node:path";
|
|
3
|
+
import { promisify } from "node:util";
|
|
4
|
+
import { parseYaml } from "../../../core/src/contracts/yaml.js";
|
|
5
|
+
import { simulateAutonomousGit } from "../../../core/src/git/autonomousSimulator.js";
|
|
6
|
+
import { branchIdentityExceptionFrom } from "../../../core/src/git/branchIdentity.js";
|
|
7
|
+
import { pilotDraftPr } from "../../../core/src/git/draftPrPilot.js";
|
|
8
|
+
import { commitSelectedChange, ensureLocalFeatBranch } from "../../../core/src/git/localGitAutomation.js";
|
|
9
|
+
import { generatePrReadySummary } from "../../../core/src/git/prReadySummary.js";
|
|
10
|
+
import { planRemoteReadonly } from "../../../core/src/git/remoteReadonlyPlanner.js";
|
|
11
|
+
import { booleanFlag, stringFlag } from "../args.js";
|
|
12
|
+
import { emptyEffects, printJsonReport } from "../report.js";
|
|
13
|
+
const execFileAsync = promisify(execFile);
|
|
14
|
+
export async function gitAutomationCommand(positional, flags) {
|
|
15
|
+
const root = resolve(stringFlag(flags, "root", ".") ?? ".");
|
|
16
|
+
const json = booleanFlag(flags, "json");
|
|
17
|
+
const action = positional[0];
|
|
18
|
+
const write = booleanFlag(flags, "write");
|
|
19
|
+
const automation = stringFlag(flags, "automation", "managed") ?? "managed";
|
|
20
|
+
if (!action || !["branch", "commit", "summary", "remote", "simulate", "remote-plan", "draft-pr"].includes(action)) {
|
|
21
|
+
return finishGitAutomationUsage(root, json);
|
|
22
|
+
}
|
|
23
|
+
if (automation === "autonomous") {
|
|
24
|
+
return finishGitAutomationError(root, json, "autonomous git automation is not implemented in G015", [
|
|
25
|
+
"create a follow-up high-risk candidate before enabling autonomous push, PR, or merge operations",
|
|
26
|
+
]);
|
|
27
|
+
}
|
|
28
|
+
if (action === "branch") {
|
|
29
|
+
return gitAutomationBranch(root, flags, write, json);
|
|
30
|
+
}
|
|
31
|
+
if (action === "commit") {
|
|
32
|
+
return gitAutomationCommit(root, flags, write, json);
|
|
33
|
+
}
|
|
34
|
+
if (action === "summary") {
|
|
35
|
+
return gitAutomationSummary(root, flags, write, json);
|
|
36
|
+
}
|
|
37
|
+
if (action === "simulate") {
|
|
38
|
+
return gitAutomationSimulate(root, flags, json);
|
|
39
|
+
}
|
|
40
|
+
if (action === "remote-plan") {
|
|
41
|
+
return gitAutomationRemotePlan(root, flags, json);
|
|
42
|
+
}
|
|
43
|
+
if (action === "draft-pr") {
|
|
44
|
+
return gitAutomationDraftPr(root, flags, write, json);
|
|
45
|
+
}
|
|
46
|
+
return gitAutomationRemote(root, flags, json);
|
|
47
|
+
}
|
|
48
|
+
async function gitAutomationBranch(root, flags, write, json) {
|
|
49
|
+
const queuePath = stringFlag(flags, "queue");
|
|
50
|
+
if (!queuePath) {
|
|
51
|
+
return finishGitAutomationError(root, json, "branch mode requires --queue <CANDIDATE_CHANGES.yaml>", []);
|
|
52
|
+
}
|
|
53
|
+
const queue = await loadQueue(root, queuePath);
|
|
54
|
+
const planId = stringValue(queue.plan_id) ?? "unknown-plan";
|
|
55
|
+
const queuePolicy = record(queue.queue_policy);
|
|
56
|
+
const branchBoundary = stringValue(queuePolicy.branch_boundary);
|
|
57
|
+
if (!branchBoundary) {
|
|
58
|
+
return finishGitAutomationError(root, json, "queue_policy.branch_boundary is required for branch automation", []);
|
|
59
|
+
}
|
|
60
|
+
const result = await ensureLocalFeatBranch({
|
|
61
|
+
root,
|
|
62
|
+
planId,
|
|
63
|
+
branchBoundary,
|
|
64
|
+
branchIdentityException: branchIdentityExceptionFrom(queuePolicy),
|
|
65
|
+
dryRun: !write,
|
|
66
|
+
});
|
|
67
|
+
return finishGitAutomationResult(root, json, "git-automation branch", result.ok, {
|
|
68
|
+
mode: "managed",
|
|
69
|
+
action: "branch",
|
|
70
|
+
queue: queuePath,
|
|
71
|
+
result,
|
|
72
|
+
}, write ? [`local branch action: ${result.action ?? "none"}`] : ["rerun with --write to apply local branch action"]);
|
|
73
|
+
}
|
|
74
|
+
async function gitAutomationCommit(root, flags, write, json) {
|
|
75
|
+
const queuePath = stringFlag(flags, "queue");
|
|
76
|
+
const candidateId = stringFlag(flags, "candidate");
|
|
77
|
+
const commitMessage = stringFlag(flags, "message");
|
|
78
|
+
const validationEvidence = listFlag(flags, "validation-evidence");
|
|
79
|
+
if (!queuePath || !candidateId || !commitMessage) {
|
|
80
|
+
return finishGitAutomationError(root, json, "commit mode requires --queue, --candidate, and --message", []);
|
|
81
|
+
}
|
|
82
|
+
const queue = await loadQueue(root, queuePath);
|
|
83
|
+
const candidate = findCandidate(queue, candidateId);
|
|
84
|
+
if (!candidate) {
|
|
85
|
+
return finishGitAutomationError(root, json, `candidate not found: ${candidateId}`, []);
|
|
86
|
+
}
|
|
87
|
+
const planId = stringValue(queue.plan_id) ?? "unknown-plan";
|
|
88
|
+
const selectedChangeId = stringValue(record(candidate.selection).selected_change_id) ?? stringFlag(flags, "selected-change") ?? candidateId;
|
|
89
|
+
const selectedChangePath = inferSelectedChangePath(candidate);
|
|
90
|
+
const queuePolicy = record(queue.queue_policy);
|
|
91
|
+
const branchBoundary = stringValue(queuePolicy.branch_boundary);
|
|
92
|
+
const branchIdentityException = branchIdentityExceptionFrom(queuePolicy.branch_identity_exception);
|
|
93
|
+
const allowedPaths = listFlag(flags, "allowed-paths");
|
|
94
|
+
const candidateOwnedPaths = array(candidate.owned_paths).map(String);
|
|
95
|
+
const commitEvidence = booleanFlag(flags, "commit-evidence");
|
|
96
|
+
const strictCompletedImplementation = stringValue(queuePolicy.selected_change_commit_gate) === "strict"
|
|
97
|
+
&& candidate.status === "done"
|
|
98
|
+
&& record(candidate.completion).implementation_changed_files === true
|
|
99
|
+
&& Boolean(selectedChangeId);
|
|
100
|
+
if (strictCompletedImplementation && !commitEvidence) {
|
|
101
|
+
return finishGitAutomationError(root, json, "strict selected-change commit gate requires --commit-evidence for completed implementation candidates", [
|
|
102
|
+
"rerun with --commit-evidence so LOCAL_COMMIT_EVIDENCE.yaml is written and backfilled",
|
|
103
|
+
]);
|
|
104
|
+
}
|
|
105
|
+
const evidencePath = stringFlag(flags, "evidence-path") ?? (commitEvidence ? inferLocalCommitEvidencePath(candidate) : undefined);
|
|
106
|
+
if (commitEvidence && !evidencePath) {
|
|
107
|
+
return finishGitAutomationError(root, json, "commit evidence requires --evidence-path or selection evidence ending in SELECTED_CHANGE.yaml", [
|
|
108
|
+
"record selection.evidence with the selected-change artifact path",
|
|
109
|
+
"or rerun with --evidence-path changes/<plan_id>/<candidate-id>-<slug>/LOCAL_COMMIT_EVIDENCE.yaml",
|
|
110
|
+
]);
|
|
111
|
+
}
|
|
112
|
+
const result = await commitSelectedChange({
|
|
113
|
+
root,
|
|
114
|
+
planId,
|
|
115
|
+
candidateId,
|
|
116
|
+
selectedChangeId,
|
|
117
|
+
branchBoundary: branchBoundary ?? undefined,
|
|
118
|
+
allowedPaths: allowedPaths.length > 0 ? allowedPaths : candidateOwnedPaths,
|
|
119
|
+
validationEvidence,
|
|
120
|
+
commitMessage,
|
|
121
|
+
evidencePath,
|
|
122
|
+
commitEvidence,
|
|
123
|
+
requireEvidenceBackfill: strictCompletedImplementation,
|
|
124
|
+
queuePath,
|
|
125
|
+
selectedChangePath,
|
|
126
|
+
branchIdentityException,
|
|
127
|
+
dryRun: !write,
|
|
128
|
+
});
|
|
129
|
+
return finishGitAutomationResult(root, json, "git-automation commit", result.ok, {
|
|
130
|
+
mode: "managed",
|
|
131
|
+
action: "commit",
|
|
132
|
+
queue: queuePath,
|
|
133
|
+
candidate: candidateId,
|
|
134
|
+
result,
|
|
135
|
+
}, write ? [`local commit head: ${result.headCommit ?? "not-created"}`] : ["rerun with --write to create local commit"]);
|
|
136
|
+
}
|
|
137
|
+
async function gitAutomationSummary(root, flags, write, json) {
|
|
138
|
+
const queuePath = stringFlag(flags, "queue");
|
|
139
|
+
if (!queuePath) {
|
|
140
|
+
return finishGitAutomationError(root, json, "summary mode requires --queue <CANDIDATE_CHANGES.yaml>", []);
|
|
141
|
+
}
|
|
142
|
+
const result = await generatePrReadySummary({
|
|
143
|
+
root,
|
|
144
|
+
queuePath,
|
|
145
|
+
outputPath: stringFlag(flags, "output"),
|
|
146
|
+
dryRun: !write,
|
|
147
|
+
});
|
|
148
|
+
return finishGitAutomationResult(root, json, "git-automation summary", result.ok, {
|
|
149
|
+
mode: "managed",
|
|
150
|
+
action: "summary",
|
|
151
|
+
queue: queuePath,
|
|
152
|
+
result,
|
|
153
|
+
}, write ? [`wrote ${result.outputPath}`] : ["rerun with --write to write local PR_READY_SUMMARY.md"]);
|
|
154
|
+
}
|
|
155
|
+
async function gitAutomationRemote(root, flags, json) {
|
|
156
|
+
const operation = stringFlag(flags, "operation", "unspecified") ?? "unspecified";
|
|
157
|
+
const queuePath = stringFlag(flags, "queue");
|
|
158
|
+
const queue = queuePath ? await loadQueue(root, queuePath) : {};
|
|
159
|
+
const branchBoundary = stringValue(record(queue.queue_policy).branch_boundary);
|
|
160
|
+
const baseRef = stringFlag(flags, "base");
|
|
161
|
+
const orderedCommits = baseRef ? await readOrderedCommits(root, baseRef) : commitEvidenceFromQueue(queue);
|
|
162
|
+
return finishGitAutomationResult(root, json, "git-automation remote", false, {
|
|
163
|
+
mode: "managed",
|
|
164
|
+
action: "remote",
|
|
165
|
+
operation,
|
|
166
|
+
queue: queuePath ?? null,
|
|
167
|
+
branch_boundary: branchBoundary,
|
|
168
|
+
base_ref: baseRef ?? null,
|
|
169
|
+
remote_operation_plan: [
|
|
170
|
+
"confirm working tree is clean and validation evidence is current",
|
|
171
|
+
"push the local feat branch to the approved remote branch",
|
|
172
|
+
"create or update the PR from the pushed branch",
|
|
173
|
+
"wait for required checks and resolve conflicts against the target base",
|
|
174
|
+
"merge only after user approval and repository protection checks pass",
|
|
175
|
+
"record remote URL, PR id, merge commit, and rollback guidance as evidence",
|
|
176
|
+
],
|
|
177
|
+
ordered_local_commits: orderedCommits,
|
|
178
|
+
ordered_local_commit_count: orderedCommits.length,
|
|
179
|
+
approved: false,
|
|
180
|
+
refused: true,
|
|
181
|
+
reason: "remote git and gh mutation requires explicit operation-level approval; G015 produces the operation plan but does not execute it",
|
|
182
|
+
blocked_operations: ["git push", "gh pr create", "gh pr edit", "gh pr merge", "gh issue create", "gh issue edit", "gh issue close", "git merge", "git reset", "git rebase"],
|
|
183
|
+
}, ["review remote_operation_plan, then approve a concrete push/PR/merge operation or create a follow-up autonomous high-risk candidate"]);
|
|
184
|
+
}
|
|
185
|
+
async function gitAutomationSimulate(root, flags, json) {
|
|
186
|
+
const queuePath = stringFlag(flags, "queue");
|
|
187
|
+
if (!queuePath) {
|
|
188
|
+
return finishGitAutomationError(root, json, "simulate mode requires --queue <CANDIDATE_CHANGES.yaml>", []);
|
|
189
|
+
}
|
|
190
|
+
const result = await simulateAutonomousGit({
|
|
191
|
+
root,
|
|
192
|
+
queuePath,
|
|
193
|
+
baseRef: stringFlag(flags, "base"),
|
|
194
|
+
targetRemote: stringFlag(flags, "remote"),
|
|
195
|
+
targetBase: stringFlag(flags, "target-base"),
|
|
196
|
+
prSummaryPath: stringFlag(flags, "pr-summary"),
|
|
197
|
+
});
|
|
198
|
+
return finishGitAutomationResult(root, json, "git-automation simulate", result.ok, {
|
|
199
|
+
mode: "autonomous-simulator",
|
|
200
|
+
action: "simulate",
|
|
201
|
+
result,
|
|
202
|
+
}, result.ok ? ["review simulator evidence before considering a narrow autonomous pilot"] : ["resolve simulator blockers before autonomous pilot work"]);
|
|
203
|
+
}
|
|
204
|
+
async function gitAutomationRemotePlan(root, flags, json) {
|
|
205
|
+
const queuePath = stringFlag(flags, "queue");
|
|
206
|
+
if (!queuePath) {
|
|
207
|
+
return finishGitAutomationError(root, json, "remote-plan mode requires --queue <CANDIDATE_CHANGES.yaml>", []);
|
|
208
|
+
}
|
|
209
|
+
const result = await planRemoteReadonly({
|
|
210
|
+
root,
|
|
211
|
+
queuePath,
|
|
212
|
+
baseRef: stringFlag(flags, "base"),
|
|
213
|
+
targetRemote: stringFlag(flags, "remote"),
|
|
214
|
+
targetBase: stringFlag(flags, "target-base"),
|
|
215
|
+
targetBranch: stringFlag(flags, "target-branch"),
|
|
216
|
+
prSummaryPath: stringFlag(flags, "pr-summary"),
|
|
217
|
+
});
|
|
218
|
+
return finishGitAutomationResult(root, json, "git-automation remote-plan", result.ok, {
|
|
219
|
+
mode: "remote-readonly-plan",
|
|
220
|
+
action: "remote-plan",
|
|
221
|
+
result,
|
|
222
|
+
}, result.ok ? ["review remote read-only plan before any draft PR pilot"] : ["resolve remote-plan blockers before any remote mutation pilot"]);
|
|
223
|
+
}
|
|
224
|
+
async function gitAutomationDraftPr(root, flags, write, json) {
|
|
225
|
+
const queuePath = stringFlag(flags, "queue");
|
|
226
|
+
if (!queuePath) {
|
|
227
|
+
return finishGitAutomationError(root, json, "draft-pr mode requires --queue <CANDIDATE_CHANGES.yaml>", []);
|
|
228
|
+
}
|
|
229
|
+
const result = await pilotDraftPr({
|
|
230
|
+
root,
|
|
231
|
+
queuePath,
|
|
232
|
+
baseRef: stringFlag(flags, "base"),
|
|
233
|
+
targetRemote: stringFlag(flags, "remote"),
|
|
234
|
+
targetBase: stringFlag(flags, "target-base"),
|
|
235
|
+
targetBranch: stringFlag(flags, "target-branch"),
|
|
236
|
+
prSummaryPath: stringFlag(flags, "pr-summary"),
|
|
237
|
+
title: stringFlag(flags, "title"),
|
|
238
|
+
allowDraftPr: booleanFlag(flags, "allow-draft-pr"),
|
|
239
|
+
approvalEvidence: stringFlag(flags, "approval-evidence"),
|
|
240
|
+
auditEvidencePath: stringFlag(flags, "audit-evidence"),
|
|
241
|
+
dryRun: !write,
|
|
242
|
+
});
|
|
243
|
+
return finishGitAutomationResult(root, json, "git-automation draft-pr", result.ok, {
|
|
244
|
+
mode: "draft-pr-pilot",
|
|
245
|
+
action: "draft-pr",
|
|
246
|
+
result,
|
|
247
|
+
}, result.ok ? [write ? "review local draft PR audit evidence before any follow-up" : "rerun with --write --allow-draft-pr --approval-evidence <source> only after reviewing the payload preview"] : ["resolve draft-pr blockers before mutation"]);
|
|
248
|
+
}
|
|
249
|
+
async function loadQueue(root, queuePath) {
|
|
250
|
+
const { readFile } = await import("node:fs/promises");
|
|
251
|
+
return record(parseYaml(await readFile(join(root, queuePath), "utf8")));
|
|
252
|
+
}
|
|
253
|
+
function findCandidate(queue, candidateId) {
|
|
254
|
+
return array(queue.changes).map(record).find((candidate) => candidate.id === candidateId) ?? null;
|
|
255
|
+
}
|
|
256
|
+
function finishGitAutomationUsage(root, json) {
|
|
257
|
+
const usage = "usage: openworkflow git-automation <branch|commit|summary|remote|simulate|remote-plan|draft-pr> --root <folder> --queue <CANDIDATE_CHANGES.yaml> [--write] [--json]";
|
|
258
|
+
if (json) {
|
|
259
|
+
printJsonReport({
|
|
260
|
+
command: "git-automation",
|
|
261
|
+
ok: false,
|
|
262
|
+
root,
|
|
263
|
+
data: { usage },
|
|
264
|
+
warnings: [],
|
|
265
|
+
errors: [usage],
|
|
266
|
+
effects: emptyEffects(),
|
|
267
|
+
next_actions: ["choose branch, commit, summary, or remote"],
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
else {
|
|
271
|
+
console.error(usage);
|
|
272
|
+
}
|
|
273
|
+
return 1;
|
|
274
|
+
}
|
|
275
|
+
function finishGitAutomationError(root, json, error, nextActions) {
|
|
276
|
+
if (json) {
|
|
277
|
+
printJsonReport({
|
|
278
|
+
command: "git-automation",
|
|
279
|
+
ok: false,
|
|
280
|
+
root,
|
|
281
|
+
data: {},
|
|
282
|
+
warnings: [],
|
|
283
|
+
errors: [error],
|
|
284
|
+
effects: emptyEffects(),
|
|
285
|
+
next_actions: nextActions,
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
else {
|
|
289
|
+
console.error(error);
|
|
290
|
+
}
|
|
291
|
+
return 1;
|
|
292
|
+
}
|
|
293
|
+
function finishGitAutomationResult(root, json, command, ok, data, nextActions) {
|
|
294
|
+
const errors = resultErrors(data);
|
|
295
|
+
if (json) {
|
|
296
|
+
printJsonReport({
|
|
297
|
+
command,
|
|
298
|
+
ok,
|
|
299
|
+
root,
|
|
300
|
+
data,
|
|
301
|
+
warnings: resultWarnings(data),
|
|
302
|
+
errors,
|
|
303
|
+
effects: emptyEffects(),
|
|
304
|
+
next_actions: nextActions,
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
else {
|
|
308
|
+
console.log(JSON.stringify(data, null, 2));
|
|
309
|
+
}
|
|
310
|
+
return ok ? 0 : 1;
|
|
311
|
+
}
|
|
312
|
+
function resultErrors(data) {
|
|
313
|
+
const item = record(data);
|
|
314
|
+
const result = record(record(data).result);
|
|
315
|
+
const resultErrors = array(result.errors).map(String);
|
|
316
|
+
if (resultErrors.length > 0) {
|
|
317
|
+
return resultErrors;
|
|
318
|
+
}
|
|
319
|
+
const reason = stringValue(item.reason);
|
|
320
|
+
return reason ? [reason] : [];
|
|
321
|
+
}
|
|
322
|
+
function resultWarnings(data) {
|
|
323
|
+
const result = record(record(data).result);
|
|
324
|
+
return array(result.warnings).map(String);
|
|
325
|
+
}
|
|
326
|
+
function listFlag(flags, name) {
|
|
327
|
+
const value = stringFlag(flags, name);
|
|
328
|
+
return value ? value.split(",").map((item) => item.trim()).filter(Boolean) : [];
|
|
329
|
+
}
|
|
330
|
+
function record(value) {
|
|
331
|
+
return value && typeof value === "object" && !Array.isArray(value) ? value : {};
|
|
332
|
+
}
|
|
333
|
+
function array(value) {
|
|
334
|
+
return Array.isArray(value) ? value : [];
|
|
335
|
+
}
|
|
336
|
+
function stringValue(value) {
|
|
337
|
+
return typeof value === "string" && value.length > 0 ? value : null;
|
|
338
|
+
}
|
|
339
|
+
function inferLocalCommitEvidencePath(candidate) {
|
|
340
|
+
const selectedChangePath = inferSelectedChangePath(candidate);
|
|
341
|
+
return selectedChangePath ? join(dirname(selectedChangePath), "LOCAL_COMMIT_EVIDENCE.yaml") : undefined;
|
|
342
|
+
}
|
|
343
|
+
function inferSelectedChangePath(candidate) {
|
|
344
|
+
const selection = record(candidate.selection);
|
|
345
|
+
const artifactPath = stringValue(record(selection.artifacts).selected_change);
|
|
346
|
+
if (artifactPath?.endsWith("/SELECTED_CHANGE.yaml")) {
|
|
347
|
+
return artifactPath;
|
|
348
|
+
}
|
|
349
|
+
const artifactList = array(selection.artifacts).map(String);
|
|
350
|
+
const artifactListPath = artifactList.find((item) => item.endsWith("/SELECTED_CHANGE.yaml"));
|
|
351
|
+
if (artifactListPath) {
|
|
352
|
+
return artifactListPath;
|
|
353
|
+
}
|
|
354
|
+
const selectionEvidence = array(selection.evidence).map(String);
|
|
355
|
+
return selectionEvidence.find((item) => item.endsWith("/SELECTED_CHANGE.yaml"));
|
|
356
|
+
}
|
|
357
|
+
async function readOrderedCommits(root, baseRef) {
|
|
358
|
+
try {
|
|
359
|
+
const { stdout } = await execFileAsync("git", ["log", "--reverse", "--pretty=format:%H%x09%s", `${baseRef}..HEAD`], { cwd: root });
|
|
360
|
+
return stdout.split("\n").filter(Boolean).map((line) => {
|
|
361
|
+
const [hash, ...subjectParts] = line.split("\t");
|
|
362
|
+
return { hash: hash ?? "", subject: subjectParts.join("\t") };
|
|
363
|
+
});
|
|
364
|
+
}
|
|
365
|
+
catch {
|
|
366
|
+
return [];
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
function commitEvidenceFromQueue(queue) {
|
|
370
|
+
return array(queue.changes).map(record).flatMap((candidate) => {
|
|
371
|
+
const candidateId = stringValue(candidate.id) ?? "unknown";
|
|
372
|
+
return array(record(candidate.completion).evidence)
|
|
373
|
+
.map(String)
|
|
374
|
+
.filter((item) => item.startsWith("commit:"))
|
|
375
|
+
.map((item) => ({ candidate_id: candidateId, hash: item.replace(/^commit:\s*/, "") }));
|
|
376
|
+
});
|
|
377
|
+
}
|
|
378
|
+
//# sourceMappingURL=gitAutomation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitAutomation.js","sourceRoot":"","sources":["../../../../packages/cli/src/commands/gitAutomation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type SummaryQualitySummary } from "../../../core/src/workflow/summaryHealth.js";
|
|
2
|
+
import { type BriefModel } from "./brief.js";
|
|
3
|
+
import { type ReadinessModel } from "./check.js";
|
|
4
|
+
import { type ReadOrder } from "./inspect.js";
|
|
5
|
+
export interface HandoffModel {
|
|
6
|
+
handoff_ok: boolean;
|
|
7
|
+
blocking_reasons: string[];
|
|
8
|
+
managed_surface_ok: boolean;
|
|
9
|
+
adapter_ok: boolean;
|
|
10
|
+
summary_freshness_ok: boolean;
|
|
11
|
+
summary_quality_ok: boolean;
|
|
12
|
+
next_command_ready: boolean | null;
|
|
13
|
+
next_command: string | null;
|
|
14
|
+
active_stage: string | null;
|
|
15
|
+
active_pointers: Record<string, string | null>;
|
|
16
|
+
quality_summary: SummaryQualitySummary;
|
|
17
|
+
read_order: ReadOrder;
|
|
18
|
+
next_command_check: ReadinessModel | null;
|
|
19
|
+
next_actions: string[];
|
|
20
|
+
}
|
|
21
|
+
export declare function handoffCommand(flags: Map<string, string | boolean>): Promise<number>;
|
|
22
|
+
export declare function buildHandoffModel(brief: BriefModel, nextCommandCheck: ReadinessModel | null, readOrder: ReadOrder, qualitySummary: SummaryQualitySummary): HandoffModel;
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { resolve } from "node:path";
|
|
2
|
+
import { buildSummaryQualitySummary, evaluateSummaryQualityGate } from "../../../core/src/workflow/summaryHealth.js";
|
|
3
|
+
import { booleanFlag, stringFlag } from "../args.js";
|
|
4
|
+
import { emptyEffects, printJsonReport } from "../report.js";
|
|
5
|
+
import { buildBriefModel, healthErrorsForBrief } from "./brief.js";
|
|
6
|
+
import { buildReadiness } from "./check.js";
|
|
7
|
+
import { buildInspectModel } from "./inspect.js";
|
|
8
|
+
import { parseTools } from "./shared.js";
|
|
9
|
+
export async function handoffCommand(flags) {
|
|
10
|
+
const root = resolve(stringFlag(flags, "root", ".") ?? ".");
|
|
11
|
+
const json = booleanFlag(flags, "json");
|
|
12
|
+
const brief = await buildBriefModel(root, parseTools(stringFlag(flags, "tools")));
|
|
13
|
+
const nextCommand = brief.workflow.next_command;
|
|
14
|
+
const nextCommandCheck = nextCommand ? await buildReadiness(root, nextCommand) : null;
|
|
15
|
+
const strictQuality = evaluateSummaryQualityGate(brief.health.summaries, true);
|
|
16
|
+
const inspect = buildInspectModel(brief, nextCommandCheck, strictQuality);
|
|
17
|
+
const qualitySummary = buildSummaryQualitySummary(brief.health.summaries, strictQuality);
|
|
18
|
+
const model = buildHandoffModel(brief, nextCommandCheck, inspect.read_order, qualitySummary);
|
|
19
|
+
const warnings = warningsFor(brief, nextCommandCheck);
|
|
20
|
+
const healthErrors = model.handoff_ok ? [] : model.blocking_reasons;
|
|
21
|
+
if (json) {
|
|
22
|
+
printJsonReport({
|
|
23
|
+
command: "handoff",
|
|
24
|
+
ok: model.handoff_ok,
|
|
25
|
+
root,
|
|
26
|
+
data: model,
|
|
27
|
+
warnings,
|
|
28
|
+
errors: healthErrors,
|
|
29
|
+
health_errors: healthErrors,
|
|
30
|
+
effects: emptyEffects(),
|
|
31
|
+
next_actions: model.next_actions,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
printHandoff(model);
|
|
36
|
+
}
|
|
37
|
+
return model.handoff_ok ? 0 : 1;
|
|
38
|
+
}
|
|
39
|
+
export function buildHandoffModel(brief, nextCommandCheck, readOrder, qualitySummary) {
|
|
40
|
+
const managedSurfaceOk = brief.health.workflow.ok && brief.health.agents_md.ok;
|
|
41
|
+
const adapterOk = Object.values(brief.health.adapters).every((section) => section.ok);
|
|
42
|
+
const summaryFreshnessOk = brief.health.summaries.ok;
|
|
43
|
+
const summaryQualityOk = qualitySummary.strict_quality_ok;
|
|
44
|
+
const nextCommandReady = nextCommandCheck ? nextCommandCheck.ready : null;
|
|
45
|
+
const blockingReasons = blockingReasonsFor(brief, nextCommandCheck, qualitySummary, managedSurfaceOk, adapterOk, summaryFreshnessOk, summaryQualityOk);
|
|
46
|
+
const handoffOk = blockingReasons.length === 0;
|
|
47
|
+
return {
|
|
48
|
+
handoff_ok: handoffOk,
|
|
49
|
+
blocking_reasons: blockingReasons,
|
|
50
|
+
managed_surface_ok: managedSurfaceOk,
|
|
51
|
+
adapter_ok: adapterOk,
|
|
52
|
+
summary_freshness_ok: summaryFreshnessOk,
|
|
53
|
+
summary_quality_ok: summaryQualityOk,
|
|
54
|
+
next_command_ready: nextCommandReady,
|
|
55
|
+
next_command: brief.workflow.next_command,
|
|
56
|
+
active_stage: brief.workflow.active_stage,
|
|
57
|
+
active_pointers: brief.active_pointers,
|
|
58
|
+
quality_summary: qualitySummary,
|
|
59
|
+
read_order: readOrder,
|
|
60
|
+
next_command_check: nextCommandCheck,
|
|
61
|
+
next_actions: nextActionsFor(brief, nextCommandCheck, qualitySummary, handoffOk),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
function blockingReasonsFor(brief, nextCommandCheck, qualitySummary, managedSurfaceOk, adapterOk, summaryFreshnessOk, summaryQualityOk) {
|
|
65
|
+
const briefHealthErrors = healthErrorsForBrief({ ...brief, health: { ...brief.health, ok: false } });
|
|
66
|
+
return unique([
|
|
67
|
+
...(!managedSurfaceOk ? briefHealthErrors.filter((item) => item.startsWith("workflow:") || item.startsWith("agents_md:")) : []),
|
|
68
|
+
...(!adapterOk ? briefHealthErrors.filter((item) => item.startsWith("adapter:")) : []),
|
|
69
|
+
...(!summaryFreshnessOk ? briefHealthErrors.filter((item) => !item.startsWith("workflow:") && !item.startsWith("agents_md:") && !item.startsWith("adapter:")) : []),
|
|
70
|
+
...(!summaryQualityOk ? (qualitySummary.next_actions.length > 0 ? qualitySummary.next_actions : ["summary quality is not trustworthy for handoff"]) : []),
|
|
71
|
+
...(qualitySummary.strict_quality_health_error_count > 0 ? strictQualityErrors(brief) : []),
|
|
72
|
+
...(nextCommandCheck ? nextCommandCheck.blockers : ["missing CURRENT_STATE.next_command"]),
|
|
73
|
+
...brief.workflow.blocked_by.map((item) => `CURRENT_STATE blocked_by: ${item}`),
|
|
74
|
+
]);
|
|
75
|
+
}
|
|
76
|
+
function strictQualityErrors(brief) {
|
|
77
|
+
return evaluateSummaryQualityGate(brief.health.summaries, true).health_errors;
|
|
78
|
+
}
|
|
79
|
+
function nextActionsFor(brief, nextCommandCheck, qualitySummary, handoffOk) {
|
|
80
|
+
if (handoffOk) {
|
|
81
|
+
return unique([
|
|
82
|
+
"run openworkflow context --root . --json before loading full evidence",
|
|
83
|
+
brief.workflow.next_command ? `continue with ${brief.workflow.next_command}` : "",
|
|
84
|
+
]);
|
|
85
|
+
}
|
|
86
|
+
return unique([
|
|
87
|
+
...qualitySummary.next_actions,
|
|
88
|
+
...(!brief.health.workflow.ok || !brief.health.agents_md.ok ? ["run openworkflow sync, then openworkflow doctor"] : []),
|
|
89
|
+
...nextCommandCheck?.next_actions ?? [],
|
|
90
|
+
brief.agent_guidance.recommended_next_action,
|
|
91
|
+
]);
|
|
92
|
+
}
|
|
93
|
+
function warningsFor(brief, nextCommandCheck) {
|
|
94
|
+
return unique([
|
|
95
|
+
...brief.health.workflow.warnings,
|
|
96
|
+
...brief.health.agents_md.warnings,
|
|
97
|
+
...Object.values(brief.health.adapters).flatMap((section) => section.warnings),
|
|
98
|
+
...brief.health.summaries.warnings,
|
|
99
|
+
...nextCommandCheck?.warnings ?? [],
|
|
100
|
+
]);
|
|
101
|
+
}
|
|
102
|
+
function printHandoff(model) {
|
|
103
|
+
console.log("OpenWorkflow handoff");
|
|
104
|
+
console.log(`handoff_ok: ${model.handoff_ok}`);
|
|
105
|
+
console.log(`active_stage: ${model.active_stage ?? "unknown"}`);
|
|
106
|
+
console.log(`next_command: ${model.next_command ?? "none"}`);
|
|
107
|
+
console.log(`next_command_ready: ${model.next_command_ready ?? "unknown"}`);
|
|
108
|
+
console.log(`quality_summary: ${model.quality_summary.status}`);
|
|
109
|
+
printList("blocking_reasons", model.blocking_reasons);
|
|
110
|
+
printList("must_read", model.read_order.must_read);
|
|
111
|
+
printList("next_actions", model.next_actions);
|
|
112
|
+
}
|
|
113
|
+
function printList(label, values) {
|
|
114
|
+
console.log(`${label}:`);
|
|
115
|
+
for (const value of values.length > 0 ? values : ["none"]) {
|
|
116
|
+
console.log(` - ${value}`);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
function unique(values) {
|
|
120
|
+
return [...new Set(values.filter((value) => value.trim().length > 0))];
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=handoff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handoff.js","sourceRoot":"","sources":["../../../../packages/cli/src/commands/handoff.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,27 @@
|
|
|
1
1
|
import { mkdir } from "node:fs/promises";
|
|
2
2
|
import { resolve } from "node:path";
|
|
3
3
|
import { generateCodexAdapter } from "../../../adapters/codex/src/generateCodexAdapter.js";
|
|
4
|
+
import { syncAgentsGuide } from "../../../core/src/onboarding/agentsGuide.js";
|
|
4
5
|
import { initOpenWorkflow } from "../../../core/src/workflow/initOpenWorkflow.js";
|
|
5
6
|
import { booleanFlag, stringFlag } from "../args.js";
|
|
7
|
+
import { emptyEffects, printJsonReport } from "../report.js";
|
|
6
8
|
import { basenameForTitle, parseTools, printWarnings, slugify } from "./shared.js";
|
|
7
9
|
export async function initCommand(positional, flags) {
|
|
8
10
|
const folder = positional[0];
|
|
9
11
|
if (!folder) {
|
|
12
|
+
if (booleanFlag(flags, "json")) {
|
|
13
|
+
printJsonReport({
|
|
14
|
+
command: "init",
|
|
15
|
+
ok: false,
|
|
16
|
+
root: null,
|
|
17
|
+
data: {},
|
|
18
|
+
warnings: [],
|
|
19
|
+
errors: ["Missing folder argument."],
|
|
20
|
+
effects: emptyEffects(),
|
|
21
|
+
next_actions: ["run openworkflow init <folder> --tools codex"],
|
|
22
|
+
});
|
|
23
|
+
return 1;
|
|
24
|
+
}
|
|
10
25
|
console.error("Missing folder argument.");
|
|
11
26
|
console.error("Usage: openworkflow init <folder> --tools codex");
|
|
12
27
|
return 1;
|
|
@@ -14,6 +29,7 @@ export async function initCommand(positional, flags) {
|
|
|
14
29
|
const root = resolve(folder);
|
|
15
30
|
const tools = parseTools(stringFlag(flags, "tools", ""));
|
|
16
31
|
const force = booleanFlag(flags, "force");
|
|
32
|
+
const json = booleanFlag(flags, "json");
|
|
17
33
|
const projectTitle = stringFlag(flags, "project-title") ?? basenameForTitle(folder);
|
|
18
34
|
const projectSlug = slugify(stringFlag(flags, "project-slug") ?? projectTitle);
|
|
19
35
|
await mkdir(root, { recursive: true });
|
|
@@ -24,10 +40,13 @@ export async function initCommand(positional, flags) {
|
|
|
24
40
|
tools,
|
|
25
41
|
force,
|
|
26
42
|
});
|
|
43
|
+
const agentsGuide = await syncAgentsGuide(root);
|
|
27
44
|
let adapterWritten = 0;
|
|
28
45
|
let adapterSkipped = 0;
|
|
29
46
|
let adapterUnchanged = 0;
|
|
30
47
|
let adapterRemoved = 0;
|
|
48
|
+
let adapterWarnings = [];
|
|
49
|
+
let adapterResult = null;
|
|
31
50
|
if (tools.includes("codex")) {
|
|
32
51
|
const adapter = await generateCodexAdapter({
|
|
33
52
|
root,
|
|
@@ -40,10 +59,42 @@ export async function initCommand(positional, flags) {
|
|
|
40
59
|
adapterSkipped = adapter.skipped.length;
|
|
41
60
|
adapterUnchanged = adapter.unchanged.length;
|
|
42
61
|
adapterRemoved = adapter.removed.length;
|
|
43
|
-
|
|
62
|
+
adapterWarnings = adapter.warnings;
|
|
63
|
+
adapterResult = adapter;
|
|
64
|
+
if (!json) {
|
|
65
|
+
printWarnings(adapter.warnings);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if (json) {
|
|
69
|
+
printJsonReport({
|
|
70
|
+
command: "init",
|
|
71
|
+
ok: true,
|
|
72
|
+
root,
|
|
73
|
+
data: {
|
|
74
|
+
workflow: result,
|
|
75
|
+
agents_md: agentsGuide,
|
|
76
|
+
adapters: adapterResult ? { codex: adapterResult } : {},
|
|
77
|
+
},
|
|
78
|
+
warnings: adapterWarnings,
|
|
79
|
+
errors: [],
|
|
80
|
+
effects: {
|
|
81
|
+
...emptyEffects(),
|
|
82
|
+
written: [
|
|
83
|
+
...result.written,
|
|
84
|
+
...(agentsGuide.action === "created" || agentsGuide.action === "appended" || agentsGuide.action === "updated" ? [agentsGuide.path] : []),
|
|
85
|
+
...(adapterResult?.written ?? []),
|
|
86
|
+
],
|
|
87
|
+
skipped: [...result.skipped, ...(adapterResult?.skipped ?? [])],
|
|
88
|
+
unchanged: adapterResult?.unchanged ?? [],
|
|
89
|
+
removed: adapterResult?.removed ?? [],
|
|
90
|
+
},
|
|
91
|
+
next_actions: ["run openworkflow brief --root <folder> --json"],
|
|
92
|
+
});
|
|
93
|
+
return 0;
|
|
44
94
|
}
|
|
45
95
|
console.log(`Initialized OpenWorkflow at ${root}`);
|
|
46
96
|
console.log(`.openworkflow written: ${result.written.length}, skipped: ${result.skipped.length}`);
|
|
97
|
+
console.log(`AGENTS.md: ${agentsGuide.action}`);
|
|
47
98
|
if (tools.includes("codex")) {
|
|
48
99
|
console.log(`Codex adapter written: ${adapterWritten}, skipped: ${adapterSkipped}, unchanged: ${adapterUnchanged}, removed: ${adapterRemoved}`);
|
|
49
100
|
}
|