perttool 0.5.5 → 0.6.0
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/CHANGELOG.md +38 -1
- package/README.md +51 -18
- package/dist/application/advance-history.d.ts +46 -0
- package/dist/application/advance-history.d.ts.map +1 -0
- package/dist/application/advance-history.js +254 -0
- package/dist/application/advance-history.js.map +1 -0
- package/dist/application/contract6-mutation.d.ts +3 -2
- package/dist/application/contract6-mutation.d.ts.map +1 -1
- package/dist/application/contract6-mutation.js +2 -1
- package/dist/application/contract6-mutation.js.map +1 -1
- package/dist/application/contract6-projection.d.ts +2 -1
- package/dist/application/contract6-projection.d.ts.map +1 -1
- package/dist/application/contract6-projection.js +31 -1
- package/dist/application/contract6-projection.js.map +1 -1
- package/dist/application/target-actuals-write.d.ts +2 -1
- package/dist/application/target-actuals-write.d.ts.map +1 -1
- package/dist/application/target-actuals-write.js.map +1 -1
- package/dist/cli.js +78 -15
- package/dist/cli.js.map +1 -1
- package/dist/command/actuals-discovery.d.ts.map +1 -1
- package/dist/command/actuals-discovery.js +50 -4
- package/dist/command/actuals-discovery.js.map +1 -1
- package/dist/help/registry.d.ts.map +1 -1
- package/dist/help/registry.js +11 -1
- package/dist/help/registry.js.map +1 -1
- package/dist/history/advance-history.d.ts +44 -0
- package/dist/history/advance-history.d.ts.map +1 -0
- package/dist/history/advance-history.js +379 -0
- package/dist/history/advance-history.js.map +1 -0
- package/dist/history/git-probe.d.ts +40 -0
- package/dist/history/git-probe.d.ts.map +1 -1
- package/dist/history/git-probe.js +330 -0
- package/dist/history/git-probe.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/mutation/advance-deletion.d.ts +14 -0
- package/dist/mutation/advance-deletion.d.ts.map +1 -0
- package/dist/mutation/advance-deletion.js +53 -0
- package/dist/mutation/advance-deletion.js.map +1 -0
- package/dist/mutation/advance.d.ts.map +1 -1
- package/dist/mutation/advance.js +8 -25
- package/dist/mutation/advance.js.map +1 -1
- package/dist/schema/registry.d.ts.map +1 -1
- package/dist/schema/registry.js +1 -0
- package/dist/schema/registry.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
- package/schemas/Perttool.AdvanceResult.v1.schema.json +254 -0
|
@@ -73,12 +73,35 @@ function lifecycleToJson(result) {
|
|
|
73
73
|
coverage: lifecycle.coverage,
|
|
74
74
|
};
|
|
75
75
|
}
|
|
76
|
+
function advanceHistoryGuardToJson(value) {
|
|
77
|
+
return {
|
|
78
|
+
model_version: value.modelVersion,
|
|
79
|
+
status: value.status,
|
|
80
|
+
cause: value.cause,
|
|
81
|
+
repository_snapshot_id: value.repositorySnapshotId,
|
|
82
|
+
repository_relative_path: value.repositoryRelativePath,
|
|
83
|
+
head_commit_id: value.headCommitId,
|
|
84
|
+
source_digest: value.sourceDigest,
|
|
85
|
+
candidate_digest: value.candidateDigest,
|
|
86
|
+
source_modified_at: value.sourceModifiedAt,
|
|
87
|
+
source_bytes: value.sourceBytes,
|
|
88
|
+
candidate_bytes: value.candidateBytes,
|
|
89
|
+
diff_added_lines: value.diffAddedLines,
|
|
90
|
+
diff_removed_lines: value.diffRemovedLines,
|
|
91
|
+
destructive_entity_ids: value.destructiveEntityIds,
|
|
92
|
+
overlapping_entity_ids: value.overlappingEntityIds,
|
|
93
|
+
force_requested: value.forceRequested,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
76
96
|
export function contract6MutationResultToJson(result, operation, source, write) {
|
|
77
97
|
const base = targetGovernanceMutationResultToJson(result, operation, source, write);
|
|
78
98
|
if ("advance" in result) {
|
|
99
|
+
const historyGuard = "historyGuard" in result ? result.historyGuard : undefined;
|
|
79
100
|
return Object.freeze({
|
|
80
101
|
...base,
|
|
81
|
-
schema_version:
|
|
102
|
+
schema_version: historyGuard === undefined
|
|
103
|
+
? "Perttool.MutationResult.v3"
|
|
104
|
+
: "Perttool.AdvanceResult.v1",
|
|
82
105
|
cli_contract_version: 6,
|
|
83
106
|
lifecycle: null,
|
|
84
107
|
advance: result.advance === null
|
|
@@ -93,6 +116,13 @@ export function contract6MutationResultToJson(result, operation, source, write)
|
|
|
93
116
|
ready_before: result.advance.readyBefore,
|
|
94
117
|
ready_after: result.advance.readyAfter,
|
|
95
118
|
},
|
|
119
|
+
...(historyGuard === undefined
|
|
120
|
+
? {}
|
|
121
|
+
: {
|
|
122
|
+
history_guard: historyGuard === null
|
|
123
|
+
? null
|
|
124
|
+
: advanceHistoryGuardToJson(historyGuard),
|
|
125
|
+
}),
|
|
96
126
|
});
|
|
97
127
|
}
|
|
98
128
|
return Object.freeze({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contract6-projection.js","sourceRoot":"","sources":["../../src/application/contract6-projection.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,4BAA4B,GAC7B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,aAAa,GACd,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"contract6-projection.js","sourceRoot":"","sources":["../../src/application/contract6-projection.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,5 +3,6 @@ import { type TargetGovernancePersistenceRequest } from "./target-governance-wri
|
|
|
3
3
|
import type { TargetGovernanceWriteProjection } from "./target-governance-projection.js";
|
|
4
4
|
import type { TargetActualsMutationResultV3 } from "./target-actuals-mutation.js";
|
|
5
5
|
import type { TargetActualsAdvanceResultV3 } from "./target-actuals-advance.js";
|
|
6
|
-
|
|
6
|
+
import type { AdvanceResultV1 } from "./advance-history.js";
|
|
7
|
+
export declare function persistTargetActualsResult(result: TargetActualsMutationResultV3 | TargetActualsAdvanceResultV3 | AdvanceResultV1, capability: TargetGrammar5Capability, request: TargetGovernancePersistenceRequest): Promise<TargetGovernanceWriteProjection>;
|
|
7
8
|
//# sourceMappingURL=target-actuals-write.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"target-actuals-write.d.ts","sourceRoot":"","sources":["../../src/application/target-actuals-write.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,wBAAwB,EACzB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAEL,KAAK,kCAAkC,EACxC,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EACV,+BAA+B,EAChC,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EACV,6BAA6B,EAC9B,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EACV,4BAA4B,EAC7B,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"target-actuals-write.d.ts","sourceRoot":"","sources":["../../src/application/target-actuals-write.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,wBAAwB,EACzB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAEL,KAAK,kCAAkC,EACxC,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EACV,+BAA+B,EAChC,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EACV,6BAA6B,EAC9B,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EACV,4BAA4B,EAC7B,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EACV,eAAe,EAChB,MAAM,sBAAsB,CAAC;AAa9B,wBAAsB,0BAA0B,CAC9C,MAAM,EACF,6BAA6B,GAC7B,4BAA4B,GAC5B,eAAe,EACnB,UAAU,EAAE,wBAAwB,EACpC,OAAO,EAAE,kCAAkC,GAC1C,OAAO,CAAC,+BAA+B,CAAC,CA0C1C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"target-actuals-write.js","sourceRoot":"","sources":["../../src/application/target-actuals-write.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gCAAgC,EAChC,0CAA0C,EAC1C,iCAAiC,GAClC,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAI7D,OAAO,EACL,2BAA2B,GAE5B,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"target-actuals-write.js","sourceRoot":"","sources":["../../src/application/target-actuals-write.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gCAAgC,EAChC,0CAA0C,EAC1C,iCAAiC,GAClC,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAI7D,OAAO,EACL,2BAA2B,GAE5B,MAAM,8BAA8B,CAAC;AActC,SAAS,eAAe,CACtB,OAA2C,EAC3C,OAAgB;IAEhB,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,OAAO;KACR,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,MAGmB,EACnB,UAAoC,EACpC,OAA2C;IAE3C,MAAM,aAAa,GAAG,2BAA2B,CAAC,MAAM,CAAC,CAAC;IAC1D,IAAI,aAAa,KAAK,IAAI;QAAE,OAAO,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAEnE,MAAM,MAAM,GACV,OAAO,CAAC,IAAI,KAAK,UAAU;QACzB,CAAC,CAAC,MAAM,iCAAiC,CACrC,OAAO,CAAC,MAAM,EACd,aAAa,EACb,UAAU,EACV;YACE,aAAa,EAAE,MAAM,CAAC,cAAc;YACpC,GAAG,CAAC,OAAO,CAAC,cAAc,KAAK,SAAS;gBACtC,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC;SAChD,CACF;QACH,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,GAAG;YACtB,CAAC,CAAC,MAAM,gCAAgC,CACpC,OAAO,CAAC,MAAM,EACd,aAAa,EACb,UAAU,EACV,OAAO,CAAC,QAAQ,KAAK,SAAS;gBAC5B,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,CAC/B;YACH,CAAC,CAAC,MAAM,0CAA0C,CAC9C,OAAO,CAAC,MAAM,EACd,OAAO,CAAC,MAAM,EACd,aAAa,EACb,UAAU,EACV;gBACE,aAAa,EAAE,MAAM,CAAC,cAAc;gBACpC,GAAG,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS;oBAChC,CAAC,CAAC,EAAE;oBACJ,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC;aAChC,CACF,CAAC;IACV,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,aAAa,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC5E,CAAC;IACD,OAAO,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;AAClD,CAAC"}
|
package/dist/cli.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { lstat, readFile } from "node:fs/promises";
|
|
3
3
|
import process from "node:process";
|
|
4
4
|
import { TextDecoder } from "node:util";
|
|
5
5
|
import { analyzeDocument, selectNextTasks, } from "./application/contract6-actuals.js";
|
|
@@ -11,6 +11,7 @@ import { getProjectMetadata, } from "./application/project.js";
|
|
|
11
11
|
import { planAdvance, planBatchMutation, planFinishActuals, planLifecycle, planMutation, } from "./application/contract6-mutation.js";
|
|
12
12
|
import { renderTargetGovernanceDecision, renderTargetGovernanceProjectText, } from "./application/target-governance-projection.js";
|
|
13
13
|
import { contract6MutationResultToJson, contract6ProjectResultToJson, contract6WorkEventToJson, } from "./application/contract6-projection.js";
|
|
14
|
+
import { prepareAdvanceHistory, renderAdvanceHistoryGuard, withAdvanceHistoryRace, } from "./application/advance-history.js";
|
|
14
15
|
import { persistTargetActualsResult, } from "./application/target-actuals-write.js";
|
|
15
16
|
import { inspectTargetProjectHistoryFile, renderTargetProjectHistoryText, targetProjectHistoryResultToJson, } from "./application/target-project-history.js";
|
|
16
17
|
import { observeTargetProjectVelocity, renderTargetVelocityObservationText, targetVelocityObservationResultToJson, } from "./application/target-velocity-observation.js";
|
|
@@ -25,6 +26,7 @@ import { renderActualsCommandUsageError, serializeActualsCommandUsageError, vali
|
|
|
25
26
|
import { agentGuidanceResultToJson } from "./guidance/projection.js";
|
|
26
27
|
import { agentGuidanceExitCode, renderAgentGuidanceText, } from "./guidance/text.js";
|
|
27
28
|
import { documentContentFromBytes, readDocumentFile, } from "./io/document-file.js";
|
|
29
|
+
import { recheckAdvanceHistoryBaseline, } from "./history/git-probe.js";
|
|
28
30
|
import { createArtifactFile, createDocumentFile, replaceDocumentFile, SafeWriteConflictError, SafeWriteVerificationError, } from "./io/safe-write.js";
|
|
29
31
|
import { formatDecimal } from "./model/rational.js";
|
|
30
32
|
import { convertWithVelocity, durationSuffix } from "./model/units.js";
|
|
@@ -177,7 +179,24 @@ async function readDocument(source) {
|
|
|
177
179
|
const content = source === "-"
|
|
178
180
|
? documentContentFromBytes(await readStdin())
|
|
179
181
|
: await readDocumentFile(source);
|
|
180
|
-
|
|
182
|
+
let modifiedAt = null;
|
|
183
|
+
if (source !== "-") {
|
|
184
|
+
try {
|
|
185
|
+
const metadata = await lstat(source, { bigint: true });
|
|
186
|
+
if (metadata.isFile() && !metadata.isSymbolicLink()) {
|
|
187
|
+
modifiedAt = new Date(Number(metadata.mtimeNs / 1000000n)).toISOString();
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
catch {
|
|
191
|
+
modifiedAt = null;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return {
|
|
195
|
+
text: content.text,
|
|
196
|
+
digest: content.digest,
|
|
197
|
+
bytes: content.bytes,
|
|
198
|
+
modifiedAt,
|
|
199
|
+
};
|
|
181
200
|
}
|
|
182
201
|
async function readStdin() {
|
|
183
202
|
const chunks = [];
|
|
@@ -1543,6 +1562,10 @@ async function runAdvance(args) {
|
|
|
1543
1562
|
const maxDiagnostics = boundedInteger(parsed.values.get("max-diagnostics"), "max-diagnostics", 100, 1, 1000);
|
|
1544
1563
|
const sourceOperand = parsed.positionals[0];
|
|
1545
1564
|
const writeRequest = editingWriteRequest(parsed, sourceOperand);
|
|
1565
|
+
const forceRequested = parsed.flags.has("force-history-loss");
|
|
1566
|
+
if (forceRequested && writeRequest.mode !== "in_place") {
|
|
1567
|
+
throw new UsageError("--force-history-loss can only be used with --write");
|
|
1568
|
+
}
|
|
1546
1569
|
const source = sourceOperand === "-" ? "<stdin>" : sourceOperand;
|
|
1547
1570
|
let input;
|
|
1548
1571
|
try {
|
|
@@ -1551,23 +1574,54 @@ async function runAdvance(args) {
|
|
|
1551
1574
|
catch (error) {
|
|
1552
1575
|
return cliError(error instanceof Error ? error : new Error(String(error)), 3, "dag.advance", format === "json");
|
|
1553
1576
|
}
|
|
1554
|
-
const
|
|
1577
|
+
const planned = planAdvance(input.text, {
|
|
1555
1578
|
maxDiagnostics,
|
|
1556
1579
|
originalLabel: source,
|
|
1557
1580
|
updatedLabel: "candidate",
|
|
1558
1581
|
governance: governanceRequest(parsed, writeRequest),
|
|
1559
1582
|
});
|
|
1583
|
+
const initialWarningFailure = parsed.flags.has("warnings-as-errors") &&
|
|
1584
|
+
(planned.diagnosticsTruncated ||
|
|
1585
|
+
planned.diagnostics.some((diagnostic) => diagnostic.severity === "warning"));
|
|
1586
|
+
const prepared = await prepareAdvanceHistory(input.text, planned, {
|
|
1587
|
+
mode: writeRequest.mode === "out"
|
|
1588
|
+
? "out"
|
|
1589
|
+
: writeRequest.mode,
|
|
1590
|
+
sourceBytes: input.bytes,
|
|
1591
|
+
sourceModifiedAt: input.modifiedAt,
|
|
1592
|
+
...(writeRequest.mode === "in_place"
|
|
1593
|
+
? { targetPath: sourceOperand }
|
|
1594
|
+
: {}),
|
|
1595
|
+
forceRequested,
|
|
1596
|
+
warningDenied: initialWarningFailure,
|
|
1597
|
+
maxDiagnostics,
|
|
1598
|
+
});
|
|
1599
|
+
let result = prepared.result;
|
|
1560
1600
|
const warningFailure = parsed.flags.has("warnings-as-errors") &&
|
|
1561
1601
|
(result.diagnosticsTruncated ||
|
|
1562
1602
|
result.diagnostics.some((diagnostic) => diagnostic.severity === "warning"));
|
|
1563
|
-
|
|
1603
|
+
let ok = result.ok && !warningFailure;
|
|
1604
|
+
let historyRace = false;
|
|
1564
1605
|
let writeResult = Object.freeze({
|
|
1565
1606
|
mode: writeRequest.mode,
|
|
1566
1607
|
target: writeRequest.target,
|
|
1567
1608
|
written: false,
|
|
1568
1609
|
});
|
|
1569
|
-
if (result.
|
|
1610
|
+
if (result.updatedText !== null) {
|
|
1570
1611
|
try {
|
|
1612
|
+
if (ok &&
|
|
1613
|
+
writeRequest.mode === "in_place" &&
|
|
1614
|
+
prepared.baseline !== null &&
|
|
1615
|
+
prepared.baseline.status === "complete" &&
|
|
1616
|
+
(result.historyGuard?.status === "passed" ||
|
|
1617
|
+
result.historyGuard?.status === "forced")) {
|
|
1618
|
+
const recheck = await recheckAdvanceHistoryBaseline(prepared.baseline, sourceOperand);
|
|
1619
|
+
if (!recheck.ok) {
|
|
1620
|
+
result = withAdvanceHistoryRace(result, recheck, maxDiagnostics);
|
|
1621
|
+
ok = false;
|
|
1622
|
+
historyRace = true;
|
|
1623
|
+
}
|
|
1624
|
+
}
|
|
1571
1625
|
if (ok && writeRequest.mode !== "preview") {
|
|
1572
1626
|
writeResult = await persistGovernedResult(result, writeRequest, sourceOperand);
|
|
1573
1627
|
}
|
|
@@ -1580,17 +1634,26 @@ async function runAdvance(args) {
|
|
|
1580
1634
|
writeJson(contract6MutationResultToJson(ok ? result : Object.freeze({ ...result, ok: false }), "dag.advance", source, writeResult));
|
|
1581
1635
|
}
|
|
1582
1636
|
else {
|
|
1583
|
-
if (
|
|
1584
|
-
if (
|
|
1585
|
-
|
|
1586
|
-
|
|
1587
|
-
|
|
1588
|
-
|
|
1589
|
-
|
|
1590
|
-
|
|
1637
|
+
if (result.advance !== null) {
|
|
1638
|
+
if (ok) {
|
|
1639
|
+
if (writeRequest.mode !== "preview") {
|
|
1640
|
+
process.stderr.write(renderGovernanceWriteSummary("dag.advance", writeResult, result.updatedDigest));
|
|
1641
|
+
}
|
|
1642
|
+
else {
|
|
1643
|
+
process.stdout.write(parsed.flags.has("diff") ? (result.diff ?? "") : (result.updatedText ?? ""));
|
|
1644
|
+
if (!parsed.flags.has("diff")) {
|
|
1645
|
+
process.stderr.write(`PREVIEW dag.advance changed=${result.changed} original_digest=${result.originalDigest} updated_digest=${result.updatedDigest}\n`);
|
|
1646
|
+
}
|
|
1591
1647
|
}
|
|
1592
1648
|
}
|
|
1593
|
-
|
|
1649
|
+
if (ok ||
|
|
1650
|
+
result.historyGuard?.status === "blocked" ||
|
|
1651
|
+
result.historyGuard?.status === "forced") {
|
|
1652
|
+
process.stderr.write(renderAdvanceSummary(result.advance));
|
|
1653
|
+
}
|
|
1654
|
+
}
|
|
1655
|
+
if (result.historyGuard !== null) {
|
|
1656
|
+
process.stderr.write(renderAdvanceHistoryGuard(result.historyGuard));
|
|
1594
1657
|
}
|
|
1595
1658
|
if (result.governance !== null) {
|
|
1596
1659
|
process.stderr.write(renderTargetGovernanceDecision(result.governance));
|
|
@@ -1602,7 +1665,7 @@ async function runAdvance(args) {
|
|
|
1602
1665
|
process.stderr.write(`DIAGNOSTICS_TRUNCATED true limit=${maxDiagnostics}\n`);
|
|
1603
1666
|
}
|
|
1604
1667
|
}
|
|
1605
|
-
return ok ? 0 : 1;
|
|
1668
|
+
return ok ? 0 : historyRace ? 5 : 1;
|
|
1606
1669
|
}
|
|
1607
1670
|
function rationalJson(value, unit, precision) {
|
|
1608
1671
|
return {
|