@objectql/cli 4.0.1 โ†’ 4.0.3

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.
@@ -52,76 +52,126 @@ const child_process_1 = require("child_process");
52
52
  * Test command - runs tests for the ObjectQL project
53
53
  */
54
54
  async function test(options) {
55
- var _a, _b, _c;
55
+ var _a, _b, _c, _d, _e;
56
56
  console.log(chalk_1.default.blue('๐Ÿงช Running tests...\n'));
57
57
  const rootDir = path.resolve(process.cwd(), options.dir || '.');
58
58
  // Look for package.json to determine test runner
59
59
  const packageJsonPath = path.join(rootDir, 'package.json');
60
- let testCommand = 'npm test';
61
60
  try {
62
- if (fs.existsSync(packageJsonPath)) {
63
- try {
64
- const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
65
- // Check if jest is configured
66
- if (((_a = packageJson.devDependencies) === null || _a === void 0 ? void 0 : _a.jest) || ((_b = packageJson.dependencies) === null || _b === void 0 ? void 0 : _b.jest) || packageJson.jest) {
67
- const jestArgs = ['jest'];
68
- if (options.watch) {
69
- jestArgs.push('--watch');
70
- }
71
- if (options.coverage) {
72
- jestArgs.push('--coverage');
73
- }
74
- console.log(chalk_1.default.cyan(`Running: ${jestArgs.join(' ')}\n`));
75
- const jestProcess = (0, child_process_1.spawn)('npx', jestArgs, {
76
- cwd: rootDir,
77
- stdio: 'inherit',
78
- shell: true
79
- });
80
- jestProcess.on('exit', (code) => {
81
- if (code !== 0) {
82
- console.error(chalk_1.default.red(`\nโŒ Tests failed with exit code ${code}`));
83
- process.exit(code || 1);
84
- }
85
- else {
86
- console.log(chalk_1.default.green('\nโœ… All tests passed!'));
87
- }
88
- });
89
- return;
61
+ if (!fs.existsSync(packageJsonPath)) {
62
+ showNoTestConfig();
63
+ return;
64
+ }
65
+ let packageJson;
66
+ try {
67
+ packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
68
+ }
69
+ catch (parseError) {
70
+ console.error(chalk_1.default.yellow(`โš ๏ธ Failed to parse package.json: ${parseError.message}`));
71
+ showNoTestConfig();
72
+ return;
73
+ }
74
+ // Detect test runner or use specified one
75
+ const hasJest = ((_a = packageJson.devDependencies) === null || _a === void 0 ? void 0 : _a.jest) || ((_b = packageJson.dependencies) === null || _b === void 0 ? void 0 : _b.jest) || packageJson.jest;
76
+ const hasVitest = ((_c = packageJson.devDependencies) === null || _c === void 0 ? void 0 : _c.vitest) || ((_d = packageJson.dependencies) === null || _d === void 0 ? void 0 : _d.vitest);
77
+ let runner = options.runner;
78
+ if (!runner) {
79
+ // Auto-detect test runner
80
+ if (hasVitest) {
81
+ runner = 'vitest';
82
+ }
83
+ else if (hasJest) {
84
+ runner = 'jest';
85
+ }
86
+ }
87
+ // Run Jest
88
+ if (runner === 'jest' && hasJest) {
89
+ const jestArgs = ['jest'];
90
+ if (options.watch) {
91
+ jestArgs.push('--watch');
92
+ }
93
+ if (options.coverage) {
94
+ jestArgs.push('--coverage');
95
+ }
96
+ console.log(chalk_1.default.cyan(`Running: ${jestArgs.join(' ')}\n`));
97
+ const jestProcess = (0, child_process_1.spawn)('npx', jestArgs, {
98
+ cwd: rootDir,
99
+ stdio: 'inherit',
100
+ shell: true
101
+ });
102
+ jestProcess.on('exit', (code) => {
103
+ if (code !== 0) {
104
+ console.error(chalk_1.default.red(`\nโŒ Tests failed with exit code ${code}`));
105
+ process.exit(code || 1);
90
106
  }
91
- // Fall back to package.json test script
92
- if ((_c = packageJson.scripts) === null || _c === void 0 ? void 0 : _c.test) {
93
- console.log(chalk_1.default.cyan(`Running: npm test\n`));
94
- const npmProcess = (0, child_process_1.spawn)('npm', ['test'], {
95
- cwd: rootDir,
96
- stdio: 'inherit',
97
- shell: true
98
- });
99
- npmProcess.on('exit', (code) => {
100
- if (code !== 0) {
101
- console.error(chalk_1.default.red(`\nโŒ Tests failed with exit code ${code}`));
102
- process.exit(code || 1);
103
- }
104
- else {
105
- console.log(chalk_1.default.green('\nโœ… All tests passed!'));
106
- }
107
- });
108
- return;
107
+ else {
108
+ console.log(chalk_1.default.green('\nโœ… All tests passed!'));
109
109
  }
110
+ });
111
+ return;
112
+ }
113
+ // Run Vitest
114
+ if (runner === 'vitest' && hasVitest) {
115
+ const vitestArgs = ['vitest'];
116
+ if (options.watch) {
117
+ vitestArgs.push('--watch');
118
+ }
119
+ else {
120
+ vitestArgs.push('run');
110
121
  }
111
- catch (parseError) {
112
- console.error(chalk_1.default.yellow(`โš ๏ธ Failed to parse package.json: ${parseError.message}`));
122
+ if (options.coverage) {
123
+ vitestArgs.push('--coverage');
113
124
  }
125
+ console.log(chalk_1.default.cyan(`Running: ${vitestArgs.join(' ')}\n`));
126
+ const vitestProcess = (0, child_process_1.spawn)('npx', vitestArgs, {
127
+ cwd: rootDir,
128
+ stdio: 'inherit',
129
+ shell: true
130
+ });
131
+ vitestProcess.on('exit', (code) => {
132
+ if (code !== 0) {
133
+ console.error(chalk_1.default.red(`\nโŒ Tests failed with exit code ${code}`));
134
+ process.exit(code || 1);
135
+ }
136
+ else {
137
+ console.log(chalk_1.default.green('\nโœ… All tests passed!'));
138
+ }
139
+ });
140
+ return;
141
+ }
142
+ // Fall back to package.json test script
143
+ if ((_e = packageJson.scripts) === null || _e === void 0 ? void 0 : _e.test) {
144
+ console.log(chalk_1.default.cyan(`Running: npm test\n`));
145
+ const npmProcess = (0, child_process_1.spawn)('npm', ['test'], {
146
+ cwd: rootDir,
147
+ stdio: 'inherit',
148
+ shell: true
149
+ });
150
+ npmProcess.on('exit', (code) => {
151
+ if (code !== 0) {
152
+ console.error(chalk_1.default.red(`\nโŒ Tests failed with exit code ${code}`));
153
+ process.exit(code || 1);
154
+ }
155
+ else {
156
+ console.log(chalk_1.default.green('\nโœ… All tests passed!'));
157
+ }
158
+ });
159
+ return;
114
160
  }
115
161
  // No test configuration found
116
- console.log(chalk_1.default.yellow('โš ๏ธ No test configuration found'));
117
- console.log(chalk_1.default.gray('To add tests to your project:'));
118
- console.log(chalk_1.default.gray(' 1. Install jest: npm install --save-dev jest @types/jest ts-jest'));
119
- console.log(chalk_1.default.gray(' 2. Create a jest.config.js file'));
120
- console.log(chalk_1.default.gray(' 3. Add a test script to package.json'));
162
+ showNoTestConfig();
121
163
  }
122
164
  catch (e) {
123
165
  console.error(chalk_1.default.red('โŒ Test execution failed:'), e.message);
124
166
  process.exit(1);
125
167
  }
126
168
  }
169
+ function showNoTestConfig() {
170
+ console.log(chalk_1.default.yellow('โš ๏ธ No test configuration found'));
171
+ console.log(chalk_1.default.gray('To add tests to your project:'));
172
+ console.log(chalk_1.default.gray(' 1. Install jest: npm install --save-dev jest @types/jest ts-jest'));
173
+ console.log(chalk_1.default.gray(' Or install vitest: npm install --save-dev vitest'));
174
+ console.log(chalk_1.default.gray(' 2. Create a jest.config.js or vitest.config.ts file'));
175
+ console.log(chalk_1.default.gray(' 3. Add a test script to package.json'));
176
+ }
127
177
  //# sourceMappingURL=test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"test.js","sourceRoot":"","sources":["../../src/commands/test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"test.js","sourceRoot":"","sources":["../../src/commands/test.ts"],"names":[],"mappings":"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"}
@@ -37,6 +37,10 @@ function registerToolsCommands(program) {
37
37
  program
38
38
  .command('test')
39
39
  .description('Run tests')
40
+ .option('-w, --watch', 'Run tests in watch mode')
41
+ .option('-c, --coverage', 'Generate coverage report')
42
+ .option('-r, --runner <runner>', 'Test runner to use (jest or vitest)')
43
+ .option('-d, --dir <path>', 'Directory to run tests from', '.')
40
44
  .action(async (options) => {
41
45
  await (0, test_1.test)(options);
42
46
  });
@@ -1 +1 @@
1
- {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/register/tools.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AASH,sDA4CC;AAlDD,+CAAoE;AACpE,2CAA6C;AAC7C,2CAAwC;AACxC,2CAAwC;AACxC,+CAA4C;AAE5C,SAAgB,qBAAqB,CAAC,OAAgB;IAClD,OAAO;SACF,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,4CAA4C,CAAC;SACzD,MAAM,CAAC,KAAK,IAAI,EAAE;QACf,MAAM,IAAA,sBAAa,GAAE,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEP,OAAO;SACF,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,6BAA6B,CAAC;SAC1C,MAAM,CAAC,kBAAkB,EAAE,uBAAuB,EAAE,GAAG,CAAC;SACxD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACtB,MAAM,IAAA,wBAAe,EAAC,OAAO,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEP,OAAO;SACF,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,wBAAwB,CAAC;SACrC,MAAM,CAAC,qBAAqB,EAAE,4BAA4B,CAAC;SAC3D,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACtB,MAAM,IAAA,gBAAS,EAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEP,OAAO;SACF,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,WAAW,CAAC;SACxB,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACtB,MAAM,IAAA,WAAI,EAAC,OAAO,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IAEP,OAAO;SACF,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,qBAAqB,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACtB,MAAM,IAAA,WAAI,EAAC,OAAO,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IAEP,OAAO;SACF,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,uBAAuB,CAAC;SACpC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACtB,MAAM,IAAA,eAAM,EAAC,OAAO,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACX,CAAC"}
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/register/tools.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AASH,sDAgDC;AAtDD,+CAAoE;AACpE,2CAA6C;AAC7C,2CAAwC;AACxC,2CAAwC;AACxC,+CAA4C;AAE5C,SAAgB,qBAAqB,CAAC,OAAgB;IAClD,OAAO;SACF,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,4CAA4C,CAAC;SACzD,MAAM,CAAC,KAAK,IAAI,EAAE;QACf,MAAM,IAAA,sBAAa,GAAE,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEP,OAAO;SACF,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,6BAA6B,CAAC;SAC1C,MAAM,CAAC,kBAAkB,EAAE,uBAAuB,EAAE,GAAG,CAAC;SACxD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACtB,MAAM,IAAA,wBAAe,EAAC,OAAO,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEP,OAAO;SACF,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,wBAAwB,CAAC;SACrC,MAAM,CAAC,qBAAqB,EAAE,4BAA4B,CAAC;SAC3D,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACtB,MAAM,IAAA,gBAAS,EAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEP,OAAO;SACF,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,WAAW,CAAC;SACxB,MAAM,CAAC,aAAa,EAAE,yBAAyB,CAAC;SAChD,MAAM,CAAC,gBAAgB,EAAE,0BAA0B,CAAC;SACpD,MAAM,CAAC,uBAAuB,EAAE,qCAAqC,CAAC;SACtE,MAAM,CAAC,kBAAkB,EAAE,6BAA6B,EAAE,GAAG,CAAC;SAC9D,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACtB,MAAM,IAAA,WAAI,EAAC,OAAO,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IAEP,OAAO;SACF,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,qBAAqB,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACtB,MAAM,IAAA,WAAI,EAAC,OAAO,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IAEP,OAAO;SACF,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,uBAAuB,CAAC;SACpC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACtB,MAAM,IAAA,eAAM,EAAC,OAAO,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACX,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@objectql/cli",
3
- "version": "4.0.1",
3
+ "version": "4.0.3",
4
4
  "description": "Command-line interface for ObjectQL - Code generation, migrations, REPL, and AI-powered development tools",
5
5
  "keywords": [
6
6
  "objectql",
@@ -34,11 +34,13 @@
34
34
  "ts-node": "^10.9.1",
35
35
  "openai": "^4.28.0",
36
36
  "dotenv": "^16.4.5",
37
- "@objectql/types": "4.0.1",
38
- "@objectql/core": "4.0.1",
39
- "@objectql/server": "4.0.1",
40
- "@objectql/driver-sql": "4.0.1",
41
- "@objectql/platform-node": "4.0.1"
37
+ "@objectql/types": "4.0.3",
38
+ "@objectql/plugin-validator": "4.0.3",
39
+ "@objectql/plugin-ai-agent": "4.0.3",
40
+ "@objectql/core": "4.0.3",
41
+ "@objectql/server": "4.0.3",
42
+ "@objectql/driver-sql": "4.0.3",
43
+ "@objectql/platform-node": "4.0.3"
42
44
  },
43
45
  "devDependencies": {
44
46
  "typescript": "^5.0.0",
@@ -47,7 +49,7 @@
47
49
  },
48
50
  "scripts": {
49
51
  "build": "tsc && pnpm run copy-templates",
50
- "copy-templates": "rm -rf templates && mkdir -p templates && cp -r ../../../examples/quickstart/hello-world templates/ && cp -r ../../../examples/showcase/project-tracker templates/starter && rm -rf templates/*/node_modules templates/*/dist templates/*/__tests__",
52
+ "copy-templates": "rm -rf templates && mkdir -p templates && rsync -av --exclude='node_modules' --exclude='dist' --exclude='__tests__' ../../../examples/quickstart/hello-world templates/ && rsync -av --exclude='node_modules' --exclude='dist' --exclude='__tests__' ../../../examples/showcase/project-tracker/ templates/starter",
51
53
  "watch": "tsc -w",
52
54
  "test": "jest"
53
55
  }
@@ -1,5 +1,21 @@
1
1
  # @example/hello-world
2
2
 
3
+ ## 4.0.3
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies
8
+ - @objectql/core@4.0.3
9
+ - @objectql/driver-sql@4.0.3
10
+
11
+ ## 4.0.2
12
+
13
+ ### Patch Changes
14
+
15
+ - Updated dependencies
16
+ - @objectql/core@4.0.2
17
+ - @objectql/driver-sql@4.0.2
18
+
3
19
  ## 4.0.1
4
20
 
5
21
  ### Patch Changes
@@ -1,11 +1,51 @@
1
1
  # Hello ObjectQL
2
2
 
3
- This is the simplest possible example of **ObjectQL**.
3
+ This is the simplest possible example of **ObjectQL** following the **latest ObjectStack specification** (v4.0+).
4
4
 
5
- It demonstrates:
6
- 1. **Zero Config:** No YAML files or server setup required.
7
- 2. **In-Memory SQL:** Uses SQLite in memory, so no database installation is needed.
8
- 3. **Inline Schema:** Defines the data model directly in code.
5
+ ## What it demonstrates
6
+
7
+ 1. **Zero Config:** No YAML files or server setup required
8
+ 2. **In-Memory SQL:** Uses SQLite in memory, so no database installation is needed
9
+ 3. **Inline Schema:** Defines the data model directly in code using programmatic API
10
+ 4. **Latest Spec Compliance:**
11
+ - Label/value format for select options
12
+ - Explicit field labels for AI-friendly metadata
13
+ - Proper field type declarations
14
+
15
+ ## Key Concepts
16
+
17
+ ### Metadata Definition Approaches
18
+
19
+ **Programmatic (This Example):**
20
+ ```typescript
21
+ app.registerObject({
22
+ name: 'deal', // Required when using code
23
+ fields: {
24
+ stage: {
25
+ type: 'select',
26
+ options: [
27
+ { label: 'New', value: 'new' }, // โœ… Latest spec format
28
+ { label: 'Negotiation', value: 'negotiation' }
29
+ ]
30
+ }
31
+ }
32
+ });
33
+ ```
34
+
35
+ **YAML-based (Recommended for Production):**
36
+ ```yaml
37
+ # File: deal.object.yml
38
+ # NO 'name:' field needed - inferred from filename! โœ…
39
+ label: Deal
40
+ fields:
41
+ stage:
42
+ type: select
43
+ options:
44
+ - label: New
45
+ value: new
46
+ - label: Negotiation
47
+ value: negotiation
48
+ ```
9
49
 
10
50
  ## How to Run
11
51
 
@@ -16,14 +56,37 @@ Since you are in the monorepo, simply run:
16
56
  pnpm install
17
57
 
18
58
  # Run the script
19
- cd examples/starters/hello-world
59
+ cd examples/quickstart/hello-world
20
60
  pnpm start
21
61
  ```
22
62
 
23
63
  ## What you see
24
64
 
25
65
  The script will:
26
- 1. Initialize the ObjectQL engine.
27
- 2. Create a `deal` object definition on the fly.
28
- 3. Insert a record into the in-memory SQLite database.
29
- 4. Query it back and print the result.
66
+ 1. Initialize the ObjectQL engine with an in-memory SQLite driver
67
+ 2. Create a `deal` object definition programmatically
68
+ 3. Insert a record into the database
69
+ 4. Query it back and print the result
70
+
71
+ ## Expected Output
72
+
73
+ ```
74
+ ๐Ÿš€ Starting ObjectQL Hello World...
75
+ Creating a new Deal...
76
+ โœ… Deals found in database: [
77
+ {
78
+ _id: '...',
79
+ title: 'Enterprise Contract',
80
+ amount: 50000,
81
+ stage: 'new',
82
+ created_at: '...',
83
+ updated_at: '...'
84
+ }
85
+ ]
86
+ ```
87
+
88
+ ## Next Steps
89
+
90
+ - See [Project Tracker Example](../../showcase/project-tracker/) for YAML-based metadata
91
+ - Read the [Metadata Standard Spec](https://protocol.objectstack.ai) from @objectstack/spec
92
+ - Explore the [ObjectQL Documentation](../../../content/docs/)
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@objectql/example-hello-world",
3
- "version": "4.0.1",
3
+ "version": "4.0.3",
4
4
  "private": true,
5
5
  "repository": {
6
6
  "type": "git",
@@ -26,14 +26,26 @@ async function main() {
26
26
  }
27
27
  });
28
28
 
29
- // 3. Define Metadata Inline
29
+ // 3. Define Metadata Inline (Following Latest ObjectStack Specification)
30
+ // Note: When using registerObject(), the 'name' is required in code
31
+ // When using YAML files, the name is inferred from filename (e.g., deal.object.yml)
30
32
  app.registerObject({
31
- name: 'deal',
33
+ name: 'deal', // Required for programmatic registration
34
+ label: 'Deal', // Human-readable label
32
35
  fields: {
33
- title: { type: 'text', required: true },
34
- amount: { type: 'currency' },
36
+ title: {
37
+ type: 'text',
38
+ required: true,
39
+ label: 'Deal Title'
40
+ },
41
+ amount: {
42
+ type: 'currency',
43
+ label: 'Deal Amount'
44
+ },
35
45
  stage: {
36
- type: 'select',
46
+ type: 'select',
47
+ label: 'Deal Stage',
48
+ // Options use label/value format (ObjectStack spec v4.0+)
37
49
  options: [
38
50
  { label: 'New', value: 'new' },
39
51
  { label: 'Negotiation', value: 'negotiation' },
@@ -1,5 +1,25 @@
1
1
  # @objectql/starter-basic
2
2
 
3
+ ## 4.0.3
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies
8
+ - @objectql/core@4.0.3
9
+ - @objectql/driver-sql@4.0.3
10
+ - @objectql/platform-node@4.0.3
11
+ - @objectql/types@4.0.3
12
+
13
+ ## 4.0.2
14
+
15
+ ### Patch Changes
16
+
17
+ - Updated dependencies
18
+ - @objectql/core@4.0.2
19
+ - @objectql/driver-sql@4.0.2
20
+ - @objectql/platform-node@4.0.2
21
+ - @objectql/types@4.0.2
22
+
3
23
  ## 4.0.1
4
24
 
5
25
  ### Patch Changes
@@ -13,10 +13,18 @@ module.exports = {
13
13
  moduleNameMapper: {
14
14
  },
15
15
  transform: {
16
- '^.+\\.ts$': ['ts-jest', {
16
+ '^.+\\.(t|j)sx?$': ['ts-jest', {
17
17
  isolatedModules: true,
18
+ tsconfig: {
19
+ esModuleInterop: true,
20
+ allowSyntheticDefaultImports: true,
21
+ allowJs: true,
22
+ }
18
23
  }],
19
24
  },
25
+ transformIgnorePatterns: [
26
+ "/node_modules/(?!(@objectstack|.pnpm))"
27
+ ],
20
28
  collectCoverageFrom: [
21
29
  'src/**/*.ts',
22
30
  '!src/**/*.d.ts',
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@objectql/example-project-tracker",
3
- "version": "4.0.1",
3
+ "version": "4.0.3",
4
4
  "description": "ObjectQL Basic Example Project",
5
5
  "private": true,
6
6
  "keywords": [
@@ -1,49 +1,108 @@
1
+ # File: projects.object.yml
2
+ # Object name is inferred from filename as 'projects'
1
3
  label: Project
2
4
  icon: building-line
5
+
6
+ ai_context:
7
+ intent: "Track and manage software development projects"
8
+ domain: project_management
9
+ aliases: [project, initiative]
10
+ common_queries:
11
+ - "Find active projects"
12
+ - "Show projects by priority"
13
+ - "List projects with high budget"
14
+
3
15
  fields:
4
16
  name:
5
17
  type: text
6
18
  required: true
19
+ label: Project Name
7
20
  index: true # Field-level index
21
+ ai_context:
22
+ intent: "Primary identifier for the project"
23
+ examples: ["Website Redesign", "Mobile App v2.0"]
8
24
 
9
25
  status:
26
+ type: select
27
+ label: Project Status
10
28
  options:
11
- - planned
12
- - in_progress
13
- - completed
29
+ - label: Planned
30
+ value: planned
31
+ - label: In Progress
32
+ value: in_progress
33
+ - label: Completed
34
+ value: completed
14
35
  defaultValue: planned
15
36
  index: true
37
+ ai_context:
38
+ intent: "Track project lifecycle stage"
39
+ is_state_machine: true
40
+ transitions:
41
+ planned: [in_progress, completed]
42
+ in_progress: [completed, planned]
43
+ completed: []
16
44
 
17
45
  priority:
46
+ type: select
47
+ label: Priority Level
18
48
  options:
19
- - low
20
- - normal
21
- - high
49
+ - label: Low
50
+ value: low
51
+ - label: Normal
52
+ value: normal
53
+ - label: High
54
+ value: high
22
55
  defaultValue: normal
56
+ ai_context:
57
+ intent: "Prioritize project execution order"
58
+ selection_guidance: "High priority for urgent or critical projects"
23
59
 
24
60
  description:
25
61
  type: textarea
62
+ label: Project Description
63
+ ai_context:
64
+ intent: "Detailed project overview and objectives"
26
65
 
27
66
  owner:
28
67
  type: text
68
+ label: Project Owner
69
+ ai_context:
70
+ intent: "Person responsible for project success"
71
+ semantic_type: ownership
29
72
 
30
73
  budget:
31
74
  type: currency
75
+ label: Project Budget
76
+ ai_context:
77
+ intent: "Allocated financial resources"
78
+ validation_notes: "Must be non-negative; >$10k requires detailed description"
32
79
 
33
80
  start_date:
34
81
  type: date
82
+ label: Start Date
83
+ ai_context:
84
+ intent: "Project commencement date"
35
85
 
36
86
  end_date:
37
87
  type: date
88
+ label: End Date
89
+ ai_context:
90
+ intent: "Target completion date"
91
+ validation_notes: "Must be on or after start_date"
38
92
 
39
93
  approved_by:
40
94
  type: text
95
+ label: Approved By
96
+ ai_context:
97
+ intent: "Approver identity for audit trail"
41
98
 
42
99
  approved_at:
43
100
  type: datetime
101
+ label: Approval Timestamp
44
102
 
45
103
  approval_comment:
46
104
  type: textarea
105
+ label: Approval Comment
47
106
 
48
107
  indexes:
49
108
  # Composite index for reporting
@@ -1,5 +1,5 @@
1
- name: projects_validation
2
- object: projects
1
+ # File: projects.validation.yml
2
+ # Object is inferred from filename as 'projects'
3
3
  description: "Validation rules for Projects"
4
4
 
5
5
  rules:
@@ -8,25 +8,33 @@ rules:
8
8
  ai_context:
9
9
  intent: "Ensure project timeline is valid"
10
10
  business_rule: "Projects cannot end before they start"
11
+ rationale: "Maintaining data integrity for project scheduling"
11
12
  rule:
12
13
  field: end_date
13
14
  operator: ">="
14
15
  compare_to: start_date
15
- message: "End Date must be after Start Date"
16
+ message: "End Date must be on or after Start Date"
17
+ error_code: "INVALID_DATE_RANGE"
16
18
 
17
19
  - name: positive_budget
18
20
  type: field
21
+ ai_context:
22
+ intent: "Prevent negative budget values"
23
+ business_rule: "Project budget must be zero or positive"
19
24
  rule:
20
25
  field: budget
21
26
  operator: ">="
22
27
  value: 0
23
28
  message: "Budget cannot be negative"
29
+ error_code: "NEGATIVE_BUDGET"
24
30
 
25
31
  - name: comment_required_if_high_budget
26
32
  type: conditional
27
33
  description: "Description is required for high budget projects"
28
34
  ai_context:
29
- business_rule: "High value projects (>10k) must have a detailed description"
35
+ intent: "Ensure governance for high-value projects"
36
+ business_rule: "High value projects (>$10k) must have a detailed description for stakeholder transparency"
37
+ rationale: "Projects over $10,000 require executive oversight and clear documentation"
30
38
  condition:
31
39
  field: budget
32
40
  operator: ">"
@@ -35,3 +43,4 @@ rules:
35
43
  field: description
36
44
  operator: "not_empty"
37
45
  message: "Description is required for high budget projects (> $10,000)"
46
+ error_code: "HIGH_BUDGET_REQUIRES_DESCRIPTION"
@@ -50,7 +50,7 @@ async function main() {
50
50
 
51
51
  console.log("Querying Tasks...");
52
52
  const tasks = await ctx.object('tasks').find({
53
- filters: { project: projectId }
53
+ where: { project: projectId }
54
54
  });
55
55
 
56
56
  console.log("๐Ÿ“Š Project Report:", JSON.stringify({ project, tasks }, null, 2));