@projitect/cli-internals 0.0.0-stage → 1.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.
Files changed (173) hide show
  1. package/LICENSE +21 -0
  2. package/dist/applier.d.ts +12 -0
  3. package/dist/applier.d.ts.map +1 -0
  4. package/dist/applier.js +69 -0
  5. package/dist/applier.js.map +1 -0
  6. package/dist/commands/add.d.ts +34 -0
  7. package/dist/commands/add.d.ts.map +1 -0
  8. package/dist/commands/add.js +64 -0
  9. package/dist/commands/add.js.map +1 -0
  10. package/dist/commands/build.d.ts +39 -0
  11. package/dist/commands/build.d.ts.map +1 -0
  12. package/dist/commands/build.js +108 -0
  13. package/dist/commands/build.js.map +1 -0
  14. package/dist/commands/dispatch.d.ts +5 -0
  15. package/dist/commands/dispatch.d.ts.map +1 -0
  16. package/dist/commands/dispatch.js +211 -0
  17. package/dist/commands/dispatch.js.map +1 -0
  18. package/dist/commands/explain.d.ts +10 -0
  19. package/dist/commands/explain.d.ts.map +1 -0
  20. package/dist/commands/explain.js +46 -0
  21. package/dist/commands/explain.js.map +1 -0
  22. package/dist/commands/init.d.ts +33 -0
  23. package/dist/commands/init.d.ts.map +1 -0
  24. package/dist/commands/init.js +128 -0
  25. package/dist/commands/init.js.map +1 -0
  26. package/dist/commands/inspect-json.d.ts +51 -0
  27. package/dist/commands/inspect-json.d.ts.map +1 -0
  28. package/dist/commands/inspect-json.js +58 -0
  29. package/dist/commands/inspect-json.js.map +1 -0
  30. package/dist/commands/inspect.d.ts +41 -0
  31. package/dist/commands/inspect.d.ts.map +1 -0
  32. package/dist/commands/inspect.js +74 -0
  33. package/dist/commands/inspect.js.map +1 -0
  34. package/dist/commands/remodel.d.ts +22 -0
  35. package/dist/commands/remodel.d.ts.map +1 -0
  36. package/dist/commands/remodel.js +49 -0
  37. package/dist/commands/remodel.js.map +1 -0
  38. package/dist/config-cascade.d.ts +25 -0
  39. package/dist/config-cascade.d.ts.map +1 -0
  40. package/dist/config-cascade.js +45 -0
  41. package/dist/config-cascade.js.map +1 -0
  42. package/dist/differ.d.ts +31 -0
  43. package/dist/differ.d.ts.map +1 -0
  44. package/dist/differ.js +134 -0
  45. package/dist/differ.js.map +1 -0
  46. package/dist/edit-pjt.d.ts +19 -0
  47. package/dist/edit-pjt.d.ts.map +1 -0
  48. package/dist/edit-pjt.js +40 -0
  49. package/dist/edit-pjt.js.map +1 -0
  50. package/dist/filesystem-impl.d.ts +25 -0
  51. package/dist/filesystem-impl.d.ts.map +1 -0
  52. package/dist/filesystem-impl.js +153 -0
  53. package/dist/filesystem-impl.js.map +1 -0
  54. package/dist/git.d.ts +29 -0
  55. package/dist/git.d.ts.map +1 -0
  56. package/dist/git.js +63 -0
  57. package/dist/git.js.map +1 -0
  58. package/dist/index.d.ts +22 -0
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/index.js +21 -0
  61. package/dist/index.js.map +1 -0
  62. package/dist/ipc/client.d.ts +11 -0
  63. package/dist/ipc/client.d.ts.map +1 -0
  64. package/dist/ipc/client.js +45 -0
  65. package/dist/ipc/client.js.map +1 -0
  66. package/dist/ipc/index.d.ts +5 -0
  67. package/dist/ipc/index.d.ts.map +1 -0
  68. package/dist/ipc/index.js +5 -0
  69. package/dist/ipc/index.js.map +1 -0
  70. package/dist/ipc/protocol.d.ts +251 -0
  71. package/dist/ipc/protocol.d.ts.map +1 -0
  72. package/dist/ipc/protocol.js +41 -0
  73. package/dist/ipc/protocol.js.map +1 -0
  74. package/dist/ipc/server.d.ts +9 -0
  75. package/dist/ipc/server.d.ts.map +1 -0
  76. package/dist/ipc/server.js +23 -0
  77. package/dist/ipc/server.js.map +1 -0
  78. package/dist/ipc/transport.d.ts +12 -0
  79. package/dist/ipc/transport.d.ts.map +1 -0
  80. package/dist/ipc/transport.js +19 -0
  81. package/dist/ipc/transport.js.map +1 -0
  82. package/dist/loader.d.ts +45 -0
  83. package/dist/loader.d.ts.map +1 -0
  84. package/dist/loader.js +65 -0
  85. package/dist/loader.js.map +1 -0
  86. package/dist/lockfile.d.ts +22 -0
  87. package/dist/lockfile.d.ts.map +1 -0
  88. package/dist/lockfile.js +59 -0
  89. package/dist/lockfile.js.map +1 -0
  90. package/dist/permissions.d.ts +20 -0
  91. package/dist/permissions.d.ts.map +1 -0
  92. package/dist/permissions.js +86 -0
  93. package/dist/permissions.js.map +1 -0
  94. package/dist/plan.d.ts +278 -0
  95. package/dist/plan.d.ts.map +1 -0
  96. package/dist/plan.js +212 -0
  97. package/dist/plan.js.map +1 -0
  98. package/dist/platform/file-system.d.ts +3 -0
  99. package/dist/platform/file-system.d.ts.map +1 -0
  100. package/dist/platform/file-system.js +109 -0
  101. package/dist/platform/file-system.js.map +1 -0
  102. package/dist/platform/index.d.ts +17 -0
  103. package/dist/platform/index.d.ts.map +1 -0
  104. package/dist/platform/index.js +20 -0
  105. package/dist/platform/index.js.map +1 -0
  106. package/dist/platform/process-runner.d.ts +41 -0
  107. package/dist/platform/process-runner.d.ts.map +1 -0
  108. package/dist/platform/process-runner.js +120 -0
  109. package/dist/platform/process-runner.js.map +1 -0
  110. package/dist/platform/stdio.d.ts +9 -0
  111. package/dist/platform/stdio.d.ts.map +1 -0
  112. package/dist/platform/stdio.js +11 -0
  113. package/dist/platform/stdio.js.map +1 -0
  114. package/dist/platform/terminal.d.ts +3 -0
  115. package/dist/platform/terminal.d.ts.map +1 -0
  116. package/dist/platform/terminal.js +81 -0
  117. package/dist/platform/terminal.js.map +1 -0
  118. package/dist/pm.d.ts +31 -0
  119. package/dist/pm.d.ts.map +1 -0
  120. package/dist/pm.js +91 -0
  121. package/dist/pm.js.map +1 -0
  122. package/dist/post-apply.d.ts +20 -0
  123. package/dist/post-apply.d.ts.map +1 -0
  124. package/dist/post-apply.js +29 -0
  125. package/dist/post-apply.js.map +1 -0
  126. package/dist/project-file.d.ts +8 -0
  127. package/dist/project-file.d.ts.map +1 -0
  128. package/dist/project-file.js +12 -0
  129. package/dist/project-file.js.map +1 -0
  130. package/dist/region.d.ts +105 -0
  131. package/dist/region.d.ts.map +1 -0
  132. package/dist/region.js +94 -0
  133. package/dist/region.js.map +1 -0
  134. package/dist/remover.d.ts +16 -0
  135. package/dist/remover.d.ts.map +1 -0
  136. package/dist/remover.js +88 -0
  137. package/dist/remover.js.map +1 -0
  138. package/package.json +52 -3
  139. package/src/applier.ts +91 -0
  140. package/src/commands/add.ts +88 -0
  141. package/src/commands/build.ts +156 -0
  142. package/src/commands/dispatch.ts +345 -0
  143. package/src/commands/explain.ts +81 -0
  144. package/src/commands/init.ts +193 -0
  145. package/src/commands/inspect-json.ts +68 -0
  146. package/src/commands/inspect.ts +106 -0
  147. package/src/commands/remodel.ts +72 -0
  148. package/src/config-cascade.ts +60 -0
  149. package/src/differ.ts +188 -0
  150. package/src/edit-pjt.ts +56 -0
  151. package/src/filesystem-impl.ts +230 -0
  152. package/src/git.ts +87 -0
  153. package/src/index.ts +54 -0
  154. package/src/ipc/client.ts +108 -0
  155. package/src/ipc/index.ts +12 -0
  156. package/src/ipc/protocol.ts +48 -0
  157. package/src/ipc/server.ts +62 -0
  158. package/src/ipc/transport.ts +28 -0
  159. package/src/loader.ts +115 -0
  160. package/src/lockfile.ts +81 -0
  161. package/src/permissions.ts +106 -0
  162. package/src/plan.ts +459 -0
  163. package/src/platform/file-system.ts +155 -0
  164. package/src/platform/index.ts +26 -0
  165. package/src/platform/process-runner.ts +150 -0
  166. package/src/platform/stdio.ts +11 -0
  167. package/src/platform/terminal.ts +89 -0
  168. package/src/pm.ts +131 -0
  169. package/src/post-apply.ts +45 -0
  170. package/src/project-file.ts +15 -0
  171. package/src/region.ts +139 -0
  172. package/src/remover.ts +127 -0
  173. package/README.md +0 -3
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Kapil Easwar
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,12 @@
1
+ import { Effect } from "effect";
2
+ import { BlueprintFileSystem } from "@projitect/core";
3
+ import type { Errors } from "@projitect/core";
4
+ import type { ProjectPlan } from "./plan.js";
5
+ /**
6
+ * Apply a plan through the project `BlueprintFileSystem` (which creates parent directories). Used by `pjt remodel` (non-destructive) and `pjt build` (after wiping
7
+ * the project tree). Returns the list of paths actually written.
8
+ */
9
+ export declare const applyPlan: (params: {
10
+ readonly plan: ProjectPlan;
11
+ }) => Effect.Effect<readonly string[], Errors.RegionMissingEnd | Errors.RegionDuplicate | Errors.FsWriteFailed | Errors.FsPermissionDenied, BlueprintFileSystem>;
12
+ //# sourceMappingURL=applier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"applier.d.ts","sourceRoot":"","sources":["../src/applier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAS,MAAM,QAAQ,CAAA;AAEtC,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AACrD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,KAAK,EAAY,WAAW,EAAiC,MAAM,WAAW,CAAA;AAIrF;;;GAGG;AACH,eAAO,MAAM,SAAS,GAAI,QAAQ;IAChC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAA;CAC3B,KAAG,MAAM,CAAC,MAAM,CACf,SAAS,MAAM,EAAE,EACf,MAAM,CAAC,gBAAgB,GACvB,MAAM,CAAC,eAAe,GACtB,MAAM,CAAC,aAAa,GACpB,MAAM,CAAC,kBAAkB,EAC3B,mBAAmB,CAoBpB,CAAA"}
@@ -0,0 +1,69 @@
1
+ import { Effect, Match } from "effect";
2
+ import { RecordX } from "@nunofyobiz/effect-extras";
3
+ import { BlueprintFileSystem } from "@projitect/core";
4
+ import { readIfExists } from "./project-file.js";
5
+ import { findRegion, renderRegion, upsertRegion } from "./region.js";
6
+ /**
7
+ * Apply a plan through the project `BlueprintFileSystem` (which creates parent directories). Used by `pjt remodel` (non-destructive) and `pjt build` (after wiping
8
+ * the project tree). Returns the list of paths actually written.
9
+ */
10
+ export const applyPlan = (params) => {
11
+ const { plan } = params;
12
+ return Effect.gen(function* () {
13
+ const fs = yield* BlueprintFileSystem;
14
+ const written = [];
15
+ for (const file of plan.files) {
16
+ const current = yield* readIfExists(file.path);
17
+ const next = yield* nextContent({ file, current });
18
+ if (next === null) {
19
+ continue;
20
+ } // Seed-mode no-op
21
+ if (next === current) {
22
+ continue;
23
+ } // Already in sync
24
+ yield* fs.writeFile(file.path, next);
25
+ written.push(file.path);
26
+ }
27
+ return written;
28
+ });
29
+ };
30
+ const nextContent = (params) => Match.valueTags(params.file, {
31
+ Region: (file) => nextRegion(file, params.current),
32
+ Merge: (file) => Effect.succeed(nextMerge(file, params.current)),
33
+ Owned: (file) => Effect.succeed(file.content),
34
+ Seed: (file) => Effect.succeed(params.current === null ? file.content : null),
35
+ });
36
+ const nextRegion = (file, current) => Effect.gen(function* () {
37
+ let content = current ?? "";
38
+ for (const region of file.regions) {
39
+ const found = yield* findRegion({
40
+ fileContent: content,
41
+ ownerId: region.ownerId,
42
+ commentPrefix: file.commentPrefix,
43
+ commentSuffix: file.commentSuffix,
44
+ path: file.path,
45
+ });
46
+ const rendered = renderRegion({
47
+ ownerId: region.ownerId,
48
+ commentPrefix: file.commentPrefix,
49
+ commentSuffix: file.commentSuffix,
50
+ content: region.content,
51
+ });
52
+ content = upsertRegion({ fileContent: content, existing: found, rendered });
53
+ }
54
+ return content;
55
+ });
56
+ const nextMerge = (file, current) => {
57
+ const existing = current === null ? {} : (safeParseJson(current) ?? {});
58
+ const merged = RecordX.deepMerge(existing, file.value);
59
+ return `${JSON.stringify(merged, null, 2)}\n`;
60
+ };
61
+ const safeParseJson = (text) => {
62
+ try {
63
+ return JSON.parse(text);
64
+ }
65
+ catch {
66
+ return null;
67
+ }
68
+ };
69
+ //# sourceMappingURL=applier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"applier.js","sourceRoot":"","sources":["../src/applier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { Effect } from "effect";
2
+ import { Errors } from "@projitect/core";
3
+ import type { ProjitectConfig } from "@projitect/core";
4
+ import type { ProjitectPackageMetadata, SectionStrategy } from "@projitect/blueprint";
5
+ export interface AddResult {
6
+ readonly pm: string;
7
+ readonly pkg: string;
8
+ readonly metadata: ProjitectPackageMetadata;
9
+ readonly sectionsAdded: readonly string[];
10
+ readonly splicedIntoBlueprintFile: boolean;
11
+ /** The user picked no sections (or quit the prompt); `.pjt.ts` was left untouched. */
12
+ readonly selectionCancelled: boolean;
13
+ }
14
+ /**
15
+ * `pjt add <package>` — install a blueprint package and splice it into `.pjt.ts`.
16
+ *
17
+ * Flow:
18
+ * 1. Detect package manager (pnpm / yarn / bun / npm).
19
+ * 2. Shell out `<pm> add -D <package>`.
20
+ * 3. Read the installed package's `package.json` for the `"projitect"` metadata field.
21
+ * - If present and `type: "blueprint-set"`: section selection resolves per `strategy`
22
+ * (all / explicit / ask).
23
+ * - If present and `type: "blueprint"`: a single call line, strategy ignored.
24
+ * - If absent: fails with `pjt.add.metadata-missing`. The package stays installed; the
25
+ * message tells the user to import it in `.pjt.ts` by hand and run `pjt remodel`.
26
+ * 4. Splice the import + call lines into `.pjt.ts` between the convention markers
27
+ * (`pjt:imports` and `pjt:blueprints`).
28
+ */
29
+ export declare const add: <R = never>(params: {
30
+ readonly config: ProjitectConfig.ProjitectConfig;
31
+ readonly pkg: string;
32
+ readonly strategy: SectionStrategy<R>;
33
+ }) => Effect.Effect<AddResult, Errors.ProjitectError, R>;
34
+ //# sourceMappingURL=add.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AACxC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEtD,OAAO,KAAK,EAAE,wBAAwB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAIrF,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,QAAQ,EAAE,wBAAwB,CAAA;IAC3C,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAA;IACzC,QAAQ,CAAC,wBAAwB,EAAE,OAAO,CAAA;IAC1C,sFAAsF;IACtF,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAA;CACrC;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,GAAG,GAAI,CAAC,GAAG,KAAK,EAAE,QAAQ;IACrC,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC,eAAe,CAAA;IAChD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC,CAAA;CACtC,KAAG,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,cAAc,EAAE,CAAC,CAkDjD,CAAA"}
@@ -0,0 +1,64 @@
1
+ import { Effect } from "effect";
2
+ import { Errors } from "@projitect/core";
3
+ import { computeSplice, resolveSections } from "@projitect/blueprint";
4
+ import { detect, installDev as installDevelopment, readProjitectMetadata } from "../pm.js";
5
+ import { splice } from "../edit-pjt.js";
6
+ /**
7
+ * `pjt add <package>` — install a blueprint package and splice it into `.pjt.ts`.
8
+ *
9
+ * Flow:
10
+ * 1. Detect package manager (pnpm / yarn / bun / npm).
11
+ * 2. Shell out `<pm> add -D <package>`.
12
+ * 3. Read the installed package's `package.json` for the `"projitect"` metadata field.
13
+ * - If present and `type: "blueprint-set"`: section selection resolves per `strategy`
14
+ * (all / explicit / ask).
15
+ * - If present and `type: "blueprint"`: a single call line, strategy ignored.
16
+ * - If absent: fails with `pjt.add.metadata-missing`. The package stays installed; the
17
+ * message tells the user to import it in `.pjt.ts` by hand and run `pjt remodel`.
18
+ * 4. Splice the import + call lines into `.pjt.ts` between the convention markers
19
+ * (`pjt:imports` and `pjt:blueprints`).
20
+ */
21
+ export const add = (params) => Effect.gen(function* () {
22
+ const pm = yield* detect({ projectRoot: params.config.projectRoot });
23
+ yield* installDevelopment({ projectRoot: params.config.projectRoot, pm, pkg: params.pkg });
24
+ const metadata = yield* readProjitectMetadata({
25
+ projectRoot: params.config.projectRoot,
26
+ pkg: params.pkg,
27
+ });
28
+ if (metadata === null) {
29
+ return yield* new Errors.AddMetadataMissing({
30
+ id: "pjt.add.metadata-missing",
31
+ pkg: params.pkg,
32
+ blueprintFile: params.config.blueprintFile,
33
+ message: `${params.pkg} was installed but has no \`"projitect"\` metadata in its package.json, so \`pjt add\` can't splice it into ${params.config.blueprintFile}. ` +
34
+ `Import it in ${params.config.blueprintFile} by hand, then run \`pjt remodel\`.`,
35
+ });
36
+ }
37
+ const selection = yield* resolveSections({ metadata, strategy: params.strategy });
38
+ if (selection._tag === "Nothing") {
39
+ return {
40
+ pm,
41
+ pkg: params.pkg,
42
+ metadata,
43
+ sectionsAdded: [],
44
+ splicedIntoBlueprintFile: false,
45
+ selectionCancelled: true,
46
+ };
47
+ }
48
+ const { importLine, callLines, sectionsAdded } = computeSplice({ metadata, selection });
49
+ yield* splice({
50
+ projectRoot: params.config.projectRoot,
51
+ blueprintFile: params.config.blueprintFile,
52
+ importLine,
53
+ callLines,
54
+ });
55
+ return {
56
+ pm,
57
+ pkg: params.pkg,
58
+ metadata,
59
+ sectionsAdded,
60
+ splicedIntoBlueprintFile: true,
61
+ selectionCancelled: false,
62
+ };
63
+ });
64
+ //# sourceMappingURL=add.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAExC,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAErE,OAAO,EAAE,MAAM,EAAE,UAAU,IAAI,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAA;AAC1F,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAYvC;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,GAAG,GAAG,CAAY,MAI9B,EAAsD,EAAE,CACvD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAA;IACpE,KAAK,CAAC,CAAC,kBAAkB,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,CAAA;IAC1F,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,qBAAqB,CAAC;QAC5C,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,WAAW;QACtC,GAAG,EAAE,MAAM,CAAC,GAAG;KAChB,CAAC,CAAA;IAEF,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,OAAO,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,kBAAkB,CAAC;YAC1C,EAAE,EAAE,0BAA0B;YAC9B,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa;YAC1C,OAAO,EACL,GAAG,MAAM,CAAC,GAAG,+GAA+G,MAAM,CAAC,MAAM,CAAC,aAAa,IAAI;gBAC3J,gBAAgB,MAAM,CAAC,MAAM,CAAC,aAAa,qCAAqC;SACnF,CAAC,CAAA;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,eAAe,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAA;IAEjF,IAAI,SAAS,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO;YACL,EAAE;YACF,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,QAAQ;YACR,aAAa,EAAE,EAAE;YACjB,wBAAwB,EAAE,KAAK;YAC/B,kBAAkB,EAAE,IAAI;SACzB,CAAA;IACH,CAAC;IAED,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,aAAa,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAA;IAEvF,KAAK,CAAC,CAAC,MAAM,CAAC;QACZ,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,WAAW;QACtC,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa;QAC1C,UAAU;QACV,SAAS;KACV,CAAC,CAAA;IAEF,OAAO;QACL,EAAE;QACF,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,QAAQ;QACR,aAAa;QACb,wBAAwB,EAAE,IAAI;QAC9B,kBAAkB,EAAE,KAAK;KAC1B,CAAA;AACH,CAAC,CAAC,CAAA"}
@@ -0,0 +1,39 @@
1
+ import { Effect } from "effect";
2
+ import type { Terminal } from "effect";
3
+ import { Prompt } from "effect/unstable/cli";
4
+ import { Errors } from "@projitect/core";
5
+ import type { ProjitectConfig } from "@projitect/core";
6
+ import type { ProcessSpawner } from "../platform/process-runner.js";
7
+ import type { RemodelResult } from "./remodel.js";
8
+ export interface BuildResult {
9
+ /** True when the confirmation prompt was declined, so nothing was wiped, written or run. */
10
+ readonly cancelled: boolean;
11
+ readonly wiped: readonly string[];
12
+ readonly remodel: RemodelResult;
13
+ }
14
+ /**
15
+ * `pjt build --force` — wipe the project tree (modulo preserved entries) and re-apply the plan
16
+ * from scratch.
17
+ *
18
+ * Safety net:
19
+ * 1. `--force` is required (the dispatcher's flag config enforces this at the CLI layer).
20
+ * 2. The project must be a git repository (`pjt.git.not-a-repo` otherwise).
21
+ * 3. The working tree must be clean (`pjt.apply.dirty-git`), unless `--force-dirty` is set.
22
+ * 4. An interactive confirmation prompt fires unless `--yes` is passed.
23
+ */
24
+ type BuildError = Errors.ProjitectError | Terminal.QuitError;
25
+ type BuildRequirements = Prompt.Environment;
26
+ export declare const build: (params: {
27
+ readonly config: ProjitectConfig.ProjitectConfig;
28
+ readonly force: boolean;
29
+ readonly forceDirty: boolean;
30
+ readonly yes: boolean;
31
+ readonly spawner?: ProcessSpawner;
32
+ }) => Effect.Effect<BuildResult, BuildError, BuildRequirements>;
33
+ /**
34
+ * The human summary `pjt build` prints. Cancellation is the declined prompt, not "nothing
35
+ * happened": a build that only ran post-apply commands is a success and lists them.
36
+ */
37
+ export declare const renderBuildResult: (result: BuildResult) => string;
38
+ export {};
39
+ //# sourceMappingURL=build.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAE5C,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AACxC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAEnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAEjD,MAAM,WAAW,WAAW;IAC1B,4FAA4F;IAC5F,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;IACjC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAA;CAChC;AAoBD;;;;;;;;;GASG;AACH,KAAK,UAAU,GAAG,MAAM,CAAC,cAAc,GAAG,QAAQ,CAAC,SAAS,CAAA;AAC5D,KAAK,iBAAiB,GAAG,MAAM,CAAC,WAAW,CAAA;AAE3C,eAAO,MAAM,KAAK,GAAI,QAAQ;IAC5B,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC,eAAe,CAAA;IAChD,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;IACvB,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAA;IAC5B,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAA;IACrB,QAAQ,CAAC,OAAO,CAAC,EAAE,cAAc,CAAA;CAClC,KAAG,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,UAAU,EAAE,iBAAiB,CA8CxD,CAAA;AAKJ;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAAI,QAAQ,WAAW,KAAG,MAsBvD,CAAA"}
@@ -0,0 +1,108 @@
1
+ import { promises as fs } from "node:fs";
2
+ import path from "node:path";
3
+ import { Effect } from "effect";
4
+ import { Prompt } from "effect/unstable/cli";
5
+ import { StructX } from "@nunofyobiz/effect-extras";
6
+ import { Errors } from "@projitect/core";
7
+ import { ensureGitRepo, gitStatus } from "../git.js";
8
+ import { remodel } from "./remodel.js";
9
+ /**
10
+ * Paths that survive `pjt build --force`. Everything else under projectRoot is deleted before
11
+ * the plan re-applies. This intentionally preserves the manifest (`package.json`), the blueprint
12
+ * file, the lockfile, the dependency store, the git history, and PM lockfiles so the project is
13
+ * recoverable.
14
+ */
15
+ const PRESERVED = new Set([
16
+ ".git",
17
+ "node_modules",
18
+ ".pjt.ts",
19
+ ".pjt.lock",
20
+ "package.json",
21
+ "pnpm-lock.yaml",
22
+ "package-lock.json",
23
+ "yarn.lock",
24
+ "bun.lockb",
25
+ ]);
26
+ export const build = (params) => Effect.gen(function* () {
27
+ if (!params.force) {
28
+ return yield* new Errors.ApplyDirtyGit({
29
+ id: "pjt.apply.dirty-git",
30
+ command: "build",
31
+ message: "`pjt build` requires the `--force` flag. This command is destructive — it wipes the project tree before re-applying.",
32
+ });
33
+ }
34
+ yield* ensureGitRepo({ projectRoot: params.config.projectRoot });
35
+ if (!params.forceDirty) {
36
+ const status = yield* gitStatus({ projectRoot: params.config.projectRoot });
37
+ if (!status.clean) {
38
+ return yield* new Errors.ApplyDirtyGit({
39
+ id: "pjt.apply.dirty-git",
40
+ command: "build",
41
+ message: `Git working tree is dirty (${status.lines.length} uncommitted change${status.lines.length === 1 ? "" : "s"}). ` +
42
+ "Commit your changes (`git add -A && git commit -m wip`) and re-run `pjt build --force`, or pass `--force-dirty` to wipe anyway.",
43
+ });
44
+ }
45
+ }
46
+ if (!params.yes) {
47
+ const confirmed = yield* Prompt.confirm({
48
+ message: `This will delete everything under ${params.config.projectRoot} except .git, node_modules, .pjt.ts, .pjt.lock, package.json, and the PM lockfile. Continue?`,
49
+ initial: false,
50
+ });
51
+ if (!confirmed) {
52
+ return {
53
+ cancelled: true,
54
+ wiped: [],
55
+ remodel: { written: [], removed: [], ran: [] },
56
+ };
57
+ }
58
+ }
59
+ const wiped = yield* wipeTree(params.config.projectRoot);
60
+ const remodelResult = yield* remodel({
61
+ config: params.config,
62
+ ...StructX.defined("spawner", params.spawner),
63
+ });
64
+ return { cancelled: false, wiped, remodel: remodelResult };
65
+ });
66
+ const count = (n, singular, plural) => `${n} ${n === 1 ? singular : plural}`;
67
+ /**
68
+ * The human summary `pjt build` prints. Cancellation is the declined prompt, not "nothing
69
+ * happened": a build that only ran post-apply commands is a success and lists them.
70
+ */
71
+ export const renderBuildResult = (result) => {
72
+ const { cancelled, wiped, remodel: applied } = result;
73
+ const lines = cancelled
74
+ ? ["Cancelled. No changes made."]
75
+ : [
76
+ ...(wiped.length > 0
77
+ ? [`Wiped ${count(wiped.length, "entry", "entries")}:`, ...wiped.map((p) => ` ${p}`)]
78
+ : []),
79
+ ...(applied.written.length > 0
80
+ ? [
81
+ `Rebuilt ${count(applied.written.length, "file", "files")} from the plan:`,
82
+ ...applied.written.map((p) => ` ${p}`),
83
+ ]
84
+ : []),
85
+ ...(applied.ran.length > 0
86
+ ? [
87
+ `Ran ${count(applied.ran.length, "command", "commands")}:`,
88
+ ...applied.ran.map((c) => ` ${c}`),
89
+ ]
90
+ : []),
91
+ ];
92
+ return `${lines.join("\n")}\n`;
93
+ };
94
+ const wipeTree = (projectRoot) => Effect.tryPromise({
95
+ try: async () => {
96
+ const entries = await fs.readdir(projectRoot);
97
+ const toRemove = entries.filter((name) => !PRESERVED.has(name));
98
+ await Promise.all(toRemove.map((name) => fs.rm(path.join(projectRoot, name), { recursive: true, force: true })));
99
+ return toRemove;
100
+ },
101
+ catch: (e) => new Errors.FsWriteFailed({
102
+ id: "pjt.fs.write-failed",
103
+ path: projectRoot,
104
+ cause: e instanceof Error ? e.message : String(e),
105
+ message: `Failed to wipe project tree at ${projectRoot}`,
106
+ }),
107
+ });
108
+ //# sourceMappingURL=build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { Prompt } from "effect/unstable/cli";
2
+ import { Command } from "effect/unstable/cli";
3
+ export declare const rootCommand: Command.Command<"pjt", {}, {}, never, Prompt.Environment>;
4
+ export type RootCommand = typeof rootCommand;
5
+ //# sourceMappingURL=dispatch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../../src/commands/dispatch.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AACjD,OAAO,EAAY,OAAO,EAAQ,MAAM,qBAAqB,CAAA;AAiV7D,eAAO,MAAM,WAAW,2DAGvB,CAAA;AAED,MAAM,MAAM,WAAW,GAAG,OAAO,WAAW,CAAA"}
@@ -0,0 +1,211 @@
1
+ import { Effect, Match, Option, Terminal } from "effect";
2
+ import { Argument, Command, Flag } from "effect/unstable/cli";
3
+ import { chooseSectionsInteractive } from "@projitect/blueprint";
4
+ import { parseEnv, resolveConfig } from "../config-cascade.js";
5
+ import { inspect, renderInspectJson } from "./inspect.js";
6
+ import { InspectJsonSchemaUrl } from "./inspect-json.js";
7
+ import { remodel } from "./remodel.js";
8
+ import { build, renderBuildResult } from "./build.js";
9
+ import { init } from "./init.js";
10
+ import { explain } from "./explain.js";
11
+ import { add } from "./add.js";
12
+ /**
13
+ * Per-handler error renderer. Catches our typed `ProjitectError` union and writes a
14
+ * consistent `Error [id]: message` line plus the docs URL / explain hint — or, with `json`, an
15
+ * `{ "error": { ... } }` object carrying the error's id and fields. Sets `process.exitCode = 1`
16
+ * so the CLI exits non-zero. Returns void so the handler chain stays happy.
17
+ */
18
+ const reportError = (error, json = false) => Effect.gen(function* () {
19
+ if (json) {
20
+ yield* display(`${JSON.stringify({ error }, null, 2)}\n`);
21
+ }
22
+ else {
23
+ yield* display(`Error [${error.id}]: ${error.message}\n`);
24
+ yield* display(` See https://projitect.dev/errors/${error.id} or run \`pjt explain ${error.id}\`\n`);
25
+ }
26
+ process.exitCode = 1;
27
+ });
28
+ const jsonFlag = (description) => Flag.boolean("json").pipe(Flag.withDefault(false), Flag.withDescription(description));
29
+ const display = (text) => Effect.gen(function* () {
30
+ const terminal = yield* Terminal.Terminal;
31
+ // Best-effort write; PlatformError on display is non-actionable from a handler
32
+ yield* Effect.ignore(terminal.display(text));
33
+ });
34
+ const configFromEnv = () => resolveConfig({
35
+ env: parseEnv(process.env),
36
+ cliArgs: { projectRoot: process.cwd() },
37
+ });
38
+ // ---------------------------------------------------------------------------
39
+ // pjt init
40
+ // ---------------------------------------------------------------------------
41
+ const initCmd = Command.make("init", {
42
+ yes: Flag.boolean("yes").pipe(Flag.withDefault(false), Flag.withDescription("Auto-bootstrap missing `.git/` (via `git init`) and `package.json` (minimal stub).")),
43
+ }, (input) => Effect.gen(function* () {
44
+ const config = configFromEnv();
45
+ const result = yield* init({ config, yes: input.yes }).pipe(Effect.matchEffect({
46
+ onSuccess: (r) => Effect.succeed(r),
47
+ onFailure: (error) => reportError(error).pipe(Effect.as(null)),
48
+ }));
49
+ if (result === null) {
50
+ return;
51
+ }
52
+ const lines = [];
53
+ if (result.bootstrappedGit) {
54
+ lines.push("Initialized git repo (.git/)");
55
+ }
56
+ if (result.bootstrappedPackageJson) {
57
+ lines.push("Created package.json");
58
+ }
59
+ if (result.seededBlueprintFile) {
60
+ lines.push(`Created ${config.blueprintFile}`);
61
+ }
62
+ if (result.remodel.written.length > 0) {
63
+ lines.push(`Wrote ${result.remodel.written.length} file${result.remodel.written.length === 1 ? "" : "s"}:`, ...result.remodel.written.map((p) => ` ${p}`));
64
+ }
65
+ lines.push("", "projitect initialized. Edit `.pjt.ts` to add blueprints, then run `pnpm pjt remodel`.");
66
+ yield* display(`${lines.join("\n")}\n`);
67
+ })).pipe(Command.withDescription("Bootstrap projitect in the current project."));
68
+ // ---------------------------------------------------------------------------
69
+ // pjt remodel
70
+ // ---------------------------------------------------------------------------
71
+ const remodelCmd = Command.make("remodel", {
72
+ json: jsonFlag("Emit the result, or the error with its id and fields, as JSON."),
73
+ }, (input) => Effect.gen(function* () {
74
+ const config = configFromEnv();
75
+ const result = yield* remodel({ config }).pipe(Effect.matchEffect({
76
+ onSuccess: (r) => Effect.succeed(r),
77
+ onFailure: (error) => reportError(error, input.json).pipe(Effect.as(null)),
78
+ }));
79
+ if (result === null) {
80
+ return;
81
+ }
82
+ if (input.json) {
83
+ yield* display(`${JSON.stringify(result, null, 2)}\n`);
84
+ return;
85
+ }
86
+ const parts = [];
87
+ if (result.written.length > 0) {
88
+ parts.push(`Wrote ${result.written.length} file${result.written.length === 1 ? "" : "s"}:`, ...result.written.map((p) => ` ${p}`));
89
+ }
90
+ if (result.removed.length > 0) {
91
+ parts.push(`Cleaned up ${result.removed.length} orphan${result.removed.length === 1 ? "" : "s"}:`, ...result.removed.map((p) => ` ${p}`));
92
+ }
93
+ if (result.ran.length > 0) {
94
+ parts.push(`Ran ${result.ran.length} command${result.ran.length === 1 ? "" : "s"}:`, ...result.ran.map((c) => ` ${c}`));
95
+ }
96
+ if (parts.length === 0) {
97
+ parts.push("Project already in sync. No changes written.");
98
+ }
99
+ yield* display(`${parts.join("\n")}\n`);
100
+ })).pipe(Command.withDescription("Apply the blueprint plan to disk (non-destructive), then run post-apply commands."));
101
+ // ---------------------------------------------------------------------------
102
+ // pjt inspect
103
+ // ---------------------------------------------------------------------------
104
+ const inspectCmd = Command.make("inspect", {
105
+ json: Flag.boolean("json").pipe(Flag.withDefault(false), Flag.withDescription(`Emit machine-readable JSON output conforming to ${InspectJsonSchemaUrl}; an error is emitted as an \`{ "error": ... }\` object. Exit code still 1 on drift.`)),
106
+ }, (input) => Effect.gen(function* () {
107
+ const config = configFromEnv();
108
+ const result = yield* inspect({ config }).pipe(Effect.matchEffect({
109
+ onSuccess: (r) => Effect.succeed(r),
110
+ onFailure: (error) => reportError(error, input.json).pipe(Effect.as(null)),
111
+ }));
112
+ if (result === null) {
113
+ return;
114
+ }
115
+ const rendered = input.json ? renderInspectJson(result) : `${result.output}\n`;
116
+ yield* display(rendered);
117
+ if (result.hasDrift) {
118
+ process.exitCode = 1;
119
+ }
120
+ })).pipe(Command.withDescription("Report drift between project and blueprints (exit 1 on drift; built for CI)."));
121
+ // ---------------------------------------------------------------------------
122
+ // pjt build --force
123
+ // ---------------------------------------------------------------------------
124
+ const buildCmd = Command.make("build", {
125
+ force: Flag.boolean("force").pipe(Flag.withDefault(false), Flag.withDescription("Required. Wipe the project tree and rebuild from scratch.")),
126
+ forceDirty: Flag.boolean("force-dirty").pipe(Flag.withDefault(false), Flag.withDescription("Allow wiping even when git has uncommitted changes.")),
127
+ yes: Flag.boolean("yes").pipe(Flag.withDefault(false), Flag.withDescription("Skip the interactive confirmation prompt.")),
128
+ json: jsonFlag("Emit the result, or the error with its id and fields, as JSON."),
129
+ }, (input) => Effect.gen(function* () {
130
+ const config = configFromEnv();
131
+ const result = yield* build({
132
+ config,
133
+ force: input.force,
134
+ forceDirty: input.forceDirty,
135
+ yes: input.yes,
136
+ }).pipe(Effect.matchEffect({
137
+ onSuccess: (r) => Effect.succeed(r),
138
+ onFailure: (error) => Match.value(error).pipe(
139
+ // QuitError from Prompt = user pressed Ctrl-C; treat as graceful cancel.
140
+ Match.tag("QuitError", () => {
141
+ process.exitCode = 130;
142
+ return display("Cancelled.\n").pipe(Effect.as(null));
143
+ }), Match.orElse((projitectError) => reportError(projitectError, input.json).pipe(Effect.as(null)))),
144
+ }));
145
+ if (result === null) {
146
+ return;
147
+ }
148
+ if (input.json) {
149
+ yield* display(`${JSON.stringify(result, null, 2)}\n`);
150
+ return;
151
+ }
152
+ yield* display(renderBuildResult(result));
153
+ })).pipe(Command.withDescription("Scratch-build the project from blueprints. Destructive — requires --force and clean git."));
154
+ // ---------------------------------------------------------------------------
155
+ // pjt explain <error-id>
156
+ // ---------------------------------------------------------------------------
157
+ const explainCmd = Command.make("explain", { errorId: Argument.string("error-id") }, (input) => Effect.gen(function* () {
158
+ const out = yield* explain({ errorId: input.errorId });
159
+ yield* display(`${out}\n`);
160
+ })).pipe(Command.withDescription("Print a description of a projitect error id."));
161
+ // ---------------------------------------------------------------------------
162
+ // pjt add <package>
163
+ // ---------------------------------------------------------------------------
164
+ const addCmd = Command.make("add", {
165
+ pkg: Argument.string("package"),
166
+ section: Flag.string("section").pipe(Flag.optional, Flag.withDescription("Comma-separated section names for blueprint-set packages (e.g. `--section macOs,node`).")),
167
+ }, (input) => Effect.gen(function* () {
168
+ const config = configFromEnv();
169
+ const explicitSections = Option.match(input.section, {
170
+ onNone: () => null,
171
+ onSome: (raw) => raw
172
+ .split(",")
173
+ .map((s) => s.trim())
174
+ .filter((s) => s.length > 0),
175
+ });
176
+ // When `--section` is given, honor it verbatim. Otherwise: if stdin is a TTY, ask the
177
+ // user via `Prompt.multiSelect`; if not (CI / piped), fall back to "all" so scripted
178
+ // installs stay deterministic. The strategy is parametrized over Prompt.Environment so
179
+ // the requirement propagates out through `add`; Command.run provides the platform.
180
+ const strategy = explicitSections === null
181
+ ? process.stdin.isTTY
182
+ ? { _tag: "Ask", choose: chooseSectionsInteractive }
183
+ : { _tag: "All" }
184
+ : { _tag: "Explicit", sections: explicitSections };
185
+ const result = yield* add({ config, pkg: input.pkg, strategy }).pipe(Effect.matchEffect({
186
+ onSuccess: (r) => Effect.succeed(r),
187
+ onFailure: (error) => reportError(error).pipe(Effect.as(null)),
188
+ }));
189
+ if (result === null) {
190
+ return;
191
+ }
192
+ const lines = [`Installed ${result.pkg} via ${result.pm}.`];
193
+ if (result.splicedIntoBlueprintFile) {
194
+ if (result.sectionsAdded.length > 0) {
195
+ lines.push(`Added to ${config.blueprintFile}: ${result.sectionsAdded.join(", ")}.`);
196
+ }
197
+ else {
198
+ lines.push(`Added to ${config.blueprintFile}.`);
199
+ }
200
+ lines.push("Run `pjt remodel` to apply.");
201
+ }
202
+ else {
203
+ lines.push(`No sections selected; ${config.blueprintFile} was not changed.`);
204
+ }
205
+ yield* display(`${lines.join("\n")}\n`);
206
+ })).pipe(Command.withDescription("Install a blueprint package and splice it into .pjt.ts via the marker anchors."));
207
+ // ---------------------------------------------------------------------------
208
+ // Root
209
+ // ---------------------------------------------------------------------------
210
+ export const rootCommand = Command.make("pjt").pipe(Command.withDescription("Project scaffolding that stays in sync — drift-aware blueprints."), Command.withSubcommands([initCmd, remodelCmd, inspectCmd, buildCmd, explainCmd, addCmd]));
211
+ //# sourceMappingURL=dispatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../../src/commands/dispatch.ts"],"names":[],"mappings":"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"}