skyltmax_config 0.0.12.pre.28b460b.pre.08ae59c → 0.0.13.beta.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c234225ee5f3dc928e8bcadaf88b296d6c546444ed54f4b4a96ea4681f1f84f7
4
- data.tar.gz: 34859aa371a516c724f065cba6c2f04fab4d46947f5dc2faeb957434ad83b2c8
3
+ metadata.gz: f7a611d823cb4ca17672eb3c9a86b8ee44cda990ed76aa1d4f14f8757668e701
4
+ data.tar.gz: 354e2b31fe00a20c1c0ba9d85a87c1e0e037a2cf5cfb0ec347a77b8ee28a29b9
5
5
  SHA512:
6
- metadata.gz: a2504878e0e14d31d7ff56470e1fc359edbbc1abf461b5440d239703290b47a857dd5e2a60785a6a8b58ebd63932f5e6674f68d8ddadcca737419acb5ce54840
7
- data.tar.gz: 8dcfe2a335252348b410efb6f2056496dc3292887e13d87831bff676090ee328ebfac4073ba8775cb912fd1c4c017ee067958aa9d161cfd312f03252ad386210
6
+ metadata.gz: 54c5d52683b80724edd68cc8f56b00cf8bd368cdb4a15147dd7b280d5043a3b9ce5df5ac4264d57d8a7d112a7996a64532e75baad8470d056c69c05e5db96a22
7
+ data.tar.gz: 4474894cd47617dc80c4775f5dc62fe7d266fbdcf86f7871a959684dcae4e2ac207476b19eb07b25a9911464922f573d3289abf474a848b08d4a5e531df44cf5
data/AGENTS.md CHANGED
@@ -1,6 +1,6 @@
1
- # AI Agent Guide for @signmax/config
1
+ # AI Agent Guide for @skyltmax/config
2
2
 
3
- This document provides comprehensive guidance for AI coding agents working with the `@signmax/config` package.
3
+ This document provides comprehensive guidance for AI coding agents working with the `@skyltmax/config` package.
4
4
 
5
5
  ## Table of Contents
6
6
 
@@ -64,7 +64,7 @@ This is a **dual-language configuration package** providing ESLint, Prettier, an
64
64
  JavaScript/TypeScript projects, and Rubocop configs for Ruby projects:
65
65
 
66
66
  ```
67
- @signmax/config/
67
+ @skyltmax/config/
68
68
  ├── lib/
69
69
  │ └── skyltmax_config.rb # Ruby gem entry point
70
70
  ├── eslint.js # ESLint configuration
@@ -125,9 +125,9 @@ JavaScript/TypeScript projects, and Rubocop configs for Ruby projects:
125
125
  **For JavaScript/TypeScript projects:**
126
126
 
127
127
  ```bash
128
- npm install --save-dev @signmax/config
128
+ npm install --save-dev @skyltmax/config
129
129
  # or
130
- pnpm add -D @signmax/config
130
+ pnpm add -D @skyltmax/config
131
131
  ```
132
132
 
133
133
  **That's it!** All required tools (ESLint, Prettier, TypeScript, and all plugins) are bundled as dependencies. No need
@@ -146,7 +146,7 @@ gem "skyltmax_config"
146
146
 
147
147
  ```javascript
148
148
  // eslint.config.js
149
- import { config as defaultConfig } from "@signmax/config/eslint"
149
+ import { config as defaultConfig } from "@skyltmax/config/eslint"
150
150
 
151
151
  /** @type {import("eslint").Linter.Config[]} */
152
152
  export default [...defaultConfig]
@@ -157,7 +157,7 @@ export default [...defaultConfig]
157
157
  ```json
158
158
  // package.json
159
159
  {
160
- "prettier": "@signmax/config/prettier"
160
+ "prettier": "@skyltmax/config/prettier"
161
161
  }
162
162
  ```
163
163
 
