@jskit-ai/create-app 0.1.94 → 0.1.96

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 (59) hide show
  1. package/package.json +2 -2
  2. package/src/server/index.js +8 -1
  3. package/templates/base-shell/.jskit/lock.json +229 -0
  4. package/templates/base-shell/package.json +4 -2
  5. package/templates/base-shell/packages/main/src/client/providers/MainClientProvider.js +8 -0
  6. package/templates/base-shell/src/App.vue +7 -9
  7. package/templates/base-shell/src/components/ShellLayout.vue +12 -0
  8. package/templates/base-shell/src/components/menus/MenuLinkItem.vue +30 -0
  9. package/templates/base-shell/src/components/menus/SurfaceAwareMenuLinkItem.vue +42 -0
  10. package/templates/base-shell/src/components/menus/TabLinkItem.vue +42 -0
  11. package/templates/base-shell/src/error.js +19 -0
  12. package/templates/base-shell/src/pages/home/index.vue +85 -21
  13. package/templates/base-shell/src/pages/home/settings/general/index.vue +40 -0
  14. package/templates/base-shell/src/pages/home/settings/index.vue +7 -0
  15. package/templates/base-shell/src/pages/home/settings.vue +109 -0
  16. package/templates/base-shell/src/pages/home.vue +8 -1
  17. package/templates/base-shell/src/placement.js +56 -0
  18. package/templates/base-shell/src/placementTopology.js +149 -0
  19. package/templates/base-shell/tests/e2e/adaptive-shell.spec.ts +4 -0
  20. package/templates/base-shell/tests/e2e/base-shell.spec.ts +1 -1
  21. package/templates/minimal-shell/.github/workflows/verify.yml +29 -0
  22. package/templates/minimal-shell/.jskit/lock.json +31 -0
  23. package/templates/minimal-shell/AGENTS.md +10 -0
  24. package/templates/minimal-shell/Procfile +2 -0
  25. package/templates/minimal-shell/app.json +14 -0
  26. package/templates/minimal-shell/bin/server.js +8 -0
  27. package/templates/minimal-shell/config/public.js +41 -0
  28. package/templates/minimal-shell/config/server.js +1 -0
  29. package/templates/minimal-shell/config/surfaceAccessPolicies.js +3 -0
  30. package/templates/minimal-shell/eslint.config.mjs +19 -0
  31. package/templates/minimal-shell/favicon.svg +7 -0
  32. package/templates/minimal-shell/gitignore +8 -0
  33. package/templates/minimal-shell/index.html +13 -0
  34. package/templates/minimal-shell/jsconfig.json +8 -0
  35. package/templates/minimal-shell/package.json +55 -0
  36. package/templates/minimal-shell/packages/main/package.descriptor.mjs +69 -0
  37. package/templates/minimal-shell/packages/main/package.json +12 -0
  38. package/templates/minimal-shell/packages/main/src/client/index.js +13 -0
  39. package/templates/minimal-shell/packages/main/src/client/providers/MainClientProvider.js +20 -0
  40. package/templates/minimal-shell/packages/main/src/server/MainServiceProvider.js +20 -0
  41. package/templates/minimal-shell/packages/main/src/server/index.js +1 -0
  42. package/templates/minimal-shell/packages/main/src/server/loadAppConfig.js +9 -0
  43. package/templates/minimal-shell/packages/main/src/shared/index.js +10 -0
  44. package/templates/minimal-shell/packages/main/src/shared/schemas/index.js +22 -0
  45. package/templates/minimal-shell/scripts/dokku-set-remote-envs-via-ssh.sh +210 -0
  46. package/templates/minimal-shell/server/lib/runtimeEnv.js +45 -0
  47. package/templates/minimal-shell/server/lib/surfaceRuntime.js +10 -0
  48. package/templates/minimal-shell/server.js +189 -0
  49. package/templates/minimal-shell/src/App.vue +13 -0
  50. package/templates/minimal-shell/src/main.js +85 -0
  51. package/templates/minimal-shell/src/pages/home/index.vue +48 -0
  52. package/templates/minimal-shell/src/pages/home.vue +13 -0
  53. package/templates/minimal-shell/src/views/NotFound.vue +13 -0
  54. package/templates/minimal-shell/tests/client/smoke.vitest.js +7 -0
  55. package/templates/minimal-shell/tests/e2e/base-shell.spec.ts +57 -0
  56. package/templates/minimal-shell/tests/server/minimalShell.validator.test.js +131 -0
  57. package/templates/minimal-shell/tests/server/smoke.test.js +16 -0
  58. package/templates/minimal-shell/vite.config.mjs +84 -0
  59. package/templates/minimal-shell/vite.shared.mjs +59 -0
