@cleocode/core 2026.10.17 → 2026.10.18-rc.ci.688
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/audit-prune.d.ts +37 -8
- package/dist/audit-prune.d.ts.map +1 -1
- package/dist/audit-prune.js +46 -12
- package/dist/audit-prune.js.map +1 -1
- package/dist/build-provenance.json +2 -2
- package/dist/cloud/manifest-check.d.ts +21 -0
- package/dist/cloud/manifest-check.d.ts.map +1 -1
- package/dist/cloud/manifest-check.js +46 -1
- package/dist/cloud/manifest-check.js.map +1 -1
- package/dist/cloud/nexus-vault.d.ts +19 -0
- package/dist/cloud/nexus-vault.d.ts.map +1 -1
- package/dist/cloud/nexus-vault.js +134 -23
- package/dist/cloud/nexus-vault.js.map +1 -1
- package/dist/cloud/signing.d.ts.map +1 -1
- package/dist/cloud/signing.js +4 -0
- package/dist/cloud/signing.js.map +1 -1
- package/dist/doctor/row-identity.d.ts.map +1 -1
- package/dist/doctor/row-identity.js +2 -1
- package/dist/doctor/row-identity.js.map +1 -1
- package/dist/git/work-tree.d.ts +17 -0
- package/dist/git/work-tree.d.ts.map +1 -1
- package/dist/git/work-tree.js +30 -0
- package/dist/git/work-tree.js.map +1 -1
- package/dist/goal/close.d.ts +95 -0
- package/dist/goal/close.d.ts.map +1 -0
- package/dist/goal/close.js +497 -0
- package/dist/goal/close.js.map +1 -0
- package/dist/goal/draft.d.ts +81 -0
- package/dist/goal/draft.d.ts.map +1 -0
- package/dist/goal/draft.js +331 -0
- package/dist/goal/draft.js.map +1 -0
- package/dist/hooks/release-gate.d.ts +3 -0
- package/dist/hooks/release-gate.d.ts.map +1 -1
- package/dist/hooks/release-gate.js +4 -1
- package/dist/hooks/release-gate.js.map +1 -1
- package/dist/orchestration/lean-gain.d.ts +26 -0
- package/dist/orchestration/lean-gain.d.ts.map +1 -0
- package/dist/orchestration/lean-gain.js +61 -0
- package/dist/orchestration/lean-gain.js.map +1 -0
- package/dist/release/backfill.d.ts.map +1 -1
- package/dist/release/backfill.js +15 -5
- package/dist/release/backfill.js.map +1 -1
- package/dist/release/ci-evidence.d.ts +90 -5
- package/dist/release/ci-evidence.d.ts.map +1 -1
- package/dist/release/ci-evidence.js +277 -4
- package/dist/release/ci-evidence.js.map +1 -1
- package/dist/release/plan.d.ts +4 -1
- package/dist/release/plan.d.ts.map +1 -1
- package/dist/release/plan.js +10 -2
- package/dist/release/plan.js.map +1 -1
- package/dist/release/reconcile.d.ts +10 -0
- package/dist/release/reconcile.d.ts.map +1 -1
- package/dist/release/reconcile.js +42 -19
- package/dist/release/reconcile.js.map +1 -1
- package/dist/release/release-manifest.d.ts +2 -1
- package/dist/release/release-manifest.d.ts.map +1 -1
- package/dist/release/release-manifest.js +15 -1
- package/dist/release/release-manifest.js.map +1 -1
- package/dist/resources/admission-ledger.d.ts +21 -4
- package/dist/resources/admission-ledger.d.ts.map +1 -1
- package/dist/resources/admission-ledger.js +102 -19
- package/dist/resources/admission-ledger.js.map +1 -1
- package/dist/resources/run-class.d.ts +22 -0
- package/dist/resources/run-class.d.ts.map +1 -1
- package/dist/resources/run-class.js +81 -0
- package/dist/resources/run-class.js.map +1 -1
- package/dist/sessions/handoff.d.ts +2 -2
- package/dist/sessions/handoff.js +2 -2
- package/dist/store/audit-log-schema.d.ts +106 -39
- package/dist/store/audit-log-schema.d.ts.map +1 -1
- package/dist/store/audit-log-schema.js +6 -3
- package/dist/store/audit-log-schema.js.map +1 -1
- package/dist/store/row-identity-registry.d.ts +42 -6
- package/dist/store/row-identity-registry.d.ts.map +1 -1
- package/dist/store/row-identity-registry.js +256 -34
- package/dist/store/row-identity-registry.js.map +1 -1
- package/dist/store/row-identity.d.ts.map +1 -1
- package/dist/store/row-identity.js +16 -4
- package/dist/store/row-identity.js.map +1 -1
- package/dist/store/schema/cleo-global/nexus.d.ts +16 -0
- package/dist/store/schema/cleo-global/nexus.d.ts.map +1 -1
- package/dist/store/schema/cleo-global/nexus.js +4 -1
- package/dist/store/schema/cleo-global/nexus.js.map +1 -1
- package/dist/store/schema/cleo-project/audit.d.ts +48 -0
- package/dist/store/schema/cleo-project/audit.d.ts.map +1 -1
- package/dist/store/schema/cleo-project/audit.js +15 -1
- package/dist/store/schema/cleo-project/audit.js.map +1 -1
- package/dist/store/schema/cleo-project/lifecycle.d.ts +112 -0
- package/dist/store/schema/cleo-project/lifecycle.d.ts.map +1 -1
- package/dist/store/schema/cleo-project/lifecycle.js +36 -4
- package/dist/store/schema/cleo-project/lifecycle.js.map +1 -1
- package/dist/store/schema/cleo-project/provenance-commits.d.ts +48 -0
- package/dist/store/schema/cleo-project/provenance-commits.d.ts.map +1 -1
- package/dist/store/schema/cleo-project/provenance-commits.js +10 -1
- package/dist/store/schema/cleo-project/provenance-commits.js.map +1 -1
- package/dist/store/schema/cleo-project/provenance-rest.d.ts +128 -0
- package/dist/store/schema/cleo-project/provenance-rest.d.ts.map +1 -1
- package/dist/store/schema/cleo-project/provenance-rest.js +25 -1
- package/dist/store/schema/cleo-project/provenance-rest.js.map +1 -1
- package/dist/store/schema/cleo-project/tasks-core.d.ts +16 -0
- package/dist/store/schema/cleo-project/tasks-core.d.ts.map +1 -1
- package/dist/store/schema/cleo-project/tasks-core.js +6 -1
- package/dist/store/schema/cleo-project/tasks-core.js.map +1 -1
- package/dist/store/session-store.d.ts +5 -4
- package/dist/store/session-store.d.ts.map +1 -1
- package/dist/store/session-store.js +19 -5
- package/dist/store/session-store.js.map +1 -1
- package/dist/store/sync/apply/parent-delete.d.ts.map +1 -1
- package/dist/store/sync/apply/parent-delete.js +8 -0
- package/dist/store/sync/apply/parent-delete.js.map +1 -1
- package/dist/store/sync/apply/write-api.d.ts +3 -2
- package/dist/store/sync/apply/write-api.d.ts.map +1 -1
- package/dist/store/sync/apply/write-api.js +19 -0
- package/dist/store/sync/apply/write-api.js.map +1 -1
- package/dist/store/sync/capture.d.ts +11 -0
- package/dist/store/sync/capture.d.ts.map +1 -1
- package/dist/store/sync/capture.js +13 -3
- package/dist/store/sync/capture.js.map +1 -1
- package/dist/store/sync/flags.d.ts +10 -0
- package/dist/store/sync/flags.d.ts.map +1 -1
- package/dist/store/sync/flags.js +43 -5
- package/dist/store/sync/flags.js.map +1 -1
- package/dist/store/sync/timestamp-canon.d.ts.map +1 -1
- package/dist/store/sync/timestamp-canon.js +37 -0
- package/dist/store/sync/timestamp-canon.js.map +1 -1
- package/dist/store/tasks-schema.d.ts +1 -1
- package/dist/store/tasks-schema.d.ts.map +1 -1
- package/dist/store/tasks-schema.js +5 -1
- package/dist/store/tasks-schema.js.map +1 -1
- package/dist/store/twin-collapse.d.ts +2 -1
- package/dist/store/twin-collapse.d.ts.map +1 -1
- package/dist/store/twin-collapse.js +128 -104
- package/dist/store/twin-collapse.js.map +1 -1
- package/dist/store/validation-schemas.d.ts +390 -38
- package/dist/store/validation-schemas.d.ts.map +1 -1
- package/dist/store/vault-manifest.d.ts +9 -2
- package/dist/store/vault-manifest.d.ts.map +1 -1
- package/dist/store/vault-manifest.js +25 -4
- package/dist/store/vault-manifest.js.map +1 -1
- package/dist/system/health.d.ts.map +1 -1
- package/dist/system/health.js +3 -2
- package/dist/system/health.js.map +1 -1
- package/dist/tasks/affected-packages.d.ts +21 -2
- package/dist/tasks/affected-packages.d.ts.map +1 -1
- package/dist/tasks/affected-packages.js +96 -8
- package/dist/tasks/affected-packages.js.map +1 -1
- package/dist/tasks/affected-scope.d.ts +7 -2
- package/dist/tasks/affected-scope.d.ts.map +1 -1
- package/dist/tasks/affected-scope.js +158 -14
- package/dist/tasks/affected-scope.js.map +1 -1
- package/dist/tasks/change-set.d.ts +10 -0
- package/dist/tasks/change-set.d.ts.map +1 -1
- package/dist/tasks/change-set.js +70 -3
- package/dist/tasks/change-set.js.map +1 -1
- package/dist/tasks/done-plan.d.ts +11 -5
- package/dist/tasks/done-plan.d.ts.map +1 -1
- package/dist/tasks/done-plan.js +54 -10
- package/dist/tasks/done-plan.js.map +1 -1
- package/dist/tasks/done-record.d.ts.map +1 -1
- package/dist/tasks/done-record.js +25 -0
- package/dist/tasks/done-record.js.map +1 -1
- package/dist/tasks/evidence.d.ts.map +1 -1
- package/dist/tasks/evidence.js +22 -2
- package/dist/tasks/evidence.js.map +1 -1
- package/dist/tasks/gate-result-cache.d.ts.map +1 -1
- package/dist/tasks/gate-result-cache.js +24 -3
- package/dist/tasks/gate-result-cache.js.map +1 -1
- package/dist/tasks/gate-runner.d.ts +27 -3
- package/dist/tasks/gate-runner.d.ts.map +1 -1
- package/dist/tasks/gate-runner.js +77 -29
- package/dist/tasks/gate-runner.js.map +1 -1
- package/dist/tasks/qa-run-binding.d.ts +22 -3
- package/dist/tasks/qa-run-binding.d.ts.map +1 -1
- package/dist/tasks/qa-run-binding.js +46 -4
- package/dist/tasks/qa-run-binding.js.map +1 -1
- package/dist/tasks/test-run-binding.d.ts +21 -3
- package/dist/tasks/test-run-binding.d.ts.map +1 -1
- package/dist/tasks/test-run-binding.js +60 -14
- package/dist/tasks/test-run-binding.js.map +1 -1
- package/dist/tasks/tool-cache.d.ts.map +1 -1
- package/dist/tasks/tool-cache.js +24 -12
- package/dist/tasks/tool-cache.js.map +1 -1
- package/migrations/drizzle-cleo-global/20261016130000_t13777-nexus-audit-row-uids/migration.sql +18 -0
- package/migrations/drizzle-cleo-project/20261015100000_t12914-lifecycle-release-row-uids/migration.sql +88 -0
- package/migrations/drizzle-cleo-project/20261016130000_t13777-log-row-uids/migration.sql +42 -0
- package/migrations/drizzle-cleo-project/20261016140000_t13777-audit-collapse/migration.sql +31 -0
- package/package.json +18 -18
- package/templates/CLEO-REFERENCE.md +1 -1
|
@@ -0,0 +1,497 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `cleo goal close` — record the evidence a goal run produced against the
|
|
3
|
+
* CLEO acceptance criteria its criteria `prove`.
|
|
4
|
+
*
|
|
5
|
+
* Honesty rules (epic T13791, agreed with OpenCode-Goal):
|
|
6
|
+
* 1. The outcome must match the contract bytes (sha256 lock), and its head
|
|
7
|
+
* (and base) commit must exist, or nothing is recorded.
|
|
8
|
+
* 2. The outcome's `pass`, exit codes and verdicts are claims. Everything CLEO
|
|
9
|
+
* can check it re-checks before recording:
|
|
10
|
+
* - `file` / `contains` / `absent` re-run against the head commit's tree
|
|
11
|
+
* → `implemented`: `commit:<head>;files:<files>`;
|
|
12
|
+
* - a test report must hash to `reportSha256` → `testsPassed`: `test-run:`;
|
|
13
|
+
* - the project's typecheck / lint command → `qaPassed`: `tool:typecheck` /
|
|
14
|
+
* `tool:lint`, run by CLEO's own tool runner, never from the exit code;
|
|
15
|
+
* - a drafted `cleo verify <id> --run --req <R>` check and a human sign-off
|
|
16
|
+
* write nothing: the AC counts only when CLEO's own typed-gate or manual
|
|
17
|
+
* record maps it (`cleo done --plan`);
|
|
18
|
+
* - a verifier verdict (quotes re-read at head) and a diff guard never
|
|
19
|
+
* satisfy a gate.
|
|
20
|
+
* 3. Evidence goes through `validateGateVerify` (the `cleo verify` / `cleo
|
|
21
|
+
* done` write), with `satisfies:<task>#<the contract's own reference>`, and
|
|
22
|
+
* never replaces a gate already recorded.
|
|
23
|
+
* 4. A task is `ready` only when `cleo done --plan` maps every one of its
|
|
24
|
+
* criteria; the caller then completes it through the `cleo done` path.
|
|
25
|
+
*
|
|
26
|
+
* Re-running with the same outcome writes nothing new.
|
|
27
|
+
*
|
|
28
|
+
* @epic T13791
|
|
29
|
+
* @task T13794
|
|
30
|
+
*/
|
|
31
|
+
import { execFileSync } from 'node:child_process';
|
|
32
|
+
import { createHash } from 'node:crypto';
|
|
33
|
+
import { existsSync, readFileSync, realpathSync, statSync } from 'node:fs';
|
|
34
|
+
import { join, posix, resolve } from 'node:path';
|
|
35
|
+
import { AC_ALIAS_REGEX, AC_UUID_REGEX, SATISFIES_TASK_ID_REGEX, SATISFIES_VERSION_PIN_REGEX, } from '@cleocode/contracts/evidence-atom-schema.js';
|
|
36
|
+
import { ExitCode } from '@cleocode/contracts/exit-codes.js';
|
|
37
|
+
import { parse as parseYaml } from 'yaml';
|
|
38
|
+
import { z } from 'zod';
|
|
39
|
+
import { engineSuccess } from '../engine-result.js';
|
|
40
|
+
import { CleoError } from '../errors.js';
|
|
41
|
+
import { cleoErrorToEngineResult } from '../errors-to-engine.js';
|
|
42
|
+
import { isWithin } from '../nexus/stored-roots.js';
|
|
43
|
+
import { getProjectRoot } from '../paths.js';
|
|
44
|
+
import { getTaskAccessor } from '../store/data-accessor.js';
|
|
45
|
+
import { isLandedOnOriginDefault } from '../tasks/change-set.js';
|
|
46
|
+
import { joinCommandLine } from '../tasks/command-line.js';
|
|
47
|
+
import { resolveToolCommand } from '../tasks/tool-resolver.js';
|
|
48
|
+
import { GOAL_ID } from './draft.js';
|
|
49
|
+
const evidenceSchema = z.discriminatedUnion('kind', [
|
|
50
|
+
z.object({
|
|
51
|
+
kind: z.literal('command'),
|
|
52
|
+
command: z.string(),
|
|
53
|
+
exitCode: z.number(),
|
|
54
|
+
reportPath: z.string().optional(),
|
|
55
|
+
reportSha256: z.string().optional(),
|
|
56
|
+
testFiles: z.array(z.string()).optional(),
|
|
57
|
+
}),
|
|
58
|
+
z.object({ kind: z.enum(['file', 'contains', 'absent', 'diff']), paths: z.array(z.string()) }),
|
|
59
|
+
z.object({
|
|
60
|
+
kind: z.literal('verifier'),
|
|
61
|
+
verdict: z.enum(['proven', 'not_proven', 'contradicted']),
|
|
62
|
+
quotes: z.array(z.object({ path: z.string(), quote: z.string() })),
|
|
63
|
+
reason: z.string().optional(),
|
|
64
|
+
}),
|
|
65
|
+
z.object({ kind: z.literal('human'), by: z.string().optional(), note: z.string().optional() }),
|
|
66
|
+
]);
|
|
67
|
+
const outcomeSchema = z.object({
|
|
68
|
+
schema: z.literal('goal-outcome/v1'),
|
|
69
|
+
goal: z.string(),
|
|
70
|
+
runId: z.string().optional(),
|
|
71
|
+
lock: z.string().regex(/^[0-9a-f]{64}$/),
|
|
72
|
+
baseCommit: z
|
|
73
|
+
.string()
|
|
74
|
+
.regex(/^[0-9a-f]{7,64}$/)
|
|
75
|
+
.nullable(),
|
|
76
|
+
headCommit: z.string().regex(/^[0-9a-f]{7,64}$/),
|
|
77
|
+
results: z.array(z.object({
|
|
78
|
+
id: z.string(),
|
|
79
|
+
pass: z.boolean(),
|
|
80
|
+
by: z.enum(['host', 'verifier', 'verifier-fallback', 'human']),
|
|
81
|
+
detail: z.string().optional(),
|
|
82
|
+
evidence: evidenceSchema,
|
|
83
|
+
})),
|
|
84
|
+
});
|
|
85
|
+
/** Whether `target` (after `T…#`) is one of the three `satisfies:` target forms. */
|
|
86
|
+
function isAcTarget(target) {
|
|
87
|
+
const [ac = '', pin, extra] = target.split('@');
|
|
88
|
+
if (extra !== undefined)
|
|
89
|
+
return false;
|
|
90
|
+
if (pin !== undefined)
|
|
91
|
+
return AC_ALIAS_REGEX.test(ac) && SATISFIES_VERSION_PIN_REGEX.test(pin);
|
|
92
|
+
return AC_ALIAS_REGEX.test(ac) || AC_UUID_REGEX.test(ac);
|
|
93
|
+
}
|
|
94
|
+
const acRefSchema = z.string().refine((ref) => {
|
|
95
|
+
const [task = '', target = '', extra] = ref.split('#');
|
|
96
|
+
return extra === undefined && SATISFIES_TASK_ID_REGEX.test(task) && isAcTarget(target);
|
|
97
|
+
}, 'proves entries are T<id>#AC<n>, T<id>#<criterion uuid> or T<id>#AC<n>@<14-digit pin>');
|
|
98
|
+
/** The contract fields a close reads; everything else is the runtime's. */
|
|
99
|
+
const contractSchema = z.object({
|
|
100
|
+
schema: z.literal('goal/v1'),
|
|
101
|
+
id: z.string(),
|
|
102
|
+
workspace: z.string().optional(),
|
|
103
|
+
criteria: z.array(z.object({
|
|
104
|
+
id: z.string(),
|
|
105
|
+
check: z.object({
|
|
106
|
+
kind: z.string(),
|
|
107
|
+
run: z.string().optional(),
|
|
108
|
+
path: z.string().optional(),
|
|
109
|
+
exists: z.boolean().optional(),
|
|
110
|
+
text: z.string().optional(),
|
|
111
|
+
regex: z.string().optional(),
|
|
112
|
+
pattern: z.string().optional(),
|
|
113
|
+
paths: z.array(z.string()).optional(),
|
|
114
|
+
}),
|
|
115
|
+
proves: z.array(acRefSchema).optional(),
|
|
116
|
+
})),
|
|
117
|
+
cleo: z
|
|
118
|
+
.object({ tasks: z.array(z.union([z.string(), z.object({ id: z.string() })])) })
|
|
119
|
+
.optional(),
|
|
120
|
+
});
|
|
121
|
+
/** Refuse the close with a validation error. */
|
|
122
|
+
function fail(message, fix) {
|
|
123
|
+
throw new CleoError(ExitCode.VALIDATION_ERROR, message, fix ? { fix } : undefined);
|
|
124
|
+
}
|
|
125
|
+
/** `git` in `root`, or null when it fails. */
|
|
126
|
+
function git(root, args) {
|
|
127
|
+
try {
|
|
128
|
+
return execFileSync('git', ['-C', root, ...args], {
|
|
129
|
+
encoding: 'utf-8',
|
|
130
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
131
|
+
maxBuffer: 64 * 1024 * 1024,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/** Whether `ancestor` is `descendant` or an ancestor of it in `root`. */
|
|
139
|
+
function isAncestor(root, ancestor, descendant) {
|
|
140
|
+
return git(root, ['merge-base', '--is-ancestor', ancestor, descendant]) !== null;
|
|
141
|
+
}
|
|
142
|
+
/** Whether `sha` names a commit in `root`. */
|
|
143
|
+
function commitExists(root, sha) {
|
|
144
|
+
return git(root, ['cat-file', '-e', `${sha}^{commit}`]) !== null;
|
|
145
|
+
}
|
|
146
|
+
/** The tree of commit `ref`, or the working tree (what `files:` hashes) when `ref` is null. */
|
|
147
|
+
function treeAt(root, ref, workspace) {
|
|
148
|
+
const repoPath = (p) => posix.normalize(posix.join(workspace ?? '.', p.replace(/^\.\//, '')));
|
|
149
|
+
return {
|
|
150
|
+
label: ref ? `head ${ref.slice(0, 12)}` : 'the working tree',
|
|
151
|
+
repoPath,
|
|
152
|
+
read: (p) => {
|
|
153
|
+
if (ref)
|
|
154
|
+
return git(root, ['show', `${ref}:${repoPath(p)}`]);
|
|
155
|
+
const abs = join(root, repoPath(p));
|
|
156
|
+
return existsSync(abs) && statSync(abs).isFile() ? readFileSync(abs, 'utf8') : null;
|
|
157
|
+
},
|
|
158
|
+
absent: (pattern, paths) => {
|
|
159
|
+
try {
|
|
160
|
+
execFileSync('git', [
|
|
161
|
+
'-C',
|
|
162
|
+
root,
|
|
163
|
+
'grep',
|
|
164
|
+
'-q',
|
|
165
|
+
'-I',
|
|
166
|
+
'-E',
|
|
167
|
+
'-e',
|
|
168
|
+
pattern,
|
|
169
|
+
...(ref ? [ref] : []),
|
|
170
|
+
'--',
|
|
171
|
+
...(paths.length ? paths.map(repoPath) : [workspace ?? '.']),
|
|
172
|
+
':(exclude).opencode/goals',
|
|
173
|
+
], { stdio: 'ignore' });
|
|
174
|
+
return false; // exit 0: a match remains
|
|
175
|
+
}
|
|
176
|
+
catch (err) {
|
|
177
|
+
return err.status === 1 ? true : null;
|
|
178
|
+
}
|
|
179
|
+
},
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
/** Re-run a path check against one tree; the files it proves, or why it fails. */
|
|
183
|
+
function recheckPath(check, tree) {
|
|
184
|
+
const path = check.path ?? '';
|
|
185
|
+
switch (check.kind) {
|
|
186
|
+
case 'file': {
|
|
187
|
+
const exists = tree.read(path) !== null;
|
|
188
|
+
if (exists !== (check.exists !== false))
|
|
189
|
+
return { why: `${path} ${exists ? 'exists' : 'does not exist'} at ${tree.label}` };
|
|
190
|
+
return { files: exists ? [tree.repoPath(path)] : [] };
|
|
191
|
+
}
|
|
192
|
+
case 'contains': {
|
|
193
|
+
const content = tree.read(path);
|
|
194
|
+
if (content === null)
|
|
195
|
+
return { why: `${path} is not a file at ${tree.label}` };
|
|
196
|
+
const ok = check.text !== undefined
|
|
197
|
+
? content.includes(check.text)
|
|
198
|
+
: new RegExp(check.regex ?? '', 'm').test(content); // OCG's flags
|
|
199
|
+
return ok
|
|
200
|
+
? { files: [tree.repoPath(path)] }
|
|
201
|
+
: { why: `${path} does not contain it at ${tree.label}` };
|
|
202
|
+
}
|
|
203
|
+
case 'absent': {
|
|
204
|
+
const absent = tree.absent(check.pattern ?? '', check.paths ?? []);
|
|
205
|
+
if (absent === null)
|
|
206
|
+
return { why: `the search at ${tree.label} failed` };
|
|
207
|
+
if (!absent)
|
|
208
|
+
return { why: `the pattern still matches at ${tree.label}` };
|
|
209
|
+
return { files: (check.paths ?? []).filter((p) => tree.read(p) !== null).map(tree.repoPath) };
|
|
210
|
+
}
|
|
211
|
+
default:
|
|
212
|
+
return { why: `${check.kind} is not a path check` };
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
/** The evidence one criterion contributes, per the honesty rules. */
|
|
216
|
+
function contribution(criterionId, check, result, ctx) {
|
|
217
|
+
if (check.kind === 'diff') {
|
|
218
|
+
return {
|
|
219
|
+
blocker: `${criterionId} is a diff guard: it proves the paths did not change, not that anything was built`,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
if (check.kind === 'human') {
|
|
223
|
+
return {
|
|
224
|
+
deferred: `${criterionId} is an owner sign-off, which counts only with CLEO's own record: record the manual gate verdict`,
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
if (!result)
|
|
228
|
+
return { blocker: `${criterionId} has no verdict in the outcome` };
|
|
229
|
+
if (!result.pass)
|
|
230
|
+
return { blocker: `${criterionId} did not pass: ${result.detail ?? 'no detail'}` };
|
|
231
|
+
if (check.kind === 'verifier') {
|
|
232
|
+
const quotes = result.evidence.kind === 'verifier' ? result.evidence.quotes : [];
|
|
233
|
+
const found = quotes.filter((q) => ctx.tree.read(q.path)?.includes(q.quote) === true).length;
|
|
234
|
+
return {
|
|
235
|
+
blocker: `${criterionId} is proven only by a verifier verdict (a note; ${found}/${quotes.length} quotes found at head); a verifier verdict never satisfies a gate`,
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
if (check.kind === 'command') {
|
|
239
|
+
const run = (check.run ?? '').trim();
|
|
240
|
+
const typed = /^cleo verify (T\d+) --run --req (\S+) --field \/data\/passed$/.exec(run);
|
|
241
|
+
if (typed) {
|
|
242
|
+
return {
|
|
243
|
+
deferred: `${criterionId} runs typed gate ${typed[2]}, which counts only with its cached pass: cleo verify ${typed[1]} --run --req ${typed[2]}`,
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
const qa = ctx.qaCommands.get(run);
|
|
247
|
+
if (qa)
|
|
248
|
+
return { gate: 'qaPassed', atoms: [`tool:${qa}`] };
|
|
249
|
+
const ev = result.evidence;
|
|
250
|
+
if (ev.kind !== 'command' || !ev.reportPath) {
|
|
251
|
+
return {
|
|
252
|
+
blocker: `${criterionId} passed a command with no test report, which is no gate evidence; attach its report, or make it a typed gate`,
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
const report = resolve(ctx.root, ev.reportPath);
|
|
256
|
+
if (!existsSync(report))
|
|
257
|
+
return { blocker: `${criterionId}'s report ${ev.reportPath} is missing` };
|
|
258
|
+
if (!isWithin(realpathSync(ctx.root), realpathSync(report)))
|
|
259
|
+
return { blocker: `${criterionId}'s report ${ev.reportPath} is outside the project` };
|
|
260
|
+
const sha = createHash('sha256').update(readFileSync(report)).digest('hex');
|
|
261
|
+
if (!ev.reportSha256)
|
|
262
|
+
return { blocker: `${criterionId}'s report has no reportSha256 to bind it` };
|
|
263
|
+
if (sha !== ev.reportSha256)
|
|
264
|
+
return {
|
|
265
|
+
blocker: `${criterionId}'s report does not hash to its reportSha256 (it changed after the run)`,
|
|
266
|
+
};
|
|
267
|
+
return { gate: 'testsPassed', atoms: [`test-run:${report}`] };
|
|
268
|
+
}
|
|
269
|
+
// The claim must hold at the run's head AND in the tree whose bytes files: hashes.
|
|
270
|
+
for (const tree of [ctx.tree, ctx.live]) {
|
|
271
|
+
const rechecked = recheckPath(check, tree);
|
|
272
|
+
if ('why' in rechecked)
|
|
273
|
+
return { blocker: `${criterionId} does not hold: ${rechecked.why}` };
|
|
274
|
+
}
|
|
275
|
+
const rechecked = recheckPath(check, ctx.live);
|
|
276
|
+
if (!('files' in rechecked) || rechecked.files.length === 0)
|
|
277
|
+
return { blocker: `${criterionId} passed a ${check.kind} check on no file to record` };
|
|
278
|
+
return {
|
|
279
|
+
gate: 'implemented',
|
|
280
|
+
atoms: [`commit:${ctx.head}`, `files:${rechecked.files.join(',')}`],
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Close a goal: verify the outcome, record per-AC evidence, report each task.
|
|
285
|
+
*
|
|
286
|
+
* @param slug - Goal slug; the contract is `.opencode/goals/<slug>/goal.yaml`.
|
|
287
|
+
* @param opts - Project root, outcome path and test seams.
|
|
288
|
+
* @returns Per-task results, or a refusal when the outcome does not match.
|
|
289
|
+
* @example
|
|
290
|
+
* ```ts
|
|
291
|
+
* const r = await closeGoal('t123', { outcomePath: 'outcome.json' });
|
|
292
|
+
* if (r.success) r.data.tasks.filter((t) => t.ready); // complete via cleo done
|
|
293
|
+
* ```
|
|
294
|
+
*/
|
|
295
|
+
export async function closeGoal(slug, opts) {
|
|
296
|
+
try {
|
|
297
|
+
const root = opts.projectRoot ?? getProjectRoot();
|
|
298
|
+
if (!GOAL_ID.test(slug))
|
|
299
|
+
fail(`Goal slug "${slug}" is not a goal id (a-z, 0-9, hyphens, at most 64)`);
|
|
300
|
+
const contractPath = join(root, '.opencode', 'goals', slug, 'goal.yaml');
|
|
301
|
+
if (!existsSync(contractPath))
|
|
302
|
+
fail(`No goal contract at ${contractPath}`, `cleo goal draft <taskId>`);
|
|
303
|
+
const bytes = readFileSync(contractPath);
|
|
304
|
+
const lock = createHash('sha256').update(bytes).digest('hex');
|
|
305
|
+
const outcomeParsed = outcomeSchema.safeParse(JSON.parse(readFileSync(resolve(opts.outcomePath), 'utf8')));
|
|
306
|
+
if (!outcomeParsed.success)
|
|
307
|
+
fail(`Not a goal-outcome/v1 file: ${outcomeParsed.error.message}`);
|
|
308
|
+
const outcome = outcomeParsed.data;
|
|
309
|
+
if (outcome.goal !== slug)
|
|
310
|
+
fail(`The outcome is for goal ${outcome.goal}, not ${slug}`);
|
|
311
|
+
if (outcome.lock !== lock) {
|
|
312
|
+
fail(`The outcome's contract lock ${outcome.lock.slice(0, 12)} does not match ${contractPath} (${lock.slice(0, 12)}); the contract changed after the run`, 'Close with the outcome of a run of the current contract');
|
|
313
|
+
}
|
|
314
|
+
for (const sha of [outcome.headCommit, outcome.baseCommit]) {
|
|
315
|
+
if (sha !== null && !commitExists(root, sha))
|
|
316
|
+
fail(`Commit ${sha} does not exist in ${root}`, 'git fetch, then close again');
|
|
317
|
+
}
|
|
318
|
+
// A stale head would judge claims on code HEAD no longer holds.
|
|
319
|
+
if (!isAncestor(root, outcome.headCommit, 'HEAD'))
|
|
320
|
+
fail(`Head commit ${outcome.headCommit.slice(0, 12)} is not HEAD or an ancestor of it in ${root}`, 'Close from the checkout the run produced (or one that contains its head)');
|
|
321
|
+
if (outcome.baseCommit !== null && !isAncestor(root, outcome.baseCommit, outcome.headCommit))
|
|
322
|
+
fail(`Base commit ${outcome.baseCommit.slice(0, 12)} is not an ancestor of the head commit`);
|
|
323
|
+
const contractParsed = contractSchema.safeParse(parseYaml(bytes.toString('utf8')));
|
|
324
|
+
if (!contractParsed.success)
|
|
325
|
+
fail(`${contractPath} is not a goal/v1 contract: ${contractParsed.error.message}`);
|
|
326
|
+
const contract = contractParsed.data;
|
|
327
|
+
const qaCommands = new Map();
|
|
328
|
+
for (const tool of ['lint', 'typecheck']) {
|
|
329
|
+
const r = resolveToolCommand(tool, root);
|
|
330
|
+
if (r.ok)
|
|
331
|
+
qaCommands.set(joinCommandLine([r.command.cmd, ...r.command.args]), tool);
|
|
332
|
+
}
|
|
333
|
+
const ctx = {
|
|
334
|
+
root,
|
|
335
|
+
head: outcome.headCommit,
|
|
336
|
+
tree: treeAt(root, outcome.headCommit, contract.workspace),
|
|
337
|
+
live: treeAt(root, null, contract.workspace),
|
|
338
|
+
qaCommands,
|
|
339
|
+
};
|
|
340
|
+
// Per task, per AC target (as the contract spells it): every contribution.
|
|
341
|
+
const byTask = new Map();
|
|
342
|
+
for (const t of contract.cleo?.tasks ?? [])
|
|
343
|
+
byTask.set(typeof t === 'string' ? t : t.id, new Map());
|
|
344
|
+
for (const c of contract.criteria) {
|
|
345
|
+
const result = outcome.results.find((r) => r.id === c.id);
|
|
346
|
+
for (const ref of c.proves ?? []) {
|
|
347
|
+
const [taskId = '', target = ''] = ref.split('#');
|
|
348
|
+
const acs = byTask.get(taskId) ?? new Map();
|
|
349
|
+
byTask.set(taskId, acs);
|
|
350
|
+
acs.set(target, [...(acs.get(target) ?? []), contribution(c.id, c.check, result, ctx)]);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
const accessor = await getTaskAccessor(root);
|
|
354
|
+
const { planTaskDone } = await import('../tasks/done-plan.js');
|
|
355
|
+
const { validateGateVerify } = await import('../validation/engine-ops.js');
|
|
356
|
+
const { resolveBoundSessionId } = await import('../store/session-store.js');
|
|
357
|
+
const sessionId = (await resolveBoundSessionId(root).catch(() => null)) ?? undefined;
|
|
358
|
+
// Resolve every task before any write, so a refusal never follows a partial write.
|
|
359
|
+
const loaded = [];
|
|
360
|
+
for (const [taskId, acs] of byTask) {
|
|
361
|
+
const task = await accessor.loadSingleTask(taskId);
|
|
362
|
+
if (!task)
|
|
363
|
+
fail(`Task ${taskId} named by goal ${slug} not found`, `cleo find "${taskId}"`);
|
|
364
|
+
loaded.push({ taskId, acs, task, rows: await accessor.getAcRows(taskId) });
|
|
365
|
+
}
|
|
366
|
+
const tasks = [];
|
|
367
|
+
for (const { taskId, acs, task, rows } of loaded) {
|
|
368
|
+
if (task.status === 'done') {
|
|
369
|
+
tasks.push({
|
|
370
|
+
taskId,
|
|
371
|
+
alreadyDone: true,
|
|
372
|
+
recordedGates: [],
|
|
373
|
+
satisfied: [],
|
|
374
|
+
open: [],
|
|
375
|
+
ready: false,
|
|
376
|
+
});
|
|
377
|
+
continue;
|
|
378
|
+
}
|
|
379
|
+
// A target names its row by alias (optionally pinned) or by canonical uuid.
|
|
380
|
+
const rowOf = (target) => {
|
|
381
|
+
const ac = target.split('@')[0] ?? '';
|
|
382
|
+
return rows.find((r) => r.id === ac || `AC${r.ordinal}` === ac);
|
|
383
|
+
};
|
|
384
|
+
const linked = new Set(Object.values(task.verification?.evidence ?? {}).flatMap((e) => e?.scope?.criteria?.map((l) => l.criterionId) ?? []));
|
|
385
|
+
const blockers = new Map();
|
|
386
|
+
const perGate = new Map();
|
|
387
|
+
for (const [target, parts] of acs) {
|
|
388
|
+
const row = rowOf(target);
|
|
389
|
+
if (!row) {
|
|
390
|
+
blockers.set(target, `${taskId} has no criterion ${target}`);
|
|
391
|
+
continue;
|
|
392
|
+
}
|
|
393
|
+
const alias = `AC${row.ordinal}`;
|
|
394
|
+
const blocked = parts.flatMap((p) => ('blocker' in p ? [p.blocker] : []));
|
|
395
|
+
if (blocked.length) {
|
|
396
|
+
blockers.set(alias, blocked.join('; '));
|
|
397
|
+
continue;
|
|
398
|
+
}
|
|
399
|
+
const deferred = parts.flatMap((p) => ('deferred' in p ? [p.deferred] : []));
|
|
400
|
+
if (deferred.length)
|
|
401
|
+
blockers.set(alias, deferred.join('; '));
|
|
402
|
+
for (const p of parts) {
|
|
403
|
+
if (!('gate' in p))
|
|
404
|
+
continue;
|
|
405
|
+
const entry = perGate.get(p.gate) ?? {
|
|
406
|
+
atoms: new Set(),
|
|
407
|
+
targets: [],
|
|
408
|
+
aliases: [],
|
|
409
|
+
};
|
|
410
|
+
for (const a of p.atoms)
|
|
411
|
+
entry.atoms.add(a);
|
|
412
|
+
if (!entry.targets.includes(target))
|
|
413
|
+
entry.targets.push(target);
|
|
414
|
+
if (!entry.aliases.includes(alias))
|
|
415
|
+
entry.aliases.push(alias);
|
|
416
|
+
perGate.set(p.gate, entry);
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
const gateEvidence = {};
|
|
420
|
+
for (const [gate, { atoms, targets, aliases }] of perGate) {
|
|
421
|
+
// Idempotent re-run: nothing new to link on this gate.
|
|
422
|
+
if (targets.every((t) => linked.has(rowOf(t)?.id ?? '')))
|
|
423
|
+
continue;
|
|
424
|
+
const evidence = [...atoms, ...targets.map((t) => `satisfies:${taskId}#${t}`)].join(';');
|
|
425
|
+
if (task.verification?.gates?.[gate] === true) {
|
|
426
|
+
for (const a of aliases)
|
|
427
|
+
blockers.set(a, `${gate} is already recorded for ${taskId}; recording the goal's evidence would replace it. Re-record both: cleo verify ${taskId} --gate ${gate} --evidence "<existing atoms>;${evidence}"`);
|
|
428
|
+
continue;
|
|
429
|
+
}
|
|
430
|
+
gateEvidence[gate] = evidence;
|
|
431
|
+
}
|
|
432
|
+
const recordedGates = Object.keys(gateEvidence);
|
|
433
|
+
if (recordedGates.length > 0) {
|
|
434
|
+
const written = await validateGateVerify(root, {
|
|
435
|
+
taskId,
|
|
436
|
+
gateEvidence,
|
|
437
|
+
agent: 'cleo-goal-close',
|
|
438
|
+
...(sessionId ? { sessionId } : {}),
|
|
439
|
+
});
|
|
440
|
+
if (!written.success) {
|
|
441
|
+
recordedGates.length = 0;
|
|
442
|
+
for (const { aliases } of perGate.values())
|
|
443
|
+
for (const a of aliases)
|
|
444
|
+
blockers.set(a, `cleo verify refused (${written.error.code}): ${written.error.message}`);
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
const plan = await planTaskDone(taskId, {
|
|
448
|
+
projectRoot: root,
|
|
449
|
+
cwd: root,
|
|
450
|
+
...(opts.deps ? { deps: opts.deps } : {}),
|
|
451
|
+
});
|
|
452
|
+
if (!plan.success) {
|
|
453
|
+
tasks.push({
|
|
454
|
+
taskId,
|
|
455
|
+
alreadyDone: false,
|
|
456
|
+
recordedGates,
|
|
457
|
+
satisfied: [],
|
|
458
|
+
open: [
|
|
459
|
+
{
|
|
460
|
+
alias: '*',
|
|
461
|
+
blocker: `cleo done --plan failed (${plan.error.code}): ${plan.error.message}`,
|
|
462
|
+
},
|
|
463
|
+
],
|
|
464
|
+
ready: false,
|
|
465
|
+
});
|
|
466
|
+
continue;
|
|
467
|
+
}
|
|
468
|
+
const open = plan.data.acMapping
|
|
469
|
+
.filter((m) => !m.mapped)
|
|
470
|
+
.map((m) => ({
|
|
471
|
+
alias: m.alias,
|
|
472
|
+
blocker: blockers.get(m.alias) ?? 'no passing goal criterion proves it',
|
|
473
|
+
}));
|
|
474
|
+
// Work that landed on main with no citing PR or branch completes from the run's head commit.
|
|
475
|
+
const viaCommit = open.length === 0 &&
|
|
476
|
+
plan.data.changeSet.source === 'none' &&
|
|
477
|
+
isLandedOnOriginDefault(root, outcome.headCommit);
|
|
478
|
+
tasks.push({
|
|
479
|
+
taskId,
|
|
480
|
+
alreadyDone: false,
|
|
481
|
+
recordedGates,
|
|
482
|
+
satisfied: plan.data.acMapping.filter((m) => m.mapped).map((m) => m.alias),
|
|
483
|
+
open,
|
|
484
|
+
ready: open.length === 0,
|
|
485
|
+
...(viaCommit ? { completionCommit: outcome.headCommit } : {}),
|
|
486
|
+
});
|
|
487
|
+
}
|
|
488
|
+
return engineSuccess({ goal: slug, lock, headCommit: outcome.headCommit, tasks });
|
|
489
|
+
}
|
|
490
|
+
catch (err) {
|
|
491
|
+
if (err instanceof SyntaxError) {
|
|
492
|
+
return cleoErrorToEngineResult(new CleoError(ExitCode.VALIDATION_ERROR, `Outcome is not JSON: ${err.message}`));
|
|
493
|
+
}
|
|
494
|
+
return cleoErrorToEngineResult(err, 'E_GOAL_CLOSE_FAILED', 'cleo goal close failed');
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
//# sourceMappingURL=close.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"close.js","sourceRoot":"","sources":["../../src/goal/close.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `cleo goal draft` — write a goal/v1 contract draft from tasks' acceptance
|
|
3
|
+
* criteria, for a goal runtime (OpenCode-Goal) to execute.
|
|
4
|
+
*
|
|
5
|
+
* Each criterion maps to goal criteria that `prove` it (by its canonical
|
|
6
|
+
* uuid), never weaker than the gate:
|
|
7
|
+
* - a typed gate goal/v1 expresses exactly → host checks (`command` with the
|
|
8
|
+
* gate's own executable, cwd, env and deadline; `file` / `contains`);
|
|
9
|
+
* - any other typed gate → the gate itself, `cleo verify <id> --run --req`;
|
|
10
|
+
* - `manual` gates → `human` checks;
|
|
11
|
+
* - free text, and a gate with neither form → `verifier` checks;
|
|
12
|
+
* - `advisory: true` → `essential: false`.
|
|
13
|
+
*
|
|
14
|
+
* Invariants are the project's resolved lint and typecheck commands; the
|
|
15
|
+
* budget follows the task size; `.cleo/` is protected. Drafting never starts
|
|
16
|
+
* a run: it writes the one file and refuses to overwrite an existing one.
|
|
17
|
+
*
|
|
18
|
+
* @epic T13791
|
|
19
|
+
* @task T13793
|
|
20
|
+
*/
|
|
21
|
+
import type { AcRow, GoalContract, Task } from '@cleocode/contracts';
|
|
22
|
+
import { type EngineResult } from '../engine-result.js';
|
|
23
|
+
/** One task and its stored criterion rows, the input of {@link buildGoalDraft}. */
|
|
24
|
+
export interface GoalDraftTask {
|
|
25
|
+
/** The task. */
|
|
26
|
+
task: Pick<Task, 'id' | 'title' | 'description' | 'size' | 'acceptance'>;
|
|
27
|
+
/** Its criterion rows (any order). */
|
|
28
|
+
rows: readonly Pick<AcRow, 'id' | 'ordinal' | 'text'>[];
|
|
29
|
+
}
|
|
30
|
+
/** Result of {@link draftGoal}. */
|
|
31
|
+
export interface GoalDraftResult {
|
|
32
|
+
/** Goal slug (the contract id and directory name). */
|
|
33
|
+
slug: string;
|
|
34
|
+
/** Absolute path of the written `goal.yaml`. */
|
|
35
|
+
path: string;
|
|
36
|
+
/** The drafted contract. */
|
|
37
|
+
contract: GoalContract;
|
|
38
|
+
}
|
|
39
|
+
/** OCG goal ids: a kebab-case slug that equals the goal directory name. */
|
|
40
|
+
export declare const GOAL_ID: RegExp;
|
|
41
|
+
/**
|
|
42
|
+
* Build a goal/v1 contract from tasks' acceptance criteria. Pure.
|
|
43
|
+
*
|
|
44
|
+
* @param tasks - The tasks the goal serves, first is the primary.
|
|
45
|
+
* @param invariantCommands - Resolved lint/typecheck command lines.
|
|
46
|
+
* @param opts - Project root (gate cwd and commands resolve against it) and an explicit goal id.
|
|
47
|
+
* @returns The contract; every criterion `proves` the AC it came from.
|
|
48
|
+
* @example
|
|
49
|
+
* ```ts
|
|
50
|
+
* const contract = buildGoalDraft([{ task, rows }], ['pnpm biome check .'], { root });
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
export declare function buildGoalDraft(tasks: readonly GoalDraftTask[], invariantCommands: readonly string[], opts: {
|
|
54
|
+
root: string;
|
|
55
|
+
id?: string;
|
|
56
|
+
}): GoalContract;
|
|
57
|
+
/**
|
|
58
|
+
* Render a contract as `goal.yaml` text in OCG's YAML spelling (budget
|
|
59
|
+
* `wall` as minutes, e.g. `"180m"`). Lines never fold, so a command stays one line.
|
|
60
|
+
*
|
|
61
|
+
* @param contract - The contract.
|
|
62
|
+
* @returns YAML text.
|
|
63
|
+
*/
|
|
64
|
+
export declare function renderGoalYaml(contract: GoalContract): string;
|
|
65
|
+
/**
|
|
66
|
+
* Draft a goal for tasks and write it, refusing to overwrite an existing file.
|
|
67
|
+
*
|
|
68
|
+
* @param taskIds - Task ids; the first names the goal.
|
|
69
|
+
* @param opts - Project root and an explicit output path.
|
|
70
|
+
* @returns The written path and contract, or the refusal.
|
|
71
|
+
* @example
|
|
72
|
+
* ```ts
|
|
73
|
+
* const r = await draftGoal(['T123'], {});
|
|
74
|
+
* if (r.success) console.log(r.data.path); // .opencode/goals/t123/goal.yaml
|
|
75
|
+
* ```
|
|
76
|
+
*/
|
|
77
|
+
export declare function draftGoal(taskIds: readonly string[], opts?: {
|
|
78
|
+
projectRoot?: string;
|
|
79
|
+
out?: string;
|
|
80
|
+
}): Promise<EngineResult<GoalDraftResult>>;
|
|
81
|
+
//# sourceMappingURL=draft.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"draft.d.ts","sourceRoot":"","sources":["../../src/goal/draft.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAIH,OAAO,KAAK,EAEV,KAAK,EAGL,YAAY,EAEZ,IAAI,EAEL,MAAM,qBAAqB,CAAC;AAK7B,OAAO,EAAE,KAAK,YAAY,EAAiB,MAAM,qBAAqB,CAAC;AAcvE,mFAAmF;AACnF,MAAM,WAAW,aAAa;IAC5B,gBAAgB;IAChB,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,GAAG,aAAa,GAAG,MAAM,GAAG,YAAY,CAAC,CAAC;IACzE,sCAAsC;IACtC,IAAI,EAAE,SAAS,IAAI,CAAC,KAAK,EAAE,IAAI,GAAG,SAAS,GAAG,MAAM,CAAC,EAAE,CAAC;CACzD;AAED,mCAAmC;AACnC,MAAM,WAAW,eAAe;IAC9B,sDAAsD;IACtD,IAAI,EAAE,MAAM,CAAC;IACb,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,4BAA4B;IAC5B,QAAQ,EAAE,YAAY,CAAC;CACxB;AASD,2EAA2E;AAC3E,eAAO,MAAM,OAAO,QAA8B,CAAC;AAmInD;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,SAAS,aAAa,EAAE,EAC/B,iBAAiB,EAAE,SAAS,MAAM,EAAE,EACpC,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,GAClC,YAAY,CAoEd;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,CAI7D;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,IAAI,GAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAChD,OAAO,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC,CAqExC"}
|