@@ -166,7 +166,7 @@ export default [...defaultConfig]
166
166
  ```json
167
167
  // tsconfig.json
168
168
  {
169
- "extends": ["@signmax/config/typescript"],
169
+ "extends": ["@skyltmax/config/typescript"],
170
170
  "include": ["**/*.ts", "**/*.tsx"],
171
171
  "compilerOptions": {
172
172
  "paths": {
@@ -431,7 +431,7 @@ When modifying configurations:
431
431
  - Document breaking changes in CHANGELOG
432
432
 
433
433
  3. **Validate exports:**
434
- - Ensure all exports work: `import { config } from "@signmax/config/eslint"`
434
+ - Ensure all exports work: `import { config } from "@skyltmax/config/eslint"`
435
435
  - Check both named and default exports
436
436
  - Verify TypeScript definitions are correct
437
437
 
@@ -487,7 +487,7 @@ configurations, which ensures the configs are functional and catches issues earl
487
487
 
488
488
  This package uses a dual-publishing approach:
489
489
 
490
- **NPM Package (`@signmax/config`):**
490
+ **NPM Package (`@skyltmax/config`):**
491
491
 
492
492
  - Main entry: `index.js`
493
493
  - Exports: `./prettier`, `./typescript`, `./eslint`, `./reset.d.ts`
@@ -507,7 +507,7 @@ This package uses **peer dependencies** to provide all required tooling while en
507
507
 
508
508
  1. **Editor Discovery:** Tools like VSCode, WebStorm, and others look for `prettier`, `eslint`, and `typescript` in the
509
509
  project's root `node_modules`. When bundled as regular dependencies, they end up in
510
- `node_modules/@signmax/config/node_modules`, which editors cannot find.
510
+ `node_modules/@skyltmax/config/node_modules`, which editors cannot find.
511
511
 
512
512
  2. **Automatic Installation:** Modern package managers with `autoInstallPeers` enabled (pnpm's default, npm 7+
513
513
  configurable) automatically install peer dependencies, so users get a "single install" experience.
@@ -539,7 +539,7 @@ This package uses **peer dependencies** to provide all required tooling while en
539
539
  **Benefits:**
540
540
 
541
541
  - ✅ **Version control:** Consuming projects get consistent, tested versions
542
- - ✅ **Simplified setup:** Single `npm install @signmax/config` gets everything (with autoInstallPeers enabled)
542
+ - ✅ **Simplified setup:** Single `npm install @skyltmax/config` gets everything (with autoInstallPeers enabled)
543
543
  - ✅ **No version conflicts:** This package manages compatibility between tools
544
544
  - ✅ **Updates centralized:** Bump versions here, all projects benefit
545
545
  - ✅ **Editor compatibility:** Tools are hoisted to root `node_modules/` for VSCode, WebStorm, etc.
data/CHANGELOG.md CHANGED
@@ -2,6 +2,10 @@
2
2
 
3
3
  ### Unreleased
4
4
 
5
+ ### [0.0.12] - 2025-11-11
6
+
7
+ - feat: Detect pnpm workspace for peer config script.
8
+
5
9
  ### [0.0.11] - 2025-11-06
6
10
 
7
11
  - fix: Ignore pnpm lockfile and workspace config.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- skyltmax_config (0.0.12.pre.28b460b.pre.08ae59c)
4
+ skyltmax_config (0.0.13.beta.1)
5
5
  rubocop (>= 1.81.0, < 2)
6
6
  rubocop-performance (>= 1.26.0, < 2)
7
7
  rubocop-rails (>= 2.33.0, < 3)
@@ -34,7 +34,7 @@ GEM
34
34
  language_server-protocol (3.17.0.5)
35
35
  lint_roller (1.1.0)
36
36
  logger (1.7.0)
37
- minitest (5.26.0)
37
+ minitest (5.27.0)
38
38
  parallel (1.27.0)
39
39
  parser (3.3.9.0)
40
40
  ast (~> 2.4.1)
@@ -75,7 +75,7 @@ GEM
75
75
  concurrent-ruby (~> 1.0)
76
76
  unicode-display_width (3.1.4)
77
77
  unicode-emoji (~> 4.0, >= 4.0.4)
78
- unicode-emoji (4.0.4)
78
+ unicode-emoji (4.2.0)
79
79
  uri (1.1.1)
80
80
 
81
81
  PLATFORMS
data/README.md CHANGED
@@ -11,16 +11,16 @@ Based on <a href="https://github.com/epicweb-dev/config">@epic-web/config</a>.
11
11
  ### JavaScript/TypeScript
12
12
 
13
13
  ```bash
14
- npm install --save-dev @signmax/config
14
+ npm install --save-dev @skyltmax/config
15
15
  # or
