sanjang 0.3.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/LICENSE +21 -0
- package/README.md +218 -0
- package/bin/__tests__/sanjang.test.ts +42 -0
- package/bin/sanjang.js +17 -0
- package/bin/sanjang.ts +144 -0
- package/dashboard/app.js +1888 -0
- package/dashboard/app.test.js +2 -0
- package/dashboard/index.html +275 -0
- package/dashboard/style.css +2112 -0
- package/lib/config.ts +337 -0
- package/lib/engine/cache.ts +218 -0
- package/lib/engine/config-hotfix.ts +161 -0
- package/lib/engine/conflict.ts +33 -0
- package/lib/engine/diagnostics.ts +81 -0
- package/lib/engine/naming.ts +93 -0
- package/lib/engine/ports.ts +61 -0
- package/lib/engine/pr.ts +71 -0
- package/lib/engine/process.ts +283 -0
- package/lib/engine/self-heal.ts +130 -0
- package/lib/engine/smart-init.ts +136 -0
- package/lib/engine/smart-pr.ts +130 -0
- package/lib/engine/snapshot.ts +45 -0
- package/lib/engine/state.ts +60 -0
- package/lib/engine/suggest.ts +169 -0
- package/lib/engine/warp.ts +47 -0
- package/lib/engine/watcher.ts +40 -0
- package/lib/engine/worktree.ts +100 -0
- package/lib/server.ts +1560 -0
- package/lib/types.ts +130 -0
- package/package.json +48 -0
- package/templates/sanjang.config.js +32 -0
package/lib/types.ts
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
// Central type definitions for Sanjang
|
|
2
|
+
|
|
3
|
+
export interface Camp {
|
|
4
|
+
name: string;
|
|
5
|
+
branch: string;
|
|
6
|
+
slot: number;
|
|
7
|
+
fePort: number;
|
|
8
|
+
bePort: number;
|
|
9
|
+
url?: string;
|
|
10
|
+
status: "stopped" | "starting" | "starting-frontend" | "running" | "setting-up" | "error";
|
|
11
|
+
description?: string;
|
|
12
|
+
baseCommit?: string;
|
|
13
|
+
parentBranch?: string;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface DevConfig {
|
|
17
|
+
command: string;
|
|
18
|
+
port: number;
|
|
19
|
+
portFlag: string | null;
|
|
20
|
+
cwd: string;
|
|
21
|
+
env: Record<string, string>;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export interface BackendConfig {
|
|
25
|
+
command: string;
|
|
26
|
+
port: number;
|
|
27
|
+
healthCheck?: string;
|
|
28
|
+
cwd?: string;
|
|
29
|
+
env?: Record<string, string>;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface PortRange {
|
|
33
|
+
base: number;
|
|
34
|
+
slots: number;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export interface PortsConfig {
|
|
38
|
+
fe: PortRange;
|
|
39
|
+
be: PortRange;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export interface SanjangConfig {
|
|
43
|
+
dev: DevConfig;
|
|
44
|
+
setup: string | null;
|
|
45
|
+
copyFiles: string[];
|
|
46
|
+
backend: BackendConfig | null;
|
|
47
|
+
ports: PortsConfig;
|
|
48
|
+
_autoDetected?: boolean;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export interface PortAllocation {
|
|
52
|
+
slot: number;
|
|
53
|
+
fePort: number;
|
|
54
|
+
bePort: number;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export interface PortStatus extends PortAllocation {
|
|
58
|
+
feBusy: boolean;
|
|
59
|
+
beBusy: boolean;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export interface CacheValidation {
|
|
63
|
+
valid: boolean;
|
|
64
|
+
reason?: string;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export interface CacheBuildResult {
|
|
68
|
+
success: boolean;
|
|
69
|
+
error?: string;
|
|
70
|
+
duration: number;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export interface CacheApplyResult {
|
|
74
|
+
applied: boolean;
|
|
75
|
+
reason?: string;
|
|
76
|
+
duration?: number;
|
|
77
|
+
count?: number;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export interface LockfileInfo {
|
|
81
|
+
path: string;
|
|
82
|
+
name: string;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export interface DetectedProject {
|
|
86
|
+
framework: string;
|
|
87
|
+
dev: DevConfig;
|
|
88
|
+
setup: string | null;
|
|
89
|
+
copyFiles: string[];
|
|
90
|
+
_note?: string;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export interface DetectedApp {
|
|
94
|
+
dir: string;
|
|
95
|
+
framework: string;
|
|
96
|
+
detected: DetectedProject;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export interface GenerateConfigResult {
|
|
100
|
+
created: boolean;
|
|
101
|
+
framework?: string;
|
|
102
|
+
configPath?: string;
|
|
103
|
+
message: string;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export interface SnapshotInfo {
|
|
107
|
+
name: string;
|
|
108
|
+
date: string;
|
|
109
|
+
message: string;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export interface DiagnosticsResult {
|
|
113
|
+
status: string;
|
|
114
|
+
checks: DiagnosticsCheck[];
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
export interface DiagnosticsCheck {
|
|
118
|
+
name: string;
|
|
119
|
+
ok: boolean;
|
|
120
|
+
message: string;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
export type BroadcastMessage = {
|
|
124
|
+
type: string;
|
|
125
|
+
name?: string;
|
|
126
|
+
source?: string;
|
|
127
|
+
data?: unknown;
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
export type EventCallback = (event: BroadcastMessage) => void;
|
package/package.json
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "sanjang",
|
|
3
|
+
"version": "0.3.0",
|
|
4
|
+
"description": "Local dev environment manager for vibe coders",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"sanjang": "./bin/sanjang.js"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"start": "node bin/sanjang.js",
|
|
11
|
+
"test": "node --experimental-transform-types --test test/**/*.test.ts bin/__tests__/*.test.ts",
|
|
12
|
+
"typecheck": "tsc --noEmit",
|
|
13
|
+
"lint": "npx @biomejs/biome check lib/ test/ bin/"
|
|
14
|
+
},
|
|
15
|
+
"dependencies": {
|
|
16
|
+
"express": "^4.19.2",
|
|
17
|
+
"simple-git": "^3.27.0",
|
|
18
|
+
"user": "^0.0.0",
|
|
19
|
+
"ws": "^8.18.0"
|
|
20
|
+
},
|
|
21
|
+
"engines": {
|
|
22
|
+
"node": ">=22"
|
|
23
|
+
},
|
|
24
|
+
"license": "MIT",
|
|
25
|
+
"repository": {
|
|
26
|
+
"type": "git",
|
|
27
|
+
"url": "https://github.com/paul-sherpas/sanjang.git"
|
|
28
|
+
},
|
|
29
|
+
"keywords": [
|
|
30
|
+
"dev-tools",
|
|
31
|
+
"worktree",
|
|
32
|
+
"vibe-coding",
|
|
33
|
+
"local-dev"
|
|
34
|
+
],
|
|
35
|
+
"files": [
|
|
36
|
+
"bin/",
|
|
37
|
+
"lib/",
|
|
38
|
+
"dashboard/",
|
|
39
|
+
"templates/"
|
|
40
|
+
],
|
|
41
|
+
"devDependencies": {
|
|
42
|
+
"@biomejs/biome": "^2.4.10",
|
|
43
|
+
"@types/express": "^5.0.6",
|
|
44
|
+
"@types/ws": "^8.18.1",
|
|
45
|
+
"tsx": "^4.21.0",
|
|
46
|
+
"typescript": "^6.0.2"
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// sanjang.config.js — 산장 설정 파일
|
|
2
|
+
// 'sanjang init' 명령으로 자동 생성되지만, 직접 수정할 수도 있습니다.
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
// 프론트엔드 개발 서버
|
|
6
|
+
dev: {
|
|
7
|
+
command: 'npm run dev', // 실행 명령
|
|
8
|
+
port: 3000, // 기본 포트 (portFlag가 null이면 이 포트로 감지)
|
|
9
|
+
portFlag: '--port', // 포트 오버라이드 플래그 (null이면 stdout에서 자동 감지)
|
|
10
|
+
cwd: '.', // worktree 기준 상대 경로
|
|
11
|
+
env: {}, // 추가 환경변수
|
|
12
|
+
},
|
|
13
|
+
|
|
14
|
+
// (선택) 설치 명령 — 캠프 생성 시 자동 실행 (캐시 미스 시)
|
|
15
|
+
// setup: 'npm install',
|
|
16
|
+
|
|
17
|
+
// (선택) 복사할 파일 — gitignored 파일을 메인에서 복사
|
|
18
|
+
// copyFiles: ['.env', '.env.local'],
|
|
19
|
+
|
|
20
|
+
// (선택) 백엔드 — 전체 캠프가 공유하는 서버
|
|
21
|
+
// backend: {
|
|
22
|
+
// command: 'npm run start:api',
|
|
23
|
+
// port: 8000,
|
|
24
|
+
// healthCheck: '/health',
|
|
25
|
+
// },
|
|
26
|
+
|
|
27
|
+
// (선택) 포트 범위 — 캠프별 포트 슬롯 할당
|
|
28
|
+
// ports: {
|
|
29
|
+
// fe: { base: 3000, slots: 8 },
|
|
30
|
+
// be: { base: 8000, slots: 8 },
|
|
31
|
+
// },
|
|
32
|
+
};
|