leerness 1.9.177 β 1.9.178
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/CHANGELOG.md +52 -0
- package/README.md +3 -3
- package/bin/harness.js +89 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,57 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.9.178 β 2026-05-21
|
|
4
|
+
|
|
5
|
+
**π¦ μ¬μ©μ λͺ
μ: `release sync-main` μλ npm publish β .env NPM_TOKEN μ¬μ©.**
|
|
6
|
+
|
|
7
|
+
μμ¨ λͺ¨λ 108 λΌμ΄λ. μ¬μ©μ λͺ
μ: *"NPM μ‘μΈμ€ ν ν° .envμ μ
λ ₯ν΄λμ. μ
λ°μ΄νΈλ λλ§λ€ κΉνλΈμ²λΌ NPMμλ μλ λ°°ν¬"*.
|
|
8
|
+
|
|
9
|
+
### ν΅ν© νλ¦
|
|
10
|
+
```bash
|
|
11
|
+
$ leerness release sync-main .
|
|
12
|
+
# leerness release sync-main (1.9.140)
|
|
13
|
+
from: release/1.9.178 β main
|
|
14
|
+
β main merged: release/1.9.178
|
|
15
|
+
β main pushed β origin/main
|
|
16
|
+
|
|
17
|
+
π¦ npm publish μλ trigger (1.9.178)
|
|
18
|
+
leerness@1.9.178
|
|
19
|
+
npm publish μλ μ€...
|
|
20
|
+
β npm publish μλ£: leerness@1.9.178
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
β git push ν NPM μλ publish β git μν¬νλ‘μ NPM μν¬νλ‘ μμ ν΅ν©.
|
|
24
|
+
|
|
25
|
+
### 보μ μ€κ³ (3μ€ μμ λ§)
|
|
26
|
+
1. **ν ν° νκ²½λ³μλ§ μ¬μ©**: `process.env.LEERNESS_NPM_TOKEN || process.env.NPM_TOKEN` (κ° μ λ λ‘κ·Έ X)
|
|
27
|
+
2. **μμ `.npmrc` 격리**: `mkdtempSync` β `.npmrc` (mode 0o600 μμ μλ§ μ½κΈ°) β publish β **finally μ¦μ μμ **
|
|
28
|
+
3. **`.env` μλ 보νΈ**: 1.9.75+ auditμ΄ `.gitignore`μ `.env` λ±λ‘ κ°μ (μν¬λ¦Ώ λλ½ κ°μ§)
|
|
29
|
+
|
|
30
|
+
### μ€λ³΅ publish μ°¨λ¨
|
|
31
|
+
- `npm view <pkg>@<version> version` μ¬μ νΈμΆ
|
|
32
|
+
- μ΄λ―Έ publishλ λ²μ μ΄λ©΄ skip + μλ¦Ό (race conditionλ νμ μ²λ¦¬)
|
|
33
|
+
|
|
34
|
+
### μΉμ ν μλ¬ μλ΄
|
|
35
|
+
- `EPUBLISHCONFLICT` β "μ΄λ―Έ publishλ¨ β skip"
|
|
36
|
+
- `EAUTH / 401 / 403` β "ν ν° κΆν λΆμ‘± λλ λ§λ£ β .env NPM_TOKEN μ¬λ°κΈ νμ"
|
|
37
|
+
- `ENEEDAUTH` β "μΈμ¦ λ―Έμλ β ν ν° νμ νμΈ (npm_xxxxx)"
|
|
38
|
+
- κΈ°ν β λ§μ§λ§ 3μ€ stderr λ
ΈμΆ
|
|
39
|
+
|
|
40
|
+
### Opt-out (3κ°μ§)
|
|
41
|
+
1. `--no-npm` νλκ·Έ
|
|
42
|
+
2. `LEERNESS_NO_NPM_PUBLISH=1` νκ²½λ³μ
|
|
43
|
+
3. `--dry-run-npm` νλκ·Έ (dry-run mode)
|
|
44
|
+
|
|
45
|
+
### Observability
|
|
46
|
+
`_recordRun(kind: 'npm_publish')` β λͺ¨λ publish μλ (μ±κ³΅/μ€ν¨) μλ κΈ°λ‘.
|
|
47
|
+
|
|
48
|
+
### Verified
|
|
49
|
+
- e2e 217/217 baseline μ μ§ (LEERNESS_NO_NPM_PUBLISH=1 νκ²½)
|
|
50
|
+
- stress-v123: **22/22** (ν¨μ μ μ 6 + μ€λ³΅ μ°¨λ¨ 4 + release ν΅ν© 3 + μΉμ ν μλ΄ 3 + λμ νκ· 6)
|
|
51
|
+
- VERSION = 1.9.178 / autonomous-rounds = 108 / main μλ push 39 λΌμ΄λ μ°μ + **NPM μλ publish 1 λΌμ΄λ μμ**
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
3
55
|
## 1.9.177 β 2026-05-21
|
|
4
56
|
|
|
5
57
|
**π `task add` μλ review-request trigger β μ¬μ©μ λͺ
μ 1.9.176 μλν.**
|
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> **AI μ½λ© μμ΄μ νΈμ κ±°μ§ μλ£Β·μ€λ³΅Β·λ§κ°Β·μΆ©λμ λ§μμ£Όλ κ²μΒ·κΈ°μ΅Β·νμ
CLI νλ€μ€.**
|
|
4
4
|
|
|
5
|
-
[](https://www.npmjs.com/package/leerness) [](https://www.npmjs.com/package/leerness) []() []() []() []() []() []() []() []() []() []() []() []()
|
|
6
6
|
|
|
7
7
|
```
|
|
8
8
|
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
@@ -12,9 +12,9 @@
|
|
|
12
12
|
β βββ ββββββ ββββββ ββββββββββββββββββββββββ ββββββββ β
|
|
13
13
|
β βββββββββββββββββββββββββββ ββββββ ββββββββββββββββββββββ β
|
|
14
14
|
β βββββββββββββββββββββββββββ ββββββ βββββββββββββββββββββ β
|
|
15
|
-
β v1.9.
|
|
15
|
+
β v1.9.178 AI Agent Reliability Harness + Sandbox β
|
|
16
16
|
β verify Β· remember Β· orchestrate Β· audit Β· sandbox Β· drift β
|
|
17
|
-
β
|
|
17
|
+
β π¦ release sync-main μλ npm publish (NPM_TOKEN .env ν΅ν©) β
|
|
18
18
|
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
19
19
|
```
|
|
20
20
|
|
package/bin/harness.js
CHANGED
|
@@ -6,7 +6,7 @@ const path = require('path');
|
|
|
6
6
|
const cp = require('child_process');
|
|
7
7
|
const readline = require('readline');
|
|
8
8
|
|
|
9
|
-
const VERSION = '1.9.
|
|
9
|
+
const VERSION = '1.9.178';
|
|
10
10
|
const MARK = '<!-- leerness:managed -->';
|
|
11
11
|
const README_START = '<!-- leerness:project-readme:start -->';
|
|
12
12
|
const README_END = '<!-- leerness:project-readme:end -->';
|
|
@@ -7806,6 +7806,94 @@ function releaseSyncMainCmd(root) {
|
|
|
7806
7806
|
else ok(`main pushed β ${remoteName}/main`);
|
|
7807
7807
|
// 5) return to source branch (release μμ
νλ¦ λ³΄μ‘΄)
|
|
7808
7808
|
cp.spawnSync('git', ['checkout', fromBranch], { cwd: root, encoding: 'utf8' });
|
|
7809
|
+
|
|
7810
|
+
// 1.9.178: μλ npm publish (μ¬μ©μ λͺ
μ β .env NPM_TOKEN μμΌλ©΄ μλ λ°°ν¬).
|
|
7811
|
+
// opt-out: --no-npm λλ LEERNESS_NO_NPM_PUBLISH=1
|
|
7812
|
+
// ν ν° λ―Έμ€μ μ μΉμ ν μλ΄ ν skip (μ€ν¨ X).
|
|
7813
|
+
if (!has('--no-npm') && process.env.LEERNESS_NO_NPM_PUBLISH !== '1') {
|
|
7814
|
+
try { _publishToNpm(root, { dryRun: has('--dry-run-npm') }); } catch (e) { warn('npm publish μλ μ€ν¨ (κ³μ): ' + e.message); }
|
|
7815
|
+
}
|
|
7816
|
+
}
|
|
7817
|
+
|
|
7818
|
+
// 1.9.178: NPM μλ λ°°ν¬ (μ¬μ©μ λͺ
μ β release sync-main ν μλ trigger).
|
|
7819
|
+
// 보μ:
|
|
7820
|
+
// - NPM_TOKEN λλ LEERNESS_NPM_TOKEN νκ²½λ³μμμλ§ μ½μ (κ° μ λ λ‘κ·Έ X)
|
|
7821
|
+
// - μμ .npmrc νμΌ (mkdtempSync) μμ± β publish β μ¦μ μμ (finally)
|
|
7822
|
+
// - μ΄λ―Έ publishλ λ²μ μλ detect β skip (μ€λ³΅ publish μ°¨λ¨)
|
|
7823
|
+
function _publishToNpm(root, opts = {}) {
|
|
7824
|
+
root = absRoot(root || process.cwd());
|
|
7825
|
+
// .env μλ λ‘λ (μ¬μ©μ λͺ
μ ν¨ν΄ β 1.9.153)
|
|
7826
|
+
try { _loadEnvFile(root); } catch {}
|
|
7827
|
+
const token = process.env.LEERNESS_NPM_TOKEN || process.env.NPM_TOKEN;
|
|
7828
|
+
if (!token) {
|
|
7829
|
+
log(` β npm μλ λ°°ν¬ μ€ν΅: NPM_TOKEN λ―Έμ€μ (.env μ NPM_TOKEN=npm_xxxxx μΆκ°)`);
|
|
7830
|
+
return;
|
|
7831
|
+
}
|
|
7832
|
+
// package.json νμΈ
|
|
7833
|
+
const pkgPath = path.join(root, 'package.json');
|
|
7834
|
+
if (!exists(pkgPath)) {
|
|
7835
|
+
log(` β npm μλ λ°°ν¬ μ€ν΅: package.json μμ (${rel(root, pkgPath)})`);
|
|
7836
|
+
return;
|
|
7837
|
+
}
|
|
7838
|
+
let pkg;
|
|
7839
|
+
try { pkg = JSON.parse(read(pkgPath)); } catch (e) { warn(`package.json νμ± μ€ν¨: ${e.message}`); return; }
|
|
7840
|
+
if (!pkg.name || !pkg.version) {
|
|
7841
|
+
log(` β npm μλ λ°°ν¬ μ€ν΅: name/version λλ½`);
|
|
7842
|
+
return;
|
|
7843
|
+
}
|
|
7844
|
+
const pkgName = pkg.name;
|
|
7845
|
+
const pkgVersion = pkg.version;
|
|
7846
|
+
log('');
|
|
7847
|
+
log(`π¦ npm publish μλ trigger (1.9.178)`);
|
|
7848
|
+
log(` ${pkgName}@${pkgVersion}`);
|
|
7849
|
+
|
|
7850
|
+
// 1) μ΄λ―Έ publishλ λ²μ μΈμ§ νμΈ (npm view <pkg>@<version> version)
|
|
7851
|
+
try {
|
|
7852
|
+
const viewR = cp.spawnSync('npm', ['view', `${pkgName}@${pkgVersion}`, 'version'], {
|
|
7853
|
+
cwd: root, encoding: 'utf8', shell: true, timeout: 15000
|
|
7854
|
+
});
|
|
7855
|
+
if (viewR.status === 0 && (viewR.stdout || '').trim() === pkgVersion) {
|
|
7856
|
+
log(` β μ΄λ―Έ npm registryμ publishλ¨ β skip`);
|
|
7857
|
+
return;
|
|
7858
|
+
}
|
|
7859
|
+
} catch {} // λ€νΈμν¬ μ€ν¨ μ κ·Έλ₯ publish μλ
|
|
7860
|
+
|
|
7861
|
+
// 2) μμ .npmrc μμ± (ν ν° λ
ΈμΆ λ°©μ§)
|
|
7862
|
+
let tmpDir;
|
|
7863
|
+
try {
|
|
7864
|
+
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'leerness-npmrc-'));
|
|
7865
|
+
const tmpNpmrc = path.join(tmpDir, '.npmrc');
|
|
7866
|
+
fs.writeFileSync(tmpNpmrc, `//registry.npmjs.org/:_authToken=${token}\n`, { mode: 0o600 });
|
|
7867
|
+
// 3) npm publish (--userconfig λ‘ μμ .npmrc μ¬μ©, --access public)
|
|
7868
|
+
const args = opts.dryRun ? ['publish', '--userconfig', tmpNpmrc, '--access', 'public', '--dry-run'] :
|
|
7869
|
+
['publish', '--userconfig', tmpNpmrc, '--access', 'public'];
|
|
7870
|
+
log(` ${opts.dryRun ? '(dry-run) ' : ''}npm publish μλ μ€...`);
|
|
7871
|
+
const pubR = cp.spawnSync('npm', args, {
|
|
7872
|
+
cwd: root, encoding: 'utf8', shell: true, timeout: 60000,
|
|
7873
|
+
env: { ...process.env, npm_config_loglevel: 'warn' }
|
|
7874
|
+
});
|
|
7875
|
+
if (pubR.status === 0) {
|
|
7876
|
+
ok(`npm publish μλ£: ${pkgName}@${pkgVersion}`);
|
|
7877
|
+
try { _recordRun(root, { kind: 'npm_publish', package: pkgName, version: pkgVersion, dryRun: !!opts.dryRun, ok: true }); } catch {}
|
|
7878
|
+
} else {
|
|
7879
|
+
const errOut = (pubR.stderr || pubR.stdout || '').slice(-400);
|
|
7880
|
+
if (/EPUBLISHCONFLICT|already exists|cannot publish over/i.test(errOut)) {
|
|
7881
|
+
log(` β μ΄λ―Έ publishλ¨ (race condition) β skip`);
|
|
7882
|
+
} else if (/EAUTH|forbidden|401|403/i.test(errOut)) {
|
|
7883
|
+
warn(`npm publish μ€ν¨: ν ν° κΆν λΆμ‘± λλ λ§λ£ β .env NPM_TOKEN μ¬λ°κΈ νμ`);
|
|
7884
|
+
} else if (/ENEEDAUTH/i.test(errOut)) {
|
|
7885
|
+
warn(`npm publish μ€ν¨: μΈμ¦ λ―Έμλ β ν ν° νμ νμΈ (npm_xxxxx)`);
|
|
7886
|
+
} else {
|
|
7887
|
+
warn(`npm publish μ€ν¨ (exit ${pubR.status}): ${errOut.split('\n').slice(0, 3).join(' ')}`);
|
|
7888
|
+
}
|
|
7889
|
+
try { _recordRun(root, { kind: 'npm_publish', package: pkgName, version: pkgVersion, ok: false, error: errOut.slice(0, 200) }); } catch {}
|
|
7890
|
+
}
|
|
7891
|
+
} finally {
|
|
7892
|
+
// 4) μμ .npmrc μ¦μ μμ (ν ν° μμ‘΄ λ°©μ§)
|
|
7893
|
+
if (tmpDir) {
|
|
7894
|
+
try { fs.rmSync(tmpDir, { recursive: true, force: true }); } catch {}
|
|
7895
|
+
}
|
|
7896
|
+
}
|
|
7809
7897
|
}
|
|
7810
7898
|
|
|
7811
7899
|
// 1.9.40: release pack β κ°λ²Όμ΄ ν΅ν© λͺ
λ Ή (npm pack + self-host migrate + auto task + close + readme sync)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "leerness",
|
|
3
|
-
"version": "1.9.
|
|
3
|
+
"version": "1.9.178",
|
|
4
4
|
"description": "Leerness: λΉνκ΄΄ λ§μ΄κ·Έλ μ΄μ
, μλ λ²μ κ°μ§Β·μ
λ°μ΄νΈ, κ³ν/μ§ν/νΈλμ€ν μλν, κ²μΌλ¦Β·μν¬λ¦ΏΒ·μΈμ½λ© μλ κ°λ, Claude Code μ¬λμ ν΅ν©μ κ°μΆ νκ΅μ΄ μ°μ AI κ°λ° νλ€μ€.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"leerness",
|