16
- pnpm add -D @signmax/config
16
+ pnpm add -D @skyltmax/config
17
17
  ```
18
18
 
19
19
  Once the package is in place, sync the tooling versions we pin:
20
20
 
21
21
  ```bash
22
- npx signmax-config-peers --dry-run # inspect the command (optional)
23
- npx signmax-config-peers
22
+ npx skyltmax-config-peers --dry-run # inspect the command (optional)
23
+ npx skyltmax-config-peers
24
24
  ```
25
25
 
26
26
  The helper installs the exact ESLint, Prettier, TypeScript, and plugin versions we dogfood with. It currently supports
@@ -28,7 +28,7 @@ The helper installs the exact ESLint, Prettier, TypeScript, and plugin versions
28
28
  [`peerDependencies`](package.json) with the version locked there.
29
29
 
30
30
  > After installation the package runs a lightweight audit and will warn if any peer is missing or pinned to a different
31
- > version. When that happens, rerun `npx signmax-config-peers` to sync everything.
31
+ > version. When that happens, rerun `npx skyltmax-config-peers` to sync everything.
32
32
 
33
33
  ### Ruby
34
34
 
@@ -56,7 +56,7 @@ inherit_gem:
56
56
  The easiest way to use this config is in your `package.json`:
57
57
 
58
58
  ```json
59
- "prettier": "@signmax/config/prettier"
59
+ "prettier": "@skyltmax/config/prettier"
60
60
  ```
61
61
 
62
62
  <details>
@@ -68,7 +68,7 @@ can override it using regular JavaScript stuff.
68
68
  Create a `.prettierrc.js` file in your project root with the following content:
69
69
 
70
70
  ```js
71
- import defaultConfig from "signmax/config/prettier"
71
+ import defaultConfig from "skyltmax/config/prettier"
72
72
 
73
73
  /** @type {import("prettier").Options} */
74
74
  export default {
@@ -85,7 +85,7 @@ Create a `tsconfig.json` file in your project root with the following content:
85
85
 
86
86
  ```json
87
87
  {
88
- "extends": ["@signmax/config/typescript"],
88
+ "extends": ["@skyltmax/config/typescript"],
89
89
  "include": ["**/*.ts", "**/*.tsx", "**/*.js", "**/*.jsx"],
90
90
  "compilerOptions": {
91
91
  "paths": {
@@ -99,7 +99,7 @@ Create a `tsconfig.json` file in your project root with the following content:
99
99
  Create a `reset.d.ts` file in your project with these contents:
100
100
 
101
101
  ```typescript
102
- import "@signmax/config/reset.d.ts"
102
+ import "@skyltmax/config/reset.d.ts"
103
103
  ```
104
104
 
105
105
  <details>
@@ -114,7 +114,7 @@ Learn more from [the TypeScript docs here](https://www.typescriptlang.org/tsconf
114
114
  Create a `eslint.config.js` file in your project root with the following content:
115
115
 
116
116
  ```js
117
- import { config as defaultConfig } from "@signmax/config/eslint"
117
+ import { config as defaultConfig } from "@skyltmax/config/eslint"
118
118
 
119
119
  /** @type {import("eslint").Linter.Config[]} */
120
120
  export default [...defaultConfig]
@@ -134,7 +134,7 @@ positives.
134
134
 
135
135
  ## Publishing
136
136
 
137
- This repo publishes a Ruby gem (skyltmax_config) and an npm package (@signmax/config) whenever a GitHub Release is
137
+ This repo publishes a Ruby gem (skyltmax_config) and an npm package (@skyltmax/config) whenever a GitHub Release is
138
138
  published. A manual run is also available.
139
139
 
140
140
  Setup (one-time):
@@ -1,4 +1,4 @@
1
- import { config as signmaxConfig } from "@signmax/config/eslint"
1
+ import { config } from "@skyltmax/config/eslint"
2
2
 
3
3
  /** @type {import("eslint").Linter.Config[]} */
4
- export default [...signmaxConfig]
4
+ export default [...config]
data/fixture/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
- "name": "@signmax/fake-library",
2
+ "name": "@skyltmax/fake-library",
3
3
  "version": "0.0.0",
4
4
  "private": true,
5
- "description": "Fixture project for exercising @signmax/config in CI.",
5
+ "description": "Fixture project for exercising @skyltmax/config in CI.",
6
6
  "type": "module",
7
7
  "engines": {
8
8
  "node": ">=20.0.0"
@@ -13,7 +13,7 @@
13
13
  "typecheck": "tsc --noEmit"
14
14
  },
15
15
  "devDependencies": {
16
- "@signmax/config": "file:.."
16
+ "@skyltmax/config": "file:.."
17
17
  },
18
- "prettier": "@signmax/config/prettier"
18
+ "prettier": "@skyltmax/config/prettier"
19
19
  }
