@nexusclawhq/cli 0.3.9 → 0.3.10

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 (40) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/dist/build-info.json +4 -4
  3. package/dist/nexus-cli/node_modules/@nexusclaw/shared/dist/index.d.ts +1 -0
  4. package/dist/nexus-cli/node_modules/@nexusclaw/shared/dist/index.js +1 -0
  5. package/dist/nexus-cli/node_modules/@nexusclaw/shared/dist/index.js.map +1 -1
  6. package/dist/nexus-cli/node_modules/@nexusclaw/shared/dist/package-payload.d.ts +67 -0
  7. package/dist/nexus-cli/node_modules/@nexusclaw/shared/dist/package-payload.js +148 -0
  8. package/dist/nexus-cli/node_modules/@nexusclaw/shared/dist/package-payload.js.map +1 -0
  9. package/dist/nexus-cli/node_modules/@nexusclaw/shared/package.json +4 -0
  10. package/dist/nexus-cli/src/cli.js +0 -0
  11. package/dist/nexus-cli/src/commands/package/format.js +3 -5
  12. package/dist/nexus-cli/src/commands/package/format.js.map +1 -1
  13. package/dist/nexus-cli/src/commands/package/helpers.d.ts +0 -2
  14. package/dist/nexus-cli/src/commands/package/helpers.js +0 -32
  15. package/dist/nexus-cli/src/commands/package/helpers.js.map +1 -1
  16. package/dist/nexus-cli/src/commands/package/pack.js +2 -2
  17. package/dist/nexus-cli/src/commands/package/pack.js.map +1 -1
  18. package/dist/nexus-cli/src/commands/package/publish.js +2 -1
  19. package/dist/nexus-cli/src/commands/package/publish.js.map +1 -1
  20. package/dist/nexus-cli/src/commands/package/validate.js +5 -4
  21. package/dist/nexus-cli/src/commands/package/validate.js.map +1 -1
  22. package/dist/nexus-cli/src/services/__env-probe.test.d.ts +1 -0
  23. package/dist/nexus-cli/src/services/__env-probe.test.js +13 -0
  24. package/dist/nexus-cli/src/services/__env-probe.test.js.map +1 -0
  25. package/dist/nexus-cli/src/services/ai-authoring-context-v2.pack.e2e.test.d.ts +1 -0
  26. package/dist/nexus-cli/src/services/ai-authoring-context-v2.pack.e2e.test.js +132 -0
  27. package/dist/nexus-cli/src/services/ai-authoring-context-v2.pack.e2e.test.js.map +1 -0
  28. package/dist/nexus-cli/src/services/package-payload.d.ts +8 -0
  29. package/dist/nexus-cli/src/services/package-payload.js +76 -0
  30. package/dist/nexus-cli/src/services/package-payload.js.map +1 -0
  31. package/dist/nexus-cli/src/services/package-payload.test.d.ts +1 -0
  32. package/dist/nexus-cli/src/services/package-payload.test.js +59 -0
  33. package/dist/nexus-cli/src/services/package-payload.test.js.map +1 -0
  34. package/dist/nexus-cli/src/services/workforce-bundle-archive.d.ts +1 -1
  35. package/dist/nexus-cli/src/services/workforce-bundle-remote.d.ts +1 -1
  36. package/dist/nexus-cli/src/templates/project/templates/drill-code-extension-page/src/components/drill-code-extension-page/index.js +70 -0
  37. package/dist/nexus-cli/src/templates/project/templates/drill-code-extension-page/src/metadata/drill-code-extension-page.manifest.json +63 -0
  38. package/dist/nexus-cli/src/templates/project/templates/drill-code-extension-page/src/tests/drill-code-extension-page.assertions.json +13 -0
  39. package/dist/tsconfig.tsbuildinfo +1 -1
  40. package/package.json +1 -1