@@ -0,0 +1,109 @@
1
+ <script setup>
2
+ import ShellOutlet from "@jskit-ai/shell-web/client/components/ShellOutlet";
3
+ import { RouterView } from "vue-router";
4
+ </script>
5
+
6
+ <template>
7
+ <section class="generated-ui-screen generated-ui-screen--settings settings-shell d-flex flex-column ga-4">
8
+ <header>
9
+ <p class="text-overline text-medium-emphasis mb-1">Settings</p>
10
+ <h1 class="settings-shell__title">Home settings</h1>
11
+ <p class="text-body-2 text-medium-emphasis mb-0">Configure shell behavior for this surface.</p>
12
+ </header>
13
+
14
+ <v-sheet rounded="lg" border class="settings-shell__panel">
15
+ <div class="settings-shell__body">
16
+ <nav class="settings-shell__nav" aria-label="Home settings sections">
17
+ <v-list nav density="compact" rounded="lg">
18
+ <ShellOutlet target="home-settings:primary-menu" />
19
+ </v-list>
20
+ </nav>
21
+
22
+ <main class="settings-shell__content">
23
+ <RouterView />
24
+ </main>
25
+ </div>
26
+ </v-sheet>
27
+ </section>
28
+ </template>
29
+
30
+ <style scoped>
31
+ .generated-ui-screen {
32
+ --generated-ui-screen-title-size: 1.85rem;
33
+ --generated-ui-screen-panel-padding: 1rem;
34
+ }
35
+
36
+ .settings-shell__title {
37
+ font-size: var(--generated-ui-screen-title-size);
38
+ font-weight: 650;
39
+ letter-spacing: 0;
40
+ line-height: 1.15;
41
+ margin: 0 0 0.35rem;
42
+ }
43
+
44
+ .settings-shell__panel {
45
+ overflow: hidden;
46
+ }
47
+
48
+ .settings-shell__body {
49
+ display: grid;
50
+ gap: 1rem;
51
+ grid-template-columns: minmax(12rem, 16rem) minmax(0, 1fr);
52
+ padding: var(--generated-ui-screen-panel-padding);
53
+ }
54
+
55
+ .settings-shell__content {
56
+ border-left: 1px solid rgba(var(--v-theme-on-surface), 0.18);
57
+ min-width: 0;
58
+ padding-left: 1rem;
59
+ }
60
+
61
+ .settings-shell__nav :deep(.v-list) {
62
+ padding: 0.35rem;
63
+ }
64
+
65
+ .settings-shell__nav :deep(.v-list-item) {
66
+ min-height: 48px;
67
+ padding-inline: 0.6rem 0.7rem;
68
+ }
69
+
70
+ .settings-shell__nav :deep(.v-list-item__prepend) {
71
+ margin-inline-end: 0;
72
+ }
73
+
74
+ .settings-shell__nav :deep(.v-list-item__spacer) {
75
+ min-width: 0.5rem;
76
+ width: 0.5rem;
77
+ }
78
+
79
+ .settings-shell__nav :deep(.v-list-item-title) {
80
+ line-height: 1.2;
81
+ }
82
+
83
+ @media (max-width: 960px) {
84
+ .generated-ui-screen {
85
+ --generated-ui-screen-title-size: 1.35rem;
86
+ }
87
+
88
+ .settings-shell__body {
89
+ grid-template-columns: 1fr;
90
+ }
91
+
92
+ .settings-shell__nav :deep(.v-list) {
93
+ display: flex;
94
+ gap: 0.25rem;
95
+ overflow-x: auto;
96
+ scrollbar-width: thin;
97
+ }
98
+
99
+ .settings-shell__nav :deep(.v-list-item) {
100
+ flex: 0 0 auto;
101
+ min-height: 48px;
102
+ }
103
+
104
+ .settings-shell__content {
105
+ border-left: 0;
106
+ padding-left: 0;
107
+ }
108
+ }
109
+ </style>
@@ -8,6 +8,13 @@
8
8
  }