@@ -8,9 +8,9 @@ importers:
8
8
 
9
9
  .:
10
10
  devDependencies:
11
- '@signmax/config':
11
+ '@skyltmax/config':
12
12
  specifier: file:..
13
- version: file:..(169a19bcb2caff8811801c951260e159)
13
+ version: file:..(6601ab0a63db210ed54fc871c5d3405a)
14
14
 
15
15
  packages:
16
16
 
@@ -191,7 +191,7 @@ packages:
191
191
  resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==}
192
192
  engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
193
193
 
194
- '@signmax/config@file:..':
194
+ '@skyltmax/config@file:..':
195
195
  resolution: {directory: .., type: directory}
196
196
  engines: {node: '>=20.0.0'}
197
197
  hasBin: true
@@ -213,6 +213,7 @@ packages:
213
213
  eslint-plugin-testing-library: 7.13.3
214
214
  globals: 16.5.0
215
215
  prettier: 3.6.2
216
+ prettier-plugin-ignored: 1.0.0
216
217
  prettier-plugin-tailwindcss: 0.7.1
217
218
  tslib: 2.8.1
218
219
  typescript: 5.9.3
@@ -1179,6 +1180,11 @@ packages:
1179
1180
  resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==}
1180
1181
  engines: {node: '>=6.0.0'}
1181
1182
 
1183
+ prettier-plugin-ignored@1.0.0:
1184
+ resolution: {integrity: sha512-q0wSUvUfHqg2cZ5SADkqnGK9Cv5bBn/ootjwDWAQ+8qE/iN1nklT3XHSaF6duRl6j0P4Ew70r0vAJkGZrn4/+w==}
1185
+ peerDependencies:
1186
+ prettier: 3.x
1187
+
1182
1188
  prettier-plugin-tailwindcss@0.7.1:
1183
1189
  resolution: {integrity: sha512-Bzv1LZcuiR1Sk02iJTS1QzlFNp/o5l2p3xkopwOrbPmtMeh3fK9rVW5M3neBQzHq+kGKj/4LGQMTNcTH4NGPtQ==}
1184
1190
  engines: {node: '>=20.19'}
@@ -1711,7 +1717,7 @@ snapshots:
1711
1717
 
1712
1718
  '@pkgr/core@0.2.9': {}
1713
1719
 
1714
- '@signmax/config@file:..(169a19bcb2caff8811801c951260e159)':
1720
+ '@skyltmax/config@file:..(6601ab0a63db210ed54fc871c5d3405a)':
1715
1721
  dependencies:
1716
1722
  '@eslint/js': 9.39.1
1717
1723
  '@total-typescript/ts-reset': 0.6.1
@@ -1730,6 +1736,7 @@ snapshots:
1730
1736
  eslint-plugin-testing-library: 7.13.3(eslint@9.39.1)(typescript@5.9.3)
1731
1737
  globals: 16.5.0
1732
1738
  prettier: 3.6.2
1739
+ prettier-plugin-ignored: 1.0.0(prettier@3.6.2)
1733
1740
  prettier-plugin-tailwindcss: 0.7.1(prettier@3.6.2)
1734
1741
  tslib: 2.8.1
1735
1742
  typescript: 5.9.3
@@ -2832,6 +2839,10 @@ snapshots:
2832
2839
  dependencies:
2833
2840
  fast-diff: 1.3.0
2834
2841
 
2842
+ prettier-plugin-ignored@1.0.0(prettier@3.6.2):
2843
+ dependencies:
2844
+ prettier: 3.6.2
2845
+
2835
2846
  prettier-plugin-tailwindcss@0.7.1(prettier@3.6.2):
2836
2847
  dependencies:
2837
2848
  prettier: 3.6.2
