nx-npm-tools 0.2.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 ADDED
@@ -0,0 +1,52 @@
1
+ # nx-npm-tools
2
+
3
+ Install globally:
4
+ ```bash
5
+ npm i -g nx-npm-tools
6
+ ```
7
+
8
+ ## Prometheus mode (default)
9
+
10
+ If you run commands without `--path`, it auto-walks upward until it finds a folder named `prometheus` and uses it as the station root.
11
+
12
+ Alias:
13
+
14
+ * `--pro` is the same as `--prometheus`
15
+
16
+ ## Commands
17
+
18
+ ### runOnce (per-station setup)
19
+
20
+ ```bash
21
+ nx-npm-tools runOnce --pro --add-ncu --commit
22
+ ```
23
+
24
+ ### reportStation (visibility report)
25
+
26
+ ```bash
27
+ nx-npm-tools reportStation --pro --out station-report.md
28
+ ```
29
+
30
+ ### publishStation (publish everything in dependency order)
31
+
32
+ ```bash
33
+ nx-npm-tools publishStation --pro --access public --bump patch
34
+ ```
35
+
36
+ Force clean install per package:
37
+
38
+ ```bash
39
+ nx-npm-tools publishStation --pro --forceInstall --access public --bump patch
40
+ ```
41
+
42
+ Publish one repo/package:
43
+
44
+ ```bash
45
+ nx-npm-tools publishOne --cwd . --access public --bump patch
46
+ ```
47
+
48
+ Git sync:
49
+
50
+ ```bash
51
+ nx-npm-tools gitSync --message "publishing"
52
+ ```
@@ -0,0 +1,26 @@
1
+ import { Command } from "commander";
2
+ import path from "node:path";
3
+ import { gitAddCommitPush } from "../utils/git.js";
4
+ export function gitSyncCommand() {
5
+ return new Command("gitSync")
6
+ .description("git add . + git commit + git push (optional upstream forcing)")
7
+ .option("--cwd <path>", "Repo folder (default: current dir)", process.cwd())
8
+ .option("--message <msg>", "Commit message", "publishing")
9
+ .option("--no-push", "Don't push")
10
+ .option("--remote <name>", "Remote name", "origin")
11
+ .option("--branch <name>", "Branch name (optional)")
12
+ .option("--set-upstream", "Push with --set-upstream (needs --branch)")
13
+ .option("--force-upstream", "Push with --force-with-lease")
14
+ .action(async (opts) => {
15
+ const cwd = path.resolve(opts.cwd);
16
+ await gitAddCommitPush(cwd, {
17
+ message: opts.message,
18
+ push: Boolean(opts.push),
19
+ remote: opts.remote,
20
+ branch: opts.branch,
21
+ setUpstream: Boolean(opts.setUpstream),
22
+ forceWithLease: Boolean(opts.forceUpstream)
23
+ });
24
+ });
25
+ }
26
+ //# sourceMappingURL=gitSync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitSync.js","sourceRoot":"","sources":["../../src/commands/gitSync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,MAAM,UAAU,cAAc;IAC5B,OAAO,IAAI,OAAO,CAAC,SAAS,CAAC;SAC1B,WAAW,CAAC,+DAA+D,CAAC;SAC5E,MAAM,CAAC,cAAc,EAAE,oCAAoC,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;SAC3E,MAAM,CAAC,iBAAiB,EAAE,gBAAgB,EAAE,YAAY,CAAC;SACzD,MAAM,CAAC,WAAW,EAAE,YAAY,CAAC;SACjC,MAAM,CAAC,iBAAiB,EAAE,aAAa,EAAE,QAAQ,CAAC;SAClD,MAAM,CAAC,iBAAiB,EAAE,wBAAwB,CAAC;SACnD,MAAM,CAAC,gBAAgB,EAAE,2CAA2C,CAAC;SACrE,MAAM,CAAC,kBAAkB,EAAE,8BAA8B,CAAC;SAC1D,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEnC,MAAM,gBAAgB,CAAC,GAAG,EAAE;YAC1B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YACxB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC;YACtC,cAAc,EAAE,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC;SAC5C,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,40 @@
1
+ import { Command } from "commander";
2
+ import path from "node:path";
3
+ import { publishPackageFlow } from "../utils/git.js";
4
+ export function publishOneCommand() {
5
+ return new Command("publishOne")
6
+ .description("Publish ONE package repo: install -> gitSync -> build -> dist check -> bump -> publish")
7
+ .option("--cwd <path>", "Package folder (default: current dir)", process.cwd())
8
+ .option("--message <msg>", "Git commit message", "publishing")
9
+ .option("--forceInstall", "Force reinstall (rm node_modules + lock + cache clean)")
10
+ .option("--no-push", "Don't push")
11
+ .option("--remote <name>", "Remote name", "origin")
12
+ .option("--branch <name>", "Branch name (optional)")
13
+ .option("--set-upstream", "Push with --set-upstream (needs --branch)")
14
+ .option("--force-upstream", "Push with --force-with-lease")
15
+ .option("--build-script <name>", "Build script name", "build")
16
+ .option("--dist-check <path>", "File to verify after build", "dist/index.js")
17
+ .option("--bump <type>", "npm version bump (patch|minor|major|none)", "patch")
18
+ .option("--access <type>", "npm publish access (public|restricted)", "public")
19
+ .option("--tag <name>", "npm dist-tag (optional)", "")
20
+ .option("--dry-run", "Don't execute commands", false)
21
+ .action(async (opts) => {
22
+ const cwd = path.resolve(opts.cwd);
23
+ await publishPackageFlow(cwd, {
24
+ message: opts.message,
25
+ forceInstall: Boolean(opts.forceInstall),
26
+ push: Boolean(opts.push),
27
+ remote: opts.remote,
28
+ branch: opts.branch,
29
+ setUpstream: Boolean(opts.setUpstream),
30
+ forceWithLease: Boolean(opts.forceUpstream),
31
+ buildScript: opts.buildScript,
32
+ distCheck: opts.distCheck,
33
+ bump: opts.bump,
34
+ access: opts.access,
35
+ tag: String(opts.tag || ""),
36
+ dryRun: Boolean(opts.dryRun)
37
+ });
38
+ });
39
+ }
40
+ //# sourceMappingURL=publishOne.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publishOne.js","sourceRoot":"","sources":["../../src/commands/publishOne.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErD,MAAM,UAAU,iBAAiB;IAC/B,OAAO,IAAI,OAAO,CAAC,YAAY,CAAC;SAC7B,WAAW,CAAC,wFAAwF,CAAC;SACrG,MAAM,CAAC,cAAc,EAAE,uCAAuC,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;SAC9E,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,EAAE,YAAY,CAAC;SAC7D,MAAM,CAAC,gBAAgB,EAAE,wDAAwD,CAAC;SAClF,MAAM,CAAC,WAAW,EAAE,YAAY,CAAC;SACjC,MAAM,CAAC,iBAAiB,EAAE,aAAa,EAAE,QAAQ,CAAC;SAClD,MAAM,CAAC,iBAAiB,EAAE,wBAAwB,CAAC;SACnD,MAAM,CAAC,gBAAgB,EAAE,2CAA2C,CAAC;SACrE,MAAM,CAAC,kBAAkB,EAAE,8BAA8B,CAAC;SAC1D,MAAM,CAAC,uBAAuB,EAAE,mBAAmB,EAAE,OAAO,CAAC;SAC7D,MAAM,CAAC,qBAAqB,EAAE,4BAA4B,EAAE,eAAe,CAAC;SAC5E,MAAM,CAAC,eAAe,EAAE,2CAA2C,EAAE,OAAO,CAAC;SAC7E,MAAM,CAAC,iBAAiB,EAAE,wCAAwC,EAAE,QAAQ,CAAC;SAC7E,MAAM,CAAC,cAAc,EAAE,yBAAyB,EAAE,EAAE,CAAC;SACrD,MAAM,CAAC,WAAW,EAAE,wBAAwB,EAAE,KAAK,CAAC;SACpD,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEnC,MAAM,kBAAkB,CAAC,GAAG,EAAE;YAC5B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,YAAY,EAAE,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC;YACxC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YACxB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC;YACtC,cAAc,EAAE,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC;YAC3C,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC;YAC3B,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;SAC7B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,86 @@
1
+ import { Command } from "commander";
2
+ import { resolveStationRoot } from "../utils/path.js";
3
+ import { discoverStationInventory } from "../station/discover.js";
4
+ import { buildStationGraph } from "../station/graph.js";
5
+ import { publishPackageFlow } from "../utils/git.js";
6
+ export function publishStationCommand() {
7
+ return new Command("publishStation")
8
+ .description("Publish ALL station packages in dependency order (prometheus mode default).")
9
+ .option("--path <folder>", "Explicit station root folder (overrides prometheus mode)")
10
+ .option("--prometheus", "Use prometheus mode")
11
+ .option("--pro", "Alias of --prometheus")
12
+ .option("--prometheus-name <folder>", "Prometheus folder name", "prometheus")
13
+ .option("--max-up <n>", "Max parent hops", (v) => Number(v), 120)
14
+ .option("--message <msg>", "Git commit message", "publishing")
15
+ .option("--forceInstall", "Force reinstall per package")
16
+ .option("--no-push", "Don't push")
17
+ .option("--remote <name>", "Remote name", "origin")
18
+ .option("--branch <name>", "Branch name (optional)")
19
+ .option("--set-upstream", "Push with --set-upstream (needs --branch)")
20
+ .option("--force-upstream", "Push with --force-with-lease")
21
+ .option("--build-script <name>", "Build script name", "build")
22
+ .option("--dist-check <path>", "File to verify after build", "dist/index.js")
23
+ .option("--bump <type>", "npm version bump (patch|minor|major|none)", "patch")
24
+ .option("--access <type>", "npm publish access (public|restricted)", "public")
25
+ .option("--tag <name>", "npm dist-tag (optional)", "")
26
+ .option("--include-private", "Include packages marked private=true (NOT recommended)", false)
27
+ .option("--only <names>", "Comma-separated package names to publish (still ordered)", "")
28
+ .option("--dry-run", "Don't execute commands", false)
29
+ .action(async (opts) => {
30
+ const stationRoot = resolveStationRoot({
31
+ path: opts.path,
32
+ prometheus: opts.prometheus,
33
+ pro: opts.pro,
34
+ prometheusName: opts.prometheusName,
35
+ maxUp: opts.maxUp
36
+ });
37
+ console.log(`Station root: ${stationRoot}`);
38
+ const inv = await discoverStationInventory(stationRoot);
39
+ const graph = buildStationGraph(inv);
40
+ if (graph.issues.length) {
41
+ console.log("Graph issues:");
42
+ for (const i of graph.issues) {
43
+ if (i.type === "cycle")
44
+ console.log(`- cycle detected among: ${i.cycle.join(", ")}`);
45
+ if (i.type === "missingLocalDep")
46
+ console.log(`- ${i.package} missing local dep: ${i.missing}`);
47
+ }
48
+ console.log("");
49
+ }
50
+ let names = graph.topo;
51
+ if (!opts.includePrivate) {
52
+ names = names.filter(n => !(graph.nodes.get(n)?.private));
53
+ }
54
+ if (opts.only) {
55
+ const set = new Set(String(opts.only).split(",").map(s => s.trim()).filter(Boolean));
56
+ names = names.filter(n => set.has(n));
57
+ }
58
+ const publishables = names
59
+ .map(n => graph.nodes.get(n))
60
+ .filter(p => p.publishable);
61
+ console.log(`Publish order (${publishables.length}):`);
62
+ for (const p of publishables)
63
+ console.log(`- ${p.name} @ ${p.version} (${p.cwd})`);
64
+ console.log("");
65
+ for (const p of publishables) {
66
+ console.log(`\n=== Publishing: ${p.name} (${p.cwd}) ===`);
67
+ await publishPackageFlow(p.cwd, {
68
+ message: opts.message,
69
+ forceInstall: Boolean(opts.forceInstall),
70
+ push: Boolean(opts.push),
71
+ remote: opts.remote,
72
+ branch: opts.branch,
73
+ setUpstream: Boolean(opts.setUpstream),
74
+ forceWithLease: Boolean(opts.forceUpstream),
75
+ buildScript: opts.buildScript,
76
+ distCheck: opts.distCheck,
77
+ bump: opts.bump,
78
+ access: opts.access,
79
+ tag: String(opts.tag || ""),
80
+ dryRun: Boolean(opts.dryRun)
81
+ });
82
+ }
83
+ console.log("\n✅ Station publish finished.");
84
+ });
85
+ }
86
+ //# sourceMappingURL=publishStation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publishStation.js","sourceRoot":"","sources":["../../src/commands/publishStation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ import { Command } from "commander";
2
+ import path from "node:path";
3
+ import { resolveStationRoot } from "../utils/path.js";
4
+ import { discoverStationInventory } from "../station/discover.js";
5
+ import { buildStationGraph } from "../station/graph.js";
6
+ import { writeText } from "../utils/fs.js";
7
+ export function reportStationCommand() {
8
+ return new Command("reportStation")
9
+ .description("Generate a Markdown report of station packages, relationships, and publish order.")
10
+ .option("--path <folder>", "Explicit station root folder (overrides prometheus mode)")
11
+ .option("--prometheus", "Use prometheus mode")
12
+ .option("--pro", "Alias of --prometheus")
13
+ .option("--prometheus-name <folder>", "Prometheus folder name", "prometheus")
14
+ .option("--max-up <n>", "Max parent hops", (v) => Number(v), 120)
15
+ .option("--out <file>", "Write report to file (otherwise prints to stdout)", "")
16
+ .action(async (opts) => {
17
+ const stationRoot = resolveStationRoot({
18
+ path: opts.path,
19
+ prometheus: opts.prometheus,
20
+ pro: opts.pro,
21
+ prometheusName: opts.prometheusName,
22
+ maxUp: opts.maxUp
23
+ });
24
+ const inv = await discoverStationInventory(stationRoot);
25
+ const graph = buildStationGraph(inv);
26
+ const lines = [];
27
+ lines.push(`# Station Report`);
28
+ lines.push(`- Station root: \`${stationRoot}\``);
29
+ lines.push(`- Packages discovered: **${inv.packages.length}**`);
30
+ lines.push("");
31
+ if (graph.issues.length) {
32
+ lines.push(`## Issues`);
33
+ for (const i of graph.issues) {
34
+ if (i.type === "cycle")
35
+ lines.push(`- ⚠️ Cycle detected among: ${i.cycle.join(", ")}`);
36
+ if (i.type === "missingLocalDep")
37
+ lines.push(`- ⚠️ ${i.package} missing local dep: ${i.missing}`);
38
+ }
39
+ lines.push("");
40
+ }
41
+ lines.push(`## Publish order (deps first)`);
42
+ for (const name of graph.topo) {
43
+ const p = graph.nodes.get(name);
44
+ lines.push(`- ${p.private ? "🔒" : "📦"} \`${p.name}\` @ \`${p.version}\`${p.publishable ? "" : " (not publishable?)"} — \`${p.cwd}\``);
45
+ }
46
+ lines.push("");
47
+ lines.push(`## Packages`);
48
+ lines.push(`| Package | Version | Private | Publishable | Repo | Path | Local deps |`);
49
+ lines.push(`|---|---:|:---:|:---:|---|---|---|`);
50
+ for (const p of inv.packages) {
51
+ const localDeps = [...(graph.edges.get(p.name) ?? [])].sort().join(", ");
52
+ lines.push(`| \`${p.name}\` | \`${p.version}\` | ${p.private ? "yes" : "no"} | ${p.publishable ? "yes" : "no"} | \`${p.repoRoot}\` | \`${p.cwd}\` | ${localDeps ? localDeps : ""} |`);
53
+ }
54
+ lines.push("");
55
+ lines.push(`## Notes`);
56
+ lines.push(`- Local deps are inferred from dependencies/devDependencies/peerDependencies/optionalDependencies that match other discovered package names.`);
57
+ lines.push(`- Publish order is a topological sort (dependencies first). Cycles are reported and then appended in stable order.`);
58
+ lines.push("");
59
+ const out = lines.join("\n");
60
+ if (opts.out) {
61
+ const outPath = path.resolve(opts.out);
62
+ writeText(outPath, out);
63
+ console.log(`Wrote report: ${outPath}`);
64
+ }
65
+ else {
66
+ console.log(out);
67
+ }
68
+ });
69
+ }
70
+ //# sourceMappingURL=reportStation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reportStation.js","sourceRoot":"","sources":["../../src/commands/reportStation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ import { Command } from "commander";
2
+ import path from "node:path";
3
+ import { resolveStationRoot } from "../utils/path.js";
4
+ import { discoverStationInventory } from "../station/discover.js";
5
+ import { ensureRenovateConfig, ensureNcuScript } from "../utils/git.js";
6
+ export function runOnceCommand() {
7
+ const cmd = new Command("runOnce")
8
+ .description("Station-wide one-time setup: ensure renovate.json, optional deps:latest, optional commit+push.")
9
+ .option("--path <folder>", "Explicit station root folder (overrides prometheus mode)")
10
+ .option("--prometheus", "Use prometheus mode (walk up to folder named prometheus)")
11
+ .option("--pro", "Alias of --prometheus")
12
+ .option("--prometheus-name <folder>", "Prometheus folder name", "prometheus")
13
+ .option("--max-up <n>", "Max parent hops", (v) => Number(v), 120)
14
+ .option("--add-ncu", "Add deps:latest script (ncu)")
15
+ .option("--commit", "Commit changes (per repo) if any")
16
+ .option("--push", "Push changes (per repo) if any", true)
17
+ .option("--message <msg>", "Commit message", "chore: add/update renovate config")
18
+ .option("--dry-run", "No writes", false)
19
+ .action(async (opts) => {
20
+ const stationRoot = resolveStationRoot({
21
+ path: opts.path,
22
+ prometheus: opts.prometheus,
23
+ pro: opts.pro,
24
+ prometheusName: opts.prometheusName,
25
+ maxUp: opts.maxUp
26
+ });
27
+ console.log(`Station root: ${stationRoot}`);
28
+ const inv = await discoverStationInventory(stationRoot);
29
+ // group by repoRoot
30
+ const repos = new Map(); // repoRoot -> packageJsonPaths under it
31
+ for (const p of inv.packages) {
32
+ const list = repos.get(p.repoRoot) ?? [];
33
+ list.push(p.packageJsonPath);
34
+ repos.set(p.repoRoot, list);
35
+ }
36
+ console.log(`Found ${repos.size} repo(s), ${inv.packages.length} package(s).`);
37
+ let ok = 0, fail = 0;
38
+ for (const [repoRoot, pkgJsonPaths] of repos) {
39
+ try {
40
+ if (opts.dryRun) {
41
+ console.log(`DRY ${repoRoot} -> would update renovate.json${opts.addNcu ? " + deps:latest" : ""}`);
42
+ ok++;
43
+ continue;
44
+ }
45
+ const changedRenovate = await ensureRenovateConfig(repoRoot);
46
+ let changedNcu = false;
47
+ if (opts.addNcu) {
48
+ // apply deps:latest to all package.json that are in this repoRoot (root + workspaces)
49
+ for (const pkgJsonPath of pkgJsonPaths) {
50
+ changedNcu = (await ensureNcuScript(path.dirname(pkgJsonPath))) || changedNcu;
51
+ }
52
+ }
53
+ const changed = changedRenovate || changedNcu;
54
+ if (changed && opts.commit) {
55
+ await (await import("../utils/git.js")).gitAddCommitPush(repoRoot, {
56
+ message: opts.message,
57
+ push: Boolean(opts.push)
58
+ });
59
+ }
60
+ console.log(`OK ${repoRoot}${changed ? " (changed)" : " (no-op)"}`);
61
+ ok++;
62
+ }
63
+ catch (e) {
64
+ console.log(`FAIL ${repoRoot} - ${e?.message ?? String(e)}`);
65
+ fail++;
66
+ }
67
+ }
68
+ console.log(`\nSummary: OK=${ok}, FAIL=${fail}`);
69
+ });
70
+ return cmd;
71
+ }
72
+ //# sourceMappingURL=runOnce.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runOnce.js","sourceRoot":"","sources":["../../src/commands/runOnce.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from "commander";
3
+ import { runOnceCommand } from "./commands/runOnce.js";
4
+ import { gitSyncCommand } from "./commands/gitSync.js";
5
+ import { publishOneCommand } from "./commands/publishOne.js";
6
+ import { publishStationCommand } from "./commands/publishStation.js";
7
+ import { reportStationCommand } from "./commands/reportStation.js";
8
+ const program = new Command();
9
+ program
10
+ .name("nx-npm-tools")
11
+ .description("Renovate setup + station scan + dependency graph + ordered npm publishing.")
12
+ .version("0.2.0");
13
+ program.addCommand(runOnceCommand());
14
+ program.addCommand(gitSyncCommand());
15
+ program.addCommand(publishOneCommand());
16
+ program.addCommand(publishStationCommand());
17
+ program.addCommand(reportStationCommand());
18
+ program.parse(process.argv);
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAEnE,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,cAAc,CAAC;KACpB,WAAW,CAAC,4EAA4E,CAAC;KACzF,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC,CAAC;AACrC,OAAO,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC,CAAC;AACrC,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;AACxC,OAAO,CAAC,UAAU,CAAC,qBAAqB,EAAE,CAAC,CAAC;AAC5C,OAAO,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC,CAAC;AAE3C,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
@@ -0,0 +1,128 @@
1
+ import fg from "fast-glob";
2
+ import path from "node:path";
3
+ import { exists, isDir, readJson } from "../utils/fs.js";
4
+ const IGNORE = [
5
+ "**/node_modules/**",
6
+ "**/.git/**",
7
+ "**/.pnpm-store/**",
8
+ "**/.yarn/**",
9
+ "**/.nx/**",
10
+ "**/dist/**",
11
+ "**/build/**",
12
+ "**/out/**",
13
+ "**/.next/**",
14
+ "**/coverage/**",
15
+ "**/.cache/**"
16
+ ];
17
+ function normalizeWorkspaces(ws) {
18
+ if (!ws)
19
+ return [];
20
+ if (Array.isArray(ws))
21
+ return ws;
22
+ if (typeof ws === "object" && Array.isArray(ws.packages))
23
+ return ws.packages;
24
+ return [];
25
+ }
26
+ function isLikelyPublishable(pkg, cwd) {
27
+ // Heuristic: publishable if not private, has name+version, and has build script OR dist folder commonly used
28
+ if (!pkg.name || !pkg.version)
29
+ return false;
30
+ if (pkg.private === true)
31
+ return false;
32
+ if (pkg.scripts?.build)
33
+ return true;
34
+ if (exists(path.join(cwd, "dist")))
35
+ return true;
36
+ return true; // default permissive
37
+ }
38
+ function depsBlock(p) {
39
+ return {
40
+ dependencies: p.dependencies ?? {},
41
+ devDependencies: p.devDependencies ?? {},
42
+ peerDependencies: p.peerDependencies ?? {},
43
+ optionalDependencies: p.optionalDependencies ?? {}
44
+ };
45
+ }
46
+ async function findGitRepoRoots(stationRoot) {
47
+ const gitDirs = await fg(["**/.git"], {
48
+ cwd: stationRoot,
49
+ onlyDirectories: true,
50
+ ignore: IGNORE,
51
+ followSymbolicLinks: false
52
+ });
53
+ const repoRoots = gitDirs
54
+ .map(g => path.resolve(stationRoot, path.dirname(g)))
55
+ .filter(r => isDir(r));
56
+ return [...new Set(repoRoots)].sort();
57
+ }
58
+ async function discoverWorkspacePackages(repoRoot) {
59
+ const rootPkgPath = path.join(repoRoot, "package.json");
60
+ if (!exists(rootPkgPath))
61
+ return [];
62
+ const rootPkg = readJson(rootPkgPath);
63
+ const patterns = normalizeWorkspaces(rootPkg.workspaces);
64
+ if (!patterns.length)
65
+ return [];
66
+ // Expand workspace patterns relative to repo root (e.g. "packages/*")
67
+ const matches = await fg(patterns.map(p => path.posix.join(p.replaceAll("\\", "/"), "package.json")), {
68
+ cwd: repoRoot,
69
+ onlyFiles: true,
70
+ ignore: IGNORE,
71
+ followSymbolicLinks: false
72
+ });
73
+ return matches.map(m => path.join(repoRoot, m));
74
+ }
75
+ export async function discoverStationInventory(stationRoot) {
76
+ const repoRoots = await findGitRepoRoots(stationRoot);
77
+ const packageJsonPaths = [];
78
+ for (const repoRoot of repoRoots) {
79
+ const rootPkg = path.join(repoRoot, "package.json");
80
+ if (exists(rootPkg))
81
+ packageJsonPaths.push(rootPkg);
82
+ const wsPkgs = await discoverWorkspacePackages(repoRoot);
83
+ for (const p of wsPkgs)
84
+ packageJsonPaths.push(p);
85
+ }
86
+ const uniqPkgJsonPaths = [...new Set(packageJsonPaths)];
87
+ const packages = [];
88
+ for (const pkgPath of uniqPkgJsonPaths) {
89
+ const cwd = path.dirname(pkgPath);
90
+ const pkg = readJson(pkgPath);
91
+ if (!pkg.name || !pkg.version)
92
+ continue;
93
+ // repoRoot = nearest ancestor containing .git (we already enumerated repo roots, so match by prefix)
94
+ const repoRoot = repoRoots.find(r => cwd === r || cwd.startsWith(r + path.sep));
95
+ if (!repoRoot)
96
+ continue;
97
+ packages.push({
98
+ name: pkg.name,
99
+ version: pkg.version,
100
+ private: pkg.private ?? false,
101
+ cwd,
102
+ repoRoot,
103
+ packageJsonPath: pkgPath,
104
+ scripts: pkg.scripts ?? {},
105
+ deps: depsBlock(pkg),
106
+ publishable: isLikelyPublishable(pkg, cwd)
107
+ });
108
+ }
109
+ // De-dupe by name: prefer deeper package (workspace) over repo root if name collides (rare)
110
+ const byName = new Map();
111
+ for (const p of packages) {
112
+ const prev = byName.get(p.name);
113
+ if (!prev)
114
+ byName.set(p.name, p);
115
+ else {
116
+ // prefer the one that is not private, else prefer the one with build script
117
+ if (prev.private && !p.private)
118
+ byName.set(p.name, p);
119
+ else if (!prev.scripts.build && p.scripts.build)
120
+ byName.set(p.name, p);
121
+ }
122
+ }
123
+ return {
124
+ stationRoot,
125
+ packages: [...byName.values()].sort((a, b) => a.name.localeCompare(b.name))
126
+ };
127
+ }
128
+ //# sourceMappingURL=discover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/station/discover.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ function collectAllDeps(p) {
2
+ return {
3
+ ...p.deps.dependencies,
4
+ ...p.deps.devDependencies,
5
+ ...p.deps.peerDependencies,
6
+ ...p.deps.optionalDependencies
7
+ };
8
+ }
9
+ export function buildStationGraph(inv) {
10
+ const nodes = new Map();
11
+ for (const p of inv.packages)
12
+ nodes.set(p.name, p);
13
+ const edges = new Map();
14
+ const issues = [];
15
+ for (const p of inv.packages) {
16
+ const deps = collectAllDeps(p);
17
+ const local = new Set();
18
+ for (const depName of Object.keys(deps)) {
19
+ if (nodes.has(depName))
20
+ local.add(depName);
21
+ }
22
+ edges.set(p.name, local);
23
+ // (optional) if you want to warn about @scope/* deps not found locally:
24
+ // for (const depName of Object.keys(deps)) {
25
+ // if (depName.startsWith("@athenices/") && !nodes.has(depName)) {
26
+ // issues.push({ type: "missingLocalDep", package: p.name, missing: depName });
27
+ // }
28
+ // }
29
+ }
30
+ // Toposort (Kahn)
31
+ const indeg = new Map();
32
+ for (const name of nodes.keys())
33
+ indeg.set(name, 0);
34
+ for (const [from, tos] of edges) {
35
+ for (const to of tos)
36
+ indeg.set(to, (indeg.get(to) ?? 0) + 1);
37
+ }
38
+ const q = [];
39
+ for (const [n, d] of indeg)
40
+ if (d === 0)
41
+ q.push(n);
42
+ const topo = [];
43
+ while (q.length) {
44
+ const n = q.shift();
45
+ topo.push(n);
46
+ for (const dep of edges.get(n) ?? []) {
47
+ const nd = (indeg.get(dep) ?? 0) - 1;
48
+ indeg.set(dep, nd);
49
+ if (nd === 0)
50
+ q.push(dep);
51
+ }
52
+ }
53
+ if (topo.length !== nodes.size) {
54
+ // cycle exists; find a rough cycle by listing remaining nodes
55
+ const remaining = [...nodes.keys()].filter(n => !topo.includes(n));
56
+ issues.push({ type: "cycle", cycle: remaining });
57
+ // fallback: append remaining in stable order
58
+ remaining.sort();
59
+ topo.push(...remaining);
60
+ }
61
+ // We want publish order: dependencies first.
62
+ // Current topo puts zero-indeg first (packages that nothing depends on), which is reverse for publishing.
63
+ // So reverse it.
64
+ topo.reverse();
65
+ return { nodes, edges, topo, issues };
66
+ }
67
+ //# sourceMappingURL=graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.js","sourceRoot":"","sources":["../../src/station/graph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/station/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,9 @@
1
+ import { execa } from "execa";
2
+ export async function run(cmd, args, cwd, inherit = true) {
3
+ return execa(cmd, args, { cwd, stdio: inherit ? "inherit" : "pipe" });
4
+ }
5
+ export async function runCapture(cmd, args, cwd) {
6
+ const r = await execa(cmd, args, { cwd, stdio: "pipe" });
7
+ return (r.stdout ?? "").toString();
8
+ }
9
+ //# sourceMappingURL=exec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/utils/exec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAE9B,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,GAAW,EAAE,IAAc,EAAE,GAAW,EAAE,OAAO,GAAG,IAAI;IAChF,OAAO,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAW,EAAE,IAAc,EAAE,GAAW;IACvE,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACzD,OAAO,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;AACrC,CAAC"}
@@ -0,0 +1,40 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ export function readJson(filePath) {
4
+ const raw = fs.readFileSync(filePath, "utf8");
5
+ return JSON.parse(raw);
6
+ }
7
+ export function writeJson(filePath, obj) {
8
+ const out = JSON.stringify(obj, null, 2) + "\n";
9
+ fs.writeFileSync(filePath, out, "utf8");
10
+ }
11
+ export function exists(p) {
12
+ try {
13
+ fs.accessSync(p);
14
+ return true;
15
+ }
16
+ catch {
17
+ return false;
18
+ }
19
+ }
20
+ export function readText(p) {
21
+ return fs.readFileSync(p, "utf8");
22
+ }
23
+ export function writeText(p, s) {
24
+ fs.writeFileSync(p, s, "utf8");
25
+ }
26
+ export function isDir(p) {
27
+ try {
28
+ return fs.statSync(p).isDirectory();
29
+ }
30
+ catch {
31
+ return false;
32
+ }
33
+ }
34
+ export function ensureDir(p) {
35
+ fs.mkdirSync(p, { recursive: true });
36
+ }
37
+ export function join(...parts) {
38
+ return path.join(...parts);
39
+ }
40
+ //# sourceMappingURL=fs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.js","sourceRoot":"","sources":["../../src/utils/fs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,UAAU,QAAQ,CAAI,QAAgB;IAC1C,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC9C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAM,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,QAAgB,EAAE,GAAY;IACtD,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;IAChD,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,CAAS;IAC9B,IAAI,CAAC;QACH,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,CAAS;IAChC,OAAO,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,CAAS,EAAE,CAAS;IAC5C,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,CAAS;IAC7B,IAAI,CAAC;QAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,KAAK,CAAC;IAAC,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,CAAS;IACjC,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,GAAG,KAAe;IACrC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,132 @@
1
+ import path from "node:path";
2
+ import fs from "node:fs";
3
+ import { run } from "./exec.js";
4
+ import { exists, readJson, writeJson, readText, writeText } from "./fs.js";
5
+ export async function gitAddCommitPush(cwd, opts) {
6
+ const remote = opts.remote ?? "origin";
7
+ await run("git", ["add", "."], cwd, true);
8
+ // commit may fail if nothing to commit; ignore
9
+ try {
10
+ await run("git", ["commit", "-m", opts.message], cwd, true);
11
+ }
12
+ catch {
13
+ // ignore
14
+ }
15
+ if (!opts.push)
16
+ return;
17
+ const args = ["push", remote];
18
+ if (opts.branch)
19
+ args.push(opts.branch);
20
+ if (opts.setUpstream && opts.branch)
21
+ args.push("--set-upstream");
22
+ if (opts.forceWithLease)
23
+ args.push("--force-with-lease");
24
+ await run("git", args, cwd, true);
25
+ }
26
+ export async function ensureRenovateConfig(repoRoot) {
27
+ const renovatePath = path.join(repoRoot, "renovate.json");
28
+ const existed = exists(renovatePath);
29
+ let cfg = {};
30
+ if (existed) {
31
+ cfg = readJson(renovatePath);
32
+ }
33
+ let ext = cfg.extends;
34
+ if (!ext)
35
+ ext = [];
36
+ if (typeof ext === "string")
37
+ ext = [ext];
38
+ if (!Array.isArray(ext))
39
+ ext = [];
40
+ if (!ext.includes("config:base"))
41
+ ext.unshift("config:base");
42
+ cfg.extends = ext;
43
+ cfg.dependencyDashboard = true;
44
+ if (cfg.packageRules == null) {
45
+ cfg.packageRules = [
46
+ { matchUpdateTypes: ["minor", "patch", "pin", "digest"], groupName: "all non-major dependencies" }
47
+ ];
48
+ }
49
+ const next = JSON.stringify(cfg, null, 2) + "\n";
50
+ const prev = existed ? readText(renovatePath) : "";
51
+ const changed = prev !== next;
52
+ if (changed)
53
+ writeText(renovatePath, next);
54
+ return changed;
55
+ }
56
+ export async function ensureNcuScript(pkgDir) {
57
+ const pkgPath = path.join(pkgDir, "package.json");
58
+ if (!exists(pkgPath))
59
+ return false;
60
+ const pkg = readJson(pkgPath);
61
+ pkg.scripts ||= {};
62
+ const before = pkg.scripts["deps:latest"];
63
+ pkg.scripts["deps:latest"] = "npx npm-check-updates -u && npm install";
64
+ const changed = before !== pkg.scripts["deps:latest"];
65
+ if (changed)
66
+ writeJson(pkgPath, pkg);
67
+ return changed;
68
+ }
69
+ async function forceCleanInstall(cwd) {
70
+ // Cross-platform remove node_modules + package-lock.json
71
+ const nm = path.join(cwd, "node_modules");
72
+ const lock = path.join(cwd, "package-lock.json");
73
+ try {
74
+ fs.rmSync(nm, { recursive: true, force: true });
75
+ }
76
+ catch { }
77
+ try {
78
+ fs.rmSync(lock, { force: true });
79
+ }
80
+ catch { }
81
+ await run("npm", ["cache", "clean", "--force"], cwd, true);
82
+ await run("npm", ["install"], cwd, true);
83
+ }
84
+ function mustExist(filePath, hint) {
85
+ if (!exists(filePath))
86
+ throw new Error(`${hint}\nMissing: ${filePath}`);
87
+ }
88
+ export async function publishPackageFlow(cwd, opts) {
89
+ if (opts.dryRun) {
90
+ console.log(`[dry-run] would publish from: ${cwd}`);
91
+ return;
92
+ }
93
+ // install
94
+ if (opts.forceInstall)
95
+ await forceCleanInstall(cwd);
96
+ else
97
+ await run("npm", ["install"], cwd, true);
98
+ // git sync
99
+ await gitAddCommitPush(cwd, {
100
+ message: opts.message,
101
+ push: opts.push,
102
+ remote: opts.remote,
103
+ branch: opts.branch,
104
+ setUpstream: opts.setUpstream,
105
+ forceWithLease: opts.forceWithLease
106
+ });
107
+ // build
108
+ await run("npm", ["run", opts.buildScript], cwd, true);
109
+ // verify dist output exists
110
+ const distFile = path.resolve(cwd, opts.distCheck);
111
+ mustExist(distFile, "Build output check failed.");
112
+ // bump version (optional)
113
+ if (opts.bump !== "none") {
114
+ await run("npm", ["version", String(opts.bump)], cwd, true);
115
+ }
116
+ // publish
117
+ const publishArgs = ["publish"];
118
+ // access flag
119
+ if (opts.access)
120
+ publishArgs.push("--access", String(opts.access));
121
+ // tag flag
122
+ if (opts.tag && opts.tag.trim())
123
+ publishArgs.push("--tag", opts.tag.trim());
124
+ await run("npm", publishArgs, cwd, true);
125
+ // Show current package + version (best effort)
126
+ try {
127
+ const pkg = readJson(path.join(cwd, "package.json"));
128
+ console.log(`✅ Published: ${pkg.name} @ ${pkg.version}`);
129
+ }
130
+ catch { }
131
+ }
132
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import path from "node:path";
2
+ import { findAncestorFolderByName } from "./prometheus.js";
3
+ export function resolveStationRoot(opts) {
4
+ if (opts.path)
5
+ return path.resolve(opts.path);
6
+ // Default to prometheus mode
7
+ const folderName = opts.prometheusName ?? "prometheus";
8
+ const maxUp = opts.maxUp ?? 120;
9
+ return findAncestorFolderByName(process.cwd(), folderName, maxUp);
10
+ }
11
+ //# sourceMappingURL=path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.js","sourceRoot":"","sources":["../../src/utils/path.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAU3D,MAAM,UAAU,kBAAkB,CAAC,IAAwB;IACzD,IAAI,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE9C,6BAA6B;IAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,IAAI,YAAY,CAAC;IACvD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC;IAEhC,OAAO,wBAAwB,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;AACpE,CAAC"}
@@ -0,0 +1,14 @@
1
+ import path from "node:path";
2
+ export function findAncestorFolderByName(startDir, folderName = "prometheus", maxUp = 120) {
3
+ let cur = path.resolve(startDir);
4
+ for (let i = 0; i <= maxUp; i++) {
5
+ if (path.basename(cur) === folderName)
6
+ return cur;
7
+ const parent = path.dirname(cur);
8
+ if (parent === cur)
9
+ break;
10
+ cur = parent;
11
+ }
12
+ throw new Error(`Prometheus mode: couldn't find ancestor folder named "${folderName}" starting from: ${startDir}`);
13
+ }
14
+ //# sourceMappingURL=prometheus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prometheus.js","sourceRoot":"","sources":["../../src/utils/prometheus.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,UAAU,wBAAwB,CACtC,QAAgB,EAChB,UAAU,GAAG,YAAY,EACzB,KAAK,GAAG,GAAG;IAEX,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,UAAU;YAAE,OAAO,GAAG,CAAC;QAElD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,MAAM,KAAK,GAAG;YAAE,MAAM;QAC1B,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;IAED,MAAM,IAAI,KAAK,CACb,yDAAyD,UAAU,oBAAoB,QAAQ,EAAE,CAClG,CAAC;AACJ,CAAC"}
package/package.json ADDED
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "nx-npm-tools",
3
+ "version": "0.2.0",
4
+ "description": "CLI helpers for Renovate setup, station scanning, dependency graph, git sync, and ordered npm publishing.",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "bin": {
8
+ "nx-npm-tools": "dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist"
12
+ ],
13
+ "scripts": {
14
+ "build": "tsc -p tsconfig.json",
15
+ "prepublishOnly": "npm run build"
16
+ },
17
+ "dependencies": {
18
+ "commander": "^12.1.0",
19
+ "execa": "^9.5.0",
20
+ "fast-glob": "^3.3.2"
21
+ },
22
+ "devDependencies": {
23
+ "@types/node": "^25.0.3",
24
+ "typescript": "^5.5.4"
25
+ }
26
+ }