@@ -0,0 +1,132 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const strict_1 = __importDefault(require("node:assert/strict"));
7
+ const node_child_process_1 = require("node:child_process");
8
+ const node_fs_1 = __importDefault(require("node:fs"));
9
+ const node_os_1 = __importDefault(require("node:os"));
10
+ const node_path_1 = __importDefault(require("node:path"));
11
+ const node_test_1 = __importDefault(require("node:test"));
12
+ const PACKAGE_ROOT = node_path_1.default.resolve(__dirname, '../..');
13
+ const RUNNING_INSIDE_PUBLISH = process.env.npm_command === 'publish';
14
+ const SKIP_REASON = RUNNING_INSIDE_PUBLISH
15
+ ? 'skipped inside npm publish lifecycle (npm reserves the pack operation)'
16
+ : null;
17
+ function run(cmd, args, opts = { cwd: PACKAGE_ROOT }) {
18
+ return (0, node_child_process_1.execFileSync)(cmd, args, {
19
+ cwd: opts.cwd,
20
+ encoding: 'utf8',
21
+ env: { ...process.env, ...(opts.env ?? {}) },
22
+ stdio: ['ignore', 'pipe', 'pipe'],
23
+ });
24
+ }
25
+ async function buildTarballInTempDest() {
26
+ const dest = node_fs_1.default.mkdtempSync(node_path_1.default.join(node_os_1.default.tmpdir(), 'nexus-pack-dest-'));
27
+ const stdout = run('npm', ['pack', '--json', '--pack-destination', dest], {
28
+ cwd: PACKAGE_ROOT,
29
+ });
30
+ const jsonStart = stdout.indexOf('[\n');
31
+ let filename;
32
+ if (jsonStart !== -1) {
33
+ const jsonEnd = stdout.indexOf('\n]\n', jsonStart);
34
+ const sliceEnd = jsonEnd === -1 ? stdout.length : jsonEnd + 2;
35
+ try {
36
+ const parsed = JSON.parse(stdout.slice(jsonStart, sliceEnd));
37
+ filename = parsed[0]?.filename;
38
+ }
39
+ catch {
40
+ }
41
+ }
42
+ if (!filename) {
43
+ const tgzLine = stdout
44
+ .split('\n')
45
+ .map((line) => line.trim())
46
+ .filter((line) => line.endsWith('.tgz'))
47
+ .pop();
48
+ strict_1.default.ok(tgzLine, `npm pack produced no tarball: ${stdout}`);
49
+ filename = tgzLine;
50
+ }
51
+ return { tarballPath: node_path_1.default.join(dest, filename), dest };
52
+ }
53
+ (0, node_test_1.default)('the npm-packed CLI exports the complete action fixture schema (not a shell)', { timeout: 180_000, skip: SKIP_REASON ?? false }, async () => {
54
+ const { tarballPath, dest: packDest } = await buildTarballInTempDest();
55
+ strict_1.default.ok(node_fs_1.default.existsSync(tarballPath), `npm pack did not produce a tarball at ${tarballPath}`);
56
+ const installRoot = node_fs_1.default.mkdtempSync(node_path_1.default.join(node_os_1.default.tmpdir(), 'nexus-packed-install-'));
57
+ try {
58
+ run('npm', ['install', '--no-audit', '--no-fund', tarballPath], {
59
+ cwd: installRoot,
60
+ });
61
+ const nexusBin = node_path_1.default.join(installRoot, 'node_modules', '.bin', 'nexus');
62
+ strict_1.default.ok(node_fs_1.default.existsSync(nexusBin), 'installed nexus binary not found');
63
+ const packDir = node_path_1.default.join(installRoot, 'context');
64
+ run(nexusBin, ['ai', 'context', 'export', '--surface', 'code', '--offline', '--workspace', installRoot, '--out', packDir], {
65
+ cwd: installRoot,
66
+ env: { ...process.env, HOME: process.env.HOME },
67
+ });
68
+ const schemaPath = node_path_1.default.join(packDir, 'schemas', 'code-action-cases-v1.schema.json');
69
+ strict_1.default.ok(node_fs_1.default.existsSync(schemaPath), 'schema file not exported');
70
+ const schema = JSON.parse(node_fs_1.default.readFileSync(schemaPath, 'utf8'));
71
+ const isShell = typeof schema === 'object' &&
72
+ schema !== null &&
73
+ Object.keys(schema).length <= 2 &&
74
+ schema.type === 'object';
75
+ strict_1.default.equal(isShell, false, 'packed CLI exported an anonymous schema shell');
76
+ const callsSchema = schema.properties.cases.items.properties.hostFixtures.properties.calls
77
+ .items;
78
+ const recordsCall = callsSchema.oneOf.find((candidate) => candidate.properties?.namespace?.const === 'records');
79
+ strict_1.default.ok(recordsCall, 'records fixture variant missing from packed schema');
80
+ strict_1.default.deepEqual(recordsCall.properties.method.enum, [
81
+ 'get',
82
+ 'query',
83
+ 'create',
84
+ 'update',
85
+ 'delete',
86
+ ]);
87
+ strict_1.default.equal(recordsCall.properties.method.enum.includes('records.query'), false);
88
+ }
89
+ finally {
90
+ try {
91
+ node_fs_1.default.rmSync(installRoot, { recursive: true, force: true });
92
+ }
93
+ catch {
94
+ }
95
+ try {
96
+ node_fs_1.default.rmSync(packDest, { recursive: true, force: true });
97
+ }
98
+ catch {
99
+ }
100
+ }
101
+ });
102
+ (0, node_test_1.default)('the npm-packed CLI exposes build-info with gitSha and contentDigest', { timeout: 180_000, skip: SKIP_REASON ?? false }, async () => {
103
+ const { tarballPath, dest: packDest } = await buildTarballInTempDest();
104
+ const installRoot = node_fs_1.default.mkdtempSync(node_path_1.default.join(node_os_1.default.tmpdir(), 'nexus-packed-buildinfo-'));
105
+ try {
106
+ run('npm', ['install', '--no-audit', '--no-fund', tarballPath], {
107
+ cwd: installRoot,
108
+ });
109
+ const nexusBin = node_path_1.default.join(installRoot, 'node_modules', '.bin', 'nexus');
110
+ const output = run(nexusBin, ['--build-info', '--json'], {
111
+ cwd: installRoot,
112
+ });
113
+ const info = JSON.parse(output);
114
+ strict_1.default.equal(info.packageName, '@nexusclawhq/cli');
115
+ strict_1.default.ok(typeof info.gitSha === 'string' && info.gitSha !== 'unknown');
116
+ strict_1.default.match(info.contentDigest, /^sha256:[0-9a-f]{64}$/);
117
+ strict_1.default.ok(typeof info.version === 'string' && info.version !== '0.0.0');
118
+ }
119
+ finally {
120
+ try {
121
+ node_fs_1.default.rmSync(installRoot, { recursive: true, force: true });
122
+ }
123
+ catch {
124
+ }
125
+ try {
126
+ node_fs_1.default.rmSync(packDest, { recursive: true, force: true });
127
+ }
128
+ catch {
129
+ }
130
+ }
131
+ });
132
+ //# sourceMappingURL=ai-authoring-context-v2.pack.e2e.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-authoring-context-v2.pack.e2e.test.js","sourceRoot":"","sources":["../../../../src/services/ai-authoring-context-v2.pack.e2e.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { PackageFormat } from '@nexusclaw/shared';
2
+ export type PackagePayloadValidation = {
3
+ format: PackageFormat;
4
+ files: string[];
5
+ warnings: string[];
6
+ };
7
+ export declare function validatePackagePayloadDirectory(packageDirectory: string): PackagePayloadValidation;
8
+ export declare function formatPackagePayloadDirectory(packageDirectory: string): string[];
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.validatePackagePayloadDirectory = validatePackagePayloadDirectory;
7
+ exports.formatPackagePayloadDirectory = formatPackagePayloadDirectory;
8
+ const node_fs_1 = __importDefault(require("node:fs"));
9
+ const node_path_1 = __importDefault(require("node:path"));
10
+ const shared_1 = require("@nexusclaw/shared");
11
+ const js_yaml_1 = __importDefault(require("js-yaml"));
12
+ function validatePackagePayloadDirectory(packageDirectory) {
13
+ const payloadDirectory = node_path_1.default.join(packageDirectory, 'payload');
14
+ if (!node_fs_1.default.existsSync(payloadDirectory)) {
15
+ const metadataDirectory = node_path_1.default.join(packageDirectory, 'metadata');
16
+ return {
17
+ format: node_fs_1.default.existsSync(metadataDirectory)
18
+ ? shared_1.PackageFormat.METADATA
19
+ : shared_1.PackageFormat.UNKNOWN,
20
+ files: [],
21
+ warnings: [],
22
+ };
23
+ }
24
+ const files = node_fs_1.default.readdirSync(payloadDirectory, { withFileTypes: true })
25
+ .filter((entry) => entry.isFile() && /\.(json|ya?ml)$/i.test(entry.name))
26
+ .map((entry) => node_path_1.default.join(payloadDirectory, entry.name))
27
+ .sort((left, right) => left.localeCompare(right));
28
+ if (files.length === 0) {
29
+ return { format: shared_1.PackageFormat.UNKNOWN, files: [], warnings: [] };
30
+ }
31
+ const documents = files.map((file) => {
32
+ const content = node_fs_1.default.readFileSync(file, 'utf8');
33
+ return (file.endsWith('.json')
34
+ ? JSON.parse(content)
35
+ : js_yaml_1.default.load(content));
36
+ });
37
+ const payload = {
38
+ schemaVersion: shared_1.PACKAGE_PAYLOAD_SCHEMA_VERSION,
39
+ documents,
40
+ };
41
+ const result = (0, shared_1.validatePackagePayload)(payload);
42
+ if (!result.valid) {
43
+ throw new Error(result.errors.map((entry) => `${entry.path}: ${entry.message}`).join('\n'));
44
+ }
45
+ return {
46
+ format: shared_1.PackageFormat.PAYLOAD,
47
+ files,
48
+ warnings: result.warnings.map((entry) => `${entry.path}: ${entry.message}`),
49
+ };
50
+ }
51
+ function formatPackagePayloadDirectory(packageDirectory) {
52
+ const payloadDirectory = node_path_1.default.join(packageDirectory, 'payload');
53
+ if (!node_fs_1.default.existsSync(payloadDirectory))
54
+ return [];
55
+ const files = node_fs_1.default.readdirSync(payloadDirectory, { withFileTypes: true })
56
+ .filter((entry) => entry.isFile() && /\.(json|ya?ml)$/i.test(entry.name))
57
+ .map((entry) => node_path_1.default.join(payloadDirectory, entry.name))
58
+ .sort((left, right) => left.localeCompare(right));
59
+ for (const file of files) {
60
+ const content = node_fs_1.default.readFileSync(file, 'utf8');
61
+ const value = file.endsWith('.json')
62
+ ? JSON.parse(content)
63
+ : js_yaml_1.default.load(content);
64
+ const formatted = file.endsWith('.json')
65
+ ? `${JSON.stringify(value, null, 2)}\n`
66
+ : js_yaml_1.default.dump(value, {
67
+ indent: 2,
68
+ lineWidth: 120,
69
+ noRefs: true,
70
+ sortKeys: false,
71
+ });
72
+ node_fs_1.default.writeFileSync(file, formatted, 'utf8');
73
+ }
74
+ return files;
75
+ }
76
+ //# sourceMappingURL=package-payload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-payload.js","sourceRoot":"","sources":["../../../../src/services/package-payload.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const strict_1 = __importDefault(require("node:assert/strict"));
7
+ const node_fs_1 = __importDefault(require("node:fs"));
8
+ const node_os_1 = __importDefault(require("node:os"));
9
+ const node_path_1 = __importDefault(require("node:path"));
10
+ const node_test_1 = __importDefault(require("node:test"));
11
+ const shared_1 = require("@nexusclaw/shared");
12
+ const package_payload_1 = require("./package-payload");
13
+ (0, node_test_1.default)('validates payload packages without a Core source checkout', () => {
14
+ const root = node_fs_1.default.mkdtempSync(node_path_1.default.join(node_os_1.default.tmpdir(), 'nexus-payload-'));
15
+ const packageDirectory = node_path_1.default.join(root, 'package');
16
+ node_fs_1.default.mkdirSync(node_path_1.default.join(packageDirectory, 'payload'), { recursive: true });
17
+ node_fs_1.default.writeFileSync(node_path_1.default.join(packageDirectory, 'payload', 'objects.yaml'), [
18
+ 'schemaVersion: payload/v1',
19
+ 'moduleId: medtech-tool',
20
+ 'kind: objects',
21
+ 'metadata:',
22
+ ' packageName: custom.medtech',
23
+ ' packageVersion: 1.0.0',
24
+ 'data: []',
25
+ '',
26
+ ].join('\n'));
27
+ const previousCwd = process.cwd();
28
+ process.chdir(root);
29
+ try {
30
+ strict_1.default.deepEqual((0, package_payload_1.validatePackagePayloadDirectory)(packageDirectory), {
31
+ format: shared_1.PackageFormat.PAYLOAD,
32
+ files: [node_path_1.default.join(packageDirectory, 'payload', 'objects.yaml')],
33
+ warnings: [],
34
+ });
35
+ strict_1.default.equal(node_fs_1.default.existsSync(node_path_1.default.join(root, 'packages/backend/scripts/package-payload.ts')), false);
36
+ }
37
+ finally {
38
+ process.chdir(previousCwd);
39
+ node_fs_1.default.rmSync(root, { recursive: true, force: true });
40
+ }
41
+ });
42
+ (0, node_test_1.default)('rejects invalid payload with stable validation details', () => {
43
+ const root = node_fs_1.default.mkdtempSync(node_path_1.default.join(node_os_1.default.tmpdir(), 'nexus-payload-invalid-'));
44
+ node_fs_1.default.mkdirSync(node_path_1.default.join(root, 'payload'), { recursive: true });
45
+ node_fs_1.default.writeFileSync(node_path_1.default.join(root, 'payload', 'objects.json'), JSON.stringify({
46
+ schemaVersion: 'payload/v1',
47
+ moduleId: 'invalid',
48
+ kind: 'objects',
49
+ metadata: { packageName: 'custom.medtech', packageVersion: '1.0.0' },
50
+ data: {},
51
+ }));
52
+ try {
53
+ strict_1.default.throws(() => (0, package_payload_1.validatePackagePayloadDirectory)(root), /objects payload must provide an array/);
54
+ }
55
+ finally {
56
+ node_fs_1.default.rmSync(root, { recursive: true, force: true });
57
+ }
58
+ });
59
+ //# sourceMappingURL=package-payload.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-payload.test.js","sourceRoot":"","sources":["../../../../src/services/package-payload.test.ts"],"names":[],"mappings":"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"}
@@ -8,5 +8,5 @@ export declare function buildCanonicalWorkforceBundleArchive(options: {
8
8
  portableBundleDigest: `sha256:${string}`;
9
9
  runtimeBindingsDigest: `sha256:${string}`;
10
10
  fileCount: number;
11
- declaredSurfaces: ("code" | "flow" | "employee")[];
11
+ declaredSurfaces: ("employee" | "code" | "flow")[];
12
12
  }>;
@@ -14,7 +14,7 @@ export declare function prepareRemoteWorkforceBundle(options: {
14
14
  portableBundleDigest: `sha256:${string}`;
15
15
  runtimeBindingsDigest: `sha256:${string}`;
16
16
  fileCount: number;
17
- declaredSurfaces: ("code" | "flow" | "employee")[];
17
+ declaredSurfaces: ("employee" | "code" | "flow")[];
18
18
  };
19
19
  sealed: import("./api-client").SealedExecutablePackageArtifact;
20
20
  artifactInput: {
@@ -0,0 +1,70 @@
1
+ (() => {
2
+ const root = window.NexusExtensionRoot || document.getElementById('root') || document.body;
3
+ const context = window.NexusExtensionContext || {};
4
+ const accounts = context.datasets?.accounts;
5
+ const accountRows = Array.isArray(accounts?.records) ? accounts.records : [];
6
+
7
+ const escapeHtml = (value) => String(value ?? '')
8
+ .replace(/&/g, '&amp;')
9
+ .replace(/</g, '&lt;')
10
+ .replace(/>/g, '&gt;')
11
+ .replace(/"/g, '&quot;');
12
+
13
+ const pick = (record, keys) => {
14
+ for (const key of keys) {
15
+ const value = record?.[key];
16
+ if (value !== undefined && value !== null && value !== '') {
17
+ if (typeof value === 'object') return value.name || value.label || value.id || JSON.stringify(value);
18
+ return value;
19
+ }
20
+ }
21
+ return '-';
22
+ };
23
+
24
+ const accountTableRows = accountRows.length > 0
25
+ ? accountRows.map((record) => [
26
+ '<tr>',
27
+ `<td>${escapeHtml(pick(record, ['displayName', 'name', 'Name']))}</td>`,
28
+ `<td>${escapeHtml(pick(record, ['industry', 'Industry']))}</td>`,
29
+ `<td>${escapeHtml(pick(record, ['phone', 'Phone']))}</td>`,
30
+ `<td>${escapeHtml(pick(record, ['ownerId', 'owner']))}</td>`,
31
+ '</tr>',
32
+ ].join('')).join('')
33
+ : '<tr><td colspan="4" style="color:#667085;">No account records returned.</td></tr>';
34
+
35
+ root.innerHTML = [
36
+ '<main style="font-family:Inter,Arial,sans-serif;color:#172033;background:#f7f9fc;min-height:100%;padding:18px;box-sizing:border-box;">',
37
+ '<section style="background:#ffffff;border:1px solid #d7dde8;border-radius:8px;padding:18px;box-shadow:0 6px 18px rgba(19,36,64,0.08);">',
38
+ '<div style="font-size:12px;color:#2357c6;font-weight:700;text-transform:uppercase;">Code Extension Bundle Mounted</div>',
39
+ '<h1 style="font-size:22px;line-height:1.25;margin:8px 0 6px;">Drill Code Extension Page</h1>',
40
+ '<p style="font-size:13px;line-height:1.6;margin:0;color:#4a5568;">Workspace-owned code-extension bundle with governed Account data.</p>',
41
+ '<dl style="display:grid;grid-template-columns:140px 1fr;gap:8px 14px;margin:18px 0 0;font-size:13px;">',
42
+ '<dt style="font-weight:700;color:#24324a;">Workspace</dt><dd style="margin:0;">E2E-L2-Drill-001</dd>',
43
+ '<dt style="font-weight:700;color:#24324a;">Custom object</dt><dd style="margin:0;">drillExtensionPage01</dd>',
44
+ '<dt style="font-weight:700;color:#24324a;">Component ID</dt><dd style="margin:0;">drill-code-extension-page</dd>',
45
+ '<dt style="font-weight:700;color:#24324a;">Source owner</dt><dd style="margin:0;">workspace project</dd>',
46
+ '</dl>',
47
+ '<section style="margin-top:18px;">',
48
+ '<div style="display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:8px;">',
49
+ '<h2 style="font-size:16px;margin:0;">Account records</h2>',
50
+ `<span style="font-size:12px;color:#667085;">${escapeHtml(accounts?.loading ? 'Loading' : `${accountRows.length} shown / ${accounts?.totalCount ?? 0} total`)}</span>`,
51
+ '</div>',
52
+ accounts?.error ? `<div style="border:1px solid #fda29b;background:#fff1f0;color:#b42318;border-radius:6px;padding:10px;font-size:13px;">${escapeHtml(accounts.error)}</div>` : [
53
+ '<table style="width:100%;border-collapse:collapse;font-size:13px;background:#fff;">',
54
+ '<thead><tr style="background:#f2f5fa;color:#344054;text-align:left;">',
55
+ '<th style="padding:8px;border:1px solid #d7dde8;">Name</th>',
56
+ '<th style="padding:8px;border:1px solid #d7dde8;">Industry</th>',
57
+ '<th style="padding:8px;border:1px solid #d7dde8;">Phone</th>',
58
+ '<th style="padding:8px;border:1px solid #d7dde8;">Owner</th>',
59
+ '</tr></thead>',
60
+ `<tbody>${accountTableRows}</tbody>`,
61
+ '</table>',
62
+ ].join(''),
63
+ '</section>',
64
+ '<pre style="white-space:pre-wrap;background:#111827;color:#e5e7eb;border-radius:6px;padding:10px;margin:18px 0 0;font-size:12px;line-height:1.5;">',
65
+ escapeHtml(JSON.stringify({ componentId: context.componentId, bundleHash: context.bundleHash, datasets: Object.keys(context.datasets || {}) }, null, 2)),
66
+ '</pre>',
67
+ '</section>',
68
+ '</main>',
69
+ ].join('');
70
+ })();
@@ -0,0 +1,63 @@
1
+ {
2
+ "schemaVersion": "workspace-extension-page/v1",
3
+ "targetEnvironment": "drill",
4
+ "targetWorkspace": "E2E-L2-Drill-001",
5
+ "object": {
6
+ "apiName": "drillExtensionPage01",
7
+ "labelSingular": "Drill Extension Page 01",
8
+ "labelPlural": "Drill Extension Page 01s",
9
+ "description": "Workspace-owned custom object used by the Drill code-extension page.",
10
+ "isCustom": true
11
+ },
12
+ "component": {
13
+ "componentId": "drill-code-extension-page",
14
+ "apiName": "drill_code_extension_page",
15
+ "name": "Drill Code Extension Page",
16
+ "sourcePath": "src/components/drill-code-extension-page/index.js",
17
+ "permissions": [
18
+ { "type": "ui" },
19
+ { "type": "data:read", "scope": ["drillExtensionPage01"] },
20
+ { "type": "data:read", "scope": ["account"] }
21
+ ]
22
+ },
23
+ "customPage": {
24
+ "apiName": "drill_code_extension_page",
25
+ "name": "Drill Code Extension Page",
26
+ "type": "APP",
27
+ "schema": {
28
+ "id": "drill-code-extension-page-schema",
29
+ "name": "Drill Code Extension Page",
30
+ "type": "app",
31
+ "layout": {
32
+ "id": "root",
33
+ "component": "CodeExtensionFrame",
34
+ "props": {
35
+ "componentId": "drill-code-extension-page",
36
+ "title": "Drill Code Extension Page",
37
+ "description": "Rendered from a governed workspace-owned code-extension bundle.",
38
+ "minHeight": 620,
39
+ "dataSources": [
40
+ {
41
+ "id": "accounts",
42
+ "type": "records",
43
+ "label": "Account records",
44
+ "config": {
45
+ "objectName": "account",
46
+ "first": 5,
47
+ "orderBy": [{ "name": "AscNullsLast" }]
48
+ }
49
+ }
50
+ ]
51
+ }
52
+ }
53
+ }
54
+ },
55
+ "menuItem": {
56
+ "appApiName": "e2e_drill_app",
57
+ "apiName": "drill_tab_code_extension_page",
58
+ "name": "Code Extension Page",
59
+ "type": "PAGE",
60
+ "position": 4,
61
+ "isActive": true
62
+ }
63
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "schemaVersion": "workspace-runtime-assertions/v1",
3
+ "targetWorkspace": "E2E-L2-Drill-001",
4
+ "expectedVisibleText": [
5
+ "Code Extension Bundle Mounted",
6
+ "Account records",
7
+ "Name",
8
+ "drillExtensionPage01",
9
+ "E2E-L2-Drill-001"
10
+ ],
11
+ "expectedMenuItemApiName": "drill_tab_code_extension_page",
12
+ "expectedComponentId": "drill-code-extension-page"
13
+ }