OverviewFilesCommitsIssuesDocsReleasesPeers

pear-git-deploy commits / 7f128f6

Initial pear-git-deploy: git-based CI/CD pipeline
Standalone package for pear-git's deploy system: - Clone repo to temp dir - Run .pear-git/ci.yaml steps (YAML runner) - Commit built artifacts to release branch - Concurrent deploy locking per repo Used by pear-git only. Other apps deploy THROUGH pear-git. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
7f128f6460a37831f61de4640d813b72879d4960
by plankatron <fleeky@gmail.com> · 2026-03-30T02:35:38.000Z

Changed files (5) +1117 -0

.gitignore +1 -0
……@@ -0,0 +1 @@
1node_modules/
index.js +1 -0
……@@ -0,0 +1 @@
1export { DeployPipeline } from './lib/pipeline.js'
lib/pipeline.js +213 -0
……@@ -0,0 +1,213 @@
1/**
2 * Deploy Pipeline — git-based CI/CD
3 *
4 * Flow: git push → post-receive → CI steps → commit to release branch
5 *
6 * 1. Clone repo to temp dir
7 * 2. Run .pear-git/ci.yaml steps (or npm install fallback)
8 * 3. Commit built artifacts to 'release' branch
9 * 4. Record deploy in registry
10 * 5. Broadcast ref-update to federation peers
11 */
12
13import path from 'bare-path'
14import fs from 'bare-fs'
15import { spawn } from 'bare-subprocess'
16
17export class DeployPipeline {
18 constructor (opts = {}) {
19 this.storagePath = opts.storagePath
20 this.reposPath = opts.reposPath
21 this.gitSync = opts.gitSync || null
22 this._locks = new Map() // repoName → Promise
23 }
24
25 /**
26 * Execute a deploy for a repo
27 */
28 async execute (repoName, opts = {}) {
29 if (this._locks.has(repoName)) {
30 throw new Error(`Deploy already in progress for ${repoName}`)
31 }
32
33 const promise = this._run(repoName, opts)
34 this._locks.set(repoName, promise)
35
36 try {
37 return await promise
38 } finally {
39 this._locks.delete(repoName)
40 }
41 }
42
43 async _run (repoName, opts) {
44 const repoPath = path.join(this.reposPath, repoName + '.git')
45 const timestamp = Date.now()
46 const checkoutDir = path.join(this.storagePath, 'tmp', `deploy-${repoName}-${timestamp}`)
47
48 console.log(`[Deploy] Starting ${repoName}`)
49
50 try {
51 // 1. Clone
52 await fs.promises.mkdir(checkoutDir, { recursive: true })
53 await exec('git', ['clone', '--depth', '1', repoPath, checkoutDir])
54
55 // 2. CI steps
56 const ciConfig = loadCIConfig(checkoutDir)
57 if (ciConfig) {
58 console.log(`[Deploy] Running ${ciConfig.steps.length} CI step(s)`)
59 for (const step of ciConfig.steps) {
60 console.log(`[Deploy] ${step.name}`)
61 await exec('sh', ['-c', step.run], {
62 cwd: checkoutDir,
63 timeout: (step.timeout || 120) * 1000,
64 env: { CI: 'true', PEAR_GIT: 'true', REPO_NAME: repoName }
65 })
66 }
67 } else {
68 // Fallback: npm install
69 const hasPkg = exists(path.join(checkoutDir, 'package.json'))
70 if (hasPkg) {
71 console.log('[Deploy] Running npm install')
72 await exec('npm', ['install', '--production'], { cwd: checkoutDir })
73 }
74 }
75
76 // 3. Commit to release branch
77 const commitHash = await commitToReleaseBranch(repoPath, checkoutDir, repoName, timestamp)
78 const duration = Date.now() - timestamp
79
80 console.log(`[Deploy] Complete: ${repoName} ${commitHash.slice(0, 8)} in ${duration}ms`)
81
82 // 4. Broadcast ref-update
83 if (this.gitSync) {
84 const refs = { 'refs/heads/release': commitHash }
85 this.gitSync.broadcastRefUpdate(repoName, refs)
86 }
87
88 return { repoName, commitHash, duration }
89 } finally {
90 // Clean up temp dir
91 try { await fs.promises.rm(checkoutDir, { recursive: true }) } catch {}
92 }
93 }
94}
95
96/**
97 * Commit built checkout to release branch in the bare repo
98 */
99async function commitToReleaseBranch (bareRepoPath, checkoutDir, repoName, timestamp) {
100 const env = {
101 GIT_DIR: bareRepoPath,
102 GIT_WORK_TREE: checkoutDir,
103 GIT_AUTHOR_NAME: 'pear-git-deploy',
104 GIT_AUTHOR_EMAIL: 'deploy@pear-git',
105 GIT_COMMITTER_NAME: 'pear-git-deploy',
106 GIT_COMMITTER_EMAIL: 'deploy@pear-git'
107 }
108
109 // Check if release branch exists
110 let parentHash = null
111 try {
112 parentHash = (await exec('git', ['--git-dir', bareRepoPath, 'rev-parse', 'refs/heads/release'])).trim()
113 } catch {}
114
115 // Figure out deploy version
116 let version = 1
117 if (parentHash) {
118 try {
119 const msg = (await exec('git', ['--git-dir', bareRepoPath, 'log', '-1', '--format=%s', parentHash])).trim()
120 const match = msg.match(/v(\d+)/)
121 if (match) version = parseInt(match[1], 10) + 1
122 } catch {}
123 }
124
125 // Add all files to index
126 await exec('git', ['add', '-A'], { env })
127
128 // Write tree
129 const treeHash = (await exec('git', ['write-tree'], { env })).trim()
130
131 // Commit
132 const commitMsg = `deploy: v${version} at ${new Date(timestamp).toISOString()}`
133 const commitArgs = ['commit-tree', treeHash, '-m', commitMsg]
134 if (parentHash) commitArgs.push('-p', parentHash)
135 const commitHash = (await exec('git', commitArgs, { env })).trim()
136
137 // Update release ref
138 await exec('git', ['--git-dir', bareRepoPath, 'update-ref', 'refs/heads/release', commitHash])
139
140 return commitHash
141}
142
143/**
144 * Load .pear-git/ci.yaml
145 */
146function loadCIConfig (dir) {
147 const yamlPath = path.join(dir, '.pear-git', 'ci.yaml')
148 try {
149 const content = fs.readFileSync(yamlPath, 'utf-8')
150 // Simple YAML parser for our format (steps array)
151 return parseSimpleYaml(content)
152 } catch {
153 return null
154 }
155}
156
157function parseSimpleYaml (content) {
158 const steps = []
159 let current = null
160
161 for (const line of content.split('\n')) {
162 const trimmed = line.trim()
163 if (trimmed === 'steps:') continue
164 if (trimmed.startsWith('- name:')) {
165 if (current) steps.push(current)
166 current = { name: trimmed.slice('- name:'.length).trim() }
167 } else if (trimmed.startsWith('run:') && current) {
168 current.run = trimmed.slice('run:'.length).trim()
169 } else if (trimmed.startsWith('timeout:') && current) {
170 current.timeout = parseInt(trimmed.slice('timeout:'.length).trim(), 10)
171 }
172 }
173 if (current) steps.push(current)
174
175 return steps.length > 0 ? { steps } : null
176}
177
178function exec (cmd, args, opts = {}) {
179 return new Promise((resolve, reject) => {
180 const child = spawn(cmd, args, {
181 stdio: ['ignore', 'pipe', 'pipe'],
182 cwd: opts.cwd,
183 env: opts.env ? { ...opts.env } : undefined
184 })
185 const out = []
186 const err = []
187 let done = false
188
189 const timer = opts.timeout ? setTimeout(() => {
190 if (done) return; done = true
191 try { child.kill() } catch {}
192 reject(new Error(`Timeout after ${opts.timeout}ms`))
193 }, opts.timeout) : null
194
195 child.stdout.on('data', d => out.push(d))
196 child.stderr.on('data', d => err.push(d))
197 child.on('exit', code => {
198 if (done) return; done = true
199 if (timer) clearTimeout(timer)
200 if (code === 0) resolve(Buffer.concat(out).toString())
201 else reject(new Error(Buffer.concat(err).toString() || `exit ${code}`))
202 })
203 child.on('error', e => {
204 if (done) return; done = true
205 if (timer) clearTimeout(timer)
206 reject(e)
207 })
208 })
209}
210
211function exists (p) {
212 try { fs.statSync(p); return true } catch { return false }
213}
package-lock.json +892 -0
……@@ -0,0 +1,892 @@
1{
2 "name": "pear-git-deploy",
3 "version": "1.0.0",
4 "lockfileVersion": 3,
5 "requires": true,
6 "packages": {
7 "": {
8 "name": "pear-git-deploy",
9 "version": "1.0.0",
10 "devDependencies": {
11 "brittle": "^3.0.0"
12 }
13 },
14 "node_modules/@jridgewell/resolve-uri": {
15 "version": "3.1.2",
16 "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
17 "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
18 "dev": true,
19 "license": "MIT",
20 "engines": {
21 "node": ">=6.0.0"
22 }
23 },
24 "node_modules/@jridgewell/sourcemap-codec": {
25 "version": "1.5.5",
26 "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
27 "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
28 "dev": true,
29 "license": "MIT"
30 },
31 "node_modules/@jridgewell/trace-mapping": {
32 "version": "0.3.31",
33 "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
34 "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
35 "dev": true,
36 "license": "MIT",
37 "dependencies": {
38 "@jridgewell/resolve-uri": "^3.1.0",
39 "@jridgewell/sourcemap-codec": "^1.4.14"
40 }
41 },
42 "node_modules/@types/istanbul-lib-coverage": {
43 "version": "2.0.6",
44 "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz",
45 "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==",
46 "dev": true,
47 "license": "MIT"
48 },
49 "node_modules/b4a": {
50 "version": "1.8.0",
51 "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.0.tgz",
52 "integrity": "sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==",
53 "dev": true,
54 "license": "Apache-2.0",
55 "peerDependencies": {
56 "react-native-b4a": "*"
57 },
58 "peerDependenciesMeta": {
59 "react-native-b4a": {
60 "optional": true
61 }
62 }
63 },
64 "node_modules/bare-abort": {
65 "version": "2.0.13",
66 "resolved": "https://registry.npmjs.org/bare-abort/-/bare-abort-2.0.13.tgz",
67 "integrity": "sha512-zdc8l88eB11Jsz5rDd6sCAgv2kUFXgdrZWoMlgU6JMkfAi1/uuGFC3IEHswKbIRQTk5H3T5CMuechsXYxiaHlQ==",
68 "dev": true,
69 "license": "Apache-2.0"
70 },
71 "node_modules/bare-addon-resolve": {
72 "version": "1.10.0",
73 "resolved": "https://registry.npmjs.org/bare-addon-resolve/-/bare-addon-resolve-1.10.0.tgz",
74 "integrity": "sha512-sSd0jieRJlDaODOzj0oe0RjFVC1QI0ZIjGIdPkbrTXsdVVtENg14c+lHHAhHwmWCZ2nQlMhy8jA3Y5LYPc/isA==",
75 "dev": true,
76 "license": "Apache-2.0",
77 "dependencies": {
78 "bare-module-resolve": "^1.10.0",
79 "bare-semver": "^1.0.0"
80 },
81 "peerDependencies": {
82 "bare-url": "*"
83 },
84 "peerDependenciesMeta": {
85 "bare-url": {
86 "optional": true
87 }
88 }
89 },
90 "node_modules/bare-ansi-escapes": {
91 "version": "2.2.3",
92 "resolved": "https://registry.npmjs.org/bare-ansi-escapes/-/bare-ansi-escapes-2.2.3.tgz",
93 "integrity": "sha512-02ES4/E2RbrtZSnHJ9LntBhYkLA6lPpSEeP8iqS3MccBIVhVBlEmruF1I7HZqx5Q8aiTeYfQVeqmrU9YO2yYoQ==",
94 "dev": true,
95 "license": "Apache-2.0",
96 "dependencies": {
97 "bare-stream": "^2.6.5"
98 },
99 "peerDependencies": {
100 "bare-buffer": "*"
101 },
102 "peerDependenciesMeta": {
103 "bare-buffer": {
104 "optional": true
105 }
106 }
107 },
108 "node_modules/bare-assert": {
109 "version": "1.2.0",
110 "resolved": "https://registry.npmjs.org/bare-assert/-/bare-assert-1.2.0.tgz",
111 "integrity": "sha512-c6uvgvTJBspTDxtVnPgrBKmLgcpW3Fp72NVKDLg6oT4QjQbhGtvrkHMhGYMK1sh4vjBHOBmuUalyt9hSzV37fQ==",
112 "dev": true,
113 "license": "Apache-2.0",
114 "dependencies": {
115 "bare-inspect": "^3.1.2"
116 }
117 },
118 "node_modules/bare-bundle": {
119 "version": "1.10.0",
120 "resolved": "https://registry.npmjs.org/bare-bundle/-/bare-bundle-1.10.0.tgz",
121 "integrity": "sha512-4LVlnJAHr00Hh6Vu6ZUJS38rcEtJT3b3vChXSsBsJ2mk1TN0lQ+gzd+Dw5L0aV7uqDZv84smuwW+O02X7PfDlw==",
122 "dev": true,
123 "license": "Apache-2.0",
124 "peerDependencies": {
125 "bare-buffer": "*",
126 "bare-url": "*"
127 },
128 "peerDependenciesMeta": {
129 "bare-buffer": {
130 "optional": true
131 },
132 "bare-url": {
133 "optional": true
134 }
135 }
136 },
137 "node_modules/bare-cov": {
138 "version": "1.2.1",
139 "resolved": "https://registry.npmjs.org/bare-cov/-/bare-cov-1.2.1.tgz",
140 "integrity": "sha512-SHNqb/WG9udUEj8m5qGSehoUQ9o0Xzv8nrf4HIdmG+KNU/XdhPLhTP5VPrHnSAMAXhAzEB4Q+2IYZ0x9qPzN1g==",
141 "dev": true,
142 "license": "Apache-2.0",
143 "dependencies": {
144 "bare-fs": "^4.1.2",
145 "bare-inspector": "^4.0.1",
146 "bare-path": "^3.0.0",
147 "bare-process": "^4.2.1",
148 "bare-url": "^2.1.5",
149 "bare-v8-to-istanbul": "^1.0.2",
150 "picomatch": "^4.0.2",
151 "which-runtime": "^1.2.1"
152 }
153 },
154 "node_modules/bare-crypto": {
155 "version": "1.13.4",
156 "resolved": "https://registry.npmjs.org/bare-crypto/-/bare-crypto-1.13.4.tgz",
157 "integrity": "sha512-JiCZ5l2YOG1y8J7yy1BCAKTCZrPnHLb7pDRIdurBTOn5oIwBQDIv8iH5Pl2V85vzjl1NZXRfNY4HZLsE942jJA==",
158 "dev": true,
159 "license": "Apache-2.0",
160 "dependencies": {
161 "bare-assert": "^1.2.0",
162 "bare-stream": "^2.6.3"
163 },
164 "peerDependencies": {
165 "bare-buffer": "*"
166 },
167 "peerDependenciesMeta": {
168 "bare-buffer": {
169 "optional": true
170 }
171 }
172 },
173 "node_modules/bare-debug-log": {
174 "version": "2.0.0",
175 "resolved": "https://registry.npmjs.org/bare-debug-log/-/bare-debug-log-2.0.0.tgz",
176 "integrity": "sha512-Vi42PkMQsNV9PUpx2Gl1hikshx5O9FzMJ6o9Nnopseg7qLBBK7Nl31d0RHcfwLEAfmcPApytpc0ZFfq68u22FQ==",
177 "dev": true,
178 "license": "Apache-2.0",
179 "dependencies": {
180 "bare-os": "^3.0.1"
181 }
182 },
183 "node_modules/bare-dns": {
184 "version": "2.1.4",
185 "resolved": "https://registry.npmjs.org/bare-dns/-/bare-dns-2.1.4.tgz",
186 "integrity": "sha512-abwjHmpWqSRNB7V5615QxPH92L71AVzFm/kKTs8VYiNTAi2xVdonpv0BjJ0hwXLwomoW+xsSOPjW6PZPO14asg==",
187 "dev": true,
188 "license": "Apache-2.0",
189 "engines": {
190 "bare": ">=1.7.0"
191 }
192 },
193 "node_modules/bare-encoding": {
194 "version": "1.0.3",
195 "resolved": "https://registry.npmjs.org/bare-encoding/-/bare-encoding-1.0.3.tgz",
196 "integrity": "sha512-Kqf+t/azs13lUeyK4Tb7ha4wdLRXKWCXQ8w1rVmt7KtoPCPdHD/Xwt7LBIsCSwwGglrcmblo5VOLa5avkJqULA==",
197 "dev": true,
198 "license": "Apache-2.0",
199 "peerDependencies": {
200 "bare-buffer": "*"
201 },
202 "peerDependenciesMeta": {
203 "bare-buffer": {
204 "optional": true
205 }
206 }
207 },
208 "node_modules/bare-env": {
209 "version": "3.0.0",
210 "resolved": "https://registry.npmjs.org/bare-env/-/bare-env-3.0.0.tgz",
211 "integrity": "sha512-0u964P5ZLAxTi+lW4Kjp7YRJQ5gZr9ycYOtjLxsSrupgMz3sn5Z9n4SH/JIifHwvadsf1brA2JAjP+9IOWwTiw==",
212 "dev": true,
213 "license": "Apache-2.0",
214 "dependencies": {
215 "bare-os": "^3.0.1"
216 }
217 },
218 "node_modules/bare-events": {
219 "version": "2.8.2",
220 "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz",
221 "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==",
222 "dev": true,
223 "license": "Apache-2.0",
224 "peerDependencies": {
225 "bare-abort-controller": "*"
226 },
227 "peerDependenciesMeta": {
228 "bare-abort-controller": {
229 "optional": true
230 }
231 }
232 },
233 "node_modules/bare-format": {
234 "version": "1.0.2",
235 "resolved": "https://registry.npmjs.org/bare-format/-/bare-format-1.0.2.tgz",
236 "integrity": "sha512-GswdhnOnP9QtwRbrf4wLApw5widkaLMsLe2XOs35fQD2YfEN1ApoGka+cZ7PfvzxMgfYXmMhj/2OGlVn5/Dxgw==",
237 "dev": true,
238 "license": "Apache-2.0",
239 "dependencies": {
240 "bare-inspect": "^3.0.0"
241 }
242 },
243 "node_modules/bare-fs": {
244 "version": "4.5.6",
245 "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.5.6.tgz",
246 "integrity": "sha512-1QovqDrR80Pmt5HPAsMsXTCFcDYr+NSUKW6nd6WO5v0JBmnItc/irNRzm2KOQ5oZ69P37y+AMujNyNtG+1Rggw==",
247 "dev": true,
248 "license": "Apache-2.0",
249 "dependencies": {
250 "bare-events": "^2.5.4",
251 "bare-path": "^3.0.0",
252 "bare-stream": "^2.6.4",
253 "bare-url": "^2.2.2",
254 "fast-fifo": "^1.3.2"
255 },
256 "engines": {
257 "bare": ">=1.16.0"
258 },
259 "peerDependencies": {
260 "bare-buffer": "*"
261 },
262 "peerDependenciesMeta": {
263 "bare-buffer": {
264 "optional": true
265 }
266 }
267 },
268 "node_modules/bare-hrtime": {
269 "version": "2.1.1",
270 "resolved": "https://registry.npmjs.org/bare-hrtime/-/bare-hrtime-2.1.1.tgz",
271 "integrity": "sha512-VMb3tHo05gsnbu3OXTmkDiwTjMlOsbQmKoysKqKEyR09m77TuDrYFbj3Q5GGk10dAKsUHrnXmwCaeJqzVpB5ZA==",
272 "dev": true,
273 "license": "Apache-2.0"
274 },
275 "node_modules/bare-http-parser": {
276 "version": "1.1.3",
277 "resolved": "https://registry.npmjs.org/bare-http-parser/-/bare-http-parser-1.1.3.tgz",
278 "integrity": "sha512-+dhVvQi6brHq14L/XHNRQ+TLuVE76VjRmMt61wVEtS+Od8xUslfMHWJN/ZjIIt3RtTG6vPuA+x9cOh7KrkBJsA==",
279 "dev": true,
280 "license": "Apache-2.0"
281 },
282 "node_modules/bare-http1": {
283 "version": "4.5.5",
284 "resolved": "https://registry.npmjs.org/bare-http1/-/bare-http1-4.5.5.tgz",
285 "integrity": "sha512-ADITiRo0huP76JGMbv6Arsh9KehHqjEBoYcmjvAo67IY78+/9mV2MeKLLCkiJSFxA85T/m8cTaE44OwJQCcwdw==",
286 "dev": true,
287 "license": "Apache-2.0",
288 "dependencies": {
289 "bare-events": "^2.6.0",
290 "bare-http-parser": "^1.1.1",
291 "bare-stream": "^2.10.0",
292 "bare-tcp": "^2.2.0"
293 },
294 "peerDependencies": {
295 "bare-buffer": "*",
296 "bare-url": "*"
297 },
298 "peerDependenciesMeta": {
299 "bare-buffer": {
300 "optional": true
301 },
302 "bare-url": {
303 "optional": true
304 }
305 }
306 },
307 "node_modules/bare-https": {
308 "version": "2.1.3",
309 "resolved": "https://registry.npmjs.org/bare-https/-/bare-https-2.1.3.tgz",
310 "integrity": "sha512-0TI/mJXQGYXmG7UUyWEG+KCJusayIAQLywUjFAskDoKuxfqVnGF+M/mTMrEV8J64DaIdU+5x761FvgmT7M68tA==",
311 "dev": true,
312 "license": "Apache-2.0",
313 "dependencies": {
314 "bare-http1": "^4.4.0",
315 "bare-tcp": "^2.2.0",
316 "bare-tls": "^2.0.0"
317 }
318 },
319 "node_modules/bare-inspect": {
320 "version": "3.1.4",
321 "resolved": "https://registry.npmjs.org/bare-inspect/-/bare-inspect-3.1.4.tgz",
322 "integrity": "sha512-jfW5KRA84o3REpI6Vr4nbvMn+hqVAw8GU1mMdRwUsY5yJovQamxYeKGVKGqdzs+8ZbG4jRzGUXP/3Ji/DnqfPg==",
323 "dev": true,
324 "license": "Apache-2.0",
325 "dependencies": {
326 "bare-ansi-escapes": "^2.1.0",
327 "bare-type": "^1.0.0"
328 },
329 "engines": {
330 "bare": ">=1.18.0"
331 }
332 },
333 "node_modules/bare-inspector": {
334 "version": "4.0.3",
335 "resolved": "https://registry.npmjs.org/bare-inspector/-/bare-inspector-4.0.3.tgz",
336 "integrity": "sha512-yYk6+7tTVKJKHOja5+QBn989ETv8oVsmwoH0nCM+QYC6w5MC03GC4aQNK+lipAZSz1EaAj42WZ8Wewjpy0L9TA==",
337 "dev": true,
338 "license": "Apache-2.0",
339 "dependencies": {
340 "bare-events": "^2.1.0",
341 "bare-http1": "^4.0.0",
342 "bare-stream": "^2.0.0",
343 "bare-url": "^2.0.0",
344 "bare-ws": "^2.0.0"
345 },
346 "engines": {
347 "bare": ">=1.2.0"
348 },
349 "peerDependencies": {
350 "bare-tcp": "*"
351 },
352 "peerDependenciesMeta": {
353 "bare-tcp": {
354 "optional": true
355 }
356 }
357 },
358 "node_modules/bare-module": {
359 "version": "6.1.3",
360 "resolved": "https://registry.npmjs.org/bare-module/-/bare-module-6.1.3.tgz",
361 "integrity": "sha512-5XWsVHsvtWMH4tK4DQWgpNTV0t/sg3ZrAaQLIxrwjrS5+u8Q9vEgc/zQ4QaDPWDse/y/5h+d+YG1Q0JfSMt0zA==",
362 "dev": true,
363 "license": "Apache-2.0",
364 "dependencies": {
365 "bare-bundle": "^1.3.0",
366 "bare-module-lexer": "^1.0.0",
367 "bare-module-resolve": "^1.8.0",
368 "bare-path": "^3.0.0",
369 "bare-url": "^2.0.1"
370 },
371 "engines": {
372 "bare": ">=1.23.0"
373 },
374 "peerDependencies": {
375 "bare-buffer": "*"
376 },
377 "peerDependenciesMeta": {
378 "bare-buffer": {
379 "optional": true
380 }
381 }
382 },
383 "node_modules/bare-module-lexer": {
384 "version": "1.4.7",
385 "resolved": "https://registry.npmjs.org/bare-module-lexer/-/bare-module-lexer-1.4.7.tgz",
386 "integrity": "sha512-0klU4eMsjh/wcxi8FdHmNom2j2F4kmkXOhyJFL9qTaSFp2lE3m6BtbKgMHY8R5miqC9r8/IfA8wzXnC5Os14WA==",
387 "dev": true,
388 "license": "Apache-2.0",
389 "dependencies": {
390 "require-addon": "^1.0.2"
391 },
392 "peerDependencies": {
393 "bare-buffer": "*"
394 },
395 "peerDependenciesMeta": {
396 "bare-buffer": {
397 "optional": true
398 }
399 }
400 },
401 "node_modules/bare-module-resolve": {
402 "version": "1.12.1",
403 "resolved": "https://registry.npmjs.org/bare-module-resolve/-/bare-module-resolve-1.12.1.tgz",
404 "integrity": "sha512-hbmAPyFpEq8FoZMd5sFO3u6MC5feluWoGE8YKlA8fCrl6mNtx68Wjg4DTiDJcqRJaovTvOYKfYngoBUnbaT7eg==",
405 "dev": true,
406 "license": "Apache-2.0",
407 "dependencies": {
408 "bare-semver": "^1.0.0"
409 },
410 "peerDependencies": {
411 "bare-url": "*"
412 },
413 "peerDependenciesMeta": {
414 "bare-url": {
415 "optional": true
416 }
417 }
418 },
419 "node_modules/bare-net": {
420 "version": "2.3.1",
421 "resolved": "https://registry.npmjs.org/bare-net/-/bare-net-2.3.1.tgz",
422 "integrity": "sha512-MypSqDKpDU2Xt7FIfazn5yGvRnV09gFcIPHGWstW0gxuzA4tucTcwJSZeos97C4F89vtU5oGwXDN/HrGN6Y4Jw==",
423 "dev": true,
424 "license": "Apache-2.0",
425 "dependencies": {
426 "bare-events": "^2.2.2",
427 "bare-pipe": "^4.0.0",
428 "bare-stream": "^2.0.0",
429 "bare-tcp": "^2.0.0"
430 }
431 },
432 "node_modules/bare-os": {
433 "version": "3.8.4",
434 "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.8.4.tgz",
435 "integrity": "sha512-4JboWUl7/2LhgU536tjUszzaVC8/WEWKtyX5crayvlN71ih8+O2SdvBhotQeDsuhhmPZmLCrPBJEcwVPhI/kkQ==",
436 "dev": true,
437 "license": "Apache-2.0",
438 "engines": {
439 "bare": ">=1.14.0"
440 }
441 },
442 "node_modules/bare-path": {
443 "version": "3.0.0",
444 "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz",
445 "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==",
446 "dev": true,
447 "license": "Apache-2.0",
448 "dependencies": {
449 "bare-os": "^3.0.1"
450 }
451 },
452 "node_modules/bare-pipe": {
453 "version": "4.1.5",
454 "resolved": "https://registry.npmjs.org/bare-pipe/-/bare-pipe-4.1.5.tgz",
455 "integrity": "sha512-6OfxaG8JSkRh3Gc4hzHRsxNt+yu2PpN7lrv1V+T78GdknWQkVGwiEvu4m+1nbfk8cMVQ0TGxRvQ90XA4rhnTuw==",
456 "dev": true,
457 "license": "Apache-2.0",
458 "dependencies": {
459 "bare-events": "^2.0.0",
460 "bare-stream": "^2.0.0"
461 },
462 "engines": {
463 "bare": ">=1.16.0"
464 }
465 },
466 "node_modules/bare-process": {
467 "version": "4.4.0",
468 "resolved": "https://registry.npmjs.org/bare-process/-/bare-process-4.4.0.tgz",
469 "integrity": "sha512-G5O+Lk1lsPiYjVXP+xS8KUqNzFwibrwvqJ7DO6x8ceLSTwxyMq7NwpbmbGQQZiaiOsdZZHBFs9n+we7OuANhaw==",
470 "dev": true,
471 "license": "Apache-2.0",
472 "dependencies": {
473 "bare-abort": "^2.0.13",
474 "bare-env": "^3.0.0",
475 "bare-events": "^2.3.1",
476 "bare-fs": "^4.5.6",
477 "bare-hrtime": "^2.0.0",
478 "bare-os": "^3.7.1",
479 "bare-signals": "^4.0.0",
480 "bare-tty": "^5.0.0"
481 }
482 },
483 "node_modules/bare-semver": {
484 "version": "1.0.2",
485 "resolved": "https://registry.npmjs.org/bare-semver/-/bare-semver-1.0.2.tgz",
486 "integrity": "sha512-ESVaN2nzWhcI5tf3Zzcq9aqCZ676VWzqw07eEZ0qxAcEOAFYBa0pWq8sK34OQeHLY3JsfKXZS9mDyzyxGjeLzA==",
487 "dev": true,
488 "license": "Apache-2.0"
489 },
490 "node_modules/bare-signals": {
491 "version": "4.2.0",
492 "resolved": "https://registry.npmjs.org/bare-signals/-/bare-signals-4.2.0.tgz",
493 "integrity": "sha512-fNHMOdQIlYuTvMB3Oh9Apk99hLKn351+Ir8vz+khiPTcOqIyGG4uWWjdLTzxWdYGsA0eT+We3y0K74hjj2nq7A==",
494 "dev": true,
495 "license": "Apache-2.0",
496 "dependencies": {
497 "bare-events": "^2.5.3",
498 "bare-os": "^3.3.1"
499 },
500 "engines": {
501 "bare": ">=1.7.0"
502 }
503 },
504 "node_modules/bare-stream": {
505 "version": "2.11.0",
506 "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.11.0.tgz",
507 "integrity": "sha512-Y/+iQ49fL3rIn6w/AVxI/2+BRrpmzJvdWt5Jv8Za6Ngqc6V227c+pYjYYgLdpR3MwQ9ObVXD0ZrqoBztakM0rw==",
508 "dev": true,
509 "license": "Apache-2.0",
510 "dependencies": {
511 "streamx": "^2.25.0",
512 "teex": "^1.0.1"
513 },
514 "peerDependencies": {
515 "bare-abort-controller": "*",
516 "bare-buffer": "*",
517 "bare-events": "*"
518 },
519 "peerDependenciesMeta": {
520 "bare-abort-controller": {
521 "optional": true
522 },
523 "bare-buffer": {
524 "optional": true
525 },
526 "bare-events": {
527 "optional": true
528 }
529 }
530 },
531 "node_modules/bare-stylize": {
532 "version": "0.0.1",
533 "resolved": "https://registry.npmjs.org/bare-stylize/-/bare-stylize-0.0.1.tgz",
534 "integrity": "sha512-l3MjmIl476bWijYWf3RbE+osl4iuXSOMudzp0vAqzIK7gPgn/+G3oAxp8Oin9CFF911KBP0LO9kts8Ci8mGZaQ==",
535 "dev": true,
536 "license": "Apache-2.0",
537 "dependencies": {
538 "bare-ansi-escapes": "^2.2.3",
539 "bare-process": "^4.2.1"
540 }
541 },
542 "node_modules/bare-subprocess": {
543 "version": "5.2.3",
544 "resolved": "https://registry.npmjs.org/bare-subprocess/-/bare-subprocess-5.2.3.tgz",
545 "integrity": "sha512-07wwswlV7M3sC9IykbZRZ/jHAkrXFWVLqdBWGv1y0ojCimtRD9hGwxdHmR5FUFmDUZLNsBmTYJNQqgio5+A85Q==",
546 "dev": true,
547 "license": "Apache-2.0",
548 "dependencies": {
549 "bare-env": "^3.0.0",
550 "bare-events": "^2.5.4",
551 "bare-os": "^3.0.1",
552 "bare-pipe": "^4.0.0",
553 "bare-url": "^2.2.2"
554 },
555 "engines": {
556 "bare": ">=1.7.0"
557 },
558 "peerDependencies": {
559 "bare-buffer": "*"
560 },
561 "peerDependenciesMeta": {
562 "bare-buffer": {
563 "optional": true
564 }
565 }
566 },
567 "node_modules/bare-tcp": {
568 "version": "2.2.7",
569 "resolved": "https://registry.npmjs.org/bare-tcp/-/bare-tcp-2.2.7.tgz",
570 "integrity": "sha512-rjpqNQ2cOCkNo3NeYA/W4GTK3DRkl8sDHO3uos+AEswUjLC8XXMQF8WrJCSjlIowCbS6NUVxKE92X5RGXjyefg==",
571 "dev": true,
572 "license": "Apache-2.0",
573 "dependencies": {
574 "bare-dns": "^2.0.4",
575 "bare-events": "^2.5.4",
576 "bare-stream": "^2.6.4"
577 },
578 "engines": {
579 "bare": ">=1.16.0"
580 }
581 },
582 "node_modules/bare-tls": {
583 "version": "2.2.1",
584 "resolved": "https://registry.npmjs.org/bare-tls/-/bare-tls-2.2.1.tgz",
585 "integrity": "sha512-hZ+ZqwrUO4dyH7/6WYkYWjgAFNJKjzwEYJiDaMnMs+eRleBDjQ3CvNZawpkw0Ar9jnM9NZK6+f6GqjkZ2FLGmQ==",
586 "dev": true,
587 "license": "Apache-2.0",
588 "dependencies": {
589 "bare-net": "^2.0.1",
590 "bare-stream": "^2.6.4"
591 },
592 "engines": {
593 "bare": ">=1.7.0"
594 }
595 },
596 "node_modules/bare-tty": {
597 "version": "5.1.0",
598 "resolved": "https://registry.npmjs.org/bare-tty/-/bare-tty-5.1.0.tgz",
599 "integrity": "sha512-EZLvW4A+XiJgI3TW+e1pMME9PIJsfEXe/DA/WSKzIkq/v7Yarpv/rvG6Z5pGnpo4V/Bd+qopwnCLSR71hMMBYA==",
600 "dev": true,
601 "license": "Apache-2.0",
602 "dependencies": {
603 "bare-events": "^2.2.0",
604 "bare-signals": "^4.0.0",
605 "bare-stream": "^2.0.0"
606 },
607 "engines": {
608 "bare": ">=1.16.0"
609 }
610 },
611 "node_modules/bare-type": {
612 "version": "1.1.0",
613 "resolved": "https://registry.npmjs.org/bare-type/-/bare-type-1.1.0.tgz",
614 "integrity": "sha512-LdtnnEEYldOc87Dr4GpsKnStStZk3zfgoEMXy8yvEZkXrcCv9RtYDrUYWFsBQHtaB0s1EUWmcvS6XmEZYIj3Bw==",
615 "dev": true,
616 "license": "Apache-2.0",
617 "engines": {
618 "bare": ">=1.2.0"
619 }
620 },
621 "node_modules/bare-url": {
622 "version": "2.4.0",
623 "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.4.0.tgz",
624 "integrity": "sha512-NSTU5WN+fy/L0DDenfE8SXQna4voXuW0FHM7wH8i3/q9khUSchfPbPezO4zSFMnDGIf9YE+mt/RWhZgNRKRIXA==",
625 "dev": true,
626 "license": "Apache-2.0",
627 "peer": true,
628 "dependencies": {
629 "bare-path": "^3.0.0"
630 }
631 },
632 "node_modules/bare-utils": {
633 "version": "1.6.0",
634 "resolved": "https://registry.npmjs.org/bare-utils/-/bare-utils-1.6.0.tgz",
635 "integrity": "sha512-WhQEIkkAxkSnW7u1QgrI0AfNm5JpMruETXeYsb5qnkBJ0TTfNKygZmsh6rkoHBANaV+C/7Jed7bJP9OmEHG7rQ==",
636 "dev": true,
637 "license": "Apache-2.0",
638 "dependencies": {
639 "bare-debug-log": "^2.0.0",
640 "bare-encoding": "^1.0.0",
641 "bare-format": "^1.0.0",
642 "bare-inspect": "^3.0.0",
643 "bare-stylize": "^0.0.1",
644 "bare-type": "^1.0.6"
645 }
646 },
647 "node_modules/bare-v8-to-istanbul": {
648 "version": "1.0.2",
649 "resolved": "https://registry.npmjs.org/bare-v8-to-istanbul/-/bare-v8-to-istanbul-1.0.2.tgz",
650 "integrity": "sha512-CM0wPgyQtXTQ7h4q8NjbTZ/FH5he0Jkiwgpq0lFZZA5tkVZzmQ/9ul4R7E+cNlGZJIZlQZ9v4CwbgVaFG3zOAA==",
651 "dev": true,
652 "license": "Apache-2.0",
653 "dependencies": {
654 "bare-assert": "^1.0.2",
655 "bare-fs": "^4.1.2",
656 "bare-module": "^6.1.2",
657 "bare-path": "^3.0.0",
658 "bare-process": "^4.2.0",
659 "bare-url": "^2.1.5",
660 "bare-utils": "^1.2.0",
661 "v8-to-istanbul": "^9.3.0",
662 "which-runtime": "^1.2.1"
663 }
664 },
665 "node_modules/bare-ws": {
666 "version": "2.1.0",
667 "resolved": "https://registry.npmjs.org/bare-ws/-/bare-ws-2.1.0.tgz",
668 "integrity": "sha512-2gEWlPK9iyBchACdIY6oQXgmDz3KLrChdwrPgmU3IVXOFTnxTqSUT27WE/+izd4QojHj/SsqDkQiD2HDvuTdAA==",
669 "dev": true,
670 "license": "Apache-2.0",
671 "dependencies": {
672 "bare-crypto": "^1.2.0",
673 "bare-events": "^2.3.1",
674 "bare-http1": "^4.0.0",
675 "bare-https": "^2.0.0",
676 "bare-stream": "^2.1.2"
677 },
678 "peerDependencies": {
679 "bare-buffer": "*",
680 "bare-url": "*"
681 },
682 "peerDependenciesMeta": {
683 "bare-buffer": {
684 "optional": true
685 },
686 "bare-url": {
687 "optional": true
688 }
689 }
690 },
691 "node_modules/brittle": {
692 "version": "3.19.1",
693 "resolved": "https://registry.npmjs.org/brittle/-/brittle-3.19.1.tgz",
694 "integrity": "sha512-4Ted1Mt9o9B6oIA6ImJJCtB/Fv++ZO3IDNQgRcHOXWSYGRUidgxchaGrUBaRn+4mlneXrgInPkCPzi0jO8qKbA==",
695 "dev": true,
696 "license": "Apache-2.0",
697 "dependencies": {
698 "b4a": "^1.6.0",
699 "bare-assert": "^1.0.2",
700 "bare-cov": "^1.1.0",
701 "bare-fs": "^4.1.6",
702 "bare-os": "^3.6.1",
703 "bare-path": "^3.0.0",
704 "bare-process": "^4.2.1",
705 "bare-subprocess": "^5.0.0",
706 "bare-url": "^2.1.6",
707 "error-stack-parser": "^2.1.4",
708 "globbie": "^1.0.2",
709 "paparam": "^1.6.2",
710 "same-object": "^1.0.2",
711 "test-tmp": "^1.4.0",
712 "tmatch": "^5.0.0"
713 },
714 "bin": {
715 "brittle": "bin/node.js",
716 "brittle-bare": "bin/bare.js",
717 "brittle-node": "bin/node.js",
718 "brittle-pear": "bin/pear.js"
719 }
720 },
721 "node_modules/convert-source-map": {
722 "version": "2.0.0",
723 "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
724 "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
725 "dev": true,
726 "license": "MIT"
727 },
728 "node_modules/error-stack-parser": {
729 "version": "2.1.4",
730 "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz",
731 "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==",
732 "dev": true,
733 "license": "MIT",
734 "dependencies": {
735 "stackframe": "^1.3.4"
736 }
737 },
738 "node_modules/events-universal": {
739 "version": "1.0.1",
740 "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz",
741 "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==",
742 "dev": true,
743 "license": "Apache-2.0",
744 "dependencies": {
745 "bare-events": "^2.7.0"
746 }
747 },
748 "node_modules/fast-fifo": {
749 "version": "1.3.2",
750 "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz",
751 "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==",
752 "dev": true,
753 "license": "MIT"
754 },
755 "node_modules/globbie": {
756 "version": "1.0.3",
757 "resolved": "https://registry.npmjs.org/globbie/-/globbie-1.0.3.tgz",
758 "integrity": "sha512-hcryJmKcftf82xfBWTWxuUITWIIoYO3ec104V17SMHGFl6VLbm1d1Ju9LX9L+jyJTwICpemX/dmPI/HGYoKr1A==",
759 "dev": true,
760 "license": "Apache-2.0",
761 "dependencies": {
762 "bare-fs": "^4.1.2",
763 "bare-path": "^3.0.0",
764 "bare-process": "^4.2.1",
765 "picomatch": "^4.0.2"
766 }
767 },
768 "node_modules/paparam": {
769 "version": "1.10.1",
770 "resolved": "https://registry.npmjs.org/paparam/-/paparam-1.10.1.tgz",
771 "integrity": "sha512-viyQI64VIja0Za3njIzhoEP8ZVkgPowhZPuG0E96NwBfYJ6ZIyrrlhWGtFPkdN7eYLl2L8CTWL+wla0evm1KKQ==",
772 "dev": true,
773 "license": "Apache-2.0"
774 },
775 "node_modules/picomatch": {
776 "version": "4.0.4",
777 "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
778 "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
779 "dev": true,
780 "license": "MIT",
781 "engines": {
782 "node": ">=12"
783 },
784 "funding": {
785 "url": "https://github.com/sponsors/jonschlinkert"
786 }
787 },
788 "node_modules/require-addon": {
789 "version": "1.2.0",
790 "resolved": "https://registry.npmjs.org/require-addon/-/require-addon-1.2.0.tgz",
791 "integrity": "sha512-VNPDZlYgIYQwWp9jMTzljx+k0ZtatKlcvOhktZ/anNPI3dQ9NXk7cq2U4iJ1wd9IrytRnYhyEocFWbkdPb+MYA==",
792 "dev": true,
793 "license": "Apache-2.0",
794 "dependencies": {
795 "bare-addon-resolve": "^1.3.0"
796 },
797 "engines": {
798 "bare": ">=1.10.0"
799 }
800 },
801 "node_modules/same-object": {
802 "version": "1.0.2",
803 "resolved": "https://registry.npmjs.org/same-object/-/same-object-1.0.2.tgz",
804 "integrity": "sha512-csHWhvUsLbIOHDM/nP+KHWM+BLPsIzWkFa8HbzaI0G7BqKXgx+7FJpKTGgLXyz5amfdY2OVBcmXTqYOMEk04og==",
805 "dev": true,
806 "license": "MIT"
807 },
808 "node_modules/stackframe": {
809 "version": "1.3.4",
810 "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz",
811 "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==",
812 "dev": true,
813 "license": "MIT"
814 },
815 "node_modules/streamx": {
816 "version": "2.25.0",
817 "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.25.0.tgz",
818 "integrity": "sha512-0nQuG6jf1w+wddNEEXCF4nTg3LtufWINB5eFEN+5TNZW7KWJp6x87+JFL43vaAUPyCfH1wID+mNVyW6OHtFamg==",
819 "dev": true,
820 "license": "MIT",
821 "dependencies": {
822 "events-universal": "^1.0.0",
823 "fast-fifo": "^1.3.2",
824 "text-decoder": "^1.1.0"
825 }
826 },
827 "node_modules/teex": {
828 "version": "1.0.1",
829 "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz",
830 "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==",
831 "dev": true,
832 "license": "MIT",
833 "dependencies": {
834 "streamx": "^2.12.5"
835 }
836 },
837 "node_modules/test-tmp": {
838 "version": "1.4.0",
839 "resolved": "https://registry.npmjs.org/test-tmp/-/test-tmp-1.4.0.tgz",
840 "integrity": "sha512-GVggxGg+jXqP2Wbju50JVLo+9E+nIOPPyWqgr63EbOnNItIKu1cEbJpTWAJeflnyGqXOtcMI7ijHRp88GUkfDA==",
841 "dev": true,
842 "license": "MIT",
843 "dependencies": {
844 "bare-fs": "^4.0.1",
845 "bare-os": "^3.3.0",
846 "bare-path": "^3.0.0"
847 }
848 },
849 "node_modules/text-decoder": {
850 "version": "1.2.7",
851 "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.7.tgz",
852 "integrity": "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==",
853 "dev": true,
854 "license": "Apache-2.0",
855 "dependencies": {
856 "b4a": "^1.6.4"
857 }
858 },
859 "node_modules/tmatch": {
860 "version": "5.0.0",
861 "resolved": "https://registry.npmjs.org/tmatch/-/tmatch-5.0.0.tgz",
862 "integrity": "sha512-Ib9OtBkpHn07tXP04SlN1SYRxFgTk6wSM2EBmjjxug4u5RXPRVLkdFJSS1PmrQidaSB8Lru9nRtViQBsbxzE5Q==",
863 "dev": true,
864 "license": "ISC",
865 "engines": {
866 "node": ">=8"
867 }
868 },
869 "node_modules/v8-to-istanbul": {
870 "version": "9.3.0",
871 "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz",
872 "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==",
873 "dev": true,
874 "license": "ISC",
875 "dependencies": {
876 "@jridgewell/trace-mapping": "^0.3.12",
877 "@types/istanbul-lib-coverage": "^2.0.1",
878 "convert-source-map": "^2.0.0"
879 },
880 "engines": {
881 "node": ">=10.12.0"
882 }
883 },
884 "node_modules/which-runtime": {
885 "version": "1.3.2",
886 "resolved": "https://registry.npmjs.org/which-runtime/-/which-runtime-1.3.2.tgz",
887 "integrity": "sha512-5kwCfWml7+b2NO7KrLMhYihjRx0teKkd3yGp1Xk5Vaf2JGdSh+rgVhEALAD9c/59dP+YwJHXoEO7e8QPy7gOkw==",
888 "dev": true,
889 "license": "Apache-2.0"
890 }
891 }
892}
package.json +10 -0
……@@ -0,0 +1,10 @@
1{
2 "name": "pear-git-deploy",
3 "version": "1.0.0",
4 "description": "Git-based CI/CD pipeline — YAML steps, release branch commits, concurrent locking",
5 "type": "module",
6 "main": "index.js",
7 "devDependencies": {
8 "brittle": "^3.0.0"
9 }
10}