@origostudio/origo-design 0.0.40 → 0.0.41

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 (46) hide show
  1. package/.vscode/origo-badl.code-snippets +60 -0
  2. package/CHANGELOG.md +3 -2
  3. package/dist/packages/angular-renderer/CHANGELOG.md +4 -0
  4. package/dist/packages/angular-renderer/package.json +3 -3
  5. package/dist/packages/cli/CHANGELOG.md +10 -0
  6. package/dist/packages/cli/package.json +2 -2
  7. package/dist/packages/cli/package.json.bak +2 -2
  8. package/dist/packages/cli/src/commands/generate/index.js +2 -0
  9. package/dist/packages/cli/src/commands/generate/index.js.map +1 -1
  10. package/dist/packages/cli/src/commands/generate/page.d.ts +2 -0
  11. package/dist/packages/cli/src/commands/generate/page.js +27 -0
  12. package/dist/packages/cli/src/commands/generate/page.js.map +1 -0
  13. package/dist/packages/cli/src/lib/generator.d.ts +4 -0
  14. package/dist/packages/cli/src/lib/generator.js +108 -20
  15. package/dist/packages/cli/src/lib/generator.js.map +1 -1
  16. package/dist/packages/cli/src/templates/index.d.ts +2 -0
  17. package/dist/packages/cli/src/templates/index.js +16 -0
  18. package/dist/packages/cli/src/templates/index.js.map +1 -1
  19. package/dist/packages/cli/src/templates/list-detail.json +14 -0
  20. package/dist/packages/cli/src/templates/login.json +15 -0
  21. package/dist/packages/core/CHANGELOG.md +4 -0
  22. package/dist/packages/core/package.json +1 -1
  23. package/dist/packages/core/package.json.bak +1 -1
  24. package/dist/packages/design-tokens/CHANGELOG.md +4 -0
  25. package/dist/packages/design-tokens/package.json +1 -1
  26. package/package.json +1 -1
  27. package/packages/angular-renderer/CHANGELOG.md +4 -0
  28. package/packages/angular-renderer/package.json +3 -3
  29. package/packages/cli/CHANGELOG.md +10 -0
  30. package/packages/cli/package.json +2 -2
  31. package/packages/cli/src/commands/generate/index.ts +2 -0
  32. package/packages/cli/src/commands/generate/page.ts +27 -0
  33. package/packages/cli/src/lib/generator.ts +128 -19
  34. package/packages/cli/src/templates/index.ts +16 -0
  35. package/packages/cli/src/templates/list-detail.json +14 -0
  36. package/packages/cli/src/templates/login.json +15 -0
  37. package/packages/core/CHANGELOG.md +4 -0
  38. package/packages/core/package.json +1 -1
  39. package/packages/design-tokens/CHANGELOG.md +4 -0
  40. package/packages/design-tokens/package.json +1 -1
  41. package/packages/devtools/CHANGELOG.md +4 -0
  42. package/packages/devtools/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  43. package/packages/devtools/package.json +3 -3
  44. package/packages/playground/CHANGELOG.md +4 -0
  45. package/packages/playground/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  46. package/packages/playground/package.json +3 -3
@@ -0,0 +1,60 @@
1
+ {
2
+ "Origo Entity": {
3
+ "scope": "json",
4
+ "prefix": "origo-entity",
5
+ "body": [
6
+ "{",
7
+ " \"id\": \"${1:entity-id}\",",
8
+ " \"name\": \"${2:EntityName}\",",
9
+ " \"implements\": [],",
10
+ " \"fields\": [",
11
+ " { \"name\": \"${3:fieldName}\", \"type\": \"${4:String}\" }",
12
+ " ]",
13
+ "}",
14
+ ],
15
+ "description": "Origo BADL Entity boilerplate",
16
+ },
17
+ "Origo List-Detail Page": {
18
+ "scope": "json",
19
+ "prefix": "origo-list-detail",
20
+ "body": [
21
+ "{",
22
+ " \"id\": \"${1:default-list-detail}\",",
23
+ " \"name\": \"${2:DefaultListDetail}\",",
24
+ " \"views\": [",
25
+ " {",
26
+ " \"name\": \"List\",",
27
+ " \"type\": \"list\"",
28
+ " },",
29
+ " {",
30
+ " \"name\": \"Detail\",",
31
+ " \"type\": \"detail\"",
32
+ " }",
33
+ " ]",
34
+ "}",
35
+ ],
36
+ "description": "Origo BADL List-Detail boilerplate",
37
+ },
38
+ "Origo Login Page": {
39
+ "scope": "json",
40
+ "prefix": "origo-login",
41
+ "body": [
42
+ "{",
43
+ " \"_secure_by_default\": true,",
44
+ " \"id\": \"${1:default-login}\",",
45
+ " \"name\": \"${2:DefaultLogin}\",",
46
+ " \"fields\": [",
47
+ " {",
48
+ " \"name\": \"username\",",
49
+ " \"type\": \"String\"",
50
+ " },",
51
+ " {",
52
+ " \"name\": \"password\",",
53
+ " \"type\": \"String\"",
54
+ " }",
55
+ " ]",
56
+ "}",
57
+ ],
58
+ "description": "Origo BADL Login boilerplate",
59
+ },
60
+ }
package/CHANGELOG.md CHANGED
@@ -1,8 +1,9 @@
1
- ## 0.0.40 (2026-09-29)
1
+ ## 0.0.41 (2026-09-30)
2
2
 
3
3
  ### 🚀 Features
4
4
 
