@owlmeans/create-app 0.1.18-rc.64 → 0.1.18-rc.66

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 CHANGED
@@ -9,7 +9,7 @@ bun create @owlmeans/app my-app
9
9
  # or
10
10
  yarn create @owlmeans/app my-app
11
11
  # or
12
- npx @owlmeans/create-app@^0.1.18-rc.64 my-app
12
+ npx @owlmeans/create-app@^0.1.18-rc.66 my-app
13
13
  ```
14
14
 
15
15
  ## What it generates
@@ -0,0 +1,24 @@
1
+ shadcn/ui — copied UI components
2
+ Source: https://github.com/shadcn-ui/ui
3
+
4
+ MIT License
5
+
6
+ Copyright (c) 2023 shadcn
7
+
8
+ Permission is hereby granted, free of charge, to any person obtaining a copy
9
+ of this software and associated documentation files (the "Software"), to deal
10
+ in the Software without restriction, including without limitation the rights
11
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12
+ copies of the Software, and to permit persons to whom the Software is
13
+ furnished to do so, subject to the following conditions:
14
+
15
+ The above copyright notice and this permission notice shall be included in all
16
+ copies or substantial portions of the Software.
17
+
18
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24
+ SOFTWARE.
@@ -1,5 +1,5 @@
1
1
  import type { PackageManager } from './types.js';
2
- export declare const HELP = "@owlmeans/create-app \u2014 scaffold a fullstack OwlMeans Common app\n\nUsage:\n npm create @owlmeans/app@latest <dir> [options]\n bun create @owlmeans/app <dir> [options]\n yarn create @owlmeans/app <dir> [options]\n npx @owlmeans/create-app@^0.1.18-rc.64 <dir> [options]\n\nGenerates three workspaces (common + api + web) with shadcn UI navigation and\nlayout, no authentication, and a session-scoped in-memory resource on the\nbackend. With --bare the demo is left out and only the working shell remains.\nAgent skills are deployed into the project by default.\n\nOptions:\n --name <name> human-readable app name (default: derived from <dir>)\n --slug <slug> package slug (default: derived from <dir>)\n --lang <code> language of the generated UI text (default: en)\n --description <t> one-line project description for the generated docs\n --bare scaffold the shell only \u2014 no example/demo code\n --pm <bun|npm|yarn> package manager (default: bun)\n --no-install do not install dependencies\n --no-skills do not deploy agent skills via @owlmeans/agent-skills\n --no-git do not run \"git init\"\n --yes, -y proceed without prompts / into a non-empty directory\n --help, -h show this help\n";
2
+ export declare const HELP = "@owlmeans/create-app \u2014 scaffold a fullstack OwlMeans Common app\n\nUsage:\n npm create @owlmeans/app@latest <dir> [options]\n bun create @owlmeans/app <dir> [options]\n yarn create @owlmeans/app <dir> [options]\n npx @owlmeans/create-app@^0.1.18-rc.66 <dir> [options]\n\nGenerates three workspaces (common + api + web) with shadcn UI navigation and\nlayout, no authentication, and a session-scoped in-memory resource on the\nbackend. With --bare the demo is left out and only the working shell remains.\nAgent skills are deployed into the project by default.\n\nOptions:\n --name <name> human-readable app name (default: derived from <dir>)\n --slug <slug> package slug (default: derived from <dir>)\n --lang <code> language of the generated UI text (default: en)\n --description <t> one-line project description for the generated docs\n --bare scaffold the shell only \u2014 no example/demo code\n --pm <bun|npm|yarn> package manager (default: bun)\n --no-install do not install dependencies\n --no-skills do not deploy agent skills via @owlmeans/agent-skills\n --no-git do not run \"git init\"\n --yes, -y proceed without prompts / into a non-empty directory\n --help, -h show this help\n";
3
3
  export declare const PMS: PackageManager[];
4
4
  /** Dotfiles/dirs are shipped with an underscore prefix so npm does not strip them from the tarball. */
5
5
  export declare const DOTFILE_RENAMES: Record<string, string>;
@@ -5,7 +5,7 @@ Usage:
5
5
  npm create @owlmeans/app@latest <dir> [options]
6
6
  bun create @owlmeans/app <dir> [options]
7
7
  yarn create @owlmeans/app <dir> [options]
8
- npx @owlmeans/create-app@^0.1.18-rc.64 <dir> [options]
8
+ npx @owlmeans/create-app@^0.1.18-rc.66 <dir> [options]
9
9
 
10
10
  Generates three workspaces (common + api + web) with shadcn UI navigation and
11
11
  layout, no authentication, and a session-scoped in-memory resource on the
package/build/run.js CHANGED
@@ -50,7 +50,7 @@ export const run = async (args) => {
50
50
  log(args.install
51
51
  ? '\nDeploying agent skills via @owlmeans/agent-skills…'
52
52
  : '\nDeploying harness guidance via @owlmeans/agent-skills (general skills only — re-run'
53
- + '\n`npx @owlmeans/agent-skills@^0.1.18-rc.55` after installing to add the package-specific ones)…');
53
+ + '\n`npx @owlmeans/agent-skills@^0.1.18-rc.57` after installing to add the package-specific ones)…');
54
54
  try {
55
55
  const result = await installSkills({
56
56
  dir: dest,
@@ -62,7 +62,7 @@ export const run = async (args) => {
62
62
  help: false,
63
63
  });
64
64
  if (result.code !== 0) {
65
- process.stderr.write(` agent-skills exited with code ${result.code} — you can re-run \`npx @owlmeans/agent-skills@^0.1.18-rc.55\` later.\n`);
65
+ process.stderr.write(` agent-skills exited with code ${result.code} — you can re-run \`npx @owlmeans/agent-skills@^0.1.18-rc.57\` later.\n`);
66
66
  }