@@ -1,5 +1,5 @@
1
1
  {
2
- "extends": "@signmax/config/typescript",
2
+ "extends": "@skyltmax/config/typescript",
3
3
  "compilerOptions": {
4
4
  "jsx": "react-jsx",
5
5
  "module": "ESNext",
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SkyltmaxConfig
4
- VERSION = "0.0.12.pre.28b460b.pre.08ae59c"
4
+ VERSION = "0.0.13.beta.1"
5
5
  end
data/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@signmax/config",
3
- "version": "0.0.12",
3
+ "version": "0.0.13",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -33,7 +33,7 @@
33
33
  "./eslint": "./eslint.js"
34
34
  },
35
35
  "bin": {
36
- "signmax-config-peers": "./scripts/peer-deps/install.js"
36
+ "skyltmax-config-peers": "./scripts/peer-deps/install.js"
37
37
  },
38
38
  "files": [
39
39
  "*.js",
@@ -76,7 +76,7 @@ export function formatAuditMessage({ missing, mismatched }) {
76
76
  return null
77
77
  }
78
78
 
79
- const lines = ["[signmax-config] Peer dependency check detected issues:"]
79
+ const lines = ["[skyltmax-config] Peer dependency check detected issues:"]
80
80
 
81
81
  if (missing.length) {
82
82
  lines.push(" Missing peers:")
@@ -93,7 +93,7 @@ export function formatAuditMessage({ missing, mismatched }) {
93
93
  }
94
94
  }
95
95
 
96
- lines.push(' Run "npx signmax-config-peers" to install the correct versions.')
96
+ lines.push(' Run "npx skyltmax-config-peers" to install the correct versions.')
97
97
 
98
98
  return lines.join("\n")
99
99
  }
@@ -107,7 +107,7 @@ export async function runPostinstallAudit() {
107
107
  console.warn(message)
108
108
  }
109
109
  } catch (error) {
110
- console.warn(`[signmax-config] Peer dependency check skipped: ${error.message}`)
110
+ console.warn(`[skyltmax-config] Peer dependency check skipped: ${error.message}`)
111
111
  }
112
112
  }
113
113
 
@@ -5,7 +5,7 @@ import { readFile } from "node:fs/promises"
5
5
  import { dirname, resolve } from "node:path"
6
6
  import { fileURLToPath } from "node:url"
7
7
 
8
- const HELP = `Usage: signmax-config-peers [options]
8
+ const HELP = `Usage: skyltmax-config-peers [options]
9
9
 
10
10
  Options:
11
11
  --manager <name> npm | pnpm | bun (auto-detected by default)
