scene-capability-engine 3.6.57 → 3.6.58

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 (34) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +5 -3
  3. package/README.zh.md +5 -3
  4. package/bin/scene-capability-engine.js +2 -0
  5. package/docs/command-reference.md +72 -0
  6. package/docs/magicball-adaptation-task-checklist-v1.md +65 -10
  7. package/docs/magicball-cli-invocation-examples.md +53 -8
  8. package/docs/magicball-engineering-projection-contract.md +175 -0
  9. package/docs/magicball-frontend-state-and-command-mapping.md +42 -5
  10. package/docs/magicball-integration-doc-index.md +19 -5
  11. package/docs/magicball-integration-issue-tracker.md +15 -5
  12. package/docs/magicball-mode-home-and-ontology-empty-state-playbook.md +13 -5
  13. package/docs/magicball-project-portfolio-contract.md +216 -0
  14. package/docs/magicball-sce-adaptation-guide.md +18 -4
  15. package/docs/magicball-ui-surface-checklist.md +25 -0
  16. package/docs/magicball-write-auth-adaptation-guide.md +3 -1
  17. package/docs/release-checklist.md +8 -0
  18. package/docs/releases/README.md +1 -0
  19. package/docs/releases/v3.6.58.md +27 -0
  20. package/docs/zh/release-checklist.md +8 -0
  21. package/docs/zh/releases/README.md +1 -0
  22. package/docs/zh/releases/v3.6.58.md +27 -0
  23. package/lib/app/engineering-scaffold-service.js +154 -0
  24. package/lib/commands/app.js +442 -13
  25. package/lib/commands/project.js +105 -0
  26. package/lib/commands/scene.js +16 -0
  27. package/lib/project/portfolio-projection-service.js +389 -0
  28. package/lib/project/supervision-projection-service.js +329 -0
  29. package/lib/project/target-resolution-service.js +180 -0
  30. package/lib/scene/delivery-projection-service.js +650 -0
  31. package/package.json +6 -2
  32. package/scripts/magicball-engineering-contract-audit.js +347 -0
  33. package/scripts/magicball-project-contract-audit.js +254 -0
  34. package/template/.sce/README.md +2 -2
