@ysk-kit/cli 1.0.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.
Files changed (125) hide show
  1. package/LICENSE +21 -0
  2. package/dist/add-capability.d.ts +4 -0
  3. package/dist/add-capability.d.ts.map +1 -0
  4. package/dist/add-capability.js +104 -0
  5. package/dist/add-capability.js.map +1 -0
  6. package/dist/add-module.d.ts +5 -0
  7. package/dist/add-module.d.ts.map +1 -0
  8. package/dist/add-module.js +210 -0
  9. package/dist/add-module.js.map +1 -0
  10. package/dist/agent-stubs.d.ts +3 -0
  11. package/dist/agent-stubs.d.ts.map +1 -0
  12. package/dist/agent-stubs.js +25 -0
  13. package/dist/agent-stubs.js.map +1 -0
  14. package/dist/apply-capability.d.ts +3 -0
  15. package/dist/apply-capability.d.ts.map +1 -0
  16. package/dist/apply-capability.js +189 -0
  17. package/dist/apply-capability.js.map +1 -0
  18. package/dist/capability-catalog.d.ts +25 -0
  19. package/dist/capability-catalog.d.ts.map +1 -0
  20. package/dist/capability-catalog.js +123 -0
  21. package/dist/capability-catalog.js.map +1 -0
  22. package/dist/capability-patches.d.ts +40 -0
  23. package/dist/capability-patches.d.ts.map +1 -0
  24. package/dist/capability-patches.js +616 -0
  25. package/dist/capability-patches.js.map +1 -0
  26. package/dist/check-agent.d.ts +9 -0
  27. package/dist/check-agent.d.ts.map +1 -0
  28. package/dist/check-agent.js +85 -0
  29. package/dist/check-agent.js.map +1 -0
  30. package/dist/generate-openapi.d.ts +2 -0
  31. package/dist/generate-openapi.d.ts.map +1 -0
  32. package/dist/generate-openapi.js +52 -0
  33. package/dist/generate-openapi.js.map +1 -0
  34. package/dist/help.d.ts +2 -0
  35. package/dist/help.d.ts.map +1 -0
  36. package/dist/help.js +54 -0
  37. package/dist/help.js.map +1 -0
  38. package/dist/index.d.ts +2 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +59 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/merge-prisma.d.ts +15 -0
  43. package/dist/merge-prisma.d.ts.map +1 -0
  44. package/dist/merge-prisma.js +90 -0
  45. package/dist/merge-prisma.js.map +1 -0
  46. package/dist/patch-text.d.ts +17 -0
  47. package/dist/patch-text.d.ts.map +1 -0
  48. package/dist/patch-text.js +72 -0
  49. package/dist/patch-text.js.map +1 -0
  50. package/dist/upgrade.d.ts +16 -0
  51. package/dist/upgrade.d.ts.map +1 -0
  52. package/dist/upgrade.js +110 -0
  53. package/dist/upgrade.js.map +1 -0
  54. package/package.json +41 -0
  55. package/templates/agent/skills/add-capability/SKILL.md +8 -0
  56. package/templates/agent/skills/add-module/SKILL.md +8 -0
  57. package/templates/agent/skills/envelope-api/SKILL.md +8 -0
  58. package/templates/agent/skills/fix-layers/SKILL.md +8 -0
  59. package/templates/agent/skills/new-product/SKILL.md +8 -0
  60. package/templates/agent/skills/verify-change/SKILL.md +8 -0
  61. package/templates/agent/ysk-kit.mdc +6 -0
  62. package/templates/capabilities/billing/apps/api/src/modules/billing/application/billing-service.ts +140 -0
  63. package/templates/capabilities/billing/apps/api/src/modules/billing/domain/billing-port.ts +23 -0
  64. package/templates/capabilities/billing/apps/api/src/modules/billing/domain/subscription-repository.ts +22 -0
  65. package/templates/capabilities/billing/apps/api/src/modules/billing/infra/billing-router.ts +85 -0
  66. package/templates/capabilities/billing/apps/api/src/modules/billing/infra/billing.app.test.ts +273 -0
  67. package/templates/capabilities/billing/apps/api/src/modules/billing/infra/log-billing.ts +31 -0
  68. package/templates/capabilities/billing/apps/api/src/modules/billing/infra/memory-subscription-repository.ts +27 -0
  69. package/templates/capabilities/billing/apps/api/src/modules/billing/infra/prisma-subscription-repository.ts +52 -0
  70. package/templates/capabilities/billing/apps/api/src/modules/billing/infra/stripe-billing.test.ts +127 -0
  71. package/templates/capabilities/billing/apps/api/src/modules/billing/infra/stripe-billing.ts +160 -0
  72. package/templates/capabilities/billing/apps/web/src/features/orgs/billing-page.tsx +183 -0
  73. package/templates/capabilities/billing/packages/contracts/src/api/billing.ts +85 -0
  74. package/templates/capabilities/billing/packages/contracts/src/dto/billing.ts +59 -0
  75. package/templates/capabilities/billing/packages/sdk/src/resources/billing.ts +38 -0
  76. package/templates/capabilities/billing/packages/web-sdk/src/billing-hooks.ts +56 -0
  77. package/templates/capabilities/llm/apps/api/src/modules/llm/application/llm-service.ts +48 -0
  78. package/templates/capabilities/llm/apps/api/src/modules/llm/domain/usage-repository.ts +10 -0
  79. package/templates/capabilities/llm/apps/api/src/modules/llm/infra/llm-router.ts +88 -0
  80. package/templates/capabilities/llm/apps/api/src/modules/llm/infra/llm.app.test.ts +89 -0
  81. package/templates/capabilities/llm/apps/api/src/modules/llm/infra/memory-usage-repository.ts +13 -0
  82. package/templates/capabilities/llm/apps/api/src/modules/llm/infra/prisma-usage-repository.ts +17 -0
  83. package/templates/capabilities/llm/apps/web/src/features/llm/llm-page.tsx +53 -0
  84. package/templates/capabilities/llm/packages/contracts/src/api/llm.ts +26 -0
  85. package/templates/capabilities/llm/packages/contracts/src/dto/llm.ts +33 -0
  86. package/templates/capabilities/llm/packages/sdk/src/resources/llm.ts +68 -0
  87. package/templates/capabilities/llm/packages/web-sdk/src/llm-hooks.ts +12 -0
  88. package/templates/capabilities/push/apps/api/src/modules/devices/application/device-service.ts +42 -0
  89. package/templates/capabilities/push/apps/api/src/modules/devices/domain/device-repository.ts +22 -0
  90. package/templates/capabilities/push/apps/api/src/modules/devices/infra/device-router.ts +42 -0
  91. package/templates/capabilities/push/apps/api/src/modules/devices/infra/device.app.test.ts +34 -0
  92. package/templates/capabilities/push/apps/api/src/modules/devices/infra/memory-device-repository.ts +33 -0
  93. package/templates/capabilities/push/apps/api/src/modules/devices/infra/prisma-device-repository.ts +42 -0
  94. package/templates/capabilities/push/apps/mobile/src/adapters/push.ts +21 -0
  95. package/templates/capabilities/push/packages/contracts/src/api/devices.ts +33 -0
  96. package/templates/capabilities/push/packages/contracts/src/dto/device.ts +18 -0
  97. package/templates/capabilities/push/packages/sdk/src/resources/devices.ts +10 -0
  98. package/templates/capabilities/team/apps/api/src/modules/organizations/application/organization-service.ts +272 -0
  99. package/templates/capabilities/team/apps/api/src/modules/organizations/domain/organization-repository.ts +58 -0
  100. package/templates/capabilities/team/apps/api/src/modules/organizations/infra/memory-organization-repository.ts +141 -0
  101. package/templates/capabilities/team/apps/api/src/modules/organizations/infra/organization-router.ts +130 -0
  102. package/templates/capabilities/team/apps/api/src/modules/organizations/infra/organization.app.test.ts +213 -0
  103. package/templates/capabilities/team/apps/api/src/modules/organizations/infra/prisma-organization-repository.ts +142 -0
  104. package/templates/capabilities/team/apps/mobile/src/screens/invite-screen.tsx +40 -0
  105. package/templates/capabilities/team/apps/mobile/src/screens/org-detail-screen.tsx +154 -0
  106. package/templates/capabilities/team/apps/mobile/src/screens/orgs-screen.tsx +53 -0
  107. package/templates/capabilities/team/apps/web/src/features/orgs/invite-page.tsx +77 -0
  108. package/templates/capabilities/team/apps/web/src/features/orgs/org-detail-page.tsx +138 -0
  109. package/templates/capabilities/team/apps/web/src/features/orgs/orgs-page.tsx +73 -0
  110. package/templates/capabilities/team/packages/contracts/src/api/organizations.ts +154 -0
  111. package/templates/capabilities/team/packages/contracts/src/dto/organization.ts +58 -0
  112. package/templates/capabilities/team/packages/sdk/src/resources/organizations.ts +53 -0
  113. package/templates/capabilities/team/packages/web-sdk/src/organizations-hooks.ts +80 -0
  114. package/templates/module/api.ts.tmpl +32 -0
  115. package/templates/module/application-service.ts.tmpl +9 -0
  116. package/templates/module/domain-repository.ts.tmpl +15 -0
  117. package/templates/module/dto.ts.tmpl +21 -0
  118. package/templates/module/memory-repository.ts.tmpl +36 -0
  119. package/templates/module/model.prisma.tmpl +8 -0
  120. package/templates/module/prisma-repository.ts.tmpl +38 -0
  121. package/templates/module/router.ts.tmpl +32 -0
  122. package/templates/module/sdk-resource.ts.tmpl +17 -0
  123. package/templates/module/service.test.ts.tmpl +33 -0
  124. package/templates/module/web-hooks.ts.tmpl +24 -0
  125. package/templates/module/web-page.tsx.tmpl +69 -0
