@tacuchi/agent-workflow-cli 25.8.0 → 26.0.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 +106 -0
- package/README.md +6 -3
- package/dist/adapters/git-cli.js +225 -17
- package/dist/adapters/git-cli.js.map +1 -1
- package/dist/adapters/node-file-system.js +48 -0
- package/dist/adapters/node-file-system.js.map +1 -1
- package/dist/application/amend-service.js +51 -14
- package/dist/application/amend-service.js.map +1 -1
- package/dist/application/branch-resolver.js +6 -3
- package/dist/application/branch-resolver.js.map +1 -1
- package/dist/application/capability/design-handler.js +218 -43
- package/dist/application/capability/design-handler.js.map +1 -1
- package/dist/application/capability/dispatcher.js +182 -19
- package/dist/application/capability/dispatcher.js.map +1 -1
- package/dist/application/capability/durable-effect.js +3 -0
- package/dist/application/capability/durable-effect.js.map +1 -1
- package/dist/application/capability/readiness.js +8 -54
- package/dist/application/capability/readiness.js.map +1 -1
- package/dist/application/capability/resolution.js +124 -192
- package/dist/application/capability/resolution.js.map +1 -1
- package/dist/application/check-branch-service.js +158 -19
- package/dist/application/check-branch-service.js.map +1 -1
- package/dist/application/checkpoint/markdown.js +2 -2
- package/dist/application/checkpoint/markdown.js.map +1 -1
- package/dist/application/checkpoint/state-reader.js +12 -0
- package/dist/application/checkpoint/state-reader.js.map +1 -1
- package/dist/application/checkpoint-service.js +12 -4
- package/dist/application/checkpoint-service.js.map +1 -1
- package/dist/application/checkpoint-write-service.js +91 -17
- package/dist/application/checkpoint-write-service.js.map +1 -1
- package/dist/application/claims-ledger.js +137 -11
- package/dist/application/claims-ledger.js.map +1 -1
- package/dist/application/claims-recovery.js +85 -44
- package/dist/application/claims-recovery.js.map +1 -1
- package/dist/application/database-tool-catalog.js +33 -0
- package/dist/application/database-tool-catalog.js.map +1 -1
- package/dist/application/design/consumer-document.js +2 -2
- package/dist/application/design/consumer-document.js.map +1 -1
- package/dist/application/design/design-content-gate-service.js +20 -2
- package/dist/application/design/design-content-gate-service.js.map +1 -1
- package/dist/application/design/design-gate-service.js +2 -0
- package/dist/application/design/design-gate-service.js.map +1 -1
- package/dist/application/design/design-index-service.js +4 -0
- package/dist/application/design/design-index-service.js.map +1 -1
- package/dist/application/design/design-publish-service.js +1 -4
- package/dist/application/design/design-publish-service.js.map +1 -1
- package/dist/application/design/design-record-service.js +13 -7
- package/dist/application/design/design-record-service.js.map +1 -1
- package/dist/application/design/design-resolver-service.js +22 -3
- package/dist/application/design/design-resolver-service.js.map +1 -1
- package/dist/application/design/design-simple-service.js +24 -5
- package/dist/application/design/design-simple-service.js.map +1 -1
- package/dist/application/design/digest.js +41 -0
- package/dist/application/design/digest.js.map +1 -0
- package/dist/application/dev-only-services.js +166 -20
- package/dist/application/dev-only-services.js.map +1 -1
- package/dist/application/doc-branch-ledger.js +145 -0
- package/dist/application/doc-branch-ledger.js.map +1 -0
- package/dist/application/docs-canon-service.js +1 -1
- package/dist/application/docs-canon-service.js.map +1 -1
- package/dist/application/doctor/dist-integrity.js +113 -0
- package/dist/application/doctor/dist-integrity.js.map +1 -0
- package/dist/application/doctor/hosts.js +5 -2
- package/dist/application/doctor/hosts.js.map +1 -1
- package/dist/application/doctor/prepare.js +3 -3
- package/dist/application/doctor/prepare.js.map +1 -1
- package/dist/application/doctor/provider-installation.js +39 -19
- package/dist/application/doctor/provider-installation.js.map +1 -1
- package/dist/application/doctor/provider-mcps.js +9 -1
- package/dist/application/doctor/provider-mcps.js.map +1 -1
- package/dist/application/doctor/provider-skills.js +29 -115
- package/dist/application/doctor/provider-skills.js.map +1 -1
- package/dist/application/doctor/provider-visibility.js +76 -3
- package/dist/application/doctor/provider-visibility.js.map +1 -1
- package/dist/application/doctor/provider-workspace-block.js +156 -0
- package/dist/application/doctor/provider-workspace-block.js.map +1 -0
- package/dist/application/doctor/repair-runner.js +36 -39
- package/dist/application/doctor/repair-runner.js.map +1 -1
- package/dist/application/doctor/report.js +24 -4
- package/dist/application/doctor/report.js.map +1 -1
- package/dist/application/export-catalog-check.js +200 -0
- package/dist/application/export-catalog-check.js.map +1 -0
- package/dist/application/export-service.js +716 -79
- package/dist/application/export-service.js.map +1 -1
- package/dist/application/fix-git-service.js +285 -64
- package/dist/application/fix-git-service.js.map +1 -1
- package/dist/application/flow/advance.js +202 -25
- package/dist/application/flow/advance.js.map +1 -1
- package/dist/application/flow/annul-service.js +3 -1
- package/dist/application/flow/annul-service.js.map +1 -1
- package/dist/application/flow/batch-commit.js +189 -0
- package/dist/application/flow/batch-commit.js.map +1 -0
- package/dist/application/flow/checkout-observation.js +63 -10
- package/dist/application/flow/checkout-observation.js.map +1 -1
- package/dist/application/flow/close-artifacts.js +105 -0
- package/dist/application/flow/close-artifacts.js.map +1 -0
- package/dist/application/flow/close-at-boundary.js +25 -14
- package/dist/application/flow/close-at-boundary.js.map +1 -1
- package/dist/application/flow/close-document-guidance.js +70 -0
- package/dist/application/flow/close-document-guidance.js.map +1 -0
- package/dist/application/flow/flow-service.js +46 -3
- package/dist/application/flow/flow-service.js.map +1 -1
- package/dist/application/flow/internal-actions.js +300 -82
- package/dist/application/flow/internal-actions.js.map +1 -1
- package/dist/application/flow/internal-drive.js +24 -1
- package/dist/application/flow/internal-drive.js.map +1 -1
- package/dist/application/flow/plan-entry.js +82 -0
- package/dist/application/flow/plan-entry.js.map +1 -0
- package/dist/application/flow/prove.js +32 -1
- package/dist/application/flow/prove.js.map +1 -1
- package/dist/application/flow/quick-checkouts.js +48 -0
- package/dist/application/flow/quick-checkouts.js.map +1 -0
- package/dist/application/flow/reinfer-batch.js +177 -0
- package/dist/application/flow/reinfer-batch.js.map +1 -0
- package/dist/application/flow/reopen-run.js +12 -5
- package/dist/application/flow/reopen-run.js.map +1 -1
- package/dist/application/flow/run-state-service.js +2 -0
- package/dist/application/flow/run-state-service.js.map +1 -1
- package/dist/application/flow/submit.js +584 -117
- package/dist/application/flow/submit.js.map +1 -1
- package/dist/application/generate-launch-service.js +16 -6
- package/dist/application/generate-launch-service.js.map +1 -1
- package/dist/application/git-flow-service.js +34 -3
- package/dist/application/git-flow-service.js.map +1 -1
- package/dist/application/history-publications.js +24 -0
- package/dist/application/history-publications.js.map +1 -1
- package/dist/application/history-reconcile-service.js +45 -0
- package/dist/application/history-reconcile-service.js.map +1 -0
- package/dist/application/history-table.js +61 -12
- package/dist/application/history-table.js.map +1 -1
- package/dist/application/history-update-service.js +25 -4
- package/dist/application/history-update-service.js.map +1 -1
- package/dist/application/hook-branch-check.js +25 -3
- package/dist/application/hook-branch-check.js.map +1 -1
- package/dist/application/hook-git-commit-advisor.js +3 -4
- package/dist/application/hook-git-commit-advisor.js.map +1 -1
- package/dist/application/hook-turn-start.js +51 -0
- package/dist/application/hook-turn-start.js.map +1 -0
- package/dist/application/host-memory/codex.js +1 -1
- package/dist/application/host-memory/codex.js.map +1 -1
- package/dist/application/hub-registry.js +135 -0
- package/dist/application/hub-registry.js.map +1 -0
- package/dist/application/local-proposal.js +72 -19
- package/dist/application/local-proposal.js.map +1 -1
- package/dist/application/mcp-host-reader.js +1 -1
- package/dist/application/mcp-host-reader.js.map +1 -1
- package/dist/application/mcp-host-writer.js +16 -10
- package/dist/application/mcp-host-writer.js.map +1 -1
- package/dist/application/merge-state-service.js +150 -34
- package/dist/application/merge-state-service.js.map +1 -1
- package/dist/application/multiroot/claude.js +17 -10
- package/dist/application/multiroot/claude.js.map +1 -1
- package/dist/application/multiroot/codex.js +17 -11
- package/dist/application/multiroot/codex.js.map +1 -1
- package/dist/application/multiroot-service.js +52 -28
- package/dist/application/multiroot-service.js.map +1 -1
- package/dist/application/parsers/execution-batches.js +64 -0
- package/dist/application/parsers/execution-batches.js.map +1 -0
- package/dist/application/parsers/phases.js +23 -2
- package/dist/application/parsers/phases.js.map +1 -1
- package/dist/application/parsers/project-block.js +146 -17
- package/dist/application/parsers/project-block.js.map +1 -1
- package/dist/application/parsers/tasks.js +16 -2
- package/dist/application/parsers/tasks.js.map +1 -1
- package/dist/application/parsers/toml.js +19 -0
- package/dist/application/parsers/toml.js.map +1 -0
- package/dist/application/paths-service.js +13 -16
- package/dist/application/paths-service.js.map +1 -1
- package/dist/application/persist-service.js +118 -5
- package/dist/application/persist-service.js.map +1 -1
- package/dist/application/plan-exec-batch-service.js +162 -22
- package/dist/application/plan-exec-batch-service.js.map +1 -1
- package/dist/application/plan-exec-decision-service.js +61 -12
- package/dist/application/plan-exec-decision-service.js.map +1 -1
- package/dist/application/plan-exec-plan-diff.js +105 -0
- package/dist/application/plan-exec-plan-diff.js.map +1 -0
- package/dist/application/plan-lint-service.js +33 -5
- package/dist/application/plan-lint-service.js.map +1 -1
- package/dist/application/plan-passes.js +41 -0
- package/dist/application/plan-passes.js.map +1 -0
- package/dist/application/preparation-receipts.js +58 -0
- package/dist/application/preparation-receipts.js.map +1 -0
- package/dist/application/project-md-upsert-service.js +191 -52
- package/dist/application/project-md-upsert-service.js.map +1 -1
- package/dist/application/project-tab-data.js +40 -10
- package/dist/application/project-tab-data.js.map +1 -1
- package/dist/application/release-data/artifacts.js +15 -7
- package/dist/application/release-data/artifacts.js.map +1 -1
- package/dist/application/release-data/bundles.js +52 -6
- package/dist/application/release-data/bundles.js.map +1 -1
- package/dist/application/release-data/common.js +2 -2
- package/dist/application/release-data/common.js.map +1 -1
- package/dist/application/release-data/rollback.js +7 -0
- package/dist/application/release-data/rollback.js.map +1 -0
- package/dist/application/release-data/sessions.js +2 -2
- package/dist/application/release-data/sessions.js.map +1 -1
- package/dist/application/release-pass-ledger.js +1 -1
- package/dist/application/render/history-row.js +2 -0
- package/dist/application/render/history-row.js.map +1 -1
- package/dist/application/render/project-block.js +28 -11
- package/dist/application/render/project-block.js.map +1 -1
- package/dist/application/reseal-service.js +1 -0
- package/dist/application/reseal-service.js.map +1 -1
- package/dist/application/resume-service.js +55 -8
- package/dist/application/resume-service.js.map +1 -1
- package/dist/application/retirement/apply.js +25 -7
- package/dist/application/retirement/apply.js.map +1 -1
- package/dist/application/retirement/attribution.js +122 -50
- package/dist/application/retirement/attribution.js.map +1 -1
- package/dist/application/retirement/prepare.js +17 -11
- package/dist/application/retirement/prepare.js.map +1 -1
- package/dist/application/retirement/preview.js +2 -1
- package/dist/application/retirement/preview.js.map +1 -1
- package/dist/application/self/clean-legacy.js +1 -2
- package/dist/application/self/clean-legacy.js.map +1 -1
- package/dist/application/self/codex-plugin.js +1 -1
- package/dist/application/self/codex-plugin.js.map +1 -1
- package/dist/application/self/host-states.js +3 -3
- package/dist/application/self/host-states.js.map +1 -1
- package/dist/application/self/install-hooks.js +1 -1
- package/dist/application/self/install-hooks.js.map +1 -1
- package/dist/application/self/install-skill.js +5 -49
- package/dist/application/self/install-skill.js.map +1 -1
- package/dist/application/self/mcp-config.js +19 -11
- package/dist/application/self/mcp-config.js.map +1 -1
- package/dist/application/self/opencode-plugin.js +1 -0
- package/dist/application/self/opencode-plugin.js.map +1 -1
- package/dist/application/self/skill-files.js +29 -0
- package/dist/application/self/skill-files.js.map +1 -0
- package/dist/application/self/uninstall.js +1 -1
- package/dist/application/self/uninstall.js.map +1 -1
- package/dist/application/semantic-operation/protocol.js +66 -5
- package/dist/application/semantic-operation/protocol.js.map +1 -1
- package/dist/application/session-archive-service.js +113 -0
- package/dist/application/session-archive-service.js.map +1 -0
- package/dist/application/session-binding-service.js +35 -0
- package/dist/application/session-binding-service.js.map +1 -1
- package/dist/application/session-close-service.js +390 -54
- package/dist/application/session-close-service.js.map +1 -1
- package/dist/application/session-create-service.js +97 -5
- package/dist/application/session-create-service.js.map +1 -1
- package/dist/application/session-custody-recorder.js +15 -12
- package/dist/application/session-custody-recorder.js.map +1 -1
- package/dist/application/session-custody-service.js +1 -0
- package/dist/application/session-custody-service.js.map +1 -1
- package/dist/application/session-narrative.js +42 -12
- package/dist/application/session-narrative.js.map +1 -1
- package/dist/application/session-pause-service.js +46 -0
- package/dist/application/session-pause-service.js.map +1 -0
- package/dist/application/session-resolver.js +36 -11
- package/dist/application/session-resolver.js.map +1 -1
- package/dist/application/session-resume-service.js +134 -13
- package/dist/application/session-resume-service.js.map +1 -1
- package/dist/application/sessions-service.js +4 -0
- package/dist/application/sessions-service.js.map +1 -1
- package/dist/application/sessions-sweep-service.js +77 -0
- package/dist/application/sessions-sweep-service.js.map +1 -0
- package/dist/application/settle-service.js +3 -1
- package/dist/application/settle-service.js.map +1 -1
- package/dist/application/skills-resolver-service.js +6 -92
- package/dist/application/skills-resolver-service.js.map +1 -1
- package/dist/application/source-add-service.js +37 -0
- package/dist/application/source-add-service.js.map +1 -0
- package/dist/application/source-boundary-policy.js +105 -8
- package/dist/application/source-boundary-policy.js.map +1 -1
- package/dist/application/source-pipeline.js +68 -0
- package/dist/application/source-pipeline.js.map +1 -0
- package/dist/application/source-remove-service.js +15 -3
- package/dist/application/source-remove-service.js.map +1 -1
- package/dist/application/sources-service.js +71 -16
- package/dist/application/sources-service.js.map +1 -1
- package/dist/application/status-service.js +55 -5
- package/dist/application/status-service.js.map +1 -1
- package/dist/application/unit-dependencies.js +100 -0
- package/dist/application/unit-dependencies.js.map +1 -0
- package/dist/application/unit-membership.js +37 -0
- package/dist/application/unit-membership.js.map +1 -0
- package/dist/application/unit-residue.js +72 -0
- package/dist/application/unit-residue.js.map +1 -0
- package/dist/application/visibility-doctor-service.js +66 -4
- package/dist/application/visibility-doctor-service.js.map +1 -1
- package/dist/application/working-branch-service.js +6 -0
- package/dist/application/working-branch-service.js.map +1 -1
- package/dist/application/workline-graph.js +1 -1
- package/dist/application/workline-graph.js.map +1 -1
- package/dist/application/workline-index-service.js +118 -17
- package/dist/application/workline-index-service.js.map +1 -1
- package/dist/application/workspace-commit-service.js +218 -0
- package/dist/application/workspace-commit-service.js.map +1 -0
- package/dist/application/workspace-init-service.js +64 -34
- package/dist/application/workspace-init-service.js.map +1 -1
- package/dist/application/workspace-local-config.js +90 -0
- package/dist/application/workspace-local-config.js.map +1 -0
- package/dist/application/workspace-materialization-service.js +52 -3
- package/dist/application/workspace-materialization-service.js.map +1 -1
- package/dist/application/workspace-migrate/apply.js +525 -4
- package/dist/application/workspace-migrate/apply.js.map +1 -1
- package/dist/application/workspace-migrate/markers.js +9 -6
- package/dist/application/workspace-migrate/markers.js.map +1 -1
- package/dist/application/workspace-migrate/plan.js +97 -5
- package/dist/application/workspace-migrate/plan.js.map +1 -1
- package/dist/application/workspace-move-service.js +270 -0
- package/dist/application/workspace-move-service.js.map +1 -0
- package/dist/application/workspace-untrack-service.js +28 -0
- package/dist/application/workspace-untrack-service.js.map +1 -0
- package/dist/application/worktree-service.js +654 -105
- package/dist/application/worktree-service.js.map +1 -1
- package/dist/cli/ascii.js +2 -0
- package/dist/cli/ascii.js.map +1 -1
- package/dist/cli/commands/add-source.js +38 -0
- package/dist/cli/commands/add-source.js.map +1 -0
- package/dist/cli/commands/amend.js +14 -3
- package/dist/cli/commands/amend.js.map +1 -1
- package/dist/cli/commands/capability.js +23 -4
- package/dist/cli/commands/capability.js.map +1 -1
- package/dist/cli/commands/designs.js +14 -5
- package/dist/cli/commands/designs.js.map +1 -1
- package/dist/cli/commands/dev-only.js +19 -6
- package/dist/cli/commands/dev-only.js.map +1 -1
- package/dist/cli/commands/doc-branch.js +184 -0
- package/dist/cli/commands/doc-branch.js.map +1 -0
- package/dist/cli/commands/doctor.js +5 -1
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/export.js +78 -18
- package/dist/cli/commands/export.js.map +1 -1
- package/dist/cli/commands/fix-git.js +89 -14
- package/dist/cli/commands/fix-git.js.map +1 -1
- package/dist/cli/commands/flow.js +120 -15
- package/dist/cli/commands/flow.js.map +1 -1
- package/dist/cli/commands/generate-launch.js +14 -2
- package/dist/cli/commands/generate-launch.js.map +1 -1
- package/dist/cli/commands/history-update.js +1 -1
- package/dist/cli/commands/history-update.js.map +1 -1
- package/dist/cli/commands/history.js +14 -0
- package/dist/cli/commands/history.js.map +1 -0
- package/dist/cli/commands/hook.js +15 -2
- package/dist/cli/commands/hook.js.map +1 -1
- package/dist/cli/commands/index.js +18 -5
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/merge-state.js +2 -2
- package/dist/cli/commands/merge-state.js.map +1 -1
- package/dist/cli/commands/persist.js +6 -5
- package/dist/cli/commands/persist.js.map +1 -1
- package/dist/cli/commands/project-md-upsert.js +5 -3
- package/dist/cli/commands/project-md-upsert.js.map +1 -1
- package/dist/cli/commands/release-pass.js +3 -3
- package/dist/cli/commands/release-pass.js.map +1 -1
- package/dist/cli/commands/resume.js +12 -3
- package/dist/cli/commands/resume.js.map +1 -1
- package/dist/cli/commands/self.js +8 -24
- package/dist/cli/commands/self.js.map +1 -1
- package/dist/cli/commands/session-close.js +64 -9
- package/dist/cli/commands/session-close.js.map +1 -1
- package/dist/cli/commands/session-create.js +4 -2
- package/dist/cli/commands/session-create.js.map +1 -1
- package/dist/cli/commands/session-pause.js +14 -0
- package/dist/cli/commands/session-pause.js.map +1 -0
- package/dist/cli/commands/sessions.js +16 -3
- package/dist/cli/commands/sessions.js.map +1 -1
- package/dist/cli/commands/set-branch.js +28 -4
- package/dist/cli/commands/set-branch.js.map +1 -1
- package/dist/cli/commands/set-edit-mode.js +20 -0
- package/dist/cli/commands/set-edit-mode.js.map +1 -0
- package/dist/cli/commands/set-pipeline.js +35 -0
- package/dist/cli/commands/set-pipeline.js.map +1 -0
- package/dist/cli/commands/skills.js +4 -11
- package/dist/cli/commands/skills.js.map +1 -1
- package/dist/cli/commands/sources.js +4 -0
- package/dist/cli/commands/sources.js.map +1 -1
- package/dist/cli/commands/status.js +35 -2
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/unknown-flags.js +1 -0
- package/dist/cli/commands/unknown-flags.js.map +1 -1
- package/dist/cli/commands/visibility.js +1 -0
- package/dist/cli/commands/visibility.js.map +1 -1
- package/dist/cli/commands/workspace-commit.js +62 -0
- package/dist/cli/commands/workspace-commit.js.map +1 -0
- package/dist/cli/commands/workspace-init.js +39 -2
- package/dist/cli/commands/workspace-init.js.map +1 -1
- package/dist/cli/commands/workspace-migrate.js +31 -3
- package/dist/cli/commands/workspace-migrate.js.map +1 -1
- package/dist/cli/commands/workspace-move.js +42 -0
- package/dist/cli/commands/workspace-move.js.map +1 -0
- package/dist/cli/commands/worktree.js +4 -4
- package/dist/cli/commands/worktree.js.map +1 -1
- package/dist/cli/context-id.js +6 -0
- package/dist/cli/context-id.js.map +1 -1
- package/dist/cli/full-cli.js +555 -0
- package/dist/cli/full-cli.js.map +1 -0
- package/dist/cli/help-groups.js +76 -19
- package/dist/cli/help-groups.js.map +1 -1
- package/dist/cli/hook-stdin-cache.js +12 -0
- package/dist/cli/hook-stdin-cache.js.map +1 -0
- package/dist/cli/main.js +47 -453
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/parser.js +4 -0
- package/dist/cli/parser.js.map +1 -1
- package/dist/cli/tui/app.js +3 -4
- package/dist/cli/tui/app.js.map +1 -1
- package/dist/cli/tui/components/host-admin-section.js +2 -13
- package/dist/cli/tui/components/host-admin-section.js.map +1 -1
- package/dist/cli/tui/components/tabs-config.js +1 -2
- package/dist/cli/tui/components/tabs-config.js.map +1 -1
- package/dist/cli/tui/components/workspace-init-form.js +4 -1
- package/dist/cli/tui/components/workspace-init-form.js.map +1 -1
- package/dist/cli/tui/data/workflow-content.js +6 -1
- package/dist/cli/tui/data/workflow-content.js.map +1 -1
- package/dist/cli/tui/tabs/mcp-tab.js +4 -3
- package/dist/cli/tui/tabs/mcp-tab.js.map +1 -1
- package/dist/cli/tui/tabs/project-tab.js +7 -2
- package/dist/cli/tui/tabs/project-tab.js.map +1 -1
- package/dist/cli/tui/tui-prefs.js +2 -0
- package/dist/cli/tui/tui-prefs.js.map +1 -1
- package/dist/dist-manifest.json +3973 -0
- package/dist/domain/capability/protocol.js +3 -1
- package/dist/domain/capability/protocol.js.map +1 -1
- package/dist/domain/decision-note.js +13 -0
- package/dist/domain/decision-note.js.map +1 -1
- package/dist/domain/design/artifact.js +22 -3
- package/dist/domain/design/artifact.js.map +1 -1
- package/dist/domain/design/capability.js +1 -0
- package/dist/domain/design/capability.js.map +1 -1
- package/dist/domain/design/expansion.js +1 -1
- package/dist/domain/design/expansion.js.map +1 -1
- package/dist/domain/design/maturity.js +16 -0
- package/dist/domain/design/maturity.js.map +1 -1
- package/dist/domain/design/reference.js +5 -0
- package/dist/domain/design/reference.js.map +1 -1
- package/dist/domain/doctor/operations.js +20 -12
- package/dist/domain/doctor/operations.js.map +1 -1
- package/dist/domain/effective-contract.js +3 -1
- package/dist/domain/effective-contract.js.map +1 -1
- package/dist/domain/elicitation.js +1 -1
- package/dist/domain/flow/answer.js +265 -130
- package/dist/domain/flow/answer.js.map +1 -1
- package/dist/domain/flow/authority.js +194 -37
- package/dist/domain/flow/authority.js.map +1 -1
- package/dist/domain/flow/batch-review.js +65 -0
- package/dist/domain/flow/batch-review.js.map +1 -0
- package/dist/domain/flow/decision-schema.js +47 -0
- package/dist/domain/flow/decision-schema.js.map +1 -0
- package/dist/domain/flow/directive.js +16 -0
- package/dist/domain/flow/directive.js.map +1 -1
- package/dist/domain/flow/execution-result.js +91 -2
- package/dist/domain/flow/execution-result.js.map +1 -1
- package/dist/domain/flow/run-state.js +352 -24
- package/dist/domain/flow/run-state.js.map +1 -1
- package/dist/domain/flow/test-run-evidence.js +285 -0
- package/dist/domain/flow/test-run-evidence.js.map +1 -0
- package/dist/domain/flow/unchanged-phase.js +15 -0
- package/dist/domain/flow/unchanged-phase.js.map +1 -0
- package/dist/domain/harnesses.js +14 -5
- package/dist/domain/harnesses.js.map +1 -1
- package/dist/domain/isolation-unit.js +2 -2
- package/dist/domain/isolation-unit.js.map +1 -1
- package/dist/domain/lineage.js +7 -2
- package/dist/domain/lineage.js.map +1 -1
- package/dist/domain/obligation-correspondence.js +4 -2
- package/dist/domain/obligation-correspondence.js.map +1 -1
- package/dist/domain/plan-handoff.js +5 -0
- package/dist/domain/plan-handoff.js.map +1 -0
- package/dist/domain/proposal.js +18 -7
- package/dist/domain/proposal.js.map +1 -1
- package/dist/domain/reservation.js +5 -3
- package/dist/domain/reservation.js.map +1 -1
- package/dist/domain/retirement/proposal.js +1 -0
- package/dist/domain/retirement/proposal.js.map +1 -1
- package/dist/domain/session/custody.js +10 -6
- package/dist/domain/session/custody.js.map +1 -1
- package/dist/domain/session/narrative.js +4 -1
- package/dist/domain/session/narrative.js.map +1 -1
- package/dist/domain/skills.js +4 -6
- package/dist/domain/skills.js.map +1 -1
- package/dist/domain/sql-lexer.js +1 -1
- package/dist/domain/sql-lexer.js.map +1 -1
- package/dist/runtime/namespace-resolver.js +4 -0
- package/dist/runtime/namespace-resolver.js.map +1 -1
- package/dist/runtime/workline-marker.js +35 -8
- package/dist/runtime/workline-marker.js.map +1 -1
- package/dist/runtime/workspace-resolution.js +123 -0
- package/dist/runtime/workspace-resolution.js.map +1 -0
- package/package.json +6 -5
- package/skills/w/SKILL.md +12 -17
- package/skills/w/artifacts/artifacts-core/CHECKPOINT.md +1 -1
- package/skills/w/artifacts/artifacts-core/SCRIPTS.rollback.sql +8 -0
- package/skills/w/artifacts/artifacts-core/SCRIPTS.sql +4 -8
- package/skills/w/commands/export-diagrams.md +3 -3
- package/skills/w/commands/export-manuals.md +6 -6
- package/skills/w/commands/export-reports.md +3 -3
- package/skills/w/commands/export-scripts.md +5 -5
- package/skills/w/commands/fix-git.md +12 -13
- package/skills/w/commands/persist.md +2 -2
- package/skills/w/commands/plan-exec.md +4 -2
- package/skills/w/commands/spec-new.md +1 -1
- package/skills/w/commands/workspace-init.md +2 -0
- package/skills/w/context/MANIFEST.json +1 -1
- package/skills/w/exports/README.md +4 -4
- package/skills/w/exports/export-diagrams/EXPORT.md +4 -4
- package/skills/w/exports/export-manuals/EXPORT.md +14 -16
- package/skills/w/exports/export-reports/EXPORT.md +3 -3
- package/skills/w/exports/export-scripts/EXPORT.md +46 -22
- package/skills/w/harness/HARNESS.md +4 -7
- package/skills/w/hooks/hooks.template.json +6 -4
- package/skills/w/loops/CHASSIS.md +12 -6
- package/skills/w/loops/CODE-POLICIES.md +8 -5
- package/skills/w/loops/README.md +2 -2
- package/skills/w/loops/plan-exec-loop/LOOP.md +23 -22
- package/skills/w/loops/plan-new-loop/LOOP.md +23 -31
- package/skills/w/loops/plan-refine-loop/LOOP.md +8 -2
- package/skills/w/loops/quick-loop/LOOP.md +7 -6
- package/skills/w/loops/spec-refine-loop/LOOP.md +1 -1
- package/skills/w/modules/DESIGN-REFERENCES.md +9 -11
- package/skills/w/modules/PLAN-EXECUTION-BATCHES.md +4 -4
- package/skills/w/modules/SESSION-NUMBERING.md +2 -0
- package/skills/w/roles/README.md +11 -47
- package/skills/w/roles/design/CONTRACT.md +6 -4
- package/skills/w/roles/design/ROLE.md +7 -3
- package/skills/w/roles/diagrams/ROLE.md +1 -1
- package/skills/w/roles/git/ROLE.md +17 -10
- package/skills/w/roles/research/ROLE.md +2 -2
- package/skills/w/roles/sql/ROLE.md +17 -15
- package/skills/w/schemas/design/ui-screen.v1.schema.json +9 -0
- package/dist/application/capability/descriptor-loader.js +0 -109
- package/dist/application/capability/descriptor-loader.js.map +0 -1
- package/dist/application/capability/installed-inventory.js +0 -168
- package/dist/application/capability/installed-inventory.js.map +0 -1
- package/dist/application/self/install-plugin-skills-git.js +0 -226
- package/dist/application/self/install-plugin-skills-git.js.map +0 -1
- package/dist/application/self/install-plugin-skills.js +0 -203
- package/dist/application/self/install-plugin-skills.js.map +0 -1
- package/dist/application/self/plugin-cache-clear.js +0 -133
- package/dist/application/self/plugin-cache-clear.js.map +0 -1
- package/dist/application/self/plugin-cache-reload.js +0 -141
- package/dist/application/self/plugin-cache-reload.js.map +0 -1
- package/dist/application/self/skills-apply.js +0 -623
- package/dist/application/self/skills-apply.js.map +0 -1
- package/dist/application/self/skills-catalog.js +0 -35
- package/dist/application/self/skills-catalog.js.map +0 -1
- package/dist/application/self/skills-change.js +0 -479
- package/dist/application/self/skills-change.js.map +0 -1
- package/dist/application/self/skills-discovery.js +0 -275
- package/dist/application/self/skills-discovery.js.map +0 -1
- package/dist/application/self/skills-manager.js +0 -253
- package/dist/application/self/skills-manager.js.map +0 -1
- package/dist/application/self/skills-payload.js +0 -566
- package/dist/application/self/skills-payload.js.map +0 -1
- package/dist/application/self/skills-registry.js +0 -107
- package/dist/application/self/skills-registry.js.map +0 -1
- package/dist/application/skill-index-service.js +0 -78
- package/dist/application/skill-index-service.js.map +0 -1
- package/dist/cli/commands/plugin-cache.js +0 -25
- package/dist/cli/commands/plugin-cache.js.map +0 -1
- package/dist/cli/commands/skill-index.js +0 -19
- package/dist/cli/commands/skill-index.js.map +0 -1
- package/dist/cli/tui/data/recommended-skills.js +0 -482
- package/dist/cli/tui/data/recommended-skills.js.map +0 -1
- package/dist/cli/tui/tabs/skills-tab.js +0 -664
- package/dist/cli/tui/tabs/skills-tab.js.map +0 -1
|
@@ -8,9 +8,524 @@
|
|
|
8
8
|
* decision instead of two — the same reason the retirement commands recompute
|
|
9
9
|
* theirs before converging.
|
|
10
10
|
*/
|
|
11
|
+
import { randomUUID } from "node:crypto";
|
|
12
|
+
import { dirname, join, relative } from "node:path";
|
|
13
|
+
import { leadingCorrelative } from "../../domain/correlative.js";
|
|
14
|
+
import { sealRunState, serializeRunState } from "../../domain/flow/run-state.js";
|
|
15
|
+
import { FOLDER_RESERVATION_MARKER, reservationOwnerOf } from "../../domain/reservation.js";
|
|
16
|
+
import { sealCustody } from "../../domain/session/custody.js";
|
|
17
|
+
import { appendClaimEvent, openClaimsOf, openOwnerOfSlot, readClaimEvents, readClaimEventsRaw, } from "../claims-ledger.js";
|
|
18
|
+
import { scanSlots } from "../claims-recovery.js";
|
|
19
|
+
import { docBranchLedgerPath } from "../doc-branch-ledger.js";
|
|
20
|
+
import { locateRun, readRun } from "../flow/run-state-service.js";
|
|
21
|
+
import { readHistoryRows, upsertRow } from "../history-table.js";
|
|
11
22
|
import { upsertHistoryRow } from "../history-update-service.js";
|
|
12
|
-
import { withCwdLock } from "../lock-service.js";
|
|
13
|
-
import {
|
|
23
|
+
import { acquireLock, withCwdLock } from "../lock-service.js";
|
|
24
|
+
import { semanticDigest } from "../semantic-operation/protocol.js";
|
|
25
|
+
import { publishArtifacts } from "../semantic-operation/publish.js";
|
|
26
|
+
import { renameBindingsTo } from "../session-binding-service.js";
|
|
27
|
+
import { readCustody, writeCustody } from "../session-custody-service.js";
|
|
28
|
+
import { CLOSED_MARKER } from "../session-resolver.js";
|
|
29
|
+
import { planRenumber, planWorkspaceMigration, sentinelPath, } from "./plan.js";
|
|
30
|
+
function renumberJournalPath(paths) {
|
|
31
|
+
return join(paths.cwdRoot(), "renumber-pending.json");
|
|
32
|
+
}
|
|
33
|
+
/** Recover a stopped multi-file renumber before its next read can claim an owner. */
|
|
34
|
+
export async function recoverRenumberJournal(fs, paths, lockHeld = false) {
|
|
35
|
+
const path = renumberJournalPath(paths);
|
|
36
|
+
if (!(await fs.exists(path)))
|
|
37
|
+
return false;
|
|
38
|
+
const recover = async () => {
|
|
39
|
+
const raw = JSON.parse(await fs.readText(path));
|
|
40
|
+
if (typeof raw !== "object" || raw === null || !("digest" in raw)) {
|
|
41
|
+
throw new Error("el registro de renumerado no tiene sello verificable");
|
|
42
|
+
}
|
|
43
|
+
const { digest, ...body } = raw;
|
|
44
|
+
if (body.version !== 1 ||
|
|
45
|
+
!Array.isArray(body.moves) ||
|
|
46
|
+
!Array.isArray(body.files) ||
|
|
47
|
+
!Array.isArray(body.transfers) ||
|
|
48
|
+
digest !== semanticDigest(body)) {
|
|
49
|
+
throw new Error("el registro de renumerado no coincide con su sello");
|
|
50
|
+
}
|
|
51
|
+
const journal = body;
|
|
52
|
+
const workspace = paths.workspaceDir();
|
|
53
|
+
if (journal.files.some(([file]) => !file.startsWith(`${workspace}/`)) ||
|
|
54
|
+
journal.transfers.some((transfer) => !transfer.path.startsWith(`${workspace}/docs/`))) {
|
|
55
|
+
throw new Error("el registro de renumerado apunta fuera del workspace");
|
|
56
|
+
}
|
|
57
|
+
const guards = [];
|
|
58
|
+
try {
|
|
59
|
+
for (const move of journal.moves) {
|
|
60
|
+
const old = join(paths.cwdSessionsDir(), move.from);
|
|
61
|
+
const next = join(paths.cwdSessionsDir(), move.to);
|
|
62
|
+
const folder = (await fs.exists(old)) ? old : next;
|
|
63
|
+
if (!(await fs.exists(folder)) || ((await fs.exists(old)) && (await fs.exists(next)))) {
|
|
64
|
+
throw new Error(`no se puede reconciliar la carpeta ${move.from} → ${move.to}`);
|
|
65
|
+
}
|
|
66
|
+
const lockPath = join(folder, ".flow-run.json.lock");
|
|
67
|
+
const lock = await acquireLock(lockPath, fs);
|
|
68
|
+
guards.push({
|
|
69
|
+
lock,
|
|
70
|
+
from: join(old, ".flow-run.json.lock"),
|
|
71
|
+
to: join(next, ".flow-run.json.lock"),
|
|
72
|
+
bytes: await fs.readText(lockPath),
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
const owners = new Map();
|
|
76
|
+
for (const transfer of journal.transfers) {
|
|
77
|
+
if (!(await fs.exists(transfer.path)))
|
|
78
|
+
throw new Error(`falta el marcador ${transfer.path}`);
|
|
79
|
+
const owner = reservationOwnerOf(await fs.readText(transfer.path));
|
|
80
|
+
if (owner !== transfer.from && owner !== transfer.to) {
|
|
81
|
+
throw new Error(`el marcador ${transfer.path} no pertenece a ninguno de los dos dueños`);
|
|
82
|
+
}
|
|
83
|
+
owners.set(transfer.transfer.id, owner);
|
|
84
|
+
}
|
|
85
|
+
const confirmed = await readClaimEvents(fs, paths, {
|
|
86
|
+
lockHeld: true,
|
|
87
|
+
skipRenumberRecovery: true,
|
|
88
|
+
});
|
|
89
|
+
if (confirmed.unreadable > 0)
|
|
90
|
+
throw new Error("claims.jsonl ilegible durante la recuperación");
|
|
91
|
+
for (const transfer of journal.transfers) {
|
|
92
|
+
if (owners.get(transfer.transfer.id) !== transfer.from)
|
|
93
|
+
continue;
|
|
94
|
+
if (openOwnerOfSlot(confirmed.events, transfer.claim)?.owner !== transfer.to)
|
|
95
|
+
continue;
|
|
96
|
+
const reverse = {
|
|
97
|
+
...transfer.transfer,
|
|
98
|
+
id: randomUUID(),
|
|
99
|
+
from: transfer.to,
|
|
100
|
+
to: transfer.from,
|
|
101
|
+
};
|
|
102
|
+
const claim = { ...transfer.claim, owner: transfer.to };
|
|
103
|
+
await appendClaimEvent(fs, paths, {
|
|
104
|
+
at: new Date().toISOString(),
|
|
105
|
+
event: "transfer-intent",
|
|
106
|
+
claim,
|
|
107
|
+
transfer: reverse,
|
|
108
|
+
});
|
|
109
|
+
await appendClaimEvent(fs, paths, {
|
|
110
|
+
at: new Date().toISOString(),
|
|
111
|
+
event: "transfer-confirmed",
|
|
112
|
+
claim,
|
|
113
|
+
transfer: reverse,
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
const forward = journal.moves.filter((move) => journal.transfers.some((transfer) => transfer.from === move.from && owners.get(transfer.transfer.id) === move.to));
|
|
117
|
+
// A transaction with no changed marker is cancelled. Any new owner makes
|
|
118
|
+
// its session's remaining claims move forward, so none is left ownerless.
|
|
119
|
+
for (const move of [...journal.moves].reverse()) {
|
|
120
|
+
const old = join(paths.cwdSessionsDir(), move.from);
|
|
121
|
+
const next = join(paths.cwdSessionsDir(), move.to);
|
|
122
|
+
if (!(await fs.exists(old)) && (await fs.exists(next)))
|
|
123
|
+
await fs.rename(next, old);
|
|
124
|
+
const newCounter = paths.cwdFlowAttemptsFile(move.to);
|
|
125
|
+
if (await fs.exists(newCounter))
|
|
126
|
+
await fs.rename(newCounter, paths.cwdFlowAttemptsFile(move.from));
|
|
127
|
+
}
|
|
128
|
+
const markerPaths = new Set(journal.transfers.map((transfer) => transfer.path));
|
|
129
|
+
for (const [file, text] of journal.files) {
|
|
130
|
+
if (markerPaths.has(file))
|
|
131
|
+
continue;
|
|
132
|
+
if (text === null) {
|
|
133
|
+
if (await fs.exists(file))
|
|
134
|
+
await fs.remove(file);
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
await fs.writeText(file, text);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
for (const move of forward) {
|
|
141
|
+
for (const transfer of journal.transfers.filter((item) => item.from === move.from)) {
|
|
142
|
+
if (owners.get(transfer.transfer.id) === move.to)
|
|
143
|
+
continue;
|
|
144
|
+
const next = { ...transfer.transfer, id: randomUUID() };
|
|
145
|
+
await appendClaimEvent(fs, paths, {
|
|
146
|
+
at: new Date().toISOString(),
|
|
147
|
+
event: "transfer-intent",
|
|
148
|
+
claim: transfer.claim,
|
|
149
|
+
transfer: next,
|
|
150
|
+
});
|
|
151
|
+
await fs.writeText(transfer.path, transfer.before.replace(/<!--\s*aw:reserva\s+\S+\s*-->/, `<!-- aw:reserva ${move.to} -->`));
|
|
152
|
+
await appendClaimEvent(fs, paths, {
|
|
153
|
+
at: new Date().toISOString(),
|
|
154
|
+
event: "transfer-confirmed",
|
|
155
|
+
claim: transfer.claim,
|
|
156
|
+
transfer: next,
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
await moveSessionIdentityLocked(fs, paths, move);
|
|
160
|
+
}
|
|
161
|
+
// If no marker moved forward, restore every original marker. An intent
|
|
162
|
+
// still open has already been cancelled against that marker above.
|
|
163
|
+
if (forward.length === 0) {
|
|
164
|
+
for (const transfer of journal.transfers)
|
|
165
|
+
await fs.writeText(transfer.path, transfer.before);
|
|
166
|
+
}
|
|
167
|
+
await fs.remove(path);
|
|
168
|
+
return true;
|
|
169
|
+
}
|
|
170
|
+
finally {
|
|
171
|
+
for (const guard of guards.reverse()) {
|
|
172
|
+
for (const lockPath of [guard.from, guard.to]) {
|
|
173
|
+
if ((await fs.exists(lockPath)) && (await fs.readText(lockPath)) === guard.bytes)
|
|
174
|
+
await fs.remove(lockPath);
|
|
175
|
+
}
|
|
176
|
+
await guard.lock.release();
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
if (lockHeld)
|
|
181
|
+
return recover();
|
|
182
|
+
const result = await withCwdLock(fs, paths, recover, { waitMs: 2000 });
|
|
183
|
+
if (typeof result === "object" && "error" in result)
|
|
184
|
+
throw new Error(result.error);
|
|
185
|
+
return result;
|
|
186
|
+
}
|
|
187
|
+
/** Apply only the previewed local identity moves under the shared workspace lock. */
|
|
188
|
+
export async function applyRenumber(fs, paths, git) {
|
|
189
|
+
return withCwdLock(fs, paths, async () => {
|
|
190
|
+
await recoverRenumberJournal(fs, paths, true);
|
|
191
|
+
const plan = await planRenumber(fs, paths, git);
|
|
192
|
+
if (plan.blocked.length > 0)
|
|
193
|
+
return { moved: [], blocked: plan.blocked };
|
|
194
|
+
const guards = [];
|
|
195
|
+
try {
|
|
196
|
+
// Hold EVERY affected run lock until the entire set succeeds or rolls
|
|
197
|
+
// back. Releasing after one move lets that run advance before a later
|
|
198
|
+
// failure restores its older bytes.
|
|
199
|
+
for (const move of plan.moves) {
|
|
200
|
+
const original = join(paths.cwdSessionsDir(), move.from, ".flow-run.json.lock");
|
|
201
|
+
const lock = await acquireLock(original, fs);
|
|
202
|
+
guards.push({
|
|
203
|
+
lock,
|
|
204
|
+
original,
|
|
205
|
+
moved: join(paths.cwdSessionsDir(), move.to, ".flow-run.json.lock"),
|
|
206
|
+
bytes: await fs.readText(original),
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
const claims = await readClaimEvents(fs, paths, { lockHeld: true });
|
|
210
|
+
if (claims.unreadable > 0)
|
|
211
|
+
throw new Error("claims.jsonl ilegible: no se renumeran reservas sin verificar su propietario");
|
|
212
|
+
const scanned = await scanSlots(fs, paths, true);
|
|
213
|
+
if (scanned.error)
|
|
214
|
+
throw new Error(scanned.error);
|
|
215
|
+
const transfers = [];
|
|
216
|
+
for (const move of plan.moves) {
|
|
217
|
+
const owned = new Map();
|
|
218
|
+
for (const claim of openClaimsOf(claims.events, move.from)) {
|
|
219
|
+
owned.set(`${claim.category}/${claim.correlative}-${claim.name}`, claim);
|
|
220
|
+
}
|
|
221
|
+
for (const slot of scanned.slots) {
|
|
222
|
+
if (slot.kind !== "reservation" || !slot.intact || slot.owner !== move.from)
|
|
223
|
+
continue;
|
|
224
|
+
const key = `${slot.category}/${slot.correlative}-${slot.name}`;
|
|
225
|
+
if (owned.has(key))
|
|
226
|
+
continue;
|
|
227
|
+
const claim = {
|
|
228
|
+
category: slot.category,
|
|
229
|
+
correlative: slot.correlative,
|
|
230
|
+
name: slot.name,
|
|
231
|
+
owner: move.from,
|
|
232
|
+
};
|
|
233
|
+
// next-number may have left its valid marker before its claimed
|
|
234
|
+
// append. Repair that birth gap before writing the transfer intent.
|
|
235
|
+
await appendClaimEvent(fs, paths, {
|
|
236
|
+
at: new Date().toISOString(),
|
|
237
|
+
event: "claimed",
|
|
238
|
+
claim,
|
|
239
|
+
cause: "marcador intacto sin fila claimed al renumerar",
|
|
240
|
+
});
|
|
241
|
+
owned.set(key, claim);
|
|
242
|
+
}
|
|
243
|
+
for (const claim of owned.values()) {
|
|
244
|
+
const claimed = join(paths.workspaceDir(), "docs", claim.category, `${claim.correlative}-${claim.name}`);
|
|
245
|
+
const marker = (await fs.exists(join(claimed, FOLDER_RESERVATION_MARKER)))
|
|
246
|
+
? join(claimed, FOLDER_RESERVATION_MARKER)
|
|
247
|
+
: claimed;
|
|
248
|
+
if (!(await fs.exists(marker)))
|
|
249
|
+
continue;
|
|
250
|
+
const before = await fs.readText(marker);
|
|
251
|
+
if (reservationOwnerOf(before) !== move.from)
|
|
252
|
+
continue;
|
|
253
|
+
transfers.push({
|
|
254
|
+
path: marker,
|
|
255
|
+
before,
|
|
256
|
+
from: move.from,
|
|
257
|
+
to: move.to,
|
|
258
|
+
claim,
|
|
259
|
+
transfer: {
|
|
260
|
+
id: randomUUID(),
|
|
261
|
+
marker: relative(paths.workspaceDir(), marker),
|
|
262
|
+
number: claim.correlative,
|
|
263
|
+
from: move.from,
|
|
264
|
+
to: move.to,
|
|
265
|
+
},
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
const shared = [
|
|
270
|
+
paths.cwdHistoryFile(),
|
|
271
|
+
join(dirname(paths.cwdHistoryFile()), "HISTORY.legacy.md"),
|
|
272
|
+
paths.cwdSessionBindingsFile(),
|
|
273
|
+
docBranchLedgerPath(paths),
|
|
274
|
+
];
|
|
275
|
+
const files = [
|
|
276
|
+
...shared,
|
|
277
|
+
...plan.moves.flatMap((move) => [
|
|
278
|
+
join(paths.cwdSessionsDir(), move.from, ".custody.json"),
|
|
279
|
+
join(paths.cwdSessionsDir(), move.from, ".flow-run.json"),
|
|
280
|
+
paths.cwdFlowAttemptsFile(move.from),
|
|
281
|
+
]),
|
|
282
|
+
...transfers.map((transfer) => transfer.path),
|
|
283
|
+
];
|
|
284
|
+
const before = new Map();
|
|
285
|
+
for (const path of files)
|
|
286
|
+
before.set(path, (await fs.exists(path)) ? await fs.readText(path) : null);
|
|
287
|
+
const journalBody = {
|
|
288
|
+
version: 1,
|
|
289
|
+
moves: plan.moves,
|
|
290
|
+
files: [...before],
|
|
291
|
+
transfers,
|
|
292
|
+
};
|
|
293
|
+
const journal = { ...journalBody, digest: semanticDigest(journalBody) };
|
|
294
|
+
await fs.writeText(renumberJournalPath(paths), `${JSON.stringify(journal)}\n`);
|
|
295
|
+
const completed = [];
|
|
296
|
+
try {
|
|
297
|
+
for (const transfer of transfers) {
|
|
298
|
+
await appendClaimEvent(fs, paths, {
|
|
299
|
+
at: new Date().toISOString(),
|
|
300
|
+
event: "transfer-intent",
|
|
301
|
+
claim: transfer.claim,
|
|
302
|
+
transfer: transfer.transfer,
|
|
303
|
+
});
|
|
304
|
+
const rewritten = transfer.before.replace(/<!--\s*aw:reserva\s+\S+\s*-->/, `<!-- aw:reserva ${transfer.to} -->`);
|
|
305
|
+
if (reservationOwnerOf(rewritten) !== transfer.to) {
|
|
306
|
+
throw new Error(`no se pudo transferir la reserva ${transfer.path} a ${transfer.to}`);
|
|
307
|
+
}
|
|
308
|
+
await fs.writeText(transfer.path, rewritten);
|
|
309
|
+
await appendClaimEvent(fs, paths, {
|
|
310
|
+
at: new Date().toISOString(),
|
|
311
|
+
event: "transfer-confirmed",
|
|
312
|
+
claim: transfer.claim,
|
|
313
|
+
transfer: transfer.transfer,
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
for (const move of plan.moves) {
|
|
317
|
+
await moveSessionIdentityLocked(fs, paths, move);
|
|
318
|
+
completed.push(move);
|
|
319
|
+
}
|
|
320
|
+
await fs.remove(renumberJournalPath(paths));
|
|
321
|
+
}
|
|
322
|
+
catch (error) {
|
|
323
|
+
const recordedBefore = await readClaimEventsRaw(fs, paths);
|
|
324
|
+
const reversals = new Map();
|
|
325
|
+
for (const transfer of transfers) {
|
|
326
|
+
if (!recordedBefore.events.some((item) => item.transfer?.id === transfer.transfer.id && item.event === "transfer-confirmed"))
|
|
327
|
+
continue;
|
|
328
|
+
const reverse = {
|
|
329
|
+
...transfer.transfer,
|
|
330
|
+
id: randomUUID(),
|
|
331
|
+
from: transfer.to,
|
|
332
|
+
to: transfer.from,
|
|
333
|
+
};
|
|
334
|
+
const claim = { ...transfer.claim, owner: transfer.to };
|
|
335
|
+
await appendClaimEvent(fs, paths, {
|
|
336
|
+
at: new Date().toISOString(),
|
|
337
|
+
event: "transfer-intent",
|
|
338
|
+
claim,
|
|
339
|
+
transfer: reverse,
|
|
340
|
+
});
|
|
341
|
+
reversals.set(transfer.transfer.id, { transfer: reverse, claim });
|
|
342
|
+
}
|
|
343
|
+
for (const move of completed.reverse()) {
|
|
344
|
+
await fs.rename(join(paths.cwdSessionsDir(), move.to), join(paths.cwdSessionsDir(), move.from));
|
|
345
|
+
const newAttempts = paths.cwdFlowAttemptsFile(move.to);
|
|
346
|
+
if (await fs.exists(newAttempts))
|
|
347
|
+
await fs.rename(newAttempts, paths.cwdFlowAttemptsFile(move.from));
|
|
348
|
+
}
|
|
349
|
+
for (const [path, text] of before) {
|
|
350
|
+
if (text === null) {
|
|
351
|
+
if (await fs.exists(path))
|
|
352
|
+
await fs.remove(path);
|
|
353
|
+
}
|
|
354
|
+
else {
|
|
355
|
+
await fs.writeText(path, text);
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
const recorded = await readClaimEventsRaw(fs, paths);
|
|
359
|
+
for (const transfer of transfers) {
|
|
360
|
+
const matching = recorded.events.filter((item) => item.transfer?.id === transfer.transfer.id);
|
|
361
|
+
if (matching.some((item) => item.event === "transfer-confirmed")) {
|
|
362
|
+
const reversal = reversals.get(transfer.transfer.id);
|
|
363
|
+
if (!reversal)
|
|
364
|
+
throw new Error(`falta intención de reversión para ${transfer.transfer.id}`);
|
|
365
|
+
await appendClaimEvent(fs, paths, {
|
|
366
|
+
at: new Date().toISOString(),
|
|
367
|
+
event: "transfer-confirmed",
|
|
368
|
+
claim: reversal.claim,
|
|
369
|
+
transfer: reversal.transfer,
|
|
370
|
+
});
|
|
371
|
+
}
|
|
372
|
+
else if (matching.some((item) => item.event === "transfer-intent")) {
|
|
373
|
+
await appendClaimEvent(fs, paths, {
|
|
374
|
+
at: new Date().toISOString(),
|
|
375
|
+
event: "transfer-cancelled",
|
|
376
|
+
claim: transfer.claim,
|
|
377
|
+
transfer: transfer.transfer,
|
|
378
|
+
});
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
await fs.remove(renumberJournalPath(paths));
|
|
382
|
+
throw error;
|
|
383
|
+
}
|
|
384
|
+
return { moved: plan.moves, blocked: [] };
|
|
385
|
+
}
|
|
386
|
+
finally {
|
|
387
|
+
for (const guard of guards.reverse()) {
|
|
388
|
+
if ((await fs.exists(guard.moved)) && (await fs.readText(guard.moved)) === guard.bytes)
|
|
389
|
+
await fs.remove(guard.moved);
|
|
390
|
+
await guard.lock.release();
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
});
|
|
394
|
+
}
|
|
395
|
+
async function moveSessionIdentityLocked(fs, paths, move) {
|
|
396
|
+
const oldPath = join(paths.cwdSessionsDir(), move.from);
|
|
397
|
+
const newPath = join(paths.cwdSessionsDir(), move.to);
|
|
398
|
+
if (await fs.exists(newPath))
|
|
399
|
+
throw new Error(`ya existe ${newPath}`);
|
|
400
|
+
const custody = await readCustody(fs, oldPath);
|
|
401
|
+
if (custody.status === "unreadable")
|
|
402
|
+
throw new Error(custody.reason);
|
|
403
|
+
const run = await readRun(fs, locateRun(paths, move.from));
|
|
404
|
+
if (!run.ok && run.failure.code !== "FLOW_RUN_ABSENT")
|
|
405
|
+
throw new Error(run.failure.message);
|
|
406
|
+
const ledger = docBranchLedgerPath(paths);
|
|
407
|
+
const history = paths.cwdHistoryFile();
|
|
408
|
+
const oldHistory = (await fs.exists(history)) ? await fs.readText(history) : null;
|
|
409
|
+
const oldLedger = (await fs.exists(ledger)) ? await fs.readText(ledger) : null;
|
|
410
|
+
const oldBindings = paths.cwdSessionBindingsFile();
|
|
411
|
+
const bindingBytes = (await fs.exists(oldBindings)) ? await fs.readText(oldBindings) : null;
|
|
412
|
+
const oldAttempts = paths.cwdFlowAttemptsFile(move.from);
|
|
413
|
+
const newAttempts = paths.cwdFlowAttemptsFile(move.to);
|
|
414
|
+
if (await fs.exists(newAttempts))
|
|
415
|
+
throw new Error(`ya existe el contador ${newAttempts}`);
|
|
416
|
+
const oldCounterText = (await fs.exists(oldAttempts)) ? await fs.readText(oldAttempts) : null;
|
|
417
|
+
let moved = false;
|
|
418
|
+
let attemptsMoved = false;
|
|
419
|
+
try {
|
|
420
|
+
await fs.rename(oldPath, newPath);
|
|
421
|
+
moved = true;
|
|
422
|
+
if (custody.status === "present") {
|
|
423
|
+
const previous = custody.custody;
|
|
424
|
+
await writeCustody(fs, newPath, sealCustody({
|
|
425
|
+
subject: { kind: "session", key: move.to },
|
|
426
|
+
subjectPath: newPath,
|
|
427
|
+
parents: previous.parents,
|
|
428
|
+
created: previous.created,
|
|
429
|
+
artifacts: previous.artifacts,
|
|
430
|
+
sources: previous.sources,
|
|
431
|
+
effects: previous.effects,
|
|
432
|
+
}));
|
|
433
|
+
}
|
|
434
|
+
if (run.ok) {
|
|
435
|
+
const { digest: _oldDigest, ...unsealed } = run.state;
|
|
436
|
+
await fs.writeText(join(newPath, ".flow-run.json"), serializeRunState(sealRunState({ ...unsealed, session: move.to })));
|
|
437
|
+
}
|
|
438
|
+
if (oldCounterText !== null) {
|
|
439
|
+
const originalCounter = JSON.parse(oldCounterText);
|
|
440
|
+
await fs.rename(oldAttempts, newAttempts);
|
|
441
|
+
attemptsMoved = true;
|
|
442
|
+
await fs.writeText(newAttempts, `${JSON.stringify({
|
|
443
|
+
...originalCounter,
|
|
444
|
+
session: move.to,
|
|
445
|
+
digest: semanticDigest({
|
|
446
|
+
version: originalCounter.version,
|
|
447
|
+
session: move.to,
|
|
448
|
+
attempts: originalCounter.attempts,
|
|
449
|
+
granted: originalCounter.granted,
|
|
450
|
+
}),
|
|
451
|
+
}, null, 2)}\n`);
|
|
452
|
+
}
|
|
453
|
+
await renameBindingsTo(fs, paths, move.from, move.to);
|
|
454
|
+
if (oldLedger !== null) {
|
|
455
|
+
const rewritten = oldLedger
|
|
456
|
+
.split("\n")
|
|
457
|
+
.map((line) => {
|
|
458
|
+
if (!line.trim())
|
|
459
|
+
return line;
|
|
460
|
+
const event = JSON.parse(line);
|
|
461
|
+
if (typeof event !== "object" || event === null)
|
|
462
|
+
return line;
|
|
463
|
+
const record = event;
|
|
464
|
+
if (record.doc?.kind !== "quick" || record.doc.key !== move.from)
|
|
465
|
+
return line;
|
|
466
|
+
return JSON.stringify({
|
|
467
|
+
...record,
|
|
468
|
+
doc: { ...record.doc, key: move.to },
|
|
469
|
+
by: record.by === move.from ? move.to : record.by,
|
|
470
|
+
});
|
|
471
|
+
})
|
|
472
|
+
.join("\n");
|
|
473
|
+
if (rewritten !== oldLedger)
|
|
474
|
+
await fs.writeText(ledger, rewritten);
|
|
475
|
+
}
|
|
476
|
+
const oldKey = move.from.replace(/^session(?=\d)/, "");
|
|
477
|
+
const row = oldHistory === null
|
|
478
|
+
? undefined
|
|
479
|
+
: readHistoryRows(oldHistory).find((entry) => entry.key === move.from || entry.key === oldKey);
|
|
480
|
+
const newCode = leadingCorrelative(move.to);
|
|
481
|
+
if (newCode === null)
|
|
482
|
+
throw new Error(`número inválido en ${move.to}`);
|
|
483
|
+
await upsertRow(fs, history, {
|
|
484
|
+
code: newCode,
|
|
485
|
+
sesionName: move.to,
|
|
486
|
+
date: row?.date ?? (custody.status === "present" ? custody.custody.created : "—"),
|
|
487
|
+
state: row?.state ?? ((await fs.exists(join(newPath, CLOSED_MARKER))) ? "closed" : "active"),
|
|
488
|
+
...(row ? { refs: row.refs } : {}),
|
|
489
|
+
});
|
|
490
|
+
if (row) {
|
|
491
|
+
// upsert normalized legacy and slim tables first. Match the parsed key,
|
|
492
|
+
// never the raw spacing of a row that came from another machine.
|
|
493
|
+
const normalized = await fs.readText(history);
|
|
494
|
+
await fs.writeText(history, normalized
|
|
495
|
+
.split("\n")
|
|
496
|
+
.filter((line) => {
|
|
497
|
+
if (!line.trim().startsWith("|"))
|
|
498
|
+
return true;
|
|
499
|
+
return line.trim().replace(/^\|/, "").split("|")[0]?.trim() !== row.key;
|
|
500
|
+
})
|
|
501
|
+
.join("\n"));
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
catch (error) {
|
|
505
|
+
if (oldHistory !== null)
|
|
506
|
+
await fs.writeText(history, oldHistory);
|
|
507
|
+
else if (await fs.exists(history))
|
|
508
|
+
await fs.remove(history);
|
|
509
|
+
if (oldLedger !== null)
|
|
510
|
+
await fs.writeText(ledger, oldLedger);
|
|
511
|
+
if (bindingBytes !== null)
|
|
512
|
+
await fs.writeText(oldBindings, bindingBytes);
|
|
513
|
+
else
|
|
514
|
+
await fs.remove(oldBindings);
|
|
515
|
+
if (attemptsMoved) {
|
|
516
|
+
await fs.rename(newAttempts, oldAttempts);
|
|
517
|
+
if (oldCounterText !== null)
|
|
518
|
+
await fs.writeText(oldAttempts, oldCounterText);
|
|
519
|
+
}
|
|
520
|
+
if (moved)
|
|
521
|
+
await fs.rename(newPath, oldPath);
|
|
522
|
+
if (custody.status === "present")
|
|
523
|
+
await writeCustody(fs, oldPath, custody.custody);
|
|
524
|
+
if (run.ok)
|
|
525
|
+
await fs.writeText(join(oldPath, ".flow-run.json"), serializeRunState(run.state));
|
|
526
|
+
throw error;
|
|
527
|
+
}
|
|
528
|
+
}
|
|
14
529
|
export async function applyWorkspaceMigration(fs, paths) {
|
|
15
530
|
return withCwdLock(fs, paths, async () => {
|
|
16
531
|
const plan = await planWorkspaceMigration(fs, paths);
|
|
@@ -19,8 +534,14 @@ export async function applyWorkspaceMigration(fs, paths) {
|
|
|
19
534
|
});
|
|
20
535
|
}
|
|
21
536
|
async function writePlan(fs, paths, plan) {
|
|
22
|
-
|
|
23
|
-
await fs.
|
|
537
|
+
if (plan.markers.length > 0) {
|
|
538
|
+
const published = await publishArtifacts(fs, plan.workspace, plan.markers.map((hub) => ({
|
|
539
|
+
path: relative(plan.workspace, hub.path),
|
|
540
|
+
content: hub.text,
|
|
541
|
+
overwrite: true,
|
|
542
|
+
})));
|
|
543
|
+
if (!published.ok)
|
|
544
|
+
throw new Error(published.failure.message);
|
|
24
545
|
}
|
|
25
546
|
for (const seed of plan.sentinels) {
|
|
26
547
|
// Empty, byte for byte what `session-close` writes: the sentinel says
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apply.js","sourceRoot":"","sources":["../../../src/application/workspace-migrate/apply.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,OAAO,EAGL,sBAAsB,EACtB,YAAY,GACb,MAAM,WAAW,CAAC;AA2BnB,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,EAAkB,EAClB,KAAmB;IAEnB,OAAO,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE;QACvC,MAAM,IAAI,GAAG,MAAM,sBAAsB,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACrD,MAAM,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QACjC,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,SAAS,CACtB,EAAkB,EAClB,KAAmB,EACnB,IAA4B;IAE5B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QAC/B,MAAM,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QAClC,sEAAsE;QACtE,4EAA4E;QAC5E,4EAA4E;QAC5E,4DAA4D;QAC5D,MAAM,EAAE,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAC7C,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QAC7B,2EAA2E;QAC3E,8CAA8C;QAC9C,MAAM,gBAAgB,CAAC,EAAE,EAAE,KAAK,EAAE;YAChC,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,UAAU,EAAE,IAAI,CAAC,IAAI;YACrB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,IAA4B;IAC7C,OAAO;QACL,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,eAAe,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC;QACpD,kBAAkB,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC;QACxF,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC;QAC3D,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC;QACjD,iBAAiB,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC;QAC3F,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;KACxC,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"apply.js","sourceRoot":"","sources":["../../../src/application/workspace-migrate/apply.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,8 +10,8 @@
|
|
|
10
10
|
* declaration the workspace ever made sits untouched a few lines above.
|
|
11
11
|
* Renaming the markers is what makes the rich block the one that answers.
|
|
12
12
|
*/
|
|
13
|
-
import { join } from "node:path";
|
|
14
|
-
import { parseProjectBlock, } from "../parsers/project-block.js";
|
|
13
|
+
import { dirname, join } from "node:path";
|
|
14
|
+
import { parseProjectBlock, resolveWorkspaceSourcePath, } from "../parsers/project-block.js";
|
|
15
15
|
/** The hub files, in the order `readWorkspaceBlock` consults them. */
|
|
16
16
|
const HUB_FILES = ["CLAUDE.md", "AGENTS.md"];
|
|
17
17
|
/**
|
|
@@ -47,7 +47,7 @@ export async function readHubFiles(fs, root) {
|
|
|
47
47
|
* Pure on purpose — the decision is a function of the bytes and of the running
|
|
48
48
|
* namespace, and nothing else. Reading the file is the caller's I/O.
|
|
49
49
|
*/
|
|
50
|
-
export function planHubMarkers(path, text, current) {
|
|
50
|
+
export function planHubMarkers(path, text, current, localSources = {}) {
|
|
51
51
|
const currentPrefix = prefixOf(current.start);
|
|
52
52
|
const prefixes = blockPrefixes(text);
|
|
53
53
|
const foreign = prefixes.filter((prefix) => prefix !== currentPrefix);
|
|
@@ -70,7 +70,7 @@ export function planHubMarkers(path, text, current) {
|
|
|
70
70
|
// above it — but "usually" is not a licence to delete, so what it declares is
|
|
71
71
|
// compared before it goes.
|
|
72
72
|
const duplicate = parseProjectBlock(text, current);
|
|
73
|
-
const extra = duplicate === null ? [] : extraDeclarations(duplicate, adopted);
|
|
73
|
+
const extra = duplicate === null ? [] : extraDeclarations(duplicate, adopted, dirname(path), localSources);
|
|
74
74
|
if (extra.length > 0) {
|
|
75
75
|
return refuse("duplicado_con_contenido", `el bloque ${currentPrefix} de ${path} declara lo que el bloque ${outdated} no tiene (${extra.join("; ")}): fusionalos a mano y reintentá`);
|
|
76
76
|
}
|
|
@@ -135,13 +135,16 @@ function dropBlock(text, markers) {
|
|
|
135
135
|
* timestamp the writer stamps on every write, not something a workspace
|
|
136
136
|
* declared, and the appended block always carries the fresher one.
|
|
137
137
|
*/
|
|
138
|
-
function extraDeclarations(candidate, adopted) {
|
|
138
|
+
function extraDeclarations(candidate, adopted, workspace, localSources) {
|
|
139
139
|
const extra = [];
|
|
140
140
|
if (isDeclared(candidate.proyecto) && candidate.proyecto !== adopted.proyecto) {
|
|
141
141
|
extra.push(`Proyecto: ${firstLine(candidate.proyecto)}`);
|
|
142
142
|
}
|
|
143
143
|
for (const fuente of candidate.fuentes) {
|
|
144
|
-
const
|
|
144
|
+
const resolvePath = (path, alias) => localSources[alias] ??
|
|
145
|
+
(path === null || path === "(local)" ? null : resolveWorkspaceSourcePath(workspace, path));
|
|
146
|
+
const same = adopted.fuentes.some((f) => f.alias === fuente.alias &&
|
|
147
|
+
resolvePath(f.path, f.alias) === resolvePath(fuente.path, fuente.alias));
|
|
145
148
|
if (!same)
|
|
146
149
|
extra.push(`Fuente: ${fuente.alias} → ${fuente.path}`);
|
|
147
150
|
}
|