5
- - initialize packages, documentation site, and release workflow ([e0f7371](https://github.com/OrigoStudio/origo-design/commit/e0f7371))
5
+ - create developer snippets and boilerplates story artifact and update sprint status ([2073a64](https://github.com/OrigoStudio/origo-design/commit/2073a64))
6
+ - initialize workspace packages and implement CLI generator commands with templates ([b227117](https://github.com/OrigoStudio/origo-design/commit/b227117))
6
7
 
7
8
  ### ❤️ Thank You
8
9
 
@@ -1,3 +1,7 @@
1
+ ## 0.0.41 (2026-09-30)
2
+
3
+ This was a version bump only for angular-renderer to align it with other projects, there were no code changes.
4
+
1
5
  ## 0.0.40 (2026-09-29)
2
6
 
3
7
  ### 🚀 Features
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@origostudio/angular-renderer",
3
- "version": "0.0.40",
3
+ "version": "0.0.41",
4
4
  "private": false,
5
5
  "type": "commonjs",
6
6
  "main": "./dist/index.js",
7
7
  "types": "./dist/index.d.ts",
8
8
  "dependencies": {
9
- "@origostudio/core": "0.0.40",
10
- "@origostudio/design-tokens": "0.0.40",
9
+ "@origostudio/core": "0.0.41",
10
+ "@origostudio/design-tokens": "0.0.41",
11
11
  "tslib": "^2.3.0",
12
12
  "@analogjs/vite-plugin-angular": "^2.7.1",
13
13
  "zone.js": "^0.16.3",
@@ -1,3 +1,13 @@
1
+ ## 0.0.41 (2026-09-30)
2
+
3
+ ### 🚀 Features
4
+
5
+ - initialize workspace packages and implement CLI generator commands with templates ([b227117](https://github.com/OrigoStudio/origo-design/commit/b227117))
6
+
7
+ ### ❤️ Thank You
8
+
9
+ - Hardik Patel @hardikpatelse
10
+
1
11
  ## 0.0.40 (2026-09-29)
2
12
 
3
13
  ### 🚀 Features
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@origostudio/cli",
3
- "version": "0.0.40",
3
+ "version": "0.0.41",
4
4
  "private": false,
5
5
  "type": "commonjs",
6
6
  "main": "./src/index.js",
@@ -9,7 +9,7 @@
9
9
  "origo": "./src/main.js"
10
10
  },
11
11
  "dependencies": {
12
- "@origostudio/core": "0.0.40",
12
+ "@origostudio/core": "0.0.41",
13
13
  "commander": "^15.0.0",
14
14
  "tslib": "^2.3.0"
15
15
  },
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@origostudio/cli",
3
- "version": "0.0.40",
3
+ "version": "0.0.41",
4
4
  "private": false,
5
5
  "type": "commonjs",
6
6
  "main": "./src/index.js",
@@ -9,7 +9,7 @@
9
9
  "origo": "./src/main.js"
10
10
  },
11
11
  "dependencies": {
12
- "@origostudio/core": "0.0.40",
12
+ "@origostudio/core": "0.0.41",
13
13
  "commander": "^15.0.0",
14
14
  "tslib": "^2.3.0"
15
15
  },
@@ -3,11 +3,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.generateCommand = generateCommand;
4
4
  const commander_1 = require("commander");
5
5
  const entity_1 = require("./entity");
6
+ const page_1 = require("./page");
6
7
  const generator_1 = require("../../lib/generator");
7
8
  const errors_1 = require("../../utils/errors");
8
9
  function generateCommand() {
9
10
  const cmd = new commander_1.Command('generate').description('Generate Origo artifacts');
10
11
  cmd.addCommand((0, entity_1.entityCommand)());
12
+ cmd.addCommand((0, page_1.pageCommand)());
11
13
  cmd
12
14
  .option('--eject', 'Copy internal templates to .origo/templates/ for customization')
13
15
  .option('--force', 'Overwrite existing templates if they exist')
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../packages/cli/src/commands/generate/index.ts"],"names":[],"mappings":";;AAKA,0CAsBC;AA3BD,yCAAoC;AACpC,qCAAyC;AACzC,mDAAqD;AACrD,+CAAiD;AAEjD,SAAgB,eAAe;IAC7B,MAAM,GAAG,GAAG,IAAI,mBAAO,CAAC,UAAU,CAAC,CAAC,WAAW,CAAC,0BAA0B,CAAC,CAAC;IAE5E,GAAG,CAAC,UAAU,CAAC,IAAA,sBAAa,GAAE,CAAC,CAAC;IAEhC,GAAG;SACA,MAAM,CAAC,SAAS,EAAE,gEAAgE,CAAC;SACnF,MAAM,CAAC,SAAS,EAAE,4CAA4C,CAAC;SAC/D,MAAM,CAAC,QAAQ,EAAE,qCAAqC,CAAC;SACvD,MAAM,CAAC,KAAK,EAAE,OAA6D,EAAE,EAAE;QAC9E,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,IAAI,CAAC;gBACH,MAAM,IAAA,0BAAc,EAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;YACrE,CAAC;YAAC,OAAO,KAAc,EAAE,CAAC;gBACxB,IAAA,oBAAW,EAAC,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,UAAU,EAAE,CAAC;QACnB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../packages/cli/src/commands/generate/index.ts"],"names":[],"mappings":";;AAMA,0CAuBC;AA7BD,yCAAoC;AACpC,qCAAyC;AACzC,iCAAqC;AACrC,mDAAqD;AACrD,+CAAiD;AAEjD,SAAgB,eAAe;IAC7B,MAAM,GAAG,GAAG,IAAI,mBAAO,CAAC,UAAU,CAAC,CAAC,WAAW,CAAC,0BAA0B,CAAC,CAAC;IAE5E,GAAG,CAAC,UAAU,CAAC,IAAA,sBAAa,GAAE,CAAC,CAAC;IAChC,GAAG,CAAC,UAAU,CAAC,IAAA,kBAAW,GAAE,CAAC,CAAC;IAE9B,GAAG;SACA,MAAM,CAAC,SAAS,EAAE,gEAAgE,CAAC;SACnF,MAAM,CAAC,SAAS,EAAE,4CAA4C,CAAC;SAC/D,MAAM,CAAC,QAAQ,EAAE,qCAAqC,CAAC;SACvD,MAAM,CAAC,KAAK,EAAE,OAA6D,EAAE,EAAE;QAC9E,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,IAAI,CAAC;gBACH,MAAM,IAAA,0BAAc,EAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;YACrE,CAAC;YAAC,OAAO,KAAc,EAAE,CAAC;gBACxB,IAAA,oBAAW,EAAC,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,UAAU,EAAE,CAAC;QACnB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function pageCommand(): Command;
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.pageCommand = pageCommand;
4
+ const commander_1 = require("commander");
5
+ const generator_1 = require("../../lib/generator");
6
+ const errors_1 = require("../../utils/errors");
7
+ function pageCommand() {
8
+ const cmd = new commander_1.Command('page');
9
+ cmd
10
+ .description('Generate a BADL page boilerplate from a named template')
11
+ .addOption(new commander_1.Option('--template <name>', 'Template name')
12
+ .choices(['list-detail', 'login'])
13
+ .makeOptionMandatory(true))
14
+ .argument('<name>', 'Output schema name (PascalCase, e.g. UserListDetail)')
15
+ .option('--force', 'Overwrite existing file if it exists')
16
+ .option('--json', 'Output machine-readable JSON format')
17
+ .action(async (name, options) => {
18
+ try {
19
+ await (0, generator_1.generatePage)(options.template, name, { force: options.force, json: options.json });
20
+ }
21
+ catch (error) {
22
+ (0, errors_1.handleError)(error, { json: options.json });
23
+ }
24
+ });
25
+ return cmd;
26
+ }
27
+ //# sourceMappingURL=page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page.js","sourceRoot":"","sources":["../../../../../../packages/cli/src/commands/generate/page.ts"],"names":[],"mappings":";;AAIA,kCAsBC;AA1BD,yCAA4C;AAC5C,mDAAmD;AACnD,+CAAiD;AAEjD,SAAgB,WAAW;IACzB,MAAM,GAAG,GAAG,IAAI,mBAAO,CAAC,MAAM,CAAC,CAAC;IAChC,GAAG;SACA,WAAW,CAAC,wDAAwD,CAAC;SACrE,SAAS,CACR,IAAI,kBAAM,CAAC,mBAAmB,EAAE,eAAe,CAAC;SAC7C,OAAO,CAAC,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;SACjC,mBAAmB,CAAC,IAAI,CAAC,CAC7B;SACA,QAAQ,CAAC,QAAQ,EAAE,sDAAsD,CAAC;SAC1E,MAAM,CAAC,SAAS,EAAE,sCAAsC,CAAC;SACzD,MAAM,CAAC,QAAQ,EAAE,qCAAqC,CAAC;SACvD,MAAM,CACL,KAAK,EAAE,IAAY,EAAE,OAA8D,EAAE,EAAE;QACrF,IAAI,CAAC;YACH,MAAM,IAAA,wBAAY,EAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3F,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,IAAA,oBAAW,EAAC,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC,CACF,CAAC;IACJ,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -10,6 +10,10 @@ export declare function generateEntity(name: string, options: {
10
10
  force?: boolean;
11
11
  json?: boolean;
12
12
  }): Promise<void>;
13
+ export declare function generatePage(templateName: string, name: string, options: {
14
+ force?: boolean;
15
+ json?: boolean;
16
+ }): Promise<void>;
13
17
  export declare function ejectTemplates(options: {
14
18
  force?: boolean;
15
19
  json?: boolean;
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.registerGeneratorPlugin = registerGeneratorPlugin;
4
4
  exports.generateEntity = generateEntity;
5
+ exports.generatePage = generatePage;
5
6
  exports.ejectTemplates = ejectTemplates;
6
7
  const tslib_1 = require("tslib");
7
8
  const fs = tslib_1.__importStar(require("fs/promises"));
@@ -16,10 +17,10 @@ async function generateEntity(name, options) {
16
17
  if (!name || !name.trim()) {
17
18
  throw new errors_1.CliError({ code: 'ERR_INVALID_NAME', message: 'Entity name must not be empty.' });
18
19
  }
19
- if (/[/\\]/.test(name)) {
20
+ if (!/^[a-zA-Z0-9_-]+$/.test(name)) {
20
21
  throw new errors_1.CliError({
21
22
  code: 'ERR_INVALID_NAME',
22
- message: 'Entity name must not contain path separators.',
23
+ message: 'Entity name must only contain alphanumeric characters, dashes, or underscores.',
23
24
  });
24
25
  }
25
26
  const targetDir = path.join(process.cwd(), 'schemas');
@@ -46,18 +47,17 @@ async function generateEntity(name, options) {
46
47
  for (const plugin of plugins) {
47
48
  if (plugin.resolveTemplate) {
48
49
  const resolved = await plugin.resolveTemplate(name);
49
- if (resolved) {
50
+ if (resolved !== null && resolved !== undefined) {
50
51
  content = resolved;
51
52
  break;
52
53
  }
53
54
  }
54
55
  }
55
- if (!content) {
56
+ if (content === null) {
56
57
  try {
57
58
  const rawTemplate = await fs.readFile(userTemplatePath, 'utf-8');
58
59
  content =
59
- rawTemplate.replace(/\{\{name\}\}/g, name).replace(/\{\{id\}\}/g, name.toLowerCase()) +
60
- '\n';
60
+ rawTemplate.split('{{name}}').join(name).split('{{id}}').join(name.toLowerCase()) + '\n';
61
61
  // Validate user template output
62
62
  try {
63
63
  JSON.parse(content);
@@ -78,16 +78,110 @@ async function generateEntity(name, options) {
78
78
  content = (0, templates_1.generateEntityTemplate)({ id: name.toLowerCase(), name });
79
79
  }
80
80
  }
81
+ await fs.mkdir(targetDir, { recursive: true });
82
+ if (!content) {
83
+ throw new errors_1.CliError({
84
+ code: 'ERR_UNEXPECTED',
85
+ message: 'Failed to generate entity content.',
86
+ });
87
+ }
88
+ await fs.writeFile(targetPath, content, 'utf-8');
89
+ // FR-AI-005 Extensibility: Post-generate hooks
90
+ for (const plugin of plugins) {
91
+ if (plugin.postGenerate) {
92
+ await plugin.postGenerate({ name, targetPath });
93
+ }
94
+ }
95
+ if (options.json) {
96
+ console.log(JSON.stringify({
97
+ status: 'success',
98
+ data: {
99
+ file: `./schemas/${name.toLowerCase()}.json`,
100
+ entityName: name,
101
+ },
102
+ }, null, 2));
103
+ }
104
+ else {
105
+ console.log(`Successfully generated entity ${name} at ./schemas/${name.toLowerCase()}.json`);
106
+ }
107
+ }
108
+ async function generatePage(templateName, name, options) {
109
+ if (!name || !name.trim()) {
110
+ throw new errors_1.CliError({ code: 'ERR_INVALID_NAME', message: 'Page name must not be empty.' });
111
+ }
112
+ if (!/^[a-zA-Z0-9_-]+$/.test(name)) {
113
+ throw new errors_1.CliError({
114
+ code: 'ERR_INVALID_NAME',
115
+ message: 'Page name must only contain alphanumeric characters, dashes, or underscores.',
116
+ });
117
+ }
118
+ if (templateName !== 'list-detail' && templateName !== 'login') {
119
+ throw new errors_1.CliError({
120
+ code: 'ERR_UNKNOWN_TEMPLATE',
121
+ message: `Unknown template: ${templateName}. Must be 'list-detail' or 'login'.`,
122
+ });
123
+ }
124
+ const targetDir = path.join(process.cwd(), 'schemas');
125
+ const targetPath = path.join(targetDir, name.toLowerCase() + '.json');
126
+ const userTemplatePath = path.join(process.cwd(), '.origo', 'templates', templateName + '.json');
127
+ let content = null;
81
128
  try {
82
- await fs.mkdir(targetDir, { recursive: true });
129
+ await fs.access(targetPath);
130
+ if (!options.force) {
131
+ throw new errors_1.CliError({
132
+ code: 'ERR_FILE_EXISTS',
133
+ message: `File already exists: ${targetPath}. Use --force to overwrite.`,
134
+ context: { path: targetPath },
135
+ });
136
+ }
83
137
  }
84
- catch (err) {
85
- if (err.code !== 'EEXIST')
86
- throw err;
138
+ catch (error) {
139
+ if (error instanceof errors_1.CliError)
140
+ throw error;
141
+ if (error.code !== 'ENOENT')
142
+ throw error;
143
+ }
144
+ // FR-AI-005 Extensibility: Check plugins first
145
+ for (const plugin of plugins) {
146
+ if (plugin.resolveTemplate) {
147
+ const resolved = await plugin.resolveTemplate(name);
148
+ if (resolved !== null && resolved !== undefined) {
149
+ content = resolved;
150
+ break;
151
+ }
152
+ }
87
153
  }
88
154
  if (content === null) {
89
- throw new errors_1.CliError({ code: 'ERR_UNEXPECTED', message: 'Content is unexpectedly null.' });
155
+ try {
156
+ const rawTemplate = await fs.readFile(userTemplatePath, 'utf-8');
157
+ content =
158
+ rawTemplate.split('{{name}}').join(name).split('{{id}}').join(name.toLowerCase()) + '\n';
159
+ // Validate user template output
160
+ try {
161
+ JSON.parse(content);
162
+ }
163
+ catch {
164
+ throw new errors_1.CliError({
165
+ code: 'ERR_INVALID_TEMPLATE',
166
+ message: `The user template at ${userTemplatePath} produced invalid JSON when substituted.`,
167
+ });
168
+ }
169
+ }
170
+ catch (err) {
171
+ if (err instanceof errors_1.CliError)
172
+ throw err;
173
+ const code = err.code;
174
+ if (code && code !== 'ENOENT')
175
+ throw err;
176
+ if (templateName === 'list-detail') {
177
+ content = (0, templates_1.generateListDetailTemplate)({ id: name.toLowerCase(), name });
178
+ }
179
+ else {
180
+ content = (0, templates_1.generateLoginTemplate)({ id: name.toLowerCase(), name });
181
+ }
182
+ }
90
183
  }
184
+ await fs.mkdir(targetDir, { recursive: true });
91
185
  await fs.writeFile(targetPath, content, 'utf-8');
92
186
  // FR-AI-005 Extensibility: Post-generate hooks
93
187
  for (const plugin of plugins) {
@@ -100,12 +194,12 @@ async function generateEntity(name, options) {
100
194
  status: 'success',
101
195
  data: {
102
196
  file: `./schemas/${name.toLowerCase()}.json`,
103
- entityName: name,
197
+ templateName: templateName,
104
198
  },
105
199
  }, null, 2));
106
200
  }
107
201
  else {
108
- console.log(`Successfully generated entity ${name} at ./schemas/${name.toLowerCase()}.json`);
202
+ console.log(`Successfully generated page ${name} using ${templateName} template at ./schemas/${name.toLowerCase()}.json`);
109
203
  }
110
204
  }
111
205
  async function ejectTemplates(options) {
@@ -141,13 +235,7 @@ async function ejectTemplates(options) {
141
235
  }
142
236
  }
143
237
  }
144
- try {
145
- await fs.mkdir(destDir, { recursive: true });
146
- }
147
- catch (err) {
148
- if (err.code !== 'EEXIST')
149
- throw err;
150
- }
238
+ await fs.mkdir(destDir, { recursive: true });
151
239
  await Promise.all(jsonFiles.map(file => fs.copyFile(path.join(srcDir, file), path.join(destDir, file))));
152
240
  if (options.json) {
153
241
  console.log(JSON.stringify({
@@ -1 +1 @@
1
- {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../packages/cli/src/lib/generator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../packages/cli/src/lib/generator.ts"],"names":[],"mappings":"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"}
@@ -27,3 +27,5 @@ export interface OrigoConfigOptions {
27
27
  export declare function generateEntityTemplate(options?: EntityOptions): string;
28
28
  export declare function generateExtensionTemplate(options?: ExtensionOptions): string;
29
29
  export declare function generateOrigoConfig(options?: OrigoConfigOptions): string;
30
+ export declare function generateListDetailTemplate(options?: EntityOptions): string;
31
+ export declare function generateLoginTemplate(options?: EntityOptions): string;
@@ -3,10 +3,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.generateEntityTemplate = generateEntityTemplate;
4
4
  exports.generateExtensionTemplate = generateExtensionTemplate;
5
5
  exports.generateOrigoConfig = generateOrigoConfig;
6
+ exports.generateListDetailTemplate = generateListDetailTemplate;
7
+ exports.generateLoginTemplate = generateLoginTemplate;
6
8
  const tslib_1 = require("tslib");
7
9
  const origo_json_1 = tslib_1.__importDefault(require("./origo.json"));
8
10
  const entity_json_1 = tslib_1.__importDefault(require("./entity.json"));
9
11
  const extension_json_1 = tslib_1.__importDefault(require("./extension.json"));
12
+ const list_detail_json_1 = tslib_1.__importDefault(require("./list-detail.json"));
13
+ const login_json_1 = tslib_1.__importDefault(require("./login.json"));
10
14
  function validateIdentifier(id) {
11
15
  if (!id || !/^[a-zA-Z0-9_-]+$/.test(id)) {
12
16
  throw new Error(`Invalid identifier: ${id}. Must match ^[a-zA-Z0-9_-]+$`);
@@ -58,4 +62,16 @@ function generateOrigoConfig(options = {}) {
58
62
  throw new Error(`Failed to serialize origo config: ${e instanceof Error ? e.message : String(e)}`);
59
63
  }
60
64
  }
65
+ function generateListDetailTemplate(options = {}) {
66
+ const id = options.id || 'default-list-detail';
67
+ const name = options.name || 'DefaultListDetail';
68
+ validateIdentifier(id);
69
+ return JSON.stringify({ ...list_detail_json_1.default, id, name }, null, 2) + '\n';
70
+ }
71
+ function generateLoginTemplate(options = {}) {
72
+ const id = options.id || 'default-login';
73
+ const name = options.name || 'DefaultLogin';
74
+ validateIdentifier(id);
75
+ return JSON.stringify({ ...login_json_1.default, id, name }, null, 2) + '\n';
76
+ }
61
77
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../packages/cli/src/templates/index.ts"],"names":[],"mappings":";;AA2CA,wDAYC;AAED,8DAgBC;AAED,kDAkBC;;AA7FD,sEAAyC;AACzC,wEAA2C;AAC3C,8EAAiD;AA6BjD,SAAS,kBAAkB,CAAC,EAAU;IACpC,IAAI,CAAC,EAAE,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,uBAAuB,EAAE,+BAA+B,CAAC,CAAC;IAC5E,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,OAAe;IACrC,IAAI,CAAC,OAAO,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,2BAA2B,CAAC,CAAC;IAC1E,CAAC;AACH,CAAC;AAED,SAAgB,sBAAsB,CAAC,UAAyB,EAAE;IAChE,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,IAAI,mBAAmB,CAAC;IAC7C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,mBAAmB,CAAC;IACjD,kBAAkB,CAAC,EAAE,CAAC,CAAC;IAEvB,MAAM,SAAS,GAAG;QAChB,GAAG,qBAAc;QACjB,EAAE;QACF,IAAI;KACL,CAAC;IAEF,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;AACnD,CAAC;AAED,SAAgB,yBAAyB,CAAC,UAA4B,EAAE;IACtE,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,IAAI,cAAc,CAAC;IACxC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,cAAc,CAAC;IAC5C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC;IAE3C,kBAAkB,CAAC,EAAE,CAAC,CAAC;IACvB,cAAc,CAAC,OAAO,CAAC,CAAC;IAExB,MAAM,YAAY,GAAG;QACnB,GAAG,wBAAiB;QACpB,EAAE;QACF,IAAI;QACJ,OAAO;KACR,CAAC;IAEF,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;AACtD,CAAC;AAED,SAAgB,mBAAmB,CAAC,UAA8B,EAAE;IAClE,MAAM,QAAQ,GAAG,oBAAa,CAAC;IAE/B,MAAM,MAAM,GAAG;QACb,GAAG,QAAQ;QACX,GAAG,OAAO;QACV,KAAK,EAAE,EAAE,GAAG,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE;QACtD,QAAQ,EAAE,EAAE,GAAG,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE;QAC/D,WAAW,EAAE,EAAE,GAAG,QAAQ,CAAC,WAAW,EAAE,GAAG,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC,EAAE;KACzE,CAAC;IAEF,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;IAChD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CACb,qCAAqC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAClF,CAAC;IACJ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../packages/cli/src/templates/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ {
2
+ "id": "default-list-detail",
3
+ "name": "DefaultListDetail",
4
+ "views": [
5
+ {
6
+ "name": "List",
7
+ "type": "list"
8
+ },
9
+ {
10
+ "name": "Detail",
11
+ "type": "detail"
12
+ }
13
+ ]
14
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "_secure_by_default": true,
3
+ "id": "default-login",
4
+ "name": "DefaultLogin",
5
+ "fields": [
6
+ {
7
+ "name": "username",
8
+ "type": "String"
9
+ },
10
+ {
11
+ "name": "password",
12
+ "type": "String"
13
+ }
14
+ ]
15
+ }
@@ -1,3 +1,7 @@
1
+ ## 0.0.41 (2026-09-30)
2
+
3
+ This was a version bump only for core to align it with other projects, there were no code changes.
4
+
1
5
  ## 0.0.40 (2026-09-29)
2
6
 
3
7
  ### 🚀 Features
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@origostudio/core",
3
- "version": "0.0.40",
3
+ "version": "0.0.41",
4
4
  "private": false,
5
5
  "type": "commonjs",
6
6
  "main": "./src/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@origostudio/core",
3
- "version": "0.0.40",
3
+ "version": "0.0.41",
4
4
  "private": false,
5
5
  "type": "commonjs",
6
6
  "main": "./src/index.js",
@@ -1,3 +1,7 @@
1
+ ## 0.0.41 (2026-09-30)
2
+
3
+ This was a version bump only for design-tokens to align it with other projects, there were no code changes.
4
+
1
5
  ## 0.0.40 (2026-09-29)
2
6
 
3
7
  ### 🚀 Features
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@origostudio/design-tokens",
3
- "version": "0.0.40",
3
+ "version": "0.0.41",
4
4
  "private": false,
5
5
  "type": "commonjs",
6
6
  "main": "./src/index.js",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@origostudio/origo-design",
3
- "version": "0.0.40",
3
+ "version": "0.0.41",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -1,3 +1,7 @@
1
+ ## 0.0.41 (2026-09-30)
2
+
3
+ This was a version bump only for angular-renderer to align it with other projects, there were no code changes.
4
+
1
5
  ## 0.0.40 (2026-09-29)
2
6
 
3
7
  ### 🚀 Features
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@origostudio/angular-renderer",
3
- "version": "0.0.40",
3
+ "version": "0.0.41",
4
4
  "private": false,
5
5
  "type": "commonjs",
6
6
  "main": "./dist/index.js",
7
7
  "types": "./dist/index.d.ts",
8
8
  "dependencies": {
9
- "@origostudio/core": "0.0.40",
10
- "@origostudio/design-tokens": "0.0.40",
9
+ "@origostudio/core": "0.0.41",
10
+ "@origostudio/design-tokens": "0.0.41",
11
11
  "tslib": "^2.3.0",
12
12
  "@analogjs/vite-plugin-angular": "^2.7.1",
13
13
  "zone.js": "^0.16.3",
@@ -1,3 +1,13 @@
1
+ ## 0.0.41 (2026-09-30)
2
+
3
+ ### 🚀 Features
4
+
5
+ - initialize workspace packages and implement CLI generator commands with templates ([b227117](https://github.com/OrigoStudio/origo-design/commit/b227117))
6
+
7
+ ### ❤️ Thank You
8
+
9
+ - Hardik Patel @hardikpatelse
10
+
1
11
  ## 0.0.40 (2026-09-29)
2
12
 
3
13
  ### 🚀 Features
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@origostudio/cli",
3
- "version": "0.0.40",
3
+ "version": "0.0.41",
4
4
  "private": false,
5
5
  "type": "commonjs",
6
6
  "main": "./src/index.js",
@@ -9,7 +9,7 @@
9
9
  "origo": "./src/main.js"
10
10
  },
11
11
  "dependencies": {
12
- "@origostudio/core": "0.0.40",
12
+ "@origostudio/core": "0.0.41",
13
13
  "commander": "^15.0.0",
14
14
  "tslib": "^2.3.0"
15
15
  },
@@ -1,5 +1,6 @@
1
1
  import { Command } from 'commander';
2
2
  import { entityCommand } from './entity';
3
+ import { pageCommand } from './page';
3
4
  import { ejectTemplates } from '../../lib/generator';
4
5
  import { handleError } from '../../utils/errors';
5
6
 
@@ -7,6 +8,7 @@ export function generateCommand(): Command {
7
8
  const cmd = new Command('generate').description('Generate Origo artifacts');
8
9
 
9
10
  cmd.addCommand(entityCommand());
11
+ cmd.addCommand(pageCommand());
10
12
 
11
13
  cmd
12
14
  .option('--eject', 'Copy internal templates to .origo/templates/ for customization')
@@ -0,0 +1,27 @@
1
+ import { Command, Option } from 'commander';
2
+ import { generatePage } from '../../lib/generator';
3
+ import { handleError } from '../../utils/errors';
4
+
5
+ export function pageCommand(): Command {
6
+ const cmd = new Command('page');
7
+ cmd
8
+ .description('Generate a BADL page boilerplate from a named template')
9
+ .addOption(
10
+ new Option('--template <name>', 'Template name')
11
+ .choices(['list-detail', 'login'])
12
+ .makeOptionMandatory(true)
13
+ )
14
+ .argument('<name>', 'Output schema name (PascalCase, e.g. UserListDetail)')
15
+ .option('--force', 'Overwrite existing file if it exists')
16
+ .option('--json', 'Output machine-readable JSON format')
17
+ .action(
18
+ async (name: string, options: { template: string; force?: boolean; json?: boolean }) => {
19
+ try {
20
+ await generatePage(options.template, name, { force: options.force, json: options.json });
21
+ } catch (error: unknown) {
22
+ handleError(error, { json: options.json });
23
+ }
24
+ }
25
+ );
26
+ return cmd;
27
+ }
@@ -1,7 +1,11 @@
1
1
  import * as fs from 'fs/promises';
2
2
  import * as path from 'path';
3
3
  import { CliError } from '../utils/errors';
4
- import { generateEntityTemplate } from '../templates';
4
+ import {
5
+ generateEntityTemplate,
6
+ generateListDetailTemplate,
7
+ generateLoginTemplate,
8
+ } from '../templates';
5
9
 
6
10
  // FR-AI-005 Extensibility: Plugin registry for future AI integration
7
11
  export interface GeneratorPlugin {
@@ -20,10 +24,10 @@ export async function generateEntity(
20
24
  if (!name || !name.trim()) {
21
25
  throw new CliError({ code: 'ERR_INVALID_NAME', message: 'Entity name must not be empty.' });
22
26
  }
23
- if (/[/\\]/.test(name)) {
27
+ if (!/^[a-zA-Z0-9_-]+$/.test(name)) {
24
28
  throw new CliError({
25
29
  code: 'ERR_INVALID_NAME',
26
- message: 'Entity name must not contain path separators.',
30
+ message: 'Entity name must only contain alphanumeric characters, dashes, or underscores.',
27
31
  });
28
32
  }
29
33
 
@@ -50,19 +54,18 @@ export async function generateEntity(
50
54
  for (const plugin of plugins) {
51
55
  if (plugin.resolveTemplate) {
52
56
  const resolved = await plugin.resolveTemplate(name);
53
- if (resolved) {
57
+ if (resolved !== null && resolved !== undefined) {
54
58
  content = resolved;
55
59
  break;
56
60
  }
57
61
  }
58
62
  }
59
63
 
60
- if (!content) {
64
+ if (content === null) {
61
65
  try {
62
66
  const rawTemplate = await fs.readFile(userTemplatePath, 'utf-8');
63
67
  content =
64
- rawTemplate.replace(/\{\{name\}\}/g, name).replace(/\{\{id\}\}/g, name.toLowerCase()) +
65
- '\n';
68
+ rawTemplate.split('{{name}}').join(name).split('{{id}}').join(name.toLowerCase()) + '\n';
66
69
  // Validate user template output
67
70
  try {
68
71
  JSON.parse(content);
@@ -80,17 +83,125 @@ export async function generateEntity(
80
83
  }
81
84
  }
82
85
 
86
+ await fs.mkdir(targetDir, { recursive: true });
87
+
88
+ if (!content) {
89
+ throw new CliError({
90
+ code: 'ERR_UNEXPECTED',
91
+ message: 'Failed to generate entity content.',
92
+ });
93
+ }
94
+
95
+ await fs.writeFile(targetPath, content as string, 'utf-8');
96
+
97
+ // FR-AI-005 Extensibility: Post-generate hooks
98
+ for (const plugin of plugins) {
99
+ if (plugin.postGenerate) {
100
+ await plugin.postGenerate({ name, targetPath });
101
+ }
102
+ }
103
+
104
+ if (options.json) {
105
+ console.log(
106
+ JSON.stringify(
107
+ {
108
+ status: 'success',
109
+ data: {
110
+ file: `./schemas/${name.toLowerCase()}.json`,
111
+ entityName: name,
112
+ },
113
+ },
114
+ null,
115
+ 2
116
+ )
117
+ );
118
+ } else {
119
+ console.log(`Successfully generated entity ${name} at ./schemas/${name.toLowerCase()}.json`);
120
+ }
121
+ }
122
+
123
+ export async function generatePage(
124
+ templateName: string,
125
+ name: string,
126
+ options: { force?: boolean; json?: boolean }
127
+ ): Promise<void> {
128
+ if (!name || !name.trim()) {
129
+ throw new CliError({ code: 'ERR_INVALID_NAME', message: 'Page name must not be empty.' });
130
+ }
131
+ if (!/^[a-zA-Z0-9_-]+$/.test(name)) {
132
+ throw new CliError({
133
+ code: 'ERR_INVALID_NAME',
134
+ message: 'Page name must only contain alphanumeric characters, dashes, or underscores.',
135
+ });
136
+ }
137
+
138
+ if (templateName !== 'list-detail' && templateName !== 'login') {
139
+ throw new CliError({
140
+ code: 'ERR_UNKNOWN_TEMPLATE',
141
+ message: `Unknown template: ${templateName}. Must be 'list-detail' or 'login'.`,
142
+ });
143
+ }
144
+
145
+ const targetDir = path.join(process.cwd(), 'schemas');
146
+ const targetPath = path.join(targetDir, name.toLowerCase() + '.json');
147
+ const userTemplatePath = path.join(process.cwd(), '.origo', 'templates', templateName + '.json');
148
+ let content: string | null = null;
149
+
83
150
  try {
84
- await fs.mkdir(targetDir, { recursive: true });
85
- } catch (err: unknown) {
86
- if ((err as NodeJS.ErrnoException).code !== 'EEXIST') throw err;
151
+ await fs.access(targetPath);
152
+ if (!options.force) {
153
+ throw new CliError({
154
+ code: 'ERR_FILE_EXISTS',
155
+ message: `File already exists: ${targetPath}. Use --force to overwrite.`,
156
+ context: { path: targetPath },
157
+ });
158
+ }
159
+ } catch (error: unknown) {
160
+ if (error instanceof CliError) throw error;
161
+ if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error;
162
+ }
163
+
164
+ // FR-AI-005 Extensibility: Check plugins first
165
+ for (const plugin of plugins) {
166
+ if (plugin.resolveTemplate) {
167
+ const resolved = await plugin.resolveTemplate(name);
168
+ if (resolved !== null && resolved !== undefined) {
169
+ content = resolved;
170
+ break;
171
+ }
172
+ }
87
173
  }
88
174
 
89
175
  if (content === null) {
90
- throw new CliError({ code: 'ERR_UNEXPECTED', message: 'Content is unexpectedly null.' });
176
+ try {
177
+ const rawTemplate = await fs.readFile(userTemplatePath, 'utf-8');
178
+ content =
179
+ rawTemplate.split('{{name}}').join(name).split('{{id}}').join(name.toLowerCase()) + '\n';
180
+ // Validate user template output
181
+ try {
182
+ JSON.parse(content);
183
+ } catch {
184
+ throw new CliError({
185
+ code: 'ERR_INVALID_TEMPLATE',
186
+ message: `The user template at ${userTemplatePath} produced invalid JSON when substituted.`,
187
+ });
188
+ }
189
+ } catch (err: unknown) {
190
+ if (err instanceof CliError) throw err;
191
+ const code = (err as NodeJS.ErrnoException).code;
192
+ if (code && code !== 'ENOENT') throw err;
193
+
194
+ if (templateName === 'list-detail') {
195
+ content = generateListDetailTemplate({ id: name.toLowerCase(), name });
196
+ } else {
197
+ content = generateLoginTemplate({ id: name.toLowerCase(), name });
198
+ }
199
+ }
91
200
  }
92
201
 
93
- await fs.writeFile(targetPath, content, 'utf-8');
202
+ await fs.mkdir(targetDir, { recursive: true });
203
+
204
+ await fs.writeFile(targetPath, content as string, 'utf-8');
94
205
 
95
206
  // FR-AI-005 Extensibility: Post-generate hooks
96
207
  for (const plugin of plugins) {
@@ -106,7 +217,7 @@ export async function generateEntity(
106
217
  status: 'success',
107
218
  data: {
108
219
  file: `./schemas/${name.toLowerCase()}.json`,
109
- entityName: name,
220
+ templateName: templateName,
110
221
  },
111
222
  },
112
223
  null,
@@ -114,7 +225,9 @@ export async function generateEntity(
114
225
  )
115
226
  );
116
227
  } else {
117
- console.log(`Successfully generated entity ${name} at ./schemas/${name.toLowerCase()}.json`);
228
+ console.log(
229
+ `Successfully generated page ${name} using ${templateName} template at ./schemas/${name.toLowerCase()}.json`
230
+ );
118
231
  }
119
232
  }
120
233
 
@@ -151,11 +264,7 @@ export async function ejectTemplates(options: { force?: boolean; json?: boolean
151
264
  }
152
265
  }
153
266
 
154
- try {
155
- await fs.mkdir(destDir, { recursive: true });
156
- } catch (err: unknown) {
157
- if ((err as NodeJS.ErrnoException).code !== 'EEXIST') throw err;
158
- }
267
+ await fs.mkdir(destDir, { recursive: true });
159
268
 
160
269
  await Promise.all(
161
270
  jsonFiles.map(file => fs.copyFile(path.join(srcDir, file), path.join(destDir, file)))
@@ -1,6 +1,8 @@
1
1
  import origoTemplate from './origo.json';
2
2
  import entityTemplate from './entity.json';
3
3
  import extensionTemplate from './extension.json';
4
+ import listDetailTemplate from './list-detail.json';
5
+ import loginTemplate from './login.json';
4
6
 
5
7
  export interface EntityOptions {
6
8
  id?: string;
@@ -92,3 +94,17 @@ export function generateOrigoConfig(options: OrigoConfigOptions = {}): string {
92
94
  );
93
95
  }
94
96
  }
97
+
98
+ export function generateListDetailTemplate(options: EntityOptions = {}): string {
99
+ const id = options.id || 'default-list-detail';
100
+ const name = options.name || 'DefaultListDetail';
101
+ validateIdentifier(id);
102
+ return JSON.stringify({ ...listDetailTemplate, id, name }, null, 2) + '\n';
103
+ }
104
+
105
+ export function generateLoginTemplate(options: EntityOptions = {}): string {
106
+ const id = options.id || 'default-login';
107
+ const name = options.name || 'DefaultLogin';
108
+ validateIdentifier(id);
109
+ return JSON.stringify({ ...loginTemplate, id, name }, null, 2) + '\n';
110
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "id": "default-list-detail",
3
+ "name": "DefaultListDetail",
4
+ "views": [
5
+ {
6
+ "name": "List",
7
+ "type": "list"
8
+ },
9
+ {
10
+ "name": "Detail",
11
+ "type": "detail"
12
+ }
13
+ ]
14
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "_secure_by_default": true,
3
+ "id": "default-login",
4
+ "name": "DefaultLogin",
5
+ "fields": [
6
+ {
7
+ "name": "username",
8
+ "type": "String"
9
+ },
10
+ {
11
+ "name": "password",
12
+ "type": "String"
13
+ }
14
+ ]
15
+ }
@@ -1,3 +1,7 @@
1
+ ## 0.0.41 (2026-09-30)
2
+
3
+ This was a version bump only for core to align it with other projects, there were no code changes.
4
+
1
5
  ## 0.0.40 (2026-09-29)
2
6
 
3
7
  ### 🚀 Features
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@origostudio/core",
3
- "version": "0.0.40",
3
+ "version": "0.0.41",
4
4
  "private": false,
5
5
  "type": "commonjs",
6
6
  "main": "./src/index.js",
@@ -1,3 +1,7 @@
1
+ ## 0.0.41 (2026-09-30)
2
+
3
+ This was a version bump only for design-tokens to align it with other projects, there were no code changes.
4
+
1
5
  ## 0.0.40 (2026-09-29)
2
6
 
3
7
  ### 🚀 Features
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@origostudio/design-tokens",
3
- "version": "0.0.40",
3
+ "version": "0.0.41",
4
4
  "private": false,
5
5
  "type": "commonjs",
6
6
  "main": "./src/index.js",
@@ -1,3 +1,7 @@
1
+ ## 0.0.41 (2026-09-30)
2
+
3
+ This was a version bump only for devtools to align it with other projects, there were no code changes.
4
+
1
5
  ## 0.0.40 (2026-09-29)
2
6
 
3
7
  ### 🚀 Features
@@ -1 +1 @@
1
- {"version":"4.1.11","results":[[":src/devtools-panel/app.component.spec.ts",{"duration":175.45078300000023,"failed":false}]]}
1
+ {"version":"4.1.11","results":[[":src/devtools-panel/app.component.spec.ts",{"duration":178.70303200000126,"failed":false}]]}
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@origostudio/devtools",
3
- "version": "0.0.40",
3
+ "version": "0.0.41",
4
4
  "type": "module",
5
5
  "dependencies": {
6
- "@origostudio/core": "0.0.40",
7
- "@origostudio/cli": "0.0.40",
6
+ "@origostudio/core": "0.0.41",
7
+ "@origostudio/cli": "0.0.41",
8
8
  "@angular/core": "18.1.0",
9
9
  "@angular/common": "18.1.0"
10
10
  },
@@ -1,3 +1,7 @@
1
+ ## 0.0.41 (2026-09-30)
2
+
3
+ This was a version bump only for playground to align it with other projects, there were no code changes.
4
+
1
5
  ## 0.0.40 (2026-09-29)
2
6
 
3
7
  ### 🚀 Features
@@ -1 +1 @@
1
- {"version":"4.1.11","results":[[":src/workers/compiler.worker.spec.ts",{"duration":3841.5166580000005,"failed":false}],[":src/editor/schema-registry.spec.ts",{"duration":27.97150899999906,"failed":false}],[":src/editor/badl-editor.component.spec.ts",{"duration":483.876608999999,"failed":false}],[":src/preview/preview.service.spec.ts",{"duration":85.94552900000053,"failed":false}],[":src/preview/preview-pane.component.spec.ts",{"duration":168.31610600000204,"failed":false}],[":src/preview/preview-root.component.spec.ts",{"duration":173.0899219999992,"failed":false}],[":src/app/app.component.spec.ts",{"duration":171.42793399999937,"failed":false}]]}
1
+ {"version":"4.1.11","results":[[":src/workers/compiler.worker.spec.ts",{"duration":3567.365329,"failed":false}],[":src/editor/badl-editor.component.spec.ts",{"duration":294.97996299999795,"failed":false}],[":src/editor/schema-registry.spec.ts",{"duration":31.46659699999873,"failed":false}],[":src/preview/preview.service.spec.ts",{"duration":90.75973000000158,"failed":false}],[":src/preview/preview-pane.component.spec.ts",{"duration":198.3648260000009,"failed":false}],[":src/preview/preview-root.component.spec.ts",{"duration":167.41953799999828,"failed":false}],[":src/app/app.component.spec.ts",{"duration":181.25265200000285,"failed":false}]]}
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@origostudio/playground",
3
- "version": "0.0.40",
3
+ "version": "0.0.41",
4
4
  "private": true,
5
5
  "dependencies": {
6
- "@origostudio/core": "0.0.40",
7
- "@origostudio/cli": "0.0.40"
6
+ "@origostudio/core": "0.0.41",
7
+ "@origostudio/cli": "0.0.41"
8
8
  },
9
9
  "peerDependencies": {
10
10
  "@angular/common": "^18.0.0",