@@ -0,0 +1,9 @@
1
+ export type AgentFinding = {
2
+ rule: 'no-ts-enum' | 'clients-no-prisma' | 'clients-no-raw-fetch';
3
+ file: string;
4
+ line: number;
5
+ };
6
+ export declare const RAW_FETCH_ALLOWLIST: Set<string>;
7
+ export declare const checkAgent: (productRoot: string) => AgentFinding[];
8
+ export declare const formatAgentFindings: (findings: AgentFinding[]) => string;
9
+ //# sourceMappingURL=check-agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-agent.d.ts","sourceRoot":"","sources":["../src/check-agent.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,YAAY,GAAG,mBAAmB,GAAG,sBAAsB,CAAC;IAClE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAgBF,eAAO,MAAM,mBAAmB,aAA8D,CAAC;AAyC/F,eAAO,MAAM,UAAU,GAAI,aAAa,MAAM,KAAG,YAAY,EA+B5D,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,UAAU,YAAY,EAAE,KAAG,MAI9D,CAAC"}
@@ -0,0 +1,85 @@
1
+ import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';
2
+ import { join, relative, sep } from 'node:path';
3
+ const SKIP_DIRS = new Set([
4
+ 'node_modules',
5
+ 'dist',
6
+ 'generated',
7
+ 'coverage',
8
+ '.git',
9
+ '.turbo',
10
+ '.expo',
11
+ ]);
12
+ const SCAN_ROOTS = ['apps', 'packages', 'modules'];
13
+ const CLIENT_PREFIXES = ['apps/web/', 'apps/admin/', 'apps/mobile/', 'apps/desktop/'];
14
+ export const RAW_FETCH_ALLOWLIST = new Set(['apps/admin/src/features/queues/queues-page.tsx']);
15
+ const ENUM_RE = /\b(?:const\s+)?enum\s+[A-Za-z_][\w]*\s*\{/;
16
+ const PRISMA_RE = /@prisma\/client|@ysk-kit\/db-prisma|apps\/api\/src\/generated|generated\/prisma/;
17
+ const FETCH_RE = /\bfetch\s*\(/;
18
+ const toPosix = (rel) => rel.split(sep).join('/');
19
+ const isSourceFile = (name) => {
20
+ if (name.endsWith('.d.ts'))
21
+ return false;
22
+ if (name.endsWith('.test.ts') || name.endsWith('.test.tsx'))
23
+ return false;
24
+ return name.endsWith('.ts') || name.endsWith('.tsx');
25
+ };
26
+ const isCommentLine = (line) => {
27
+ const trimmed = line.trim();
28
+ return (trimmed.startsWith('//') ||
29
+ trimmed.startsWith('*') ||
30
+ trimmed.startsWith('/*') ||
31
+ trimmed.startsWith('*/'));
32
+ };
33
+ const isClientFile = (rel) => CLIENT_PREFIXES.some((prefix) => rel.startsWith(prefix));
34
+ const walk = (dir, files) => {
35
+ if (!existsSync(dir))
36
+ return;
37
+ for (const entry of readdirSync(dir)) {
38
+ if (SKIP_DIRS.has(entry))
39
+ continue;
40
+ const path = join(dir, entry);
41
+ const stat = statSync(path);
42
+ if (stat.isDirectory()) {
43
+ walk(path, files);
44
+ continue;
45
+ }
46
+ if (isSourceFile(entry))
47
+ files.push(path);
48
+ }
49
+ };
50
+ export const checkAgent = (productRoot) => {
51
+ const files = [];
52
+ for (const root of SCAN_ROOTS) {
53
+ walk(join(productRoot, root), files);
54
+ }
55
+ const findings = [];
56
+ for (const abs of files) {
57
+ const file = toPosix(relative(productRoot, abs));
58
+ const client = isClientFile(file);
59
+ const lines = readFileSync(abs, 'utf8').split(/\r?\n/);
60
+ for (let i = 0; i < lines.length; i += 1) {
61
+ const line = lines[i] ?? '';
62
+ if (isCommentLine(line))
63
+ continue;
64
+ const at = i + 1;
65
+ if (ENUM_RE.test(line)) {
66
+ findings.push({ rule: 'no-ts-enum', file, line: at });
67
+ }
68
+ if (client && PRISMA_RE.test(line)) {
69
+ findings.push({ rule: 'clients-no-prisma', file, line: at });
70
+ }
71
+ if (client && FETCH_RE.test(line) && !RAW_FETCH_ALLOWLIST.has(file)) {
72
+ findings.push({ rule: 'clients-no-raw-fetch', file, line: at });
73
+ }
74
+ }
75
+ }
76
+ findings.sort((a, b) => a.file.localeCompare(b.file) || a.line - b.line || a.rule.localeCompare(b.rule));
77
+ return findings;
78
+ };
79
+ export const formatAgentFindings = (findings) => {
80
+ if (findings.length === 0)
81
+ return 'ysk check agent: ok';
82
+ const width = Math.max(...findings.map((item) => item.rule.length));
83
+ return findings.map((item) => `${item.rule.padEnd(width)} ${item.file}:${item.line}`).join('\n');
84
+ };
85
+ //# sourceMappingURL=check-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-agent.js","sourceRoot":"","sources":["../src/check-agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const generateOpenApi: (root: string) => string;
2
+ //# sourceMappingURL=generate-openapi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-openapi.d.ts","sourceRoot":"","sources":["../src/generate-openapi.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,eAAe,GAAI,MAAM,MAAM,KAAG,MAM9C,CAAC"}
@@ -0,0 +1,52 @@
1
+ import { mkdirSync, writeFileSync } from 'node:fs';
2
+ import { dirname, join } from 'node:path';
3
+ import { buildOpenApiDocument } from '@ysk-kit/api-http';
4
+ import { appContract } from '@ysk-kit/contracts';
5
+ export const generateOpenApi = (root) => {
6
+ const spec = buildOpenApiDocument(appContract);
7
+ const out = join(root, 'docs/openapi.yaml');
8
+ mkdirSync(dirname(out), { recursive: true });
9
+ writeFileSync(out, stringifyYaml(spec));
10
+ return out;
11
+ };
12
+ const stringifyYaml = (value, indent = 0) => {
13
+ const pad = ' '.repeat(indent);
14
+ if (value === null || value === undefined)
15
+ return 'null';
16
+ if (typeof value === 'string')
17
+ return JSON.stringify(value);
18
+ if (typeof value === 'number' || typeof value === 'boolean')
19
+ return String(value);
20
+ if (Array.isArray(value)) {
21
+ if (value.length === 0)
22
+ return '[]';
23
+ return value
24
+ .map((item) => {
25
+ if (item && typeof item === 'object') {
26
+ const body = stringifyYaml(item, indent + 1);
27
+ return `${pad}- ${body.trimStart()}`;
28
+ }
29
+ return `${pad}- ${stringifyYaml(item)}`;
30
+ })
31
+ .join('\n');
32
+ }
33
+ if (typeof value === 'object') {
34
+ const entries = Object.entries(value);
35
+ if (entries.length === 0)
36
+ return '{}';
37
+ return entries
38
+ .map(([k, v]) => {
39
+ const nested = stringifyYaml(v, indent + 1);
40
+ if (v && typeof v === 'object' && !Array.isArray(v)) {
41
+ return `${pad}${k}:\n${nested}`;
42
+ }
43
+ if (Array.isArray(v) && v.length > 0 && typeof v[0] === 'object') {
44
+ return `${pad}${k}:\n${nested}`;
45
+ }
46
+ return `${pad}${k}: ${nested}`;
47
+ })
48
+ .join('\n');
49
+ }
50
+ return JSON.stringify(value);
51
+ };
52
+ //# sourceMappingURL=generate-openapi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-openapi.js","sourceRoot":"","sources":["../src/generate-openapi.ts"],"names":[],"mappings":"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"}
package/dist/help.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export declare const HELP: string;
2
+ //# sourceMappingURL=help.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../src/help.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,IAAI,QAmDhB,CAAC"}
package/dist/help.js ADDED
@@ -0,0 +1,54 @@
1
+ import { CAPABILITIES } from './add-capability';
2
+ export const HELP = `ysk — generator for YSK Kit products
3
+
4
+ Usage:
5
+ pnpm ysk add module <kebab-name> [--prisma] [--web] [--no-web]
6
+ pnpm ysk add <capability>
7
+ pnpm ysk generate openapi
8
+ pnpm ysk upgrade [--dry-run]
9
+ pnpm ysk check agent
10
+
11
+ Commands:
12
+ add module <name>
13
+ Scaffold one hexagonal HTTP slice: contract, DTO, memory + Prisma
14
+ repositories, Express + Fastify handlers, SDK resource, web-sdk hooks,
15
+ optional Vite page, and a memory-repo service test.
16
+ --prisma Merge a title/body/authorId Prisma model (off by default)
17
+ --web Write apps/web page (on by default)
18
+ --no-web Skip the Vite page
19
+ Name must be kebab-case (booking, inventory-item). Path is /v1/<name>.
20
+
21
+ add <capability>
22
+ Merge a catalogued platform capability into the product root.
23
+ Capabilities: ${CAPABILITIES.join(', ')}
24
+ Alias: org → team
25
+ billing requires team (Organization model) first.
26
+ llm, team, billing, and push copy source trees when the product does
27
+ not already wire them. A second run is a no-op.
28
+
29
+ generate openapi
30
+ Write docs/openapi.yaml from the ts-rest app contract.
31
+
32
+ upgrade [--dry-run]
33
+ Copy allowlisted guardrail files from this kit checkout into the
34
+ product root (YSK_ROOT). Overwrites AGENTS.md, skills, TypeScript
35
+ and Biome config, and dependency-cruiser. Workspace products also
36
+ receive generated Cursor/Grok skill wrappers (gitignored). Does
37
+ not touch apps, modules, product README, .env, or Prisma.
38
+ --dry-run List will copy / skip without writing
39
+
40
+ check agent
41
+ Scan the product root for typical broken patches: TypeScript enum,
42
+ Prisma imports in web/admin/mobile/desktop, and raw fetch in those
43
+ apps. Prints rule id + file:line. Exit 1 when anything matches.
44
+
45
+ Environment:
46
+ YSK_ROOT Product root to patch (default: this repository)
47
+
48
+ After add module / add capability:
49
+ pnpm db:migrate && pnpm gen:openapi && pnpm layers && pnpm typecheck && pnpm test && pnpm ysk check agent
50
+
51
+ Manual: docs/cli/ysk.md
52
+ Chinese: docs/cli/ysk.zh.md
53
+ `;
54
+ //# sourceMappingURL=help.js.map
@@ -0,0 +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;;;;;;;;;;;;;;;;;;;;;sBAqBE,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8B5C,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,59 @@
1
+ import { dirname, resolve } from 'node:path';
2
+ import { fileURLToPath } from 'node:url';
3
+ import { addCapability } from './add-capability';
4
+ import { addModule } from './add-module';
5
+ import { checkAgent, formatAgentFindings } from './check-agent';
6
+ import { generateOpenApi } from './generate-openapi';
7
+ import { HELP } from './help';
8
+ import { upgrade } from './upgrade';
9
+ const args = process.argv.slice(2);
10
+ const kitRoot = resolve(dirname(fileURLToPath(import.meta.url)), '../../..');
11
+ const root = resolve(process.env.YSK_ROOT ?? kitRoot);
12
+ const help = () => {
13
+ console.log(HELP);
14
+ };
15
+ try {
16
+ if (args[0] === 'add' && args[1] && args[1] !== 'module') {
17
+ const logs = addCapability(args[1], root);
18
+ for (const line of logs)
19
+ console.log(line);
20
+ process.exit(0);
21
+ }
22
+ if (args[0] === 'add' && args[1] === 'module' && args[2]) {
23
+ const name = args[2];
24
+ const logs = addModule(root, name, {
25
+ prisma: args.includes('--prisma'),
26
+ web: args.includes('--web') || !args.includes('--no-web'),
27
+ });
28
+ for (const line of logs)
29
+ console.log(line);
30
+ process.exit(0);
31
+ }
32
+ if (args[0] === 'generate' && args[1] === 'openapi') {
33
+ const out = generateOpenApi(root);
34
+ console.log(`wrote ${out}`);
35
+ process.exit(0);
36
+ }
37
+ if (args[0] === 'check' && args[1] === 'agent') {
38
+ const findings = checkAgent(root);
39
+ console.log(formatAgentFindings(findings));
40
+ process.exit(findings.length === 0 ? 0 : 1);
41
+ }
42
+ if (args[0] === 'upgrade') {
43
+ const logs = upgrade({
44
+ productRoot: root,
45
+ kitRoot,
46
+ dryRun: args.includes('--dry-run'),
47
+ });
48
+ for (const line of logs)
49
+ console.log(line);
50
+ process.exit(0);
51
+ }
52
+ help();
53
+ process.exit(args.length === 0 ? 0 : 1);
54
+ }
55
+ catch (error) {
56
+ console.error(error instanceof Error ? error.message : error);
57
+ process.exit(1);
58
+ }
59
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export type PrismaBlock = {
2
+ name: string;
3
+ block: string;
4
+ };
5
+ export type PrismaMergeOpts = {
6
+ userFields?: string[];
7
+ organizationFields?: string[];
8
+ };
9
+ export declare const extractEnums: (fragment: string) => PrismaBlock[];
10
+ export declare const extractModels: (fragment: string) => PrismaBlock[];
11
+ export declare const mergePrisma: (schema: string, fragment: string, opts?: PrismaMergeOpts) => {
12
+ schema: string;
13
+ actions: string[];
14
+ };
15
+ //# sourceMappingURL=merge-prisma.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge-prisma.d.ts","sourceRoot":"","sources":["../src/merge-prisma.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1D,MAAM,MAAM,eAAe,GAAG;IAC5B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC/B,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,UAAU,MAAM,KAAG,WAAW,EAS1D,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,UAAU,MAAM,KAAG,WAAW,EAS3D,CAAC;AA0CF,eAAO,MAAM,WAAW,GACtB,QAAQ,MAAM,EACd,UAAU,MAAM,EAChB,OAAM,eAAoB,KACzB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAuCrC,CAAC"}
@@ -0,0 +1,90 @@
1
+ export const extractEnums = (fragment) => {
2
+ const blocks = [];
3
+ const re = /enum\s+(\w+)\s*\{[^}]*\}/g;
4
+ let match = re.exec(fragment);
5
+ while (match) {
6
+ blocks.push({ name: match[1] ?? '', block: match[0].trim() });
7
+ match = re.exec(fragment);
8
+ }
9
+ return blocks;
10
+ };
11
+ export const extractModels = (fragment) => {
12
+ const blocks = [];
13
+ const re = /model\s+(\w+)\s*\{[\s\S]*?\n\}/g;
14
+ let match = re.exec(fragment);
15
+ while (match) {
16
+ blocks.push({ name: match[1] ?? '', block: match[0].trim() });
17
+ match = re.exec(fragment);
18
+ }
19
+ return blocks;
20
+ };
21
+ const hasEnum = (schema, name) => new RegExp(`enum\\s+${name}\\s*\\{`).test(schema);
22
+ const hasModel = (schema, name) => new RegExp(`model\\s+${name}\\s*\\{`).test(schema);
23
+ const ensureModelFields = (schema, model, fields, actions) => {
24
+ if (fields.length === 0)
25
+ return schema;
26
+ const header = schema.match(new RegExp(`model\\s+${model}\\s*\\{`));
27
+ if (!header || header.index === undefined) {
28
+ actions.push(`skipped ${model} fields (no model ${model})`);
29
+ return schema;
30
+ }
31
+ const start = header.index + header[0].length;
32
+ const end = schema.indexOf('\n}', start);
33
+ if (end < 0) {
34
+ actions.push(`skipped ${model} fields (unterminated model ${model})`);
35
+ return schema;
36
+ }
37
+ const body = schema.slice(start, end);
38
+ const extra = [];
39
+ for (const field of fields) {
40
+ const name = field.trim().split(/\s+/)[0];
41
+ if (!name)
42
+ continue;
43
+ if (body.includes(name)) {
44
+ actions.push(`skipped field ${model}.${name}`);
45
+ }
46
+ else {
47
+ extra.push(` ${field.trim()}`);
48
+ actions.push(`added field ${model}.${name}`);
49
+ }
50
+ }
51
+ if (extra.length === 0)
52
+ return schema;
53
+ return `${schema.slice(0, end)}\n${extra.join('\n')}${schema.slice(end)}`;
54
+ };
55
+ export const mergePrisma = (schema, fragment, opts = {}) => {
56
+ const actions = [];
57
+ let next = schema;
58
+ for (const item of extractEnums(fragment)) {
59
+ if (hasEnum(next, item.name)) {
60
+ actions.push(`skipped enum ${item.name}`);
61
+ continue;
62
+ }
63
+ const firstModel = next.search(/model\s+\w+/);
64
+ const at = firstModel >= 0 ? firstModel : next.length;
65
+ const prefix = next.slice(0, at);
66
+ const pad = prefix.endsWith('\n\n') || prefix.length === 0 ? '' : '\n';
67
+ next = `${prefix}${pad}${item.block}\n\n${next.slice(at)}`;
68
+ actions.push(`added enum ${item.name}`);
69
+ }
70
+ next = ensureModelFields(next, 'User', opts.userFields ?? [], actions);
71
+ next = ensureModelFields(next, 'Organization', opts.organizationFields ?? [], actions);
72
+ for (const item of extractModels(fragment)) {
73
+ if (item.name === 'User') {
74
+ actions.push('skipped model User');
75
+ continue;
76
+ }
77
+ if (hasModel(next, item.name)) {
78
+ actions.push(`skipped model ${item.name}`);
79
+ continue;
80
+ }
81
+ const pad = next.endsWith('\n') ? '' : '\n';
82
+ next = `${next}${pad}\n${item.block}\n`;
83
+ actions.push(`added model ${item.name}`);
84
+ }
85
+ if (/provider\s*=\s*"sqlite"/.test(next)) {
86
+ next = next.replace(/\s+@db\.[A-Za-z0-9(),]+/g, '');
87
+ }
88
+ return { schema: next, actions };
89
+ };
90
+ //# sourceMappingURL=merge-prisma.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge-prisma.js","sourceRoot":"","sources":["../src/merge-prisma.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export declare const ensureEnvKey: (source: string, key: string) => {
2
+ source: string;
3
+ added: boolean;
4
+ };
5
+ export declare const ensureJsonDep: (json: string, name: string, spec: string) => {
6
+ source: string;
7
+ added: boolean;
8
+ };
9
+ export declare const insertAfterLastImport: (source: string, statement: string) => string;
10
+ export declare const EXPRESS_ERROR_HANDLER = " app.use(errorHandler);";
11
+ export declare const EXPRESS_RETURN_APP = " return app;";
12
+ /** Express only maps `next(error)` for routers registered before `errorHandler`. */
13
+ export declare const expressRouteInsertBefore: (source: string) => string;
14
+ export declare const ensureMarkerBlock: (source: string, name: string, body: string, insertBefore?: string) => string;
15
+ export declare const insertBeforeMatch: (source: string, match: string, insert: string) => string;
16
+ export declare const ensureNamedImport: (source: string, moduleName: string, names: string[]) => string;
17
+ //# sourceMappingURL=patch-text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patch-text.d.ts","sourceRoot":"","sources":["../src/patch-text.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,GAAI,QAAQ,MAAM,EAAE,KAAK,MAAM,KAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAK1F,CAAC;AAEF,eAAO,MAAM,aAAa,GACxB,MAAM,MAAM,EACZ,MAAM,MAAM,EACZ,MAAM,MAAM,KACX;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAMlC,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,QAAQ,MAAM,EAAE,WAAW,MAAM,KAAG,MAYzE,CAAC;AAEF,eAAO,MAAM,qBAAqB,6BAA6B,CAAC;AAChE,eAAO,MAAM,kBAAkB,kBAAkB,CAAC;AAElD,oFAAoF;AACpF,eAAO,MAAM,wBAAwB,GAAI,QAAQ,MAAM,KAAG,MAC2B,CAAC;AAEtF,eAAO,MAAM,iBAAiB,GAC5B,QAAQ,MAAM,EACd,MAAM,MAAM,EACZ,MAAM,MAAM,EACZ,eAAe,MAAM,KACpB,MASF,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,QAAQ,MAAM,EAAE,OAAO,MAAM,EAAE,QAAQ,MAAM,KAAG,MAKjF,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,QAAQ,MAAM,EAAE,YAAY,MAAM,EAAE,OAAO,MAAM,EAAE,KAAG,MAiBvF,CAAC"}
@@ -0,0 +1,72 @@
1
+ export const ensureEnvKey = (source, key) => {
2
+ const re = new RegExp(`^${key}=`, 'm');
3
+ if (re.test(source))
4
+ return { source, added: false };
5
+ const next = source.endsWith('\n') || source.length === 0 ? source : `${source}\n`;
6
+ return { source: `${next}${key}=\n`, added: true };
7
+ };
8
+ export const ensureJsonDep = (json, name, spec) => {
9
+ const pkg = JSON.parse(json);
10
+ pkg.dependencies ??= {};
11
+ if (pkg.dependencies[name])
12
+ return { source: json, added: false };
13
+ pkg.dependencies[name] = spec;
14
+ return { source: `${JSON.stringify(pkg, null, 2)}\n`, added: true };
15
+ };
16
+ export const insertAfterLastImport = (source, statement) => {
17
+ if (source.includes(statement.trim()))
18
+ return source;
19
+ const lines = source.split('\n');
20
+ let lastImport = -1;
21
+ for (let i = 0; i < lines.length; i += 1) {
22
+ if (lines[i]?.startsWith('import '))
23
+ lastImport = i;
24
+ }
25
+ if (lastImport < 0) {
26
+ return `${statement}\n${source}`;
27
+ }
28
+ lines.splice(lastImport + 1, 0, statement);
29
+ return lines.join('\n');
30
+ };
31
+ export const EXPRESS_ERROR_HANDLER = ' app.use(errorHandler);';
32
+ export const EXPRESS_RETURN_APP = ' return app;';
33
+ /** Express only maps `next(error)` for routers registered before `errorHandler`. */
34
+ export const expressRouteInsertBefore = (source) => source.includes(EXPRESS_ERROR_HANDLER) ? EXPRESS_ERROR_HANDLER : EXPRESS_RETURN_APP;
35
+ export const ensureMarkerBlock = (source, name, body, insertBefore) => {
36
+ const start = `// --- ysk-add:${name} ---`;
37
+ if (source.includes(start))
38
+ return source;
39
+ const block = `${start}\n${body}\n// --- ysk-add:${name}:end ---`;
40
+ if (insertBefore && source.includes(insertBefore)) {
41
+ return source.replace(insertBefore, `${block}\n${insertBefore}`);
42
+ }
43
+ const next = source.endsWith('\n') ? source : `${source}\n`;
44
+ return `${next}${block}\n`;
45
+ };
46
+ export const insertBeforeMatch = (source, match, insert) => {
47
+ if (source.includes(insert.trim()))
48
+ return source;
49
+ const index = source.indexOf(match);
50
+ if (index < 0)
51
+ return source;
52
+ return `${source.slice(0, index)}${insert}${source.slice(index)}`;
53
+ };
54
+ export const ensureNamedImport = (source, moduleName, names) => {
55
+ const escaped = moduleName.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
56
+ const re = new RegExp(`import\\s+(type\\s+)?\\{([^}]*)\\}\\s+from\\s+['"]${escaped}['"]`);
57
+ const match = re.exec(source);
58
+ if (!match || match.index === undefined) {
59
+ return insertAfterLastImport(source, `import { ${names.join(', ')} } from '${moduleName}';`);
60
+ }
61
+ const existing = (match[2] ?? '')
62
+ .split(',')
63
+ .map((item) => item.trim())
64
+ .filter(Boolean);
65
+ const hasName = (name) => existing.some((item) => item === name || item === `type ${name}` || item.endsWith(` ${name}`));
66
+ const missing = names.filter((name) => !hasName(name));
67
+ if (missing.length === 0)
68
+ return source;
69
+ const rebuilt = `import ${match[1] ?? ''}{ ${[...existing, ...missing].join(', ')} } from '${moduleName}'`;
70
+ return `${source.slice(0, match.index)}${rebuilt}${source.slice(match.index + match[0].length)}`;
71
+ };
72
+ //# sourceMappingURL=patch-text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patch-text.js","sourceRoot":"","sources":["../src/patch-text.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export declare const UPGRADE_PATHS: readonly ["AGENTS.md", "AGENTS.zh.md", "CLAUDE.md", ".dependency-cruiser.cjs", "packages/typescript-config", "packages/biome-config", "docs/skills"];
2
+ export type YskKitMarker = {
3
+ kit: string;
4
+ version: string;
5
+ flavor: string;
6
+ preset: string;
7
+ db: string;
8
+ };
9
+ export type UpgradeOptions = {
10
+ productRoot: string;
11
+ kitRoot: string;
12
+ dryRun: boolean;
13
+ };
14
+ export declare const readKitVersion: (kitRoot: string) => string;
15
+ export declare const upgrade: (opts: UpgradeOptions) => string[];
16
+ //# sourceMappingURL=upgrade.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade.d.ts","sourceRoot":"","sources":["../src/upgrade.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,aAAa,sJAQhB,CAAC;AAIX,MAAM,MAAM,YAAY,GAAG;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,SAAS,MAAM,KAAG,MAMhD,CAAC;AA2CF,eAAO,MAAM,OAAO,GAAI,MAAM,cAAc,KAAG,MAAM,EAsDpD,CAAC"}