@open-agent-toolkit/cli 0.1.72 → 0.1.74
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/README.md +1 -0
- package/assets/config/dispatch-matrix-recommendation.json +13 -17
- package/assets/docs/cli-utilities/configuration.md +42 -60
- package/assets/docs/cli-utilities/index.md +1 -0
- package/assets/docs/cli-utilities/project-log.md +183 -0
- package/assets/docs/cli-utilities/workflow-gates.md +38 -2
- package/assets/docs/provider-sync/providers.md +15 -17
- package/assets/docs/reference/cli-reference.md +1 -0
- package/assets/docs/workflows/projects/artifacts.md +1 -1
- package/assets/docs/workflows/projects/dispatch-ceiling.md +29 -33
- package/assets/docs/workflows/projects/implementation-execution.md +7 -4
- package/assets/docs/workflows/projects/lifecycle.md +4 -3
- package/assets/public-package-versions.json +4 -4
- package/assets/skills/oat-dispatch-subagents/SKILL.md +1 -1
- package/assets/skills/oat-dispatch-subagents/references/provider-cursor.md +27 -15
- package/assets/skills/oat-project-autonomous/SKILL.md +1 -1
- package/assets/skills/oat-project-autonomous/references/gate-inventory.md +4 -3
- package/assets/skills/oat-project-complete/SKILL.md +60 -1
- package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +4 -3
- package/assets/skills/oat-project-implement/SKILL.md +18 -2
- package/assets/skills/oat-project-implement/references/completion-and-closeout.md +17 -15
- package/assets/skills/oat-project-implement/references/dispatch-and-dry-run.md +15 -9
- package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +4 -3
- package/assets/skills/oat-project-implement/references/phase-execution.md +11 -5
- package/assets/skills/oat-project-import-plan/SKILL.md +30 -8
- package/assets/skills/oat-project-plan/SKILL.md +30 -8
- package/assets/skills/oat-project-plan-writing/SKILL.md +12 -9
- package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +4 -3
- package/assets/skills/oat-project-quick-start/SKILL.md +30 -8
- package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +4 -3
- package/assets/skills/oat-project-review-provide/SKILL.md +19 -11
- package/assets/skills/oat-project-review-provide-remote/SKILL.md +27 -4
- package/assets/skills/oat-project-summary/SKILL.md +122 -18
- package/assets/templates/project-log.md +47 -0
- package/dist/commands/config/index.d.ts.map +1 -1
- package/dist/commands/config/index.js +41 -0
- package/dist/commands/doctor/index.d.ts +2 -1
- package/dist/commands/doctor/index.d.ts.map +1 -1
- package/dist/commands/doctor/index.js +37 -1
- package/dist/commands/gate/index.d.ts +3 -1
- package/dist/commands/gate/index.d.ts.map +1 -1
- package/dist/commands/gate/index.js +134 -7
- package/dist/commands/init/index.d.ts +1 -1
- package/dist/commands/init/index.d.ts.map +1 -1
- package/dist/commands/init/index.js +40 -8
- package/dist/commands/init/tools/shared/skill-manifest.d.ts +1 -1
- package/dist/commands/init/tools/shared/skill-manifest.d.ts.map +1 -1
- package/dist/commands/init/tools/shared/skill-manifest.js +1 -0
- package/dist/commands/project/dispatch-ceiling/index.d.ts.map +1 -1
- package/dist/commands/project/dispatch-ceiling/index.js +17 -9
- package/dist/commands/project/index.d.ts.map +1 -1
- package/dist/commands/project/index.js +2 -0
- package/dist/commands/project/log/append.d.ts +41 -0
- package/dist/commands/project/log/append.d.ts.map +1 -0
- package/dist/commands/project/log/append.js +241 -0
- package/dist/commands/project/log/check.d.ts +66 -0
- package/dist/commands/project/log/check.d.ts.map +1 -0
- package/dist/commands/project/log/check.js +194 -0
- package/dist/commands/project/log/grammar.d.ts +28 -0
- package/dist/commands/project/log/grammar.d.ts.map +1 -0
- package/dist/commands/project/log/grammar.js +31 -0
- package/dist/commands/project/log/index.d.ts +9 -0
- package/dist/commands/project/log/index.d.ts.map +1 -0
- package/dist/commands/project/log/index.js +13 -0
- package/dist/commands/project/log/rollup.d.ts +40 -0
- package/dist/commands/project/log/rollup.d.ts.map +1 -0
- package/dist/commands/project/log/rollup.js +203 -0
- package/dist/commands/project/log/synthesize.d.ts +23 -0
- package/dist/commands/project/log/synthesize.d.ts.map +1 -0
- package/dist/commands/project/log/synthesize.js +112 -0
- package/dist/commands/project/new/index.d.ts +1 -0
- package/dist/commands/project/new/index.d.ts.map +1 -1
- package/dist/commands/project/new/index.js +7 -0
- package/dist/commands/project/new/scaffold.d.ts +1 -0
- package/dist/commands/project/new/scaffold.d.ts.map +1 -1
- package/dist/commands/project/new/scaffold.js +24 -0
- package/dist/commands/shared/codex-strays.d.ts +9 -0
- package/dist/commands/shared/codex-strays.d.ts.map +1 -1
- package/dist/commands/shared/codex-strays.js +4 -0
- package/dist/commands/status/index.d.ts +7 -1
- package/dist/commands/status/index.d.ts.map +1 -1
- package/dist/commands/status/index.js +53 -17
- package/dist/commands/sync/apply.d.ts.map +1 -1
- package/dist/commands/sync/apply.js +50 -24
- package/dist/commands/sync/dry-run.d.ts.map +1 -1
- package/dist/commands/sync/dry-run.js +31 -18
- package/dist/commands/sync/index.d.ts.map +1 -1
- package/dist/commands/sync/index.js +34 -25
- package/dist/commands/sync/sync.types.d.ts +26 -11
- package/dist/commands/sync/sync.types.d.ts.map +1 -1
- package/dist/commands/sync/sync.utils.d.ts.map +1 -1
- package/dist/commands/sync/sync.utils.js +3 -2
- package/dist/config/oat-config.d.ts +3 -0
- package/dist/config/oat-config.d.ts.map +1 -1
- package/dist/config/oat-config.js +7 -0
- package/dist/config/resolve.d.ts.map +1 -1
- package/dist/config/resolve.js +2 -0
- package/dist/engine/index.d.ts +1 -1
- package/dist/engine/index.d.ts.map +1 -1
- package/dist/engine/index.js +1 -1
- package/dist/engine/scanner.d.ts +3 -1
- package/dist/engine/scanner.d.ts.map +1 -1
- package/dist/engine/scanner.js +4 -2
- package/dist/providers/ceiling/registry.d.ts +2 -0
- package/dist/providers/ceiling/registry.d.ts.map +1 -1
- package/dist/providers/ceiling/registry.js +20 -4
- package/dist/providers/codex/codec/sync-extension.d.ts +11 -10
- package/dist/providers/codex/codec/sync-extension.d.ts.map +1 -1
- package/dist/providers/codex/codec/sync-extension.js +42 -14
- package/dist/providers/cursor/codec/catalog.d.ts +18 -0
- package/dist/providers/cursor/codec/catalog.d.ts.map +1 -0
- package/dist/providers/cursor/codec/catalog.js +39 -0
- package/dist/providers/cursor/codec/materialize.d.ts +24 -0
- package/dist/providers/cursor/codec/materialize.d.ts.map +1 -0
- package/dist/providers/cursor/codec/materialize.js +166 -0
- package/dist/providers/cursor/codec/shared.d.ts +14 -0
- package/dist/providers/cursor/codec/shared.d.ts.map +1 -0
- package/dist/providers/cursor/codec/shared.js +76 -0
- package/dist/providers/cursor/codec/sync-extension.d.ts +37 -0
- package/dist/providers/cursor/codec/sync-extension.d.ts.map +1 -0
- package/dist/providers/cursor/codec/sync-extension.js +393 -0
- package/dist/providers/cursor/index.d.ts +3 -0
- package/dist/providers/cursor/index.d.ts.map +1 -1
- package/dist/providers/cursor/index.js +3 -0
- package/dist/providers/identity/availability.d.ts +7 -0
- package/dist/providers/identity/availability.d.ts.map +1 -1
- package/dist/providers/identity/availability.js +23 -0
- package/dist/providers/shared/index.d.ts +2 -0
- package/dist/providers/shared/index.d.ts.map +1 -1
- package/dist/providers/shared/index.js +1 -0
- package/dist/providers/shared/materialization-extension.d.ts +44 -0
- package/dist/providers/shared/materialization-extension.d.ts.map +1 -0
- package/dist/providers/shared/materialization-extension.js +26 -0
- package/package.json +2 -2
|
@@ -4,6 +4,7 @@ import { mkdir, readdir, readFile, rm, writeFile } from 'node:fs/promises';
|
|
|
4
4
|
import { tmpdir } from 'node:os';
|
|
5
5
|
import { basename, isAbsolute, join, relative } from 'node:path';
|
|
6
6
|
import { buildCommandContext, } from '../../app/command-context.js';
|
|
7
|
+
import { appendProjectLog } from '../project/log/append.js';
|
|
7
8
|
import { getFrontmatterBlock, parseFrontmatterScalarFields, parseGeneratedTime, } from '../shared/frontmatter.js';
|
|
8
9
|
import { readGlobalOptions } from '../shared/shared.utils.js';
|
|
9
10
|
import { parseJsonConfig } from '../../config/json.js';
|
|
@@ -38,6 +39,7 @@ const DEFAULT_DEPENDENCIES = {
|
|
|
38
39
|
readGateRouteReceipt,
|
|
39
40
|
runProcess: runChildProcess,
|
|
40
41
|
parseReviewGateVerdict,
|
|
42
|
+
appendProjectLog,
|
|
41
43
|
processEnv: process.env,
|
|
42
44
|
writeGateRunMarker,
|
|
43
45
|
removeGateRunMarker,
|
|
@@ -811,6 +813,19 @@ function parseProducerIdentityOption(value) {
|
|
|
811
813
|
}
|
|
812
814
|
return identityFromRecords([{ value: producer, provenance: provenance }], 'flag');
|
|
813
815
|
}
|
|
816
|
+
function parseEnvironmentProducerIdentity(value) {
|
|
817
|
+
const trimmed = value?.trim();
|
|
818
|
+
if (!trimmed) {
|
|
819
|
+
return unknownProducerIdentity();
|
|
820
|
+
}
|
|
821
|
+
const separator = trimmed.lastIndexOf(':');
|
|
822
|
+
const producer = separator > 0 ? trimmed.slice(0, separator).trim() : '';
|
|
823
|
+
const provenance = separator > 0 ? trimmed.slice(separator + 1).trim() : '';
|
|
824
|
+
if (!producer || provenance !== 'declared') {
|
|
825
|
+
return unknownProducerIdentity();
|
|
826
|
+
}
|
|
827
|
+
return identityFromRecords([{ value: producer, provenance: 'declared' }], 'environment');
|
|
828
|
+
}
|
|
814
829
|
function identityFromStamp(stamp) {
|
|
815
830
|
return identityFromRecords([{ value: stamp.producer, provenance: stamp.provenance }], 'stamp');
|
|
816
831
|
}
|
|
@@ -820,11 +835,19 @@ function exactIdentityFromStamp(stamp) {
|
|
|
820
835
|
? identity
|
|
821
836
|
: unknownProducerIdentity();
|
|
822
837
|
}
|
|
838
|
+
function aggregateIdentityFromStamp(stamp) {
|
|
839
|
+
const producerIdentity = identityFromStamp(stamp);
|
|
840
|
+
if (producerIdentity.diversityClaimable &&
|
|
841
|
+
producerIdentity.family !== 'unknown') {
|
|
842
|
+
return producerIdentity;
|
|
843
|
+
}
|
|
844
|
+
return identityFromRecords([{ value: stamp.target, provenance: 'inferred' }], 'stamp');
|
|
845
|
+
}
|
|
823
846
|
function aggregateIdentityFromStamps(stamps) {
|
|
824
847
|
if (stamps.length === 0) {
|
|
825
848
|
return unknownProducerIdentity();
|
|
826
849
|
}
|
|
827
|
-
const identities = stamps.map(
|
|
850
|
+
const identities = stamps.map(aggregateIdentityFromStamp);
|
|
828
851
|
const avoidFamilies = [
|
|
829
852
|
...new Set(identities.flatMap((identity) => identity.diversityClaimable && identity.family !== 'unknown'
|
|
830
853
|
? [identity.family]
|
|
@@ -894,7 +917,17 @@ async function resolveReviewProducerIdentity(options) {
|
|
|
894
917
|
if (options.explicit?.trim()) {
|
|
895
918
|
return parseProducerIdentityOption(options.explicit);
|
|
896
919
|
}
|
|
897
|
-
|
|
920
|
+
const stamped = await readStampedProducerIdentity(options);
|
|
921
|
+
if (stamped.diversityClaimable) {
|
|
922
|
+
return stamped;
|
|
923
|
+
}
|
|
924
|
+
const environment = parseEnvironmentProducerIdentity(options.env.OAT_GATE_PRODUCER_IDENTITY);
|
|
925
|
+
return environment.diversityClaimable ? environment : stamped;
|
|
926
|
+
}
|
|
927
|
+
function reviewerChildProcessEnv(env) {
|
|
928
|
+
const childEnv = { ...env };
|
|
929
|
+
delete childEnv.OAT_GATE_PRODUCER_IDENTITY;
|
|
930
|
+
return childEnv;
|
|
898
931
|
}
|
|
899
932
|
function findPinnedModelArg(argv) {
|
|
900
933
|
for (let index = 0; index < argv.length; index += 1) {
|
|
@@ -1654,6 +1687,29 @@ function writeReviewGateTargetingFailure(context, payload) {
|
|
|
1654
1687
|
context.logger.error(`Expected project=${payload.corroboration.expectedProject} run=${payload.gateInvocation.runId}; actual containing_project=${payload.corroboration.actual.containingProject ?? 'missing'} artifact_project=${payload.corroboration.actual.artifactProject ?? 'missing'} run_matches=${payload.corroboration.actual.matchingArtifactPaths.join(',') || 'none'}.`);
|
|
1655
1688
|
context.logger.error('This targeting failure is not receive-eligible and must be corrected before severity or invocation remediation.');
|
|
1656
1689
|
}
|
|
1690
|
+
async function finalizeReviewGateProjectLog(context, dependencies, finalization) {
|
|
1691
|
+
const findings = finalization.counts
|
|
1692
|
+
? ` findings=critical:${finalization.counts.critical},important:${finalization.counts.important},medium:${finalization.counts.medium},minor:${finalization.counts.minor}`
|
|
1693
|
+
: '';
|
|
1694
|
+
const artifact = finalization.artifactPath
|
|
1695
|
+
? ` artifact=${finalization.artifactPath}`
|
|
1696
|
+
: '';
|
|
1697
|
+
const body = `target=${finalization.target} threshold=${finalization.threshold}${findings} exit=${finalization.exitCode} status=${finalization.status}${artifact}`;
|
|
1698
|
+
try {
|
|
1699
|
+
await dependencies.appendProjectLog({
|
|
1700
|
+
repoRoot: finalization.repoRoot,
|
|
1701
|
+
home: finalization.home,
|
|
1702
|
+
project: finalization.project,
|
|
1703
|
+
structural: true,
|
|
1704
|
+
producer: 'oat gate review',
|
|
1705
|
+
ref: finalization.ref,
|
|
1706
|
+
body,
|
|
1707
|
+
});
|
|
1708
|
+
}
|
|
1709
|
+
catch (error) {
|
|
1710
|
+
context.logger.warn(`Warning: unable to append oat gate review result to the project log: ${error instanceof Error ? error.message : String(error)}. Gate result is unchanged.`);
|
|
1711
|
+
}
|
|
1712
|
+
}
|
|
1657
1713
|
async function updateConfigLayer(context, layer, dependencies, mutate) {
|
|
1658
1714
|
const repoRoot = await dependencies.resolveProjectRoot(context.cwd);
|
|
1659
1715
|
const userConfigDir = join(context.home, '.oat');
|
|
@@ -1809,6 +1865,8 @@ async function runReviewGate(prompt, options, context, dependencies) {
|
|
|
1809
1865
|
let runMarkerPath;
|
|
1810
1866
|
let runMarkerWritten = false;
|
|
1811
1867
|
let branchLocalGateCli;
|
|
1868
|
+
let projectLogFinalization;
|
|
1869
|
+
let projectLogFinalized = false;
|
|
1812
1870
|
let postSelectionContext;
|
|
1813
1871
|
try {
|
|
1814
1872
|
const repoRoot = await dependencies.resolveProjectRoot(context.cwd);
|
|
@@ -1822,6 +1880,7 @@ async function runReviewGate(prompt, options, context, dependencies) {
|
|
|
1822
1880
|
const projectPath = reviewProject.path;
|
|
1823
1881
|
const targets = resolveExecTargets(effective);
|
|
1824
1882
|
const producerIdentity = await resolveReviewProducerIdentity({
|
|
1883
|
+
env: dependencies.processEnv,
|
|
1825
1884
|
explicit: options.producerIdentity,
|
|
1826
1885
|
repoRoot,
|
|
1827
1886
|
projectPath,
|
|
@@ -1854,6 +1913,16 @@ async function runReviewGate(prompt, options, context, dependencies) {
|
|
|
1854
1913
|
dispatchReport,
|
|
1855
1914
|
};
|
|
1856
1915
|
const threshold = parseReviewGateThreshold(options.exitNonzeroOn);
|
|
1916
|
+
projectLogFinalization = {
|
|
1917
|
+
repoRoot,
|
|
1918
|
+
home: context.home,
|
|
1919
|
+
project: projectPath,
|
|
1920
|
+
ref: options.reviewScope?.trim() || 'gate-review',
|
|
1921
|
+
target: selected.id,
|
|
1922
|
+
threshold,
|
|
1923
|
+
status: 'review_failed',
|
|
1924
|
+
exitCode: 1,
|
|
1925
|
+
};
|
|
1857
1926
|
const before = await listReviewGateArtifactCandidates({
|
|
1858
1927
|
repoRoot,
|
|
1859
1928
|
effective,
|
|
@@ -1902,7 +1971,7 @@ async function runReviewGate(prompt, options, context, dependencies) {
|
|
|
1902
1971
|
const childResult = await executeTarget(selected, [reviewPrompt], context, {
|
|
1903
1972
|
...dependencies,
|
|
1904
1973
|
processEnv: {
|
|
1905
|
-
...dependencies.processEnv,
|
|
1974
|
+
...reviewerChildProcessEnv(dependencies.processEnv),
|
|
1906
1975
|
OAT_GATE_HEADLESS: '1',
|
|
1907
1976
|
OAT_NON_INTERACTIVE: '1',
|
|
1908
1977
|
OAT_GATE_RUN_ID: runId,
|
|
@@ -1926,6 +1995,10 @@ async function runReviewGate(prompt, options, context, dependencies) {
|
|
|
1926
1995
|
if (!refusal) {
|
|
1927
1996
|
return false;
|
|
1928
1997
|
}
|
|
1998
|
+
if (projectLogFinalization) {
|
|
1999
|
+
projectLogFinalization.status = 'review_failed';
|
|
2000
|
+
projectLogFinalization.exitCode = 1;
|
|
2001
|
+
}
|
|
1929
2002
|
writeReviewGateExecutionFailure(context, {
|
|
1930
2003
|
runId,
|
|
1931
2004
|
target: selected.id,
|
|
@@ -1955,12 +2028,21 @@ async function runReviewGate(prompt, options, context, dependencies) {
|
|
|
1955
2028
|
before,
|
|
1956
2029
|
after,
|
|
1957
2030
|
});
|
|
2031
|
+
if (projectLogFinalization) {
|
|
2032
|
+
projectLogFinalization.artifactPath =
|
|
2033
|
+
artifactResolution.artifact?.path ??
|
|
2034
|
+
artifactResolution.diagnosticArtifact?.path;
|
|
2035
|
+
}
|
|
1958
2036
|
if (!artifactResolution.artifact && writeRefusalFailure()) {
|
|
1959
2037
|
return;
|
|
1960
2038
|
}
|
|
1961
2039
|
if (childExitCode !== 0 &&
|
|
1962
2040
|
!childResult.timedOut &&
|
|
1963
2041
|
!artifactResolution.artifact) {
|
|
2042
|
+
if (projectLogFinalization) {
|
|
2043
|
+
projectLogFinalization.status = 'review_failed';
|
|
2044
|
+
projectLogFinalization.exitCode = childExitCode;
|
|
2045
|
+
}
|
|
1964
2046
|
writeReviewGateExecutionFailure(context, {
|
|
1965
2047
|
runId,
|
|
1966
2048
|
target: selected.id,
|
|
@@ -1982,6 +2064,10 @@ async function runReviewGate(prompt, options, context, dependencies) {
|
|
|
1982
2064
|
if (childResult.timedOut &&
|
|
1983
2065
|
artifactResolution.matchingArtifactPaths.length === 0 &&
|
|
1984
2066
|
!artifactResolution.diagnosticArtifact) {
|
|
2067
|
+
if (projectLogFinalization) {
|
|
2068
|
+
projectLogFinalization.status = 'review_failed';
|
|
2069
|
+
projectLogFinalization.exitCode = childExitCode;
|
|
2070
|
+
}
|
|
1985
2071
|
writeReviewGateExecutionFailure(context, {
|
|
1986
2072
|
runId,
|
|
1987
2073
|
target: selected.id,
|
|
@@ -2017,6 +2103,10 @@ async function runReviewGate(prompt, options, context, dependencies) {
|
|
|
2017
2103
|
: initialTargetCorroboration.run === 'mismatched'
|
|
2018
2104
|
? `The changed review artifact did not carry the expected gate run ID ${runId}.`
|
|
2019
2105
|
: `No direct active project review artifact carried gate run ID ${runId}.`;
|
|
2106
|
+
if (projectLogFinalization) {
|
|
2107
|
+
projectLogFinalization.status = 'targeting_correlation_failed';
|
|
2108
|
+
projectLogFinalization.exitCode = 1;
|
|
2109
|
+
}
|
|
2020
2110
|
writeReviewGateTargetingFailure(context, {
|
|
2021
2111
|
runId,
|
|
2022
2112
|
target: selected.id,
|
|
@@ -2038,6 +2128,10 @@ async function runReviewGate(prompt, options, context, dependencies) {
|
|
|
2038
2128
|
if (writeRefusalFailure()) {
|
|
2039
2129
|
return;
|
|
2040
2130
|
}
|
|
2131
|
+
if (projectLogFinalization) {
|
|
2132
|
+
projectLogFinalization.status = 'targeting_correlation_failed';
|
|
2133
|
+
projectLogFinalization.exitCode = 1;
|
|
2134
|
+
}
|
|
2041
2135
|
writeReviewGateTargetingFailure(context, {
|
|
2042
2136
|
runId,
|
|
2043
2137
|
target: selected.id,
|
|
@@ -2062,6 +2156,10 @@ async function runReviewGate(prompt, options, context, dependencies) {
|
|
|
2062
2156
|
if (writeRefusalFailure()) {
|
|
2063
2157
|
return;
|
|
2064
2158
|
}
|
|
2159
|
+
if (projectLogFinalization) {
|
|
2160
|
+
projectLogFinalization.status = 'artifact_validation_failed';
|
|
2161
|
+
projectLogFinalization.exitCode = 1;
|
|
2162
|
+
}
|
|
2065
2163
|
writeReviewGateArtifactValidationFailure(context, {
|
|
2066
2164
|
runId,
|
|
2067
2165
|
target: selected.id,
|
|
@@ -2093,6 +2191,10 @@ async function runReviewGate(prompt, options, context, dependencies) {
|
|
|
2093
2191
|
return;
|
|
2094
2192
|
}
|
|
2095
2193
|
const detail = error instanceof Error ? error.message : String(error);
|
|
2194
|
+
if (projectLogFinalization) {
|
|
2195
|
+
projectLogFinalization.status = 'artifact_validation_failed';
|
|
2196
|
+
projectLogFinalization.exitCode = 1;
|
|
2197
|
+
}
|
|
2096
2198
|
writeReviewGateArtifactValidationFailure(context, {
|
|
2097
2199
|
runId,
|
|
2098
2200
|
target: selected.id,
|
|
@@ -2109,6 +2211,9 @@ async function runReviewGate(prompt, options, context, dependencies) {
|
|
|
2109
2211
|
process.exitCode = 1;
|
|
2110
2212
|
return;
|
|
2111
2213
|
}
|
|
2214
|
+
if (projectLogFinalization) {
|
|
2215
|
+
projectLogFinalization.counts = verdict.counts;
|
|
2216
|
+
}
|
|
2112
2217
|
const targetCorroboration = initialTargetCorroboration;
|
|
2113
2218
|
const corroboration = corroborateGateInvocation(gateInvocation, verdict.gateInvocation, targetCorroboration);
|
|
2114
2219
|
if (corroboration.run !== 'matched' ||
|
|
@@ -2118,6 +2223,10 @@ async function runReviewGate(prompt, options, context, dependencies) {
|
|
|
2118
2223
|
}
|
|
2119
2224
|
const missing = corroboration.run === 'missing' ||
|
|
2120
2225
|
corroboration.invocation === 'missing';
|
|
2226
|
+
if (projectLogFinalization) {
|
|
2227
|
+
projectLogFinalization.status = 'artifact_validation_failed';
|
|
2228
|
+
projectLogFinalization.exitCode = 1;
|
|
2229
|
+
}
|
|
2121
2230
|
writeReviewGateArtifactValidationFailure(context, {
|
|
2122
2231
|
runId,
|
|
2123
2232
|
target: selected.id,
|
|
@@ -2140,6 +2249,10 @@ async function runReviewGate(prompt, options, context, dependencies) {
|
|
|
2140
2249
|
if (writeRefusalFailure()) {
|
|
2141
2250
|
return;
|
|
2142
2251
|
}
|
|
2252
|
+
if (projectLogFinalization) {
|
|
2253
|
+
projectLogFinalization.status = 'artifact_validation_failed';
|
|
2254
|
+
projectLogFinalization.exitCode = 1;
|
|
2255
|
+
}
|
|
2143
2256
|
writeReviewGateArtifactValidationFailure(context, {
|
|
2144
2257
|
runId,
|
|
2145
2258
|
target: selected.id,
|
|
@@ -2163,6 +2276,12 @@ async function runReviewGate(prompt, options, context, dependencies) {
|
|
|
2163
2276
|
threshold,
|
|
2164
2277
|
blocking,
|
|
2165
2278
|
});
|
|
2279
|
+
if (projectLogFinalization) {
|
|
2280
|
+
projectLogFinalization.status = blocking ? 'blocked' : 'ok';
|
|
2281
|
+
projectLogFinalization.exitCode = blocking ? 1 : 0;
|
|
2282
|
+
projectLogFinalization.counts = verdict.counts;
|
|
2283
|
+
projectLogFinalization.artifactPath = producedArtifact.path;
|
|
2284
|
+
}
|
|
2166
2285
|
writeReviewGateResult(context, {
|
|
2167
2286
|
status: blocking ? 'blocked' : 'ok',
|
|
2168
2287
|
runId,
|
|
@@ -2200,11 +2319,19 @@ async function runReviewGate(prompt, options, context, dependencies) {
|
|
|
2200
2319
|
}
|
|
2201
2320
|
}
|
|
2202
2321
|
finally {
|
|
2203
|
-
|
|
2204
|
-
|
|
2322
|
+
try {
|
|
2323
|
+
if (branchLocalGateCli) {
|
|
2324
|
+
await dependencies.removeBranchLocalGateCli(branchLocalGateCli);
|
|
2325
|
+
}
|
|
2326
|
+
if (runMarkerPath) {
|
|
2327
|
+
await dependencies.removeGateRunMarker(runMarkerPath, (message) => context.logger.warn(message));
|
|
2328
|
+
}
|
|
2205
2329
|
}
|
|
2206
|
-
|
|
2207
|
-
|
|
2330
|
+
finally {
|
|
2331
|
+
if (projectLogFinalization && !projectLogFinalized) {
|
|
2332
|
+
projectLogFinalized = true;
|
|
2333
|
+
await finalizeReviewGateProjectLog(context, dependencies, projectLogFinalization);
|
|
2334
|
+
}
|
|
2208
2335
|
}
|
|
2209
2336
|
}
|
|
2210
2337
|
}
|
|
@@ -28,7 +28,7 @@ interface InitDependencies {
|
|
|
28
28
|
loadManifest: (manifestPath: string) => Promise<Manifest>;
|
|
29
29
|
saveManifest: (manifestPath: string, manifest: Manifest) => Promise<void>;
|
|
30
30
|
scanCanonical: (scopeRoot: string, scope: ConcreteScope) => Promise<CanonicalEntry[]>;
|
|
31
|
-
collectStrays: (scopeRoot: string, scope: ConcreteScope, manifest: Manifest, canonicalEntries: CanonicalEntry[], activeAdapters?: ProviderAdapter[]) => Promise<InitStrayCandidate[]>;
|
|
31
|
+
collectStrays: (scopeRoot: string, scope: ConcreteScope, manifest: Manifest, canonicalEntries: CanonicalEntry[], activeAdapters?: ProviderAdapter[], userConfigDir?: string) => Promise<InitStrayCandidate[]>;
|
|
32
32
|
confirmAction: (message: string, ctx: PromptContext) => Promise<boolean>;
|
|
33
33
|
selectManyWithAbort: <T extends string>(message: string, choices: MultiSelectChoice<T>[], ctx: PromptContext) => Promise<T[] | null>;
|
|
34
34
|
selectProvidersWithAbort: <T extends string>(message: string, choices: MultiSelectChoice<T>[], ctx: PromptContext) => Promise<T[] | null>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/init/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,aAAa,EAEnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,KAAK,kBAAkB,EAExB,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/init/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@ import { applyOatCoreGitignore, } from '../init/gitignore.js';
|
|
|
6
6
|
import { applyGitignore } from '../local/apply.js';
|
|
7
7
|
import { addLocalPaths } from '../local/manage.js';
|
|
8
8
|
import { adoptStrayToCanonical, isAdoptionConflictError, } from '../shared/adopt-stray.js';
|
|
9
|
-
import { detectCodexRoleStrays, regenerateCodexAfterAdoption, } from '../shared/codex-strays.js';
|
|
9
|
+
import { detectCodexRoleStrays, filterMaterializationManagedStrays, regenerateCodexAfterAdoption, } from '../shared/codex-strays.js';
|
|
10
10
|
import { PROVIDER_CONFIG_REMEDIATION } from '../shared/messages.js';
|
|
11
11
|
import { withScopeOption } from '../shared/scope-option.js';
|
|
12
12
|
import { confirmAction, inputWithDefault, selectManyWithAbort, selectWithAbort, } from '../shared/shared.prompts.js';
|
|
@@ -14,7 +14,7 @@ import { readGlobalOptions, resolveConcreteScopes, } from '../shared/shared.util
|
|
|
14
14
|
import { DEFAULT_SYNC_CONFIG, loadSyncConfig, saveSyncConfig, } from '../../config/index.js';
|
|
15
15
|
import { detectDefaultBranch, readUserConfig, readOatConfig, resolveLocalPaths, writeOatConfig, } from '../../config/oat-config.js';
|
|
16
16
|
import { detectStrays, filterKnownStrays, } from '../../drift/index.js';
|
|
17
|
-
import { configureLocalHooksPath, getHookInstallInfo, installHook, isHookInstalled, scanCanonical, uninstallHook, } from '../../engine/index.js';
|
|
17
|
+
import { configureLocalHooksPath, getHookInstallInfo, installHook, isHookInstalled, scanBundledManagedAgents, scanCanonical, uninstallHook, } from '../../engine/index.js';
|
|
18
18
|
import { dirExists, fileExists } from '../../fs/io.js';
|
|
19
19
|
import { resolveProjectRoot, resolveScopeRoot } from '../../fs/paths.js';
|
|
20
20
|
import { normalizeToPosixPath } from '../../fs/paths.js';
|
|
@@ -24,6 +24,7 @@ import { codexAdapter } from '../../providers/codex/index.js';
|
|
|
24
24
|
import { applyCodexProjectExtensionPlan, computeCodexProjectExtensionPlan, } from '../../providers/codex/codec/sync-extension.js';
|
|
25
25
|
import { copilotAdapter } from '../../providers/copilot/index.js';
|
|
26
26
|
import { cursorAdapter } from '../../providers/cursor/index.js';
|
|
27
|
+
import { applyCursorProjectExtensionPlan, computeCursorProjectExtensionPlan, } from '../../providers/cursor/codec/sync-extension.js';
|
|
27
28
|
import { geminiAdapter } from '../../providers/gemini/index.js';
|
|
28
29
|
import { getActiveAdapters, getConfigAwareAdapters, getSyncMappings, } from '../../providers/shared/index.js';
|
|
29
30
|
import { Command } from 'commander';
|
|
@@ -49,15 +50,43 @@ async function ensureCanonicalDirectories(scopeRoot, scope) {
|
|
|
49
50
|
await mkdir(join(scopeRoot, '.agents', 'rules'), { recursive: true });
|
|
50
51
|
}
|
|
51
52
|
}
|
|
52
|
-
async function collectStraysDefault(scopeRoot, scope, manifest, canonicalEntries, activeAdapters) {
|
|
53
|
+
async function collectStraysDefault(scopeRoot, scope, manifest, canonicalEntries, activeAdapters, userConfigDir = join(scopeRoot, '.oat')) {
|
|
53
54
|
const adaptersToScan = activeAdapters ??
|
|
54
55
|
(await getActiveAdapters(getDefaultAdapters(), scopeRoot));
|
|
55
56
|
const candidates = [];
|
|
57
|
+
const hasMaterializationAdapter = adaptersToScan.some((adapter) => adapter.name === 'codex' || adapter.name === 'cursor');
|
|
58
|
+
const materializationCanonicalEntries = scope === 'user' && hasMaterializationAdapter
|
|
59
|
+
? [...canonicalEntries, ...(await scanBundledManagedAgents())]
|
|
60
|
+
: canonicalEntries;
|
|
61
|
+
const codexExtensionPlan = adaptersToScan.some((adapter) => adapter.name === 'codex')
|
|
62
|
+
? await computeCodexProjectExtensionPlan(scopeRoot, materializationCanonicalEntries, undefined, { userConfigDir })
|
|
63
|
+
: undefined;
|
|
64
|
+
const cursorExtensionPlan = adaptersToScan.some((adapter) => adapter.name === 'cursor')
|
|
65
|
+
? await computeCursorProjectExtensionPlan(scopeRoot, materializationCanonicalEntries, undefined, { userConfigDir })
|
|
66
|
+
: undefined;
|
|
67
|
+
const materializationPlans = [
|
|
68
|
+
...(codexExtensionPlan
|
|
69
|
+
? [
|
|
70
|
+
{
|
|
71
|
+
provider: 'codex',
|
|
72
|
+
operations: codexExtensionPlan.operations.map((operation) => ({
|
|
73
|
+
...operation,
|
|
74
|
+
provider: 'codex',
|
|
75
|
+
entryName: operation.roleName,
|
|
76
|
+
})),
|
|
77
|
+
managedEntries: codexExtensionPlan.managedRoles,
|
|
78
|
+
aggregateHash: codexExtensionPlan.aggregateConfigHash,
|
|
79
|
+
metadata: codexExtensionPlan.metadata,
|
|
80
|
+
},
|
|
81
|
+
]
|
|
82
|
+
: []),
|
|
83
|
+
...(cursorExtensionPlan ? [cursorExtensionPlan] : []),
|
|
84
|
+
];
|
|
56
85
|
for (const adapter of adaptersToScan) {
|
|
57
86
|
const mappings = getSyncMappings(adapter, scope);
|
|
58
87
|
for (const mapping of mappings) {
|
|
59
88
|
const providerDir = join(scopeRoot, mapping.providerDir);
|
|
60
|
-
const strays = await detectStrays(adapter.name, providerDir, manifest, canonicalEntries, mapping);
|
|
89
|
+
const strays = filterMaterializationManagedStrays((await detectStrays(adapter.name, providerDir, manifest, canonicalEntries, mapping)).map((report) => ({ provider: adapter.name, report })), materializationPlans).map((candidate) => candidate.report);
|
|
61
90
|
for (const report of strays) {
|
|
62
91
|
if (report.state.status !== 'stray') {
|
|
63
92
|
continue;
|
|
@@ -70,9 +99,7 @@ async function collectStraysDefault(scopeRoot, scope, manifest, canonicalEntries
|
|
|
70
99
|
}
|
|
71
100
|
}
|
|
72
101
|
}
|
|
73
|
-
if (
|
|
74
|
-
adaptersToScan.some((adapter) => adapter.name === 'codex')) {
|
|
75
|
-
const codexExtensionPlan = await computeCodexProjectExtensionPlan(scopeRoot, canonicalEntries);
|
|
102
|
+
if (adaptersToScan.some((adapter) => adapter.name === 'codex')) {
|
|
76
103
|
const codexStrays = await detectCodexRoleStrays(scopeRoot, canonicalEntries, new Set(codexExtensionPlan.managedRoles));
|
|
77
104
|
for (const stray of codexStrays) {
|
|
78
105
|
candidates.push({
|
|
@@ -481,7 +508,7 @@ async function runInitCommand(context, dependencies, hookFlag, setupFlag) {
|
|
|
481
508
|
manifest = createEmptyManifest();
|
|
482
509
|
}
|
|
483
510
|
const canonicalEntries = await dependencies.scanCanonical(scopeRoot, scope);
|
|
484
|
-
const collectedStrays = await dependencies.collectStrays(scopeRoot, scope, manifest, canonicalEntries, activeAdaptersForStrays);
|
|
511
|
+
const collectedStrays = await dependencies.collectStrays(scopeRoot, scope, manifest, canonicalEntries, activeAdaptersForStrays, userConfigDir);
|
|
485
512
|
const { candidates: strays } = filterKnownStrays({
|
|
486
513
|
reports: collectedStrays.map((stray) => stray.report),
|
|
487
514
|
candidates: collectedStrays,
|
|
@@ -535,6 +562,11 @@ async function runInitCommand(context, dependencies, hookFlag, setupFlag) {
|
|
|
535
562
|
computeExtensionPlan: computeCodexProjectExtensionPlan,
|
|
536
563
|
applyExtensionPlan: applyCodexProjectExtensionPlan,
|
|
537
564
|
});
|
|
565
|
+
if (activeAdaptersForStrays?.some((adapter) => adapter.name === 'cursor')) {
|
|
566
|
+
const refreshedCanonical = await dependencies.scanCanonical(scopeRoot, scope);
|
|
567
|
+
const cursorPlan = await computeCursorProjectExtensionPlan(scopeRoot, refreshedCanonical, undefined, { userConfigDir });
|
|
568
|
+
await applyCursorProjectExtensionPlan(scopeRoot, cursorPlan);
|
|
569
|
+
}
|
|
538
570
|
}
|
|
539
571
|
if (straysAdopted > 0) {
|
|
540
572
|
context.logger.success(`Adopted ${straysAdopted} stray entr${straysAdopted === 1 ? 'y' : 'ies'} [${scope}].`);
|
|
@@ -13,7 +13,7 @@ export declare const PACK_METADATA: Record<string, PackMetadata>;
|
|
|
13
13
|
export declare function resolvePackDefaultScope(packName: string): 'user' | 'project';
|
|
14
14
|
export declare const WORKFLOW_SKILLS: readonly ["oat-cursor-cloud-projects", "oat-project-autonomous", "oat-project-capture", "oat-project-clear-active", "oat-project-complete", "oat-project-design", "oat-project-dispatch-subagents", "oat-project-discover", "oat-project-document", "oat-project-implement", "oat-project-import-plan", "oat-project-new", "oat-project-next", "oat-project-open", "oat-project-plan", "oat-project-plan-writing", "oat-project-pr-final", "oat-project-pr-progress", "oat-project-progress", "oat-project-promote-spec-driven", "oat-project-quick-start", "oat-project-reconcile", "oat-project-revise", "oat-project-review-provide", "oat-project-review-provide-remote", "oat-project-review-receive", "oat-project-review-receive-remote", "oat-project-spec", "oat-project-split", "oat-project-summary", "oat-repo-knowledge-index", "oat-worktree-bootstrap", "oat-worktree-bootstrap-auto", "oat-wrap-up"];
|
|
15
15
|
export declare const WORKFLOW_AGENTS: readonly ["oat-codebase-mapper.md", "oat-phase-implementer.md", "oat-reviewer.md"];
|
|
16
|
-
export declare const WORKFLOW_TEMPLATES: readonly ["state.md", "discovery.md", "spec.md", "design.md", "plan.md", "implementation.md", "summary.md"];
|
|
16
|
+
export declare const WORKFLOW_TEMPLATES: readonly ["state.md", "discovery.md", "spec.md", "design.md", "plan.md", "implementation.md", "summary.md", "project-log.md"];
|
|
17
17
|
export declare const WORKFLOW_SCRIPTS: readonly ["generate-oat-state.sh", "generate-thin-index.sh", "resolve-tracking.sh"];
|
|
18
18
|
export declare const IDEA_SKILLS: readonly ["oat-idea-new", "oat-idea-ideate", "oat-idea-summarize", "oat-idea-scratchpad"];
|
|
19
19
|
export declare const CORE_SKILLS: readonly ["oat-docs", "oat-doctor"];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-manifest.d.ts","sourceRoot":"","sources":["../../../../../src/commands/init/tools/shared/skill-manifest.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAgBH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;CAClC;AAED,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAKtD,CAAC;AAEF,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE5E;AAID,eAAO,MAAM,eAAe,s3BAmClB,CAAC;AAEX,eAAO,MAAM,eAAe,oFAIlB,CAAC;AAEX,eAAO,MAAM,kBAAkB,
|
|
1
|
+
{"version":3,"file":"skill-manifest.d.ts","sourceRoot":"","sources":["../../../../../src/commands/init/tools/shared/skill-manifest.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAgBH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;CAClC;AAED,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAKtD,CAAC;AAEF,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE5E;AAID,eAAO,MAAM,eAAe,s3BAmClB,CAAC;AAEX,eAAO,MAAM,eAAe,oFAIlB,CAAC;AAEX,eAAO,MAAM,kBAAkB,+HASrB,CAAC;AAEX,eAAO,MAAM,gBAAgB,qFAInB,CAAC;AAIX,eAAO,MAAM,WAAW,2FAKd,CAAC;AAIX,eAAO,MAAM,WAAW,qCAAsC,CAAC;AAI/D,eAAO,MAAM,WAAW,iLAQd,CAAC;AAEX,eAAO,MAAM,YAAY,kCAAmC,CAAC;AAI7D,eAAO,MAAM,cAAc,2NASjB,CAAC;AAIX,eAAO,MAAM,yBAAyB,sHAK5B,CAAC;AAEX,eAAO,MAAM,4BAA4B,yIAQ/B,CAAC;AAEX,eAAO,MAAM,0BAA0B,aAAc,CAAC;AAItD,eAAO,MAAM,iBAAiB,6BAA8B,CAAC;AAI7D,eAAO,MAAM,eAAe,2EAMlB,CAAC;AAEX,eAAO,MAAM,eAAe,qCAAsC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/project/dispatch-ceiling/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,sBAAsB,CAAC;AAa9B,OAAO,EAUL,KAAK,uBAAuB,EAY7B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAEL,KAAK,cAAc,EAEpB,MAAM,iBAAiB,CAAC;AAsBzB,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAiC5C,UAAU,2BAA2B;IACnC,mBAAmB,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,cAAc,CAAC;IAChE,kBAAkB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,sBAAsB,EAAE,CACtB,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,GAAG,EAAE,MAAM,CAAC,UAAU,KACnB,OAAO,CAAC,cAAc,CAAC,CAAC;IAC7B,oBAAoB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAC7E,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5C,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/C,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC;CAC/B;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/project/dispatch-ceiling/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,sBAAsB,CAAC;AAa9B,OAAO,EAUL,KAAK,uBAAuB,EAY7B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAEL,KAAK,cAAc,EAEpB,MAAM,iBAAiB,CAAC;AAsBzB,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAiC5C,UAAU,2BAA2B;IACnC,mBAAmB,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,cAAc,CAAC;IAChE,kBAAkB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,sBAAsB,EAAE,CACtB,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,GAAG,EAAE,MAAM,CAAC,UAAU,KACnB,OAAO,CAAC,cAAc,CAAC,CAAC;IAC7B,oBAAoB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAC7E,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5C,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/C,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC;CAC/B;AAmnFD,wBAAgB,mCAAmC,CACjD,SAAS,GAAE,OAAO,CAAC,2BAA2B,CAAM,GACnD,OAAO,CAkGT"}
|
|
@@ -210,10 +210,10 @@ function uncappedPreferredTier(provider, role, preferredValue) {
|
|
|
210
210
|
}
|
|
211
211
|
function dispatchValueFromRouteTarget(target) {
|
|
212
212
|
const adapter = getCeilingAdapter(target.harness);
|
|
213
|
-
if (adapter.
|
|
213
|
+
if (adapter.selectionAxis === 'model-effort') {
|
|
214
214
|
return target.effort ?? null;
|
|
215
215
|
}
|
|
216
|
-
if (adapter.
|
|
216
|
+
if (adapter.selectionAxis === 'model' || adapter.selectionAxis === 'tier') {
|
|
217
217
|
return target.model ?? null;
|
|
218
218
|
}
|
|
219
219
|
return null;
|
|
@@ -226,7 +226,7 @@ function routeTargetFromBareValue(provider, value, routeIndex, routeLength) {
|
|
|
226
226
|
routeIndex,
|
|
227
227
|
routeLength,
|
|
228
228
|
};
|
|
229
|
-
if (adapter.
|
|
229
|
+
if (adapter.selectionAxis === 'model-effort') {
|
|
230
230
|
target.effort = value;
|
|
231
231
|
}
|
|
232
232
|
else {
|
|
@@ -398,13 +398,15 @@ function candidatePrimaryTarget(provider, tier, candidate) {
|
|
|
398
398
|
throw new Error(`Malformed ${provider} candidate ordering in ${tier}: direct dispatch role names are not candidate models.`);
|
|
399
399
|
}
|
|
400
400
|
const targetAdapter = getCeilingAdapter(target.harness);
|
|
401
|
-
if (targetAdapter.
|
|
401
|
+
if (targetAdapter.selectionAxis === 'model-effort' &&
|
|
402
402
|
(!target.model ||
|
|
403
403
|
!target.effort ||
|
|
404
404
|
!CODEX_VALUES.includes(target.effort))) {
|
|
405
405
|
throw new Error(`Malformed ${provider} candidate ordering in ${tier}: Codex candidates require a model and supported effort.`);
|
|
406
406
|
}
|
|
407
|
-
if (targetAdapter.
|
|
407
|
+
if ((targetAdapter.selectionAxis === 'model' ||
|
|
408
|
+
targetAdapter.selectionAxis === 'tier') &&
|
|
409
|
+
!target.model) {
|
|
408
410
|
throw new Error(`Malformed ${provider} candidate ordering in ${tier}: model-argument candidates require a model.`);
|
|
409
411
|
}
|
|
410
412
|
return target;
|
|
@@ -1053,7 +1055,7 @@ function selectDispatchValue(provider, role, policy, preferredValue) {
|
|
|
1053
1055
|
target: selectedTarget,
|
|
1054
1056
|
};
|
|
1055
1057
|
}
|
|
1056
|
-
function
|
|
1058
|
+
function hasVariantDispatchArgs(dispatchArgs) {
|
|
1057
1059
|
return (dispatchArgs !== null &&
|
|
1058
1060
|
'variant' in dispatchArgs &&
|
|
1059
1061
|
typeof dispatchArgs.variant === 'string' &&
|
|
@@ -1065,20 +1067,26 @@ function hasModelDispatchArgs(dispatchArgs) {
|
|
|
1065
1067
|
typeof dispatchArgs.model === 'string' &&
|
|
1066
1068
|
dispatchArgs.model.length > 0);
|
|
1067
1069
|
}
|
|
1068
|
-
function modelAxis(selection, dispatchArgs) {
|
|
1070
|
+
function modelAxis(provider, selection, dispatchArgs) {
|
|
1069
1071
|
if (selection.target?.model && dispatchArgs) {
|
|
1070
1072
|
return `selected:${selection.target.model}`;
|
|
1071
1073
|
}
|
|
1072
1074
|
if (hasModelDispatchArgs(dispatchArgs)) {
|
|
1073
1075
|
return `selected:${dispatchArgs.model}`;
|
|
1074
1076
|
}
|
|
1077
|
+
if (provider === 'cursor' &&
|
|
1078
|
+
hasVariantDispatchArgs(dispatchArgs) &&
|
|
1079
|
+
selection.target === null &&
|
|
1080
|
+
selection.selectedValue) {
|
|
1081
|
+
return `selected:${selection.selectedValue}`;
|
|
1082
|
+
}
|
|
1075
1083
|
if (selection.selectionMode === 'inherit-default') {
|
|
1076
1084
|
return 'inherited';
|
|
1077
1085
|
}
|
|
1078
1086
|
return 'unresolved';
|
|
1079
1087
|
}
|
|
1080
1088
|
function codexEffortAxis(selection, dispatchArgs) {
|
|
1081
|
-
if (
|
|
1089
|
+
if (hasVariantDispatchArgs(dispatchArgs) && selection.target?.effort) {
|
|
1082
1090
|
return `selected:${selection.target.effort}`;
|
|
1083
1091
|
}
|
|
1084
1092
|
if (selection.selectionMode === 'inherit-default' ||
|
|
@@ -1149,7 +1157,7 @@ function buildProviderResolution(provider, policy, role, orchestratorTier, prefe
|
|
|
1149
1157
|
mode,
|
|
1150
1158
|
mechanism: adapter.mechanism,
|
|
1151
1159
|
dispatchArgs,
|
|
1152
|
-
modelAxis: modelAxis(selection, dispatchArgs),
|
|
1160
|
+
modelAxis: modelAxis(provider, selection, dispatchArgs),
|
|
1153
1161
|
effortAxis: provider === 'codex'
|
|
1154
1162
|
? codexEffortAxis(selection, dispatchArgs)
|
|
1155
1163
|
: 'not-applicable',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/project/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/project/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBpC,wBAAgB,oBAAoB,IAAI,OAAO,CAgB9C"}
|
|
@@ -4,6 +4,7 @@ import { createProjectCompleteDiscoveryCommand } from './complete-discovery/inde
|
|
|
4
4
|
import { createProjectCompleteStateCommand } from './complete-state/index.js';
|
|
5
5
|
import { createProjectDispatchCeilingCommand } from './dispatch-ceiling/index.js';
|
|
6
6
|
import { createProjectListCommand } from './list.js';
|
|
7
|
+
import { createProjectLogCommand } from './log/index.js';
|
|
7
8
|
import { createProjectNewCommand } from './new/index.js';
|
|
8
9
|
import { createProjectOpenCommand } from './open/index.js';
|
|
9
10
|
import { createProjectPauseCommand } from './pause/index.js';
|
|
@@ -19,6 +20,7 @@ export function createProjectCommand() {
|
|
|
19
20
|
.addCommand(createProjectCompleteStateCommand())
|
|
20
21
|
.addCommand(createProjectDispatchCeilingCommand())
|
|
21
22
|
.addCommand(createProjectListCommand())
|
|
23
|
+
.addCommand(createProjectLogCommand())
|
|
22
24
|
.addCommand(createProjectNewCommand())
|
|
23
25
|
.addCommand(createProjectOpenCommand())
|
|
24
26
|
.addCommand(createProjectPauseCommand())
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { type CommandContext, type GlobalOptions } from '../../../app/command-context.js';
|
|
2
|
+
import { type ActiveProjectResolution } from '../../../config/oat-config.js';
|
|
3
|
+
import { type ResolvedConfig } from '../../../config/resolve.js';
|
|
4
|
+
import { Command } from 'commander';
|
|
5
|
+
export interface AppendProjectLogInput {
|
|
6
|
+
repoRoot: string;
|
|
7
|
+
home?: string;
|
|
8
|
+
project?: string;
|
|
9
|
+
structural?: boolean;
|
|
10
|
+
type?: string;
|
|
11
|
+
scope?: string;
|
|
12
|
+
area?: string;
|
|
13
|
+
producer?: string;
|
|
14
|
+
ref?: string;
|
|
15
|
+
body?: string;
|
|
16
|
+
versionNote?: string;
|
|
17
|
+
}
|
|
18
|
+
export type ProjectLogAppendResult = {
|
|
19
|
+
status: 'appended';
|
|
20
|
+
logPath: string;
|
|
21
|
+
heading: string;
|
|
22
|
+
created: boolean;
|
|
23
|
+
} | {
|
|
24
|
+
status: 'skipped';
|
|
25
|
+
reason: 'projectLog=false';
|
|
26
|
+
};
|
|
27
|
+
export interface AppendProjectLogDependencies {
|
|
28
|
+
resolveActiveProject: (repoRoot: string) => Promise<ActiveProjectResolution>;
|
|
29
|
+
resolveEffectiveConfig: (repoRoot: string, userConfigDir: string, env?: NodeJS.ProcessEnv) => Promise<ResolvedConfig>;
|
|
30
|
+
resolveAssetsRoot: () => Promise<string>;
|
|
31
|
+
now: () => Date;
|
|
32
|
+
}
|
|
33
|
+
export interface ProjectLogAppendCommandDependencies extends AppendProjectLogDependencies {
|
|
34
|
+
buildCommandContext: (options: GlobalOptions) => CommandContext;
|
|
35
|
+
resolveProjectRoot: (cwd: string) => Promise<string>;
|
|
36
|
+
readStdin: () => Promise<string>;
|
|
37
|
+
}
|
|
38
|
+
export declare function instantiateProjectLogTemplate(template: string, projectName: string, date: string): string;
|
|
39
|
+
export declare function appendProjectLog(input: AppendProjectLogInput, overrides?: Partial<AppendProjectLogDependencies>): Promise<ProjectLogAppendResult>;
|
|
40
|
+
export declare function createProjectLogAppendCommand(overrides?: Partial<ProjectLogAppendCommandDependencies>): Command;
|
|
41
|
+
//# sourceMappingURL=append.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"append.d.ts","sourceRoot":"","sources":["../../../../src/commands/project/log/append.ts"],"names":[],"mappings":"AAIA,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAEL,KAAK,uBAAuB,EAC7B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAA0B,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAI9E,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkBpC,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,sBAAsB,GAC9B;IACE,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;CAClB,GACD;IACE,MAAM,EAAE,SAAS,CAAC;IAClB,MAAM,EAAE,kBAAkB,CAAC;CAC5B,CAAC;AAEN,MAAM,WAAW,4BAA4B;IAC3C,oBAAoB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAC7E,sBAAsB,EAAE,CACtB,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,KACpB,OAAO,CAAC,cAAc,CAAC,CAAC;IAC7B,iBAAiB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,GAAG,EAAE,MAAM,IAAI,CAAC;CACjB;AAqBD,MAAM,WAAW,mCAAoC,SAAQ,4BAA4B;IACvF,mBAAmB,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,cAAc,CAAC;IAChE,kBAAkB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,SAAS,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;CAClC;AA4LD,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,GACX,MAAM,CAOR;AAiCD,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,qBAAqB,EAC5B,SAAS,GAAE,OAAO,CAAC,4BAA4B,CAAM,GACpD,OAAO,CAAC,sBAAsB,CAAC,CAoCjC;AAsCD,wBAAgB,6BAA6B,CAC3C,SAAS,GAAE,OAAO,CAAC,mCAAmC,CAAM,GAC3D,OAAO,CA8CT"}
|