stackbite 0.5.74 → 0.5.75
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 +8 -5
- package/package.json +1 -1
- package/packaging/npm/lib/archive.js +1 -1
- package/packaging/npm/lib/bootstrap.js +12 -9
- package/packaging/npm/release.json +25 -16
package/README.md
CHANGED
|
@@ -27,7 +27,7 @@ Alt+Shift+Z로 집중 화면, F6로 Seats 이동을 사용할 수 있습니다.
|
|
|
27
27
|
|
|
28
28
|
### npm / npx 설치
|
|
29
29
|
|
|
30
|
-
Node.js 20 이상과 `tar`가 있는 Windows x64
|
|
30
|
+
Node.js 20 이상과 `tar`가 있는 Windows x64, glibc Linux x64, Apple Silicon macOS에서 실행합니다.
|
|
31
31
|
Python 설치는 필요하지 않으며 첫 실행은 검증된 런타임을 내려받고 다음부터 캐시를 사용합니다.
|
|
32
32
|
아래 두 방식 중 하나를 선택하면 됩니다. 전역 설치는 작은 런처를 설치하고,
|
|
33
33
|
이어 `stackbite`를 처음 실행할 때 네이티브 런타임을 내려받습니다.
|
|
@@ -50,17 +50,19 @@ stackbite
|
|
|
50
50
|
npx --yes https://github.com/Shinick-Han/stackbite/releases/download/v0.5.18/stackbite-0.5.18.tgz
|
|
51
51
|
```
|
|
52
52
|
|
|
53
|
-
|
|
53
|
+
Mac은 Apple Silicon(M1 이후), macOS 13 이상이 대상입니다. 실제 실행 검증은 M4의
|
|
54
|
+
macOS 26.2에서 진행했습니다. Intel Mac, Linux ARM, Alpine은 현재 지원 대상이 아닙니다.
|
|
54
55
|
[런처 설치·업데이트 안내](packaging/npm/README.md)를 참고하세요.
|
|
55
56
|
|
|
56
57
|
### 네이티브 실행 파일
|
|
57
58
|
|
|
58
59
|
Windows x64 ZIP의 **전체 압축을 해제한 뒤 `stackbite.exe`를 실행**합니다.
|
|
59
|
-
Linux x86_64 tar.gz는 전체를 해제하고 `./stackbite`를 실행합니다.
|
|
60
|
+
Linux x86_64 또는 macOS arm64 tar.gz는 전체를 해제하고 `./stackbite`를 실행합니다.
|
|
61
|
+
각 플랫폼 모두
|
|
60
62
|
`runtime/`을 실행 파일 옆에 유지하면 Python이나 소스 checkout 없이 동작합니다.
|
|
61
63
|
Linux의 최소 glibc 요구 사항은 `portable.json`의 `minimum_glibc`에 기록됩니다.
|
|
62
64
|
|
|
63
|
-
선택적으로 Windows의 `install.cmd` 또는 Linux의 `./install.sh`로 사용자 계정에 설치합니다.
|
|
65
|
+
선택적으로 Windows의 `install.cmd` 또는 Linux·macOS의 `./install.sh`로 사용자 계정에 설치합니다.
|
|
64
66
|
Codex·Claude 등 provider CLI의 설치와 로그인은 별도입니다.
|
|
65
67
|
설치·롤백은 [Windows](packaging/README.md) / [Linux](packaging/linux/README.md) 안내를 따릅니다.
|
|
66
68
|
|
|
@@ -74,7 +76,8 @@ stackbite update --check
|
|
|
74
76
|
```
|
|
75
77
|
|
|
76
78
|
`--help`는 TUI나 백엔드를 시작하지 않습니다. `--version`은 실제 버전·커밋을,
|
|
77
|
-
`--status`는 실행·상태 경로를 확인하는 데 사용합니다.
|
|
79
|
+
`--status`는 실행·상태 경로를 확인하는 데 사용합니다. Mac에서는
|
|
80
|
+
`npm install --global stackbite@latest`로 업데이트합니다. Windows·Linux의 `stackbite update`는 배포 파일과
|
|
78
81
|
체크섬을 검증하여 설치하며, 실행 중인 백엔드와 CLI를 종료하지 않습니다. 소스 checkout은
|
|
79
82
|
Git으로 업데이트합니다. 이미 실행 중인 백엔드는 기존 코드를 사용하므로 새 기능은 그
|
|
80
83
|
백엔드를 명시적으로 재시작한 뒤 적용됩니다. 백엔드 재시작은 실행 중인 CLI를 종료합니다.
|
package/package.json
CHANGED
|
@@ -278,7 +278,7 @@ async function extractArchive(archive, destination, spec, { spawnImpl = spawn }
|
|
|
278
278
|
const entries = windows ? await zipEntries(input) : await tarEntries(input);
|
|
279
279
|
validateEntries(entries, spec.root, windows);
|
|
280
280
|
await new Promise((resolve, reject) => {
|
|
281
|
-
const child = spawnImpl(nativeTar(), ['-xf', input, '-C', destination, '--no-same-owner', '--no-same-permissions'],
|
|
281
|
+
const child = spawnImpl(nativeTar(), ['-xf', input, '-C', destination, '--no-same-owner', ...(spec.platform === 'darwin' ? ['-p'] : ['--no-same-permissions'])],
|
|
282
282
|
{ shell: false, stdio: ['ignore', 'ignore', 'pipe'], windowsHide: true });
|
|
283
283
|
let errorBytes = 0;
|
|
284
284
|
const timer = setTimeout(() => { child.kill(); reject(new Error('Native tar extraction timed out')); }, LIMITS.timeout);
|
|
@@ -34,11 +34,11 @@ function checkPinnedAsset(spec, manifest, root, asset) {
|
|
|
34
34
|
}
|
|
35
35
|
function releaseSpec(manifest, platform = process.platform, arch = process.arch, runtime = {}) {
|
|
36
36
|
const key = `${platform}-${arch}`;
|
|
37
|
-
if (!['win32-x64', 'linux-x64'].includes(key)) fail(`Stackbite does not have a native release for ${key}; supported platforms are Windows x64 and
|
|
37
|
+
if (!['win32-x64', 'linux-x64', 'darwin-arm64'].includes(key)) fail(`Stackbite does not have a native release for ${key}; supported platforms are Windows x64, Linux x64 and macOS arm64.`);
|
|
38
38
|
checkLinuxRuntime(platform, runtime);
|
|
39
39
|
checkReleaseIdentity(manifest);
|
|
40
40
|
const spec = manifest.platforms?.[key];
|
|
41
|
-
const host =
|
|
41
|
+
const host = { win32: 'windows-x64', linux: 'linux-x86_64', darwin: 'macos-arm64' }[platform];
|
|
42
42
|
const root = `stackbite-${manifest.version}-${host}-${manifest.commit.slice(0, 12)}`;
|
|
43
43
|
const asset = root + (platform === 'win32' ? '.zip' : '.tar.gz');
|
|
44
44
|
checkPinnedAsset(spec, manifest, root, asset);
|
|
@@ -122,10 +122,10 @@ async function payloadFiles(root, expected, hashes) {
|
|
|
122
122
|
// The checksum documents themselves are the only unhashed members; Linux also ships the text form.
|
|
123
123
|
async function checkMemberSet(root, spec, hashes, expected, actual) {
|
|
124
124
|
expected.add('SHA256SUMS.json');
|
|
125
|
-
if (spec.platform
|
|
125
|
+
if (spec.platform !== 'win32') {
|
|
126
126
|
expected.add('SHA256SUMS');
|
|
127
127
|
const text = await readSmall(path.join(root, 'SHA256SUMS'));
|
|
128
|
-
if (text.toString('utf8') !== Object.entries(hashes).map(([name, digest]) => `${digest} ${name}\n`).join('')) fail('Linux checksum text disagrees with pinned manifest
|
|
128
|
+
if (text.toString('utf8') !== Object.entries(hashes).map(([name, digest]) => `${digest} ${name}\n`).join('')) fail(`${spec.platform === 'linux' ? 'Linux' : 'macOS'} checksum text disagrees with pinned manifest`);
|
|
129
129
|
}
|
|
130
130
|
if (actual.size !== expected.size || [...actual].some(name => !expected.has(name))) fail('Release files disagree with pinned manifest');
|
|
131
131
|
}
|
|
@@ -134,7 +134,7 @@ async function checkProductIdentity(root, spec, metadata) {
|
|
|
134
134
|
for (const value of [metadata, build]) {
|
|
135
135
|
if (value.version !== spec.version || value.commit !== spec.commit || value.product !== 'Stackbite'
|
|
136
136
|
|| (value.command !== undefined && value.command !== 'stackbite')
|
|
137
|
-
|| (value.platform !== undefined && value.platform !== spec.host)) fail('Release product/version/commit identity mismatch');
|
|
137
|
+
|| ((spec.platform === 'darwin' || value.platform !== undefined) && value.platform !== spec.host)) fail('Release product/version/commit identity mismatch');
|
|
138
138
|
}
|
|
139
139
|
}
|
|
140
140
|
async function nativeExecutable(root, spec) {
|
|
@@ -143,11 +143,14 @@ async function nativeExecutable(root, spec) {
|
|
|
143
143
|
if (!image.isFile() || image.isSymbolicLink()) fail('Native release executable is missing or a link');
|
|
144
144
|
const file = await fs.open(executable, 'r');
|
|
145
145
|
try {
|
|
146
|
-
const
|
|
147
|
-
if ((await file.read(
|
|
148
|
-
|
|
146
|
+
const header = Buffer.alloc(spec.platform === 'darwin' ? 16 : 4);
|
|
147
|
+
if ((await file.read(header, 0, header.length, 0)).bytesRead !== header.length) fail('Invalid native executable identity');
|
|
148
|
+
const valid = spec.platform === 'win32' ? header.subarray(0, 2).equals(Buffer.from('MZ'))
|
|
149
|
+
: spec.platform === 'darwin' ? header.readUInt32LE(0) === 0xfeedfacf && header.readUInt32LE(4) === 0x0100000c && header.readUInt32LE(12) === 2
|
|
150
|
+
: header.equals(Buffer.from([0x7f, 69, 76, 70]));
|
|
151
|
+
if (!valid) fail('Invalid native executable identity');
|
|
149
152
|
} finally { await file.close(); }
|
|
150
|
-
if (spec.platform
|
|
153
|
+
if (spec.platform !== 'win32' && process.platform !== 'win32' && !(image.mode & 0o111)) fail('Native release executable has no execute permission');
|
|
151
154
|
return executable;
|
|
152
155
|
}
|
|
153
156
|
async function validatePayload(directory, spec) {
|
|
@@ -1,26 +1,35 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schema": 1,
|
|
3
|
-
"version": "0.5.
|
|
4
|
-
"commit": "
|
|
3
|
+
"version": "0.5.75",
|
|
4
|
+
"commit": "5866c4fa78e925cbac4d1c1dbedfa241099db7fb",
|
|
5
5
|
"repository": "Shinick-Han/stackbite",
|
|
6
6
|
"platforms": {
|
|
7
7
|
"win32-x64": {
|
|
8
|
-
"asset": "stackbite-0.5.
|
|
9
|
-
"url": "https://github.com/Shinick-Han/stackbite/releases/download/v0.5.
|
|
10
|
-
"sha256": "
|
|
11
|
-
"size":
|
|
12
|
-
"root": "stackbite-0.5.
|
|
13
|
-
"manifestSha256": "
|
|
14
|
-
"metadataSha256": "
|
|
8
|
+
"asset": "stackbite-0.5.75-windows-x64-5866c4fa78e9.zip",
|
|
9
|
+
"url": "https://github.com/Shinick-Han/stackbite/releases/download/v0.5.75/stackbite-0.5.75-windows-x64-5866c4fa78e9.zip",
|
|
10
|
+
"sha256": "b39d53fb18652c95a00587345afdf1f813a15c57adbe2e17a0dbfe6b5b1af482",
|
|
11
|
+
"size": 91855900,
|
|
12
|
+
"root": "stackbite-0.5.75-windows-x64-5866c4fa78e9",
|
|
13
|
+
"manifestSha256": "9d8e2fab09da2cd2f53ab3edfb1064261efa99f95ec9f3d2db4d6495d72c87c9",
|
|
14
|
+
"metadataSha256": "2daacf032afdbbd20d354b82fd62150ee804de56c3bb22abfd86c7ec92379965"
|
|
15
15
|
},
|
|
16
16
|
"linux-x64": {
|
|
17
|
-
"asset": "stackbite-0.5.
|
|
18
|
-
"url": "https://github.com/Shinick-Han/stackbite/releases/download/v0.5.
|
|
19
|
-
"sha256": "
|
|
20
|
-
"size":
|
|
21
|
-
"root": "stackbite-0.5.
|
|
22
|
-
"manifestSha256": "
|
|
23
|
-
"metadataSha256": "
|
|
17
|
+
"asset": "stackbite-0.5.75-linux-x86_64-5866c4fa78e9.tar.gz",
|
|
18
|
+
"url": "https://github.com/Shinick-Han/stackbite/releases/download/v0.5.75/stackbite-0.5.75-linux-x86_64-5866c4fa78e9.tar.gz",
|
|
19
|
+
"sha256": "f0df67b7fad65e4835cdcf4ad3b485596d9dbf9aebaec63aeb2d21a5541012f7",
|
|
20
|
+
"size": 74535069,
|
|
21
|
+
"root": "stackbite-0.5.75-linux-x86_64-5866c4fa78e9",
|
|
22
|
+
"manifestSha256": "22d18f55d18f26bb2cad3f5d8317b211a91411a8e73fec6ffd95311a51c081c6",
|
|
23
|
+
"metadataSha256": "09e5bbec59c1f2d1855bee456d2d45bc143435e7d75c67a4ff44d2a8ff476ca3"
|
|
24
|
+
},
|
|
25
|
+
"darwin-arm64": {
|
|
26
|
+
"asset": "stackbite-0.5.75-macos-arm64-5866c4fa78e9.tar.gz",
|
|
27
|
+
"url": "https://github.com/Shinick-Han/stackbite/releases/download/v0.5.75/stackbite-0.5.75-macos-arm64-5866c4fa78e9.tar.gz",
|
|
28
|
+
"sha256": "cbdfe30e185c70fa5d1bcab65ca73c4cdf8e37df926a84c71e63899c1a8e2ff0",
|
|
29
|
+
"size": 35751576,
|
|
30
|
+
"root": "stackbite-0.5.75-macos-arm64-5866c4fa78e9",
|
|
31
|
+
"manifestSha256": "945f85ba7dccf361abe56aad5e3044e81081bd75f808b0c96c10ace571defbf5",
|
|
32
|
+
"metadataSha256": "6bf11a33f7b70fe4442af231e6ffa18b9e83c9e0d0e0c2341cb23b2a4539c191"
|
|
24
33
|
}
|
|
25
34
|
}
|
|
26
35
|
}
|