67
67
  }
68
68
  catch (err) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@owlmeans/create-app",
3
- "version": "0.1.18-rc.64",
3
+ "version": "0.1.18-rc.66",
4
4
  "license": "MIT",
5
5
  "description": "Scaffold a fullstack OwlMeans Common app — common + api + web workspaces, shadcn UI navigation/layout, no auth, and a session-scoped in-memory resource, or --bare for the demo-free shell. Also usable programmatically via scaffold(). Deploys agent skills via @owlmeans/agent-skills by default.",
6
6
  "type": "module",
@@ -27,10 +27,11 @@
27
27
  },
28
28
  "files": [
29
29
  "build",
30
- "template"
30
+ "template",
31
+ "THIRD-PARTY-NOTICES.txt"
31
32
  ],
32
33
  "dependencies": {
33
- "@owlmeans/agent-skills": "^0.1.18-rc.55"
34
+ "@owlmeans/agent-skills": "^0.1.18-rc.57"
34
35
  },
35
36
  "devDependencies": {
36
37
  "@owlmeans/dep-config": "workspace:*",
@@ -114,7 +114,7 @@ from the installed `@owlmeans/*` packages. Agents load a skill by topic, or you
114
114
  explicitly. Copilot and Codex read `.agents/skills/` directly; Claude Code reads the generated
115
115
  symlinks in `.claude/skills/` (see "Claude Code" below).
116
116
 
117
- - After adding or updating any `@owlmeans/*` dependency, run `npx @owlmeans/agent-skills@^0.1.18-rc.55` to refresh
117
+ - After adding or updating any `@owlmeans/*` dependency, run `npx @owlmeans/agent-skills@^0.1.18-rc.57` to refresh
118
118
  the deployed skills.
119
119
  - `/logging` — before adding any log line, catch block or `console` call (mechanics: `/log`).
120
120
  - Deployed files carry an `AUTO-GENERATED` banner and are refreshed in place — never hand-edit them.
@@ -66,5 +66,5 @@ them; write your own guidance as separate, un-bannered files. Refresh after addi
66
66
  `@owlmeans/*` packages:
67
67
 
68
68
  ```sh
69
- npx @owlmeans/agent-skills@^0.1.18-rc.55
69
+ npx @owlmeans/agent-skills@^0.1.18-rc.57
70
70
  ```
@@ -178,5 +178,11 @@ Then read the diff once for what no grep sees: a second exported function of one
178
178
  that takes the same first argument as its siblings, a private helper exposed on the interface, a
179
179
  bound object built in a loop, a barrel re-exporting a `.local` file.
180
180
 
181
- Classification details, folder decisions and the pitfalls of moving code into closures: `reference.md`
182
- (in the OwlMeans repositories).
181
+ Classification details, folder decisions and the pitfalls of moving code into closures: the
182
+ `code-structure-reference` part ([parts/code-structure-reference.md](parts/code-structure-reference.md)).
183
+
184
+ ## Parts
185
+
186
+ | Part | Load it when |
187
+ |---|---|
188
+ | [code-structure-reference](parts/code-structure-reference.md) | classifying a declaration, deciding a folder, converting a module, or moving code into closures |
@@ -0,0 +1,125 @@
1
+ ---
2
+ name: code-structure-reference
3
+ description: Classifying a declaration, file roles, deciding a module's shape, converting a module step by step, choosing the binding target, interface conversions, and pitfalls.
4
+ metadata:
5
+ purposes:
6
+ mentions:
7
+ ---
8
+ <!-- AUTO-GENERATED — do not edit. Regenerate via sync-agent-meta. -->
9
+
10
+ # owlmeans-code-structure — reference
11
+
12
+ ## Contents
13
+ - Classifying a declaration
14
+ - File roles
15
+ - Deciding the shape of a module
16
+ - Converting a module, step by step
17
+ - Binding: choosing the target
18
+ - Interfaces over types: the conversions
19
+ - Pitfalls
20
+
21
+ ## Classifying a declaration
22
+
23
+ | Kind | What it is | Goes to |
24
+ |---|---|---|
25
+ | type | `interface`, `type` alias, `declare const x: unique symbol` brand | `types.ts` / `types.local.ts` |
26
+ | constant | an enum, or a `const` whose initializer is a literal, an object/array of constants, a template over constants, `Object.freeze`/`as const`/`satisfies` of those, `new Set/Map/RegExp` over constants, or `.map/.filter/.concat` over constants | `consts.ts` / `consts.local.ts` |
27
+ | state | `let`/`var`, a cache, a registry, a holder (`new Map()`, `[]`, `{}` that is filled later) | stays with the code that owns it, inside its factory when per-instance, module level when process-wide |
28
+ | instance | a value built by a factory (`createPathResolver(DEFAULT_TOPOLOGY)`) | the factory's file, as its ready instance |
29
+ | code | functions, classes, side-effect statements | code files, inside a factory |
30
+
31
+ A constant computed by calling project code is either rewritten as a constant expression (a
32
+ template over constants instead of `srcOf(...)`) or is an instance.
33
+
34
+ ## File roles
35
+
36
+ | File | Holds |
37
+ |---|---|
38
+ | `x.ts` | one factory (plus its ready instance), or one exempt export (a component, a hook, one handler) |
39
+ | `x/types.ts` | `x`'s interface and the types only `x` owns |
40
+ | `x/consts.ts`, `x/*.local.ts` | its constants; its package-private declarations |
41
+ | `x/<sub>.ts` | a sub-helper only `x` uses — itself a factory, with its own folder when it has parts |
42
+ | `<dir>/types.ts` | declarations two or more objects of the directory share, or a small single-owner directory |
43
+ | `index.ts` | re-exports only: `export type * from './x/types.js'`, `export * from './x.js'`; never a `.local` file, never an enum through `export type *` |
44
+ | `errors.ts`, `schemas.ts` | error classes; JSON schemas and the code that builds them |
45
+
46
+ A types file imports only types files, consts files and external packages — never a code file.
47
+
48
+ ## Deciding the shape of a module
49
+
50
+ 1. List what other files use from it. Everything else becomes private.
51
+ 2. Group what is used by domain. One group = one object; a second group = a second file.
52
+ 3. Look at the first parameters. A shared context, request, collaborator or record moves into the
53
+ factory (see *Binding*). Members that take different first arguments may mean two objects.
54
+ 4. A group whose members all read one record is a model; one that lives in a context with a
55
+ lifecycle is a service; one that reads and writes a store is a resource; the rest are helpers
56
+ (reusable) or utils (package-internal).
57
+ 5. Name it by the kind: `createXxxHelper` / `makeXxxHelper`, `createXxxUtils`, `createXxxService`,
58
+ `makeXxxModel`, `makeXxxResource`.
59
+
60
+ ## Converting a module, step by step
61
+
62
+ 1. Write `x/types.ts`: the interface, one member per public function, with explicit parameter and
63
+ return types and the JSDoc moved from the functions.
64
+ 2. Rewrite `x.ts`: `export const createX = (deps): X => { … return { … } }`, with every function of
65
+ the group and every helper only they use inside the closure, in their original order.
66
+ 3. Drop the bound parameter from the members and from the calls between them.
67
+ 4. Move constants and types the module still declares to `x/consts.ts` and `x/types.ts`.
68
+ 5. Update every caller: `fn(ctx, a)` → `xOf(ctx).fn(a)`, `fn(a)` → `xHelper.fn(a)`, hoisting a
69
+ repeated `xOf(ctx)` to one local per function.
70
+ 6. Build from clean (delete `build/` and `*.tsbuildinfo`), run the package's tests, and grep the
71
+ tests that read source as text (`readFileSync` of a `.ts`) for the moved names.
72
+
73
+ A published package that removes an export keeps a deprecated delegate at the end of the module
74
+ that exported it (`/** @deprecated compat:factory-refactor use xOf(ctx).fn() */`) until its version
75
+ line changes — never gathered into one `compat.ts`, because a subpath export (`pkg/login`) resolves
76
+ that module, not the package root. No code in the OwlMeans repositories may import it; a private
77
+ package drops its delegates once nothing imports them.
78
+
79
+ ## Binding: choosing the target
80
+
81
+ - **A service** when the object has a lifecycle (init, connections), holds state shared by the
82
+ process, or must be replaceable by an application.
83
+ - **A context accessor** when an application owns its context type: declare `xxx: () => XxxHelper` on
84
+ the context interface and install it in the context factory with `memoHelper.once`.
85
+ - **`oncePer`** inside a library, where the helper must not appear on the public context type:
86
+ `export const xxxOf = memoHelper.oncePer(makeXxx)`.
87
+ - **A request scope** for what depends on the caller (actor, organization, channel): build it once at
88
+ the top of the handler and pass it down; never store it.
89
+ - **A collaborator accessor** when a helper always works over one FileHelper, stage or deps bag.
90
+ - **A model** when every member reads the same record.
91
+
92
+ Construction must stay cheap: no I/O and no awaits in a factory body; tables a member needs are built
93
+ lazily with `memoHelper.once`.
94
+
95
+ ## Interfaces over types: the conversions
96
+
97
+ | From | To |
98
+ |---|---|
99
+ | `type X = { a: A }` | `interface X { a: A }` |
100
+ | `type X = A & { b: B }` | `interface X extends A { b: B }` |
101
+ | `type X = Omit<A, 'k'> & { k: K }` | `interface X extends Omit<A, 'k'> { k: K }` |
102
+ | `type X = Partial<Pick<A, 'a' \| 'b'>>` | `interface X extends Partial<Pick<A, 'a' \| 'b'>> {}` |
103
+ | `type F = (a: A) => R` | `interface F { (a: A): R }` |
104
+ | `type F = <T>(a: T) => R<T>` | `interface F { <T>(a: T): R<T> }` |
105
+
106
+ Keep the alias, with a one-line reason, where the interface breaks the program: it is used where an
107
+ implicit index signature is required, its `extends` parts conflict, or a declaration of the same name
108
+ would merge with it.
109
+
110
+ ## Pitfalls
111
+
112
+ - **Read before initialization.** A factory body runs when called; a ready instance runs at import.
113
+ Keep the instance the file's last statement, and never let a module-level constant call a factory
114
+ of the same import cycle.
115
+ - **Import cycles.** Bound objects import types, constants and pure helpers only; composition roots
116
+ (context factories) import the factories. Reach another bound object through the binding target.
117
+ - **Declaration emit.** A private type that appears in a public signature must move to `types.ts`;
118
+ an inferred return type that names an unexported type fails the build (`TS4023`, `TS2742`).
119
+ - **State moved into a closure** becomes per instance. Process-wide state (a queue, a merge chain, a
120
+ cache every caller must share) stays at module level or in a per-context memo.
121
+ - **Inheritance by prototype.** A helper derived with `Object.create(base)` inherits accessors bound to
122
+ `base`; build an accessor over the derived object when its calls must go through it.
123
+ - **Enums** never move into types files and never pass through `export type *`.
124
+ - **Same name from two modules** in one barrel fails with `TS2308`; rename or re-export explicitly.
125
+ - **Tests that read source text** break silently when code moves; grep them in the same change.
@@ -47,7 +47,7 @@ How you research the repo depends on whether `@owlmeans/*` is linked locally:
47
47
  **https://github.com/owlmeans/common** — `tree.md` and package READMEs — to find the right package.
48
48
 
49
49
  This is the same dev-linked detection `@owlmeans/agent-skills` uses (see its `detectLinked`). After
50
- adding an `@owlmeans/*` dependency, run `npx @owlmeans/agent-skills@^0.1.18-rc.55` to deploy its
50
+ adding an `@owlmeans/*` dependency, run `npx @owlmeans/agent-skills@^0.1.18-rc.57` to deploy its
51
51
  skill. Prefer an `@owlmeans/*` package over a third-party library or bespoke code whenever one fits.
52
52
 
53
53
  ### Never add an OwlMeans dependency without an explicit range
@@ -39,8 +39,8 @@ once; never author a per-agent copy** (`.github/instructions/*.instructions.md`,
39
39
 
40
40
  ```
41
41
  .agents/skills/<name>/
42
- ├── SKILL.md # required — frontmatter + body
43
- ├── reference.md # optional — deeper detail loaded on demand
42
+ ├── SKILL.md # required — frontmatter + body (a package skill's core)
43
+ ├── parts/<part>.md # optional — a package skill's purpose parts, loaded on demand
44
44
  └── scripts/ # optional — shell scripts the skill runs
45
45
  ```
46
46
 
@@ -80,15 +80,67 @@ or the file stops parsing and the skill silently disappears from every agent.
80
80
  plain spaces. `Bash(bun *) Read` is read as one tool named `Bash(bun *) Read`, which matches
81
81
  nothing; write `Bash(bun *), Read`.
82
82
 
83
- Six keys are what the Agent Skills frontmatter parser in `@owlmeans/agent-skills` stores:
84
- `name`, `description`, `license`, `compatibility`, `allowed-tools` and nested `metadata`.
85
- Project-specific keys — including the OwlMeans `scope: general` routing marker, which sends a skill
86
- to the installer bundle rather than to one package — belong under `metadata:`, so a skill stays
87
- valid in every agent that reads it. The invocation switches sit outside what that parser stores and
88
- are written at the top level alongside it: `user-invocable` (`false` hides a skill from the `/`
83
+ Six keys are what the Agent Skills standard defines: `name`, `description`, `license`,
84
+ `compatibility`, `allowed-tools` and nested `metadata`. `@owlmeans/agent-skills` parses no
85
+ frontmatter; the generator that embeds package guidance reads it. Project-specific keys —
86
+ including the OwlMeans `scope: general` routing marker, which sends a skill to the installer bundle
87
+ rather than to one package — belong under `metadata:`, so a skill stays valid in every agent that
88
+ reads it. The invocation switches sit outside the standard and are written at the top level
89
+ alongside it: `user-invocable` (`false` hides a skill from the `/`
89
90
  menu, marking it background knowledge), plus `disable-model-invocation` and `argument-hint`, which
90
91
  Claude Code understands. Set any of them only when the skill needs it.
91
92
 
93
+ ## Chunked package skills (parts)
94
+
95
+ A package skill that grows past what one call should carry is split. `SKILL.md` stays the
96
+ **core**, loaded whenever the package is chosen; each `parts/<part>.md` holds ONE purpose, loaded
97
+ only for a call that needs it (selection: the `agent-skills` skill).
98
+
99
+ - **The core** keeps the frontmatter, the `**Install:**` line, the exports, the wiring, any
100
+ `## Target wiring` section (an adoption reads it from the core alone) and the rules every use
101
+ needs. Target ≤ 12 000 chars. It ENDS with a Parts table linking every part:
102
+
103
+ ```markdown
104
+ ## Parts
105
+
106
+ | Part | Load it when |
107
+ |---|---|
108
+ | [navigation](parts/navigation.md) | building the application shell or its menus |
109
+ ```
110
+
111
+ - **A part** opens with exactly this frontmatter, then `# @owlmeans/<package> — <part title>` and
112
+ the moved sections:
113
+
114
+ ```yaml
115
+ ---
116
+ name: navigation # = the file stem, [a-z0-9-], unique within the package
117
+ description: The application shell — NavLayout, TopNav/SideNav/MobileNav/Footer, the nav config.
118
+ metadata:
119
+ purposes: navigation, layout, screen # closed vocabulary, comma-separated
120
+ mentions: NavLayout, TopNav, SideNav # symbols and import specifiers that call for it
121
+ ---
122
+ ```
123
+
124
+ - **Size:** the generator warns above 12 000 chars per part and fails above 16 000; it also warns
125
+ about a package-specific skill over 16 000 chars that has no parts.
126
+ - **Purposes** come from a closed vocabulary (`PACKAGE_PURPOSES`, `@owlmeans/llm-common`):
127
+ `view`, `form`, `list`, `detail`, `dialog`, `picker`, `navigation`, `layout`, `screen`,
128
+ `theme`, `feedback`, `state`, `client-api`, `server-api`, `data`, `migration`, `query`, `auth`,
129
+ `consent`, `payment`, `planning`, `job`, `agent`, `config`, `test`, `ops`.
130
+ A value outside it fails the generator. Purposes may stay empty only in a general skill.
131
+ - **Mentions** are distinctive symbols or import specifiers, never common words: a call without a
132
+ focus loads every part whose mention appears in its messages.
133
+ - **Names are unique per package** — a part is addressed as `@owlmeans/<package>#<part>`. Every
134
+ general skill routes to the installer package, so a general skill's part carries the skill's own
135
+ prefix (`code-structure-reference`, never `reference`).
136
+ - **YAML:** a value that starts with `@`, a backtick, `[`, `{`, `*` or `&`, or that contains `: `
137
+ or ` #`, stops parsing — start the mentions with a symbol, not an import specifier.
138
+ - **Splitting moves text, never rewrites it.** Every section lands in the core or in exactly one
139
+ part, each part stands alone for its purpose, and a reference to a moved section names its part
140
+ (see "Organizations" in the `sessions` part).
141
+ - Only `SKILL.md` and `parts/*.md` are embedded into a package; any other file beside them stays in
142
+ the repository, and the generator warns about a root `reference.md`.
143
+
92
144
  ## Refresh the Claude Code links
93
145
 
94
146
  After creating, renaming, or deleting a skill, run:
@@ -11,13 +11,13 @@
11
11
  "typecheck": "tsc -b"
12
12
  },
13
13
  "dependencies": {
14
- "@owlmeans/log": "^0.1.18-rc.3",
15
- "@owlmeans/server-app": "^0.1.18-rc.56",
16
- "@owlmeans/static-resource": "^0.1.18-rc.39",
14
+ "@owlmeans/log": "^0.1.18-rc.4",
15
+ "@owlmeans/server-app": "^0.1.18-rc.58",
16
+ "@owlmeans/static-resource": "^0.1.18-rc.40",
17
17
  "__APP_SLUG__-common": "workspace:^"
18
18
  },
19
19
  "devDependencies": {
20
- "@owlmeans/dep-config": "^0.1.18-rc.6",
20
+ "@owlmeans/dep-config": "^0.1.18-rc.8",
21
21
  "@types/node": "^26.6.4",
22
22
  "typescript": "^7.0.2"
23
23
  }
@@ -19,15 +19,15 @@
19
19
  "typecheck": "tsc -b"
20
20
  },
21
21
  "dependencies": {
22
- "@owlmeans/config": "^0.1.18-rc.44",
23
- "@owlmeans/entrypoint": "^0.1.18-rc.41",
24
- "@owlmeans/error": "^0.1.18-rc.38",
25
- "@owlmeans/resource": "^0.1.18-rc.40",
26
- "@owlmeans/route": "^0.1.18-rc.35",
22
+ "@owlmeans/config": "^0.1.18-rc.45",
23
+ "@owlmeans/entrypoint": "^0.1.18-rc.42",
24
+ "@owlmeans/error": "^0.1.18-rc.39",
25
+ "@owlmeans/resource": "^0.1.18-rc.41",
26
+ "@owlmeans/route": "^0.1.18-rc.36",
27
27
  "ajv": "^8.20.0"
28
28
  },
29
29
  "devDependencies": {
30
- "@owlmeans/dep-config": "^0.1.18-rc.6",
30
+ "@owlmeans/dep-config": "^0.1.18-rc.8",
31
31
  "@types/node": "^26.6.4",
32
32
  "typescript": "^7.0.2"
33
33
  }
@@ -0,0 +1,24 @@
1
+ shadcn/ui — copied UI components
2
+ Source: https://github.com/shadcn-ui/ui
3
+
4
+ MIT License
5
+
6
+ Copyright (c) 2023 shadcn
7
+
8
+ Permission is hereby granted, free of charge, to any person obtaining a copy
9
+ of this software and associated documentation files (the "Software"), to deal
10
+ in the Software without restriction, including without limitation the rights
11
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12
+ copies of the Software, and to permit persons to whom the Software is
13
+ furnished to do so, subject to the following conditions:
14
+
15
+ The above copyright notice and this permission notice shall be included in all
16
+ copies or substantial portions of the Software.
17
+
18
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24
+ SOFTWARE.
@@ -11,17 +11,17 @@
11
11
  "preview": "vite preview"
12
12
  },