@@ -37,34 +37,62 @@ export function detectManager({ managerArg, userAgent = "", cwd = process.cwd()
37
37
  return "npm"
38
38
  }
39
39
 
40
- export function buildInstallCommand(manager, packages) {
40
+ export function findPnpmWorkspaceRoot(startDir) {
41
+ let current = resolve(startDir)
42
+
43
+ while (true) {
44
+ if (existsSync(resolve(current, "pnpm-workspace.yaml")) || existsSync(resolve(current, "pnpm-workspace.yml"))) {
45
+ return current
46
+ }
47
+
48
+ const parent = dirname(current)
49
+
50
+ if (parent === current) {
51
+ return undefined
52
+ }
53
+
54
+ current = parent
55
+ }
56
+ }
57
+
58
+ export function buildInstallCommand(manager, packages, { cwd = process.cwd() } = {}) {
41
59
  if (!packages.length) {
42
60
  throw new Error("No peer dependencies to install.")
43
61
  }
44
62
 
45
- const commandByManager = {
46
- npm: {
47
- command: "npm",
48
- args: ["install", "--save-dev", "--save-exact", ...packages],
49
- },
50
- pnpm: {
63
+ if (manager === "pnpm") {
64
+ const workspaceRoot = findPnpmWorkspaceRoot(cwd)
65
+ const args = ["add", "-D", "--save-exact", ...packages]
66
+
67
+ if (workspaceRoot) {
68
+ args.splice(2, 0, "-w")
69
+ }
70
+
71
+ return {
51
72
  command: "pnpm",
52
- args: ["add", "-D", "--save-exact", ...packages],
53
- },
54
- bun: {
55
- command: "bun",
56
- args: ["add", "--dev", "--exact", ...packages],
57
- },
73
+ args,
74
+ cwd: workspaceRoot ?? cwd,
75
+ }
58
76
  }
59
77
 
60
- const selected = commandByManager[manager]
78
+ if (manager === "npm") {
79
+ return {
80
+ command: "npm",
81
+ args: ["install", "--save-dev", "--save-exact", ...packages],
82
+ cwd,
83
+ }
84
+ }
61
85
 
62
- if (!selected) {
63
- const supported = Object.keys(commandByManager).join(", ")
64
- throw new Error(`Unsupported package manager: ${manager}. Supported managers: ${supported}`)
86
+ if (manager === "bun") {
87
+ return {
88
+ command: "bun",
89
+ args: ["add", "--dev", "--exact", ...packages],
90
+ cwd,
91
+ }
65
92
  }
66
93
 
67
- return selected
94
+ const supported = "npm, pnpm, bun"
95
+ throw new Error(`Unsupported package manager: ${manager}. Supported managers: ${supported}`)
68
96
  }
69
97
 
70
98
  export function formatCommand({ command, args }) {
@@ -84,13 +112,14 @@ export async function prepareInstall({
84
112
  }
85
113
 
86
114
  const manager = detectManager({ managerArg, userAgent: env.npm_config_user_agent ?? "", cwd })
87
- const command = buildInstallCommand(manager, packages)
115
+ const command = buildInstallCommand(manager, packages, { cwd })
88
116
 
89
117
  return {
90
118
  manager,
91
119
  packages,
92
120
  command: command.command,
93
121
  args: command.args,
122
+ cwd: command.cwd ?? cwd,
94
123
  printable: formatCommand(command),
95
124
  }
96
125
  }
@@ -114,7 +143,7 @@ export async function runCli({ args = process.argv.slice(2), env = process.env,
114
143
  const result = await prepareInstall({ managerArg, cwd, env })
115
144
 
116
145
  if (!result.packages || result.packages.length === 0) {
117
- process.stdout.write("No peer dependencies found on @signmax/config.\n")
146
+ process.stdout.write("No peer dependencies found on @skyltmax/config.\n")
118
147
  return 0
119
148
  }
120
149
 
@@ -127,6 +156,7 @@ export async function runCli({ args = process.argv.slice(2), env = process.env,
127
156
 
128
157
  const child = spawn(result.command, result.args, {
129
158
  stdio: "inherit",
159
+ cwd: result.cwd,
130
160
  })
131
161
 
132
162
  return await new Promise((resolve, reject) => {
@@ -18,10 +18,9 @@ Gem::Specification.new do |s|
18
18
  s.license = "MIT"
19
19
 
20
20
  s.metadata = {
21
- "homepage_uri" => "https://github.com/skyltmax/config#readme",
22
- "source_code_uri" => "https://github.com/skyltmax/config",
23
- "bug_tracker_uri" => "https://github.com/skyltmax/config/issues",
24
- "allowed_push_host" => "https://rubygems.org",
21
+ "homepage_uri" => "https://github.com/skyltmax/config#readme",
22
+ "source_code_uri" => "https://github.com/skyltmax/config",
23
+ "bug_tracker_uri" => "https://github.com/skyltmax/config/issues",
25
24
  }
26
25
 
27
26
  # include all tracked files so packaged gem mirrors the repo's config assets
@@ -16,7 +16,7 @@ async function createPackage(root, name, version) {
16
16
  }
17
17
 
18
18
  async function createProjectRoot() {
19
- const root = await mkdtemp(join(tmpdir(), "signmax-check-peers-"))
19
+ const root = await mkdtemp(join(tmpdir(), "skyltmax-check-peers-"))
20
20
  await writeFile(join(root, "package.json"), JSON.stringify({ name: "example", version: "1.0.0" }), "utf8")
21
21
  return root
22
22
  }
@@ -1,4 +1,4 @@
1
- import { mkdtemp, writeFile } from "node:fs/promises"
1
+ import { mkdir, mkdtemp, writeFile } from "node:fs/promises"
2
2
  import { tmpdir } from "node:os"
3
3
  import { join } from "node:path"
4
4
  import { fileURLToPath } from "node:url"
@@ -36,7 +36,7 @@ describe("install-peers helper", () => {
36
36
  })
37
37
 
38
38
  test("detectManager infers from lockfile", async () => {
39
- const dir = await mkdtemp(join(tmpdir(), "signmax-config-"))
39
+ const dir = await mkdtemp(join(tmpdir(), "skyltmax-config-"))
40
40
  await writeFile(join(dir, "bun.lockb"), "")
41
41
  const manager = detectManager({ cwd: dir })
42
42
  expect(manager).toBe("bun")
@@ -49,6 +49,19 @@ describe("install-peers helper", () => {
49
49
  expect(formatCommand(result)).toBe("npm install --save-dev --save-exact eslint@9.39.1")
50
50
  })
51
51
 
52
+ test("buildInstallCommand adds -w flag in pnpm workspaces", async () => {
53
+ const workspaceDir = await mkdtemp(join(tmpdir(), "skyltmax-config-workspace-"))
54
+ await writeFile(join(workspaceDir, "pnpm-workspace.yaml"), "packages:\n - packages/*\n")
55
+ const packageDir = join(workspaceDir, "packages", "app")
56
+ await mkdir(packageDir, { recursive: true })
57
+
58
+ const result = buildInstallCommand("pnpm", ["eslint@9.39.1"], { cwd: packageDir })
59
+
60
+ expect(result.command).toBe("pnpm")
61
+ expect(result.args).toEqual(["add", "-D", "-w", "--save-exact", "eslint@9.39.1"])
62
+ expect(result.cwd).toBe(workspaceDir)
63
+ })
64
+
52
65
  test("buildInstallCommand throws on unsupported manager", () => {
53
66
  expect(() => buildInstallCommand("yarn", ["eslint@9.39.1"])).toThrow(/Unsupported package manager/)
54
67
  })
@@ -66,6 +79,29 @@ describe("install-peers helper", () => {
66
79
  expect(result.printable).toBe("npm install --save-dev --save-exact eslint@9.39.1 prettier@3.6.2")
67
80
  })
68
81
 
82
+ test("prepareInstall targets pnpm workspace root", async () => {
83
+ const workspaceDir = await mkdtemp(join(tmpdir(), "skyltmax-config-workspace-"))
84
+ await writeFile(join(workspaceDir, "pnpm-workspace.yaml"), "packages:\n - packages/*\n")
85
+ const manifestPath = join(workspaceDir, "package.json")
86
+ await writeFile(manifestPath, JSON.stringify({ peerDependencies: { eslint: "9.39.1" } }, null, 2))
87
+
88
+ const packageDir = join(workspaceDir, "packages", "app")
89
+ await mkdir(packageDir, { recursive: true })
90
+
91
+ const result = await prepareInstall({
92
+ managerArg: "pnpm",
93
+ env: {},
94
+ cwd: packageDir,
95
+ manifestPath,
96
+ })
97
+
98
+ expect(result.manager).toBe("pnpm")
99
+ expect(result.packages).toEqual(["eslint@9.39.1"])
100
+ expect(result.args).toEqual(["add", "-D", "-w", "--save-exact", "eslint@9.39.1"])
101
+ expect(result.cwd).toBe(workspaceDir)
102
+ expect(result.printable).toBe("pnpm add -D -w --save-exact eslint@9.39.1")
103
+ })
104
+
69
105
  test("prepareInstall returns empty when no peers", async () => {
70
106
  const result = await prepareInstall({
71
107
  managerArg: "npm",
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: skyltmax_config
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.12.pre.28b460b.pre.08ae59c
4
+ version: 0.0.13.beta.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Signmax AB
@@ -136,7 +136,6 @@ metadata:
136
136
  homepage_uri: https://github.com/skyltmax/config#readme
137
137
  source_code_uri: https://github.com/skyltmax/config
138
138
  bug_tracker_uri: https://github.com/skyltmax/config/issues
139
- allowed_push_host: https://rubygems.org
140
139
  rdoc_options: []
141
140
  require_paths:
142
141
  - lib
@@ -151,7 +150,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
151
150
  - !ruby/object:Gem::Version
152
151
  version: '3.2'
153
152
  requirements: []
154
- rubygems_version: 3.6.9
153
+ rubygems_version: 4.0.3
155
154
  specification_version: 4
156
155
  summary: Reasonable Rubocop configs.
157
156
  test_files: []