@memberjunction/cli 6.1.0-edge.2 → 6.1.0-edge.4

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 (94) hide show
  1. package/LICENSE +180 -4
  2. package/README.md +1 -1
  3. package/dist/commands/codegen/manifest.d.ts +14 -0
  4. package/dist/commands/codegen/manifest.d.ts.map +1 -1
  5. package/dist/commands/codegen/manifest.js +26 -7
  6. package/dist/commands/codegen/manifest.js.map +1 -1
  7. package/dist/commands/dev/index.d.ts +7 -0
  8. package/dist/commands/dev/index.d.ts.map +1 -0
  9. package/dist/commands/dev/index.js +11 -0
  10. package/dist/commands/dev/index.js.map +1 -0
  11. package/dist/commands/dev/usage.d.ts +7 -0
  12. package/dist/commands/dev/usage.d.ts.map +1 -0
  13. package/dist/commands/dev/usage.js +10 -0
  14. package/dist/commands/dev/usage.js.map +1 -0
  15. package/dist/commands/dev/workspace/clean.d.ts +27 -0
  16. package/dist/commands/dev/workspace/clean.d.ts.map +1 -0
  17. package/dist/commands/dev/workspace/clean.js +87 -0
  18. package/dist/commands/dev/workspace/clean.js.map +1 -0
  19. package/dist/commands/dev/workspace/doctor.d.ts +28 -0
  20. package/dist/commands/dev/workspace/doctor.d.ts.map +1 -0
  21. package/dist/commands/dev/workspace/doctor.js +62 -0
  22. package/dist/commands/dev/workspace/doctor.js.map +1 -0
  23. package/dist/commands/dev/workspace/index.d.ts +60 -0
  24. package/dist/commands/dev/workspace/index.d.ts.map +1 -0
  25. package/dist/commands/dev/workspace/index.js +279 -0
  26. package/dist/commands/dev/workspace/index.js.map +1 -0
  27. package/dist/commands/dev/workspace/status.d.ts +19 -0
  28. package/dist/commands/dev/workspace/status.d.ts.map +1 -0
  29. package/dist/commands/dev/workspace/status.js +46 -0
  30. package/dist/commands/dev/workspace/status.js.map +1 -0
  31. package/dist/commands/migrate/convert.d.ts +25 -0
  32. package/dist/commands/migrate/convert.d.ts.map +1 -1
  33. package/dist/commands/migrate/convert.js +61 -8
  34. package/dist/commands/migrate/convert.js.map +1 -1
  35. package/dist/commands/migrate/index.d.ts +9 -0
  36. package/dist/commands/migrate/index.d.ts.map +1 -1
  37. package/dist/commands/migrate/index.js +41 -1
  38. package/dist/commands/migrate/index.js.map +1 -1
  39. package/dist/lib/cli-plugins.d.ts.map +1 -1
  40. package/dist/lib/cli-plugins.js +5 -0
  41. package/dist/lib/cli-plugins.js.map +1 -1
  42. package/dist/lib/dev-workspace/build.d.ts +180 -0
  43. package/dist/lib/dev-workspace/build.d.ts.map +1 -0
  44. package/dist/lib/dev-workspace/build.js +570 -0
  45. package/dist/lib/dev-workspace/build.js.map +1 -0
  46. package/dist/lib/dev-workspace/clean.d.ts +40 -0
  47. package/dist/lib/dev-workspace/clean.d.ts.map +1 -0
  48. package/dist/lib/dev-workspace/clean.js +193 -0
  49. package/dist/lib/dev-workspace/clean.js.map +1 -0
  50. package/dist/lib/dev-workspace/detect.d.ts +56 -0
  51. package/dist/lib/dev-workspace/detect.d.ts.map +1 -0
  52. package/dist/lib/dev-workspace/detect.js +343 -0
  53. package/dist/lib/dev-workspace/detect.js.map +1 -0
  54. package/dist/lib/dev-workspace/dir-flag.d.ts +23 -0
  55. package/dist/lib/dev-workspace/dir-flag.d.ts.map +1 -0
  56. package/dist/lib/dev-workspace/dir-flag.js +24 -0
  57. package/dist/lib/dev-workspace/dir-flag.js.map +1 -0
  58. package/dist/lib/dev-workspace/doctor.d.ts +96 -0
  59. package/dist/lib/dev-workspace/doctor.d.ts.map +1 -0
  60. package/dist/lib/dev-workspace/doctor.js +400 -0
  61. package/dist/lib/dev-workspace/doctor.js.map +1 -0
  62. package/dist/lib/dev-workspace/lockfile.d.ts +62 -0
  63. package/dist/lib/dev-workspace/lockfile.d.ts.map +1 -0
  64. package/dist/lib/dev-workspace/lockfile.js +456 -0
  65. package/dist/lib/dev-workspace/lockfile.js.map +1 -0
  66. package/dist/lib/dev-workspace/member-installs.d.ts +35 -0
  67. package/dist/lib/dev-workspace/member-installs.d.ts.map +1 -0
  68. package/dist/lib/dev-workspace/member-installs.js +139 -0
  69. package/dist/lib/dev-workspace/member-installs.js.map +1 -0
  70. package/dist/lib/dev-workspace/pnpm.d.ts +29 -0
  71. package/dist/lib/dev-workspace/pnpm.d.ts.map +1 -0
  72. package/dist/lib/dev-workspace/pnpm.js +59 -0
  73. package/dist/lib/dev-workspace/pnpm.js.map +1 -0
  74. package/dist/lib/dev-workspace/status.d.ts +16 -0
  75. package/dist/lib/dev-workspace/status.d.ts.map +1 -0
  76. package/dist/lib/dev-workspace/status.js +185 -0
  77. package/dist/lib/dev-workspace/status.js.map +1 -0
  78. package/dist/lib/dev-workspace/types.d.ts +312 -0
  79. package/dist/lib/dev-workspace/types.d.ts.map +1 -0
  80. package/dist/lib/dev-workspace/types.js +14 -0
  81. package/dist/lib/dev-workspace/types.js.map +1 -0
  82. package/dist/lib/dev-workspace/usage.d.ts +30 -0
  83. package/dist/lib/dev-workspace/usage.d.ts.map +1 -0
  84. package/dist/lib/dev-workspace/usage.js +177 -0
  85. package/dist/lib/dev-workspace/usage.js.map +1 -0
  86. package/dist/lib/dev-workspace/write.d.ts +25 -0
  87. package/dist/lib/dev-workspace/write.d.ts.map +1 -0
  88. package/dist/lib/dev-workspace/write.js +75 -0
  89. package/dist/lib/dev-workspace/write.js.map +1 -0
  90. package/dist/light-commands.d.ts.map +1 -1
  91. package/dist/light-commands.js +7 -0
  92. package/dist/light-commands.js.map +1 -1
  93. package/oclif.manifest.json +1228 -969
  94. package/package.json +22 -22
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Shared types for the `mj dev workspace` generator.
3
+ *
4
+ * The generator creates the four ephemeral files that join sibling repo checkouts
5
+ * into a single pnpm workspace at their common parent directory:
6
+ * `pnpm-workspace.yaml`, `.npmrc`, `package.json`, `turbo.json`.
7
+ *
8
+ * The generated contents reproduce the manual setup this command replaces: every
9
+ * value was proven by joining these repos by hand before it was automated.
10
+ *
11
+ * @module lib/dev-workspace/types
12
+ */
13
+ export {};
14
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/dev-workspace/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Progressive-disclosure usage metadata for the `dev` domain (`mj dev usage`).
3
+ *
4
+ * SIDE EFFECT ON IMPORT: {@link RegisterDevWorkspaceUsage} is called at the bottom
5
+ * of this module, so importing it declares the domain. `lib/cli-plugins.ts` imports
6
+ * it alongside the built-in plugin modules — the single funnel both `mj usage` and
7
+ * `mj <domain> usage` go through.
8
+ *
9
+ * Why declared here rather than as `static Usage` on a BaseCLIPlugin: the dev
10
+ * commands are plain oclif Commands that ship inside the CLI and must stay
11
+ * bootstrap-free (they are in LIGHT_COMMANDS), so they are not plugin-backed. The
12
+ * text below is the ONLY place an agent learns these rules before invoking, so it
13
+ * states them outright rather than pointing at the commands' help.
14
+ *
15
+ * @module lib/dev-workspace/usage
16
+ */
17
+ import { type PluginUsage } from '@memberjunction/cli-core';
18
+ /** Usage for `mj dev workspace` — the generator. */
19
+ export declare const DEV_WORKSPACE_USAGE: PluginUsage;
20
+ /** Usage for `mj dev workspace status` — the read-only report. */
21
+ export declare const DEV_WORKSPACE_STATUS_USAGE: PluginUsage;
22
+ /** Usage for `mj dev workspace doctor` — the read-only health check. */
23
+ export declare const DEV_WORKSPACE_DOCTOR_USAGE: PluginUsage;
24
+ /** Usage for `mj dev workspace clean` — the teardown. */
25
+ export declare const DEV_WORKSPACE_CLEAN_USAGE: PluginUsage;
26
+ /** Every dev-domain usage declaration, in the order `mj dev usage` should teach them. */
27
+ export declare const DEV_DOMAIN_USAGE: readonly PluginUsage[];
28
+ /** Declares the dev domain with the usage registry. Idempotent — safe to call repeatedly. */
29
+ export declare function RegisterDevWorkspaceUsage(): void;
30
+ //# sourceMappingURL=usage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../../src/lib/dev-workspace/usage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAqB,KAAK,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAmB/E,oDAAoD;AACpD,eAAO,MAAM,mBAAmB,EAAE,WAsDjC,CAAC;AAEF,kEAAkE;AAClE,eAAO,MAAM,0BAA0B,EAAE,WAmBxC,CAAC;AAEF,wEAAwE;AACxE,eAAO,MAAM,0BAA0B,EAAE,WA2BxC,CAAC;AAEF,yDAAyD;AACzD,eAAO,MAAM,yBAAyB,EAAE,WA2BvC,CAAC;AAEF,yFAAyF;AACzF,eAAO,MAAM,gBAAgB,EAAE,SAAS,WAAW,EAKlD,CAAC;AAEF,6FAA6F;AAC7F,wBAAgB,yBAAyB,IAAI,IAAI,CAIhD"}
@@ -0,0 +1,177 @@
1
+ /**
2
+ * Progressive-disclosure usage metadata for the `dev` domain (`mj dev usage`).
3
+ *
4
+ * SIDE EFFECT ON IMPORT: {@link RegisterDevWorkspaceUsage} is called at the bottom
5
+ * of this module, so importing it declares the domain. `lib/cli-plugins.ts` imports
6
+ * it alongside the built-in plugin modules — the single funnel both `mj usage` and
7
+ * `mj <domain> usage` go through.
8
+ *
9
+ * Why declared here rather than as `static Usage` on a BaseCLIPlugin: the dev
10
+ * commands are plain oclif Commands that ship inside the CLI and must stay
11
+ * bootstrap-free (they are in LIGHT_COMMANDS), so they are not plugin-backed. The
12
+ * text below is the ONLY place an agent learns these rules before invoking, so it
13
+ * states them outright rather than pointing at the commands' help.
14
+ *
15
+ * @module lib/dev-workspace/usage
16
+ */
17
+ import { CLIPluginRegistry } from '@memberjunction/cli-core';
18
+ import { LOCKFILE_NAME, NODE_MODULES_NAME } from './clean.js';
19
+ import { WORKSPACE_DIR_ENV_VAR } from './dir-flag.js';
20
+ import { SENTINEL_FILE_NAME, WORKSPACE_FILE_NAMES } from './write.js';
21
+ /** The parent-directory contract, stated once — every command's description ends with it. */
22
+ const PARENT_DIR_RULE = `--dir must be the PLAIN directory that HOLDS the sibling repo clones, never a git repo root itself: a parent ` +
23
+ `carrying a .git entry (directory or worktree file) is refused. The member clones underneath it are of course ` +
24
+ `git repos — only the parent must not be. Defaults to the current directory, or $${WORKSPACE_DIR_ENV_VAR} when ` +
25
+ `set (an explicit --dir always wins over the environment).`;
26
+ /** Shared `--dir` flag documentation. */
27
+ const DIR_FLAG = {
28
+ name: '--dir',
29
+ type: 'string',
30
+ description: `Parent directory holding the sibling clones (default '.', or $${WORKSPACE_DIR_ENV_VAR}; must not be a git repo root)`,
31
+ };
32
+ /** Usage for `mj dev workspace` — the generator. */
33
+ export const DEV_WORKSPACE_USAGE = {
34
+ domain: 'dev',
35
+ command: 'dev:workspace',
36
+ summary: 'Join sibling repo clones into one pnpm workspace at their common parent directory.',
37
+ description: `Writes ${WORKSPACE_FILE_NAMES.join(', ')} plus the ${SENTINEL_FILE_NAME} sentinel manifest at the parent, then ` +
38
+ `runs pnpm install there (disable with --no-install). Members are detected among the parent's immediate ` +
39
+ `subdirectories: a sibling qualifies when it has a root package.json AND any of (a) an mj-app.json marker, ` +
40
+ `(b) a package its workspace globs enumerate naming or depending on the @mj-biz-apps scope, (c) a root package ` +
41
+ `name of memberjunction-workspace (the MJ monorepo). Use --include to add a repo detection missed and --exclude ` +
42
+ `to drop one. Existing files are NEVER overwritten silently — the run refuses unless --force, which keeps a ` +
43
+ `<name>.bak copy of each. Workspace globs cover each member's repo root plus the packages-rooted globs of the ` +
44
+ `member's own pnpm-workspace.yaml (packages/* when it has none) — never apps/*, ` +
45
+ `because app-shell names collide across repos. The generated parent package.json ABSORBS what each member's own ` +
46
+ `config would otherwise lose at a workspace root: member pnpm.overrides/patchedDependencies/packageExtensions/` +
47
+ `peerDependencyRules are hoisted (patch paths re-rooted to <member>/...); every member-provided package name gets ` +
48
+ `a workspace:* override so local source always beats registry copies; and pnpm.overrides pins every direct ` +
49
+ `dependency of each member's importers (plus every @types/* at any depth) to the member's COMMITTED lockfile ` +
50
+ `resolution — EXACT versions, with per-major override selectors (name@^N) when the committed graphs hold more ` +
51
+ `than one major of a name — pure file derivation, no network (unsupported lockfile formats are warned about ` +
52
+ `per member, never a silent zero). @types/* ` +
53
+ `are excluded from the devDependency union (duplicate @types break nominal typing) and workspace: specifiers on ` +
54
+ `packages no member provides are dropped — every drop, conflict and skip is reported. Members carrying a ` +
55
+ `standalone install (root or nested node_modules, detected depth-independently) are offered cleanup before the ` +
56
+ `parent install (--clean-members / --no-clean-members for non-interactive runs); skipping leaves overlapping ` +
57
+ `stores that surface as dangling symlinks. Auth SDKs and @angular/service-worker are peerDependencies of ` +
58
+ `the MJ libraries that expose them: a shell serving those features declares its own picks in its own ` +
59
+ `package.json — the command prints that guidance instead of hoisting them. Light command: no MJ bootstrap, ` +
60
+ `no database. Generated files are ephemeral — never commit them; remove them with dev workspace clean. ` +
61
+ PARENT_DIR_RULE,
62
+ flags: [
63
+ DIR_FLAG,
64
+ { name: '--include', type: 'string (repeatable)', description: 'Repo directory name to add to the detected member set' },
65
+ { name: '--exclude', type: 'string (repeatable)', description: 'Repo directory name to drop from the member set' },
66
+ { name: '--no-install', type: 'boolean', description: 'Generate the files but skip pnpm install' },
67
+ { name: '--force', type: 'boolean', description: 'Overwrite existing generated files, keeping a .bak of each' },
68
+ {
69
+ name: '--clean-members / --no-clean-members',
70
+ type: 'boolean',
71
+ description: 'Remove (or keep) members\' standalone node_modules trees before installing; omit both to be asked interactively',
72
+ },
73
+ { name: '--verbose', type: 'boolean', description: 'Show detailed output (per-entry lockfile skips, superseded pins, skipped @types)' },
74
+ ],
75
+ examples: [
76
+ 'mj dev workspace --dir ~/code/bluecypress',
77
+ 'mj dev workspace --dir ~/code/bluecypress --no-install',
78
+ 'mj dev workspace --dir ~/code/bluecypress --include bizapps-common --exclude bizapps-sonar',
79
+ `${WORKSPACE_DIR_ENV_VAR}=~/code/bluecypress mj dev workspace --force`,
80
+ ],
81
+ runtime: {
82
+ class: 'variable',
83
+ typicalSeconds: 90,
84
+ note: 'file generation is under a second; pnpm install dominates and scales with the members\' dependency graph (--no-install skips it)',
85
+ },
86
+ };
87
+ /** Usage for `mj dev workspace status` — the read-only report. */
88
+ export const DEV_WORKSPACE_STATUS_USAGE = {
89
+ domain: 'dev',
90
+ command: 'dev:workspace:status',
91
+ summary: 'Report the state of a generated cross-repo workspace at a parent directory.',
92
+ description: `Read-only: writes nothing. Reports which generated files exist, whether ${LOCKFILE_NAME} and ` +
93
+ `${NODE_MODULES_NAME} are present, whether the ${SENTINEL_FILE_NAME} sentinel is there (proof the workspace ` +
94
+ `came from this generator, and what dev workspace clean requires), the members parsed from ` +
95
+ `pnpm-workspace.yaml versus the candidates detected on disk right now, which members are missing from disk, ` +
96
+ `how --dir was resolved (flag, environment, or default), and whether the active pnpm version matches the ` +
97
+ `generated pin. Run it before clean to see what a teardown would touch. Light command: no MJ bootstrap. ` +
98
+ PARENT_DIR_RULE,
99
+ flags: [DIR_FLAG],
100
+ examples: [
101
+ 'mj dev workspace status',
102
+ 'mj dev workspace status --dir ~/code/bluecypress',
103
+ `${WORKSPACE_DIR_ENV_VAR}=~/code/bluecypress mj dev workspace status`,
104
+ ],
105
+ runtime: { class: 'fast', typicalSeconds: 1, note: 'one `pnpm --version` probe plus directory reads' },
106
+ };
107
+ /** Usage for `mj dev workspace doctor` — the read-only health check. */
108
+ export const DEV_WORKSPACE_DOCTOR_USAGE = {
109
+ domain: 'dev',
110
+ command: 'dev:workspace:doctor',
111
+ summary: 'Health-check a generated cross-repo workspace and exit non-zero on any failure.',
112
+ description: `Read-only: writes nothing, deletes nothing, no network. Prints one [PASS]/[WARN]/[FAIL]/[SKIP] line per check ` +
113
+ `and EXITS NON-ZERO when any check FAILS, so it can gate a script (status never exits non-zero — that is the ` +
114
+ `difference between the two). FAIL: the parent is itself a git repo root; a generated file is missing; a member ` +
115
+ `named in pnpm-workspace.yaml has no directory on disk (the parent manifest overrides that member's packages to ` +
116
+ `workspace:*, so pnpm install fails outright); a member carries a STANDALONE INSTALL — a member-root ` +
117
+ `${NODE_MODULES_NAME}/.pnpm store or npm .package-lock.json marker, NOT the plain ${NODE_MODULES_NAME} a healthy ` +
118
+ `parent install leaves inside every member; or the one-copy census finds more than one version of a package that ` +
119
+ `must be single-copy. WARN: not installed yet, no valid ${SENTINEL_FILE_NAME}, a pnpm pin/active mismatch, or a ` +
120
+ `detected repo that is not a workspace member. The one-copy census reads the DIRECTORY NAMES in the parent's ` +
121
+ `${NODE_MODULES_NAME}/.pnpm store (each already encodes name@version) and counts distinct versions of ` +
122
+ `@angular/core, @angular/common, @angular/compiler, rxjs, zone.js, @memberjunction/core and ` +
123
+ `@memberjunction/global — two copies of any of them is a second, mutually invisible runtime (Angular DI throws ` +
124
+ `NG0203; two Global Object Stores make every BaseSingleton two singletons), which is why it is a FAIL and not a ` +
125
+ `warning. Packages absent from the store are skipped, not failed. Light command: no MJ bootstrap. ` +
126
+ PARENT_DIR_RULE,
127
+ flags: [DIR_FLAG],
128
+ examples: [
129
+ 'mj dev workspace doctor',
130
+ 'mj dev workspace doctor --dir ~/code/bluecypress',
131
+ `${WORKSPACE_DIR_ENV_VAR}=~/code/bluecypress mj dev workspace doctor`,
132
+ ],
133
+ runtime: { class: 'fast', typicalSeconds: 1, note: 'one `pnpm --version` probe, directory reads, and one listing of the parent store' },
134
+ };
135
+ /** Usage for `mj dev workspace clean` — the teardown. */
136
+ export const DEV_WORKSPACE_CLEAN_USAGE = {
137
+ domain: 'dev',
138
+ command: 'dev:workspace:clean',
139
+ summary: 'Remove the generated workspace files, lockfile and node_modules at a parent directory.',
140
+ description: `Deletes exactly what the generator owns — ${WORKSPACE_FILE_NAMES.join(', ')}, ${LOCKFILE_NAME}, the ` +
141
+ `${NODE_MODULES_NAME} tree, and ${SENTINEL_FILE_NAME} last — and nothing else: member repo checkouts and any ` +
142
+ `.bak backups are left alone and reported. Without --force a valid ${SENTINEL_FILE_NAME} must be present, so ` +
143
+ `clean refuses to tear down a workspace it cannot prove it generated (hand-made or pre-sentinel ones need ` +
144
+ `--force). Use --dry-run first: it lists the paths that exist and exits 0 without deleting, and combines with ` +
145
+ `--force to preview a sentinel-less parent. Paths already gone are reported, not errors, so a repeat run is ` +
146
+ `safe. Light command: no MJ bootstrap. ` + PARENT_DIR_RULE,
147
+ flags: [
148
+ DIR_FLAG,
149
+ { name: '--dry-run', type: 'boolean', description: 'List what would be removed and exit without deleting' },
150
+ { name: '--force', type: 'boolean', description: `Clean even without a valid ${SENTINEL_FILE_NAME} sentinel` },
151
+ ],
152
+ examples: [
153
+ 'mj dev workspace clean --dir ~/code/bluecypress --dry-run',
154
+ 'mj dev workspace clean --dir ~/code/bluecypress',
155
+ 'mj dev workspace clean --dir ~/code/bluecypress --dry-run --force',
156
+ ],
157
+ runtime: {
158
+ class: 'moderate',
159
+ typicalSeconds: 10,
160
+ note: `removing the ${NODE_MODULES_NAME} tree dominates; --dry-run is instant`,
161
+ },
162
+ };
163
+ /** Every dev-domain usage declaration, in the order `mj dev usage` should teach them. */
164
+ export const DEV_DOMAIN_USAGE = [
165
+ DEV_WORKSPACE_USAGE,
166
+ DEV_WORKSPACE_STATUS_USAGE,
167
+ DEV_WORKSPACE_DOCTOR_USAGE,
168
+ DEV_WORKSPACE_CLEAN_USAGE,
169
+ ];
170
+ /** Declares the dev domain with the usage registry. Idempotent — safe to call repeatedly. */
171
+ export function RegisterDevWorkspaceUsage() {
172
+ for (const usage of DEV_DOMAIN_USAGE) {
173
+ CLIPluginRegistry.RegisterUsage(usage);
174
+ }
175
+ }
176
+ RegisterDevWorkspaceUsage();
177
+ //# sourceMappingURL=usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.js","sourceRoot":"","sources":["../../../src/lib/dev-workspace/usage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { GeneratedFile, WriteResult } from './types.js';
2
+ /** The four workspace files `mj dev workspace` owns at the parent directory. */
3
+ export declare const WORKSPACE_FILE_NAMES: readonly string[];
4
+ /**
5
+ * The sentinel manifest, written through this module like any other generated
6
+ * file (so the never-overwrite-silently rule covers it too). Its presence is what
7
+ * lets `mj dev workspace clean` prove the residue at a parent is its own.
8
+ */
9
+ export declare const SENTINEL_FILE_NAME = ".mj-dev-workspace.json";
10
+ /** Every file `mj dev workspace` writes at the parent: the four plus the sentinel. */
11
+ export declare const GENERATED_FILE_NAMES: readonly string[];
12
+ /**
13
+ * Throws unless the parent directory is a plain directory that is NOT a git repo
14
+ * root (`.git` may be a directory or a worktree file — both disqualify).
15
+ */
16
+ export declare function AssertParentDirSafe(parentDir: string): void;
17
+ /** Names among the generated files that already exist at the parent. */
18
+ export declare function FindExistingFiles(parentDir: string, fileNames: readonly string[]): string[];
19
+ /**
20
+ * Writes the generated files at the parent directory.
21
+ * Without `force`, refuses (throws) if ANY of the files already exists.
22
+ * With `force`, each existing file is first copied to `<name>.bak`.
23
+ */
24
+ export declare function WriteWorkspaceFiles(parentDir: string, files: readonly GeneratedFile[], force: boolean): WriteResult;
25
+ //# sourceMappingURL=write.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../../src/lib/dev-workspace/write.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE7D,gFAAgF;AAChF,eAAO,MAAM,oBAAoB,EAAE,SAAS,MAAM,EAKjD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,2BAA2B,CAAC;AAE3D,sFAAsF;AACtF,eAAO,MAAM,oBAAoB,EAAE,SAAS,MAAM,EAAkD,CAAC;AAErG;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAa3D;AAED,wEAAwE;AACxE,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAE3F;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,aAAa,EAAE,EAAE,KAAK,EAAE,OAAO,GAAG,WAAW,CAqBnH"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * File writing (and the safety gates around it) for `mj dev workspace`.
3
+ *
4
+ * SIDE EFFECTS: writes the generated files at the parent directory. Two hard
5
+ * safety rules, both from the program brief:
6
+ * 1. NEVER overwrite an existing parent file silently — refuse with a clear
7
+ * message unless forced, and when forced save a `<name>.bak` copy first.
8
+ * 2. Refuse to operate when the parent directory is itself a git repo root —
9
+ * the workspace parent must be a plain directory holding sibling clones.
10
+ *
11
+ * @module lib/dev-workspace/write
12
+ */
13
+ import { copyFileSync, existsSync, statSync, writeFileSync } from 'node:fs';
14
+ import path from 'node:path';
15
+ /** The four workspace files `mj dev workspace` owns at the parent directory. */
16
+ export const WORKSPACE_FILE_NAMES = [
17
+ 'pnpm-workspace.yaml',
18
+ '.npmrc',
19
+ 'package.json',
20
+ 'turbo.json',
21
+ ];
22
+ /**
23
+ * The sentinel manifest, written through this module like any other generated
24
+ * file (so the never-overwrite-silently rule covers it too). Its presence is what
25
+ * lets `mj dev workspace clean` prove the residue at a parent is its own.
26
+ */
27
+ export const SENTINEL_FILE_NAME = '.mj-dev-workspace.json';
28
+ /** Every file `mj dev workspace` writes at the parent: the four plus the sentinel. */
29
+ export const GENERATED_FILE_NAMES = [...WORKSPACE_FILE_NAMES, SENTINEL_FILE_NAME];
30
+ /**
31
+ * Throws unless the parent directory is a plain directory that is NOT a git repo
32
+ * root (`.git` may be a directory or a worktree file — both disqualify).
33
+ */
34
+ export function AssertParentDirSafe(parentDir) {
35
+ if (!path.isAbsolute(parentDir)) {
36
+ throw new Error(`Parent directory must be an absolute path, got: ${parentDir}`);
37
+ }
38
+ if (!existsSync(parentDir) || !statSync(parentDir).isDirectory()) {
39
+ throw new Error(`Parent directory does not exist or is not a directory: ${parentDir}`);
40
+ }
41
+ if (existsSync(path.join(parentDir, '.git'))) {
42
+ throw new Error(`${parentDir} looks like a git repo root (.git present). The workspace parent must be the plain ` +
43
+ `directory that HOLDS your sibling clones — run again with --dir pointing at the repos' common parent.`);
44
+ }
45
+ }
46
+ /** Names among the generated files that already exist at the parent. */
47
+ export function FindExistingFiles(parentDir, fileNames) {
48
+ return fileNames.filter((name) => existsSync(path.join(parentDir, name)));
49
+ }
50
+ /**
51
+ * Writes the generated files at the parent directory.
52
+ * Without `force`, refuses (throws) if ANY of the files already exists.
53
+ * With `force`, each existing file is first copied to `<name>.bak`.
54
+ */
55
+ export function WriteWorkspaceFiles(parentDir, files, force) {
56
+ AssertParentDirSafe(parentDir);
57
+ const existing = FindExistingFiles(parentDir, files.map((f) => f.Name));
58
+ if (existing.length > 0 && !force) {
59
+ throw new Error(`Refusing to overwrite existing file(s) at ${parentDir}: ${existing.join(', ')}. ` +
60
+ `Re-run with --force to overwrite (a .bak copy of each will be kept).`);
61
+ }
62
+ const backedUp = [];
63
+ for (const name of existing) {
64
+ const target = path.join(parentDir, name);
65
+ copyFileSync(target, `${target}.bak`);
66
+ backedUp.push(`${name}.bak`);
67
+ }
68
+ const written = [];
69
+ for (const file of files) {
70
+ writeFileSync(path.join(parentDir, file.Name), file.Content, 'utf8');
71
+ written.push(file.Name);
72
+ }
73
+ return { Written: written, BackedUp: backedUp };
74
+ }
75
+ //# sourceMappingURL=write.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write.js","sourceRoot":"","sources":["../../../src/lib/dev-workspace/write.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC5E,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,gFAAgF;AAChF,MAAM,CAAC,MAAM,oBAAoB,GAAsB;IACrD,qBAAqB;IACrB,QAAQ;IACR,cAAc;IACd,YAAY;CACb,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,wBAAwB,CAAC;AAE3D,sFAAsF;AACtF,MAAM,CAAC,MAAM,oBAAoB,GAAsB,CAAC,GAAG,oBAAoB,EAAE,kBAAkB,CAAC,CAAC;AAErG;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,SAAiB;IACnD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,mDAAmD,SAAS,EAAE,CAAC,CAAC;IAClF,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QACjE,MAAM,IAAI,KAAK,CAAC,0DAA0D,SAAS,EAAE,CAAC,CAAC;IACzF,CAAC;IACD,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CACb,GAAG,SAAS,qFAAqF;YAC/F,uGAAuG,CAC1G,CAAC;IACJ,CAAC;AACH,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,iBAAiB,CAAC,SAAiB,EAAE,SAA4B;IAC/E,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;AAC5E,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,SAAiB,EAAE,KAA+B,EAAE,KAAc;IACpG,mBAAmB,CAAC,SAAS,CAAC,CAAC;IAC/B,MAAM,QAAQ,GAAG,iBAAiB,CAAC,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACxE,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CACb,6CAA6C,SAAS,KAAK,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;YAChF,sEAAsE,CACzE,CAAC;IACJ,CAAC;IACD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAC1C,YAAY,CAAC,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,CAAC;QACtC,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,MAAM,CAAC,CAAC;IAC/B,CAAC;IACD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACrE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AAClD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"light-commands.d.ts","sourceRoot":"","sources":["../src/light-commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,cAAc,EAAE,WAAW,CAAC,MAAM,CA4D7C,CAAC"}
1
+ {"version":3,"file":"light-commands.d.ts","sourceRoot":"","sources":["../src/light-commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,cAAc,EAAE,WAAW,CAAC,MAAM,CAoE7C,CAAC"}
@@ -22,6 +22,7 @@ export const LIGHT_COMMANDS = new Set([
22
22
  'usage',
23
23
  'sync usage',
24
24
  'codegen usage',
25
+ 'dev usage',
25
26
  // Plugin registry editing — just writes mj-cli-plugins.json
26
27
  'plugin add',
27
28
  // Bump - uses zod, fast-glob, fs only
@@ -42,6 +43,12 @@ export const LIGHT_COMMANDS = new Set([
42
43
  'ai audit',
43
44
  'test',
44
45
  'dbdoc',
46
+ 'dev',
47
+ // Dev workspace generator - node stdlib + chalk only, no bootstrap
48
+ 'dev workspace',
49
+ 'dev workspace status',
50
+ 'dev workspace doctor',
51
+ 'dev workspace clean',
45
52
  // SQL conversion commands - use @memberjunction/sql-converter + sqlglot-ts only
46
53
  'sql-convert',
47
54
  'sql-audit',
@@ -1 +1 @@
1
- {"version":3,"file":"light-commands.js","sourceRoot":"","sources":["../src/light-commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,cAAc,GAAwB,IAAI,GAAG,CAAC;IACzD,yBAAyB;IACzB,SAAS;IACT,MAAM;IAEN,0EAA0E;IAC1E,qEAAqE;IACrE,OAAO;IACP,YAAY;IACZ,eAAe;IAEf,4DAA4D;IAC5D,YAAY;IAEZ,sCAAsC;IACtC,MAAM;IAEN,oEAAoE;IACpE,OAAO;IACP,SAAS;IACT,iBAAiB;IACjB,gBAAgB;IAEhB,qFAAqF;IACrF,SAAS;IAET,6EAA6E;IAC7E,QAAQ;IAER,4FAA4F;IAC5F,QAAQ;IAER,kEAAkE;IAClE,IAAI;IACJ,UAAU;IACV,MAAM;IACN,OAAO;IAEP,gFAAgF;IAChF,aAAa;IACb,WAAW;IAEX,8EAA8E;IAC9E,oCAAoC;IACpC,gBAAgB;IAChB,eAAe;IAEf,kGAAkG;IAClG,yFAAyF;IACzF,+FAA+F;IAC/F,kBAAkB;IAElB,0DAA0D;IAC1D,YAAY;IACZ,eAAe;IACf,cAAc;IACd,6BAA6B;IAC7B,wBAAwB;IACxB,aAAa;IACb,cAAc;CACf,CAAC,CAAC"}
1
+ {"version":3,"file":"light-commands.js","sourceRoot":"","sources":["../src/light-commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,cAAc,GAAwB,IAAI,GAAG,CAAC;IACzD,yBAAyB;IACzB,SAAS;IACT,MAAM;IAEN,0EAA0E;IAC1E,qEAAqE;IACrE,OAAO;IACP,YAAY;IACZ,eAAe;IACf,WAAW;IAEX,4DAA4D;IAC5D,YAAY;IAEZ,sCAAsC;IACtC,MAAM;IAEN,oEAAoE;IACpE,OAAO;IACP,SAAS;IACT,iBAAiB;IACjB,gBAAgB;IAEhB,qFAAqF;IACrF,SAAS;IAET,6EAA6E;IAC7E,QAAQ;IAER,4FAA4F;IAC5F,QAAQ;IAER,kEAAkE;IAClE,IAAI;IACJ,UAAU;IACV,MAAM;IACN,OAAO;IACP,KAAK;IAEL,mEAAmE;IACnE,eAAe;IACf,sBAAsB;IACtB,sBAAsB;IACtB,qBAAqB;IAErB,gFAAgF;IAChF,aAAa;IACb,WAAW;IAEX,8EAA8E;IAC9E,oCAAoC;IACpC,gBAAgB;IAChB,eAAe;IAEf,kGAAkG;IAClG,yFAAyF;IACzF,+FAA+F;IAC/F,kBAAkB;IAElB,0DAA0D;IAC1D,YAAY;IACZ,eAAe;IACf,cAAc;IACd,6BAA6B;IAC7B,wBAAwB;IACxB,aAAa;IACb,cAAc;CACf,CAAC,CAAC"}