9
9
  </route>
10
10
 
11
+ <script setup>
12
+ import ShellLayout from "@/components/ShellLayout.vue";
13
+ import { RouterView } from "vue-router";
14
+ </script>
15
+
11
16
  <template>
12
- <RouterView />
17
+ <ShellLayout title="" subtitle="">
18
+ <RouterView />
19
+ </ShellLayout>
13
20
  </template>
@@ -0,0 +1,56 @@
1
+ import { createPlacementRegistry } from "@jskit-ai/shell-web/client/placement";
2
+
3
+ const registry = createPlacementRegistry();
4
+ const { addPlacement } = registry;
5
+
6
+ export { addPlacement };
7
+
8
+ // Keep the default export near the top so module installers can append addPlacement(...)
9
+ // blocks at the bottom of this file without changing the export section.
10
+ export default function getPlacements() {
11
+ return registry.build();
12
+ }
13
+
14
+ addPlacement({
15
+ id: "shell-web.home.menu.home",
16
+ target: "shell.primary-nav",
17
+ kind: "link",
18
+ surfaces: ["home"],
19
+ order: 50,
20
+ props: {
21
+ label: "Home",
22
+ surface: "home",
23
+ scopedSuffix: "/",
24
+ unscopedSuffix: "/",
25
+ exact: true
26
+ }
27
+ });
28
+
29
+ addPlacement({
30
+ id: "shell-web.home.menu.settings",
31
+ target: "shell.primary-nav",
32
+ kind: "link",
33
+ surfaces: ["home"],
34
+ order: 100,
35
+ props: {
36
+ label: "Settings",
37
+ surface: "home",
38
+ scopedSuffix: "/settings",
39
+ unscopedSuffix: "/settings"
40
+ }
41
+ });
42
+
43
+ addPlacement({
44
+ id: "shell-web.home.settings.general",
45
+ target: "page.section-nav",
46
+ owner: "home-settings",
47
+ kind: "link",
48
+ surfaces: ["home"],
49
+ order: 100,
50
+ props: {
51
+ label: "General",
52
+ surface: "home",
53
+ scopedSuffix: "/settings/general",
54
+ unscopedSuffix: "/settings/general"
55
+ }
56
+ });
@@ -0,0 +1,149 @@
1
+ const placements = [];
2
+
3
+ function addPlacementTopology(value = {}) {
4
+ placements.push(value);
5
+ }
6
+
7
+ export { addPlacementTopology };
8
+ export default { placements };
9
+
10
+ const menuLinkRenderers = Object.freeze({
11
+ link: "local.main.ui.surface-aware-menu-link-item"
12
+ });
13
+
14
+ const bottomNavLinkRenderers = Object.freeze({
15
+ link: "local.main.ui.tab-link-item"
16
+ });
17
+
18
+ addPlacementTopology({
19
+ id: "shell.primary-nav",
20
+ description: "Primary top-level navigation for the current surface.",
21
+ surfaces: ["*"],
22
+ default: true,
23
+ variants: {
24
+ compact: {
25
+ outlet: "shell-layout:primary-bottom-nav",
26
+ renderers: bottomNavLinkRenderers
27
+ },
28
+ medium: {
29
+ outlet: "shell-layout:primary-menu",
30
+ renderers: menuLinkRenderers
31
+ },
32
+ expanded: {
33
+ outlet: "shell-layout:primary-menu",
34
+ renderers: menuLinkRenderers
35
+ }
36
+ }
37
+ });
38
+
39
+ addPlacementTopology({
40
+ id: "shell.secondary-nav",
41
+ description: "Secondary navigation for the current surface.",
42
+ surfaces: ["*"],
43
+ variants: {
44
+ compact: {
45
+ outlet: "shell-layout:secondary-menu",
46
+ renderers: menuLinkRenderers
47
+ },
48
+ medium: {
49
+ outlet: "shell-layout:secondary-menu",
50
+ renderers: menuLinkRenderers
51
+ },
52
+ expanded: {
53
+ outlet: "shell-layout:secondary-menu",
54
+ renderers: menuLinkRenderers
55
+ }
56
+ }
57
+ });
58
+
59
+ addPlacementTopology({
60
+ id: "shell.identity",
61
+ description: "Current surface identity and switcher controls.",
62
+ surfaces: ["*"],
63
+ variants: {
64
+ compact: {
65
+ outlet: "shell-layout:top-left"
66
+ },
67
+ medium: {
68
+ outlet: "shell-layout:top-left"
69
+ },
70
+ expanded: {
71
+ outlet: "shell-layout:top-left"
72
+ }
73
+ }
74
+ });
75
+
76
+ addPlacementTopology({
77
+ id: "shell.status",
78
+ description: "Surface status, connection, and utility indicators.",
79
+ surfaces: ["*"],
80
+ variants: {
81
+ compact: {
82
+ outlet: "shell-layout:top-right"
83
+ },
84
+ medium: {
85
+ outlet: "shell-layout:top-right"
86
+ },
87
+ expanded: {
88
+ outlet: "shell-layout:top-right"
89
+ }
90
+ }
91
+ });
92
+
93
+ addPlacementTopology({
94
+ id: "shell.global-actions",
95
+ description: "Global surface actions that should stay outside primary navigation.",
96
+ surfaces: ["*"],
97
+ variants: {
98
+ compact: {
99
+ outlet: "shell-layout:top-right",
100
+ renderers: menuLinkRenderers
101
+ },
102
+ medium: {
103
+ outlet: "shell-layout:top-right",
104
+ renderers: menuLinkRenderers
105
+ },
106
+ expanded: {
107
+ outlet: "shell-layout:top-right",
108
+ renderers: menuLinkRenderers
109
+ }
110
+ }
111
+ });
112
+
113
+ addPlacementTopology({
114
+ id: "page.supporting-content",
115
+ description: "Supporting page content that opens as a bottom sheet on compact layouts and a side panel on wider layouts.",
116
+ surfaces: ["*"],
117
+ variants: {
118
+ compact: {
119
+ outlet: "shell-layout:supporting-bottom-sheet"
120
+ },
121
+ medium: {
122
+ outlet: "shell-layout:supporting-side-panel"
123
+ },
124
+ expanded: {
125
+ outlet: "shell-layout:supporting-side-panel"
126
+ }
127
+ }
128
+ });
129
+
130
+ addPlacementTopology({
131
+ id: "page.section-nav",
132
+ owner: "home-settings",
133
+ description: "Navigation between child pages in the home settings section.",
134
+ surfaces: ["home"],
135
+ variants: {
136
+ compact: {
137
+ outlet: "home-settings:primary-menu",
138
+ renderers: menuLinkRenderers
139
+ },
140
+ medium: {
141
+ outlet: "home-settings:primary-menu",
142
+ renderers: menuLinkRenderers
143
+ },
144
+ expanded: {
145
+ outlet: "home-settings:primary-menu",
146
+ renderers: menuLinkRenderers
147
+ }
148
+ }
149
+ });
@@ -0,0 +1,4 @@
1
+ import { expect, test } from "@playwright/test";
2
+ import { runAdaptiveShellSmoke } from "@jskit-ai/shell-web/test/adaptiveShellSmoke";
3
+
4
+ runAdaptiveShellSmoke({ test, expect });
@@ -48,7 +48,7 @@ test.describe("generated base app responsive smoke", () => {
48
48
  await page.setViewportSize({ width: viewport.width, height: viewport.height });
49
49
  await page.goto(`${BASE_URL}${SMOKE_PATH}`);
50
50
  await expect(page.locator("body")).toBeVisible();
51
- await expect(page.getByText("Home base")).toBeVisible();
51
+ await expect(page.getByText("Ready")).toBeVisible();
52
52
  await expectGeneratedScreenContract(page);
53
53
  await expectVisibleTapTargets(page);
54
54
  await expectNoHorizontalOverflow(page);
@@ -0,0 +1,29 @@
1
+ name: Verify
2
+
3
+ on:
4
+ pull_request:
5
+ push:
6
+ branches:
7
+ - main
8
+
9
+ permissions:
10
+ contents: read
11
+
12
+ jobs:
13
+ verify:
14
+ runs-on: ubuntu-latest
15
+ steps:
16
+ - name: Checkout
17
+ uses: actions/checkout@v4
18
+
19
+ - name: Setup Node
20
+ uses: actions/setup-node@v4
21
+ with:
22
+ node-version: 20
23
+ cache: npm
24
+
25
+ - name: Install dependencies
26
+ run: npm ci
27
+
28
+ - name: Run verify
29
+ run: npm run verify
@@ -0,0 +1,31 @@
1
+ {
2
+ "lockVersion": 1,
3
+ "installedPackages": {
4
+ "@local/main": {
5
+ "packageId": "@local/main",
6
+ "version": "0.1.0",
7
+ "source": {
8
+ "type": "local-package",
9
+ "packagePath": "packages/main",
10
+ "descriptorPath": "packages/main/package.descriptor.mjs"
11
+ },
12
+ "managed": {
13
+ "packageJson": {
14
+ "dependencies": {
15
+ "@local/main": {
16
+ "hadPrevious": false,
17
+ "previousValue": "",
18
+ "value": "file:packages/main"
19
+ }
20
+ },
21
+ "devDependencies": {},
22
+ "scripts": {}
23
+ },
24
+ "text": {},
25
+ "files": []
26
+ },
27
+ "options": {},
28
+ "installedAt": "1970-01-01T00:00:00.000Z"
29
+ }
30
+ }
31
+ }
@@ -0,0 +1,10 @@
1
+ # App Agent Instructions
2
+
3
+ Use the JSKIT agent docs and the local app scaffold as the source of truth for app work.
4
+
5
+ Recommended references:
6
+
7
+ - `node_modules/@jskit-ai/agent-docs/guide/agent/index.md`
8
+ - `node_modules/@jskit-ai/agent-docs/patterns/INDEX.md`
9
+
10
+ Keep changes scoped to the user request and verify runtime behavior with tests or explicit checks.
@@ -0,0 +1,2 @@
1
+ release: npm run db:migrate
2
+ web: npm run start
@@ -0,0 +1,14 @@
1
+ {
2
+ "name": "__APP_NAME__",
3
+ "healthchecks": {
4
+ "web": [
5
+ {
6
+ "type": "startup",
7
+ "name": "web-ready",
8
+ "description": "Application responds to /api/health",
9
+ "path": "/api/health",
10
+ "attempts": 6
11
+ }
12
+ ]
13
+ }
14
+ }
@@ -0,0 +1,8 @@
1
+ import { startServer } from "../server.js";
2
+
3
+ try {
4
+ await startServer();
5
+ } catch (error) {
6
+ console.error("Failed to start __APP_NAME__ server:", error);
7
+ process.exitCode = 1;
8
+ }
@@ -0,0 +1,41 @@
1
+ import { surfaceAccessPolicies } from "./surfaceAccessPolicies.js";
2
+
3
+ export const config = {};
4
+ __TENANCY_MODE_LINE__
5
+
6
+ config.surfaceModeAll = "all";
7
+ config.surfaceDefaultId = "home";
8
+ config.webRootAllowed = "no";
9
+ config.surfaceAccessPolicies = surfaceAccessPolicies;
10
+ config.mobile = {
11
+ enabled: false,
12
+ strategy: "",
13
+ appId: "",
14
+ appName: "",
15
+ assetMode: "bundled",
16
+ devServerUrl: "",
17
+ apiBaseUrl: "",
18
+ auth: {
19
+ callbackPath: "/auth/login",
20
+ customScheme: "",
21
+ appLinkDomains: []
22
+ },
23
+ android: {
24
+ packageName: "",
25
+ minSdk: 26,
26
+ targetSdk: 35,
27
+ versionCode: 1,
28
+ versionName: "1.0.0"
29
+ }
30
+ };
31
+ config.surfaceDefinitions = {};
32
+ config.surfaceDefinitions.home = {
33
+ id: "home",
34
+ label: "Home",
35
+ pagesRoot: "home",
36
+ enabled: true,
37
+ requiresAuth: false,
38
+ requiresWorkspace: false,
39
+ accessPolicyId: "public",
40
+ origin: ""
41
+ };
@@ -0,0 +1 @@
1
+ export const config = {};
@@ -0,0 +1,3 @@
1
+ export const surfaceAccessPolicies = {};
2
+
3
+ surfaceAccessPolicies.public = {};
@@ -0,0 +1,19 @@
1
+ import { baseConfig, nodeConfig, vueConfig, webConfig } from "@jskit-ai/config-eslint/server";
2
+
3
+ export default [
4
+ {
5
+ ignores: ["dist/**", "node_modules/**", "coverage/**", "test-results/**", ".jskit/**"]
6
+ },
7
+ {
8
+ files: ["src/pages/**/*.vue"],
9
+ languageOptions: {
10
+ globals: {
11
+ definePage: "readonly"
12
+ }
13
+ }
14
+ },
15
+ ...baseConfig,
16
+ ...vueConfig,
17
+ ...webConfig,
18
+ ...nodeConfig
19
+ ];
@@ -0,0 +1,7 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">
2
+ <rect width="64" height="64" rx="12" fill="#111827" />
3
+ <path
4
+ d="M20 16h24v8H28v20c0 6-4 10-10 10h-2v-8h2c2 0 2-1 2-3V16z"
5
+ fill="#22d3ee"
6
+ />
7
+ </svg>
@@ -0,0 +1,8 @@
1
+ node_modules/
2
+ dist/
3
+ coverage/
4
+ test-results/
5
+ .jskit/verification/
6
+ .env
7
+ .env.*
8
+ !.env.example
@@ -0,0 +1,13 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
7
+ <title>__APP_TITLE__</title>
8
+ </head>
9
+ <body>
10
+ <div id="app"></div>
11
+ <script type="module" src="/src/main.js"></script>
12
+ </body>
13
+ </html>
@@ -0,0 +1,8 @@
1
+ {
2
+ "compilerOptions": {
3
+ "baseUrl": ".",
4
+ "paths": {
5
+ "@/*": ["src/*"]
6
+ }
7
+ }
8
+ }
@@ -0,0 +1,55 @@
1
+ {
2
+ "name": "__APP_NAME__",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "description": "Minimal JSKIT base app (Fastify + Vue)",
7
+ "engines": {
8
+ "node": ">=20 <23"
9
+ },
10
+ "scripts": {
11
+ "server": "node ./bin/server.js",
12
+ "server:all": "node ./bin/server.js",
13
+ "server:home": "SERVER_SURFACE=home node ./bin/server.js",
14
+ "start": "node ./bin/server.js",
15
+ "devlinks": "jskit app link-local-packages",
16
+ "dev": "vite",
17
+ "dev:all": "vite",
18
+ "dev:home": "VITE_SURFACE=home vite",
19
+ "build": "vite build",
20
+ "build:all": "vite build",
21
+ "build:home": "VITE_SURFACE=home vite build",
22
+ "preview": "vite preview",
23
+ "lint": "eslint .",
24
+ "test": "node --test",
25
+ "test:client": "vitest run tests/client",
26
+ "test:e2e": "playwright test tests/e2e",
27
+ "verify": "jskit app verify && npm run --if-present verify:app",
28
+ "release": "jskit app release",
29
+ "jskit:update": "jskit app update-packages"
30
+ },
31
+ "dependencies": {
32
+ "@local/main": "file:packages/main",
33
+ "@fastify/static": "^9.1.1",
34
+ "@jskit-ai/kernel": "0.x",
35
+ "@tanstack/vue-query": "^5.90.5",
36
+ "fastify": "^5.7.4",
37
+ "json-rest-schema": "^1.0.13",
38
+ "pinia": "^3.0.4",
39
+ "vue": "^3.5.13",
40
+ "vue-router": "^5.0.4",
41
+ "vuetify": "^4.0.0",
42
+ "@jskit-ai/http-runtime": "0.x"
43
+ },
44
+ "devDependencies": {
45
+ "@jskit-ai/agent-docs": "0.x",
46
+ "@jskit-ai/config-eslint": "0.x",
47
+ "@jskit-ai/jskit-cli": "0.x",
48
+ "@playwright/test": "^1.57.0",
49
+ "@vitejs/plugin-vue": "^5.2.1",
50
+ "eslint": "^9.39.1",
51
+ "vite": "^6.1.0",
52
+ "vite-plugin-vuetify": "^2.1.3",
53
+ "vitest": "^4.0.18"
54
+ }
55
+ }
@@ -0,0 +1,69 @@
1
+ export default Object.freeze({
2
+ packageVersion: 1,
3
+ packageId: "@local/main",
4
+ version: "0.1.0",
5
+ kind: "runtime",
6
+ description: "App-local main composition and glue scaffold.",
7
+ dependsOn: [],
8
+ capabilities: {
9
+ provides: [],
10
+ requires: []
11
+ },
12
+ options: {},
13
+ runtime: {
14
+ server: {
15
+ providerEntrypoint: "src/server/MainServiceProvider.js",
16
+ providers: [
17
+ {
18
+ entrypoint: "src/server/MainServiceProvider.js",
19
+ export: "MainServiceProvider"
20
+ }
21
+ ]
22
+ },
23
+ client: {
24
+ providers: [
25
+ {
26
+ entrypoint: "src/client/providers/MainClientProvider.js",
27
+ export: "MainClientProvider"
28
+ }
29
+ ]
30
+ }
31
+ },
32
+ metadata: {
33
+ jskit: {
34
+ ownershipGuidance: {
35
+ title: "App-local main lane",
36
+ summary: "Keep @local/main focused on app composition and lightweight glue. Substantial server features should become dedicated packages instead of growing inside packages/main.",
37
+ responsibilities: [
38
+ "packages/main server code: bootstraps app-local configuration and lightweight wiring only",
39
+ "substantial non-CRUD server features: scaffold a dedicated package with feature-server-generator",
40
+ "packages/main: do not add service/controller/route/repository feature trees here"
41
+ ],
42
+ examples: [
43
+ "jskit generate feature-server-generator scaffold booking-engine",
44
+ "jskit generate feature-server-generator scaffold availability-engine --mode orchestrator"
45
+ ]
46
+ }
47
+ },
48
+ server: {
49
+ routes: []
50
+ },
51
+ ui: {
52
+ routes: [],
53
+ elements: [],
54
+ overrides: []
55
+ }
56
+ },
57
+ mutations: {
58
+ dependencies: {
59
+ runtime: {},
60
+ dev: {}
61
+ },
62
+ packageJson: {
63
+ scripts: {}
64
+ },
65
+ procfile: {},
66
+ text: [],
67
+ files: []
68
+ }
69
+ });