@mutates/cli 2.1.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/README.md +105 -0
- package/bin/mutates.d.ts +1 -0
- package/bin/mutates.js +37 -0
- package/bin/mutates.js.map +1 -0
- package/package.json +46 -0
- package/src/client/format-snapshot.d.ts +13 -0
- package/src/client/format-snapshot.js +38 -0
- package/src/client/format-snapshot.js.map +1 -0
- package/src/client/output.d.ts +25 -0
- package/src/client/output.js +76 -0
- package/src/client/output.js.map +1 -0
- package/src/client/rpc-client-testing.d.ts +12 -0
- package/src/client/rpc-client-testing.js +21 -0
- package/src/client/rpc-client-testing.js.map +1 -0
- package/src/client/rpc-client.d.ts +35 -0
- package/src/client/rpc-client.js +172 -0
- package/src/client/rpc-client.js.map +1 -0
- package/src/commands/core/close.d.ts +28 -0
- package/src/commands/core/close.js +74 -0
- package/src/commands/core/close.js.map +1 -0
- package/src/commands/core/diff.d.ts +25 -0
- package/src/commands/core/diff.js +71 -0
- package/src/commands/core/diff.js.map +1 -0
- package/src/commands/core/find.d.ts +30 -0
- package/src/commands/core/find.js +80 -0
- package/src/commands/core/find.js.map +1 -0
- package/src/commands/core/list-files.d.ts +24 -0
- package/src/commands/core/list-files.js +62 -0
- package/src/commands/core/list-files.js.map +1 -0
- package/src/commands/core/open.d.ts +19 -0
- package/src/commands/core/open.js +49 -0
- package/src/commands/core/open.js.map +1 -0
- package/src/commands/core/reload.d.ts +26 -0
- package/src/commands/core/reload.js +64 -0
- package/src/commands/core/reload.js.map +1 -0
- package/src/commands/core/save.d.ts +29 -0
- package/src/commands/core/save.js +69 -0
- package/src/commands/core/save.js.map +1 -0
- package/src/commands/core/schema.d.ts +26 -0
- package/src/commands/core/schema.js +53 -0
- package/src/commands/core/schema.js.map +1 -0
- package/src/commands/core/sessions.d.ts +2 -0
- package/src/commands/core/sessions.js +79 -0
- package/src/commands/core/sessions.js.map +1 -0
- package/src/commands/core/skills.d.ts +2 -0
- package/src/commands/core/skills.js +72 -0
- package/src/commands/core/skills.js.map +1 -0
- package/src/commands/core/snapshot.d.ts +31 -0
- package/src/commands/core/snapshot.js +73 -0
- package/src/commands/core/snapshot.js.map +1 -0
- package/src/commands/generated/accessors/add.d.ts +28 -0
- package/src/commands/generated/accessors/add.js +70 -0
- package/src/commands/generated/accessors/add.js.map +1 -0
- package/src/commands/generated/accessors/edit.d.ts +28 -0
- package/src/commands/generated/accessors/edit.js +70 -0
- package/src/commands/generated/accessors/edit.js.map +1 -0
- package/src/commands/generated/accessors/get.d.ts +28 -0
- package/src/commands/generated/accessors/get.js +70 -0
- package/src/commands/generated/accessors/get.js.map +1 -0
- package/src/commands/generated/accessors/remove.d.ts +28 -0
- package/src/commands/generated/accessors/remove.js +70 -0
- package/src/commands/generated/accessors/remove.js.map +1 -0
- package/src/commands/generated/all-decorators/get.d.ts +27 -0
- package/src/commands/generated/all-decorators/get.js +70 -0
- package/src/commands/generated/all-decorators/get.js.map +1 -0
- package/src/commands/generated/class-accessors/get.d.ts +28 -0
- package/src/commands/generated/class-accessors/get.js +70 -0
- package/src/commands/generated/class-accessors/get.js.map +1 -0
- package/src/commands/generated/class-methods/get.d.ts +28 -0
- package/src/commands/generated/class-methods/get.js +70 -0
- package/src/commands/generated/class-methods/get.js.map +1 -0
- package/src/commands/generated/class-properties/add.d.ts +28 -0
- package/src/commands/generated/class-properties/add.js +70 -0
- package/src/commands/generated/class-properties/add.js.map +1 -0
- package/src/commands/generated/class-properties/edit.d.ts +28 -0
- package/src/commands/generated/class-properties/edit.js +70 -0
- package/src/commands/generated/class-properties/edit.js.map +1 -0
- package/src/commands/generated/class-properties/get.d.ts +27 -0
- package/src/commands/generated/class-properties/get.js +70 -0
- package/src/commands/generated/class-properties/get.js.map +1 -0
- package/src/commands/generated/class-properties/remove.d.ts +28 -0
- package/src/commands/generated/class-properties/remove.js +70 -0
- package/src/commands/generated/class-properties/remove.js.map +1 -0
- package/src/commands/generated/classes/add.d.ts +29 -0
- package/src/commands/generated/classes/add.js +70 -0
- package/src/commands/generated/classes/add.js.map +1 -0
- package/src/commands/generated/classes/edit.d.ts +28 -0
- package/src/commands/generated/classes/edit.js +70 -0
- package/src/commands/generated/classes/edit.js.map +1 -0
- package/src/commands/generated/classes/get.d.ts +27 -0
- package/src/commands/generated/classes/get.js +70 -0
- package/src/commands/generated/classes/get.js.map +1 -0
- package/src/commands/generated/classes/remove.d.ts +28 -0
- package/src/commands/generated/classes/remove.js +70 -0
- package/src/commands/generated/classes/remove.js.map +1 -0
- package/src/commands/generated/constructors/add.d.ts +28 -0
- package/src/commands/generated/constructors/add.js +70 -0
- package/src/commands/generated/constructors/add.js.map +1 -0
- package/src/commands/generated/constructors/edit.d.ts +28 -0
- package/src/commands/generated/constructors/edit.js +70 -0
- package/src/commands/generated/constructors/edit.js.map +1 -0
- package/src/commands/generated/constructors/get.d.ts +28 -0
- package/src/commands/generated/constructors/get.js +70 -0
- package/src/commands/generated/constructors/get.js.map +1 -0
- package/src/commands/generated/constructors/remove.d.ts +28 -0
- package/src/commands/generated/constructors/remove.js +70 -0
- package/src/commands/generated/constructors/remove.js.map +1 -0
- package/src/commands/generated/decorators/add.d.ts +28 -0
- package/src/commands/generated/decorators/add.js +70 -0
- package/src/commands/generated/decorators/add.js.map +1 -0
- package/src/commands/generated/decorators/edit.d.ts +28 -0
- package/src/commands/generated/decorators/edit.js +70 -0
- package/src/commands/generated/decorators/edit.js.map +1 -0
- package/src/commands/generated/decorators/get.d.ts +28 -0
- package/src/commands/generated/decorators/get.js +70 -0
- package/src/commands/generated/decorators/get.js.map +1 -0
- package/src/commands/generated/decorators/remove.d.ts +28 -0
- package/src/commands/generated/decorators/remove.js +70 -0
- package/src/commands/generated/decorators/remove.js.map +1 -0
- package/src/commands/generated/enums/add.d.ts +29 -0
- package/src/commands/generated/enums/add.js +70 -0
- package/src/commands/generated/enums/add.js.map +1 -0
- package/src/commands/generated/enums/edit.d.ts +28 -0
- package/src/commands/generated/enums/edit.js +70 -0
- package/src/commands/generated/enums/edit.js.map +1 -0
- package/src/commands/generated/enums/get.d.ts +27 -0
- package/src/commands/generated/enums/get.js +70 -0
- package/src/commands/generated/enums/get.js.map +1 -0
- package/src/commands/generated/enums/remove.d.ts +28 -0
- package/src/commands/generated/enums/remove.js +70 -0
- package/src/commands/generated/enums/remove.js.map +1 -0
- package/src/commands/generated/exports/add.d.ts +29 -0
- package/src/commands/generated/exports/add.js +70 -0
- package/src/commands/generated/exports/add.js.map +1 -0
- package/src/commands/generated/exports/edit.d.ts +28 -0
- package/src/commands/generated/exports/edit.js +70 -0
- package/src/commands/generated/exports/edit.js.map +1 -0
- package/src/commands/generated/exports/get.d.ts +27 -0
- package/src/commands/generated/exports/get.js +70 -0
- package/src/commands/generated/exports/get.js.map +1 -0
- package/src/commands/generated/exports/remove.d.ts +28 -0
- package/src/commands/generated/exports/remove.js +70 -0
- package/src/commands/generated/exports/remove.js.map +1 -0
- package/src/commands/generated/functions/add.d.ts +29 -0
- package/src/commands/generated/functions/add.js +70 -0
- package/src/commands/generated/functions/add.js.map +1 -0
- package/src/commands/generated/functions/edit.d.ts +28 -0
- package/src/commands/generated/functions/edit.js +70 -0
- package/src/commands/generated/functions/edit.js.map +1 -0
- package/src/commands/generated/functions/get.d.ts +27 -0
- package/src/commands/generated/functions/get.js +70 -0
- package/src/commands/generated/functions/get.js.map +1 -0
- package/src/commands/generated/functions/remove.d.ts +28 -0
- package/src/commands/generated/functions/remove.js +70 -0
- package/src/commands/generated/functions/remove.js.map +1 -0
- package/src/commands/generated/import-refs/get.d.ts +28 -0
- package/src/commands/generated/import-refs/get.js +70 -0
- package/src/commands/generated/import-refs/get.js.map +1 -0
- package/src/commands/generated/imports/add.d.ts +29 -0
- package/src/commands/generated/imports/add.js +70 -0
- package/src/commands/generated/imports/add.js.map +1 -0
- package/src/commands/generated/imports/edit.d.ts +28 -0
- package/src/commands/generated/imports/edit.js +70 -0
- package/src/commands/generated/imports/edit.js.map +1 -0
- package/src/commands/generated/imports/get.d.ts +27 -0
- package/src/commands/generated/imports/get.js +70 -0
- package/src/commands/generated/imports/get.js.map +1 -0
- package/src/commands/generated/imports/remove.d.ts +28 -0
- package/src/commands/generated/imports/remove.js +70 -0
- package/src/commands/generated/imports/remove.js.map +1 -0
- package/src/commands/generated/index.d.ts +2 -0
- package/src/commands/generated/index.js +106 -0
- package/src/commands/generated/index.js.map +1 -0
- package/src/commands/generated/interfaces/add.d.ts +29 -0
- package/src/commands/generated/interfaces/add.js +70 -0
- package/src/commands/generated/interfaces/add.js.map +1 -0
- package/src/commands/generated/interfaces/edit.d.ts +28 -0
- package/src/commands/generated/interfaces/edit.js +70 -0
- package/src/commands/generated/interfaces/edit.js.map +1 -0
- package/src/commands/generated/interfaces/get.d.ts +27 -0
- package/src/commands/generated/interfaces/get.js +70 -0
- package/src/commands/generated/interfaces/get.js.map +1 -0
- package/src/commands/generated/interfaces/remove.d.ts +28 -0
- package/src/commands/generated/interfaces/remove.js +70 -0
- package/src/commands/generated/interfaces/remove.js.map +1 -0
- package/src/commands/generated/methods/add.d.ts +28 -0
- package/src/commands/generated/methods/add.js +70 -0
- package/src/commands/generated/methods/add.js.map +1 -0
- package/src/commands/generated/methods/edit.d.ts +28 -0
- package/src/commands/generated/methods/edit.js +70 -0
- package/src/commands/generated/methods/edit.js.map +1 -0
- package/src/commands/generated/methods/get.d.ts +28 -0
- package/src/commands/generated/methods/get.js +70 -0
- package/src/commands/generated/methods/get.js.map +1 -0
- package/src/commands/generated/methods/remove.d.ts +28 -0
- package/src/commands/generated/methods/remove.js +70 -0
- package/src/commands/generated/methods/remove.js.map +1 -0
- package/src/commands/generated/named-imports/get.d.ts +28 -0
- package/src/commands/generated/named-imports/get.js +70 -0
- package/src/commands/generated/named-imports/get.js.map +1 -0
- package/src/commands/generated/object-accessors/get.d.ts +28 -0
- package/src/commands/generated/object-accessors/get.js +70 -0
- package/src/commands/generated/object-accessors/get.js.map +1 -0
- package/src/commands/generated/object-methods/get.d.ts +28 -0
- package/src/commands/generated/object-methods/get.js +70 -0
- package/src/commands/generated/object-methods/get.js.map +1 -0
- package/src/commands/generated/object-properties/edit.d.ts +28 -0
- package/src/commands/generated/object-properties/edit.js +70 -0
- package/src/commands/generated/object-properties/edit.js.map +1 -0
- package/src/commands/generated/object-properties/get.d.ts +27 -0
- package/src/commands/generated/object-properties/get.js +70 -0
- package/src/commands/generated/object-properties/get.js.map +1 -0
- package/src/commands/generated/object-properties/remove.d.ts +28 -0
- package/src/commands/generated/object-properties/remove.js +70 -0
- package/src/commands/generated/object-properties/remove.js.map +1 -0
- package/src/commands/generated/object-property/add.d.ts +28 -0
- package/src/commands/generated/object-property/add.js +70 -0
- package/src/commands/generated/object-property/add.js.map +1 -0
- package/src/commands/generated/params/add.d.ts +28 -0
- package/src/commands/generated/params/add.js +70 -0
- package/src/commands/generated/params/add.js.map +1 -0
- package/src/commands/generated/params/edit.d.ts +28 -0
- package/src/commands/generated/params/edit.js +70 -0
- package/src/commands/generated/params/edit.js.map +1 -0
- package/src/commands/generated/params/get.d.ts +28 -0
- package/src/commands/generated/params/get.js +70 -0
- package/src/commands/generated/params/get.js.map +1 -0
- package/src/commands/generated/params/remove.d.ts +28 -0
- package/src/commands/generated/params/remove.js +70 -0
- package/src/commands/generated/params/remove.js.map +1 -0
- package/src/commands/generated/source-file/get.d.ts +29 -0
- package/src/commands/generated/source-file/get.js +70 -0
- package/src/commands/generated/source-file/get.js.map +1 -0
- package/src/commands/generated/source-files/add.d.ts +29 -0
- package/src/commands/generated/source-files/add.js +70 -0
- package/src/commands/generated/source-files/add.js.map +1 -0
- package/src/commands/generated/source-files/get.d.ts +29 -0
- package/src/commands/generated/source-files/get.js +70 -0
- package/src/commands/generated/source-files/get.js.map +1 -0
- package/src/commands/generated/variables/add.d.ts +29 -0
- package/src/commands/generated/variables/add.js +70 -0
- package/src/commands/generated/variables/add.js.map +1 -0
- package/src/commands/generated/variables/edit.d.ts +28 -0
- package/src/commands/generated/variables/edit.js +70 -0
- package/src/commands/generated/variables/edit.js.map +1 -0
- package/src/commands/generated/variables/get.d.ts +27 -0
- package/src/commands/generated/variables/get.js +70 -0
- package/src/commands/generated/variables/get.js.map +1 -0
- package/src/commands/generated/variables/remove.d.ts +28 -0
- package/src/commands/generated/variables/remove.js +70 -0
- package/src/commands/generated/variables/remove.js.map +1 -0
- package/src/daemon/dispatcher.d.ts +34 -0
- package/src/daemon/dispatcher.js +122 -0
- package/src/daemon/dispatcher.js.map +1 -0
- package/src/daemon/entry.d.ts +39 -0
- package/src/daemon/entry.js +153 -0
- package/src/daemon/entry.js.map +1 -0
- package/src/daemon/handlers/diff.d.ts +7 -0
- package/src/daemon/handlers/diff.js +42 -0
- package/src/daemon/handlers/diff.js.map +1 -0
- package/src/daemon/handlers/find.d.ts +7 -0
- package/src/daemon/handlers/find.js +73 -0
- package/src/daemon/handlers/find.js.map +1 -0
- package/src/daemon/handlers/generated/_runtime.d.ts +23 -0
- package/src/daemon/handlers/generated/_runtime.js +87 -0
- package/src/daemon/handlers/generated/_runtime.js.map +1 -0
- package/src/daemon/handlers/generated/accessors/add.d.ts +2 -0
- package/src/daemon/handlers/generated/accessors/add.js +22 -0
- package/src/daemon/handlers/generated/accessors/add.js.map +1 -0
- package/src/daemon/handlers/generated/accessors/edit.d.ts +2 -0
- package/src/daemon/handlers/generated/accessors/edit.js +24 -0
- package/src/daemon/handlers/generated/accessors/edit.js.map +1 -0
- package/src/daemon/handlers/generated/accessors/get.d.ts +2 -0
- package/src/daemon/handlers/generated/accessors/get.js +22 -0
- package/src/daemon/handlers/generated/accessors/get.js.map +1 -0
- package/src/daemon/handlers/generated/accessors/remove.d.ts +2 -0
- package/src/daemon/handlers/generated/accessors/remove.js +22 -0
- package/src/daemon/handlers/generated/accessors/remove.js.map +1 -0
- package/src/daemon/handlers/generated/all-decorators/get.d.ts +2 -0
- package/src/daemon/handlers/generated/all-decorators/get.js +22 -0
- package/src/daemon/handlers/generated/all-decorators/get.js.map +1 -0
- package/src/daemon/handlers/generated/class-accessors/get.d.ts +2 -0
- package/src/daemon/handlers/generated/class-accessors/get.js +22 -0
- package/src/daemon/handlers/generated/class-accessors/get.js.map +1 -0
- package/src/daemon/handlers/generated/class-methods/get.d.ts +2 -0
- package/src/daemon/handlers/generated/class-methods/get.js +22 -0
- package/src/daemon/handlers/generated/class-methods/get.js.map +1 -0
- package/src/daemon/handlers/generated/class-properties/add.d.ts +2 -0
- package/src/daemon/handlers/generated/class-properties/add.js +22 -0
- package/src/daemon/handlers/generated/class-properties/add.js.map +1 -0
- package/src/daemon/handlers/generated/class-properties/edit.d.ts +2 -0
- package/src/daemon/handlers/generated/class-properties/edit.js +24 -0
- package/src/daemon/handlers/generated/class-properties/edit.js.map +1 -0
- package/src/daemon/handlers/generated/class-properties/get.d.ts +2 -0
- package/src/daemon/handlers/generated/class-properties/get.js +22 -0
- package/src/daemon/handlers/generated/class-properties/get.js.map +1 -0
- package/src/daemon/handlers/generated/class-properties/remove.d.ts +2 -0
- package/src/daemon/handlers/generated/class-properties/remove.js +22 -0
- package/src/daemon/handlers/generated/class-properties/remove.js.map +1 -0
- package/src/daemon/handlers/generated/classes/add.d.ts +2 -0
- package/src/daemon/handlers/generated/classes/add.js +24 -0
- package/src/daemon/handlers/generated/classes/add.js.map +1 -0
- package/src/daemon/handlers/generated/classes/edit.d.ts +2 -0
- package/src/daemon/handlers/generated/classes/edit.js +24 -0
- package/src/daemon/handlers/generated/classes/edit.js.map +1 -0
- package/src/daemon/handlers/generated/classes/get.d.ts +2 -0
- package/src/daemon/handlers/generated/classes/get.js +22 -0
- package/src/daemon/handlers/generated/classes/get.js.map +1 -0
- package/src/daemon/handlers/generated/classes/remove.d.ts +2 -0
- package/src/daemon/handlers/generated/classes/remove.js +22 -0
- package/src/daemon/handlers/generated/classes/remove.js.map +1 -0
- package/src/daemon/handlers/generated/constructors/add.d.ts +2 -0
- package/src/daemon/handlers/generated/constructors/add.js +22 -0
- package/src/daemon/handlers/generated/constructors/add.js.map +1 -0
- package/src/daemon/handlers/generated/constructors/edit.d.ts +2 -0
- package/src/daemon/handlers/generated/constructors/edit.js +24 -0
- package/src/daemon/handlers/generated/constructors/edit.js.map +1 -0
- package/src/daemon/handlers/generated/constructors/get.d.ts +2 -0
- package/src/daemon/handlers/generated/constructors/get.js +22 -0
- package/src/daemon/handlers/generated/constructors/get.js.map +1 -0
- package/src/daemon/handlers/generated/constructors/remove.d.ts +2 -0
- package/src/daemon/handlers/generated/constructors/remove.js +22 -0
- package/src/daemon/handlers/generated/constructors/remove.js.map +1 -0
- package/src/daemon/handlers/generated/decorators/add.d.ts +2 -0
- package/src/daemon/handlers/generated/decorators/add.js +22 -0
- package/src/daemon/handlers/generated/decorators/add.js.map +1 -0
- package/src/daemon/handlers/generated/decorators/edit.d.ts +2 -0
- package/src/daemon/handlers/generated/decorators/edit.js +24 -0
- package/src/daemon/handlers/generated/decorators/edit.js.map +1 -0
- package/src/daemon/handlers/generated/decorators/get.d.ts +2 -0
- package/src/daemon/handlers/generated/decorators/get.js +22 -0
- package/src/daemon/handlers/generated/decorators/get.js.map +1 -0
- package/src/daemon/handlers/generated/decorators/remove.d.ts +2 -0
- package/src/daemon/handlers/generated/decorators/remove.js +22 -0
- package/src/daemon/handlers/generated/decorators/remove.js.map +1 -0
- package/src/daemon/handlers/generated/enums/add.d.ts +2 -0
- package/src/daemon/handlers/generated/enums/add.js +24 -0
- package/src/daemon/handlers/generated/enums/add.js.map +1 -0
- package/src/daemon/handlers/generated/enums/edit.d.ts +2 -0
- package/src/daemon/handlers/generated/enums/edit.js +24 -0
- package/src/daemon/handlers/generated/enums/edit.js.map +1 -0
- package/src/daemon/handlers/generated/enums/get.d.ts +2 -0
- package/src/daemon/handlers/generated/enums/get.js +22 -0
- package/src/daemon/handlers/generated/enums/get.js.map +1 -0
- package/src/daemon/handlers/generated/enums/remove.d.ts +2 -0
- package/src/daemon/handlers/generated/enums/remove.js +22 -0
- package/src/daemon/handlers/generated/enums/remove.js.map +1 -0
- package/src/daemon/handlers/generated/exports/add.d.ts +2 -0
- package/src/daemon/handlers/generated/exports/add.js +24 -0
- package/src/daemon/handlers/generated/exports/add.js.map +1 -0
- package/src/daemon/handlers/generated/exports/edit.d.ts +2 -0
- package/src/daemon/handlers/generated/exports/edit.js +24 -0
- package/src/daemon/handlers/generated/exports/edit.js.map +1 -0
- package/src/daemon/handlers/generated/exports/get.d.ts +2 -0
- package/src/daemon/handlers/generated/exports/get.js +22 -0
- package/src/daemon/handlers/generated/exports/get.js.map +1 -0
- package/src/daemon/handlers/generated/exports/remove.d.ts +2 -0
- package/src/daemon/handlers/generated/exports/remove.js +22 -0
- package/src/daemon/handlers/generated/exports/remove.js.map +1 -0
- package/src/daemon/handlers/generated/functions/add.d.ts +2 -0
- package/src/daemon/handlers/generated/functions/add.js +24 -0
- package/src/daemon/handlers/generated/functions/add.js.map +1 -0
- package/src/daemon/handlers/generated/functions/edit.d.ts +2 -0
- package/src/daemon/handlers/generated/functions/edit.js +24 -0
- package/src/daemon/handlers/generated/functions/edit.js.map +1 -0
- package/src/daemon/handlers/generated/functions/get.d.ts +2 -0
- package/src/daemon/handlers/generated/functions/get.js +22 -0
- package/src/daemon/handlers/generated/functions/get.js.map +1 -0
- package/src/daemon/handlers/generated/functions/remove.d.ts +2 -0
- package/src/daemon/handlers/generated/functions/remove.js +22 -0
- package/src/daemon/handlers/generated/functions/remove.js.map +1 -0
- package/src/daemon/handlers/generated/import-refs/get.d.ts +2 -0
- package/src/daemon/handlers/generated/import-refs/get.js +22 -0
- package/src/daemon/handlers/generated/import-refs/get.js.map +1 -0
- package/src/daemon/handlers/generated/imports/add.d.ts +2 -0
- package/src/daemon/handlers/generated/imports/add.js +24 -0
- package/src/daemon/handlers/generated/imports/add.js.map +1 -0
- package/src/daemon/handlers/generated/imports/edit.d.ts +2 -0
- package/src/daemon/handlers/generated/imports/edit.js +24 -0
- package/src/daemon/handlers/generated/imports/edit.js.map +1 -0
- package/src/daemon/handlers/generated/imports/get.d.ts +2 -0
- package/src/daemon/handlers/generated/imports/get.js +22 -0
- package/src/daemon/handlers/generated/imports/get.js.map +1 -0
- package/src/daemon/handlers/generated/imports/remove.d.ts +2 -0
- package/src/daemon/handlers/generated/imports/remove.js +22 -0
- package/src/daemon/handlers/generated/imports/remove.js.map +1 -0
- package/src/daemon/handlers/generated/index.d.ts +2 -0
- package/src/daemon/handlers/generated/index.js +138 -0
- package/src/daemon/handlers/generated/index.js.map +1 -0
- package/src/daemon/handlers/generated/interfaces/add.d.ts +2 -0
- package/src/daemon/handlers/generated/interfaces/add.js +24 -0
- package/src/daemon/handlers/generated/interfaces/add.js.map +1 -0
- package/src/daemon/handlers/generated/interfaces/edit.d.ts +2 -0
- package/src/daemon/handlers/generated/interfaces/edit.js +24 -0
- package/src/daemon/handlers/generated/interfaces/edit.js.map +1 -0
- package/src/daemon/handlers/generated/interfaces/get.d.ts +2 -0
- package/src/daemon/handlers/generated/interfaces/get.js +22 -0
- package/src/daemon/handlers/generated/interfaces/get.js.map +1 -0
- package/src/daemon/handlers/generated/interfaces/remove.d.ts +2 -0
- package/src/daemon/handlers/generated/interfaces/remove.js +22 -0
- package/src/daemon/handlers/generated/interfaces/remove.js.map +1 -0
- package/src/daemon/handlers/generated/methods/add.d.ts +2 -0
- package/src/daemon/handlers/generated/methods/add.js +22 -0
- package/src/daemon/handlers/generated/methods/add.js.map +1 -0
- package/src/daemon/handlers/generated/methods/edit.d.ts +2 -0
- package/src/daemon/handlers/generated/methods/edit.js +24 -0
- package/src/daemon/handlers/generated/methods/edit.js.map +1 -0
- package/src/daemon/handlers/generated/methods/get.d.ts +2 -0
- package/src/daemon/handlers/generated/methods/get.js +22 -0
- package/src/daemon/handlers/generated/methods/get.js.map +1 -0
- package/src/daemon/handlers/generated/methods/remove.d.ts +2 -0
- package/src/daemon/handlers/generated/methods/remove.js +22 -0
- package/src/daemon/handlers/generated/methods/remove.js.map +1 -0
- package/src/daemon/handlers/generated/named-imports/get.d.ts +2 -0
- package/src/daemon/handlers/generated/named-imports/get.js +22 -0
- package/src/daemon/handlers/generated/named-imports/get.js.map +1 -0
- package/src/daemon/handlers/generated/object-accessors/get.d.ts +2 -0
- package/src/daemon/handlers/generated/object-accessors/get.js +22 -0
- package/src/daemon/handlers/generated/object-accessors/get.js.map +1 -0
- package/src/daemon/handlers/generated/object-methods/get.d.ts +2 -0
- package/src/daemon/handlers/generated/object-methods/get.js +22 -0
- package/src/daemon/handlers/generated/object-methods/get.js.map +1 -0
- package/src/daemon/handlers/generated/object-properties/edit.d.ts +2 -0
- package/src/daemon/handlers/generated/object-properties/edit.js +24 -0
- package/src/daemon/handlers/generated/object-properties/edit.js.map +1 -0
- package/src/daemon/handlers/generated/object-properties/get.d.ts +2 -0
- package/src/daemon/handlers/generated/object-properties/get.js +22 -0
- package/src/daemon/handlers/generated/object-properties/get.js.map +1 -0
- package/src/daemon/handlers/generated/object-properties/remove.d.ts +2 -0
- package/src/daemon/handlers/generated/object-properties/remove.js +22 -0
- package/src/daemon/handlers/generated/object-properties/remove.js.map +1 -0
- package/src/daemon/handlers/generated/object-property/add.d.ts +2 -0
- package/src/daemon/handlers/generated/object-property/add.js +22 -0
- package/src/daemon/handlers/generated/object-property/add.js.map +1 -0
- package/src/daemon/handlers/generated/params/add.d.ts +2 -0
- package/src/daemon/handlers/generated/params/add.js +22 -0
- package/src/daemon/handlers/generated/params/add.js.map +1 -0
- package/src/daemon/handlers/generated/params/edit.d.ts +2 -0
- package/src/daemon/handlers/generated/params/edit.js +24 -0
- package/src/daemon/handlers/generated/params/edit.js.map +1 -0
- package/src/daemon/handlers/generated/params/get.d.ts +2 -0
- package/src/daemon/handlers/generated/params/get.js +22 -0
- package/src/daemon/handlers/generated/params/get.js.map +1 -0
- package/src/daemon/handlers/generated/params/remove.d.ts +2 -0
- package/src/daemon/handlers/generated/params/remove.js +22 -0
- package/src/daemon/handlers/generated/params/remove.js.map +1 -0
- package/src/daemon/handlers/generated/source-file/get.d.ts +2 -0
- package/src/daemon/handlers/generated/source-file/get.js +24 -0
- package/src/daemon/handlers/generated/source-file/get.js.map +1 -0
- package/src/daemon/handlers/generated/source-files/add.d.ts +2 -0
- package/src/daemon/handlers/generated/source-files/add.js +24 -0
- package/src/daemon/handlers/generated/source-files/add.js.map +1 -0
- package/src/daemon/handlers/generated/source-files/get.d.ts +2 -0
- package/src/daemon/handlers/generated/source-files/get.js +24 -0
- package/src/daemon/handlers/generated/source-files/get.js.map +1 -0
- package/src/daemon/handlers/generated/variables/add.d.ts +2 -0
- package/src/daemon/handlers/generated/variables/add.js +24 -0
- package/src/daemon/handlers/generated/variables/add.js.map +1 -0
- package/src/daemon/handlers/generated/variables/edit.d.ts +2 -0
- package/src/daemon/handlers/generated/variables/edit.js +24 -0
- package/src/daemon/handlers/generated/variables/edit.js.map +1 -0
- package/src/daemon/handlers/generated/variables/get.d.ts +2 -0
- package/src/daemon/handlers/generated/variables/get.js +22 -0
- package/src/daemon/handlers/generated/variables/get.js.map +1 -0
- package/src/daemon/handlers/generated/variables/remove.d.ts +2 -0
- package/src/daemon/handlers/generated/variables/remove.js +22 -0
- package/src/daemon/handlers/generated/variables/remove.js.map +1 -0
- package/src/daemon/handlers/list-files.d.ts +7 -0
- package/src/daemon/handlers/list-files.js +66 -0
- package/src/daemon/handlers/list-files.js.map +1 -0
- package/src/daemon/handlers/op.d.ts +14 -0
- package/src/daemon/handlers/op.js +71 -0
- package/src/daemon/handlers/op.js.map +1 -0
- package/src/daemon/handlers/reload.d.ts +10 -0
- package/src/daemon/handlers/reload.js +46 -0
- package/src/daemon/handlers/reload.js.map +1 -0
- package/src/daemon/handlers/save.d.ts +14 -0
- package/src/daemon/handlers/save.js +67 -0
- package/src/daemon/handlers/save.js.map +1 -0
- package/src/daemon/handlers/snapshot.d.ts +10 -0
- package/src/daemon/handlers/snapshot.js +35 -0
- package/src/daemon/handlers/snapshot.js.map +1 -0
- package/src/daemon/session-manager.d.ts +37 -0
- package/src/daemon/session-manager.js +70 -0
- package/src/daemon/session-manager.js.map +1 -0
- package/src/discovery/lockfile.d.ts +47 -0
- package/src/discovery/lockfile.js +181 -0
- package/src/discovery/lockfile.js.map +1 -0
- package/src/generated/op-schemas.d.ts +8 -0
- package/src/generated/op-schemas.js +3213 -0
- package/src/generated/op-schemas.js.map +1 -0
- package/src/generated/skills.d.ts +9 -0
- package/src/generated/skills.js +11 -0
- package/src/generated/skills.js.map +1 -0
- package/src/index.d.ts +1 -0
- package/src/index.js +3 -0
- package/src/index.js.map +1 -0
- package/src/proto/error-codes.d.ts +26 -0
- package/src/proto/error-codes.js +55 -0
- package/src/proto/error-codes.js.map +1 -0
- package/src/proto/jsonrpc.d.ts +57 -0
- package/src/proto/jsonrpc.js +87 -0
- package/src/proto/jsonrpc.js.map +1 -0
- package/src/session/file-stat-cache.d.ts +43 -0
- package/src/session/file-stat-cache.js +95 -0
- package/src/session/file-stat-cache.js.map +1 -0
- package/src/session/ref-table.d.ts +42 -0
- package/src/session/ref-table.js +98 -0
- package/src/session/ref-table.js.map +1 -0
- package/src/session/session.d.ts +51 -0
- package/src/session/session.js +109 -0
- package/src/session/session.js.map +1 -0
- package/src/session/snapshot.d.ts +26 -0
- package/src/session/snapshot.js +164 -0
- package/src/session/snapshot.js.map +1 -0
package/README.md
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# @mutates/cli
|
|
2
|
+
|
|
3
|
+
AST mutation CLI for AI agents. `mutates` is a thin client over
|
|
4
|
+
`@mutates/core`; a per-project daemon owns a single `ts-morph` `Project`,
|
|
5
|
+
mints opaque `@nN` node refs, applies structural edits in memory, and
|
|
6
|
+
saves with mtime+size conflict detection.
|
|
7
|
+
|
|
8
|
+
## Install
|
|
9
|
+
|
|
10
|
+
```sh
|
|
11
|
+
npm i -g @mutates/cli
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
This puts a `mutates` binary on your `PATH`. No project-local install is
|
|
15
|
+
required; the CLI operates against the current working directory by
|
|
16
|
+
default, or against an explicit project root via `--root <path>`.
|
|
17
|
+
|
|
18
|
+
## The loop: snapshot → act → save
|
|
19
|
+
|
|
20
|
+
Every interaction follows the same three steps. Snapshots mint refs;
|
|
21
|
+
acts (mutation ops) invalidate those refs; saving flushes to disk if no
|
|
22
|
+
on-disk file has changed since the daemon loaded it.
|
|
23
|
+
|
|
24
|
+
```sh
|
|
25
|
+
# 1. Snapshot a file to discover its top-level shape and mint refs.
|
|
26
|
+
mutates snapshot src/app.ts
|
|
27
|
+
|
|
28
|
+
# Output (text mode):
|
|
29
|
+
# @n1 ImportDeclaration from 'fastify'
|
|
30
|
+
# @n2 ClassDeclaration AppController [exported]
|
|
31
|
+
# @n3 FunctionDeclaration bootstrap [exported, async]
|
|
32
|
+
|
|
33
|
+
# 2. Act. Pass the structure payload as JSON.
|
|
34
|
+
mutates add-methods --target @n2 \
|
|
35
|
+
--json '{"name":"ping","returnType":"string","statements":["return \"pong\";"]}'
|
|
36
|
+
|
|
37
|
+
# 3. Inspect what changed.
|
|
38
|
+
mutates diff
|
|
39
|
+
|
|
40
|
+
# 4. Save (or `--dry-run` first to preview the write set).
|
|
41
|
+
mutates save
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Every command honours `--json` for machine-readable output. Errors land
|
|
45
|
+
on stderr as JSON `{ code, message, details }`; the exit code maps to
|
|
46
|
+
the error category (`STALE_REF` → 5, `STALE_FILE` → 6, etc.). See
|
|
47
|
+
`mutates schema` and `mutates skills get core` for the full surface.
|
|
48
|
+
|
|
49
|
+
### Sessions
|
|
50
|
+
|
|
51
|
+
A daemon spawns automatically on the first command for a given root and
|
|
52
|
+
shuts itself down after 10 minutes of idle (`MUTATES_IDLE_TIMEOUT=<ms>`
|
|
53
|
+
to override). Explicit lifecycle commands exist too:
|
|
54
|
+
|
|
55
|
+
```sh
|
|
56
|
+
mutates open # eager spawn
|
|
57
|
+
mutates sessions list # daemons for cwd
|
|
58
|
+
mutates sessions list --all # every live daemon on this host
|
|
59
|
+
mutates close --all # stop everything
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### Staleness
|
|
63
|
+
|
|
64
|
+
- `STALE_REF` — a ref was invalidated by a mutation; re-snapshot the
|
|
65
|
+
file and try again.
|
|
66
|
+
- `STALE_FILE` — a file on disk changed since the daemon loaded it; run
|
|
67
|
+
`mutates reload <file>` (which drops in-memory edits for that file)
|
|
68
|
+
or close the session and start over.
|
|
69
|
+
|
|
70
|
+
## Discovering ops
|
|
71
|
+
|
|
72
|
+
`mutates schema` returns the JSON Schema for every generated operation
|
|
73
|
+
— `add-classes`, `edit-methods`, `remove-decorators`, … — covering every
|
|
74
|
+
exported `add* / edit* / remove* / get*` function on `@mutates/core`.
|
|
75
|
+
|
|
76
|
+
```sh
|
|
77
|
+
mutates schema # full manifest, every op
|
|
78
|
+
mutates schema add-classes # one op's payload shape
|
|
79
|
+
mutates --help # tree of commands
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## Agent guide
|
|
83
|
+
|
|
84
|
+
`mutates skills get core` returns a single Markdown document that walks
|
|
85
|
+
an agent through the snapshot → act → save loop, common patterns, and
|
|
86
|
+
the full troubleshooting tree for `STALE_REF` / `STALE_FILE`. It is the
|
|
87
|
+
canonical starting point when wiring `mutates` into a new agent
|
|
88
|
+
runtime.
|
|
89
|
+
|
|
90
|
+
```sh
|
|
91
|
+
mutates skills list
|
|
92
|
+
mutates skills get core
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## Multi-session
|
|
96
|
+
|
|
97
|
+
Multiple project roots run independent daemons. Every command except
|
|
98
|
+
`open`, `close --all`, `sessions list`, and `skills *` accepts
|
|
99
|
+
`--session <id>` to target a specific session; the default is the
|
|
100
|
+
session bound to the project root resolved from `--root` / cwd
|
|
101
|
+
(Req 10.1, 10.2).
|
|
102
|
+
|
|
103
|
+
## License
|
|
104
|
+
|
|
105
|
+
Apache-2.0. See [LICENSE](../../LICENSE).
|
package/bin/mutates.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const main: import("citty").CommandDef<import("citty").ArgsDef>;
|
package/bin/mutates.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.main = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const citty_1 = require("citty");
|
|
6
|
+
const package_json_1 = tslib_1.__importDefault(require("../package.json"));
|
|
7
|
+
const open_1 = tslib_1.__importDefault(require("../src/commands/core/open"));
|
|
8
|
+
const generated_1 = require("../src/commands/generated");
|
|
9
|
+
exports.main = (0, citty_1.defineCommand)({
|
|
10
|
+
meta: {
|
|
11
|
+
name: 'mutates',
|
|
12
|
+
version: package_json_1.default.version,
|
|
13
|
+
description: 'AST mutation CLI for AI agents',
|
|
14
|
+
},
|
|
15
|
+
subCommands: {
|
|
16
|
+
open: open_1.default,
|
|
17
|
+
close: () => Promise.resolve().then(() => tslib_1.__importStar(require('../src/commands/core/close'))).then((m) => m.default),
|
|
18
|
+
sessions: () => Promise.resolve().then(() => tslib_1.__importStar(require('../src/commands/core/sessions'))).then((m) => m.default),
|
|
19
|
+
snapshot: () => Promise.resolve().then(() => tslib_1.__importStar(require('../src/commands/core/snapshot'))).then((m) => m.default),
|
|
20
|
+
find: () => Promise.resolve().then(() => tslib_1.__importStar(require('../src/commands/core/find'))).then((m) => m.default),
|
|
21
|
+
diff: () => Promise.resolve().then(() => tslib_1.__importStar(require('../src/commands/core/diff'))).then((m) => m.default),
|
|
22
|
+
save: () => Promise.resolve().then(() => tslib_1.__importStar(require('../src/commands/core/save'))).then((m) => m.default),
|
|
23
|
+
reload: () => Promise.resolve().then(() => tslib_1.__importStar(require('../src/commands/core/reload'))).then((m) => m.default),
|
|
24
|
+
'list-files': () => Promise.resolve().then(() => tslib_1.__importStar(require('../src/commands/core/list-files'))).then((m) => m.default),
|
|
25
|
+
schema: () => Promise.resolve().then(() => tslib_1.__importStar(require('../src/commands/core/schema'))).then((m) => m.default),
|
|
26
|
+
skills: () => Promise.resolve().then(() => tslib_1.__importStar(require('../src/commands/core/skills'))).then((m) => m.default),
|
|
27
|
+
...generated_1.GENERATED_COMMANDS,
|
|
28
|
+
},
|
|
29
|
+
run() {
|
|
30
|
+
// eslint-disable-next-line no-console
|
|
31
|
+
console.log('Run `mutates --help` to see available commands.');
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
if (require.main === module) {
|
|
35
|
+
(0, citty_1.runMain)(exports.main);
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=mutates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mutates.js","sourceRoot":"","sources":["../../../../packages/cli/bin/mutates.ts"],"names":[],"mappings":";;;;AAAA,iCAA+C;AAE/C,2EAAkC;AAClC,6EAA6C;AAC7C,yDAA+D;AAElD,QAAA,IAAI,GAAG,IAAA,qBAAa,EAAC;IAChC,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,sBAAG,CAAC,OAAO;QACpB,WAAW,EAAE,gCAAgC;KAC9C;IACD,WAAW,EAAE;QACX,IAAI,EAAJ,cAAI;QACJ,KAAK,EAAE,GAAG,EAAE,CAAC,0DAAO,4BAA4B,IAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QACxE,QAAQ,EAAE,GAAG,EAAE,CAAC,0DAAO,+BAA+B,IAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QAC9E,QAAQ,EAAE,GAAG,EAAE,CAAC,0DAAO,+BAA+B,IAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QAC9E,IAAI,EAAE,GAAG,EAAE,CAAC,0DAAO,2BAA2B,IAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QACtE,IAAI,EAAE,GAAG,EAAE,CAAC,0DAAO,2BAA2B,IAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QACtE,IAAI,EAAE,GAAG,EAAE,CAAC,0DAAO,2BAA2B,IAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QACtE,MAAM,EAAE,GAAG,EAAE,CAAC,0DAAO,6BAA6B,IAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QAC1E,YAAY,EAAE,GAAG,EAAE,CAAC,0DAAO,iCAAiC,IAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QACpF,MAAM,EAAE,GAAG,EAAE,CAAC,0DAAO,6BAA6B,IAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QAC1E,MAAM,EAAE,GAAG,EAAE,CAAC,0DAAO,6BAA6B,IAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QAC1E,GAAG,8BAAkB;KACtB;IACD,GAAG;QACD,sCAAsC;QACtC,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;IACjE,CAAC;CACF,CAAC,CAAC;AAEH,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC5B,IAAA,eAAO,EAAC,YAAI,CAAC,CAAC;AAChB,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@mutates/cli",
|
|
3
|
+
"version": "2.1.0",
|
|
4
|
+
"keywords": [
|
|
5
|
+
"ast",
|
|
6
|
+
"cli",
|
|
7
|
+
"typescript",
|
|
8
|
+
"mutations"
|
|
9
|
+
],
|
|
10
|
+
"homepage": "https://github.com/IKatsuba/mutates",
|
|
11
|
+
"repository": "https://github.com/IKatsuba/mutates",
|
|
12
|
+
"license": "Apache-2.0",
|
|
13
|
+
"contributors": [
|
|
14
|
+
"Igor Katsuba <igor@katsuba.dev>"
|
|
15
|
+
],
|
|
16
|
+
"type": "commonjs",
|
|
17
|
+
"exports": {
|
|
18
|
+
"./package.json": "./package.json",
|
|
19
|
+
".": {
|
|
20
|
+
"types": "./src/index.d.ts",
|
|
21
|
+
"default": "./src/index.js"
|
|
22
|
+
},
|
|
23
|
+
"./bin/mutates": "./bin/mutates.js",
|
|
24
|
+
"./daemon/entry": "./src/daemon/entry.js"
|
|
25
|
+
},
|
|
26
|
+
"main": "./src/index.js",
|
|
27
|
+
"types": "./src/index.d.ts",
|
|
28
|
+
"typings": "./src/index.d.ts",
|
|
29
|
+
"bin": {
|
|
30
|
+
"mutates": "./bin/mutates.js"
|
|
31
|
+
},
|
|
32
|
+
"dependencies": {
|
|
33
|
+
"@mutates/core": "2.1.0",
|
|
34
|
+
"ajv": "^8.17.1",
|
|
35
|
+
"citty": "^0.1.6",
|
|
36
|
+
"diff": "^4.0.2",
|
|
37
|
+
"tslib": "^2.3.0",
|
|
38
|
+
"xxhash-wasm": "^1.1.0"
|
|
39
|
+
},
|
|
40
|
+
"publishConfig": {
|
|
41
|
+
"access": "public"
|
|
42
|
+
},
|
|
43
|
+
"authors": [
|
|
44
|
+
"Igor Katsuba <igor@katsuba.dev>"
|
|
45
|
+
]
|
|
46
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { SnapshotResult } from '../session/snapshot';
|
|
2
|
+
/**
|
|
3
|
+
* Render a {@link SnapshotResult} as the human-readable text shown in
|
|
4
|
+
* design.md (see the "Snapshot rendering" example).
|
|
5
|
+
*
|
|
6
|
+
* Example output:
|
|
7
|
+
*
|
|
8
|
+
* File: src/app.ts
|
|
9
|
+
* @n1 [import] from "rxjs"
|
|
10
|
+
* @n2 [class] AppService exported
|
|
11
|
+
* @n3 [function] helper exported
|
|
12
|
+
*/
|
|
13
|
+
export declare function formatSnapshot(snapshot: SnapshotResult): string;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.formatSnapshot = formatSnapshot;
|
|
4
|
+
/**
|
|
5
|
+
* Render a {@link SnapshotResult} as the human-readable text shown in
|
|
6
|
+
* design.md (see the "Snapshot rendering" example).
|
|
7
|
+
*
|
|
8
|
+
* Example output:
|
|
9
|
+
*
|
|
10
|
+
* File: src/app.ts
|
|
11
|
+
* @n1 [import] from "rxjs"
|
|
12
|
+
* @n2 [class] AppService exported
|
|
13
|
+
* @n3 [function] helper exported
|
|
14
|
+
*/
|
|
15
|
+
function formatSnapshot(snapshot) {
|
|
16
|
+
const lines = [`File: ${snapshot.file}`];
|
|
17
|
+
for (const entry of snapshot.entries) {
|
|
18
|
+
lines.push(formatEntry(entry));
|
|
19
|
+
}
|
|
20
|
+
return lines.join('\n') + '\n';
|
|
21
|
+
}
|
|
22
|
+
function formatEntry(entry) {
|
|
23
|
+
const parts = [`${entry.ref} [${entry.kind}]`];
|
|
24
|
+
if (entry.kind === 'import' && entry.name) {
|
|
25
|
+
parts.push(`from ${JSON.stringify(entry.name)}`);
|
|
26
|
+
}
|
|
27
|
+
else if (entry.name) {
|
|
28
|
+
parts.push(entry.name);
|
|
29
|
+
}
|
|
30
|
+
if (entry.modifiers && entry.modifiers.length > 0) {
|
|
31
|
+
parts.push(entry.modifiers.join(' '));
|
|
32
|
+
}
|
|
33
|
+
if (entry.children !== undefined && entry.children > 0) {
|
|
34
|
+
parts.push(`(${entry.children} children)`);
|
|
35
|
+
}
|
|
36
|
+
return parts.join(' ');
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=format-snapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-snapshot.js","sourceRoot":"","sources":["../../../../../packages/cli/src/client/format-snapshot.ts"],"names":[],"mappings":";;AAaA,wCAMC;AAjBD;;;;;;;;;;GAUG;AACH,SAAgB,cAAc,CAAC,QAAwB;IACrD,MAAM,KAAK,GAAa,CAAC,SAAS,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACnD,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AACjC,CAAC;AAED,SAAS,WAAW,CAAC,KAAoB;IACvC,MAAM,KAAK,GAAa,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;IACzD,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QAC1C,KAAK,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnD,CAAC;SAAM,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IACD,IAAI,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACxC,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;QACvD,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,QAAQ,YAAY,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { RpcError } from '../proto/jsonrpc';
|
|
2
|
+
export interface ErrorPayload {
|
|
3
|
+
code: string;
|
|
4
|
+
message: string;
|
|
5
|
+
details?: unknown;
|
|
6
|
+
}
|
|
7
|
+
/** Convert an `RpcError` into the surface payload required by Req 8.3. */
|
|
8
|
+
export declare function errorPayload(err: RpcError): ErrorPayload;
|
|
9
|
+
/** Map an error's symbolic name to its CLI exit code. */
|
|
10
|
+
export declare function exitCodeFor(err: RpcError): number;
|
|
11
|
+
/**
|
|
12
|
+
* Render an error to stderr as JSON (one line, machine-parseable). The
|
|
13
|
+
* caller is responsible for `process.exit(exitCodeFor(err))` afterwards.
|
|
14
|
+
*
|
|
15
|
+
* Non-`RpcError` throws are wrapped as `INTERNAL_ERROR` so the CLI
|
|
16
|
+
* always emits the documented shape.
|
|
17
|
+
*/
|
|
18
|
+
export declare function renderError(err: unknown, stream?: NodeJS.WritableStream): void;
|
|
19
|
+
/**
|
|
20
|
+
* Render a result to stdout. `text` format uses a human-friendly
|
|
21
|
+
* stringification (`String(result)` for primitives, `JSON.stringify`
|
|
22
|
+
* with indent for objects); `json` always uses single-line JSON for
|
|
23
|
+
* pipe-friendliness.
|
|
24
|
+
*/
|
|
25
|
+
export declare function renderResult(result: unknown, format?: 'text' | 'json', stream?: NodeJS.WritableStream): void;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.errorPayload = errorPayload;
|
|
4
|
+
exports.exitCodeFor = exitCodeFor;
|
|
5
|
+
exports.renderError = renderError;
|
|
6
|
+
exports.renderResult = renderResult;
|
|
7
|
+
const error_codes_1 = require("../proto/error-codes");
|
|
8
|
+
const jsonrpc_1 = require("../proto/jsonrpc");
|
|
9
|
+
/**
|
|
10
|
+
* CLI exit codes per design.md §Error Handling. Keep in sync with the
|
|
11
|
+
* symbolic-name surface; `INTERNAL_ERROR` defaults to 1 like a generic
|
|
12
|
+
* unhandled failure.
|
|
13
|
+
*/
|
|
14
|
+
const EXIT_CODE_BY_SYMBOLIC = {
|
|
15
|
+
INTERNAL_ERROR: 1,
|
|
16
|
+
INVALID_INPUT: 2,
|
|
17
|
+
NOT_FOUND: 3,
|
|
18
|
+
SESSION_NOT_FOUND: 4,
|
|
19
|
+
STALE_REF: 5,
|
|
20
|
+
STALE_FILE: 6,
|
|
21
|
+
IO_ERROR: 7,
|
|
22
|
+
};
|
|
23
|
+
/** Convert an `RpcError` into the surface payload required by Req 8.3. */
|
|
24
|
+
function errorPayload(err) {
|
|
25
|
+
const payload = {
|
|
26
|
+
code: (0, error_codes_1.toSymbolic)(err.code),
|
|
27
|
+
message: err.message,
|
|
28
|
+
};
|
|
29
|
+
if (err.data !== undefined)
|
|
30
|
+
payload.details = err.data;
|
|
31
|
+
return payload;
|
|
32
|
+
}
|
|
33
|
+
/** Map an error's symbolic name to its CLI exit code. */
|
|
34
|
+
function exitCodeFor(err) {
|
|
35
|
+
const symbolic = (0, error_codes_1.toSymbolic)(err.code);
|
|
36
|
+
return EXIT_CODE_BY_SYMBOLIC[symbolic] ?? 1;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Render an error to stderr as JSON (one line, machine-parseable). The
|
|
40
|
+
* caller is responsible for `process.exit(exitCodeFor(err))` afterwards.
|
|
41
|
+
*
|
|
42
|
+
* Non-`RpcError` throws are wrapped as `INTERNAL_ERROR` so the CLI
|
|
43
|
+
* always emits the documented shape.
|
|
44
|
+
*/
|
|
45
|
+
function renderError(err, stream = process.stderr) {
|
|
46
|
+
const rpcErr = err instanceof jsonrpc_1.RpcError
|
|
47
|
+
? err
|
|
48
|
+
: new jsonrpc_1.RpcError(error_codes_1.ErrorCode.InternalError, err instanceof Error ? err.message : String(err));
|
|
49
|
+
stream.write(JSON.stringify(errorPayload(rpcErr)) + '\n');
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Render a result to stdout. `text` format uses a human-friendly
|
|
53
|
+
* stringification (`String(result)` for primitives, `JSON.stringify`
|
|
54
|
+
* with indent for objects); `json` always uses single-line JSON for
|
|
55
|
+
* pipe-friendliness.
|
|
56
|
+
*/
|
|
57
|
+
function renderResult(result, format = 'text', stream = process.stdout) {
|
|
58
|
+
if (format === 'json') {
|
|
59
|
+
stream.write(JSON.stringify(result) + '\n');
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
if (result === undefined || result === null) {
|
|
63
|
+
stream.write('\n');
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
if (typeof result === 'string') {
|
|
67
|
+
stream.write(result.endsWith('\n') ? result : result + '\n');
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
if (typeof result === 'number' || typeof result === 'boolean') {
|
|
71
|
+
stream.write(String(result) + '\n');
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
stream.write(JSON.stringify(result, null, 2) + '\n');
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../../../../packages/cli/src/client/output.ts"],"names":[],"mappings":";;AAyBA,oCAOC;AAGD,kCAGC;AASD,kCAMC;AAQD,oCAsBC;AAnFD,sDAA6D;AAC7D,8CAA4C;AAE5C;;;;GAIG;AACH,MAAM,qBAAqB,GAA2B;IACpD,cAAc,EAAE,CAAC;IACjB,aAAa,EAAE,CAAC;IAChB,SAAS,EAAE,CAAC;IACZ,iBAAiB,EAAE,CAAC;IACpB,SAAS,EAAE,CAAC;IACZ,UAAU,EAAE,CAAC;IACb,QAAQ,EAAE,CAAC;CACZ,CAAC;AAQF,0EAA0E;AAC1E,SAAgB,YAAY,CAAC,GAAa;IACxC,MAAM,OAAO,GAAiB;QAC5B,IAAI,EAAE,IAAA,wBAAU,EAAC,GAAG,CAAC,IAAI,CAAC;QAC1B,OAAO,EAAE,GAAG,CAAC,OAAO;KACrB,CAAC;IACF,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,CAAC,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC;IACvD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,yDAAyD;AACzD,SAAgB,WAAW,CAAC,GAAa;IACvC,MAAM,QAAQ,GAAG,IAAA,wBAAU,EAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACtC,OAAO,qBAAqB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAC9C,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,WAAW,CAAC,GAAY,EAAE,SAAgC,OAAO,CAAC,MAAM;IACtF,MAAM,MAAM,GACV,GAAG,YAAY,kBAAQ;QACrB,CAAC,CAAC,GAAG;QACL,CAAC,CAAC,IAAI,kBAAQ,CAAC,uBAAS,CAAC,aAAa,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9F,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AAC5D,CAAC;AAED;;;;;GAKG;AACH,SAAgB,YAAY,CAC1B,MAAe,EACf,SAA0B,MAAM,EAChC,SAAgC,OAAO,CAAC,MAAM;IAE9C,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;QAC5C,OAAO;IACT,CAAC;IACD,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QAC5C,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACnB,OAAO;IACT,CAAC;IACD,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;QAC7D,OAAO;IACT,CAAC;IACD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,MAAM,KAAK,SAAS,EAAE,CAAC;QAC9D,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;QACpC,OAAO;IACT,CAAC;IACD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AACvD,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type DaemonHandle } from '../daemon/entry';
|
|
2
|
+
/**
|
|
3
|
+
* Spin up an in-process daemon listening on a fresh temp socket for use
|
|
4
|
+
* by client integration tests. Returns the daemon handle plus the socket
|
|
5
|
+
* path so callers can clean up.
|
|
6
|
+
*
|
|
7
|
+
* This is test-only; do not export from the public package entrypoint.
|
|
8
|
+
*/
|
|
9
|
+
export declare function startDaemonAndConnect(projectRoot: string): Promise<{
|
|
10
|
+
daemon: DaemonHandle;
|
|
11
|
+
sockPath: string;
|
|
12
|
+
}>;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.startDaemonAndConnect = startDaemonAndConnect;
|
|
4
|
+
const node_fs_1 = require("node:fs");
|
|
5
|
+
const node_os_1 = require("node:os");
|
|
6
|
+
const node_path_1 = require("node:path");
|
|
7
|
+
const entry_1 = require("../daemon/entry");
|
|
8
|
+
/**
|
|
9
|
+
* Spin up an in-process daemon listening on a fresh temp socket for use
|
|
10
|
+
* by client integration tests. Returns the daemon handle plus the socket
|
|
11
|
+
* path so callers can clean up.
|
|
12
|
+
*
|
|
13
|
+
* This is test-only; do not export from the public package entrypoint.
|
|
14
|
+
*/
|
|
15
|
+
async function startDaemonAndConnect(projectRoot) {
|
|
16
|
+
const sockDir = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), 'mutates-sock-'));
|
|
17
|
+
const sockPath = (0, node_path_1.join)(sockDir, 'd.sock');
|
|
18
|
+
const daemon = await (0, entry_1.startDaemon)({ root: projectRoot, sock: sockPath });
|
|
19
|
+
return { daemon, sockPath };
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=rpc-client-testing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc-client-testing.js","sourceRoot":"","sources":["../../../../../packages/cli/src/client/rpc-client-testing.ts"],"names":[],"mappings":";;AAaA,sDAOC;AApBD,qCAAsC;AACtC,qCAAiC;AACjC,yCAAiC;AAEjC,2CAAiE;AAEjE;;;;;;GAMG;AACI,KAAK,UAAU,qBAAqB,CACzC,WAAmB;IAEnB,MAAM,OAAO,GAAG,IAAA,qBAAW,EAAC,IAAA,gBAAI,EAAC,IAAA,gBAAM,GAAE,EAAE,eAAe,CAAC,CAAC,CAAC;IAC7D,MAAM,QAAQ,GAAG,IAAA,gBAAI,EAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,MAAM,IAAA,mBAAW,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;IACxE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export interface ConnectOptions {
|
|
2
|
+
/** Absolute or relative project root. */
|
|
3
|
+
root: string;
|
|
4
|
+
/** Optional pre-existing session id to validate via `session.list`. */
|
|
5
|
+
sessionId?: string;
|
|
6
|
+
/** Override the daemon entry path. Used by integration tests. */
|
|
7
|
+
daemonEntry?: string;
|
|
8
|
+
/** Override the Node executable used to spawn the daemon. */
|
|
9
|
+
node?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface Connection {
|
|
12
|
+
call<R = unknown>(method: string, params?: unknown): Promise<R>;
|
|
13
|
+
close(): Promise<void>;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Derive a per-root socket path. Unix uses a 32-hex suffix under
|
|
17
|
+
* `os.tmpdir()`; Windows uses a named pipe with the same hash. The
|
|
18
|
+
* caller passes the chosen path to `--sock`, ensuring the daemon and
|
|
19
|
+
* the client agree.
|
|
20
|
+
*/
|
|
21
|
+
export declare function deriveSocketPath(root: string): string;
|
|
22
|
+
/**
|
|
23
|
+
* Discover or spawn a daemon for `root`, perform the handshake, return a
|
|
24
|
+
* {@link Connection} for further calls.
|
|
25
|
+
*
|
|
26
|
+
* Discovery rules (see design.md §RpcClient):
|
|
27
|
+
* 1. Read the lockfile. If present and `process.kill(pid, 0)` succeeds,
|
|
28
|
+
* connect to its `sock`.
|
|
29
|
+
* 2. On lockfile miss or stale (read returns null) — unlink any stale
|
|
30
|
+
* lockfile, spawn `node <entry> --root <root> --sock <derived>`
|
|
31
|
+
* detached, poll for the socket up to 2 s.
|
|
32
|
+
* 3. After connect: if `sessionId` is supplied, call `session.list` and
|
|
33
|
+
* ensure it appears; else call `session.open { root }`.
|
|
34
|
+
*/
|
|
35
|
+
export declare function connectClient(opts: ConnectOptions): Promise<Connection>;
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.deriveSocketPath = deriveSocketPath;
|
|
4
|
+
exports.connectClient = connectClient;
|
|
5
|
+
const node_child_process_1 = require("node:child_process");
|
|
6
|
+
const node_crypto_1 = require("node:crypto");
|
|
7
|
+
const node_fs_1 = require("node:fs");
|
|
8
|
+
const node_net_1 = require("node:net");
|
|
9
|
+
const node_os_1 = require("node:os");
|
|
10
|
+
const node_path_1 = require("node:path");
|
|
11
|
+
const lockfile_1 = require("../discovery/lockfile");
|
|
12
|
+
const error_codes_1 = require("../proto/error-codes");
|
|
13
|
+
const jsonrpc_1 = require("../proto/jsonrpc");
|
|
14
|
+
const SPAWN_TIMEOUT_MS = 2_000;
|
|
15
|
+
const SPAWN_POLL_MS = 50;
|
|
16
|
+
/**
|
|
17
|
+
* Default daemon entry path resolved from this module's compiled location.
|
|
18
|
+
* Production: `dist/packages/cli/src/daemon/entry.js`. Tests typically
|
|
19
|
+
* pass an explicit path via {@link ConnectOptions.daemonEntry}.
|
|
20
|
+
*/
|
|
21
|
+
function defaultDaemonEntry() {
|
|
22
|
+
// The compiled JS sits next to this file at runtime (./client/rpc-client.js).
|
|
23
|
+
// The daemon entry compiles to ../daemon/entry.js.
|
|
24
|
+
return (0, node_path_1.join)(__dirname, '..', 'daemon', 'entry.js');
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Derive a per-root socket path. Unix uses a 32-hex suffix under
|
|
28
|
+
* `os.tmpdir()`; Windows uses a named pipe with the same hash. The
|
|
29
|
+
* caller passes the chosen path to `--sock`, ensuring the daemon and
|
|
30
|
+
* the client agree.
|
|
31
|
+
*/
|
|
32
|
+
function deriveSocketPath(root) {
|
|
33
|
+
const abs = (0, node_path_1.resolve)(root);
|
|
34
|
+
const hash = (0, node_crypto_1.createHash)('sha256').update(abs).digest('hex').slice(0, 16);
|
|
35
|
+
if (process.platform === 'win32') {
|
|
36
|
+
return `\\\\.\\pipe\\mutates-${hash}`;
|
|
37
|
+
}
|
|
38
|
+
return (0, node_path_1.join)((0, node_os_1.tmpdir)(), `mutates-${hash}.sock`);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Discover or spawn a daemon for `root`, perform the handshake, return a
|
|
42
|
+
* {@link Connection} for further calls.
|
|
43
|
+
*
|
|
44
|
+
* Discovery rules (see design.md §RpcClient):
|
|
45
|
+
* 1. Read the lockfile. If present and `process.kill(pid, 0)` succeeds,
|
|
46
|
+
* connect to its `sock`.
|
|
47
|
+
* 2. On lockfile miss or stale (read returns null) — unlink any stale
|
|
48
|
+
* lockfile, spawn `node <entry> --root <root> --sock <derived>`
|
|
49
|
+
* detached, poll for the socket up to 2 s.
|
|
50
|
+
* 3. After connect: if `sessionId` is supplied, call `session.list` and
|
|
51
|
+
* ensure it appears; else call `session.open { root }`.
|
|
52
|
+
*/
|
|
53
|
+
async function connectClient(opts) {
|
|
54
|
+
const absRoot = (0, node_path_1.resolve)(opts.root);
|
|
55
|
+
let lock = (0, lockfile_1.read)(absRoot);
|
|
56
|
+
if (!lock) {
|
|
57
|
+
// Clear any stale entry left by a crashed daemon.
|
|
58
|
+
(0, lockfile_1.unlink)(absRoot);
|
|
59
|
+
const sock = deriveSocketPath(absRoot);
|
|
60
|
+
spawnDaemon(absRoot, sock, opts);
|
|
61
|
+
lock = await waitForLockfile(absRoot);
|
|
62
|
+
}
|
|
63
|
+
const connection = await openSocketConnection(lock.sock);
|
|
64
|
+
if (opts.sessionId) {
|
|
65
|
+
const sessions = await connection.call('session.list', {});
|
|
66
|
+
const exists = sessions.some((s) => s.id === opts.sessionId);
|
|
67
|
+
if (!exists) {
|
|
68
|
+
await connection.close();
|
|
69
|
+
throw new jsonrpc_1.RpcError(error_codes_1.ErrorCode.SessionNotFound, `session not found: ${opts.sessionId}`, {
|
|
70
|
+
sessionId: opts.sessionId,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return connection;
|
|
75
|
+
}
|
|
76
|
+
function spawnDaemon(root, sock, opts) {
|
|
77
|
+
const entry = opts.daemonEntry ?? defaultDaemonEntry();
|
|
78
|
+
const node = opts.node ?? process.execPath;
|
|
79
|
+
if (!(0, node_fs_1.existsSync)(entry)) {
|
|
80
|
+
throw new Error(`mutates daemon entry not found at ${entry}`);
|
|
81
|
+
}
|
|
82
|
+
const child = (0, node_child_process_1.spawn)(node, [entry, '--root', root, '--sock', sock], {
|
|
83
|
+
detached: true,
|
|
84
|
+
stdio: 'ignore',
|
|
85
|
+
windowsHide: true,
|
|
86
|
+
});
|
|
87
|
+
child.unref();
|
|
88
|
+
}
|
|
89
|
+
async function waitForLockfile(root) {
|
|
90
|
+
const deadline = Date.now() + SPAWN_TIMEOUT_MS;
|
|
91
|
+
while (Date.now() < deadline) {
|
|
92
|
+
const lock = (0, lockfile_1.read)(root);
|
|
93
|
+
if (lock && (0, node_fs_1.existsSync)((0, lockfile_1.lockfilePath)(root)))
|
|
94
|
+
return lock;
|
|
95
|
+
await sleep(SPAWN_POLL_MS);
|
|
96
|
+
}
|
|
97
|
+
throw new Error(`mutates daemon did not start within ${SPAWN_TIMEOUT_MS}ms`);
|
|
98
|
+
}
|
|
99
|
+
function sleep(ms) {
|
|
100
|
+
return new Promise((res) => setTimeout(res, ms));
|
|
101
|
+
}
|
|
102
|
+
function openSocketConnection(sock) {
|
|
103
|
+
return new Promise((resolveConn, rejectConn) => {
|
|
104
|
+
const codec = new jsonrpc_1.NdjsonCodec();
|
|
105
|
+
const socket = (0, node_net_1.connect)(sock);
|
|
106
|
+
const internals = {
|
|
107
|
+
socket,
|
|
108
|
+
pending: new Map(),
|
|
109
|
+
codec,
|
|
110
|
+
nextId: 1,
|
|
111
|
+
};
|
|
112
|
+
const decoder = codec.decode();
|
|
113
|
+
socket.pipe(decoder);
|
|
114
|
+
decoder.on('data', (msg) => {
|
|
115
|
+
const id = msg.id;
|
|
116
|
+
if (id === null || id === undefined)
|
|
117
|
+
return;
|
|
118
|
+
const resolver = internals.pending.get(id);
|
|
119
|
+
if (resolver) {
|
|
120
|
+
internals.pending.delete(id);
|
|
121
|
+
resolver(msg);
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
const failPending = (err) => {
|
|
125
|
+
for (const [, resolver] of internals.pending) {
|
|
126
|
+
// resolver expects an RpcResponse; synthesize an error response.
|
|
127
|
+
resolver({
|
|
128
|
+
jsonrpc: '2.0',
|
|
129
|
+
id: null,
|
|
130
|
+
error: { code: error_codes_1.ErrorCode.IoError, message: err.message },
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
internals.pending.clear();
|
|
134
|
+
};
|
|
135
|
+
socket.on('error', (err) => {
|
|
136
|
+
failPending(err);
|
|
137
|
+
rejectConn(err);
|
|
138
|
+
});
|
|
139
|
+
socket.on('close', () => failPending(new Error('socket closed')));
|
|
140
|
+
socket.once('connect', () => {
|
|
141
|
+
const conn = {
|
|
142
|
+
async call(method, params) {
|
|
143
|
+
const id = internals.nextId++;
|
|
144
|
+
const frame = {
|
|
145
|
+
jsonrpc: '2.0',
|
|
146
|
+
id,
|
|
147
|
+
method,
|
|
148
|
+
params: params ?? {},
|
|
149
|
+
};
|
|
150
|
+
return new Promise((resolveCall, rejectCall) => {
|
|
151
|
+
internals.pending.set(id, (msg) => {
|
|
152
|
+
if ('error' in msg) {
|
|
153
|
+
rejectCall(new jsonrpc_1.RpcError(msg.error.code, msg.error.message, msg.error.data));
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
resolveCall(msg.result);
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
socket.write(codec.encode(frame));
|
|
160
|
+
});
|
|
161
|
+
},
|
|
162
|
+
close() {
|
|
163
|
+
return new Promise((res) => {
|
|
164
|
+
socket.end(() => res());
|
|
165
|
+
});
|
|
166
|
+
},
|
|
167
|
+
};
|
|
168
|
+
resolveConn(conn);
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=rpc-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc-client.js","sourceRoot":"","sources":["../../../../../packages/cli/src/client/rpc-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `mutates close` — close a session by id, or close every live session
|
|
3
|
+
* for this project root when `--all` is set.
|
|
4
|
+
*
|
|
5
|
+
* When neither `--session` nor `--all` is supplied, the command exits
|
|
6
|
+
* with an INVALID_INPUT-shaped error payload.
|
|
7
|
+
*/
|
|
8
|
+
declare const _default: import("citty").CommandDef<{
|
|
9
|
+
session: {
|
|
10
|
+
type: "string";
|
|
11
|
+
description: string;
|
|
12
|
+
};
|
|
13
|
+
all: {
|
|
14
|
+
type: "boolean";
|
|
15
|
+
description: string;
|
|
16
|
+
default: false;
|
|
17
|
+
};
|
|
18
|
+
root: {
|
|
19
|
+
type: "string";
|
|
20
|
+
description: string;
|
|
21
|
+
};
|
|
22
|
+
json: {
|
|
23
|
+
type: "boolean";
|
|
24
|
+
description: string;
|
|
25
|
+
default: false;
|
|
26
|
+
};
|
|
27
|
+
}>;
|
|
28
|
+
export default _default;
|