13
13
  "dependencies": {
14
- "@owlmeans/client": "^0.1.18-rc.55",
15
- "@owlmeans/client-config": "^0.1.18-rc.45",
16
- "@owlmeans/client-context": "^0.1.18-rc.51",
17
- "@owlmeans/client-entrypoint": "^0.1.18-rc.50",
18
- "@owlmeans/client-i18n": "^0.1.18-rc.54",
19
- "@owlmeans/entrypoint": "^0.1.18-rc.41",
20
- "@owlmeans/log": "^0.1.18-rc.3",
21
- "@owlmeans/route": "^0.1.18-rc.35",
22
- "@owlmeans/state": "^0.1.18-rc.39",
23
- "@owlmeans/web-client": "^0.1.18-rc.66",
24
- "@owlmeans/web-panel": "^0.1.18-rc.77",
14
+ "@owlmeans/client": "^0.1.18-rc.57",
15
+ "@owlmeans/client-config": "^0.1.18-rc.46",
16
+ "@owlmeans/client-context": "^0.1.18-rc.53",
17
+ "@owlmeans/client-entrypoint": "^0.1.18-rc.52",
18
+ "@owlmeans/client-i18n": "^0.1.18-rc.56",
19
+ "@owlmeans/entrypoint": "^0.1.18-rc.42",
20
+ "@owlmeans/log": "^0.1.18-rc.4",
21
+ "@owlmeans/route": "^0.1.18-rc.36",
22
+ "@owlmeans/state": "^0.1.18-rc.40",
23
+ "@owlmeans/web-client": "^0.1.18-rc.68",
24
+ "@owlmeans/web-panel": "^0.1.18-rc.79",
25
25
  "@radix-ui/react-dropdown-menu": "^2.1.24",
26
26
  "@radix-ui/react-label": "^2.1.15",
27
27
  "@radix-ui/react-navigation-menu": "^1.2.22",
@@ -41,7 +41,7 @@
41
41
  "tailwindcss": "^4.3.3"
42
42
  },
