@ysk-kit/cli 1.0.1 → 1.1.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/README.md +7 -0
- package/dist/apply-capability.js +1 -1
- package/dist/apply-capability.js.map +1 -1
- package/dist/doctor.d.ts +44 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +599 -0
- package/dist/doctor.js.map +1 -0
- package/dist/help.d.ts.map +1 -1
- package/dist/help.js +9 -0
- package/dist/help.js.map +1 -1
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -1
- package/package.json +14 -6
- package/templates/agent/skills/verify-change/SKILL.md +1 -1
- package/templates/capabilities/push/apps/mobile/src/adapters/push.test.ts +22 -0
package/README.md
ADDED
package/dist/apply-capability.js
CHANGED
|
@@ -32,7 +32,7 @@ const copyCapabilityTree = (root, name, logs) => {
|
|
|
32
32
|
const dest = join(root, destRel);
|
|
33
33
|
if (existsSync(dest)) {
|
|
34
34
|
const current = readFileSync(dest, 'utf8');
|
|
35
|
-
if (!current.includes('ysk add push restores client.devices')) {
|
|
35
|
+
if (!current.includes('ysk-kit add push restores client.devices')) {
|
|
36
36
|
logs.push(`exists ${destRel}`);
|
|
37
37
|
continue;
|
|
38
38
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apply-capability.js","sourceRoot":"","sources":["../src/apply-capability.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,UAAU,EACV,SAAS,EACT,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE3D,MAAM,MAAM,GAAG,CAAC,IAAY,EAAiB,EAAE,CAC7C,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAEvD,MAAM,YAAY,GAAG,CAAC,IAAY,EAAE,GAAW,EAAE,KAAa,EAAW,EAAE;IACzE,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;IACpC,OAAO,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AACvC,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,2BAA2B,CAAC,CAAC;AAEjG,MAAM,kBAAkB,GAAG,CAAC,IAAY,EAAE,IAAgB,EAAE,IAAc,EAAW,EAAE;IACrF,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IACvC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACpC,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC;IACxD,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,GAAW,EAAQ,EAAE;QAC9C,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;YACrC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAChC,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;YAChD,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;gBACnC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBACtB,SAAS;YACX,CAAC;YACD,IAAI,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM;gBAAE,SAAS;YACzD,IAAI,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS;gBAAE,SAAS;YAC/D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACjC,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrB,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBAC3C,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"apply-capability.js","sourceRoot":"","sources":["../src/apply-capability.ts"],"names":[],"mappings":"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"}
|
package/dist/doctor.d.ts
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export type DoctorStatus = 'ok' | 'warn' | 'error';
|
|
2
|
+
export type DoctorCheckId = 'engines' | 'env' | 'secrets' | 'database' | 'rules' | 'agent';
|
|
3
|
+
export type DoctorCheck = {
|
|
4
|
+
id: DoctorCheckId;
|
|
5
|
+
status: DoctorStatus;
|
|
6
|
+
message: string;
|
|
7
|
+
fix?: string;
|
|
8
|
+
};
|
|
9
|
+
export type DoctorReport = {
|
|
10
|
+
ok: boolean;
|
|
11
|
+
errors: number;
|
|
12
|
+
warnings: number;
|
|
13
|
+
checks: DoctorCheck[];
|
|
14
|
+
};
|
|
15
|
+
export type DbProbe = {
|
|
16
|
+
reachable: boolean;
|
|
17
|
+
pending: string[];
|
|
18
|
+
detail: string;
|
|
19
|
+
};
|
|
20
|
+
export type DoctorOptions = {
|
|
21
|
+
productRoot: string;
|
|
22
|
+
kitRoot: string;
|
|
23
|
+
/** Process environment overlay. Omit to use `process.env`. Pass `{}` in tests to ignore the parent environment. */
|
|
24
|
+
env?: Record<string, string | undefined>;
|
|
25
|
+
nodeVersion?: string;
|
|
26
|
+
/** `null` means pnpm is not installed. Omit to run `pnpm --version`. */
|
|
27
|
+
pnpmVersion?: string | null;
|
|
28
|
+
probeDatabase?: (input: {
|
|
29
|
+
databaseUrl: string;
|
|
30
|
+
productRoot: string;
|
|
31
|
+
}) => DbProbe;
|
|
32
|
+
};
|
|
33
|
+
/** Satisfies a small engines range: comparisons, exact versions, space-separated AND, and `||`. */
|
|
34
|
+
export declare const satisfiesRange: (version: string, range: string) => boolean;
|
|
35
|
+
export declare const parseEnvFile: (text: string) => Record<string, string>;
|
|
36
|
+
export declare const resolveSqliteFile: (databaseUrl: string, productRoot: string) => string;
|
|
37
|
+
export declare const interpretPrismaMigrateStatus: (result: {
|
|
38
|
+
status: number | null;
|
|
39
|
+
stdout: string;
|
|
40
|
+
stderr: string;
|
|
41
|
+
}) => DbProbe;
|
|
42
|
+
export declare const doctor: (opts: DoctorOptions) => DoctorReport;
|
|
43
|
+
export declare const formatDoctorReport: (report: DoctorReport) => string;
|
|
44
|
+
//# sourceMappingURL=doctor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"AAqBA,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,MAAM,GAAG,OAAO,CAAC;AAEnD,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,KAAK,GAAG,SAAS,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,CAAC;AAE3F,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,aAAa,CAAC;IAClB,MAAM,EAAE,YAAY,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,mHAAmH;IACnH,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC;CAClF,CAAC;AA2CF,mGAAmG;AACnG,eAAO,MAAM,cAAc,GAAI,SAAS,MAAM,EAAE,OAAO,MAAM,KAAG,OA0B/D,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,MAAM,MAAM,KAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAkBhE,CAAC;AAwTF,eAAO,MAAM,iBAAiB,GAAI,aAAa,MAAM,EAAE,aAAa,MAAM,KAAG,MAQ5E,CAAC;AA6DF,eAAO,MAAM,4BAA4B,GAAI,QAAQ;IACnD,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,KAAG,OAmCH,CAAC;AAsKF,eAAO,MAAM,MAAM,GAAI,MAAM,aAAa,KAAG,YAwB5C,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,QAAQ,YAAY,KAAG,MAazD,CAAC"}
|
package/dist/doctor.js
ADDED
|
@@ -0,0 +1,599 @@
|
|
|
1
|
+
import { spawnSync } from 'node:child_process';
|
|
2
|
+
import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';
|
|
3
|
+
import { createRequire } from 'node:module';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { checkAgent, formatAgentFindings } from './check-agent';
|
|
6
|
+
import { readKitVersion, UPGRADE_PATHS } from './upgrade';
|
|
7
|
+
const require = createRequire(import.meta.url);
|
|
8
|
+
const openSqlite = (file) => {
|
|
9
|
+
const { DatabaseSync } = require('node:sqlite');
|
|
10
|
+
return new DatabaseSync(file, { readOnly: true });
|
|
11
|
+
};
|
|
12
|
+
const JWT_DEFAULTS = new Set([
|
|
13
|
+
'change-me-in-dev-only',
|
|
14
|
+
'change-me',
|
|
15
|
+
'changeme',
|
|
16
|
+
'secret',
|
|
17
|
+
'jwt-secret',
|
|
18
|
+
'password',
|
|
19
|
+
]);
|
|
20
|
+
const SEED_DEFAULTS = {
|
|
21
|
+
SEED_ADMIN_PASSWORD: 'ysk-admin-dev',
|
|
22
|
+
SEED_USER_PASSWORD: 'ysk-user-dev',
|
|
23
|
+
};
|
|
24
|
+
const SKIP_DIR = new Set(['node_modules', 'dist']);
|
|
25
|
+
const check = (id, status, message, fix) => {
|
|
26
|
+
if (fix === undefined)
|
|
27
|
+
return { id, status, message };
|
|
28
|
+
return { id, status, message, fix };
|
|
29
|
+
};
|
|
30
|
+
const parseVer = (raw) => {
|
|
31
|
+
const match = raw.trim().match(/v?(\d+)(?:\.(\d+))?(?:\.(\d+))?/);
|
|
32
|
+
if (!match?.[1])
|
|
33
|
+
return undefined;
|
|
34
|
+
return {
|
|
35
|
+
major: Number(match[1]),
|
|
36
|
+
minor: Number(match[2] ?? 0),
|
|
37
|
+
patch: Number(match[3] ?? 0),
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
const cmpVer = (a, b) => a.major - b.major || a.minor - b.minor || a.patch - b.patch;
|
|
41
|
+
/** Satisfies a small engines range: comparisons, exact versions, space-separated AND, and `||`. */
|
|
42
|
+
export const satisfiesRange = (version, range) => {
|
|
43
|
+
const ver = parseVer(version);
|
|
44
|
+
if (!ver)
|
|
45
|
+
return false;
|
|
46
|
+
const parts = range
|
|
47
|
+
.split('||')
|
|
48
|
+
.map((part) => part.trim())
|
|
49
|
+
.filter((part) => part.length > 0);
|
|
50
|
+
if (parts.length === 0)
|
|
51
|
+
return false;
|
|
52
|
+
return parts.some((part) => {
|
|
53
|
+
if (part === '*' || part === 'x')
|
|
54
|
+
return true;
|
|
55
|
+
const clauses = part.match(/(>=|<=|>|<|=)?\s*v?\d+(?:\.\d+){0,2}/g);
|
|
56
|
+
if (!clauses || clauses.length === 0)
|
|
57
|
+
return false;
|
|
58
|
+
return clauses.every((clause) => {
|
|
59
|
+
const match = clause.trim().match(/^(>=|<=|>|<|=)?\s*(v?\d+(?:\.\d+){0,2})$/);
|
|
60
|
+
if (!match?.[2])
|
|
61
|
+
return false;
|
|
62
|
+
const bound = parseVer(match[2]);
|
|
63
|
+
if (!bound)
|
|
64
|
+
return false;
|
|
65
|
+
const op = match[1] ?? '=';
|
|
66
|
+
const order = cmpVer(ver, bound);
|
|
67
|
+
if (op === '>=')
|
|
68
|
+
return order >= 0;
|
|
69
|
+
if (op === '<=')
|
|
70
|
+
return order <= 0;
|
|
71
|
+
if (op === '>')
|
|
72
|
+
return order > 0;
|
|
73
|
+
if (op === '<')
|
|
74
|
+
return order < 0;
|
|
75
|
+
return order === 0;
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
};
|
|
79
|
+
export const parseEnvFile = (text) => {
|
|
80
|
+
const out = {};
|
|
81
|
+
for (const line of text.split(/\r?\n/)) {
|
|
82
|
+
const trimmed = line.trim();
|
|
83
|
+
if (trimmed.length === 0 || trimmed.startsWith('#'))
|
|
84
|
+
continue;
|
|
85
|
+
const eq = trimmed.indexOf('=');
|
|
86
|
+
if (eq <= 0)
|
|
87
|
+
continue;
|
|
88
|
+
const key = trimmed.slice(0, eq).trim();
|
|
89
|
+
let value = trimmed.slice(eq + 1).trim();
|
|
90
|
+
if ((value.startsWith('"') && value.endsWith('"') && value.length >= 2) ||
|
|
91
|
+
(value.startsWith("'") && value.endsWith("'") && value.length >= 2)) {
|
|
92
|
+
value = value.slice(1, -1);
|
|
93
|
+
}
|
|
94
|
+
out[key] = value;
|
|
95
|
+
}
|
|
96
|
+
return out;
|
|
97
|
+
};
|
|
98
|
+
const readText = (path) => readFileSync(path, 'utf8').replace(/\r\n/g, '\n');
|
|
99
|
+
const walkRel = (abs, rel, out) => {
|
|
100
|
+
const stat = statSync(abs);
|
|
101
|
+
if (stat.isDirectory()) {
|
|
102
|
+
for (const name of readdirSync(abs)) {
|
|
103
|
+
if (SKIP_DIR.has(name))
|
|
104
|
+
continue;
|
|
105
|
+
const next = rel.length === 0 ? name : `${rel}/${name}`;
|
|
106
|
+
walkRel(join(abs, name), next, out);
|
|
107
|
+
}
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
out.push(rel);
|
|
111
|
+
};
|
|
112
|
+
const compareTree = (kitAbs, productAbs, rel, drift) => {
|
|
113
|
+
if (!existsSync(kitAbs))
|
|
114
|
+
return;
|
|
115
|
+
if (!existsSync(productAbs)) {
|
|
116
|
+
drift.push({ path: rel, reason: 'missing' });
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
const kitStat = statSync(kitAbs);
|
|
120
|
+
const productStat = statSync(productAbs);
|
|
121
|
+
if (kitStat.isDirectory()) {
|
|
122
|
+
if (!productStat.isDirectory()) {
|
|
123
|
+
drift.push({ path: rel, reason: 'differs' });
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
const files = [];
|
|
127
|
+
walkRel(kitAbs, '', files);
|
|
128
|
+
for (const file of files) {
|
|
129
|
+
const from = join(kitAbs, file);
|
|
130
|
+
const to = join(productAbs, file);
|
|
131
|
+
const shown = `${rel}/${file}`;
|
|
132
|
+
if (!existsSync(to)) {
|
|
133
|
+
drift.push({ path: shown, reason: 'missing' });
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
if (readText(from) !== readText(to))
|
|
137
|
+
drift.push({ path: shown, reason: 'differs' });
|
|
138
|
+
}
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
if (productStat.isDirectory() || readText(kitAbs) !== readText(productAbs)) {
|
|
142
|
+
drift.push({ path: rel, reason: 'differs' });
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
const agentStubDrift = (productRoot, kitRoot) => {
|
|
146
|
+
const templates = join(kitRoot, 'tooling/ysk-cli/templates/agent');
|
|
147
|
+
const rule = join(templates, 'ysk-kit.mdc');
|
|
148
|
+
const skillsDir = join(templates, 'skills');
|
|
149
|
+
if (!existsSync(rule) || !existsSync(skillsDir))
|
|
150
|
+
return [];
|
|
151
|
+
const drift = [];
|
|
152
|
+
compareTree(rule, join(productRoot, '.cursor/rules/ysk-kit.mdc'), '.cursor/rules/ysk-kit.mdc', drift);
|
|
153
|
+
for (const name of readdirSync(skillsDir)) {
|
|
154
|
+
const src = join(skillsDir, name, 'SKILL.md');
|
|
155
|
+
if (!existsSync(src) || !statSync(join(skillsDir, name)).isDirectory())
|
|
156
|
+
continue;
|
|
157
|
+
for (const tree of ['.cursor/skills', '.grok/skills']) {
|
|
158
|
+
const rel = `${tree}/${name}/SKILL.md`;
|
|
159
|
+
compareTree(src, join(productRoot, rel), rel, drift);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return drift;
|
|
163
|
+
};
|
|
164
|
+
const readMarker = (productRoot) => {
|
|
165
|
+
const path = join(productRoot, '.ysk-kit.json');
|
|
166
|
+
if (!existsSync(path))
|
|
167
|
+
return {};
|
|
168
|
+
try {
|
|
169
|
+
const rec = JSON.parse(readFileSync(path, 'utf8'));
|
|
170
|
+
if (!rec || typeof rec !== 'object')
|
|
171
|
+
return { error: '.ysk-kit.json is not valid JSON' };
|
|
172
|
+
return {
|
|
173
|
+
marker: {
|
|
174
|
+
version: typeof rec.version === 'string' ? rec.version : 'unknown',
|
|
175
|
+
flavor: typeof rec.flavor === 'string' ? rec.flavor : 'unknown',
|
|
176
|
+
},
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
return { error: '.ysk-kit.json is not valid JSON' };
|
|
181
|
+
}
|
|
182
|
+
};
|
|
183
|
+
const readPkg = (path) => {
|
|
184
|
+
if (!existsSync(path))
|
|
185
|
+
return undefined;
|
|
186
|
+
try {
|
|
187
|
+
return JSON.parse(readFileSync(path, 'utf8'));
|
|
188
|
+
}
|
|
189
|
+
catch {
|
|
190
|
+
return undefined;
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
const pnpmOnPath = () => {
|
|
194
|
+
const res = spawnSync('pnpm', ['--version'], { encoding: 'utf8' });
|
|
195
|
+
if (res.status !== 0 || !res.stdout?.trim())
|
|
196
|
+
return null;
|
|
197
|
+
return res.stdout.trim();
|
|
198
|
+
};
|
|
199
|
+
const enginesCheck = (productRoot, nodeVersion, pnpmVersion) => {
|
|
200
|
+
const rootPkgPath = join(productRoot, 'package.json');
|
|
201
|
+
const pkg = readPkg(rootPkgPath) ?? readPkg(join(productRoot, 'ts/package.json'));
|
|
202
|
+
if (!existsSync(rootPkgPath) && !existsSync(join(productRoot, 'ts/package.json'))) {
|
|
203
|
+
return check('engines', 'error', 'package.json is missing', 'Run create-ysk-app from a kit checkout, or restore the product package.json.');
|
|
204
|
+
}
|
|
205
|
+
if (!pkg) {
|
|
206
|
+
return check('engines', 'error', 'package.json is not valid JSON', 'Fix JSON syntax in package.json.');
|
|
207
|
+
}
|
|
208
|
+
const nodeRange = pkg.engines?.node;
|
|
209
|
+
const pnpmRange = pkg.engines?.pnpm;
|
|
210
|
+
const problems = [];
|
|
211
|
+
const warnings = [];
|
|
212
|
+
if (!nodeRange && !pnpmRange) {
|
|
213
|
+
warnings.push('package.json has no engines.node or engines.pnpm');
|
|
214
|
+
}
|
|
215
|
+
if (nodeRange && !satisfiesRange(nodeVersion, nodeRange)) {
|
|
216
|
+
problems.push(`Node ${nodeVersion} does not satisfy engines.node ${nodeRange}`);
|
|
217
|
+
}
|
|
218
|
+
if (pnpmRange && pnpmVersion === null) {
|
|
219
|
+
problems.push(`pnpm is not on PATH (engines.pnpm is ${pnpmRange})`);
|
|
220
|
+
}
|
|
221
|
+
else if (pnpmRange && pnpmVersion && !satisfiesRange(pnpmVersion, pnpmRange)) {
|
|
222
|
+
problems.push(`pnpm ${pnpmVersion} does not satisfy engines.pnpm ${pnpmRange}`);
|
|
223
|
+
}
|
|
224
|
+
const pinned = pkg.packageManager?.startsWith('pnpm@')
|
|
225
|
+
? pkg.packageManager.slice('pnpm@'.length)
|
|
226
|
+
: undefined;
|
|
227
|
+
if (pinned && pnpmVersion && pnpmVersion !== pinned) {
|
|
228
|
+
warnings.push(`packageManager pins pnpm@${pinned} but pnpm --version is ${pnpmVersion}`);
|
|
229
|
+
}
|
|
230
|
+
if (problems.length > 0) {
|
|
231
|
+
const message = [...problems, ...warnings].join('; ');
|
|
232
|
+
return check('engines', 'error', message, 'Install Node 24 and pnpm 12 (`corepack enable && corepack prepare pnpm@12.8.1 --activate`).');
|
|
233
|
+
}
|
|
234
|
+
if (warnings.length > 0) {
|
|
235
|
+
return check('engines', 'warn', warnings.join('; '), pinned
|
|
236
|
+
? `Run \`corepack prepare pnpm@${pinned} --activate\` so the packageManager pin matches.`
|
|
237
|
+
: 'Add engines.node >=24.0.0 and engines.pnpm >=12.0.0 to package.json.');
|
|
238
|
+
}
|
|
239
|
+
const nodeMsg = nodeRange ? `Node ${nodeVersion} satisfies ${nodeRange}` : `Node ${nodeVersion}`;
|
|
240
|
+
const pnpmMsg = pnpmVersion === null
|
|
241
|
+
? 'pnpm was not checked'
|
|
242
|
+
: pnpmRange
|
|
243
|
+
? `pnpm ${pnpmVersion} satisfies ${pnpmRange}`
|
|
244
|
+
: `pnpm ${pnpmVersion}`;
|
|
245
|
+
return check('engines', 'ok', `${nodeMsg}; ${pnpmMsg}`);
|
|
246
|
+
};
|
|
247
|
+
const loadEnv = (productRoot, overlay) => {
|
|
248
|
+
const filePath = join(productRoot, '.env');
|
|
249
|
+
const file = existsSync(filePath) ? parseEnvFile(readText(filePath)) : {};
|
|
250
|
+
const source = overlay ?? process.env;
|
|
251
|
+
const out = { ...file };
|
|
252
|
+
for (const [key, value] of Object.entries(source)) {
|
|
253
|
+
if (value !== undefined)
|
|
254
|
+
out[key] = value;
|
|
255
|
+
}
|
|
256
|
+
return out;
|
|
257
|
+
};
|
|
258
|
+
const envCheck = (flavor, hasApi, env, hasFile) => {
|
|
259
|
+
if (flavor === 'php-bridge') {
|
|
260
|
+
if (!env.API_PUBLIC_URL) {
|
|
261
|
+
return check('env', 'warn', 'API_PUBLIC_URL is unset; PHP and TypeScript clients default to http://localhost:3001', 'Set API_PUBLIC_URL to the Kit API these clients call.');
|
|
262
|
+
}
|
|
263
|
+
return check('env', 'ok', 'API_PUBLIC_URL is set');
|
|
264
|
+
}
|
|
265
|
+
if (flavor === 'static-web3' || !hasApi) {
|
|
266
|
+
const missing = ['API_PUBLIC_URL', 'WEB_PUBLIC_URL'].filter((key) => !env[key]);
|
|
267
|
+
if (missing.length > 0) {
|
|
268
|
+
return check('env', 'warn', `${missing.join(', ')} unset; public config falls back to localhost`, 'Copy .env.example to .env and set the public URLs.');
|
|
269
|
+
}
|
|
270
|
+
return check('env', 'ok', 'API_PUBLIC_URL and WEB_PUBLIC_URL are set');
|
|
271
|
+
}
|
|
272
|
+
const missing = ['DATABASE_URL', 'JWT_SECRET'].filter((key) => !env[key]?.trim());
|
|
273
|
+
if (missing.length === 0)
|
|
274
|
+
return check('env', 'ok', 'DATABASE_URL and JWT_SECRET are set');
|
|
275
|
+
const fix = hasFile
|
|
276
|
+
? `Set ${missing.join(' and ')} in .env.`
|
|
277
|
+
: 'Copy .env.example to .env, then set DATABASE_URL and JWT_SECRET.';
|
|
278
|
+
return check('env', 'error', `${missing.join(' and ')} ${missing.length === 1 ? 'is' : 'are'} missing`, fix);
|
|
279
|
+
};
|
|
280
|
+
const secretsCheck = (env, hasApi) => {
|
|
281
|
+
const production = env.NODE_ENV === 'production';
|
|
282
|
+
const issues = [];
|
|
283
|
+
const jwt = env.JWT_SECRET;
|
|
284
|
+
if (hasApi && jwt) {
|
|
285
|
+
const isDefault = JWT_DEFAULTS.has(jwt);
|
|
286
|
+
const tooShortForServer = jwt.length < 8;
|
|
287
|
+
const short = jwt.length < 32;
|
|
288
|
+
if (tooShortForServer) {
|
|
289
|
+
issues.push({
|
|
290
|
+
status: 'error',
|
|
291
|
+
message: `JWT_SECRET is ${jwt.length} characters; the API requires at least 8`,
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
else if (isDefault && production) {
|
|
295
|
+
issues.push({
|
|
296
|
+
status: 'error',
|
|
297
|
+
message: 'JWT_SECRET is an example default and NODE_ENV is production',
|
|
298
|
+
});
|
|
299
|
+
}
|
|
300
|
+
else if (isDefault) {
|
|
301
|
+
issues.push({
|
|
302
|
+
status: 'warn',
|
|
303
|
+
message: 'JWT_SECRET is an example placeholder',
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
else if (short && production) {
|
|
307
|
+
issues.push({
|
|
308
|
+
status: 'error',
|
|
309
|
+
message: `JWT_SECRET is ${jwt.length} characters; use at least 32 random characters in production`,
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
else if (short) {
|
|
313
|
+
issues.push({
|
|
314
|
+
status: 'warn',
|
|
315
|
+
message: `JWT_SECRET is ${jwt.length} characters; use at least 32 random characters`,
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
if (production) {
|
|
320
|
+
for (const [key, expected] of Object.entries(SEED_DEFAULTS)) {
|
|
321
|
+
if (env[key] === expected) {
|
|
322
|
+
issues.push({ status: 'error', message: `${key} is the example default in production` });
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
const crypto = env.CRYPTO_MASTER_KEY;
|
|
327
|
+
if (crypto && !/^[0-9a-fA-F]{64}$/.test(crypto)) {
|
|
328
|
+
issues.push({
|
|
329
|
+
status: 'error',
|
|
330
|
+
message: 'CRYPTO_MASTER_KEY must be 64 hex characters (32 bytes)',
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
else if (production && hasApi && !crypto) {
|
|
334
|
+
issues.push({
|
|
335
|
+
status: 'warn',
|
|
336
|
+
message: 'CRYPTO_MASTER_KEY is empty in production',
|
|
337
|
+
});
|
|
338
|
+
}
|
|
339
|
+
if (issues.length === 0) {
|
|
340
|
+
return check('secrets', 'ok', hasApi ? 'no insecure defaults detected' : 'no API secrets to check');
|
|
341
|
+
}
|
|
342
|
+
const status = issues.some((item) => item.status === 'error') ? 'error' : 'warn';
|
|
343
|
+
return check('secrets', status, issues.map((item) => item.message).join('; '), 'Replace example secrets with random values. Generate JWT_SECRET with `openssl rand -base64 32`. CRYPTO_MASTER_KEY is 64 hex chars (`openssl rand -hex 32`).');
|
|
344
|
+
};
|
|
345
|
+
export const resolveSqliteFile = (databaseUrl, productRoot) => {
|
|
346
|
+
let rest = databaseUrl.slice('file:'.length);
|
|
347
|
+
if (rest.startsWith('//')) {
|
|
348
|
+
const slash = rest.indexOf('/', 2);
|
|
349
|
+
rest = slash >= 0 ? rest.slice(slash) : rest;
|
|
350
|
+
}
|
|
351
|
+
if (rest.startsWith('/'))
|
|
352
|
+
return rest;
|
|
353
|
+
return join(productRoot, 'apps/api/prisma', rest);
|
|
354
|
+
};
|
|
355
|
+
const migrationNames = (productRoot) => {
|
|
356
|
+
const dir = join(productRoot, 'apps/api/prisma/migrations');
|
|
357
|
+
if (!existsSync(dir))
|
|
358
|
+
return [];
|
|
359
|
+
return readdirSync(dir)
|
|
360
|
+
.filter((name) => {
|
|
361
|
+
if (name === 'migration_lock.toml')
|
|
362
|
+
return false;
|
|
363
|
+
return statSync(join(dir, name)).isDirectory();
|
|
364
|
+
})
|
|
365
|
+
.sort();
|
|
366
|
+
};
|
|
367
|
+
const probeSqlite = (databaseUrl, productRoot) => {
|
|
368
|
+
const file = resolveSqliteFile(databaseUrl, productRoot);
|
|
369
|
+
const expected = migrationNames(productRoot);
|
|
370
|
+
if (!existsSync(file)) {
|
|
371
|
+
return {
|
|
372
|
+
reachable: false,
|
|
373
|
+
pending: expected,
|
|
374
|
+
detail: `SQLite file not found at ${file}`,
|
|
375
|
+
};
|
|
376
|
+
}
|
|
377
|
+
let db;
|
|
378
|
+
try {
|
|
379
|
+
db = openSqlite(file);
|
|
380
|
+
const tables = db
|
|
381
|
+
.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = '_prisma_migrations'")
|
|
382
|
+
.all();
|
|
383
|
+
if (tables.length === 0) {
|
|
384
|
+
return {
|
|
385
|
+
reachable: true,
|
|
386
|
+
pending: expected,
|
|
387
|
+
detail: 'SQLite file is readable and _prisma_migrations is missing',
|
|
388
|
+
};
|
|
389
|
+
}
|
|
390
|
+
const applied = db
|
|
391
|
+
.prepare('SELECT migration_name FROM _prisma_migrations WHERE finished_at IS NOT NULL AND rolled_back_at IS NULL')
|
|
392
|
+
.all();
|
|
393
|
+
const done = new Set(applied.map((row) => row.migration_name));
|
|
394
|
+
const pending = expected.filter((name) => !done.has(name));
|
|
395
|
+
return {
|
|
396
|
+
reachable: true,
|
|
397
|
+
pending,
|
|
398
|
+
detail: pending.length === 0 ? 'database schema is up to date' : 'migrations are not applied',
|
|
399
|
+
};
|
|
400
|
+
}
|
|
401
|
+
catch (error) {
|
|
402
|
+
return {
|
|
403
|
+
reachable: false,
|
|
404
|
+
pending: expected,
|
|
405
|
+
detail: error instanceof Error ? error.message : 'failed to open SQLite file',
|
|
406
|
+
};
|
|
407
|
+
}
|
|
408
|
+
finally {
|
|
409
|
+
db?.close();
|
|
410
|
+
}
|
|
411
|
+
};
|
|
412
|
+
export const interpretPrismaMigrateStatus = (result) => {
|
|
413
|
+
const text = `${result.stdout}\n${result.stderr}`;
|
|
414
|
+
if (/P1001|P1000|P1017|Can't reach database|ECONNREFUSED|ENOTFOUND/i.test(text)) {
|
|
415
|
+
return { reachable: false, pending: [], detail: 'database server is not reachable' };
|
|
416
|
+
}
|
|
417
|
+
const pendingBlock = text.split(/Following migrations? have not yet been applied:/i)[1];
|
|
418
|
+
if (pendingBlock) {
|
|
419
|
+
const names = pendingBlock
|
|
420
|
+
.split('\n')
|
|
421
|
+
.map((line) => line.trim())
|
|
422
|
+
.filter((line) => /^\d{8,}[_-]/.test(line));
|
|
423
|
+
return {
|
|
424
|
+
reachable: true,
|
|
425
|
+
pending: names.length > 0 ? names : ['pending'],
|
|
426
|
+
detail: 'migrations are not applied',
|
|
427
|
+
};
|
|
428
|
+
}
|
|
429
|
+
if (result.status === 0 && /Database schema is up to date/i.test(text)) {
|
|
430
|
+
return { reachable: true, pending: [], detail: 'database schema is up to date' };
|
|
431
|
+
}
|
|
432
|
+
if (result.status === 0) {
|
|
433
|
+
return { reachable: true, pending: [], detail: 'prisma migrate status exited 0' };
|
|
434
|
+
}
|
|
435
|
+
const tail = text
|
|
436
|
+
.trim()
|
|
437
|
+
.split('\n')
|
|
438
|
+
.map((line) => line.trim())
|
|
439
|
+
.filter((line) => line.length > 0)
|
|
440
|
+
.slice(-2)
|
|
441
|
+
.join(' ');
|
|
442
|
+
return {
|
|
443
|
+
reachable: false,
|
|
444
|
+
pending: [],
|
|
445
|
+
detail: tail.length > 0 ? tail : 'prisma migrate status failed',
|
|
446
|
+
};
|
|
447
|
+
};
|
|
448
|
+
const redact = (text) => text.replace(/\b(?:mysql|postgresql|postgres):\/\/\S+/gi, '[redacted-url]').slice(0, 400);
|
|
449
|
+
const probeRemote = (databaseUrl, productRoot) => {
|
|
450
|
+
const cwd = join(productRoot, 'apps/api');
|
|
451
|
+
const bin = join(productRoot, 'node_modules/.bin/prisma');
|
|
452
|
+
const cmd = existsSync(bin) ? bin : 'pnpm';
|
|
453
|
+
const args = existsSync(bin) ? ['migrate', 'status'] : ['exec', 'prisma', 'migrate', 'status'];
|
|
454
|
+
const res = spawnSync(cmd, args, {
|
|
455
|
+
cwd,
|
|
456
|
+
env: { ...process.env, DATABASE_URL: databaseUrl },
|
|
457
|
+
encoding: 'utf8',
|
|
458
|
+
timeout: 30_000,
|
|
459
|
+
});
|
|
460
|
+
if (res.error && res.status === null) {
|
|
461
|
+
return {
|
|
462
|
+
reachable: false,
|
|
463
|
+
pending: [],
|
|
464
|
+
detail: 'prisma CLI is not available',
|
|
465
|
+
};
|
|
466
|
+
}
|
|
467
|
+
return interpretPrismaMigrateStatus({
|
|
468
|
+
status: res.status,
|
|
469
|
+
stdout: res.stdout ?? '',
|
|
470
|
+
stderr: res.stderr ?? '',
|
|
471
|
+
});
|
|
472
|
+
};
|
|
473
|
+
const defaultProbe = (databaseUrl, productRoot) => {
|
|
474
|
+
if (databaseUrl.startsWith('file:'))
|
|
475
|
+
return probeSqlite(databaseUrl, productRoot);
|
|
476
|
+
if (/^(mysql|postgresql|postgres):/i.test(databaseUrl))
|
|
477
|
+
return probeRemote(databaseUrl, productRoot);
|
|
478
|
+
return {
|
|
479
|
+
reachable: false,
|
|
480
|
+
pending: [],
|
|
481
|
+
detail: 'DATABASE_URL scheme is not mysql, postgresql, or sqlite',
|
|
482
|
+
};
|
|
483
|
+
};
|
|
484
|
+
const databaseCheck = (hasApi, flavor, env, productRoot, probe) => {
|
|
485
|
+
if (!hasApi) {
|
|
486
|
+
const why = flavor === 'static-web3'
|
|
487
|
+
? 'static-web3 has no API database'
|
|
488
|
+
: flavor === 'php-bridge'
|
|
489
|
+
? 'php-bridge has no API database'
|
|
490
|
+
: 'no Prisma schema';
|
|
491
|
+
return check('database', 'ok', `${why}; database check skipped`);
|
|
492
|
+
}
|
|
493
|
+
const databaseUrl = env.DATABASE_URL?.trim();
|
|
494
|
+
if (!databaseUrl) {
|
|
495
|
+
return check('database', 'error', 'DATABASE_URL is missing, so reachability and migrations were not checked', 'Set DATABASE_URL, start the database, then run `pnpm db:migrate`.');
|
|
496
|
+
}
|
|
497
|
+
const result = probe(databaseUrl, productRoot);
|
|
498
|
+
const detail = redact(result.detail);
|
|
499
|
+
if (!result.reachable) {
|
|
500
|
+
const sqlite = databaseUrl.startsWith('file:');
|
|
501
|
+
return check('database', 'error', detail, sqlite
|
|
502
|
+
? 'Create the SQLite file by running `pnpm db:migrate` from the product root.'
|
|
503
|
+
: 'Start the database (`docker compose up -d`) and confirm DATABASE_URL, then run `pnpm db:migrate`.');
|
|
504
|
+
}
|
|
505
|
+
if (result.pending.length > 0) {
|
|
506
|
+
const shown = result.pending.slice(0, 8).join(', ');
|
|
507
|
+
const extra = result.pending.length > 8 ? ` (+${result.pending.length - 8} more)` : '';
|
|
508
|
+
return check('database', 'error', `migrations not applied: ${shown}${extra}`, 'Apply them with `pnpm db:migrate` in development, or `pnpm --filter @ysk-kit/api prisma:migrate:deploy` in production.');
|
|
509
|
+
}
|
|
510
|
+
return check('database', 'ok', detail || 'database schema is up to date');
|
|
511
|
+
};
|
|
512
|
+
const rulesCheck = (productRoot, kitRoot) => {
|
|
513
|
+
const workspace = existsSync(join(productRoot, 'pnpm-workspace.yaml'));
|
|
514
|
+
const parsed = readMarker(productRoot);
|
|
515
|
+
if (parsed.error) {
|
|
516
|
+
return check('rules', 'error', parsed.error, 'Restore .ysk-kit.json or run `pnpm ysk-kit upgrade`.');
|
|
517
|
+
}
|
|
518
|
+
if (!workspace) {
|
|
519
|
+
return check('rules', 'ok', 'not a workspace product; guardrail copy does not apply');
|
|
520
|
+
}
|
|
521
|
+
const drift = [];
|
|
522
|
+
for (const rel of UPGRADE_PATHS) {
|
|
523
|
+
const from = join(kitRoot, rel);
|
|
524
|
+
if (!existsSync(from))
|
|
525
|
+
continue;
|
|
526
|
+
compareTree(from, join(productRoot, rel), rel, drift);
|
|
527
|
+
}
|
|
528
|
+
drift.push(...agentStubDrift(productRoot, kitRoot));
|
|
529
|
+
let kitVersion = 'unknown';
|
|
530
|
+
try {
|
|
531
|
+
kitVersion = readKitVersion(kitRoot);
|
|
532
|
+
}
|
|
533
|
+
catch {
|
|
534
|
+
kitVersion = 'unknown';
|
|
535
|
+
}
|
|
536
|
+
const markerVersion = parsed.marker?.version;
|
|
537
|
+
const versionBehind = markerVersion !== undefined && markerVersion !== kitVersion;
|
|
538
|
+
if (drift.length > 0) {
|
|
539
|
+
const shown = drift
|
|
540
|
+
.slice(0, 12)
|
|
541
|
+
.map((item) => `${item.path} (${item.reason})`)
|
|
542
|
+
.join(', ');
|
|
543
|
+
const extra = drift.length > 12 ? ` (+${drift.length - 12} more)` : '';
|
|
544
|
+
return check('rules', 'error', `guardrails differ from this kit: ${shown}${extra}`, 'Run `pnpm ysk-kit upgrade` from the product root (or set YSK_ROOT and run this kit CLI).');
|
|
545
|
+
}
|
|
546
|
+
if (!parsed.marker) {
|
|
547
|
+
return check('rules', 'warn', 'guardrail files match and .ysk-kit.json is missing', 'Run `pnpm ysk-kit upgrade` to write the origin marker.');
|
|
548
|
+
}
|
|
549
|
+
if (versionBehind) {
|
|
550
|
+
return check('rules', 'warn', `guardrail files match; .ysk-kit.json version is ${markerVersion} and this kit is ${kitVersion}`, 'Run `pnpm ysk-kit upgrade` to refresh the marker version.');
|
|
551
|
+
}
|
|
552
|
+
return check('rules', 'ok', `guardrails match kit ${kitVersion}`);
|
|
553
|
+
};
|
|
554
|
+
const agentCheck = (productRoot) => {
|
|
555
|
+
const findings = checkAgent(productRoot);
|
|
556
|
+
if (findings.length === 0)
|
|
557
|
+
return check('agent', 'ok', 'ysk-kit check agent: ok');
|
|
558
|
+
const shown = findings.slice(0, 20);
|
|
559
|
+
const extra = findings.length > shown.length ? `\n(+${findings.length - shown.length} more)` : '';
|
|
560
|
+
return check('agent', 'error', `${formatAgentFindings(shown)}${extra}`, 'Remove TypeScript enums, Prisma imports, and raw fetch from client apps. See docs/cli/ysk-kit.md.');
|
|
561
|
+
};
|
|
562
|
+
export const doctor = (opts) => {
|
|
563
|
+
const nodeVersion = opts.nodeVersion ?? process.versions.node;
|
|
564
|
+
const pnpmVersion = opts.pnpmVersion === undefined ? pnpmOnPath() : opts.pnpmVersion;
|
|
565
|
+
const parsed = readMarker(opts.productRoot);
|
|
566
|
+
const flavor = parsed.marker?.flavor ?? 'unknown';
|
|
567
|
+
const hasApi = existsSync(join(opts.productRoot, 'apps/api/prisma/schema.prisma'));
|
|
568
|
+
const env = loadEnv(opts.productRoot, opts.env);
|
|
569
|
+
const hasFile = existsSync(join(opts.productRoot, '.env'));
|
|
570
|
+
const probe = (databaseUrl, productRoot) => opts.probeDatabase
|
|
571
|
+
? opts.probeDatabase({ databaseUrl, productRoot })
|
|
572
|
+
: defaultProbe(databaseUrl, productRoot);
|
|
573
|
+
const checks = [
|
|
574
|
+
enginesCheck(opts.productRoot, nodeVersion, pnpmVersion),
|
|
575
|
+
envCheck(flavor, hasApi, env, hasFile),
|
|
576
|
+
secretsCheck(env, hasApi && flavor !== 'static-web3' && flavor !== 'php-bridge'),
|
|
577
|
+
databaseCheck(hasApi, flavor, env, opts.productRoot, probe),
|
|
578
|
+
rulesCheck(opts.productRoot, opts.kitRoot),
|
|
579
|
+
agentCheck(opts.productRoot),
|
|
580
|
+
];
|
|
581
|
+
const errors = checks.filter((item) => item.status === 'error').length;
|
|
582
|
+
const warnings = checks.filter((item) => item.status === 'warn').length;
|
|
583
|
+
return { ok: errors === 0, errors, warnings, checks };
|
|
584
|
+
};
|
|
585
|
+
export const formatDoctorReport = (report) => {
|
|
586
|
+
const lines = ['ysk-kit doctor', ''];
|
|
587
|
+
for (const item of report.checks) {
|
|
588
|
+
lines.push(`[${item.status}] ${item.id} ${item.message}`);
|
|
589
|
+
if (item.fix)
|
|
590
|
+
lines.push(` fix: ${item.fix}`);
|
|
591
|
+
}
|
|
592
|
+
lines.push('');
|
|
593
|
+
const summary = report.errors === 0 && report.warnings === 0
|
|
594
|
+
? 'ysk-kit doctor: ok'
|
|
595
|
+
: `ysk-kit doctor: ${report.errors} error(s), ${report.warnings} warning(s)`;
|
|
596
|
+
lines.push(summary);
|
|
597
|
+
return lines.join('\n');
|
|
598
|
+
};
|
|
599
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"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"}
|
package/dist/help.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../src/help.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,IAAI,
|
|
1
|
+
{"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../src/help.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,IAAI,QA4DhB,CAAC"}
|
package/dist/help.js
CHANGED
|
@@ -7,6 +7,7 @@ Usage:
|
|
|
7
7
|
pnpm ysk-kit generate openapi
|
|
8
8
|
pnpm ysk-kit upgrade [--dry-run]
|
|
9
9
|
pnpm ysk-kit check agent
|
|
10
|
+
pnpm ysk-kit doctor [--json]
|
|
10
11
|
|
|
11
12
|
Commands:
|
|
12
13
|
add module <name>
|
|
@@ -42,6 +43,14 @@ Commands:
|
|
|
42
43
|
Prisma imports in web/admin/mobile/desktop, and raw fetch in those
|
|
43
44
|
apps. Prints rule id + file:line. Exit 1 when anything matches.
|
|
44
45
|
|
|
46
|
+
doctor [--json]
|
|
47
|
+
Check a generated product: Node and pnpm versus engines, required
|
|
48
|
+
env vars, insecure defaults (JWT_SECRET placeholder or shorter than
|
|
49
|
+
32 characters), database reachability and applied Prisma migrations,
|
|
50
|
+
guardrail files versus \`ysk-kit upgrade\`, and \`check agent\`.
|
|
51
|
+
Warnings stay on exit 0. Exit 1 when any check is an error.
|
|
52
|
+
--json Print { ok, errors, warnings, checks } and no secret values.
|
|
53
|
+
|
|
45
54
|
Environment:
|
|
46
55
|
YSK_ROOT Product root to patch (default: this repository)
|
|
47
56
|
|
package/dist/help.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"help.js","sourceRoot":"","sources":["../src/help.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,CAAC,MAAM,IAAI,GAAG
|
|
1
|
+
{"version":3,"file":"help.js","sourceRoot":"","sources":["../src/help.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,CAAC,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;;;;;sBAsBE,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsC5C,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -3,6 +3,7 @@ import { fileURLToPath } from 'node:url';
|
|
|
3
3
|
import { addCapability } from './add-capability';
|
|
4
4
|
import { addModule } from './add-module';
|
|
5
5
|
import { checkAgent, formatAgentFindings } from './check-agent';
|
|
6
|
+
import { doctor, formatDoctorReport } from './doctor';
|
|
6
7
|
import { generateOpenApi } from './generate-openapi';
|
|
7
8
|
import { HELP } from './help';
|
|
8
9
|
import { upgrade } from './upgrade';
|
|
@@ -39,6 +40,14 @@ try {
|
|
|
39
40
|
console.log(formatAgentFindings(findings));
|
|
40
41
|
process.exit(findings.length === 0 ? 0 : 1);
|
|
41
42
|
}
|
|
43
|
+
if (args[0] === 'doctor') {
|
|
44
|
+
const report = doctor({ productRoot: root, kitRoot });
|
|
45
|
+
if (args.includes('--json'))
|
|
46
|
+
console.log(JSON.stringify(report, null, 2));
|
|
47
|
+
else
|
|
48
|
+
console.log(formatDoctorReport(report));
|
|
49
|
+
process.exit(report.ok ? 0 : 1);
|
|
50
|
+
}
|
|
42
51
|
if (args[0] === 'upgrade') {
|
|
43
52
|
const logs = upgrade({
|
|
44
53
|
productRoot: root,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ysk-kit/cli",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"bin": {
|
|
6
6
|
"ysk-kit": "./dist/index.js",
|
|
7
7
|
"yskk": "./dist/index.js"
|
|
8
8
|
},
|
|
9
9
|
"dependencies": {
|
|
10
|
-
"@ysk-kit/api-http": "1.0
|
|
11
|
-
"@ysk-kit/contracts": "1.0
|
|
10
|
+
"@ysk-kit/api-http": "1.1.0",
|
|
11
|
+
"@ysk-kit/contracts": "1.1.0",
|
|
12
12
|
"zod": "^4.6.5"
|
|
13
13
|
},
|
|
14
14
|
"devDependencies": {
|
|
15
|
-
"@types/node": "^24.
|
|
16
|
-
"tsx": "^4.
|
|
15
|
+
"@types/node": "^24.19.0",
|
|
16
|
+
"tsx": "^4.23.15",
|
|
17
17
|
"typescript": "^6.0.3",
|
|
18
|
-
"vitest": "^5.0.
|
|
18
|
+
"vitest": "^5.0.3"
|
|
19
19
|
},
|
|
20
20
|
"files": [
|
|
21
21
|
"dist",
|
|
@@ -25,6 +25,14 @@
|
|
|
25
25
|
"registry": "https://registry.npmjs.org",
|
|
26
26
|
"access": "public"
|
|
27
27
|
},
|
|
28
|
+
"license": "MIT",
|
|
29
|
+
"description": "ysk-kit CLI for modules, capabilities, OpenAPI, and agent checks.",
|
|
30
|
+
"homepage": "https://ysk.hk/products/ysk-kit",
|
|
31
|
+
"repository": {
|
|
32
|
+
"type": "git",
|
|
33
|
+
"url": "git+https://github.com/yanshekki/ysk-kit.git",
|
|
34
|
+
"directory": "tooling/ysk-cli"
|
|
35
|
+
},
|
|
28
36
|
"scripts": {
|
|
29
37
|
"start": "tsx src/index.ts",
|
|
30
38
|
"typecheck": "tsc --noEmit -p tsconfig.json",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: verify-change
|
|
3
3
|
description: >
|
|
4
|
-
Verify a YSK Kit change with pnpm layers, typecheck, test, gen:openapi, and ysk check agent.
|
|
4
|
+
Verify a YSK Kit change with pnpm layers, typecheck, test, gen:openapi, and ysk-kit check agent.
|
|
5
5
|
Use when a feature is done, before finishing, after a module, or /verify-change.
|
|
6
6
|
---
|
|
7
7
|
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import { createDevicePort, enablePush } from './push';
|
|
3
|
+
|
|
4
|
+
describe('device port', () => {
|
|
5
|
+
it('registers a token through the sdk', async () => {
|
|
6
|
+
const register = vi.fn(async () => ({
|
|
7
|
+
id: 'd1',
|
|
8
|
+
platform: 'ios' as const,
|
|
9
|
+
tokenSuffix: 'tokenxxx',
|
|
10
|
+
createdAt: new Date().toISOString(),
|
|
11
|
+
}));
|
|
12
|
+
const port = createDevicePort({
|
|
13
|
+
api: { devices: { register } } as never,
|
|
14
|
+
platform: 'ios',
|
|
15
|
+
});
|
|
16
|
+
await expect(enablePush(port, async () => 'ExponentPushToken[testtoken]')).resolves.toBe(true);
|
|
17
|
+
expect(register).toHaveBeenCalledWith({
|
|
18
|
+
token: 'ExponentPushToken[testtoken]',
|
|
19
|
+
platform: 'ios',
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
});
|