@open-agent-toolkit/cli 0.3.37 → 0.3.39
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 +2 -2
- package/assets/bundle-metadata.json +1 -1
- package/assets/docs/getting-started/bootstrap.md +15 -16
- package/assets/docs/getting-started/tool-packs.md +15 -14
- package/assets/docs/provider-sync/commands.md +6 -5
- package/assets/docs/provider-sync/manifest-and-drift.md +26 -19
- package/assets/docs/provider-sync/pilot-with-a-team.md +17 -17
- package/assets/docs/provider-sync/providers.md +4 -4
- package/assets/docs/provider-sync/scope-and-surface.md +5 -5
- package/assets/docs/reference/cli-reference.md +8 -5
- package/assets/docs/reference/oat-directory-structure.md +1 -1
- package/assets/docs/reference/project-artifacts.md +12 -3
- package/assets/docs/reference/troubleshooting.md +4 -5
- package/assets/docs/reference/what-oat-writes.md +54 -59
- package/assets/docs/skills/repo-improve.md +23 -19
- package/assets/docs/workflows/advanced/workflow-gates.md +7 -1
- package/assets/docs/workflows/projects/closeout/closeout-skills.md +9 -6
- package/assets/docs/workflows/projects/execution/execution-skills.md +1 -2
- package/assets/docs/workflows/projects/execution/implementation-execution.md +3 -2
- package/assets/docs/workflows/projects/lifecycle.md +3 -1
- package/assets/public-package-versions.json +4 -4
- package/assets/skills/oat-project-brief/SKILL.md +1 -1
- package/assets/skills/oat-project-brief/references/brief-contract.md +32 -9
- package/assets/skills/oat-project-complete/SKILL.md +17 -7
- package/assets/skills/oat-project-implement/SKILL.md +2 -2
- package/assets/skills/oat-project-implement/references/completion-and-closeout.md +14 -4
- package/assets/skills/oat-project-pr-final/SKILL.md +2 -2
- package/assets/skills/oat-project-pr-progress/SKILL.md +23 -12
- package/assets/skills/oat-repo-knowledge-index/SKILL.md +226 -131
- package/dist/commands/doctor/index.d.ts.map +1 -1
- package/dist/commands/doctor/index.js +5 -2
- package/dist/commands/init/index.d.ts.map +1 -1
- package/dist/commands/init/index.js +10 -5
- package/dist/commands/init/tools/index.d.ts.map +1 -1
- package/dist/commands/init/tools/index.js +106 -28
- package/dist/commands/init/tools/project-guidance.js +1 -1
- package/dist/commands/project/closeout-check/index.d.ts.map +1 -1
- package/dist/commands/project/closeout-check/index.js +4 -8
- package/dist/commands/project/delivery/check.d.ts.map +1 -1
- package/dist/commands/project/delivery/check.js +32 -14
- package/dist/commands/project/delivery/evidence.d.ts +39 -0
- package/dist/commands/project/delivery/evidence.d.ts.map +1 -1
- package/dist/commands/project/delivery/evidence.js +163 -17
- package/dist/commands/project/delivery/refresh.d.ts.map +1 -1
- package/dist/commands/project/delivery/refresh.js +13 -16
- package/dist/commands/project/journal-check/index.d.ts +2 -0
- package/dist/commands/project/journal-check/index.d.ts.map +1 -1
- package/dist/commands/project/journal-check/index.js +78 -1
- package/dist/commands/project/journal-check/types.d.ts +1 -1
- package/dist/commands/project/journal-check/types.d.ts.map +1 -1
- package/dist/commands/project/new/index.d.ts.map +1 -1
- package/dist/commands/project/new/index.js +1 -0
- package/dist/commands/project/new/scaffold.d.ts +1 -1
- package/dist/commands/project/new/scaffold.d.ts.map +1 -1
- package/dist/commands/project/new/scaffold.js +1 -1
- package/dist/commands/providers/codex/materialize.d.ts +5 -1
- package/dist/commands/providers/codex/materialize.d.ts.map +1 -1
- package/dist/commands/providers/codex/materialize.js +6 -1
- package/dist/commands/shared/exact-path-commit.d.ts.map +1 -1
- package/dist/commands/shared/exact-path-commit.js +11 -1
- package/dist/commands/shared/scope-option.d.ts +3 -1
- package/dist/commands/shared/scope-option.d.ts.map +1 -1
- package/dist/commands/shared/scope-option.js +4 -2
- package/dist/commands/status/index.d.ts.map +1 -1
- package/dist/commands/status/index.js +4 -1
- package/dist/commands/tools/install/index.d.ts.map +1 -1
- package/dist/commands/tools/install/index.js +1 -1
- package/dist/commands/tools/shared/pack-lifecycle-outcome.d.ts +11 -0
- package/dist/commands/tools/shared/pack-lifecycle-outcome.d.ts.map +1 -1
- package/dist/commands/tools/shared/pack-lifecycle-outcome.js +16 -0
- package/dist/config/oat-config.d.ts +6 -1
- package/dist/config/oat-config.d.ts.map +1 -1
- package/dist/config/oat-config.js +14 -22
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -0
- package/dist/providers/codex/codec/config-merge.d.ts +19 -0
- package/dist/providers/codex/codec/config-merge.d.ts.map +1 -1
- package/dist/providers/codex/codec/config-merge.js +75 -8
- package/dist/providers/codex/codec/sync-extension.d.ts.map +1 -1
- package/dist/providers/codex/codec/sync-extension.js +84 -38
- package/dist/providers/cursor/codec/materialize.d.ts.map +1 -1
- package/dist/providers/cursor/codec/materialize.js +17 -1
- package/package.json +3 -3
|
@@ -596,6 +596,12 @@ function readReviewRows(lines) {
|
|
|
596
596
|
function placeholder(cell) {
|
|
597
597
|
return cell === '' || cell === '-' || cell === '—';
|
|
598
598
|
}
|
|
599
|
+
function reviewArtifactPath(cell) {
|
|
600
|
+
const artifact = cell.replace(/^\.\//, '');
|
|
601
|
+
return (!posix.isAbsolute(artifact) &&
|
|
602
|
+
posix.normalize(artifact) === artifact &&
|
|
603
|
+
artifact.startsWith('reviews/'));
|
|
604
|
+
}
|
|
599
605
|
/**
|
|
600
606
|
* Review rows record evidence: rows may be added and their status, date and
|
|
601
607
|
* lineage cells updated, but no row disappears and an existing row's
|
|
@@ -622,24 +628,15 @@ function judgeReviewRows(beforeLines, afterLines) {
|
|
|
622
628
|
const PROGRESS_FIELD = /^(?:-[ \t]+)?\*\*(Status|Head|Completed|Updated|Last Updated|Started|Total):\*\*\s*(.*)$/;
|
|
623
629
|
const PLACEHOLDER_FIELD = /^(?:-[ \t]+)?\*\*[^*\n]+:\*\*\s*(?:-|—|pending|tbd|null)?\s*$/i;
|
|
624
630
|
const EXTRACTION_MARKER = /^\*\*(?:Status:\*\*\s+extracted|Extracted to:\*\*)/;
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
* rewritten and tables re-rendered, but no recorded observation is removed
|
|
628
|
-
* or rewritten, and marking a phase extracted changes scope.
|
|
629
|
-
*/
|
|
630
|
-
function judgeJournalChange(before, after) {
|
|
631
|
-
const previous = splitFrontmatter(before);
|
|
632
|
-
const next = splitFrontmatter(after);
|
|
633
|
-
if (previous === null || next === null) {
|
|
634
|
-
return refuse('implementation.md frontmatter could not be parsed');
|
|
635
|
-
}
|
|
631
|
+
function listJournalRewrites(previousBody, nextBody) {
|
|
632
|
+
const rewrites = [];
|
|
636
633
|
const remaining = new Map();
|
|
637
|
-
for (const line of
|
|
634
|
+
for (const line of nextBody.split('\n')) {
|
|
638
635
|
const key = line.trimEnd();
|
|
639
636
|
remaining.set(key, (remaining.get(key) ?? 0) + 1);
|
|
640
637
|
}
|
|
641
638
|
const previousLines = new Set();
|
|
642
|
-
for (const line of
|
|
639
|
+
for (const line of previousBody.split('\n')) {
|
|
643
640
|
const key = line.trimEnd();
|
|
644
641
|
previousLines.add(key.trim());
|
|
645
642
|
const count = remaining.get(key) ?? 0;
|
|
@@ -655,15 +652,58 @@ function judgeJournalChange(before, after) {
|
|
|
655
652
|
(progress !== null &&
|
|
656
653
|
!(progress[1] === 'Status' && /^extracted\b/.test(progress[2] ?? '')));
|
|
657
654
|
if (!mutable) {
|
|
658
|
-
|
|
655
|
+
rewrites.push({ kind: 'recorded-line-rewritten', line: trimmed });
|
|
659
656
|
}
|
|
660
657
|
}
|
|
661
|
-
for (const line of
|
|
658
|
+
for (const line of nextBody.split('\n')) {
|
|
662
659
|
const trimmed = line.trim();
|
|
663
660
|
if (EXTRACTION_MARKER.test(trimmed) && !previousLines.has(trimmed)) {
|
|
664
|
-
|
|
661
|
+
rewrites.push({ kind: 'extraction-marker', line: trimmed });
|
|
665
662
|
}
|
|
666
663
|
}
|
|
664
|
+
return rewrites;
|
|
665
|
+
}
|
|
666
|
+
/**
|
|
667
|
+
* List every recorded journal line removed or rewritten by `after`, followed
|
|
668
|
+
* by every newly introduced extraction marker. Mutable progress fields,
|
|
669
|
+
* placeholders, table rendering, and append-only additions are excluded.
|
|
670
|
+
*/
|
|
671
|
+
export function journalRewrites(before, after) {
|
|
672
|
+
const previous = splitFrontmatter(before);
|
|
673
|
+
const next = splitFrontmatter(after);
|
|
674
|
+
if (previous === null || next === null) {
|
|
675
|
+
return [
|
|
676
|
+
{
|
|
677
|
+
kind: 'frontmatter-unparseable',
|
|
678
|
+
line: '',
|
|
679
|
+
side: previous === null && next === null
|
|
680
|
+
? 'both'
|
|
681
|
+
: previous === null
|
|
682
|
+
? 'before'
|
|
683
|
+
: 'after',
|
|
684
|
+
},
|
|
685
|
+
];
|
|
686
|
+
}
|
|
687
|
+
return listJournalRewrites(previous.body, next.body);
|
|
688
|
+
}
|
|
689
|
+
/**
|
|
690
|
+
* The journal is append-mostly: progress fields and placeholders may be
|
|
691
|
+
* rewritten and tables re-rendered, but no recorded observation is removed
|
|
692
|
+
* or rewritten, and marking a phase extracted changes scope.
|
|
693
|
+
*/
|
|
694
|
+
function judgeJournalChange(before, after) {
|
|
695
|
+
const previous = splitFrontmatter(before);
|
|
696
|
+
const next = splitFrontmatter(after);
|
|
697
|
+
if (previous === null || next === null) {
|
|
698
|
+
return refuse('implementation.md frontmatter could not be parsed');
|
|
699
|
+
}
|
|
700
|
+
const [first] = listJournalRewrites(previous.body, next.body);
|
|
701
|
+
if (first?.kind === 'recorded-line-rewritten') {
|
|
702
|
+
return refuse(`recorded journal line "${first.line}" was removed or rewritten`);
|
|
703
|
+
}
|
|
704
|
+
if (first?.kind === 'extraction-marker') {
|
|
705
|
+
return refuse(`"${first.line}" marks a phase extracted`);
|
|
706
|
+
}
|
|
667
707
|
return OK;
|
|
668
708
|
}
|
|
669
709
|
const UNREVIEWED_RESOLUTIONS = new Set(['no_gate', 'project_disabled']);
|
|
@@ -750,6 +790,76 @@ export async function evaluateGateCarrier(carrier, expected, successor) {
|
|
|
750
790
|
}
|
|
751
791
|
return { outcome, freshness: 'fresh', reason: null };
|
|
752
792
|
}
|
|
793
|
+
/**
|
|
794
|
+
* Evaluate a delivery's exit carrier without letting callers bypass stack
|
|
795
|
+
* topology. A stack is recorded base to tip: every lower observed head must
|
|
796
|
+
* be the tip or its ancestor, then only the tip is published to the carrier.
|
|
797
|
+
* Missing and unreviewed carriers delegate before topology because they are
|
|
798
|
+
* not head-bound. Other delivery kinds retain every-member evaluation.
|
|
799
|
+
*/
|
|
800
|
+
export async function evaluateDeliveryExitCarrier(carrier, expected, successor) {
|
|
801
|
+
const { delivery, git, scope } = successor;
|
|
802
|
+
const publishedHeads = delivery.members.map((member) => member.observed_head);
|
|
803
|
+
if (carrier === null || isUnreviewedResolution(carrier)) {
|
|
804
|
+
return evaluateGateCarrier(carrier, expected, {
|
|
805
|
+
git,
|
|
806
|
+
scope,
|
|
807
|
+
publishedHeads,
|
|
808
|
+
});
|
|
809
|
+
}
|
|
810
|
+
if (delivery.kind !== 'stack') {
|
|
811
|
+
return evaluateGateCarrier(carrier, expected, {
|
|
812
|
+
git,
|
|
813
|
+
scope,
|
|
814
|
+
publishedHeads,
|
|
815
|
+
});
|
|
816
|
+
}
|
|
817
|
+
const stale = (reason) => ({
|
|
818
|
+
outcome: carrier.status === 'allowed' ? 'allowed' : 'blocked',
|
|
819
|
+
freshness: 'stale',
|
|
820
|
+
reason,
|
|
821
|
+
});
|
|
822
|
+
if (publishedHeads.length === 0) {
|
|
823
|
+
return stale('member-missing: the stack has no members');
|
|
824
|
+
}
|
|
825
|
+
const unobserved = publishedHeads.findIndex((head) => head === null);
|
|
826
|
+
if (unobserved >= 0) {
|
|
827
|
+
return stale(`member-unobserved: stack member ${unobserved} has no observed head`);
|
|
828
|
+
}
|
|
829
|
+
const resolvedHeads = [];
|
|
830
|
+
try {
|
|
831
|
+
for (const head of publishedHeads) {
|
|
832
|
+
const resolved = await resolveCommit(git, scope.repoRoot, head);
|
|
833
|
+
if (resolved === null) {
|
|
834
|
+
return stale(`missing-object: commit ${head} is not available locally`);
|
|
835
|
+
}
|
|
836
|
+
resolvedHeads.push(resolved);
|
|
837
|
+
}
|
|
838
|
+
}
|
|
839
|
+
catch (error) {
|
|
840
|
+
return stale(`inspection-failed: commit resolution failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
841
|
+
}
|
|
842
|
+
const tip = resolvedHeads.at(-1);
|
|
843
|
+
try {
|
|
844
|
+
for (const [index, lower] of resolvedHeads.slice(0, -1).entries()) {
|
|
845
|
+
const ancestry = await git.run(['merge-base', '--is-ancestor', lower, tip], { cwd: scope.repoRoot, allowFailure: true });
|
|
846
|
+
if (ancestry.code === 1) {
|
|
847
|
+
return stale(`stack-order: member ${index} head ${lower} is not an ancestor of tip ${tip}`);
|
|
848
|
+
}
|
|
849
|
+
if (ancestry.code !== 0) {
|
|
850
|
+
return stale(`inspection-failed: ancestry inspection failed for member ${index}: ${ancestry.stderr || `git exited ${ancestry.code}`}`);
|
|
851
|
+
}
|
|
852
|
+
}
|
|
853
|
+
}
|
|
854
|
+
catch (error) {
|
|
855
|
+
return stale(`inspection-failed: ancestry inspection failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
856
|
+
}
|
|
857
|
+
return evaluateGateCarrier(carrier, expected, {
|
|
858
|
+
git,
|
|
859
|
+
scope,
|
|
860
|
+
publishedHeads: [tip],
|
|
861
|
+
});
|
|
862
|
+
}
|
|
753
863
|
/**
|
|
754
864
|
* Evaluate a registered delivery's integrated review against its observed
|
|
755
865
|
* members (A2): each member's reviewed revision must cover its observed head
|
|
@@ -856,6 +966,39 @@ export function reviewRowsFor(reviews, labels) {
|
|
|
856
966
|
ids.some((id) => cell === id || cell.startsWith(`${id}:`)));
|
|
857
967
|
});
|
|
858
968
|
}
|
|
969
|
+
/**
|
|
970
|
+
* Artifacts emitted by the configured gate run that produced `carrier`.
|
|
971
|
+
* These join the shared bookkeeping allowlist only; they never join a
|
|
972
|
+
* delivery's own evidence set or integrated-review selection.
|
|
973
|
+
*/
|
|
974
|
+
export function gateEvidenceArtifacts(reviews, carrier) {
|
|
975
|
+
if (carrier?.reviewed_head === null ||
|
|
976
|
+
carrier?.reviewed_head === undefined ||
|
|
977
|
+
placeholder(carrier.reviewed_head)) {
|
|
978
|
+
return [];
|
|
979
|
+
}
|
|
980
|
+
return reviews
|
|
981
|
+
.filter((review) => review.type === 'code' &&
|
|
982
|
+
review.invocation === 'gate' &&
|
|
983
|
+
review.reviewedHead === carrier.reviewed_head &&
|
|
984
|
+
reviewArtifactPath(review.artifact) &&
|
|
985
|
+
!placeholder(review.artifact))
|
|
986
|
+
.map((review) => review.artifact);
|
|
987
|
+
}
|
|
988
|
+
/**
|
|
989
|
+
* The newest active registry entry for a milestone. Registration-in-progress
|
|
990
|
+
* and superseded entries cannot carry the milestone's current evidence.
|
|
991
|
+
*/
|
|
992
|
+
export function latestDeliveryForMilestone(deliveries, milestone) {
|
|
993
|
+
for (let index = deliveries.length - 1; index >= 0; index -= 1) {
|
|
994
|
+
const delivery = deliveries[index];
|
|
995
|
+
if (delivery.milestone === milestone &&
|
|
996
|
+
(delivery.status === 'open' || delivery.status === 'at_endpoint')) {
|
|
997
|
+
return delivery;
|
|
998
|
+
}
|
|
999
|
+
}
|
|
1000
|
+
return undefined;
|
|
1001
|
+
}
|
|
859
1002
|
/**
|
|
860
1003
|
* The one evidence scope for a registered delivery, shared by `delivery
|
|
861
1004
|
* check`, `delivery refresh` and the closeout boundary: the review rows
|
|
@@ -883,7 +1026,10 @@ export function deliveryEvidenceScope(project, deliveries, delivery) {
|
|
|
883
1026
|
return {
|
|
884
1027
|
repoRoot: project.repoRoot,
|
|
885
1028
|
projectDir: project.projectDir,
|
|
886
|
-
evidenceArtifacts:
|
|
1029
|
+
evidenceArtifacts: [
|
|
1030
|
+
...deliveryEvidenceArtifacts(delivery, reviewRowsFor(project.state.reviews, labels).map((row) => row.artifact), sharing),
|
|
1031
|
+
...gateEvidenceArtifacts(project.state.reviews, project.evidenceCarrier ?? null),
|
|
1032
|
+
],
|
|
887
1033
|
ownEvidenceArtifacts,
|
|
888
1034
|
};
|
|
889
1035
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"refresh.d.ts","sourceRoot":"","sources":["../../../../src/commands/project/delivery/refresh.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAEL,KAAK,QAAQ,EACd,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAoB,KAAK,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAK9E,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,oBAAoB,EACzB,KAAK,YAAY,EAClB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,OAAO,EAIL,KAAK,2BAA2B,EAChC,KAAK,mBAAmB,EACzB,MAAM,SAAS,CAAC;AACjB,OAAO,
|
|
1
|
+
{"version":3,"file":"refresh.d.ts","sourceRoot":"","sources":["../../../../src/commands/project/delivery/refresh.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,7 +10,7 @@ import { normalizeMilestoneId, } from '@open-agent-toolkit/control-plane';
|
|
|
10
10
|
import { Command } from 'commander';
|
|
11
11
|
import YAML, { isMap, isScalar, isSeq } from 'yaml';
|
|
12
12
|
import { DEFAULT_DELIVERY_PROJECT_DEPENDENCIES, deliveryEffectiveScope, loadGoalDeliveryProject, } from './check.js';
|
|
13
|
-
import { deliveryEvidenceScope, evaluateDeliveryReview,
|
|
13
|
+
import { deliveryEvidenceScope, evaluateDeliveryExitCarrier, evaluateDeliveryReview, latestDeliveryForMilestone, } from './evidence.js';
|
|
14
14
|
/** The only frontmatter keys a refresh writes under. */
|
|
15
15
|
const REFRESH_WRITE_ROOTS = new Set(['oat_deliveries', 'oat_milestone_gates']);
|
|
16
16
|
const MEMBER_OBSERVATION_LEAVES = new Set([
|
|
@@ -235,28 +235,22 @@ export async function planDeliveryRefresh(project, runners) {
|
|
|
235
235
|
// registered delivery. Refresh records only staleness: it never upgrades a
|
|
236
236
|
// carrier to fresh, which only implement's scoped closeout writes.
|
|
237
237
|
const exitCarriers = [];
|
|
238
|
-
const
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
}
|
|
245
|
-
for (const [milestone, delivery] of latestByMilestone) {
|
|
238
|
+
const observedDeliveries = [...observedById.values()];
|
|
239
|
+
const milestones = new Set(observedDeliveries
|
|
240
|
+
.map((delivery) => delivery.milestone)
|
|
241
|
+
.filter((milestone) => milestone !== null));
|
|
242
|
+
for (const milestone of milestones) {
|
|
243
|
+
const delivery = latestDeliveryForMilestone(observedDeliveries, milestone);
|
|
246
244
|
const carrier = project.state.milestoneGates?.[milestone]?.exit ?? null;
|
|
247
245
|
if (carrier === null)
|
|
248
246
|
continue;
|
|
249
247
|
const scope = evidenceScope(project, delivery);
|
|
250
|
-
const evaluation = await
|
|
248
|
+
const evaluation = await evaluateDeliveryExitCarrier(carrier, {
|
|
251
249
|
kind: 'code',
|
|
252
250
|
scope: deliveryEffectiveScope(deliveries, delivery),
|
|
253
251
|
match: 'covers',
|
|
254
252
|
overrideDisabled: project.exitGateDisabled,
|
|
255
|
-
}, {
|
|
256
|
-
git: runners.git,
|
|
257
|
-
scope,
|
|
258
|
-
publishedHeads: delivery.members.map((member) => member.observed_head),
|
|
259
|
-
});
|
|
253
|
+
}, { git: runners.git, scope, delivery });
|
|
260
254
|
exitCarriers.push({
|
|
261
255
|
milestone,
|
|
262
256
|
delivery: delivery.delivery_id,
|
|
@@ -282,7 +276,10 @@ export async function planDeliveryRefresh(project, runners) {
|
|
|
282
276
|
return { deliveries: results, exitCarriers, writes, changed: false };
|
|
283
277
|
}
|
|
284
278
|
function evidenceScope(project, delivery) {
|
|
285
|
-
|
|
279
|
+
const evidenceCarrier = delivery.milestone === null
|
|
280
|
+
? null
|
|
281
|
+
: (project.state.milestoneGates?.[delivery.milestone]?.exit ?? null);
|
|
282
|
+
return deliveryEvidenceScope({ ...project, evidenceCarrier }, project.state.deliveries ?? [], delivery);
|
|
286
283
|
}
|
|
287
284
|
// ---------------------------------------------------------------------------
|
|
288
285
|
// Applying writes to state.md frontmatter
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type CommandContext, type GlobalOptions } from '../../../app/command-context.js';
|
|
2
|
+
import { type GitRunner } from '../../project/sync/git.js';
|
|
2
3
|
import { type ActiveProjectResolution } from '../../../config/oat-config.js';
|
|
3
4
|
import { Command } from 'commander';
|
|
4
5
|
import { type JournalCheckReason, type JournalCheckResult } from './types.js';
|
|
@@ -16,6 +17,7 @@ export interface JournalCheckDependencies {
|
|
|
16
17
|
readFile: (path: string, encoding: 'utf8') => Promise<string>;
|
|
17
18
|
dirExists: (path: string) => Promise<boolean>;
|
|
18
19
|
fileExists: (path: string) => Promise<boolean>;
|
|
20
|
+
git: GitRunner;
|
|
19
21
|
}
|
|
20
22
|
/**
|
|
21
23
|
* Read the three inputs the evaluator needs. A missing journal or plan is a
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/project/journal-check/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAEL,KAAK,uBAAuB,EAC7B,MAAM,oBAAoB,CAAC;AAS5B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,OAAO,EAGL,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACxB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,YAAY,EACV,oBAAoB,EACpB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,SAAS,CAAC;AAEjB,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,wBAAwB;IACvC,mBAAmB,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,cAAc,CAAC;IAChE,kBAAkB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,oBAAoB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAC7E,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9D,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9C,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/project/journal-check/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAoB,KAAK,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAE9E,OAAO,EAEL,KAAK,uBAAuB,EAC7B,MAAM,oBAAoB,CAAC;AAS5B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,OAAO,EAGL,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACxB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,YAAY,EACV,oBAAoB,EACpB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,SAAS,CAAC;AAEjB,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,wBAAwB;IACvC,mBAAmB,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,cAAc,CAAC;IAChE,kBAAkB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,oBAAoB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAC7E,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9D,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9C,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/C,GAAG,EAAE,SAAS,CAAC;CAChB;AAYD;;;;GAIG;AACH,wBAAsB,qBAAqB,CACzC,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,IAAI,CAAC,wBAAwB,EAAE,UAAU,GAAG,YAAY,CAAC,GACtE,OAAO,CAAC,iBAAiB,CAAC,CAa5B;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,GAAG,YAAY,GAClC,MAAM,EAAE,CAuBV;AA0ED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,CAItE;AAED,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,kBAAkB,GACzB,MAAM,CAKR;AA0JD,wBAAgB,2BAA2B,CACzC,SAAS,GAAE,OAAO,CAAC,wBAAwB,CAAM,GAChD,OAAO,CAiCT"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { readFile as defaultReadFile } from 'node:fs/promises';
|
|
2
2
|
import { isAbsolute, join, resolve } from 'node:path';
|
|
3
3
|
import { buildCommandContext, } from '../../../app/command-context.js';
|
|
4
|
+
import { journalRewrites } from '../../project/delivery/evidence.js';
|
|
5
|
+
import { defaultGitRunner } from '../../project/sync/git.js';
|
|
4
6
|
import { readGlobalOptions } from '../../shared/shared.utils.js';
|
|
5
7
|
import { resolveActiveProject, } from '../../../config/oat-config.js';
|
|
6
8
|
import { CliError } from '../../../errors/cli-error.js';
|
|
@@ -18,6 +20,7 @@ const DEFAULT_DEPENDENCIES = {
|
|
|
18
20
|
readFile: (path, encoding) => defaultReadFile(path, encoding),
|
|
19
21
|
dirExists,
|
|
20
22
|
fileExists,
|
|
23
|
+
git: defaultGitRunner,
|
|
21
24
|
};
|
|
22
25
|
/**
|
|
23
26
|
* Read the three inputs the evaluator needs. A missing journal or plan is a
|
|
@@ -69,6 +72,41 @@ function readWorkflowMode(stateContent) {
|
|
|
69
72
|
const mode = metadata.state === 'ok' ? metadata.record.oat_workflow_mode : undefined;
|
|
70
73
|
return typeof mode === 'string' && mode.length > 0 ? mode : 'spec-driven';
|
|
71
74
|
}
|
|
75
|
+
async function readCommittedJournal(projectDir, git) {
|
|
76
|
+
const head = await git.run(['rev-parse', '--verify', '--quiet', 'HEAD^{commit}'], { cwd: projectDir, allowFailure: true });
|
|
77
|
+
if (head.code === 1) {
|
|
78
|
+
const symbolic = await git.run(['symbolic-ref', '-q', 'HEAD'], {
|
|
79
|
+
cwd: projectDir,
|
|
80
|
+
allowFailure: true,
|
|
81
|
+
});
|
|
82
|
+
if (symbolic.code !== 0 || symbolic.stdout === '') {
|
|
83
|
+
throw new CliError(`Unable to inspect the committed journal: HEAD does not resolve and its branch could not be identified${symbolic.stderr ? `: ${symbolic.stderr}` : ''}`, 2);
|
|
84
|
+
}
|
|
85
|
+
const branch = await git.run(['show-ref', '--verify', '--quiet', symbolic.stdout], { cwd: projectDir, allowFailure: true });
|
|
86
|
+
if (branch.code === 1) {
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
throw new CliError(`Unable to inspect the committed journal: HEAD does not resolve${branch.stderr ? `: ${branch.stderr}` : ''}`, 2);
|
|
90
|
+
}
|
|
91
|
+
if (head.code !== 0) {
|
|
92
|
+
throw new CliError(`Unable to inspect the committed journal: ${head.stderr || `git exited ${head.code}`}`, 2);
|
|
93
|
+
}
|
|
94
|
+
const entry = await git.run(['ls-tree', '--full-name', '-z', 'HEAD', '--', 'implementation.md'], { cwd: projectDir, allowFailure: true });
|
|
95
|
+
if (entry.code !== 0) {
|
|
96
|
+
throw new CliError(`Unable to inspect the committed journal path: ${entry.stderr || `git exited ${entry.code}`}`, 2);
|
|
97
|
+
}
|
|
98
|
+
if (entry.stdout === '') {
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
const blob = await git.run(['show', 'HEAD:./implementation.md'], {
|
|
102
|
+
cwd: projectDir,
|
|
103
|
+
allowFailure: true,
|
|
104
|
+
});
|
|
105
|
+
if (blob.code !== 0) {
|
|
106
|
+
throw new CliError(`Unable to read the committed journal: ${blob.stderr || `git exited ${blob.code}`}`, 2);
|
|
107
|
+
}
|
|
108
|
+
return blob.stdout;
|
|
109
|
+
}
|
|
72
110
|
export function formatJournalReason(reason) {
|
|
73
111
|
const location = reason.line === null ? reason.path : `${reason.path}:${reason.line}`;
|
|
74
112
|
return `${reason.code} ${location} (${reason.owner}): ${reason.message}`;
|
|
@@ -118,7 +156,46 @@ async function runJournalCheck(options, context, dependencies) {
|
|
|
118
156
|
? 'phase-unit'
|
|
119
157
|
: 'task')
|
|
120
158
|
: null;
|
|
121
|
-
|
|
159
|
+
let result = evaluateJournal({ boundary, scope, ...files });
|
|
160
|
+
if (workflowMode === 'goal' &&
|
|
161
|
+
(boundary === 'implement-preflight' || boundary === 'review')) {
|
|
162
|
+
const committed = await readCommittedJournal(projectDir, dependencies.git);
|
|
163
|
+
if (committed !== null) {
|
|
164
|
+
const reasons = journalRewrites(committed, files.journalContent).flatMap((rewrite) => {
|
|
165
|
+
if (rewrite.kind === 'recorded-line-rewritten') {
|
|
166
|
+
return [
|
|
167
|
+
{
|
|
168
|
+
code: 'journal-line-rewritten',
|
|
169
|
+
path: 'implementation.md',
|
|
170
|
+
line: null,
|
|
171
|
+
owner: 'oat-project-implement',
|
|
172
|
+
message: `Committed journal line "${rewrite.line}" was removed or rewritten; the journal is append-only — restore the committed line and append the correction.`,
|
|
173
|
+
},
|
|
174
|
+
];
|
|
175
|
+
}
|
|
176
|
+
if (rewrite.kind === 'frontmatter-unparseable' &&
|
|
177
|
+
rewrite.side !== 'after') {
|
|
178
|
+
return [
|
|
179
|
+
{
|
|
180
|
+
code: 'journal-frontmatter-malformed',
|
|
181
|
+
path: 'implementation.md',
|
|
182
|
+
line: null,
|
|
183
|
+
owner: 'oat-project-reconcile',
|
|
184
|
+
message: 'Committed implementation.md frontmatter could not be parsed; repair the frontmatter and commit it before re-running.',
|
|
185
|
+
},
|
|
186
|
+
];
|
|
187
|
+
}
|
|
188
|
+
return [];
|
|
189
|
+
});
|
|
190
|
+
if (reasons.length > 0) {
|
|
191
|
+
result = {
|
|
192
|
+
...result,
|
|
193
|
+
status: 'refused',
|
|
194
|
+
reasons: [...result.reasons, ...reasons],
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
122
199
|
if (context.json) {
|
|
123
200
|
context.logger.json({ ...result, projectPath: projectDir });
|
|
124
201
|
}
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
export declare const JOURNAL_CHECK_BOUNDARIES: readonly ['implement-preflight', 'review', 'completion'];
|
|
12
12
|
export type JournalCheckBoundary = (typeof JOURNAL_CHECK_BOUNDARIES)[number];
|
|
13
13
|
export type JournalArtifactPath = 'implementation.md' | 'plan.md' | 'state.md';
|
|
14
|
-
export type JournalReasonCode = 'journal-frontmatter-malformed' | 'journal-frontmatter-missing' | 'journal-missing' | 'state-frontmatter-malformed' | 'journal-status-not-terminal' | 'journal-pointer-not-cleared' | 'state-status-disagrees' | 'state-pointer-not-cleared' | 'task-block-missing' | 'task-duplicate-block' | 'task-unplanned' | 'task-status-missing' | 'task-status-ambiguous' | 'task-status-invalid' | 'task-not-completed' | 'task-commit-missing' | 'task-misplaced' | 'plan-task-duplicate' | 'plan-task-misplaced' | 'execution-record-open' | 'phase-status-disagrees' | 'phase-status-ambiguous' | 'phase-duplicate-section' | 'phase-head-missing' | 'phase-not-accepted' | 'overview-total-mismatch' | 'references-not-last' | 'receipt-misplaced' | 'deferral-misplaced' | 'dispatch-payload' | 'run-line-malformed' | 'run-line-misplaced' | 'run-line-duplicate' | 'run-line-unresolved' | 'template-residue' | 'override-malformed' | 'override-misplaced' | 'override-unused';
|
|
14
|
+
export type JournalReasonCode = 'journal-frontmatter-malformed' | 'journal-frontmatter-missing' | 'journal-missing' | 'journal-line-rewritten' | 'state-frontmatter-malformed' | 'journal-status-not-terminal' | 'journal-pointer-not-cleared' | 'state-status-disagrees' | 'state-pointer-not-cleared' | 'task-block-missing' | 'task-duplicate-block' | 'task-unplanned' | 'task-status-missing' | 'task-status-ambiguous' | 'task-status-invalid' | 'task-not-completed' | 'task-commit-missing' | 'task-misplaced' | 'plan-task-duplicate' | 'plan-task-misplaced' | 'execution-record-open' | 'phase-status-disagrees' | 'phase-status-ambiguous' | 'phase-duplicate-section' | 'phase-head-missing' | 'phase-not-accepted' | 'overview-total-mismatch' | 'references-not-last' | 'receipt-misplaced' | 'deferral-misplaced' | 'dispatch-payload' | 'run-line-malformed' | 'run-line-misplaced' | 'run-line-duplicate' | 'run-line-unresolved' | 'template-residue' | 'override-malformed' | 'override-misplaced' | 'override-unused';
|
|
15
15
|
export interface JournalCheckReason {
|
|
16
16
|
code: JournalReasonCode;
|
|
17
17
|
path: JournalArtifactPath;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/commands/project/journal-check/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,eAAO,MAAM,wBAAwB,YACnC,qBAAqB,EACrB,QAAQ,EACR,YAAY,CACJ,CAAC;AAEX,MAAM,MAAM,oBAAoB,GAAG,CAAC,OAAO,wBAAwB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7E,MAAM,MAAM,mBAAmB,GAAG,mBAAmB,GAAG,SAAS,GAAG,UAAU,CAAC;AAE/E,MAAM,MAAM,iBAAiB,GAEzB,+BAA+B,GAC/B,6BAA6B,GAC7B,iBAAiB,GACjB,6BAA6B,GAC7B,6BAA6B,GAC7B,6BAA6B,GAC7B,wBAAwB,GACxB,2BAA2B,GAE3B,oBAAoB,GACpB,sBAAsB,GACtB,gBAAgB,GAChB,qBAAqB,GACrB,uBAAuB,GACvB,qBAAqB,GACrB,oBAAoB,GACpB,qBAAqB,GACrB,gBAAgB,GAChB,qBAAqB,GACrB,qBAAqB,GACrB,uBAAuB,GAEvB,wBAAwB,GACxB,wBAAwB,GACxB,yBAAyB,GACzB,oBAAoB,GACpB,oBAAoB,GACpB,yBAAyB,GAEzB,qBAAqB,GACrB,mBAAmB,GACnB,oBAAoB,GACpB,kBAAkB,GAClB,oBAAoB,GACpB,oBAAoB,GACpB,oBAAoB,GACpB,qBAAqB,GACrB,kBAAkB,GAElB,oBAAoB,GACpB,oBAAoB,GACpB,iBAAiB,CAAC;AAEtB,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,iBAAiB,CAAC;IACxB,IAAI,EAAE,mBAAmB,CAAC;IAC1B,0EAA0E;IAC1E,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,0CAA0C;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,YACjC,4BAA4B,EAC5B,eAAe,EACf,uBAAuB,CACf,CAAC;AAEX,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,sBAAsB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE1E,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,0EAA0E;IAC1E,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,qEAAqE;IACrE,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,oBAAoB,CAAC;IAC/B;;;OAGG;IACH,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,IAAI,GAAG,SAAS,CAAC;IACzB,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,qEAAqE;IACrE,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAC/B,SAAS,EAAE,eAAe,EAAE,CAAC;CAC9B"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/commands/project/journal-check/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,eAAO,MAAM,wBAAwB,YACnC,qBAAqB,EACrB,QAAQ,EACR,YAAY,CACJ,CAAC;AAEX,MAAM,MAAM,oBAAoB,GAAG,CAAC,OAAO,wBAAwB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7E,MAAM,MAAM,mBAAmB,GAAG,mBAAmB,GAAG,SAAS,GAAG,UAAU,CAAC;AAE/E,MAAM,MAAM,iBAAiB,GAEzB,+BAA+B,GAC/B,6BAA6B,GAC7B,iBAAiB,GACjB,wBAAwB,GACxB,6BAA6B,GAC7B,6BAA6B,GAC7B,6BAA6B,GAC7B,wBAAwB,GACxB,2BAA2B,GAE3B,oBAAoB,GACpB,sBAAsB,GACtB,gBAAgB,GAChB,qBAAqB,GACrB,uBAAuB,GACvB,qBAAqB,GACrB,oBAAoB,GACpB,qBAAqB,GACrB,gBAAgB,GAChB,qBAAqB,GACrB,qBAAqB,GACrB,uBAAuB,GAEvB,wBAAwB,GACxB,wBAAwB,GACxB,yBAAyB,GACzB,oBAAoB,GACpB,oBAAoB,GACpB,yBAAyB,GAEzB,qBAAqB,GACrB,mBAAmB,GACnB,oBAAoB,GACpB,kBAAkB,GAClB,oBAAoB,GACpB,oBAAoB,GACpB,oBAAoB,GACpB,qBAAqB,GACrB,kBAAkB,GAElB,oBAAoB,GACpB,oBAAoB,GACpB,iBAAiB,CAAC;AAEtB,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,iBAAiB,CAAC;IACxB,IAAI,EAAE,mBAAmB,CAAC;IAC1B,0EAA0E;IAC1E,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,0CAA0C;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,YACjC,4BAA4B,EAC5B,eAAe,EACf,uBAAuB,CACf,CAAC;AAEX,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,sBAAsB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE1E,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,0EAA0E;IAC1E,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,qEAAqE;IACrE,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,oBAAoB,CAAC;IAC/B;;;OAGG;IACH,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,IAAI,GAAG,SAAS,CAAC;IACzB,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,qEAAqE;IACrE,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAC/B,SAAS,EAAE,eAAe,EAAE,CAAC;CAC9B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/project/new/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAEL,KAAK,YAAY,EAClB,MAAM,gCAAgC,CAAC;AAGxC,OAAO,EAEL,KAAK,YAAY,EAClB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAE5C,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/project/new/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAEL,KAAK,YAAY,EAClB,MAAM,gCAAgC,CAAC;AAGxC,OAAO,EAEL,KAAK,YAAY,EAClB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAE5C,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,YAAY,CAAC;AAqBpB,UAAU,sBAAsB;IAC9B,mBAAmB,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,cAAc,CAAC;IAChE,eAAe,EAAE,CAAC,OAAO,EAAE;QACzB,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,IAAI,EAAE,YAAY,CAAC;QACnB,KAAK,EAAE,OAAO,CAAC;QACf,SAAS,EAAE,OAAO,CAAC;QACnB,gBAAgB,EAAE,OAAO,CAAC;QAC1B,MAAM,EAAE,OAAO,CAAC;QAChB,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,KAAK,CAAC,EAAE,YAAY,CAAC;KACtB,KAAK,OAAO,CAAC,qBAAqB,CAAC,CAAC;CACtC;AAmGD,wBAAgB,uBAAuB,CACrC,SAAS,GAAE,OAAO,CAAC,sBAAsB,CAAM,GAC9C,OAAO,CAgDT"}
|
|
@@ -7,6 +7,7 @@ import { Command, Option } from 'commander';
|
|
|
7
7
|
import { scaffoldProject as defaultScaffoldProject, } from './scaffold.js';
|
|
8
8
|
const COMMIT_STATUS_MESSAGES = {
|
|
9
9
|
skipped_disabled: 'Scaffold commit: skipped (--no-commit)',
|
|
10
|
+
skipped_local_scope: 'Scaffold commit: skipped (local-scope projects are gitignored and never committed)',
|
|
10
11
|
skipped_no_worktree: 'Scaffold commit: skipped (not a git work tree)',
|
|
11
12
|
skipped_nothing: 'Scaffold commit: skipped (nothing to commit)',
|
|
12
13
|
};
|
|
@@ -32,7 +32,7 @@ export interface ScaffoldProjectOptions {
|
|
|
32
32
|
* reasons (and `failed`) lets the CLI surface accurate, distinct messaging
|
|
33
33
|
* instead of collapsing every non-commit into a single benign "skipped" line.
|
|
34
34
|
*/
|
|
35
|
-
export type CommitScaffoldStatus = 'committed' | 'skipped_disabled' | 'skipped_no_worktree' | 'skipped_nothing' | 'failed';
|
|
35
|
+
export type CommitScaffoldStatus = 'committed' | 'skipped_disabled' | 'skipped_local_scope' | 'skipped_no_worktree' | 'skipped_nothing' | 'failed';
|
|
36
36
|
export interface ScaffoldProjectResult {
|
|
37
37
|
mode: WorkflowMode;
|
|
38
38
|
scope: ProjectScope;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../../../../src/commands/project/new/scaffold.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../../../../src/commands/project/new/scaffold.ts"],"names":[],"mappings":"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"}
|
|
@@ -441,7 +441,7 @@ export async function scaffoldProject(options, overrides = {}) {
|
|
|
441
441
|
let parentHeadBeforeRecordCommit;
|
|
442
442
|
let committed = false;
|
|
443
443
|
let commitSha;
|
|
444
|
-
let commitStatus = 'skipped_disabled';
|
|
444
|
+
let commitStatus = scope === 'local' ? 'skipped_local_scope' : 'skipped_disabled';
|
|
445
445
|
let commitError;
|
|
446
446
|
let createdFiles = [];
|
|
447
447
|
let skippedFiles = [];
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import type { CodexMaterializeResult, ProvidersCodexMaterializeDependencies } from '../../providers/providers.types.js';
|
|
2
|
+
import { type CodexConfigMergeResult } from '../../../providers/codex/codec/config-merge.js';
|
|
2
3
|
import { Command } from 'commander';
|
|
3
|
-
export
|
|
4
|
+
export interface CodexMaterializeCommandResult extends CodexMaterializeResult {
|
|
5
|
+
config: Pick<CodexConfigMergeResult, 'addedKeys' | 'userValueNotices'>;
|
|
6
|
+
}
|
|
7
|
+
export declare function formatCodexMaterializeResult(result: CodexMaterializeCommandResult): string;
|
|
4
8
|
export declare function createCodexMaterializeCommand(overrides?: Partial<ProvidersCodexMaterializeDependencies>): Command;
|
|
5
9
|
//# sourceMappingURL=materialize.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"materialize.d.ts","sourceRoot":"","sources":["../../../../src/commands/providers/codex/materialize.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,sBAAsB,EACtB,qCAAqC,EACtC,MAAM,qCAAqC,CAAC;
|
|
1
|
+
{"version":3,"file":"materialize.d.ts","sourceRoot":"","sources":["../../../../src/commands/providers/codex/materialize.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,sBAAsB,EACtB,qCAAqC,EACtC,MAAM,qCAAqC,CAAC;AAK7C,OAAO,EACL,KAAK,sBAAsB,EAI5B,MAAM,qCAAqC,CAAC;AAK7C,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAU5C,MAAM,WAAW,6BAA8B,SAAQ,sBAAsB;IAC3E,MAAM,EAAE,IAAI,CAAC,sBAAsB,EAAE,WAAW,GAAG,kBAAkB,CAAC,CAAC;CACxE;AAiDD,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,6BAA6B,GACpC,MAAM,CAcR;AA0ID,wBAAgB,6BAA6B,CAC3C,SAAS,GAAE,OAAO,CAAC,qCAAqC,CAAM,GAC7D,OAAO,CAoCT"}
|
|
@@ -6,7 +6,7 @@ import { readGlobalOptions } from '../../shared/shared.utils.js';
|
|
|
6
6
|
import { CliError } from '../../../errors/index.js';
|
|
7
7
|
import { ensureDir, fileExists } from '../../../fs/io.js';
|
|
8
8
|
import { resolveProjectRoot, resolveScopeRoot } from '../../../fs/paths.js';
|
|
9
|
-
import { mergeCodexConfigForRole, readCodexMaxDepth, } from '../../../providers/codex/codec/config-merge.js';
|
|
9
|
+
import { describeCodexConfigMerge, mergeCodexConfigForRole, readCodexMaxDepth, } from '../../../providers/codex/codec/config-merge.js';
|
|
10
10
|
import { materializeCodexRole } from '../../../providers/codex/codec/materialize.js';
|
|
11
11
|
import { withOatManagedCodexRoleOwner } from '../../../providers/codex/codec/shared.js';
|
|
12
12
|
import { Command, Option } from 'commander';
|
|
@@ -49,6 +49,7 @@ export function formatCodexMaterializeResult(result) {
|
|
|
49
49
|
`Role: ${result.roleName}`,
|
|
50
50
|
`Role file: ${result.rolePath}`,
|
|
51
51
|
`Config file: ${result.configPath}`,
|
|
52
|
+
...describeCodexConfigMerge(result.config).map((line) => `Config: ${line}`),
|
|
52
53
|
'TOML preview:',
|
|
53
54
|
result.tomlPreview.trimEnd(),
|
|
54
55
|
].join('\n');
|
|
@@ -105,6 +106,10 @@ async function buildCodexMaterializePlan(agentName, options, context, dependenci
|
|
|
105
106
|
configPath,
|
|
106
107
|
configFile: role.configFile,
|
|
107
108
|
tomlPreview: role.content,
|
|
109
|
+
config: {
|
|
110
|
+
addedKeys: mergedConfig.addedKeys,
|
|
111
|
+
userValueNotices: mergedConfig.userValueNotices,
|
|
112
|
+
},
|
|
108
113
|
},
|
|
109
114
|
};
|
|
110
115
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exact-path-commit.d.ts","sourceRoot":"","sources":["../../../src/commands/shared/exact-path-commit.ts"],"names":[],"mappings":"AAuBA,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AACD,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,WAAW,GAAG,kBAAkB,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;IAC7E,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;kFAE8E;IAC9E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,sBAAsB,GAAG,uBAAuB,GAAG,OAAO,CAAC;IACvE,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AACD,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC;AAuSD;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,oBAAoB,EAC3B,SAAS,GAAE,OAAO,CAAC,2BAA2B,CAAM,GACnD,OAAO,CAAC,qBAAqB,CAAC,
|
|
1
|
+
{"version":3,"file":"exact-path-commit.d.ts","sourceRoot":"","sources":["../../../src/commands/shared/exact-path-commit.ts"],"names":[],"mappings":"AAuBA,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AACD,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,WAAW,GAAG,kBAAkB,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;IAC7E,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;kFAE8E;IAC9E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,sBAAsB,GAAG,uBAAuB,GAAG,OAAO,CAAC;IACvE,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AACD,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC;AAuSD;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,oBAAoB,EAC3B,SAAS,GAAE,OAAO,CAAC,2BAA2B,CAAM,GACnD,OAAO,CAAC,qBAAqB,CAAC,CA0jBhC"}
|
|
@@ -403,7 +403,17 @@ export async function commitExactPaths(input, overrides = {}) {
|
|
|
403
403
|
const isolated = join(temporary, 'index');
|
|
404
404
|
if (!commit) {
|
|
405
405
|
await git(root, head ? ['read-tree', head] : ['read-tree', '--empty'], isolated);
|
|
406
|
-
|
|
406
|
+
// Git refuses a tracked file whose parent directory an ignore rule
|
|
407
|
+
// matches. Only paths the base already tracks may bypass ignore
|
|
408
|
+
// rules; an untracked ignored path is still refused.
|
|
409
|
+
const tracked = new Set((await git(root, ['ls-files', '-z', '--', ...paths], isolated))
|
|
410
|
+
.split('\0')
|
|
411
|
+
.filter(Boolean));
|
|
412
|
+
const untracked = paths.filter((path) => !tracked.has(path));
|
|
413
|
+
if (untracked.length)
|
|
414
|
+
await git(root, ['add', '-A', '--', ...untracked], isolated);
|
|
415
|
+
if (tracked.size)
|
|
416
|
+
await git(root, ['add', '-A', '-f', '--', ...tracked], isolated);
|
|
407
417
|
if (!(await git(root, ['diff', '--cached', '--name-only'], isolated)))
|
|
408
418
|
return (operationResult = {
|
|
409
419
|
outcome: 'nothing',
|
|
@@ -16,6 +16,8 @@ import type { Command } from 'commander';
|
|
|
16
16
|
* commands. Use `'project'` for commands that only support project scope
|
|
17
17
|
* (e.g. `providers set`) so bare invocations succeed without requiring an
|
|
18
18
|
* explicit `--scope project` flag.
|
|
19
|
+
* @param description - Help text for commands whose scope default needs
|
|
20
|
+
* more explanation than "Limit execution scope".
|
|
19
21
|
*/
|
|
20
|
-
export declare function withScopeOption(cmd: Command, defaultScope?: 'project' | 'user' | 'all'): Command;
|
|
22
|
+
export declare function withScopeOption(cmd: Command, defaultScope?: 'project' | 'user' | 'all', description?: string): Command;
|
|
21
23
|
//# sourceMappingURL=scope-option.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scope-option.d.ts","sourceRoot":"","sources":["../../../src/commands/shared/scope-option.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC
|
|
1
|
+
{"version":3,"file":"scope-option.d.ts","sourceRoot":"","sources":["../../../src/commands/shared/scope-option.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,OAAO,EACZ,YAAY,GAAE,SAAS,GAAG,MAAM,GAAG,KAAa,EAChD,WAAW,SAA0B,GACpC,OAAO,CAMT"}
|
|
@@ -16,9 +16,11 @@ import { Option } from 'commander';
|
|
|
16
16
|
* commands. Use `'project'` for commands that only support project scope
|
|
17
17
|
* (e.g. `providers set`) so bare invocations succeed without requiring an
|
|
18
18
|
* explicit `--scope project` flag.
|
|
19
|
+
* @param description - Help text for commands whose scope default needs
|
|
20
|
+
* more explanation than "Limit execution scope".
|
|
19
21
|
*/
|
|
20
|
-
export function withScopeOption(cmd, defaultScope = 'all') {
|
|
21
|
-
return cmd.addOption(new Option('--scope <scope>',
|
|
22
|
+
export function withScopeOption(cmd, defaultScope = 'all', description = 'Limit execution scope') {
|
|
23
|
+
return cmd.addOption(new Option('--scope <scope>', description)
|
|
22
24
|
.choices(['project', 'user', 'all'])
|
|
23
25
|
.default(defaultScope));
|
|
24
26
|
}
|