43
43
  "devDependencies": {
44
- "@owlmeans/dep-config": "^0.1.18-rc.6",
44
+ "@owlmeans/dep-config": "^0.1.18-rc.8",
45
45
  "@tailwindcss/vite": "^4.3.3",
46
46
  "@types/react": "^19.3.0",
47
47
  "@types/react-dom": "^19.3.0",
@@ -10,5 +10,6 @@ export const SESSION_ID_KEY = '__APP_SLUG__-sid'
10
10
  // rendered by the shell itself (`NavLayout`'s `Footer`) and is never a footer link: an app link
11
11
  // list is places IN the app, and the credit is not one of those.
12
12
  export const footerLinks: PanelNavLink[] = [
13
+ { href: '/THIRD-PARTY-NOTICES.txt', label: 'Third-party notices' },
13
14
  { alias: HOME, label: '__APP_NAME__' },
14
15
  ]
@@ -19,5 +19,6 @@ export const navConfig: PanelNavConfig = {
19
19
  // rendered by the shell itself (`NavLayout`'s `Footer`) and is never a footer link: an app link
20
20
  // list is places IN the app, and the credit is not one of those.
21
21
  export const footerLinks: PanelNavLink[] = [
22
+ { href: '/THIRD-PARTY-NOTICES.txt', label: 'Third-party notices' },
22
23
  { alias: HOME, label: '__APP_NAME__' },
23
24
  ]
@@ -1,3 +1,4 @@
1
+ import { createThirdPartyNoticesPlugin } from '@owlmeans/dep-config/notices'
1
2
  import { defineConfig } from 'vite'
2
3
  import react from '@vitejs/plugin-react'
3
4
  import tailwindcss from '@tailwindcss/vite'
@@ -13,7 +14,7 @@ const owlMeansSingletons = [
13
14
  ]
14
15
 
15
16
  export default defineConfig({
16
- plugins: [react(), tailwindcss()],
17
+ plugins: [createThirdPartyNoticesPlugin({ root: import.meta.dirname, additionalPackages: ['tailwindcss'] }), react(), tailwindcss()],
17
18
  server: {
18
19
  port: 3001,
19
20
  host: '0.0.0.0',