@@ -0,0 +1,347 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ const fs = require('fs');
5
+ const path = require('path');
6
+
7
+ const REQUIRED_CHECKS = [
8
+ {
9
+ path: 'README.md',
10
+ requiredSnippets: [
11
+ '`sce scene delivery show`',
12
+ '`sce app engineering preview|ownership|open|import|show|attach|hydrate|scaffold|activate`'
13
+ ]
14
+ },
15
+ {
16
+ path: 'README.zh.md',
17
+ requiredSnippets: [
18
+ '`sce scene delivery show`',
19
+ '`sce app engineering preview|ownership|open|import|show|attach|hydrate|scaffold|activate`'
20
+ ]
21
+ },
22
+ {
23
+ path: 'docs/command-reference.md',
24
+ requiredSnippets: [
25
+ 'sce scene delivery show --scene scene.demo --json',
26
+ 'sce app engineering preview --app customer-order-demo --json',
27
+ 'sce app engineering ownership --app customer-order-demo --json',
28
+ 'sce app engineering open --app customer-order-demo --json',
29
+ 'sce app engineering import --app customer-order-demo --json',
30
+ 'sce app engineering scaffold --app customer-order-demo --overwrite-policy missing-only --json'
31
+ ]
32
+ },
33
+ {
34
+ path: 'docs/magicball-sce-adaptation-guide.md',
35
+ requiredSnippets: [
36
+ '`docs/magicball-engineering-projection-contract.md`',
37
+ '`scene delivery show`',
38
+ '`app engineering preview`',
39
+ '`app engineering ownership`',
40
+ '`sce app engineering preview/ownership/open/import/show/attach/hydrate/scaffold/activate`'
41
+ ]
42
+ },
43
+ {
44
+ path: 'docs/magicball-integration-doc-index.md',
45
+ requiredSnippets: [
46
+ '`docs/magicball-engineering-projection-contract.md`',
47
+ '| `magicball-engineering-projection-contract.md` | engineering payload contract | medium |'
48
+ ]
49
+ },
50
+ {
51
+ path: 'docs/magicball-engineering-projection-contract.md',
52
+ requiredSnippets: [
53
+ 'sce scene delivery show --scene <scene-id> --json',
54
+ 'sce app engineering preview --app <app-key> --json',
55
+ 'sce app engineering ownership --app <app-key> --json',
56
+ 'sce app engineering open --app <app-key> --json',
57
+ 'sce app engineering import --app <app-key> --json',
58
+ 'sce app engineering scaffold --app <app-key> --overwrite-policy missing-only --json'
59
+ ]
60
+ },
61
+ {
62
+ path: 'docs/magicball-frontend-state-and-command-mapping.md',
63
+ requiredSnippets: [
64
+ 'sceneDelivery: Record<string, unknown> | null',
65
+ 'engineeringPreview: Record<string, unknown> | null',
66
+ 'engineeringOwnership: Record<string, unknown> | null',
67
+ '`sce scene delivery show --scene <scene-id> --json`',
68
+ '`sce app engineering preview --app <app-key> --json`',
69
+ '`sce app engineering ownership --app <app-key> --json`'
70
+ ]
71
+ },
72
+ {
73
+ path: 'docs/magicball-cli-invocation-examples.md',
74
+ requiredSnippets: [
75
+ 'sce scene delivery show --scene scene.customer-order-demo --json',
76
+ 'sce app engineering preview --app customer-order-demo --json',
77
+ 'sce app engineering ownership --app customer-order-demo --json',
78
+ 'sce app engineering open --app customer-order-demo --json',
79
+ 'sce app engineering import --app customer-order-demo --json',
80
+ 'sce app engineering scaffold --app customer-order-demo --overwrite-policy missing-only --json'
81
+ ]
82
+ },
83
+ {
84
+ path: 'docs/magicball-write-auth-adaptation-guide.md',
85
+ requiredSnippets: [
86
+ '- `app:engineering:scaffold`',
87
+ '| Scaffold engineering workspace baseline | `sce app engineering scaffold` | `app:engineering:scaffold` |',
88
+ 'sce auth grant --scope app:engineering:attach,app:engineering:hydrate,app:engineering:scaffold,app:engineering:activate --reason "initialize engineering workspace" --json'
89
+ ]
90
+ },
91
+ {
92
+ path: 'docs/magicball-mode-home-and-ontology-empty-state-playbook.md',
93
+ requiredSnippets: [
94
+ '4. `sce scene delivery show --scene <scene-id> --json`',
95
+ '5. `sce app engineering preview --app <app-key> --json`',
96
+ '6. `sce app engineering ownership --app <app-key> --json`'
97
+ ]
98
+ },
99
+ {
100
+ path: 'docs/magicball-adaptation-task-checklist-v1.md',
101
+ requiredSnippets: [
102
+ 'frontend loads them sequentially in this order: application -> ontology -> engineering -> scene delivery -> engineering preview -> engineering ownership',
103
+ 'sce app engineering scaffold --app customer-order-demo --overwrite-policy missing-only --json',
104
+ '- `sce app engineering scaffold`'
105
+ ]
106
+ },
107
+ {
108
+ path: 'docs/magicball-ui-surface-checklist.md',
109
+ requiredSnippets: [
110
+ '- `docs/magicball-engineering-projection-contract.md`',
111
+ '- delivery column from `scene delivery show`',
112
+ '- engineering readiness state from `app engineering preview`',
113
+ '- engineering ownership state from `app engineering ownership`'
114
+ ]
115
+ },
116
+ {
117
+ path: 'docs/magicball-integration-issue-tracker.md',
118
+ requiredSnippets: [
119
+ '- `scene delivery show`',
120
+ '- `app engineering preview/ownership/open/import/show/attach/hydrate/scaffold/activate`',
121
+ '4. scene delivery show',
122
+ '5. engineering preview',
123
+ '6. engineering ownership'
124
+ ]
125
+ }
126
+ ];
127
+
128
+ const PROHIBITED_SNIPPETS = [
129
+ {
130
+ value: 'application -> ontology -> engineering -> engineering show',
131
+ allowedPaths: [
132
+ 'scripts/magicball-engineering-contract-audit.js',
133
+ 'tests/unit/scripts/magicball-engineering-contract-audit.test.js'
134
+ ]
135
+ },
136
+ {
137
+ value: '`sce app engineering show/attach/hydrate/activate`',
138
+ allowedPaths: [
139
+ 'scripts/magicball-engineering-contract-audit.js',
140
+ 'tests/unit/scripts/magicball-engineering-contract-audit.test.js',
141
+ 'docs/magicball-app-bundle-sqlite-and-command-draft.md'
142
+ ]
143
+ }
144
+ ];
145
+
146
+ const SEARCH_DIRECTORIES = ['docs', 'README.md', 'README.zh.md'];
147
+
148
+ function parseArgs(argv = process.argv.slice(2)) {
149
+ const options = {
150
+ projectPath: process.cwd(),
151
+ json: false,
152
+ failOnViolation: false,
153
+ out: null
154
+ };
155
+
156
+ for (let index = 0; index < argv.length; index += 1) {
157
+ const token = argv[index];
158
+ const next = argv[index + 1];
159
+ if (token === '--project-path' && next) {
160
+ options.projectPath = path.resolve(next);
161
+ index += 1;
162
+ continue;
163
+ }
164
+ if (token === '--json') {
165
+ options.json = true;
166
+ continue;
167
+ }
168
+ if (token === '--fail-on-violation') {
169
+ options.failOnViolation = true;
170
+ continue;
171
+ }
172
+ if (token === '--out' && next) {
173
+ options.out = path.resolve(next);
174
+ index += 1;
175
+ continue;
176
+ }
177
+ if (token === '--help' || token === '-h') {
178
+ printHelpAndExit(0);
179
+ }
180
+ }
181
+
182
+ return options;
183
+ }
184
+
185
+ function printHelpAndExit(code) {
186
+ const lines = [
187
+ 'Usage: node scripts/magicball-engineering-contract-audit.js [options]',
188
+ '',
189
+ 'Options:',
190
+ ' --project-path <path> Project root to audit (default: current directory)',
191
+ ' --json Print JSON payload',
192
+ ' --fail-on-violation Exit code 2 when any violation is found',
193
+ ' --out <path> Write JSON payload to file',
194
+ ' -h, --help Show this help'
195
+ ];
196
+ console.log(lines.join('\n'));
197
+ process.exit(code);
198
+ }
199
+
200
+ function normalizeSlashes(value) {
201
+ return `${value || ''}`.replace(/\\/g, '/');
202
+ }
203
+
204
+ function pushViolation(violations, severity, rule, file, message) {
205
+ violations.push({
206
+ severity,
207
+ rule,
208
+ file,
209
+ message
210
+ });
211
+ }
212
+
213
+ function readText(filePath) {
214
+ return fs.readFileSync(filePath, 'utf8');
215
+ }
216
+
217
+ function collectSearchableFiles(projectPath) {
218
+ const files = [];
219
+ for (const entry of SEARCH_DIRECTORIES) {
220
+ const absolutePath = path.join(projectPath, entry);
221
+ if (!fs.existsSync(absolutePath)) {
222
+ continue;
223
+ }
224
+ const stat = fs.statSync(absolutePath);
225
+ if (stat.isFile()) {
226
+ files.push({
227
+ absolutePath,
228
+ relativePath: normalizeSlashes(entry)
229
+ });
230
+ continue;
231
+ }
232
+ const childEntries = fs.readdirSync(absolutePath, { withFileTypes: true });
233
+ for (const child of childEntries) {
234
+ if (!child.isFile()) {
235
+ continue;
236
+ }
237
+ if (!child.name.endsWith('.md')) {
238
+ continue;
239
+ }
240
+ files.push({
241
+ absolutePath: path.join(absolutePath, child.name),
242
+ relativePath: normalizeSlashes(path.join(entry, child.name))
243
+ });
244
+ }
245
+ }
246
+ return files;
247
+ }
248
+
249
+ function auditMagicBallEngineeringContract(options = {}) {
250
+ const projectPath = path.resolve(options.projectPath || process.cwd());
251
+ const violations = [];
252
+ const checkedFiles = [];
253
+
254
+ for (const check of REQUIRED_CHECKS) {
255
+ const relativePath = normalizeSlashes(check.path);
256
+ const absolutePath = path.join(projectPath, relativePath);
257
+ checkedFiles.push(relativePath);
258
+ if (!fs.existsSync(absolutePath)) {
259
+ pushViolation(
260
+ violations,
261
+ 'error',
262
+ 'missing_required_file',
263
+ relativePath,
264
+ `Required MagicBall engineering contract file is missing: ${relativePath}`
265
+ );
266
+ continue;
267
+ }
268
+ const content = readText(absolutePath);
269
+ for (const snippet of check.requiredSnippets) {
270
+ if (!content.includes(snippet)) {
271
+ pushViolation(
272
+ violations,
273
+ 'error',
274
+ 'missing_required_snippet',
275
+ relativePath,
276
+ `Missing required MagicBall engineering contract snippet: ${snippet}`
277
+ );
278
+ }
279
+ }
280
+ }
281
+
282
+ const searchableFiles = collectSearchableFiles(projectPath);
283
+ for (const file of searchableFiles) {
284
+ const content = readText(file.absolutePath);
285
+ for (const rule of PROHIBITED_SNIPPETS) {
286
+ if (!content.includes(rule.value)) {
287
+ continue;
288
+ }
289
+ const allowedPaths = Array.isArray(rule.allowedPaths) ? rule.allowedPaths.map(normalizeSlashes) : [];
290
+ if (allowedPaths.includes(file.relativePath)) {
291
+ continue;
292
+ }
293
+ pushViolation(
294
+ violations,
295
+ 'error',
296
+ 'prohibited_stale_magicball_engineering_phrase',
297
+ file.relativePath,
298
+ `Prohibited stale MagicBall engineering phrase found: ${rule.value}`
299
+ );
300
+ }
301
+ }
302
+
303
+ return {
304
+ mode: 'magicball-engineering-contract-audit',
305
+ project_path: projectPath,
306
+ checked_files: Array.from(new Set(checkedFiles)).sort(),
307
+ violation_count: violations.length,
308
+ passed: violations.length === 0,
309
+ violations
310
+ };
311
+ }
312
+
313
+ function emitReport(report, options = {}) {
314
+ if (options.out) {
315
+ fs.writeFileSync(options.out, JSON.stringify(report, null, 2));
316
+ }
317
+
318
+ if (options.json) {
319
+ console.log(JSON.stringify(report, null, 2));
320
+ return;
321
+ }
322
+
323
+ console.log(`MagicBall engineering contract audit: ${report.passed ? 'passed' : 'failed'}`);
324
+ console.log(`Checked files: ${report.checked_files.length}`);
325
+ console.log(`Violations: ${report.violation_count}`);
326
+ if (report.violations.length > 0) {
327
+ report.violations.forEach((violation) => {
328
+ console.log(`- [${violation.rule}] ${violation.file}: ${violation.message}`);
329
+ });
330
+ }
331
+ }
332
+
333
+ if (require.main === module) {
334
+ const options = parseArgs();
335
+ const report = auditMagicBallEngineeringContract(options);
336
+ emitReport(report, options);
337
+ if (!report.passed && options.failOnViolation) {
338
+ process.exit(2);
339
+ }
340
+ }
341
+
342
+ module.exports = {
343
+ REQUIRED_CHECKS,
344
+ PROHIBITED_SNIPPETS,
345
+ parseArgs,
346
+ auditMagicBallEngineeringContract
347
+ };
@@ -0,0 +1,254 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ const fs = require('fs');
5
+ const path = require('path');
6
+
7
+ const REQUIRED_CHECKS = [
8
+ {
9
+ path: 'README.md',
10
+ requiredSnippets: [
11
+ '`sce project portfolio show|target resolve|supervision show`'
12
+ ]
13
+ },
14
+ {
15
+ path: 'README.zh.md',
16
+ requiredSnippets: [
17
+ '`sce project portfolio show|target resolve|supervision show`'
18
+ ]
19
+ },
20
+ {
21
+ path: 'docs/command-reference.md',
22
+ requiredSnippets: [
23
+ 'sce project portfolio show [options]',
24
+ 'sce project target resolve [options]',
25
+ 'sce project supervision show --project <id> [options]'
26
+ ]
27
+ },
28
+ {
29
+ path: 'docs/magicball-sce-adaptation-guide.md',
30
+ requiredSnippets: [
31
+ '`docs/magicball-project-portfolio-contract.md`',
32
+ '`sce project portfolio show`',
33
+ '`sce project target resolve`',
34
+ '`sce project supervision show`'
35
+ ]
36
+ },
37
+ {
38
+ path: 'docs/magicball-integration-doc-index.md',
39
+ requiredSnippets: [
40
+ '`docs/magicball-project-portfolio-contract.md`',
41
+ '| `magicball-project-portfolio-contract.md` | multi-project payload contract | medium |'
42
+ ]
43
+ },
44
+ {
45
+ path: 'docs/magicball-project-portfolio-contract.md',
46
+ requiredSnippets: [
47
+ 'sce project portfolio show --json',
48
+ 'sce project target resolve --json',
49
+ 'sce project supervision show --project <project-id> --json'
50
+ ]
51
+ },
52
+ {
53
+ path: 'docs/magicball-frontend-state-and-command-mapping.md',
54
+ requiredSnippets: [
55
+ 'projectPortfolio: Record<string, unknown> | null',
56
+ '`sce project portfolio show --json`',
57
+ '`sce project target resolve --request <text> --current-project <project-id> --json`',
58
+ '`sce project supervision show --project <project-id> --json`'
59
+ ]
60
+ },
61
+ {
62
+ path: 'docs/magicball-cli-invocation-examples.md',
63
+ requiredSnippets: [
64
+ 'sce project portfolio show --json',
65
+ 'sce project target resolve --request "continue customer-order-demo" --json',
66
+ 'sce project supervision show --project workspace:customer-order-demo --json'
67
+ ]
68
+ },
69
+ {
70
+ path: 'docs/magicball-adaptation-task-checklist-v1.md',
71
+ requiredSnippets: [
72
+ '## Phase 0: Multi-project Workspace Shell',
73
+ 'sce project portfolio show --json',
74
+ 'sce project target resolve --request "<text>" --current-project <project-id> --json',
75
+ 'sce project supervision show --project <project-id> --json'
76
+ ]
77
+ },
78
+ {
79
+ path: 'docs/magicball-ui-surface-checklist.md',
80
+ requiredSnippets: [
81
+ '- `docs/magicball-project-portfolio-contract.md`',
82
+ '- project switcher from `project portfolio show`',
83
+ '- project health summary from `project supervision show`'
84
+ ]
85
+ },
86
+ {
87
+ path: 'docs/magicball-integration-issue-tracker.md',
88
+ requiredSnippets: [
89
+ '- `project portfolio show/target resolve/supervision show`',
90
+ '5. treat `project portfolio / target resolve / supervision` as the default multi-project shell truth'
91
+ ]
92
+ },
93
+ {
94
+ path: 'docs/release-checklist.md',
95
+ requiredSnippets: [
96
+ 'npm run audit:magicball-project-contract',
97
+ '- `audit:magicball-project-contract` passes'
98
+ ]
99
+ },
100
+ {
101
+ path: 'docs/zh/release-checklist.md',
102
+ requiredSnippets: [
103
+ 'npm run audit:magicball-project-contract',
104
+ '- `audit:magicball-project-contract` 通过'
105
+ ]
106
+ }
107
+ ];
108
+
109
+ function parseArgs(argv = process.argv.slice(2)) {
110
+ const options = {
111
+ projectPath: process.cwd(),
112
+ json: false,
113
+ failOnViolation: false,
114
+ out: null
115
+ };
116
+
117
+ for (let index = 0; index < argv.length; index += 1) {
118
+ const token = argv[index];
119
+ const next = argv[index + 1];
120
+ if (token === '--project-path' && next) {
121
+ options.projectPath = path.resolve(next);
122
+ index += 1;
123
+ continue;
124
+ }
125
+ if (token === '--json') {
126
+ options.json = true;
127
+ continue;
128
+ }
129
+ if (token === '--fail-on-violation') {
130
+ options.failOnViolation = true;
131
+ continue;
132
+ }
133
+ if (token === '--out' && next) {
134
+ options.out = path.resolve(next);
135
+ index += 1;
136
+ continue;
137
+ }
138
+ if (token === '--help' || token === '-h') {
139
+ printHelpAndExit(0);
140
+ }
141
+ }
142
+
143
+ return options;
144
+ }
145
+
146
+ function printHelpAndExit(code) {
147
+ const lines = [
148
+ 'Usage: node scripts/magicball-project-contract-audit.js [options]',
149
+ '',
150
+ 'Options:',
151
+ ' --project-path <path> Project root to audit (default: current directory)',
152
+ ' --json Print JSON payload',
153
+ ' --fail-on-violation Exit code 2 when any violation is found',
154
+ ' --out <path> Write JSON payload to file',
155
+ ' -h, --help Show this help'
156
+ ];
157
+ console.log(lines.join('\n'));
158
+ process.exit(code);
159
+ }
160
+
161
+ function normalizeSlashes(value) {
162
+ return `${value || ''}`.replace(/\\/g, '/');
163
+ }
164
+
165
+ function readText(filePath) {
166
+ return fs.readFileSync(filePath, 'utf8');
167
+ }
168
+
169
+ function pushViolation(violations, severity, rule, file, message) {
170
+ violations.push({
171
+ severity,
172
+ rule,
173
+ file,
174
+ message
175
+ });
176
+ }
177
+
178
+ function auditMagicBallProjectContract(options = {}) {
179
+ const projectPath = path.resolve(options.projectPath || process.cwd());
180
+ const violations = [];
181
+ const checkedFiles = [];
182
+
183
+ for (const check of REQUIRED_CHECKS) {
184
+ const relativePath = normalizeSlashes(check.path);
185
+ const absolutePath = path.join(projectPath, relativePath);
186
+ checkedFiles.push(relativePath);
187
+ if (!fs.existsSync(absolutePath)) {
188
+ pushViolation(
189
+ violations,
190
+ 'error',
191
+ 'missing_required_file',
192
+ relativePath,
193
+ `Required MagicBall project contract file is missing: ${relativePath}`
194
+ );
195
+ continue;
196
+ }
197
+ const content = readText(absolutePath);
198
+ for (const snippet of check.requiredSnippets) {
199
+ if (!content.includes(snippet)) {
200
+ pushViolation(
201
+ violations,
202
+ 'error',
203
+ 'missing_required_snippet',
204
+ relativePath,
205
+ `Missing required MagicBall project contract snippet: ${snippet}`
206
+ );
207
+ }
208
+ }
209
+ }
210
+
211
+ return {
212
+ mode: 'magicball-project-contract-audit',
213
+ project_path: projectPath,
214
+ checked_files: Array.from(new Set(checkedFiles)).sort(),
215
+ violation_count: violations.length,
216
+ passed: violations.length === 0,
217
+ violations
218
+ };
219
+ }
220
+
221
+ function emitReport(report, options = {}) {
222
+ if (options.out) {
223
+ fs.writeFileSync(options.out, JSON.stringify(report, null, 2));
224
+ }
225
+
226
+ if (options.json) {
227
+ console.log(JSON.stringify(report, null, 2));
228
+ return;
229
+ }
230
+
231
+ console.log(`MagicBall project contract audit: ${report.passed ? 'passed' : 'failed'}`);
232
+ console.log(`Checked files: ${report.checked_files.length}`);
233
+ console.log(`Violations: ${report.violation_count}`);
234
+ if (report.violations.length > 0) {
235
+ report.violations.forEach((violation) => {
236
+ console.log(`- [${violation.rule}] ${violation.file}: ${violation.message}`);
237
+ });
238
+ }
239
+ }
240
+
241
+ if (require.main === module) {
242
+ const options = parseArgs();
243
+ const report = auditMagicBallProjectContract(options);
244
+ emitReport(report, options);
245
+ if (!report.passed && options.failOnViolation) {
246
+ process.exit(2);
247
+ }
248
+ }
249
+
250
+ module.exports = {
251
+ REQUIRED_CHECKS,
252
+ parseArgs,
253
+ auditMagicBallProjectContract
254
+ };
@@ -243,6 +243,6 @@ A Spec is a complete feature definition with three parts:
243
243
  ---
244
244
 
245
245
  **Project Type**: Spec-driven development
246
- **sce Version**: 3.6.57
247
- **Last Updated**: 2026-03-17
246
+ **sce Version**: 3.6.58
247
+ **Last Updated**: 2026-03-19
248
248
  **Purpose**: Guide AI tools to work effectively with this project