gitifact 0.5.1 → 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/dist/THIRD_PARTY_NOTICES.txt +3495 -191
- package/dist/browser/assets/BottomSheet-BFoM6syr.js +1 -0
- package/dist/browser/assets/Grid-C9rNT-fL.js +1 -0
- package/dist/browser/assets/Icon-DPaLmsmh.js +4 -0
- package/dist/browser/assets/IconButton-Br-4XhQr.js +1 -0
- package/dist/browser/assets/Markdown-Bc6pMi97.js +68 -0
- package/dist/browser/assets/{MenuBottomSheet-CQA7HL9k.js → MenuBottomSheet-Dgz4h1S7.js} +1 -1
- package/dist/browser/assets/MetadataListItem-BjA4nmg3.js +1 -0
- package/dist/browser/assets/ProgressBarMarkTooltip-BxGSd9KS.js +1 -0
- package/dist/browser/assets/Section-Z2PuhE6c.js +1 -0
- package/dist/browser/assets/Table-DodMTw3P.js +3 -0
- package/dist/browser/assets/TimestampHoverCard-BJShn6bb.js +1 -0
- package/dist/browser/assets/Tooltip-MoU3alsv.js +1 -0
- package/dist/browser/assets/abnfDiagram-VCTEODGH-DmAlk-TR.js +1 -0
- package/dist/browser/assets/{about-Chl-XBQg.js → about-CmwTK0Rl.js} +1 -1
- package/dist/browser/assets/activity-BF4_xkCU.js +1 -0
- package/dist/browser/assets/appearance-pAOSjMU4.js +1 -0
- package/dist/browser/assets/arc-Pry-7G1_.js +1 -0
- package/dist/browser/assets/architecture-7GRP2DOG-BuddTnfb.js +1 -0
- package/dist/browser/assets/architectureDiagram-5GKGNRK7-VwuVv8aO.js +36 -0
- package/dist/browser/assets/array-BifhSqXX.js +1 -0
- package/dist/browser/assets/blockDiagram-I7D4REHJ-BY92gQgN.js +129 -0
- package/dist/browser/assets/c4Diagram-7LVT6UL2-D5TNBYXh.js +38 -0
- package/dist/browser/assets/changelog-Dm-wCZt4.js +2 -0
- package/dist/browser/assets/channel-NEbtzeVB.js +1 -0
- package/dist/browser/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
- package/dist/browser/assets/chunk-4HAMMTFA-DBbX-wzu.js +62 -0
- package/dist/browser/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
- package/dist/browser/assets/chunk-75Z2AOVW-962-yyBD.js +2 -0
- package/dist/browser/assets/chunk-DU6HZSFF-CHHMX1CR.js +127 -0
- package/dist/browser/assets/chunk-F27PBJKO-BOnYAGjZ.js +1 -0
- package/dist/browser/assets/chunk-FOHPRMQF-DzxwRta7.js +161 -0
- package/dist/browser/assets/chunk-GMAD6QVW-DQF31PdR.js +72 -0
- package/dist/browser/assets/chunk-GVQU2GXP-rruJzn36.js +1 -0
- package/dist/browser/assets/chunk-IMKFNOWR-CZ8ptS4j.js +231 -0
- package/dist/browser/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
- package/dist/browser/assets/chunk-L3NEJ4N5-USlKRxmU.js +1 -0
- package/dist/browser/assets/chunk-OSK3NFVY-DYQeYWNP.js +10 -0
- package/dist/browser/assets/chunk-P2QGCYS3-SDkZ9hQX.js +1 -0
- package/dist/browser/assets/chunk-POPQ4Y6H-bdnFdIMc.js +1 -0
- package/dist/browser/assets/chunk-PWAF6VOD-DuKrEmQw.js +1 -0
- package/dist/browser/assets/chunk-SHT3W25Y-IggbHeog.js +168 -0
- package/dist/browser/assets/chunk-SVP7TREG-BxYPjkqU.js +88 -0
- package/dist/browser/assets/chunk-TICWLB2K-DMrY9ez0.js +206 -0
- package/dist/browser/assets/chunk-XXDRQBXY-DqAYeljN.js +1 -0
- package/dist/browser/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
- package/dist/browser/assets/classDiagram-ZZMXUADV-BwE_Hs5R.js +1 -0
- package/dist/browser/assets/classDiagram-v2-VYDZK3BY-BwE_Hs5R.js +1 -0
- package/dist/browser/assets/{container.stylex-oPimSCGl.js → container.stylex-rwI38dw9.js} +1 -1
- package/dist/browser/assets/{contributors._email-CINLTSX2.js → contributors._email-C99eiup4.js} +1 -1
- package/dist/browser/assets/contributors.index-BzPuT_XG.js +1 -0
- package/dist/browser/assets/cose-bilkent-JH36ORCC-BEpcWcmK.js +1 -0
- package/dist/browser/assets/cynefin-OW5HDTMX-C4N2LLi1.js +1 -0
- package/dist/browser/assets/cynefinDiagram-5FMLGOSQ-C3KE8asf.js +62 -0
- package/dist/browser/assets/cytoscape.esm-Yq6u8L66.js +321 -0
- package/dist/browser/assets/dagre-C-rnJpZF.js +1 -0
- package/dist/browser/assets/dagre-GXQ25YYZ-C20xAaTE.js +4 -0
- package/dist/browser/assets/defaultLocale-BFoDCU3G.js +1 -0
- package/dist/browser/assets/diagram-S7CK7UJ4-6wtbgLIX.js +30 -0
- package/dist/browser/assets/diagram-UQ7AKVKN-BA02zKbd.js +41 -0
- package/dist/browser/assets/diagram-VSXAHHWV-Bl0Bun2O.js +3 -0
- package/dist/browser/assets/diagram-VX7I27RA-ChsRTsfS.js +24 -0
- package/dist/browser/assets/diagram-Z3DM3KII-B3Mxficd.js +24 -0
- package/dist/browser/assets/dist-v5Q1xZ2K.js +1 -0
- package/dist/browser/assets/document-CaUvlKcm.css +1 -0
- package/dist/browser/assets/document-DcPjYojg.js +11 -0
- package/dist/browser/assets/ebnfDiagram-PWID7BFC-Cs_89QgY.js +1 -0
- package/dist/browser/assets/erDiagram-RLTQ6QDP-BefkilYT.js +99 -0
- package/dist/browser/assets/eventmodeling-NTZA5JFV-OyiymXqZ.js +1 -0
- package/dist/browser/assets/{features._featureId-FySsJ2tl.js → features._featureId-BVMBUbIc.js} +1 -1
- package/dist/browser/assets/features.index-DAF_MoVe.js +1 -0
- package/dist/browser/assets/flowDiagram-HODETNUW-BGkl5kD6.js +1 -0
- package/dist/browser/assets/ganttDiagram-EL5Y4UJY-B_Y3HJTL.js +292 -0
- package/dist/browser/assets/git-CuBxy8Rl.js +1 -0
- package/dist/browser/assets/gitGraph-4MIJSDKK-CPDeR11I.js +1 -0
- package/dist/browser/assets/gitGraphDiagram-WWUBYQGX-B89zUhQY.js +106 -0
- package/dist/browser/assets/graphlib-DS17s2tU.js +1 -0
- package/dist/browser/assets/index-w5oyNndb.js +48 -0
- package/dist/browser/assets/info-A6RAGUB7-DlEdyaYJ.js +1 -0
- package/dist/browser/assets/infoDiagram-27XIBGKW-T8vu4pEW.js +2 -0
- package/dist/browser/assets/init-C-OQMol4.js +1 -0
- package/dist/browser/assets/ishikawaDiagram-5VMMS53U-B4C53CII.js +70 -0
- package/dist/browser/assets/journeyDiagram-3NMN7TZE-DemWKqD6.js +139 -0
- package/dist/browser/assets/kanban-definition-UXKFOSKX-xMvrIZPT.js +89 -0
- package/dist/browser/assets/katex-ZlcWpGUi.js +257 -0
- package/dist/browser/assets/line-CfCBYCoS.js +1 -0
- package/dist/browser/assets/linear-SzVmGSw4.js +1 -0
- package/dist/browser/assets/mermaid-parser.core-DCp4gVZn.js +7 -0
- package/dist/browser/assets/mermaid.core-ny8BaDSG.js +44 -0
- package/dist/browser/assets/mindmap-definition-YA3MSWOX-CNWF3H17.js +96 -0
- package/dist/browser/assets/ordinal-BDEzSJ7C.js +1 -0
- package/dist/browser/assets/packet-AYTQ26CC-DgNRIjqj.js +1 -0
- package/dist/browser/assets/page-header-DPWfThZo.js +124 -0
- package/dist/browser/assets/page-header-DZvVAckA.css +1 -0
- package/dist/browser/assets/path-fybaL0A-.js +1 -0
- package/dist/browser/assets/pegDiagram-XKGWAZYB-BPEzoUlc.js +1 -0
- package/dist/browser/assets/pie-WAS4IAKB-D85SGg9H.js +1 -0
- package/dist/browser/assets/pieDiagram-E7YTZNPT-L5HtHPrJ.js +39 -0
- package/dist/browser/assets/preload-helper-BZ1Pz5am.js +1 -0
- package/dist/browser/assets/product-BR5KVGuJ.css +1 -0
- package/dist/browser/assets/product-BmoIKtGm.js +8 -0
- package/dist/browser/assets/product.index-Fb5sQw1w.js +1 -0
- package/dist/browser/assets/quadrantDiagram-AXDQQJYC-BFek-axl.js +7 -0
- package/dist/browser/assets/radar-RG4KPBEZ-BwPngHhh.js +1 -0
- package/dist/browser/assets/railroad-74A4TZTK-Bf5cESw-.js +1 -0
- package/dist/browser/assets/railroad-abnf-HS5TGJTU-QtVzwDRk.js +1 -0
- package/dist/browser/assets/railroad-ebnf-LZEXJU2U-CCcgn2jt.js +1 -0
- package/dist/browser/assets/railroad-peg-WCYAUIDC-DWRNBkSL.js +1 -0
- package/dist/browser/assets/railroadDiagram-O6MQD6OU-0D-Z1mj1.js +1 -0
- package/dist/browser/assets/request-state-B7pKmdbJ.js +1 -0
- package/dist/browser/assets/requirementDiagram-BXWQKSXE-8pNButqN.js +84 -0
- package/dist/browser/assets/requirements-DGx4_rNJ.js +1 -0
- package/dist/browser/assets/rolldown-runtime-hePW80VL.js +1 -0
- package/dist/browser/assets/rough.esm-Dy-Kn_BL.js +1 -0
- package/dist/browser/assets/sankeyDiagram-P5KCCOFB-BOWaOPXp.js +40 -0
- package/dist/browser/assets/sequenceDiagram-WJ2MYXX4-BA3_JPLh.js +162 -0
- package/dist/browser/assets/settings-5JQQOYMj.js +1 -0
- package/dist/browser/assets/sizeCapture-INFHLROL-B0uUizjq.js +1 -0
- package/dist/browser/assets/src-B6xuSHsQ.js +1 -0
- package/dist/browser/assets/stateDiagram-D77RDMKH-YYcbi5Z-.js +1 -0
- package/dist/browser/assets/stateDiagram-v2-MP3YSRHH-BEg6dLDA.js +1 -0
- package/dist/browser/assets/swimlanes-42K2YHIH-B_Eh1oqP.js +1 -0
- package/dist/browser/assets/swimlanesDiagram-VR7AAH4N-Bckt0ZyW.js +8 -0
- package/dist/browser/assets/themeProps-CkLe5zXY.js +1 -0
- package/dist/browser/assets/timeline-definition-24CTP7MA-DfFHHbdC.js +120 -0
- package/dist/browser/assets/treeView-Q6P3EWNA-CaZRyAuW.js +1 -0
- package/dist/browser/assets/treemap-WGGIJYW6-DI2-Ryxd.js +1 -0
- package/dist/browser/assets/useClipboard-Cqx6Upy7.js +1 -0
- package/dist/browser/assets/useDevWarning-Dudfg3qF.js +1 -0
- package/dist/browser/assets/useIsomorphicLayoutEffect-BiEJxDg_.js +1 -0
- package/dist/browser/assets/useMediaQuery-twbHF0pO.js +1 -0
- package/dist/browser/assets/useScrollLock-D-Y-zHSV.js +1 -0
- package/dist/browser/assets/vennDiagram-4TSXK5OY-QXok2k3u.js +34 -0
- package/dist/browser/assets/wardley-WFR3VGLG-BiXQYqiJ.js +1 -0
- package/dist/browser/assets/wardleyDiagram-VM6X3IG4-BZBhm2Zm.js +78 -0
- package/dist/browser/assets/{wiki-DYxjYiPl.js → wiki-k4dXogJF.js} +1 -1
- package/dist/browser/assets/xychartDiagram-S5SC5T6Z-qrzzwM55.js +7 -0
- package/dist/browser/index.html +26 -25
- package/dist/i18n/ko/block.md +1 -0
- package/dist/i18n/ko/changelog.md +15 -0
- package/dist/i18n/ko/docs/commit.md +0 -1
- package/dist/i18n/ko/docs/design.md +2 -0
- package/dist/i18n/ko/docs/spec.md +2 -0
- package/dist/i18n/ko/docs/wiki.md +2 -0
- package/dist/i18n/ko/docs/writing.md +54 -0
- package/dist/main.js +119 -336
- package/package.json +3 -3
- package/dist/browser/assets/BottomSheet-F2BUQwSi.js +0 -1
- package/dist/browser/assets/Grid-kXvDaAvk.js +0 -1
- package/dist/browser/assets/IconButton-CkA9oftf.js +0 -1
- package/dist/browser/assets/Markdown-CqZ4w2H_.js +0 -68
- package/dist/browser/assets/MetadataListItem-B6xUZEC3.js +0 -1
- package/dist/browser/assets/ProgressBarMarkTooltip-BVcVKVq9.js +0 -1
- package/dist/browser/assets/Section-zmL2D3WL.js +0 -1
- package/dist/browser/assets/Table-DDKWqCdD.js +0 -3
- package/dist/browser/assets/TimestampHoverCard-DOWpOAzA.js +0 -1
- package/dist/browser/assets/Tooltip-a2AGdnkC.js +0 -1
- package/dist/browser/assets/activity-F2_AhgBS.js +0 -1
- package/dist/browser/assets/changelog-DrJfyXDZ.js +0 -2
- package/dist/browser/assets/composeEventHandlers-CHIontwB.js +0 -1
- package/dist/browser/assets/contributors.index-ChB89wcL.js +0 -1
- package/dist/browser/assets/devWarning-BZMSgwyk.js +0 -1
- package/dist/browser/assets/document-Jy6Buepz.js +0 -9
- package/dist/browser/assets/document-QMuypGH5.css +0 -1
- package/dist/browser/assets/features.index-DWfPG8WV.js +0 -1
- package/dist/browser/assets/git-AnH-8SBT.js +0 -1
- package/dist/browser/assets/index-DXK4gUTr.js +0 -48
- package/dist/browser/assets/page-header-9-i3H9WR.css +0 -1
- package/dist/browser/assets/page-header-N7A_M6-B.js +0 -124
- package/dist/browser/assets/product-BKOKDrzZ.js +0 -8
- package/dist/browser/assets/product-DNlxFjU7.css +0 -1
- package/dist/browser/assets/product.index-BohDJK9z.js +0 -1
- package/dist/browser/assets/request-state-CO3OLoay.js +0 -1
- package/dist/browser/assets/requirements-Dh2NEqNw.js +0 -1
- package/dist/browser/assets/settings-DylPhHVJ.js +0 -1
- package/dist/browser/assets/themeProps-MQSlTycI.js +0 -1
- package/dist/browser/assets/useClipboard-B8Or2k0a.js +0 -1
- package/dist/browser/assets/useDevWarning-Xg7kPMHJ.js +0 -1
- package/dist/browser/assets/useIsomorphicLayoutEffect-f8dYmyS2.js +0 -1
- package/dist/browser/assets/useMediaQuery-DFlnKIlp.js +0 -1
- package/dist/browser/assets/useScrollLock-CrQ0xkil.js +0 -1
- package/dist/browser/assets/useTranslator-DY2HN18N.js +0 -4
package/dist/main.js
CHANGED
|
@@ -1537,16 +1537,16 @@ var Command = class _Command extends EventEmitter {
|
|
|
1537
1537
|
* @param {Function} listener
|
|
1538
1538
|
* @return {Command} `this` command for chaining
|
|
1539
1539
|
*/
|
|
1540
|
-
hook(
|
|
1540
|
+
hook(event2, listener) {
|
|
1541
1541
|
const allowedValues = ["preSubcommand", "preAction", "postAction"];
|
|
1542
|
-
if (!allowedValues.includes(
|
|
1543
|
-
throw new Error(`Unexpected value for event passed to hook : '${
|
|
1542
|
+
if (!allowedValues.includes(event2)) {
|
|
1543
|
+
throw new Error(`Unexpected value for event passed to hook : '${event2}'.
|
|
1544
1544
|
Expecting one of '${allowedValues.join("', '")}'`);
|
|
1545
1545
|
}
|
|
1546
|
-
if (this._lifeCycleHooks[
|
|
1547
|
-
this._lifeCycleHooks[
|
|
1546
|
+
if (this._lifeCycleHooks[event2]) {
|
|
1547
|
+
this._lifeCycleHooks[event2].push(listener);
|
|
1548
1548
|
} else {
|
|
1549
|
-
this._lifeCycleHooks[
|
|
1549
|
+
this._lifeCycleHooks[event2] = [listener];
|
|
1550
1550
|
}
|
|
1551
1551
|
return this;
|
|
1552
1552
|
}
|
|
@@ -2383,15 +2383,15 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
|
2383
2383
|
* @return {(Promise|undefined)}
|
|
2384
2384
|
* @private
|
|
2385
2385
|
*/
|
|
2386
|
-
_chainOrCallHooks(promise2,
|
|
2386
|
+
_chainOrCallHooks(promise2, event2) {
|
|
2387
2387
|
let result = promise2;
|
|
2388
2388
|
const hooks = [];
|
|
2389
|
-
this._getCommandAndAncestors().reverse().filter((cmd) => cmd._lifeCycleHooks[
|
|
2390
|
-
hookedCommand._lifeCycleHooks[
|
|
2389
|
+
this._getCommandAndAncestors().reverse().filter((cmd) => cmd._lifeCycleHooks[event2] !== void 0).forEach((hookedCommand) => {
|
|
2390
|
+
hookedCommand._lifeCycleHooks[event2].forEach((callback) => {
|
|
2391
2391
|
hooks.push({ hookedCommand, callback });
|
|
2392
2392
|
});
|
|
2393
2393
|
});
|
|
2394
|
-
if (
|
|
2394
|
+
if (event2 === "postAction") {
|
|
2395
2395
|
hooks.reverse();
|
|
2396
2396
|
}
|
|
2397
2397
|
hooks.forEach((hookDetail) => {
|
|
@@ -2409,10 +2409,10 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
|
2409
2409
|
* @return {(Promise|undefined)}
|
|
2410
2410
|
* @private
|
|
2411
2411
|
*/
|
|
2412
|
-
_chainOrCallSubCommandHook(promise2, subCommand,
|
|
2412
|
+
_chainOrCallSubCommandHook(promise2, subCommand, event2) {
|
|
2413
2413
|
let result = promise2;
|
|
2414
|
-
if (this._lifeCycleHooks[
|
|
2415
|
-
this._lifeCycleHooks[
|
|
2414
|
+
if (this._lifeCycleHooks[event2] !== void 0) {
|
|
2415
|
+
this._lifeCycleHooks[event2].forEach((hook) => {
|
|
2416
2416
|
result = this._chainOrCall(result, () => {
|
|
2417
2417
|
return hook(this, subCommand);
|
|
2418
2418
|
});
|
|
@@ -3779,9 +3779,9 @@ function parseDesignPreview(source2, specId) {
|
|
|
3779
3779
|
fence = void 0;
|
|
3780
3780
|
return line;
|
|
3781
3781
|
}
|
|
3782
|
-
const
|
|
3783
|
-
if (
|
|
3784
|
-
fence = { char:
|
|
3782
|
+
const open5 = /^ {0,3}(`{3,}|~{3,})(.*)$/.exec(line);
|
|
3783
|
+
if (open5) {
|
|
3784
|
+
fence = { char: open5[1][0], size: open5[1].length };
|
|
3785
3785
|
return line;
|
|
3786
3786
|
}
|
|
3787
3787
|
if (/^#\s/.test(line))
|
|
@@ -3832,9 +3832,9 @@ function parseDocument(path3, source2) {
|
|
|
3832
3832
|
fence = void 0;
|
|
3833
3833
|
continue;
|
|
3834
3834
|
}
|
|
3835
|
-
const
|
|
3836
|
-
if (
|
|
3837
|
-
fence = { char:
|
|
3835
|
+
const open5 = /^ {0,3}(`{3,}|~{3,})(.*)$/.exec(line);
|
|
3836
|
+
if (open5) {
|
|
3837
|
+
fence = { char: open5[1][0], size: open5[1].length };
|
|
3838
3838
|
continue;
|
|
3839
3839
|
}
|
|
3840
3840
|
if (/^#\s/.test(line))
|
|
@@ -3932,9 +3932,9 @@ function extractLinks(body) {
|
|
|
3932
3932
|
fence = void 0;
|
|
3933
3933
|
continue;
|
|
3934
3934
|
}
|
|
3935
|
-
const
|
|
3936
|
-
if (
|
|
3937
|
-
fence = { char:
|
|
3935
|
+
const open5 = /^ {0,3}(`{3,}|~{3,})/.exec(line);
|
|
3936
|
+
if (open5) {
|
|
3937
|
+
fence = { char: open5[1][0], size: open5[1].length };
|
|
3938
3938
|
continue;
|
|
3939
3939
|
}
|
|
3940
3940
|
for (const m of line.replace(/`[^`]*`/g, "").matchAll(/!?\[[^\]]*\]\((?:<([^>]+)>|([^)\s]+))(?:\s+"[^"]*")?\)/g))
|
|
@@ -24631,7 +24631,7 @@ var projectInitV5 = external_exports.discriminatedUnion("ok", [
|
|
|
24631
24631
|
external_exports.strictObject({ contract: external_exports.literal("project-init"), version: external_exports.literal(5), ok: external_exports.literal(false), error: external_exports.strictObject({ code: external_exports.string(), message: external_exports.string() }) })
|
|
24632
24632
|
]);
|
|
24633
24633
|
|
|
24634
|
-
// ../../packages/contracts/dist/versions/browser-specs-
|
|
24634
|
+
// ../../packages/contracts/dist/versions/browser-specs-v3.js
|
|
24635
24635
|
var requirement = external_exports.strictObject({ id: external_exports.string(), title: external_exports.string(), body: external_exports.string() });
|
|
24636
24636
|
var contributor = external_exports.strictObject({ email: external_exports.string(), name: external_exports.string(), commits: external_exports.number().int().nonnegative(), latest: external_exports.string() });
|
|
24637
24637
|
var source = external_exports.strictObject({ title: external_exports.string(), path: external_exports.string().optional(), url: external_exports.string().optional(), note: external_exports.string().optional() });
|
|
@@ -24648,34 +24648,42 @@ var feature = external_exports.strictObject({
|
|
|
24648
24648
|
});
|
|
24649
24649
|
var snapshot = requirement.extend({ specId: external_exports.string(), path: external_exports.string(), sources: external_exports.array(source).optional() }).nullable();
|
|
24650
24650
|
var document = external_exports.strictObject({ id: external_exports.string(), path: external_exports.string(), title: external_exports.string(), body: external_exports.string(), updatedAt: external_exports.string().nullable() });
|
|
24651
|
-
var
|
|
24651
|
+
var event = external_exports.strictObject({
|
|
24652
|
+
key: external_exports.string(),
|
|
24653
|
+
commit: external_exports.string(),
|
|
24654
|
+
date: external_exports.string(),
|
|
24655
|
+
author: external_exports.string(),
|
|
24656
|
+
email: external_exports.string(),
|
|
24657
|
+
committer: external_exports.string(),
|
|
24658
|
+
message: external_exports.string(),
|
|
24659
|
+
id: external_exports.string(),
|
|
24660
|
+
kind: external_exports.enum(["requirement", "design", "wiki"]).optional(),
|
|
24661
|
+
types: external_exports.array(external_exports.enum(["created", "modified", "moved", "deleted"])),
|
|
24662
|
+
before: snapshot,
|
|
24663
|
+
after: snapshot,
|
|
24664
|
+
reasons: external_exports.array(external_exports.string())
|
|
24665
|
+
});
|
|
24666
|
+
var browserSpecsV3 = external_exports.strictObject({
|
|
24652
24667
|
contract: external_exports.literal("browser-specs"),
|
|
24653
|
-
version: external_exports.literal(
|
|
24668
|
+
version: external_exports.literal(3),
|
|
24654
24669
|
sessionId: external_exports.string(),
|
|
24655
24670
|
head: external_exports.string().nullable(),
|
|
24656
24671
|
observedAt: external_exports.string(),
|
|
24657
|
-
|
|
24658
|
-
features: external_exports.array(feature),
|
|
24659
|
-
documents: external_exports.array(document).default([]),
|
|
24660
|
-
events: external_exports.array(external_exports.strictObject({
|
|
24661
|
-
key: external_exports.string(),
|
|
24662
|
-
commit: external_exports.string(),
|
|
24663
|
-
date: external_exports.string(),
|
|
24664
|
-
author: external_exports.string(),
|
|
24665
|
-
email: external_exports.string(),
|
|
24666
|
-
committer: external_exports.string(),
|
|
24667
|
-
message: external_exports.string(),
|
|
24668
|
-
id: external_exports.string(),
|
|
24669
|
-
kind: external_exports.enum(["requirement", "design", "wiki"]).optional(),
|
|
24670
|
-
types: external_exports.array(external_exports.enum(["created", "modified", "moved", "deleted"])),
|
|
24671
|
-
before: snapshot,
|
|
24672
|
-
after: snapshot,
|
|
24673
|
-
reasons: external_exports.array(external_exports.string())
|
|
24674
|
-
})),
|
|
24675
|
-
contributors: external_exports.array(contributor),
|
|
24676
|
-
contributorsLimited: external_exports.boolean(),
|
|
24672
|
+
events: external_exports.array(event),
|
|
24677
24673
|
nextCursor: external_exports.number().int().nonnegative().nullable(),
|
|
24678
|
-
boundary: external_exports.boolean()
|
|
24674
|
+
boundary: external_exports.boolean(),
|
|
24675
|
+
working: external_exports.boolean().optional(),
|
|
24676
|
+
features: external_exports.array(feature).optional(),
|
|
24677
|
+
documents: external_exports.array(document).optional(),
|
|
24678
|
+
contributors: external_exports.array(contributor).optional(),
|
|
24679
|
+
contributorsLimited: external_exports.boolean().optional()
|
|
24680
|
+
});
|
|
24681
|
+
var browserSpecsFirstV3 = browserSpecsV3.required({
|
|
24682
|
+
working: true,
|
|
24683
|
+
features: true,
|
|
24684
|
+
documents: true,
|
|
24685
|
+
contributors: true,
|
|
24686
|
+
contributorsLimited: true
|
|
24679
24687
|
});
|
|
24680
24688
|
|
|
24681
24689
|
// ../../packages/contracts/dist/versions/changelog-v1.js
|
|
@@ -24750,14 +24758,9 @@ var messages_default2 = {
|
|
|
24750
24758
|
"help.migrate": ".tryce \uC800\uC7A5\uC18C\uB97C .gitifact\uB85C \uC804\uD658 (\uACBD\uB85C\uC640 \uB9C8\uCEE4\uB9CC \uBC14\uAFB8\uACE0 ID\xB7\uC774\uC720\xB7\uC774\uB825\uC740 \uBCF4\uC874)",
|
|
24751
24759
|
"help.migrateDryRun": "\uD30C\uC77C\uC744 \uBC14\uAFB8\uC9C0 \uC54A\uACE0 \uC804\uD658 \uACC4\uD68D \uD655\uC778",
|
|
24752
24760
|
"help.spec": "Markdown \uBA85\uC138 \uC791\uC131\xB7\uC870\uD68C\xB7Git \uAE30\uB85D",
|
|
24753
|
-
"help.deprecated": "Deprecated: 0.6.0\uC5D0\uC11C \uC81C\uAC70 \uC608\uC815. spec commit\uC744 \uC0AC\uC6A9\uD558\uC138\uC694.",
|
|
24754
24761
|
"help.specCommit": "\uBCC0\uACBD \uC774\uC720 \uAE30\uB85D\uACFC \uAD00\uB828 \uD30C\uC77C \uCEE4\uBC0B\uC744 \uD55C \uBC88\uC5D0 \uC2E4\uD589",
|
|
24755
24762
|
"help.specCommitFile": "reasons\xB7paths\xB7message\xB7authorization\uC744 \uB2F4\uC740 JSON \uD30C\uC77C (-\uB294 \uD45C\uC900 \uC785\uB825)",
|
|
24756
24763
|
"help.specCommitDryRun": "\uD30C\uC77C\uC744 \uC4F0\uAC70\uB098 \uCEE4\uBC0B\uD558\uC9C0 \uC54A\uACE0 \uACB0\uACFC\uB9CC \uD655\uC778",
|
|
24757
|
-
"help.specCommitPlanFile": "\uCEE4\uBC0B \uC785\uB825 \uB610\uB294 \uACC4\uD68D JSON \uD30C\uC77C",
|
|
24758
|
-
"help.specPrepareFile": "expected\uC640 \uCD5C\uC885 reasons\uB97C \uB2F4\uC740 JSON \uD30C\uC77C",
|
|
24759
|
-
"help.specVerifyFile": "prepare\uC758 verification \uAC1D\uCCB4\uB97C \uB2F4\uC740 JSON \uD30C\uC77C",
|
|
24760
|
-
"help.specVerifyStaged": "index \uC6D0\uBB38\uB3C4 \uBE44\uAD50",
|
|
24761
24764
|
"help.specSaveFile": "expected\uC640 operations\uB97C \uB2F4\uC740 UTF-8 JSON \uD30C\uC77C (-\uB294 \uD45C\uC900 \uC785\uB825)",
|
|
24762
24765
|
"help.specReadRef": "\uC77D\uC744 \uCEE4\uBC0B",
|
|
24763
24766
|
"help.specDiffFrom": "\uC774\uC804 \uCEE4\uBC0B",
|
|
@@ -24823,13 +24826,6 @@ var messages_default2 = {
|
|
|
24823
24826
|
"commit.fileChangedPreparing": "\uCEE4\uBC0B \uC900\uBE44 \uC911 \uD30C\uC77C\xB7\uC815\uCC45\uC774 \uBCC0\uACBD\uB410\uC2B5\uB2C8\uB2E4: {path}",
|
|
24824
24827
|
"commit.resultUnknown": "\uCEE4\uBC0B \uACB0\uACFC\uB97C \uD655\uC778\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.",
|
|
24825
24828
|
"commit.uncertain": "Git \uC2E4\uD589 \uACB0\uACFC\uB97C \uD655\uC778\uD574\uC57C \uD569\uB2C8\uB2E4. \uC7AC\uC2DC\uB3C4\uD558\uC9C0 \uB9D0\uACE0 HEAD\uC640 \uBCF5\uAD6C \uC790\uB8CC\uB97C \uD655\uC778\uD558\uC138\uC694: {path}",
|
|
24826
|
-
"commit.existingStagingPlan": "\uAE30\uC874 staging\uC744 \uBCF4\uC874\uD569\uB2C8\uB2E4. \uC120\uD0DD \uBC94\uC704\uB97C \uC815\uB9AC\uD55C \uD6C4 \uB2E4\uC2DC \uACC4\uD68D\uD558\uC138\uC694.",
|
|
24827
|
-
"commit.designUseSpecCommit": "\uC124\uACC4 \uBCC0\uACBD\uC740 spec commit\uC744 \uC0AC\uC6A9\uD558\uC138\uC694.",
|
|
24828
|
-
"commit.indexChangedPlanning": "\uACC4\uD68D \uC911 index\uAC00 \uBCC0\uACBD\uB410\uC2B5\uB2C8\uB2E4.",
|
|
24829
|
-
"commit.planCorrupted": "\uCEE4\uBC0B \uACC4\uD68D\uC774 \uC190\uC0C1\uB410\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uACC4\uD68D\uD558\uC138\uC694.",
|
|
24830
|
-
"commit.planScope": "\uACC4\uD68D\uC758 \uC800\uC7A5\uC18C \uB610\uB294 \uD30C\uC77C \uBC94\uC704\uAC00 \uB2E4\uB985\uB2C8\uB2E4.",
|
|
24831
|
-
"commit.planStale": "\uACC4\uD68D \uC774\uD6C4 \uD30C\uC77C\xB7\uC815\uCC45\xB7index\uAC00 \uBCC0\uACBD\uB410\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uACC4\uD68D\uD558\uC138\uC694.",
|
|
24832
|
-
"commit.indexChangedLocked": "\uC7A0\uAE08 \uC911 index\uAC00 \uBCC0\uACBD\uB410\uC2B5\uB2C8\uB2E4.",
|
|
24833
24829
|
"store.legacyLock": "\uC774\uC804 Tryce \uC2E4\uD589\uC758 \uC7A0\uAE08 \uB610\uB294 \uBCF5\uAD6C \uC790\uB8CC\uAC00 \uC788\uC2B5\uB2C8\uB2E4: {path}",
|
|
24834
24830
|
"store.storeNotDirectory": ".gitifact\uB294 \uC77C\uBC18 \uB514\uB809\uD130\uB9AC\uC5EC\uC57C \uD569\uB2C8\uB2E4.",
|
|
24835
24831
|
"store.migrateFirst": ".tryce \uC800\uC7A5\uC18C\uC785\uB2C8\uB2E4. gitifact migrate\uB85C .gitifact\uC5D0 \uC804\uD658\uD55C \uB4A4 \uC0AC\uC6A9\uD558\uC138\uC694.",
|
|
@@ -24891,18 +24887,8 @@ var messages_default2 = {
|
|
|
24891
24887
|
"reader.blobShape": "\uAC80\uD1A0 \uC870\uD68C blob \uD615\uC2DD \uB610\uB294 1 MiB \uD55C\uB3C4\uB97C \uD655\uC778\uD558\uC138\uC694.",
|
|
24892
24888
|
"reader.totalLimit": "\uBA85\uC138 \uC804\uCCB4 \uC870\uD68C 16 MiB \uD55C\uB3C4\uB97C \uCD08\uACFC\uD588\uC2B5\uB2C8\uB2E4.",
|
|
24893
24889
|
"reader.blobBoundary": "Git blob \uC751\uB2F5 \uACBD\uACC4\uAC00 \uB2E4\uB985\uB2C8\uB2E4.",
|
|
24894
|
-
"prepare.integrationInProgress": "Git \uD1B5\uD569 \uC791\uC5C5 \uC911\uC5D0\uB294 \
|
|
24890
|
+
"prepare.integrationInProgress": "Git \uD1B5\uD569 \uC791\uC5C5 \uC911\uC5D0\uB294 \uBA85\uC138\uB97C \uC77D\uC5B4 \uCEE4\uBC0B\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.",
|
|
24895
24891
|
"prepare.headChanged": "HEAD \uB610\uB294 \uBE0C\uB79C\uCE58\uAC00 \uBCC0\uACBD\uB410\uC2B5\uB2C8\uB2E4. changes\uBD80\uD130 \uB2E4\uC2DC \uD655\uC778\uD558\uC138\uC694.",
|
|
24896
|
-
"prepare.invalidInput": "\uC798\uBABB\uB41C \uC900\uBE44 \uC785\uB825\uC785\uB2C8\uB2E4.",
|
|
24897
|
-
"prepare.expectedReasons": "expected\uC640 reasons\uAC00 \uD544\uC694\uD569\uB2C8\uB2E4.",
|
|
24898
|
-
"prepare.staleInput": "\uC900\uBE44 \uC785\uB825\uC774 \uC624\uB798\uB410\uC2B5\uB2C8\uB2E4. changes\uBD80\uD130 \uB2E4\uC2DC \uD655\uC778\uD558\uC138\uC694.",
|
|
24899
|
-
"prepare.invalidVerifyInput": "\uC798\uBABB\uB41C \uD655\uC778 \uC785\uB825\uC785\uB2C8\uB2E4.",
|
|
24900
|
-
"prepare.verificationRequired": "prepare\uAC00 \uBC18\uD658\uD55C verification \uAC1D\uCCB4\uAC00 \uD544\uC694\uD569\uB2C8\uB2E4.",
|
|
24901
|
-
"prepare.changedAfterPrepare": "\uC900\uBE44 \uB4A4 HEAD \uB610\uB294 \uBA85\uC138\uAC00 \uBCC0\uACBD\uB410\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC900\uBE44\uD558\uC138\uC694.",
|
|
24902
|
-
"prepare.stagingScope": "staging\uC758 \uBA85\uC138 \uBC94\uC704\uAC00 \uC900\uBE44\uD55C \uC6D0\uBB38\uACFC \uB2E4\uB985\uB2C8\uB2E4.",
|
|
24903
|
-
"prepare.stagingContent": "staging \uC6D0\uBB38\uC774 \uC900\uBE44\uD55C \uD30C\uC77C\uACFC \uB2E4\uB985\uB2C8\uB2E4: {path}",
|
|
24904
|
-
"prepare.stagingChanged": "\uD655\uC778 \uC911 staging\uC774 \uBCC0\uACBD\uB410\uC2B5\uB2C8\uB2E4.",
|
|
24905
|
-
"prepare.specsChanged": "\uD655\uC778 \uC911 \uBA85\uC138\uAC00 \uBCC0\uACBD\uB410\uC2B5\uB2C8\uB2E4.",
|
|
24906
24892
|
"commitFiles.relativePath": "\uC800\uC7A5\uC18C \uC0C1\uB300 \uACBD\uB85C\uC758 \uBA85\uC138 \uB610\uB294 \uC77C\uBC18 \uD30C\uC77C\uB9CC \uC120\uD0DD\uD558\uC138\uC694.",
|
|
24907
24893
|
"commitFiles.linkOrDirectory": "\uB9C1\uD06C\xB7\uB514\uB809\uD130\uB9AC\xB7\uD2B9\uC218 \uD30C\uC77C\uC740 \uC120\uD0DD\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.",
|
|
24908
24894
|
"commitFiles.nestedRepository": "\uC911\uCCA9 \uC800\uC7A5\uC18C\uB294 \uC120\uD0DD\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.",
|
|
@@ -24963,6 +24949,7 @@ var messages_default2 = {
|
|
|
24963
24949
|
"docs.summary.workflow": "\uC2DC\uC791 \uC2DC \uD655\uC778\uD560 \uAC83, \uC694\uAD6C\uC0AC\uD56D\uC73C\uB85C \uB0A8\uAE38 \uC694\uCCAD\uC758 \uAD6C\uBD84, \uB9C8\uBB34\uB9AC \uBCF4\uACE0",
|
|
24964
24950
|
"docs.summary.spec": "\uC0AC\uC6A9\uC790 \uC2A4\uD1A0\uB9AC\xB7\uC218\uC6A9 \uC870\uAC74 \uD615\uC2DD, ID \uADDC\uCE59, spec save \uC785\uB825",
|
|
24965
24951
|
"docs.summary.design": "design.md \uBAA9\uCC28, \uCC38\uC870 \uC8FC\uC11D\uACFC \uCC38\uACE0 \uBB38\uC11C, \uAC1C\uC815 \uBC29\uC2DD",
|
|
24952
|
+
"docs.summary.writing": "\uC704\uD0A4\xB7\uC694\uAD6C\uC0AC\uD56D\xB7\uC124\uACC4\uC5D0 \uACF5\uD1B5\uC73C\uB85C \uC801\uC6A9\uD558\uB294 \uBB38\uCCB4, \uC778\uC6A9\uACFC Alert, AI \uC2AC\uB86D \uC81C\uAC70",
|
|
24966
24953
|
"docs.summary.commit": "spec commit \uC785\uB825, \uC774\uC720 \uAE30\uB85D, \uC2E4\uD328 \uD6C4 \uBCF5\uAD6C",
|
|
24967
24954
|
"help.browserNoUpdateCheck": "\uC0C8 \uBC84\uC804 \uD655\uC778\uC744 \uC704\uD55C npm \uB808\uC9C0\uC2A4\uD2B8\uB9AC \uC870\uD68C\uB97C \uB054 (GITIFACT_NO_UPDATE_CHECK\uC640 \uAC19\uC74C)",
|
|
24968
24955
|
"help.updateCommit": "\uAC31\uC2E0\uD55C GITIFACT \uBE14\uB85D\uC774 HEAD\uC640 \uBE14\uB85D \uC548\uC5D0\uC11C\uB9CC \uB2E4\uB974\uBA74 \uADF8 \uD30C\uC77C\uB9CC \uACE0\uC815 \uBA54\uC2DC\uC9C0\uB85C \uCEE4\uBC0B",
|
|
@@ -25698,9 +25685,10 @@ function createSpecBrowserReader(root, sessionId, inherited = process.env) {
|
|
|
25698
25685
|
const current = await readWorkingPreviewState(root);
|
|
25699
25686
|
const bare = current.specs.map(({ history: _history, ...s }) => ({ ...s, contributors: [], updatedAt: null }));
|
|
25700
25687
|
const bareDocuments = current.wiki.documents.map((d) => ({ ...d, updatedAt: null }));
|
|
25701
|
-
if (!base.head) return
|
|
25688
|
+
if (!base.head) return browserSpecsV3.parse({ contract: "browser-specs", version: 3, sessionId, head: null, observedAt: (/* @__PURE__ */ new Date()).toISOString(), working: bare.length > 0 || bareDocuments.length > 0, features: bare, documents: bareDocuments, events: [], contributors: [], contributorsLimited: false, nextCursor: null, boundary: false });
|
|
25702
25689
|
const head = base.head;
|
|
25703
|
-
const
|
|
25690
|
+
const first = cursor === 0;
|
|
25691
|
+
const features = !first ? void 0 : await Promise.all(bare.map(async (feature2) => {
|
|
25704
25692
|
const folder = feature2.path.replace(/^\.(?:gitifact|tryce)\/(spec\/[^/]+)\/requirements\.md$/, "$1");
|
|
25705
25693
|
const lines = (await git(["log", "--format=%aN%x00%aE%x00%aI", "--max-count=2000", head, "--", `.gitifact/${folder}`, `.tryce/${folder}`])).trim().split("\n").filter(Boolean);
|
|
25706
25694
|
const people = /* @__PURE__ */ new Map();
|
|
@@ -25713,7 +25701,7 @@ function createSpecBrowserReader(root, sessionId, inherited = process.env) {
|
|
|
25713
25701
|
}
|
|
25714
25702
|
return { ...feature2, contributors: [...people.values()].sort((a, b) => b.commits - a.commits), updatedAt: lines[0]?.split("\0")[2] ?? null };
|
|
25715
25703
|
}));
|
|
25716
|
-
const documents = await Promise.all(bareDocuments.map(async (doc) => ({ ...doc, updatedAt: (await git(["log", "--format=%aI", "--max-count=1", head, "--", doc.path])).trim() || null })));
|
|
25704
|
+
const documents = !first ? void 0 : await Promise.all(bareDocuments.map(async (doc) => ({ ...doc, updatedAt: (await git(["log", "--format=%aI", "--max-count=1", head, "--", doc.path])).trim() || null })));
|
|
25717
25705
|
const documentDirs = [WIKI_DIR];
|
|
25718
25706
|
const [rows, dirty] = await Promise.all([
|
|
25719
25707
|
git([
|
|
@@ -25728,9 +25716,9 @@ function createSpecBrowserReader(root, sessionId, inherited = process.env) {
|
|
|
25728
25716
|
...[".gitifact", ".tryce"].flatMap((d) => [`:(glob)${d}/spec/*/requirements.md`, `:(glob)${d}/spec/*/design.md`, `:(glob)${d}/spec/*/history.jsonl`]),
|
|
25729
25717
|
...documentDirs.flatMap((d) => [`:(glob)${d}/**/*.md`, `:(glob)${d}/history.jsonl`])
|
|
25730
25718
|
]),
|
|
25731
|
-
git(["status", "--porcelain=v1", "--", ".gitifact/spec", ...documentDirs])
|
|
25719
|
+
first ? git(["status", "--porcelain=v1", "--", ".gitifact/spec", ...documentDirs]) : Promise.resolve("")
|
|
25732
25720
|
]);
|
|
25733
|
-
{
|
|
25721
|
+
if (first) {
|
|
25734
25722
|
const people = /* @__PURE__ */ new Map();
|
|
25735
25723
|
const lines = (await git(["log", "--format=%aN%x00%aE%x00%aI", "--max-count=10001", head])).trim().split("\n").filter(Boolean);
|
|
25736
25724
|
for (const line of lines.slice(0, 1e4)) {
|
|
@@ -25775,20 +25763,16 @@ function createSpecBrowserReader(root, sessionId, inherited = process.env) {
|
|
|
25775
25763
|
}));
|
|
25776
25764
|
}));
|
|
25777
25765
|
if (await readHead() !== head || (await readWorkingPreviewState(root)).stamp !== current.stamp) throw new SpecPreviewError(t2("specReader.projectChanged"));
|
|
25778
|
-
return
|
|
25766
|
+
return browserSpecsV3.parse({
|
|
25779
25767
|
contract: "browser-specs",
|
|
25780
|
-
version:
|
|
25768
|
+
version: 3,
|
|
25781
25769
|
sessionId,
|
|
25782
25770
|
head,
|
|
25783
25771
|
observedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
25784
|
-
working: !!dirty.trim(),
|
|
25785
|
-
features,
|
|
25786
|
-
documents,
|
|
25787
25772
|
events: groups.flat(),
|
|
25788
|
-
contributors: peopleCache.data,
|
|
25789
|
-
contributorsLimited: peopleCache.limited,
|
|
25790
25773
|
nextCursor: commits.length > 10 ? cursor + 10 : null,
|
|
25791
|
-
boundary
|
|
25774
|
+
boundary,
|
|
25775
|
+
...first ? { working: !!dirty.trim(), features, documents, contributors: peopleCache?.data ?? [], contributorsLimited: peopleCache?.limited ?? false } : {}
|
|
25792
25776
|
});
|
|
25793
25777
|
}
|
|
25794
25778
|
return (cursor = 0, head) => {
|
|
@@ -26202,7 +26186,7 @@ import { readFile as readFile8 } from "node:fs/promises";
|
|
|
26202
26186
|
// src/commands/docs.ts
|
|
26203
26187
|
import { lstat as lstat5, readFile as readFile7 } from "node:fs/promises";
|
|
26204
26188
|
import { dirname as dirname3, join as join8 } from "node:path";
|
|
26205
|
-
var docTopics = ["workflow", "spec", "design", "wiki", "commit"];
|
|
26189
|
+
var docTopics = ["workflow", "spec", "design", "wiki", "writing", "commit"];
|
|
26206
26190
|
var isDocTopic = (value) => docTopics.includes(value);
|
|
26207
26191
|
var readBundledDoc = (name, lang) => readFile7(new URL("./i18n/" + lang + "/docs/" + name + ".md", import.meta.url), "utf8");
|
|
26208
26192
|
var info3 = (path3) => lstat5(path3).catch((e) => {
|
|
@@ -26690,10 +26674,10 @@ async function runUpdate(options, version2) {
|
|
|
26690
26674
|
}
|
|
26691
26675
|
|
|
26692
26676
|
// src/commands/spec-preview.ts
|
|
26693
|
-
import { join as
|
|
26694
|
-
import { readFile as
|
|
26677
|
+
import { join as join14 } from "node:path";
|
|
26678
|
+
import { readFile as readFile11, stat as stat2 } from "node:fs/promises";
|
|
26695
26679
|
|
|
26696
|
-
// src/adapters/filesystem/spec-preview-
|
|
26680
|
+
// src/adapters/filesystem/spec-preview-context.ts
|
|
26697
26681
|
import { lstat as lstat6 } from "node:fs/promises";
|
|
26698
26682
|
import { join as join10 } from "node:path";
|
|
26699
26683
|
import { createHash as createHash4 } from "node:crypto";
|
|
@@ -26736,44 +26720,6 @@ async function readFinalPreviewChanges(cwd) {
|
|
|
26736
26720
|
const pendingReasons = pendingPreviewReasons(c.bundle, current.bundle);
|
|
26737
26721
|
return { base: c.base, expected: expected(c.base, current.stamp), stamp: current.stamp, pendingReasons, ...delta };
|
|
26738
26722
|
}
|
|
26739
|
-
async function prepareWorkingPreview(cwd, input2, publish) {
|
|
26740
|
-
if (!input2 || typeof input2 !== "object" || Array.isArray(input2)) fail5(t2("prepare.invalidInput"));
|
|
26741
|
-
const request = input2;
|
|
26742
|
-
if (Object.keys(request).sort().join(",") !== "expected,reasons" || typeof request.expected !== "string") fail5(t2("prepare.expectedReasons"));
|
|
26743
|
-
const c = await context(cwd);
|
|
26744
|
-
const current = await readWorkingPreviewState(cwd);
|
|
26745
|
-
if (request.expected !== expected(c.base, current.stamp)) fail5(t2("prepare.staleInput"));
|
|
26746
|
-
const result = await previewTransaction(cwd, current.stamp, async (before) => {
|
|
26747
|
-
await c.recheck();
|
|
26748
|
-
const prepared = prepareSpecPreview(c.bundle, before.bundle, c.files, before.files, request.reasons, () => generatePreviewId("H"));
|
|
26749
|
-
return { writes: prepared.writes, data: { changes: prepared.changes, specChanges: prepared.specChanges, reasons: prepared.reasons, withoutReason: prepared.withoutReason }, recheck: c.recheck };
|
|
26750
|
-
}, publish);
|
|
26751
|
-
return { ...result, base: c.base, expected: expected(c.base, result.stamp), verification: { base: c.base, stamp: result.stamp } };
|
|
26752
|
-
}
|
|
26753
|
-
async function verifyPreparedPreview(cwd, input2, staged) {
|
|
26754
|
-
if (!input2 || typeof input2 !== "object" || Array.isArray(input2)) fail5(t2("prepare.invalidVerifyInput"));
|
|
26755
|
-
const request = input2;
|
|
26756
|
-
if (Object.keys(request).sort().join(",") !== "base,stamp" || typeof request.stamp !== "string") fail5(t2("prepare.verificationRequired"));
|
|
26757
|
-
const c = await context(cwd);
|
|
26758
|
-
const current = await readWorkingPreviewState(cwd);
|
|
26759
|
-
if (!same(request.base, c.base) || request.stamp !== current.stamp) fail5(t2("prepare.changedAfterPrepare"));
|
|
26760
|
-
finalSpecPreviewChanges(c.bundle, current.bundle);
|
|
26761
|
-
comparePreviewBundles(c.bundle, current.bundle);
|
|
26762
|
-
if (staged) {
|
|
26763
|
-
const index = await c.reader.index();
|
|
26764
|
-
if (index.size !== current.files.size) fail5(t2("prepare.stagingScope"));
|
|
26765
|
-
for (const [path3, source2] of current.files) {
|
|
26766
|
-
const oid2 = index.get(path3);
|
|
26767
|
-
const bytes = Buffer.from(source2);
|
|
26768
|
-
const hash3 = createHash4(oid2?.length === 64 ? "sha256" : "sha1").update(`blob ${bytes.length}\0`).update(bytes).digest("hex");
|
|
26769
|
-
if (oid2 !== hash3) fail5(t2("prepare.stagingContent", { path: path3 }));
|
|
26770
|
-
}
|
|
26771
|
-
if (!same([...index], [...await c.reader.index()])) fail5(t2("prepare.stagingChanged"));
|
|
26772
|
-
}
|
|
26773
|
-
if ((await readWorkingPreviewState(cwd)).stamp !== current.stamp) fail5(t2("prepare.specsChanged"));
|
|
26774
|
-
await c.recheck();
|
|
26775
|
-
return { verified: true, scope: staged ? "staged" : "working", base: c.base, stamp: current.stamp };
|
|
26776
|
-
}
|
|
26777
26723
|
|
|
26778
26724
|
// src/adapters/filesystem/agent-inputs.ts
|
|
26779
26725
|
import { createHash as createHash5, randomBytes as randomBytes2 } from "node:crypto";
|
|
@@ -26840,9 +26786,9 @@ async function discardAgentInput(root, file2, controls = {}) {
|
|
|
26840
26786
|
}
|
|
26841
26787
|
}
|
|
26842
26788
|
|
|
26843
|
-
// src/commands/spec-
|
|
26844
|
-
import { randomUUID as randomUUID6 } from "node:crypto";
|
|
26845
|
-
import {
|
|
26789
|
+
// src/commands/spec-commit.ts
|
|
26790
|
+
import { createHash as createHash7, randomUUID as randomUUID6 } from "node:crypto";
|
|
26791
|
+
import { mkdir as mkdir6, open as open4, readFile as readFile10, rename as rename4, rmdir as rmdir2, unlink as unlink5, writeFile as writeFile4 } from "node:fs/promises";
|
|
26846
26792
|
import { join as join13 } from "node:path";
|
|
26847
26793
|
|
|
26848
26794
|
// src/commands/spec-commit-files.ts
|
|
@@ -26914,166 +26860,7 @@ async function checkLegacySelection(root, selected) {
|
|
|
26914
26860
|
}
|
|
26915
26861
|
}
|
|
26916
26862
|
|
|
26917
|
-
// src/commands/spec-preview-commit.ts
|
|
26918
|
-
var seal = (p) => hash2(JSON.stringify(p));
|
|
26919
|
-
async function previewCommit(cwd, action, input2) {
|
|
26920
|
-
const reader = specPreviewReader(cwd);
|
|
26921
|
-
const { root, gitDir } = await reader.location();
|
|
26922
|
-
const runner = createGitRunner();
|
|
26923
|
-
const git = (args, index) => runner(["-c", "core.fsmonitor=false", ...args], {
|
|
26924
|
-
cwd: root,
|
|
26925
|
-
env: {
|
|
26926
|
-
...process.env,
|
|
26927
|
-
GIT_LITERAL_PATHSPECS: "1",
|
|
26928
|
-
GIT_GLOB_PATHSPECS: "0",
|
|
26929
|
-
GIT_NOGLOB_PATHSPECS: "0",
|
|
26930
|
-
GIT_ICASE_PATHSPECS: "0",
|
|
26931
|
-
GIT_OPTIONAL_LOCKS: "0",
|
|
26932
|
-
GIT_NO_LAZY_FETCH: "1",
|
|
26933
|
-
GIT_NO_REPLACE_OBJECTS: "1",
|
|
26934
|
-
GIT_TERMINAL_PROMPT: "0",
|
|
26935
|
-
...index ? { GIT_INDEX_FILE: index } : {}
|
|
26936
|
-
},
|
|
26937
|
-
timeoutMs: 12e4,
|
|
26938
|
-
maxBytes: 32 * 1024 * 1024
|
|
26939
|
-
});
|
|
26940
|
-
const indexPath = (await git(["rev-parse", "--path-format=absolute", "--git-path", "index"])).toString("utf8").trim();
|
|
26941
|
-
const staged = async (index) => (await git(["diff", "--cached", "--ita-visible-in-index", "--name-only", "--no-renames", "-z"], index)).toString("utf8").split("\0").filter(Boolean).sort();
|
|
26942
|
-
const busy = join13(gitDir, "gitifact-spec-commit.lock");
|
|
26943
|
-
if (await info5(busy)) fail6(t2("commit.busy", { path: busy }));
|
|
26944
|
-
if ((await staged()).length) fail6(t2("commit.existingStagingPlan"));
|
|
26945
|
-
const request = object3(input2);
|
|
26946
|
-
let plan;
|
|
26947
|
-
if (action === "plan") {
|
|
26948
|
-
if (Object.keys(request).some((k) => !["verification", "paths", "message", "requirements", "authorization", "policyFiles"].includes(k))) fail6(t2("commit.unknownField"));
|
|
26949
|
-
await verifyPreparedPreview(cwd, request.verification, false);
|
|
26950
|
-
const selected2 = paths(request.paths);
|
|
26951
|
-
const authorization = object3(request.authorization);
|
|
26952
|
-
await checkLegacySelection(root, selected2);
|
|
26953
|
-
if (Object.keys(authorization).sort().join(",") !== "basis,evidence" || !["user-request", "project-policy"].includes(String(authorization.basis))) fail6(t2("commit.authorizationRequired"));
|
|
26954
|
-
const message = text(request.message, 4e3);
|
|
26955
|
-
if (/^\s*Gitifact-/im.test(message)) fail6(t2("commit.trailerInMessage"));
|
|
26956
|
-
const state = await readWorkingPreviewState(cwd);
|
|
26957
|
-
const base = await reader.baseline();
|
|
26958
|
-
const previous = base.head ? await reader.files(base.head, state.config !== void 0) : /* @__PURE__ */ new Map();
|
|
26959
|
-
const pending = [.../* @__PURE__ */ new Set([...previous.keys(), ...state.files.keys()])].filter((p) => previous.get(p) !== state.files.get(p));
|
|
26960
|
-
if (pending.some((p) => !selected2.includes(p))) fail6(t2("commit.selectPending"));
|
|
26961
|
-
const delta = await readFinalPreviewChanges(cwd);
|
|
26962
|
-
const references = request.requirements ?? [];
|
|
26963
|
-
if (!Array.isArray(references) || references.length > 1e3 || references.some((r) => typeof r !== "string")) fail6(t2("commit.invalidReferences"));
|
|
26964
|
-
if (delta.changes.some((c) => c.kind === "design")) fail6(t2("commit.designUseSpecCommit"));
|
|
26965
|
-
const known = /* @__PURE__ */ new Set([...state.specs.flatMap((s) => s.requirements.map((r) => r.id)), ...delta.changes.map((c) => c.id)]);
|
|
26966
|
-
if (references.some((r) => !known.has(r))) fail6(t2("commit.unknownRequirement"));
|
|
26967
|
-
const extra = request.policyFiles === void 0 ? [] : paths(request.policyFiles, 1024);
|
|
26968
|
-
const contents = async (list) => Promise.all(list.map(async (path3) => ({ path: path3, hash: await fingerprint(root, path3) })));
|
|
26969
|
-
const data2 = {
|
|
26970
|
-
kind: "spec-preview-commit",
|
|
26971
|
-
root,
|
|
26972
|
-
verification: request.verification,
|
|
26973
|
-
index: hash2(await optional2(indexPath) ?? Buffer.alloc(0)),
|
|
26974
|
-
files: await contents(selected2),
|
|
26975
|
-
context: await contents([.../* @__PURE__ */ new Set([...policyPaths(selected2), ...extra])].sort()),
|
|
26976
|
-
message,
|
|
26977
|
-
requirements: [.../* @__PURE__ */ new Set([...references, ...delta.changes.map((c) => c.id)])].sort(),
|
|
26978
|
-
authorization: { basis: String(authorization.basis), evidence: text(authorization.evidence, 2e3) }
|
|
26979
|
-
};
|
|
26980
|
-
await verifyPreparedPreview(cwd, request.verification, false);
|
|
26981
|
-
if (data2.index !== hash2(await optional2(indexPath) ?? Buffer.alloc(0)) || (await staged()).length) fail6(t2("commit.indexChangedPlanning"));
|
|
26982
|
-
return { outcome: "planned", plan: { ...data2, digest: seal(data2) }, committed: false };
|
|
26983
|
-
}
|
|
26984
|
-
const { digest: digest2, ...data } = request;
|
|
26985
|
-
if (request.kind !== "spec-preview-commit" || typeof digest2 !== "string" || digest2 !== seal(data)) fail6(t2("commit.planCorrupted"));
|
|
26986
|
-
plan = request;
|
|
26987
|
-
if (plan.root !== root || !Array.isArray(plan.files) || !Array.isArray(plan.context)) fail6(t2("commit.planScope"));
|
|
26988
|
-
const selected = paths(plan.files.map((f) => f.path));
|
|
26989
|
-
const refreshed = await previewCommit(cwd, "plan", {
|
|
26990
|
-
verification: plan.verification,
|
|
26991
|
-
paths: selected,
|
|
26992
|
-
message: plan.message,
|
|
26993
|
-
requirements: plan.requirements,
|
|
26994
|
-
authorization: plan.authorization,
|
|
26995
|
-
policyFiles: plan.context.map((f) => f.path)
|
|
26996
|
-
});
|
|
26997
|
-
if (!("plan" in refreshed) || refreshed.plan.digest !== plan.digest) fail6(t2("commit.planStale"));
|
|
26998
|
-
const before = await reader.baseline();
|
|
26999
|
-
const original = await optional2(indexPath);
|
|
27000
|
-
await mkdir6(busy);
|
|
27001
|
-
const draftLock = join13(gitDir, "gitifact-spec-preview.lock");
|
|
27002
|
-
let draftOwned = false;
|
|
27003
|
-
let indexLock;
|
|
27004
|
-
let uncertain = false;
|
|
27005
|
-
let commitStarted = false;
|
|
27006
|
-
const temporary = join13(gitDir, "gitifact-commit-index-" + randomUUID6());
|
|
27007
|
-
const checkFiles = async () => {
|
|
27008
|
-
for (const f of [...plan.files, ...plan.context]) if (f.hash !== await fingerprint(root, f.path)) fail6(t2("commit.fileChangedPreparing", { path: f.path }));
|
|
27009
|
-
if ((await readLockedPreviewState(root)).stamp !== object3(plan.verification).stamp) fail6(t2("commit.specsChangedPreparing"));
|
|
27010
|
-
for (const name of ["MERGE_HEAD", "CHERRY_PICK_HEAD", "REVERT_HEAD", "rebase-merge", "rebase-apply"]) if (await info5(join13(gitDir, name))) fail6(t2("commit.integrationStarted"));
|
|
27011
|
-
};
|
|
27012
|
-
try {
|
|
27013
|
-
await verifyPreparedPreview(cwd, plan.verification, false);
|
|
27014
|
-
await mkdir6(draftLock);
|
|
27015
|
-
draftOwned = true;
|
|
27016
|
-
indexLock = await open4(indexPath + ".lock", "wx", 384);
|
|
27017
|
-
if (plan.index !== hash2(await optional2(indexPath) ?? Buffer.alloc(0)) || (await staged()).length) fail6(t2("commit.indexChangedLocked"));
|
|
27018
|
-
await writeFile4(join13(busy, "recovery.json"), JSON.stringify({ before, originalIndex: original?.toString("base64") ?? null, temporary, plan }));
|
|
27019
|
-
if (original) await writeFile4(temporary, original, { flag: "wx" });
|
|
27020
|
-
else await git(["read-tree", "--empty"], temporary);
|
|
27021
|
-
await git(["add", "--", ...selected], temporary);
|
|
27022
|
-
const actual = await staged(temporary);
|
|
27023
|
-
if (!actual.length || actual.some((p) => !selected.includes(p))) fail6(t2("commit.unexpectedFiles"));
|
|
27024
|
-
for (const file2 of plan.files.filter((f) => record2(f.path) && f.hash !== null)) {
|
|
27025
|
-
const stagedBytes = await git(["show", ":" + file2.path], temporary);
|
|
27026
|
-
if (!stagedBytes.equals(await readFile10(join13(root, file2.path)))) fail6(t2("commit.filterChanged"));
|
|
27027
|
-
}
|
|
27028
|
-
await checkFiles();
|
|
27029
|
-
if (JSON.stringify(before) !== JSON.stringify(await reader.baseline())) fail6(t2("commit.headChanged"));
|
|
27030
|
-
const tree = (await git(["write-tree"], temporary)).toString("utf8").trim();
|
|
27031
|
-
const trailers = plan.requirements.map((id) => "Gitifact-Req: " + id);
|
|
27032
|
-
commitStarted = true;
|
|
27033
|
-
await git(["commit", "-m", plan.message.trim() + (trailers.length ? "\n\n" + trailers.join("\n") : "")], temporary);
|
|
27034
|
-
const after = await reader.baseline();
|
|
27035
|
-
const actualTree = (await git(["rev-parse", "HEAD^{tree}"])).toString("utf8").trim();
|
|
27036
|
-
const parents = (await git(["rev-list", "--parents", "-n", "1", "HEAD"])).toString("utf8").trim().split(" ").slice(1);
|
|
27037
|
-
const message = (await git(["log", "-1", "--format=%B"])).toString("utf8");
|
|
27038
|
-
if (actualTree !== tree || after.branch !== before.branch || JSON.stringify(parents) !== JSON.stringify(before.head ? [before.head] : []) || trailers.some((t3) => !message.split(/\r?\n/).includes(t3))) fail6(t2("commit.resultAltered"));
|
|
27039
|
-
if (hash2(await optional2(indexPath) ?? Buffer.alloc(0)) !== plan.index) fail6(t2("commit.indexChangedAfter"));
|
|
27040
|
-
if ((await git(["write-tree"], temporary)).toString("utf8").trim() !== tree) fail6(t2("commit.hookChangedStaging"));
|
|
27041
|
-
await indexLock.writeFile(await readFile10(temporary));
|
|
27042
|
-
await indexLock.sync();
|
|
27043
|
-
await indexLock.close();
|
|
27044
|
-
await rename4(indexPath + ".lock", indexPath);
|
|
27045
|
-
indexLock = void 0;
|
|
27046
|
-
return { outcome: "committed", commit: after.head, paths: actual, requirements: plan.requirements, pushed: false };
|
|
27047
|
-
} catch (error62) {
|
|
27048
|
-
if (commitStarted) {
|
|
27049
|
-
try {
|
|
27050
|
-
uncertain = JSON.stringify(before) !== JSON.stringify(await reader.baseline());
|
|
27051
|
-
} catch {
|
|
27052
|
-
uncertain = true;
|
|
27053
|
-
}
|
|
27054
|
-
}
|
|
27055
|
-
if (uncertain) fail6(t2("commit.uncertain", { path: busy }));
|
|
27056
|
-
throw error62;
|
|
27057
|
-
} finally {
|
|
27058
|
-
await indexLock?.close().catch(() => {
|
|
27059
|
-
});
|
|
27060
|
-
if (!uncertain) {
|
|
27061
|
-
if (indexLock) await unlink5(indexPath + ".lock").catch(() => {
|
|
27062
|
-
});
|
|
27063
|
-
await unlink5(temporary).catch(() => {
|
|
27064
|
-
});
|
|
27065
|
-
await unlink5(join13(busy, "recovery.json")).catch(() => {
|
|
27066
|
-
});
|
|
27067
|
-
await rmdir2(busy);
|
|
27068
|
-
if (draftOwned) await rmdir2(draftLock);
|
|
27069
|
-
}
|
|
27070
|
-
}
|
|
27071
|
-
}
|
|
27072
|
-
|
|
27073
26863
|
// src/commands/spec-commit.ts
|
|
27074
|
-
import { createHash as createHash8, randomUUID as randomUUID7 } from "node:crypto";
|
|
27075
|
-
import { mkdir as mkdir7, open as open5, readFile as readFile11, rename as rename5, rmdir as rmdir3, unlink as unlink6, writeFile as writeFile5 } from "node:fs/promises";
|
|
27076
|
-
import { join as join14 } from "node:path";
|
|
27077
26864
|
var fields = ["reasons", "paths", "message", "authorization", "requirements", "policyFiles", "expected"];
|
|
27078
26865
|
var integration = ["MERGE_HEAD", "CHERRY_PICK_HEAD", "REVERT_HEAD", "rebase-merge", "rebase-apply"];
|
|
27079
26866
|
var same2 = (a, b) => JSON.stringify(a) === JSON.stringify(b);
|
|
@@ -27112,7 +26899,7 @@ async function specCommit(cwd, input2, dryRun) {
|
|
|
27112
26899
|
...stdin ? { input: stdin } : {}
|
|
27113
26900
|
});
|
|
27114
26901
|
const staged = async (index) => (await git(["diff", "--cached", "--ita-visible-in-index", "--name-only", "--no-renames", "-z"], index)).toString("utf8").split("\0").filter(Boolean).sort();
|
|
27115
|
-
const busy =
|
|
26902
|
+
const busy = join13(gitDir, "gitifact-spec-commit.lock");
|
|
27116
26903
|
await failOnLegacyLock(gitDir);
|
|
27117
26904
|
if (await info5(busy)) fail6(t2("commit.busy", { path: busy }));
|
|
27118
26905
|
if ((await staged()).length) fail6(t2("commit.existingStaging"));
|
|
@@ -27123,7 +26910,7 @@ async function specCommit(cwd, input2, dryRun) {
|
|
|
27123
26910
|
const prepared = prepareSpecPreview(c.bundle, current.bundle, c.files, current.files, reasons, () => generatePreviewId("H"));
|
|
27124
26911
|
const blobId = (text2) => {
|
|
27125
26912
|
const bytes = Buffer.from(text2);
|
|
27126
|
-
return
|
|
26913
|
+
return createHash7(objectFormat).update(`blob ${bytes.length}\0`).update(bytes).digest("hex");
|
|
27127
26914
|
};
|
|
27128
26915
|
const present = [...current.files.keys()];
|
|
27129
26916
|
if (present.some((p) => p.includes("\n"))) fail6(t2("commit.newlinePath"));
|
|
@@ -27166,29 +26953,29 @@ async function specCommit(cwd, input2, dryRun) {
|
|
|
27166
26953
|
...prepared.changes.filter((c2) => c2.kind === "design").map((c2) => "Gitifact-Design: " + c2.id),
|
|
27167
26954
|
...prepared.changes.filter((c2) => c2.kind === "wiki").map((c2) => "Gitifact-Doc: " + c2.id)
|
|
27168
26955
|
];
|
|
27169
|
-
const temporary =
|
|
26956
|
+
const temporary = join13(gitDir, "gitifact-commit-index-" + randomUUID6());
|
|
27170
26957
|
let owned = false;
|
|
27171
26958
|
let uncertain = false;
|
|
27172
26959
|
let indexLock;
|
|
27173
26960
|
let committed;
|
|
27174
26961
|
try {
|
|
27175
26962
|
try {
|
|
27176
|
-
await
|
|
26963
|
+
await mkdir6(busy);
|
|
27177
26964
|
owned = true;
|
|
27178
26965
|
} catch (e) {
|
|
27179
26966
|
if (e.code === "EEXIST") fail6(t2("commit.busy", { path: busy }));
|
|
27180
26967
|
throw e;
|
|
27181
26968
|
}
|
|
27182
|
-
await previewTransaction(cwd, current.stamp, async () => ({ writes, data: {}, recheck: c.recheck }),
|
|
26969
|
+
await previewTransaction(cwd, current.stamp, async () => ({ writes, data: {}, recheck: c.recheck }), rename4, async (published) => {
|
|
27183
26970
|
let commitStarted = false;
|
|
27184
26971
|
try {
|
|
27185
|
-
const lock = indexLock = await
|
|
26972
|
+
const lock = indexLock = await open4(indexPath + ".lock", "wx", 384);
|
|
27186
26973
|
const original = await optional2(indexPath);
|
|
27187
26974
|
if (hash2(original ?? Buffer.alloc(0)) !== indexHash || (await staged()).length) fail6(t2("commit.indexChanged"));
|
|
27188
26975
|
const locked = await hashes([.../* @__PURE__ */ new Set([...selected, ...contextPaths])]);
|
|
27189
26976
|
for (const [path3, value] of started) if (locked.get(path3) !== value) fail6(t2("commit.fileChangedRunning", { path: path3 }));
|
|
27190
|
-
await
|
|
27191
|
-
if (original) await
|
|
26977
|
+
await writeFile4(join13(busy, "recovery.json"), JSON.stringify({ before: c.base, originalIndex: original?.toString("base64") ?? null, temporary, paths: selected, message, requirements }));
|
|
26978
|
+
if (original) await writeFile4(temporary, original, { flag: "wx" });
|
|
27192
26979
|
else await git(["read-tree", "--empty"], temporary);
|
|
27193
26980
|
await git(["add", "--", ...stageable], temporary);
|
|
27194
26981
|
const actual = await staged(temporary);
|
|
@@ -27203,7 +26990,7 @@ async function specCommit(cwd, input2, dryRun) {
|
|
|
27203
26990
|
const size = Number(header[2]);
|
|
27204
26991
|
if (end < 0 || header[1] !== "blob" || !Number.isSafeInteger(size) || output2[end + 1 + size] !== 10) fail6(t2("commit.stagedUnreadable", { path: path3 }));
|
|
27205
26992
|
const staged2 = output2.subarray(end + 1, end + 1 + size);
|
|
27206
|
-
const file2 = await
|
|
26993
|
+
const file2 = await readFile10(join13(root, path3));
|
|
27207
26994
|
if (!staged2.equals(file2) && !staged2.equals(Buffer.from(file2.toString("latin1").replace(/\r\n/g, "\n"), "latin1"))) fail6(t2("commit.filterChanged"));
|
|
27208
26995
|
offset = end + size + 2;
|
|
27209
26996
|
}
|
|
@@ -27211,7 +26998,7 @@ async function specCommit(cwd, input2, dryRun) {
|
|
|
27211
26998
|
const again = await hashes([...locked.keys()]);
|
|
27212
26999
|
for (const [path3, value] of locked) if (again.get(path3) !== value) fail6(t2("commit.fileChangedPreparing", { path: path3 }));
|
|
27213
27000
|
if ((await readLockedPreviewState(root)).stamp !== published.stamp) fail6(t2("commit.specsChangedPreparing"));
|
|
27214
|
-
for (const name of integration) if (await info5(
|
|
27001
|
+
for (const name of integration) if (await info5(join13(gitDir, name))) fail6(t2("commit.integrationStarted"));
|
|
27215
27002
|
if (!same2(c.base, await c.reader.baseline())) fail6(t2("commit.headChanged"));
|
|
27216
27003
|
const tree = (await git(["write-tree"], temporary)).toString("utf8").trim();
|
|
27217
27004
|
commitStarted = true;
|
|
@@ -27226,10 +27013,10 @@ async function specCommit(cwd, input2, dryRun) {
|
|
|
27226
27013
|
if (headers[0] !== "tree " + tree || after.branch !== c.base.branch || !same2(parents, c.base.head ? [c.base.head] : []) || trailers.some((t3) => !body.split(/\r?\n/).includes(t3))) fail6(t2("commit.resultAltered"));
|
|
27227
27014
|
if (hash2(await optional2(indexPath) ?? Buffer.alloc(0)) !== indexHash) fail6(t2("commit.indexChangedAfter"));
|
|
27228
27015
|
if ((await git(["write-tree"], temporary)).toString("utf8").trim() !== tree) fail6(t2("commit.hookChangedStaging"));
|
|
27229
|
-
await lock.writeFile(await
|
|
27016
|
+
await lock.writeFile(await readFile10(temporary));
|
|
27230
27017
|
await lock.sync();
|
|
27231
27018
|
await lock.close();
|
|
27232
|
-
await
|
|
27019
|
+
await rename4(indexPath + ".lock", indexPath);
|
|
27233
27020
|
indexLock = void 0;
|
|
27234
27021
|
committed = { commit: after.head, paths: actual };
|
|
27235
27022
|
} catch (error62) {
|
|
@@ -27248,14 +27035,14 @@ async function specCommit(cwd, input2, dryRun) {
|
|
|
27248
27035
|
await indexLock?.close().catch(() => {
|
|
27249
27036
|
});
|
|
27250
27037
|
if (!uncertain) {
|
|
27251
|
-
if (indexLock) await
|
|
27038
|
+
if (indexLock) await unlink5(indexPath + ".lock").catch(() => {
|
|
27252
27039
|
});
|
|
27253
|
-
await
|
|
27040
|
+
await unlink5(temporary).catch(() => {
|
|
27254
27041
|
});
|
|
27255
27042
|
if (owned) {
|
|
27256
|
-
await
|
|
27043
|
+
await unlink5(join13(busy, "recovery.json")).catch(() => {
|
|
27257
27044
|
});
|
|
27258
|
-
await
|
|
27045
|
+
await rmdir2(busy);
|
|
27259
27046
|
}
|
|
27260
27047
|
}
|
|
27261
27048
|
}
|
|
@@ -27270,14 +27057,14 @@ async function execute(action, options, controls) {
|
|
|
27270
27057
|
try {
|
|
27271
27058
|
const guard = specPreviewReader(process.cwd());
|
|
27272
27059
|
const { root, gitDir, objectFormat } = await guard.location();
|
|
27273
|
-
for (const marker2 of operations) if (await fileInfo(
|
|
27060
|
+
for (const marker2 of operations) if (await fileInfo(join14(gitDir, marker2))) throw new InitError("GIT_OPERATION_IN_PROGRESS", t2("git.operationInProgress", { marker: marker2 }));
|
|
27274
27061
|
if (await guard.hasUnmerged()) throw new InitError("GIT_OPERATION_IN_PROGRESS", t2("git.resolveConflicts"));
|
|
27275
27062
|
const raw = await readConfigFile(root);
|
|
27276
27063
|
if (raw === void 0) throw new SpecPreviewError(t2("preview.notInitialized"));
|
|
27277
27064
|
const config2 = parseManagedConfig(raw);
|
|
27278
27065
|
if (!("schemaVersion" in config2)) throw new SpecPreviewError(t2("preview.legacyProject"));
|
|
27279
27066
|
await initRepository(root).validateBaseline(config2, root, "HEAD", objectFormat);
|
|
27280
|
-
if (["working", "save", "changes", "
|
|
27067
|
+
if (["working", "save", "changes", "commit"].includes(action)) {
|
|
27281
27068
|
let result;
|
|
27282
27069
|
const inputs = () => prepareAgentInputs(root, controls).catch(() => void 0);
|
|
27283
27070
|
if (action === "working") result = narrowWorking(await readWorkingPreview(process.cwd()), options, await inputs());
|
|
@@ -27291,7 +27078,7 @@ async function execute(action, options, controls) {
|
|
|
27291
27078
|
} catch {
|
|
27292
27079
|
throw new SpecPreviewError(t2("preview.inputJson"));
|
|
27293
27080
|
}
|
|
27294
|
-
result = action === "commit" ? await specCommit(process.cwd(), input2, !!options.dryRun) :
|
|
27081
|
+
result = action === "commit" ? await specCommit(process.cwd(), input2, !!options.dryRun) : await saveWorkingPreview(process.cwd(), input2);
|
|
27295
27082
|
const consumed = action === "save" || action === "commit" && result.outcome === "committed";
|
|
27296
27083
|
if (consumed && options.file !== "-") result = { ...result, inputRemoved: await discardAgentInput(root, options.file, controls) };
|
|
27297
27084
|
}
|
|
@@ -27317,7 +27104,7 @@ async function execute(action, options, controls) {
|
|
|
27317
27104
|
async function readInputFile(path3) {
|
|
27318
27105
|
const source2 = await stat2(path3);
|
|
27319
27106
|
if (!source2.isFile() || source2.size > 1024 * 1024) throw new SpecPreviewError(t2("preview.inputFile"));
|
|
27320
|
-
return
|
|
27107
|
+
return readFile11(path3);
|
|
27321
27108
|
}
|
|
27322
27109
|
async function readStdin(stream) {
|
|
27323
27110
|
const chunks = [];
|
|
@@ -27349,11 +27136,11 @@ function narrowWorking(working, options, inputs) {
|
|
|
27349
27136
|
}
|
|
27350
27137
|
|
|
27351
27138
|
// src/commands/migrate.ts
|
|
27352
|
-
import { lstat as
|
|
27353
|
-
import { join as
|
|
27139
|
+
import { lstat as lstat9, readdir as readdir6, readFile as readFile12, rename as rename5, writeFile as writeFile5, unlink as unlink6 } from "node:fs/promises";
|
|
27140
|
+
import { join as join15 } from "node:path";
|
|
27354
27141
|
import { randomBytes as randomBytes3 } from "node:crypto";
|
|
27355
27142
|
var operations2 = ["MERGE_HEAD", "CHERRY_PICK_HEAD", "REVERT_HEAD", "rebase-merge", "rebase-apply", "sequencer", "BISECT_START", "index.lock"];
|
|
27356
|
-
var info6 = (path3) =>
|
|
27143
|
+
var info6 = (path3) => lstat9(path3).catch((e) => {
|
|
27357
27144
|
if (e.code === "ENOENT") return void 0;
|
|
27358
27145
|
throw e;
|
|
27359
27146
|
});
|
|
@@ -27364,18 +27151,18 @@ var fail7 = (code, message) => {
|
|
|
27364
27151
|
async function migrateStore(cwd, dryRun = false) {
|
|
27365
27152
|
const reader = specPreviewReader(cwd);
|
|
27366
27153
|
const { root, gitDir } = await reader.location();
|
|
27367
|
-
for (const marker3 of operations2) if (await info6(
|
|
27154
|
+
for (const marker3 of operations2) if (await info6(join15(gitDir, marker3))) fail7("GIT_OPERATION_IN_PROGRESS", t2("git.operationInProgress", { marker: marker3 }));
|
|
27368
27155
|
if (await reader.hasUnmerged()) fail7("GIT_OPERATION_IN_PROGRESS", t2("git.resolveConflicts"));
|
|
27369
|
-
for (const name of [...LEGACY_LOCKS, "gitifact-spec-preview.lock", "gitifact-spec-commit.lock"]) if (await info6(
|
|
27370
|
-
const from =
|
|
27371
|
-
const to =
|
|
27156
|
+
for (const name of [...LEGACY_LOCKS, "gitifact-spec-preview.lock", "gitifact-spec-commit.lock"]) if (await info6(join15(gitDir, name))) fail7("LOCKED", t2("migrate.locked", { path: join15(gitDir, name) }));
|
|
27157
|
+
const from = join15(root, ".tryce");
|
|
27158
|
+
const to = join15(root, ".gitifact");
|
|
27372
27159
|
const fromInfo = await info6(from);
|
|
27373
27160
|
if (await info6(to)) fail7("ALREADY_MIGRATED", t2("migrate.alreadyMigrated"));
|
|
27374
27161
|
if (!fromInfo) return fail7("NOTHING_TO_MIGRATE", t2("migrate.nothingToMigrate"));
|
|
27375
27162
|
if (!fromInfo.isDirectory() || fromInfo.isSymbolicLink()) fail7("PATH_CONFLICT", t2("migrate.notDirectory"));
|
|
27376
|
-
const configInfo = await info6(
|
|
27163
|
+
const configInfo = await info6(join15(from, "config.json"));
|
|
27377
27164
|
if (!configInfo?.isFile() || configInfo.isSymbolicLink()) fail7("NOT_INITIALIZED", t2("migrate.noConfig"));
|
|
27378
|
-
const config2 = parseManagedConfig(decode4(await
|
|
27165
|
+
const config2 = parseManagedConfig(decode4(await readFile12(join15(from, "config.json"))));
|
|
27379
27166
|
if (!("schemaVersion" in config2)) fail7("UNSUPPORTED_FORMAT", t2("migrate.legacyJson"));
|
|
27380
27167
|
const top = (await readdir6(from)).sort();
|
|
27381
27168
|
if (top.some((name) => name !== "config.json" && name !== "spec")) fail7("UNSUPPORTED_FORMAT", t2("migrate.extraEntries"));
|
|
@@ -27384,20 +27171,20 @@ async function migrateStore(cwd, dryRun = false) {
|
|
|
27384
27171
|
const legacyRecords = [];
|
|
27385
27172
|
const marker2 = /^<!-- tryce-(spec|req|design|ref): /;
|
|
27386
27173
|
if (top.includes("spec")) {
|
|
27387
|
-
for (const feature2 of (await readdir6(
|
|
27388
|
-
const dir =
|
|
27174
|
+
for (const feature2 of (await readdir6(join15(from, "spec"))).sort()) {
|
|
27175
|
+
const dir = join15(from, "spec", feature2);
|
|
27389
27176
|
const stat3 = await info6(dir);
|
|
27390
27177
|
if (!stat3?.isDirectory() || stat3.isSymbolicLink()) fail7("UNSUPPORTED_FORMAT", t2("migrate.notSpecFolder", { feature: feature2 }));
|
|
27391
27178
|
for (const name of (await readdir6(dir)).sort()) {
|
|
27392
27179
|
if (!["requirements.md", "design.md", "history.jsonl", "tryce.json"].includes(name)) fail7("UNSUPPORTED_FORMAT", t2("migrate.unsupportedFile", { feature: feature2, name }));
|
|
27393
|
-
const fileStat = await info6(
|
|
27180
|
+
const fileStat = await info6(join15(dir, name));
|
|
27394
27181
|
if (!fileStat?.isFile() || fileStat.isSymbolicLink() || fileStat.nlink !== 1 || fileStat.size > 1024 * 1024) fail7("UNSUPPORTED_FORMAT", t2("migrate.fileTooLarge", { name }));
|
|
27395
27182
|
const newPath = `.gitifact/spec/${feature2}/${name}`;
|
|
27396
27183
|
if (name === "tryce.json") {
|
|
27397
27184
|
legacyRecords.push(newPath);
|
|
27398
27185
|
continue;
|
|
27399
27186
|
}
|
|
27400
|
-
const text2 = decode4(await
|
|
27187
|
+
const text2 = decode4(await readFile12(join15(dir, name)));
|
|
27401
27188
|
if (name === "history.jsonl") {
|
|
27402
27189
|
files.set(newPath, text2);
|
|
27403
27190
|
continue;
|
|
@@ -27408,9 +27195,9 @@ async function migrateStore(cwd, dryRun = false) {
|
|
|
27408
27195
|
if (new RegExp(`^ {0,3}${fence.char}{${fence.size},}\\s*$`).test(line)) fence = void 0;
|
|
27409
27196
|
return line;
|
|
27410
27197
|
}
|
|
27411
|
-
const
|
|
27412
|
-
if (
|
|
27413
|
-
fence = { char:
|
|
27198
|
+
const open5 = /^ {0,3}(`{3,}|~{3,})/.exec(line);
|
|
27199
|
+
if (open5) {
|
|
27200
|
+
fence = { char: open5[1][0], size: open5[1].length };
|
|
27414
27201
|
return line;
|
|
27415
27202
|
}
|
|
27416
27203
|
return marker2.test(line) ? line.replace(/^<!-- tryce-/, "<!-- gitifact-") : line;
|
|
@@ -27440,15 +27227,15 @@ async function migrateStore(cwd, dryRun = false) {
|
|
|
27440
27227
|
]
|
|
27441
27228
|
});
|
|
27442
27229
|
if (dryRun) return result("planned");
|
|
27443
|
-
await
|
|
27230
|
+
await rename5(from, to);
|
|
27444
27231
|
for (const r of rewrites) {
|
|
27445
|
-
const full =
|
|
27446
|
-
const temp =
|
|
27447
|
-
await
|
|
27232
|
+
const full = join15(root, r.path);
|
|
27233
|
+
const temp = join15(root, ".gitifact", "spec", ".gitifact-migrate-" + randomBytes3(8).toString("hex"));
|
|
27234
|
+
await writeFile5(temp, r.content, { flag: "wx" });
|
|
27448
27235
|
try {
|
|
27449
|
-
await
|
|
27236
|
+
await rename5(temp, full);
|
|
27450
27237
|
} finally {
|
|
27451
|
-
await
|
|
27238
|
+
await unlink6(temp).catch(() => {
|
|
27452
27239
|
});
|
|
27453
27240
|
}
|
|
27454
27241
|
}
|
|
@@ -27466,24 +27253,20 @@ async function runMigrate(options) {
|
|
|
27466
27253
|
}
|
|
27467
27254
|
|
|
27468
27255
|
// src/main.ts
|
|
27469
|
-
var program2 = new Command().name("gitifact").description(t2("help.program")).version("0.
|
|
27256
|
+
var program2 = new Command().name("gitifact").description(t2("help.program")).version("0.6.0").allowExcessArguments(false).addHelpText("after", "\n" + t2("help.notYet")).action(() => program2.outputHelp());
|
|
27470
27257
|
program2.command("status").description(t2("help.status")).allowExcessArguments(false).addOption(new Option("--format <format>", t2("help.format")).choices(["json", "text"]).default("json")).action(async (options) => {
|
|
27471
27258
|
await runStatus(options.format);
|
|
27472
27259
|
});
|
|
27473
|
-
program2.command("browser").description(t2("help.browser")).allowExcessArguments(false).option("--port <port>", t2("help.browserPort"), parsePort, 0).option("--dev", t2("help.browserDev")).option("--no-update-check", t2("help.browserNoUpdateCheck")).action((options) => runBrowser(options, "0.
|
|
27474
|
-
program2.command("init").description(t2("help.init")).allowExcessArguments(false).option("--dry-run", t2("help.initDryRun")).addOption(new Option("--agent <agent>", t2("help.initAgent")).choices([...agentPresetNames])).addOption(new Option("--remove-agents", t2("help.initRemoveAgents")).conflicts("skipAgents")).option("--skip-agents", t2("help.initSkipAgents")).addOption(new Option("--format <format>", t2("help.format")).choices(["json", "text"]).default("json")).action((options) => runInit(options, "0.
|
|
27260
|
+
program2.command("browser").description(t2("help.browser")).allowExcessArguments(false).option("--port <port>", t2("help.browserPort"), parsePort, 0).option("--dev", t2("help.browserDev")).option("--no-update-check", t2("help.browserNoUpdateCheck")).action((options) => runBrowser(options, "0.6.0"));
|
|
27261
|
+
program2.command("init").description(t2("help.init")).allowExcessArguments(false).option("--dry-run", t2("help.initDryRun")).addOption(new Option("--agent <agent>", t2("help.initAgent")).choices([...agentPresetNames])).addOption(new Option("--remove-agents", t2("help.initRemoveAgents")).conflicts("skipAgents")).option("--skip-agents", t2("help.initSkipAgents")).addOption(new Option("--format <format>", t2("help.format")).choices(["json", "text"]).default("json")).action((options) => runInit(options, "0.6.0"));
|
|
27475
27262
|
program2.command("docs").description(t2("help.docs")).argument("[topic]", t2("help.docsTopic")).allowExcessArguments(false).action(async (topic) => {
|
|
27476
27263
|
await runDocs(topic);
|
|
27477
27264
|
});
|
|
27478
|
-
program2.command("update").description(t2("help.update")).allowExcessArguments(false).addOption(new Option("--format <format>", t2("help.format")).choices(["json", "text"]).default("json")).option("--commit", t2("help.updateCommit")).action((options) => runUpdate(options, "0.
|
|
27265
|
+
program2.command("update").description(t2("help.update")).allowExcessArguments(false).addOption(new Option("--format <format>", t2("help.format")).choices(["json", "text"]).default("json")).option("--commit", t2("help.updateCommit")).action((options) => runUpdate(options, "0.6.0"));
|
|
27479
27266
|
program2.command("migrate").description(t2("help.migrate")).allowExcessArguments(false).option("--dry-run", t2("help.migrateDryRun")).action(runMigrate);
|
|
27480
27267
|
var spec = program2.command("spec").description(t2("help.spec"));
|
|
27481
|
-
var replaced = t2("help.deprecated");
|
|
27482
27268
|
spec.command("commit").description(t2("help.specCommit")).allowExcessArguments(false).requiredOption("--file <path>", t2("help.specCommitFile")).option("--dry-run", t2("help.specCommitDryRun")).action((o) => runSpecPreview("commit", o));
|
|
27483
|
-
for (const action of ["commit-plan", "commit-apply"]) spec.command(action).description(replaced).allowExcessArguments(false).requiredOption("--file <path>", t2("help.specCommitPlanFile")).action((o) => runSpecPreview(action, o));
|
|
27484
27269
|
spec.command("changes").description(t2("help.specChanges")).allowExcessArguments(false).action((o) => runSpecPreview("changes", o));
|
|
27485
|
-
spec.command("prepare").description(replaced).allowExcessArguments(false).requiredOption("--file <path>", t2("help.specPrepareFile")).action((o) => runSpecPreview("prepare", o));
|
|
27486
|
-
spec.command("verify").description(replaced).allowExcessArguments(false).requiredOption("--file <path>", t2("help.specVerifyFile")).option("--staged", t2("help.specVerifyStaged")).action((o) => runSpecPreview("verify", o));
|
|
27487
27270
|
spec.command("working").description(t2("help.specWorking")).allowExcessArguments(false).addOption(new Option("--stamp", t2("help.specWorkingStamp")).conflicts(["feature", "ids"])).option("--feature <name>", t2("help.specWorkingFeature")).option("--ids", t2("help.specWorkingIds")).action((o) => runSpecPreview("working", o));
|
|
27488
27271
|
spec.command("save").description(t2("help.specSave")).allowExcessArguments(false).requiredOption("--file <path>", t2("help.specSaveFile")).action((o) => runSpecPreview("save", o));
|
|
27489
27272
|
spec.command("read").description(t2("help.specRead")).allowExcessArguments(false).option("--ref <commit>", t2("help.specReadRef"), "HEAD").action((o) => runSpecPreview("read", o));
|