crewx 0.8.0-rc.80 → 0.8.0-rc.83

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 (190) hide show
  1. package/package.json +9 -12
  2. package/packages/cli/dist/plugins/sqlite-tracing.d.ts +13 -0
  3. package/packages/cli/dist/plugins/sqlite-tracing.js +20 -0
  4. package/packages/cli/package.json +1 -1
  5. package/scripts/smoke-tarball.mjs +285 -0
  6. package/dist-server/packages/sdk/src/adapter/context-builder.js +0 -86
  7. package/dist-server/packages/sdk/src/adapter/scoped-store.js +0 -42
  8. package/dist-server/packages/sdk/src/adapter/types.js +0 -22
  9. package/dist-server/packages/sdk/src/agent/resolver.js +0 -45
  10. package/dist-server/packages/sdk/src/config/loader.js +0 -94
  11. package/dist-server/packages/sdk/src/conversation/sqlite-provider.js +0 -177
  12. package/dist-server/packages/sdk/src/conversation/to-template-messages.js +0 -33
  13. package/dist-server/packages/sdk/src/conversation/types.js +0 -9
  14. package/dist-server/packages/sdk/src/events/TypedEventEmitter.js +0 -64
  15. package/dist-server/packages/sdk/src/events/types.js +0 -8
  16. package/dist-server/packages/sdk/src/facade/Crewx.js +0 -1298
  17. package/dist-server/packages/sdk/src/layout/loader.js +0 -304
  18. package/dist-server/packages/sdk/src/layout/props-validator.js +0 -300
  19. package/dist-server/packages/sdk/src/layout/renderer.js +0 -192
  20. package/dist-server/packages/sdk/src/layout/types.js +0 -35
  21. package/dist-server/packages/sdk/src/parsers/agent-call.util.js +0 -18
  22. package/dist-server/packages/sdk/src/parsers/claude.parser.js +0 -66
  23. package/dist-server/packages/sdk/src/parsers/codex.parser.js +0 -99
  24. package/dist-server/packages/sdk/src/parsers/copilot.parser.js +0 -65
  25. package/dist-server/packages/sdk/src/parsers/gemini.parser.js +0 -45
  26. package/dist-server/packages/sdk/src/parsers/opencode.parser.js +0 -75
  27. package/dist-server/packages/sdk/src/parsers/router.js +0 -55
  28. package/dist-server/packages/sdk/src/platform/IFsAdapter.js +0 -2
  29. package/dist-server/packages/sdk/src/platform/NodeFsAdapter.js +0 -37
  30. package/dist-server/packages/sdk/src/plugin/plugin-provider.js +0 -206
  31. package/dist-server/packages/sdk/src/plugin/types.js +0 -8
  32. package/dist-server/packages/sdk/src/plugin.js +0 -28
  33. package/dist-server/packages/sdk/src/plugins/conversation.js +0 -58
  34. package/dist-server/packages/sdk/src/provider/bridge.js +0 -380
  35. package/dist-server/packages/sdk/src/provider/parse-usage.js +0 -82
  36. package/dist-server/packages/sdk/src/provider/register-api.js +0 -23
  37. package/dist-server/packages/sdk/src/provider/vercel-runtime.js +0 -346
  38. package/dist-server/packages/sdk/src/remote/remote-agent-manager.js +0 -197
  39. package/dist-server/packages/sdk/src/remote/remote-provider.js +0 -140
  40. package/dist-server/packages/sdk/src/remote/remote-transport.js +0 -82
  41. package/dist-server/packages/sdk/src/remote/types.js +0 -8
  42. package/dist-server/packages/sdk/src/server/auth.js +0 -34
  43. package/dist-server/packages/sdk/src/server/handler.js +0 -74
  44. package/dist-server/packages/sdk/src/server/tool-adapter.js +0 -94
  45. package/dist-server/packages/sdk/src/template/engine.js +0 -136
  46. package/dist-server/packages/sdk/src/template/helpers/exec.js +0 -229
  47. package/dist-server/packages/sdk/src/template/helpers/fenced_code.js +0 -19
  48. package/dist-server/packages/sdk/src/template/helpers/format-conversation.js +0 -52
  49. package/dist-server/packages/sdk/src/template/helpers/include.js +0 -22
  50. package/dist-server/packages/sdk/src/template/helpers/p1p2.js +0 -89
  51. package/dist-server/packages/sdk/src/template/loader/DocumentLoader.js +0 -127
  52. package/dist-server/packages/sdk/src/template/types.js +0 -5
  53. package/dist-server/packages/sdk/src/types/index.js +0 -31
  54. package/dist-server/packages/sdk/src/types/task-log.types.js +0 -5
  55. package/dist-server/packages/sdk/src/utils/glob-match.js +0 -41
  56. package/dist-server/packages/sdk/src/utils/id.js +0 -49
  57. package/dist-server/packages/sdk/src/utils/timestamp.js +0 -12
  58. package/dist-server/packages/sdk/src/utils/workspace.js +0 -57
  59. /package/dist-server/{src/server/adapters → adapters}/adapter.module.js +0 -0
  60. /package/dist-server/{src/server/adapters → adapters}/adapter.service.js +0 -0
  61. /package/dist-server/{src/server/adapters → adapters}/http-router.service.js +0 -0
  62. /package/dist-server/{src/server/app.module.js → app.module.js} +0 -0
  63. /package/dist-server/{src/server/bootstrap → bootstrap}/crewx-server.js +0 -0
  64. /package/dist-server/{src/server/common → common}/decorators/project.decorator.js +0 -0
  65. /package/dist-server/{src/server/common → common}/decorators/workspace.decorator.js +0 -0
  66. /package/dist-server/{src/server/common → common}/interceptor/api-id-header.interceptor.js +0 -0
  67. /package/dist-server/{src/server/common → common}/interceptor/http-logging.interceptor.js +0 -0
  68. /package/dist-server/{src/server/common → common}/limits/defaults.js +0 -0
  69. /package/dist-server/{src/server/common → common}/limits/limits-provider.js +0 -0
  70. /package/dist-server/{src/server/common → common}/limits/limits.controller.js +0 -0
  71. /package/dist-server/{src/server/common → common}/limits/limits.module.js +0 -0
  72. /package/dist-server/{src/server/common → common}/limits/local-limits.provider.js +0 -0
  73. /package/dist-server/{src/server/common → common}/middleware/workspace.middleware.js +0 -0
  74. /package/dist-server/{src/server/common → common}/workspace-context.store.js +0 -0
  75. /package/dist-server/{src/server/domain → domain}/agent/agent.controller.js +0 -0
  76. /package/dist-server/{src/server/domain → domain}/agent/agent.module.js +0 -0
  77. /package/dist-server/{src/server/domain → domain}/agent/agent.service.js +0 -0
  78. /package/dist-server/{src/server/domain → domain}/agent/agent.types.js +0 -0
  79. /package/dist-server/{src/server/domain → domain}/agent/dto/create-agent.dto.js +0 -0
  80. /package/dist-server/{src/server/domain → domain}/agent/dto/preview-prompt.dto.js +0 -0
  81. /package/dist-server/{src/server/domain → domain}/agent/dto/update-agent.dto.js +0 -0
  82. /package/dist-server/{src/server/domain → domain}/agent/template-processor.service.js +0 -0
  83. /package/dist-server/{src/server/domain → domain}/box/box.controller.js +0 -0
  84. /package/dist-server/{src/server/domain → domain}/box/box.module.js +0 -0
  85. /package/dist-server/{src/server/domain → domain}/box/box.service.js +0 -0
  86. /package/dist-server/{src/server/domain → domain}/box/dto/create-box.dto.js +0 -0
  87. /package/dist-server/{src/server/domain → domain}/cli/cli.controller.js +0 -0
  88. /package/dist-server/{src/server/domain → domain}/cli/cli.module.js +0 -0
  89. /package/dist-server/{src/server/domain → domain}/cli/cli.service.js +0 -0
  90. /package/dist-server/{src/server/domain → domain}/cli/dto/update-cli.dto.js +0 -0
  91. /package/dist-server/{src/server/domain → domain}/doc/doc.controller.js +0 -0
  92. /package/dist-server/{src/server/domain → domain}/doc/doc.module.js +0 -0
  93. /package/dist-server/{src/server/domain → domain}/doc/doc.service.js +0 -0
  94. /package/dist-server/{src/server/domain → domain}/doc/dto/doc.dto.js +0 -0
  95. /package/dist-server/{src/server/domain → domain}/document/document.controller.js +0 -0
  96. /package/dist-server/{src/server/domain → domain}/document/document.module.js +0 -0
  97. /package/dist-server/{src/server/domain → domain}/document/document.service.js +0 -0
  98. /package/dist-server/{src/server/domain → domain}/document/dto/register-document.dto.js +0 -0
  99. /package/dist-server/{src/server/domain → domain}/fs/dto/tree-node.dto.js +0 -0
  100. /package/dist-server/{src/server/domain → domain}/fs/dto/tree-query.dto.js +0 -0
  101. /package/dist-server/{src/server/domain → domain}/fs/fs.controller.js +0 -0
  102. /package/dist-server/{src/server/domain → domain}/fs/fs.module.js +0 -0
  103. /package/dist-server/{src/server/domain → domain}/fs/fs.service.js +0 -0
  104. /package/dist-server/{src/server/domain → domain}/git/git.module.js +0 -0
  105. /package/dist-server/{src/server/domain → domain}/git/git.service.js +0 -0
  106. /package/dist-server/{src/server/domain → domain}/health/health.controller.js +0 -0
  107. /package/dist-server/{src/server/domain → domain}/health/health.module.js +0 -0
  108. /package/dist-server/{src/server/domain → domain}/knowledge/dto/graph-knowledge.dto.js +0 -0
  109. /package/dist-server/{src/server/domain → domain}/knowledge/dto/knowledge.dto.js +0 -0
  110. /package/dist-server/{src/server/domain → domain}/knowledge/knowledge.controller.js +0 -0
  111. /package/dist-server/{src/server/domain → domain}/knowledge/knowledge.module.js +0 -0
  112. /package/dist-server/{src/server/domain → domain}/knowledge/knowledge.service.js +0 -0
  113. /package/dist-server/{src/server/domain → domain}/mcp/crewx-tool.factory.js +0 -0
  114. /package/dist-server/{src/server/domain → domain}/mcp/mcp-auth.guard.js +0 -0
  115. /package/dist-server/{src/server/domain → domain}/mcp/mcp.constants.js +0 -0
  116. /package/dist-server/{src/server/domain → domain}/mcp/mcp.controller.js +0 -0
  117. /package/dist-server/{src/server/domain → domain}/mcp/mcp.dto.js +0 -0
  118. /package/dist-server/{src/server/domain → domain}/mcp/mcp.module.js +0 -0
  119. /package/dist-server/{src/server/domain → domain}/mcp/mcp.service.js +0 -0
  120. /package/dist-server/{src/server/domain → domain}/message/dto/list-messages.dto.js +0 -0
  121. /package/dist-server/{src/server/domain → domain}/message/dto/send-message.dto.js +0 -0
  122. /package/dist-server/{src/server/domain → domain}/message/message.controller.js +0 -0
  123. /package/dist-server/{src/server/domain → domain}/message/message.module.js +0 -0
  124. /package/dist-server/{src/server/domain → domain}/message/message.service.js +0 -0
  125. /package/dist-server/{src/server/domain → domain}/onboarding/onboarding.controller.js +0 -0
  126. /package/dist-server/{src/server/domain → domain}/onboarding/onboarding.module.js +0 -0
  127. /package/dist-server/{src/server/domain → domain}/onboarding/onboarding.service.js +0 -0
  128. /package/dist-server/{src/server/domain → domain}/onboarding/onboarding.types.js +0 -0
  129. /package/dist-server/{src/server/domain → domain}/onboarding/presets/custom.js +0 -0
  130. /package/dist-server/{src/server/domain → domain}/onboarding/presets/dev-team.js +0 -0
  131. /package/dist-server/{src/server/domain → domain}/onboarding/presets/index.js +0 -0
  132. /package/dist-server/{src/server/domain → domain}/onboarding/presets/marketing-team.js +0 -0
  133. /package/dist-server/{src/server/domain → domain}/onboarding/presets/planning-team.js +0 -0
  134. /package/dist-server/{src/server/domain → domain}/onboarding/presets/solo.js +0 -0
  135. /package/dist-server/{src/server/domain → domain}/project/dto/create-project.dto.js +0 -0
  136. /package/dist-server/{src/server/domain → domain}/project/dto/update-project.dto.js +0 -0
  137. /package/dist-server/{src/server/domain → domain}/project/project.controller.js +0 -0
  138. /package/dist-server/{src/server/domain → domain}/project/project.module.js +0 -0
  139. /package/dist-server/{src/server/domain → domain}/project/project.service.js +0 -0
  140. /package/dist-server/{src/server/domain → domain}/skill/dto/add-registry.dto.js +0 -0
  141. /package/dist-server/{src/server/domain → domain}/skill/dto/install-skill.dto.js +0 -0
  142. /package/dist-server/{src/server/domain → domain}/skill/skill.controller.js +0 -0
  143. /package/dist-server/{src/server/domain → domain}/skill/skill.module.js +0 -0
  144. /package/dist-server/{src/server/domain → domain}/skill/skill.service.js +0 -0
  145. /package/dist-server/{src/server/domain → domain}/task/dto/all-tasks.dto.js +0 -0
  146. /package/dist-server/{src/server/domain → domain}/task/dto/list-tasks.dto.js +0 -0
  147. /package/dist-server/{src/server/domain → domain}/task/dto/search-tasks.dto.js +0 -0
  148. /package/dist-server/{src/server/domain → domain}/task/dto/send-message.dto.js +0 -0
  149. /package/dist-server/{src/server/domain → domain}/task/dto/task-status.dto.js +0 -0
  150. /package/dist-server/{src/server/domain → domain}/task/dto/workspace-usage.dto.js +0 -0
  151. /package/dist-server/{src/server/domain → domain}/task/task.constants.js +0 -0
  152. /package/dist-server/{src/server/domain → domain}/task/task.controller.js +0 -0
  153. /package/dist-server/{src/server/domain → domain}/task/task.module.js +0 -0
  154. /package/dist-server/{src/server/domain → domain}/task/task.service.js +0 -0
  155. /package/dist-server/{src/server/domain → domain}/thread/dto/build-context.dto.js +0 -0
  156. /package/dist-server/{src/server/domain → domain}/thread/dto/list-messages.dto.js +0 -0
  157. /package/dist-server/{src/server/domain → domain}/thread/dto/list-threads.dto.js +0 -0
  158. /package/dist-server/{src/server/domain → domain}/thread/dto/search-threads.dto.js +0 -0
  159. /package/dist-server/{src/server/domain → domain}/thread/thread.controller.js +0 -0
  160. /package/dist-server/{src/server/domain → domain}/thread/thread.module.js +0 -0
  161. /package/dist-server/{src/server/domain → domain}/thread/thread.service.js +0 -0
  162. /package/dist-server/{src/server/domain → domain}/usage/usage.controller.js +0 -0
  163. /package/dist-server/{src/server/domain → domain}/usage/usage.module.js +0 -0
  164. /package/dist-server/{src/server/domain → domain}/usage/usage.service.js +0 -0
  165. /package/dist-server/{src/server/domain → domain}/usage/usage.types.js +0 -0
  166. /package/dist-server/{src/server/domain → domain}/wbs/wbs.controller.js +0 -0
  167. /package/dist-server/{src/server/domain → domain}/wbs/wbs.module.js +0 -0
  168. /package/dist-server/{src/server/domain → domain}/wbs/wbs.service.js +0 -0
  169. /package/dist-server/{src/server/domain → domain}/workflow/workflow.controller.js +0 -0
  170. /package/dist-server/{src/server/domain → domain}/workflow/workflow.module.js +0 -0
  171. /package/dist-server/{src/server/domain → domain}/workflow/workflow.service.js +0 -0
  172. /package/dist-server/{src/server/domain → domain}/workspace/dto/create-workspace.dto.js +0 -0
  173. /package/dist-server/{src/server/domain → domain}/workspace/dto/switch-workspace.dto.js +0 -0
  174. /package/dist-server/{src/server/domain → domain}/workspace/dto/workspace-info.dto.js +0 -0
  175. /package/dist-server/{src/server/domain → domain}/workspace/workspace.controller.js +0 -0
  176. /package/dist-server/{src/server/domain → domain}/workspace/workspace.module.js +0 -0
  177. /package/dist-server/{src/server/domain → domain}/workspace/workspace.service.js +0 -0
  178. /package/dist-server/{src/server/main.js → main.js} +0 -0
  179. /package/dist-server/{src/server/modules → modules}/crewx.module.js +0 -0
  180. /package/dist-server/{src/server/repository → repository}/base-sqlite.repository.js +0 -0
  181. /package/dist-server/{src/server/repository → repository}/box.repository.js +0 -0
  182. /package/dist-server/{src/server/repository → repository}/message.repository.js +0 -0
  183. /package/dist-server/{src/server/repository → repository}/project.repository.js +0 -0
  184. /package/dist-server/{src/server/repository → repository}/repository.module.js +0 -0
  185. /package/dist-server/{src/server/repository → repository}/request-log.repository.js +0 -0
  186. /package/dist-server/{src/server/repository → repository}/task.repository.js +0 -0
  187. /package/dist-server/{src/server/repository → repository}/thread.repository.js +0 -0
  188. /package/dist-server/{src/server/shared → shared}/crewx-home.js +0 -0
  189. /package/dist-server/{src/server/shared → shared}/crewx-state.js +0 -0
  190. /package/dist-server/{src/server/utils → utils}/tokenizer.js +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "crewx",
3
- "version": "0.8.0-rc.80",
3
+ "version": "0.8.0-rc.83",
4
4
  "description": "CrewX — AI agent team dashboard with Electron UI and CLI (Web + Electron + Global CLI)",
5
5
  "main": "server.js",
6
6
  "bin": {
@@ -19,11 +19,7 @@
19
19
  "!**/__tests__",
20
20
  "!**/*.test.*",
21
21
  "!**/*.spec.*",
22
- "!**/*.js.map",
23
- "!**/*.d.ts.map",
24
- "!scripts/**/*.ts",
25
- "!packages/cli/dist/**/*.spec.*",
26
- "!packages/cli/dist/**/*.test.*"
22
+ "!scripts/**/*.ts"
27
23
  ],
28
24
  "author": {
29
25
  "name": "Doha Park",
@@ -96,16 +92,16 @@
96
92
  "yargs": "^17.7.0",
97
93
  "zod": "^3.22.0",
98
94
  "zustand": "^4.5.0",
99
- "@crewx/cli": "0.8.0-rc.80",
100
- "@crewx/cron": "0.1.6",
95
+ "@crewx/cli": "0.8.0-rc.83",
101
96
  "@crewx/doc": "0.1.6",
97
+ "@crewx/cron": "0.1.6",
98
+ "@crewx/sdk": "0.8.0-rc.83",
102
99
  "@crewx/memory": "0.1.8",
103
- "@crewx/sdk": "0.8.0-rc.80",
104
- "@crewx/shared": "0.0.4",
105
100
  "@crewx/search": "0.1.6",
106
101
  "@crewx/skill": "0.1.5",
107
102
  "@crewx/workflow": "0.3.6",
108
- "@crewx/wbs": "0.1.7"
103
+ "@crewx/wbs": "0.1.7",
104
+ "@crewx/shared": "0.0.4"
109
105
  },
110
106
  "devDependencies": {
111
107
  "@nestjs/cli": "^11.0.16",
@@ -138,11 +134,12 @@
138
134
  "react-dom": "^18.2.0",
139
135
  "supertest": "^7.2.2",
140
136
  "tailwindcss": "^3.3.6",
137
+ "tsup": "^8.5.1",
141
138
  "tsx": "^4.6.2",
142
139
  "typescript": "^5.3.3",
143
140
  "vite": "^5.0.10",
144
141
  "vite-plugin-electron": "^0.29.0",
145
- "vitest": "^3.1.1"
142
+ "vitest": "^4.0.18"
146
143
  },
147
144
  "optionalDependencies": {
148
145
  "electron": "^39.2.7"
@@ -0,0 +1,13 @@
1
+ /**
2
+ * CLI convenience wrapper for SqliteTracingPlugin.
3
+ * Accepts a dbRoot string or an options object so existing CLI tests can pass
4
+ * a temp directory path directly.
5
+ */
6
+ import { SqliteTracingPlugin as SdkPlugin } from '@crewx/sdk/plugins';
7
+ export type { SqliteTracingPluginOptions } from '@crewx/sdk/plugins';
8
+ export declare class SqliteTracingPlugin extends SdkPlugin {
9
+ constructor(dbRootOrOpts?: string | {
10
+ dbRoot?: string;
11
+ version?: string;
12
+ });
13
+ }
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SqliteTracingPlugin = void 0;
4
+ /**
5
+ * CLI convenience wrapper for SqliteTracingPlugin.
6
+ * Accepts a dbRoot string or an options object so existing CLI tests can pass
7
+ * a temp directory path directly.
8
+ */
9
+ const plugins_1 = require("@crewx/sdk/plugins");
10
+ class SqliteTracingPlugin extends plugins_1.SqliteTracingPlugin {
11
+ constructor(dbRootOrOpts) {
12
+ if (typeof dbRootOrOpts === 'string') {
13
+ super({ dbRoot: dbRootOrOpts });
14
+ }
15
+ else {
16
+ super(dbRootOrOpts);
17
+ }
18
+ }
19
+ }
20
+ exports.SqliteTracingPlugin = SqliteTracingPlugin;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@crewx/cli",
3
- "version": "0.8.0-rc.80",
3
+ "version": "0.8.0-rc.83",
4
4
  "license": "UNLICENSED",
5
5
  "engines": {
6
6
  "node": ">=20.19.0"
@@ -0,0 +1,285 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * smoke-tarball.mjs — Tarball-isolated smoke test for crewx CLI.
4
+ *
5
+ * Packs the current project into a tarball, installs it in a temp directory
6
+ * (no global install), and runs a suite of smoke checks against the binary.
7
+ * This avoids workspace symlink false-positives that npm install -g . can produce.
8
+ *
9
+ * Usage:
10
+ * node scripts/smoke-tarball.mjs [--version <expected>] [--skip-web]
11
+ *
12
+ * Flags:
13
+ * --version <ver> Expected crewx --version output. Defaults to package.json version.
14
+ * --skip-web Skip the NestJS web server startup check (useful in CI).
15
+ * --timeout <ms> Per-command timeout in ms. Default: 15000.
16
+ *
17
+ * Exit code: 0 = ALL PASS, 1 = one or more FAILs.
18
+ */
19
+
20
+ import { execFileSync, spawnSync } from 'child_process';
21
+ import { mkdtempSync, rmSync, writeFileSync, mkdirSync } from 'fs';
22
+ import { join, resolve } from 'path';
23
+ import { tmpdir } from 'os';
24
+ import { createRequire } from 'module';
25
+
26
+ const require = createRequire(import.meta.url);
27
+ const rootPkg = require('../package.json');
28
+
29
+ // ── CLI args ──────────────────────────────────────────────────────────────────
30
+ const args = process.argv.slice(2);
31
+ const getArg = (flag) => {
32
+ const i = args.indexOf(flag);
33
+ return i !== -1 ? args[i + 1] : null;
34
+ };
35
+ const hasFlag = (flag) => args.includes(flag);
36
+
37
+ const expectedVersion = getArg('--version') ?? rootPkg.version;
38
+ const skipWeb = hasFlag('--skip-web');
39
+ const cmdTimeout = parseInt(getArg('--timeout') ?? '15000', 10);
40
+
41
+ // ── Result tracking ───────────────────────────────────────────────────────────
42
+ const results = [];
43
+ let anyFail = false;
44
+
45
+ function pass(label) {
46
+ results.push({ label, status: 'PASS' });
47
+ console.log(` ✓ PASS ${label}`);
48
+ }
49
+
50
+ function fail(label, detail = '') {
51
+ results.push({ label, status: 'FAIL', detail });
52
+ console.error(` ✗ FAIL ${label}${detail ? ': ' + detail : ''}`);
53
+ anyFail = true;
54
+ }
55
+
56
+ function run(cmd, cmdArgs, opts = {}) {
57
+ const result = spawnSync(cmd, cmdArgs, {
58
+ timeout: opts.timeout ?? cmdTimeout,
59
+ encoding: 'utf8',
60
+ cwd: opts.cwd,
61
+ env: { ...process.env, ...opts.env },
62
+ });
63
+ return {
64
+ stdout: result.stdout ?? '',
65
+ stderr: result.stderr ?? '',
66
+ status: result.status ?? -1,
67
+ timedOut: result.signal === 'SIGTERM',
68
+ };
69
+ }
70
+
71
+ // ── Step 1: Pack ──────────────────────────────────────────────────────────────
72
+ const packDest = tmpdir();
73
+ console.log('\n[1/3] Packing tarball...');
74
+ let tarball;
75
+ try {
76
+ const out = execFileSync('pnpm', ['pack', '--pack-destination', packDest], {
77
+ cwd: resolve('.'),
78
+ encoding: 'utf8',
79
+ }).trim();
80
+ tarball = out.split('\n').pop().trim();
81
+ console.log(` Tarball: ${tarball}`);
82
+ } catch (e) {
83
+ console.error('FATAL: pnpm pack failed:', e.message);
84
+ process.exit(1);
85
+ }
86
+
87
+ // ── Step 2: Install in temp dir ───────────────────────────────────────────────
88
+ const installDir = mkdtempSync(join(tmpdir(), 'crewx-smoke-install-'));
89
+ console.log(`\n[2/3] Installing into ${installDir}...`);
90
+ try {
91
+ execFileSync('npm', ['install', tarball], {
92
+ cwd: installDir,
93
+ encoding: 'utf8',
94
+ stdio: 'inherit',
95
+ });
96
+ } catch (e) {
97
+ console.error('FATAL: npm install failed:', e.message);
98
+ rmSync(installDir, { recursive: true, force: true });
99
+ process.exit(1);
100
+ }
101
+
102
+ const binDir = join(installDir, 'node_modules', '.bin');
103
+ const env = { ...process.env, PATH: `${binDir}:${process.env.PATH}` };
104
+
105
+ // ── Step 3: Test dir (clean workspace) ────────────────────────────────────────
106
+ const testDir = mkdtempSync(join(tmpdir(), 'crewx-smoke-test-'));
107
+ mkdirSync(join(testDir, '.git')); // minimal git marker
108
+
109
+ // Minimal crewx.yaml for agent tests
110
+ writeFileSync(join(testDir, 'crewx.yaml'), `
111
+ agents:
112
+ - id: crewx
113
+ name: "CrewX Assistant"
114
+ inline:
115
+ provider: "cli/claude"
116
+ prompt: "You are a test agent. Reply with OK only."
117
+ `.trim());
118
+
119
+ console.log(`\n[3/3] Running smoke checks from ${testDir}...\n`);
120
+
121
+ // ── Check 1: version ──────────────────────────────────────────────────────────
122
+ {
123
+ const r = run('crewx', ['--version'], { cwd: testDir, env });
124
+ const actual = r.stdout.trim();
125
+ if (actual === expectedVersion) {
126
+ pass(`crewx --version == ${expectedVersion}`);
127
+ } else {
128
+ fail('crewx --version', `expected "${expectedVersion}", got "${actual}"`);
129
+ }
130
+ }
131
+
132
+ // ── Check 2: help ─────────────────────────────────────────────────────────────
133
+ {
134
+ const r = run('crewx', ['--help'], { cwd: testDir, env });
135
+ if (r.status === 0 && r.stdout.includes(expectedVersion)) {
136
+ pass('crewx --help shows correct version');
137
+ } else {
138
+ fail('crewx --help', `exit=${r.status}, version in output: ${r.stdout.includes(expectedVersion)}`);
139
+ }
140
+ }
141
+
142
+ // ── Check 3: agent list ───────────────────────────────────────────────────────
143
+ {
144
+ const r = run('crewx', ['agent', 'list'], { cwd: testDir, env });
145
+ if (r.status === 0) {
146
+ pass('crewx agent list');
147
+ } else {
148
+ fail('crewx agent list', r.stderr.slice(0, 200));
149
+ }
150
+ }
151
+
152
+ // ── Check 4: skill list ───────────────────────────────────────────────────────
153
+ {
154
+ const r = run('crewx', ['skill', 'list'], { cwd: testDir, env });
155
+ if (r.status === 0 || r.stdout.includes('No skills')) {
156
+ pass('crewx skill list');
157
+ } else {
158
+ fail('crewx skill list', r.stderr.slice(0, 200));
159
+ }
160
+ }
161
+
162
+ // ── Check 5: memory --help ────────────────────────────────────────────────────
163
+ {
164
+ const r = run('crewx', ['memory', '--help'], { cwd: testDir, env });
165
+ if (r.status === 0) {
166
+ pass('crewx memory --help');
167
+ } else {
168
+ fail('crewx memory --help', r.stderr.slice(0, 200));
169
+ }
170
+ }
171
+
172
+ // ── Check 6: workflow --help ──────────────────────────────────────────────────
173
+ {
174
+ const r = run('crewx', ['workflow', '--help'], { cwd: testDir, env });
175
+ if (r.status === 0) {
176
+ pass('crewx workflow --help');
177
+ } else {
178
+ fail('crewx workflow --help', r.stderr.slice(0, 200));
179
+ }
180
+ }
181
+
182
+ // ── Check 7: search ───────────────────────────────────────────────────────────
183
+ {
184
+ const r = run('crewx', ['search', 'test', '.'], { cwd: testDir, env, timeout: 10000 });
185
+ const noError = !r.stderr.includes('ERR_MODULE_NOT_FOUND') && !r.stderr.includes('is not a function');
186
+ if (noError) {
187
+ pass('crewx search (no crash)');
188
+ } else {
189
+ fail('crewx search', r.stderr.slice(0, 300));
190
+ }
191
+ }
192
+
193
+ // ── Check 8: crewx q "hi" (SDK loading check) ────────────────────────────────
194
+ {
195
+ const r = run('crewx', ['q', 'hi'], { cwd: testDir, env, timeout: 15000 });
196
+ const combined = r.stdout + r.stderr;
197
+ const sdkErrors = ['ERR_MODULE_NOT_FOUND', 'is not a function', 'Cannot find module'];
198
+ const hasError = sdkErrors.some(e => combined.includes(e));
199
+ if (!hasError) {
200
+ pass('crewx q "hi" (no SDK import errors)');
201
+ } else {
202
+ const found = sdkErrors.find(e => combined.includes(e));
203
+ fail('crewx q "hi"', `SDK error: ${found}`);
204
+ }
205
+ }
206
+
207
+ // ── Check 9: crewx web startup ────────────────────────────────────────────────
208
+ if (!skipWeb) {
209
+ const r = run('crewx', [], { cwd: testDir, env, timeout: 10000 });
210
+ const combined = r.stdout + r.stderr;
211
+ const hasModuleError = combined.includes('ERR_MODULE_NOT_FOUND');
212
+ if (!hasModuleError) {
213
+ pass('crewx (web) startup — no ERR_MODULE_NOT_FOUND');
214
+ } else {
215
+ fail('crewx (web) startup', 'ERR_MODULE_NOT_FOUND detected');
216
+ }
217
+ } else {
218
+ console.log(' - SKIP crewx web startup (--skip-web)');
219
+ }
220
+
221
+ // ── Check 10: SDK templates load (CJS require) ───────────────────────────────
222
+ {
223
+ const sdkDir = join(installDir, 'node_modules', '@crewx', 'sdk');
224
+ const r = run('node', ['-e', `
225
+ const { existsSync, readdirSync } = require('fs');
226
+ const { join, dirname } = require('path');
227
+ const sdkMain = require.resolve('${sdkDir.replace(/\\/g, '/')}/dist/index.js');
228
+ const distDir = dirname(sdkMain);
229
+ const templatesPath = join(distDir, '../templates/agents');
230
+ if (!existsSync(templatesPath)) { process.stdout.write('FAIL: ' + templatesPath + '\\n'); process.exit(1); }
231
+ const files = readdirSync(templatesPath);
232
+ if (!files.includes('default.yaml')) { process.stdout.write('FAIL: default.yaml missing\\n'); process.exit(1); }
233
+ process.stdout.write('OK: ' + templatesPath + '\\n');
234
+ `], { cwd: testDir, env, timeout: 5000 });
235
+ if (r.status === 0 && r.stdout.includes('OK:')) {
236
+ pass('SDK templates load (CJS) — dist/index.js → ../templates/agents ✓');
237
+ } else {
238
+ fail('SDK templates load (CJS)', r.stderr.slice(0, 200) || r.stdout.slice(0, 200));
239
+ }
240
+ }
241
+
242
+ // ── Check 11: SDK templates load (ESM import — same dist/index.js via exports) ─
243
+ {
244
+ const sdkDir = join(installDir, 'node_modules', '@crewx', 'sdk');
245
+ const r = run('node', ['--input-type=module', '--eval', `
246
+ import { existsSync, readdirSync } from 'fs';
247
+ import { join, dirname } from 'path';
248
+ import { createRequire } from 'module';
249
+ const require = createRequire(import.meta.url);
250
+ // "import" condition in package.json exports also points to dist/index.js (CJS)
251
+ const sdkMain = require.resolve('${sdkDir.replace(/\\/g, '/')}/dist/index.js');
252
+ const distDir = dirname(sdkMain);
253
+ const templatesPath = join(distDir, '../templates/agents');
254
+ if (!existsSync(templatesPath)) { process.stdout.write('FAIL: ' + templatesPath + '\\n'); process.exit(1); }
255
+ const files = readdirSync(templatesPath);
256
+ if (!files.includes('default.yaml')) { process.stdout.write('FAIL: default.yaml missing\\n'); process.exit(1); }
257
+ process.stdout.write('OK: ' + templatesPath + '\\n');
258
+ `], { cwd: testDir, env, timeout: 5000 });
259
+ if (r.status === 0 && r.stdout.includes('OK:')) {
260
+ pass('SDK templates load (ESM) — dist/index.js → ../templates/agents ✓');
261
+ } else {
262
+ fail('SDK templates load (ESM)', r.stderr.slice(0, 200) || r.stdout.slice(0, 200));
263
+ }
264
+ }
265
+
266
+ // ── Cleanup ───────────────────────────────────────────────────────────────────
267
+ rmSync(testDir, { recursive: true, force: true });
268
+ rmSync(installDir, { recursive: true, force: true });
269
+ try { rmSync(tarball, { force: true }); } catch {}
270
+
271
+ // ── Summary ───────────────────────────────────────────────────────────────────
272
+ console.log('\n' + '─'.repeat(60));
273
+ const passed = results.filter(r => r.status === 'PASS').length;
274
+ const failed = results.filter(r => r.status === 'FAIL').length;
275
+
276
+ if (!anyFail) {
277
+ console.log(`✅ ALL PASS (${passed}/${results.length})`);
278
+ } else {
279
+ console.log(`❌ ${failed} FAIL / ${passed} PASS`);
280
+ results.filter(r => r.status === 'FAIL').forEach(r => {
281
+ console.error(` FAIL: ${r.label}${r.detail ? ' — ' + r.detail : ''}`);
282
+ });
283
+ }
284
+
285
+ process.exit(anyFail ? 1 : 0);
@@ -1,86 +0,0 @@
1
- "use strict";
2
- /**
3
- * createAdapterContext — builds an AdapterContext for an adapter instance.
4
- *
5
- * M1: respondSync uses AsyncLocalStorage to bind the current HTTP response.
6
- * When called inside a registerRoute handler (sync window), respondSync writes
7
- * to the HTTP res. When called outside the sync window, it performs graceful
8
- * degradation: logs a warning instead of throwing (PoC correction #3).
9
- */
10
- Object.defineProperty(exports, "__esModule", { value: true });
11
- exports.getSyncWindowStore = getSyncWindowStore;
12
- exports.runInSyncWindow = runInSyncWindow;
13
- exports.createAdapterContext = createAdapterContext;
14
- const async_hooks_1 = require("async_hooks");
15
- const syncWindowStore = new async_hooks_1.AsyncLocalStorage();
16
- function getSyncWindowStore() {
17
- return syncWindowStore;
18
- }
19
- function runInSyncWindow(window, fn) {
20
- return syncWindowStore.run(window, fn);
21
- }
22
- function createAdapterContext(opts) {
23
- const log = opts.log ?? opts.logger ?? {
24
- debug: () => { },
25
- info: () => { },
26
- warn: () => { },
27
- error: () => { },
28
- };
29
- const agentRunner = opts.agentRunner ?? {
30
- run: async () => ({ output: '' }),
31
- };
32
- const db = opts.db ?? {
33
- get: async () => undefined,
34
- set: async () => { },
35
- delete: async () => false,
36
- list: async () => [],
37
- };
38
- const storage = opts.storage ?? {
39
- put: async () => '',
40
- get: async () => undefined,
41
- delete: async () => false,
42
- };
43
- const audit = opts.audit ?? {
44
- log: async () => { },
45
- };
46
- const inbound = opts.onInbound ?? (async () => ({ accepted: true }));
47
- const emitEventFn = opts.onEmitEvent ?? (async () => ({ accepted: true }));
48
- const updateMessage = opts.onUpdateMessage ?? (async () => { });
49
- const resolveUser = opts.onResolveUser ?? (async (userId) => ({
50
- userId,
51
- displayName: userId,
52
- }));
53
- const respondSync = async (payload) => {
54
- const window = syncWindowStore.getStore();
55
- if (!window) {
56
- log.warn('respondSync called outside sync window — graceful degradation (no-op)', {
57
- textPreview: typeof payload === 'object' && 'text' in payload ? payload.text.slice(0, 80) : undefined,
58
- });
59
- return;
60
- }
61
- const text = 'text' in payload ? payload.text : '';
62
- window.res.status(200).json({ text });
63
- };
64
- const httpRouter = opts.httpRouter ?? {
65
- registerRoute: () => {
66
- log.warn('httpRouter not configured — registerRoute is a no-op');
67
- },
68
- };
69
- return {
70
- instanceId: opts.instanceId,
71
- config: opts.config,
72
- capabilities: opts.capabilities,
73
- log,
74
- agentRunner,
75
- db,
76
- storage,
77
- audit,
78
- abortSignal: opts.abortSignal ?? new AbortController().signal,
79
- httpRouter,
80
- inbound,
81
- emitEvent: emitEventFn,
82
- updateMessage,
83
- resolveUser,
84
- respondSync,
85
- };
86
- }
@@ -1,42 +0,0 @@
1
- "use strict";
2
- /**
3
- * ScopedAdapterStore — adapter key-value store with mandatory instanceId prefix.
4
- *
5
- * Security: Uses Map closure pattern (RT-1 defense).
6
- * The internal Map is captured in a function closure — no public or private
7
- * property on the returned AdapterStore object holds the raw Map reference.
8
- * Reflect / Object.getPrototypeOf / (ctx.db as any)['_rawStore'] all fail
9
- * because the Map only exists in the createScopedAdapterStore function scope.
10
- */
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.createScopedAdapterStore = createScopedAdapterStore;
13
- function createScopedAdapterStore(instanceId) {
14
- const store = new Map();
15
- const prefixKey = (key) => {
16
- if (key.startsWith(`${instanceId}::`))
17
- return key;
18
- return `${instanceId}::${key}`;
19
- };
20
- return {
21
- async get(key) {
22
- const entry = store.get(prefixKey(key));
23
- return entry ? entry.value : undefined;
24
- },
25
- async set(key, value) {
26
- store.set(prefixKey(key), { value });
27
- },
28
- async delete(key) {
29
- return store.delete(prefixKey(key));
30
- },
31
- async list(prefix) {
32
- const fullPrefix = prefix ? prefixKey(prefix) : `${instanceId}::`;
33
- const keys = [];
34
- for (const k of store.keys()) {
35
- if (k.startsWith(fullPrefix)) {
36
- keys.push(k.slice(instanceId.length + 2));
37
- }
38
- }
39
- return keys;
40
- },
41
- };
42
- }
@@ -1,22 +0,0 @@
1
- "use strict";
2
- /**
3
- * Adapter Platform v0.4 — core types.
4
- * PoC corrections applied:
5
- * 1. AdapterError: class only (interface removed)
6
- * 2. kind: added 'config' for configuration errors
7
- */
8
- Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.AdapterError = void 0;
10
- class AdapterError extends Error {
11
- code;
12
- kind;
13
- retryAfterMs;
14
- constructor(code, kind, retryAfterMs) {
15
- super(`AdapterError: ${code}`);
16
- this.name = 'AdapterError';
17
- this.code = code;
18
- this.kind = kind;
19
- this.retryAfterMs = retryAfterMs;
20
- }
21
- }
22
- exports.AdapterError = AdapterError;
@@ -1,45 +0,0 @@
1
- "use strict";
2
- /**
3
- * Agent resolver: looks up an agent from a list by ref.
4
- * Supports both bare id ('claude') and @mention format ('@claude').
5
- * Falls back to built-in provider shorthands (claude, gemini, copilot, codex).
6
- */
7
- Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.AgentNotFoundError = void 0;
9
- exports.resolveAgent = resolveAgent;
10
- class AgentNotFoundError extends Error {
11
- constructor(agentRef, availableIds) {
12
- const available = availableIds.length > 0
13
- ? ` Available: ${availableIds.join(', ')}`
14
- : '';
15
- super(`Agent not found: "${agentRef}".${available}`);
16
- this.name = 'AgentNotFoundError';
17
- }
18
- }
19
- exports.AgentNotFoundError = AgentNotFoundError;
20
- /** Built-in provider shorthands that can be used without a crewx.yaml entry. */
21
- const BUILTIN_PROVIDERS = {
22
- claude: { id: 'claude', provider: 'cli/claude' },
23
- gemini: { id: 'gemini', provider: 'cli/gemini' },
24
- copilot: { id: 'copilot', provider: 'cli/copilot' },
25
- codex: { id: 'codex', provider: 'cli/codex' },
26
- };
27
- /**
28
- * Resolve an agent by reference.
29
- * @param agentRef - Agent reference: '@claude', 'claude', '@my_agent', etc.
30
- * @param agents - List of available agent configs.
31
- * @returns The matching AgentConfig.
32
- * @throws AgentNotFoundError when no match is found.
33
- */
34
- function resolveAgent(agentRef, agents) {
35
- const agentId = agentRef.startsWith('@') ? agentRef.slice(1) : agentRef;
36
- // 1. Look in YAML-defined agents first
37
- const agent = agents.find(a => a.id === agentId);
38
- if (agent)
39
- return agent;
40
- // 2. Fall back to built-in provider shorthands
41
- const builtin = BUILTIN_PROVIDERS[agentId];
42
- if (builtin)
43
- return builtin;
44
- throw new AgentNotFoundError(agentRef, agents.map(a => a.id));
45
- }
@@ -1,94 +0,0 @@
1
- "use strict";
2
- /**
3
- * YAML configuration loader for CrewX projects.
4
- * Reads crewx.yaml and validates it with Zod schema.
5
- */
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.ConfigLoadError = void 0;
8
- exports.parseYamlContent = parseYamlContent;
9
- exports.loadYamlFile = loadYamlFile;
10
- const js_yaml_1 = require("js-yaml");
11
- const fs_1 = require("fs");
12
- const types_1 = require("../types");
13
- class ConfigLoadError extends Error {
14
- cause;
15
- constructor(message, cause) {
16
- super(message);
17
- this.cause = cause;
18
- this.name = 'ConfigLoadError';
19
- }
20
- }
21
- exports.ConfigLoadError = ConfigLoadError;
22
- /**
23
- * Parse YAML string into a validated CrewxProjectConfig.
24
- * Converts the agents record (keyed by id) into an array.
25
- */
26
- function parseYamlContent(yamlString) {
27
- if (!yamlString || typeof yamlString !== 'string' || !yamlString.trim()) {
28
- throw new ConfigLoadError('YAML content must be a non-empty string');
29
- }
30
- let raw;
31
- try {
32
- raw = (0, js_yaml_1.load)(yamlString);
33
- }
34
- catch (err) {
35
- throw new ConfigLoadError(`YAML parse error: ${err.message}`, err);
36
- }
37
- // Normalize agents: YAML has agents as a map (Record<id, config>),
38
- // but our type uses an array with 'id' field.
39
- const normalized = normalizeRaw(raw);
40
- const result = types_1.CrewxProjectConfigSchema.safeParse(normalized);
41
- if (!result.success) {
42
- throw new ConfigLoadError(`Config validation error: ${result.error.message}`);
43
- }
44
- return result.data;
45
- }
46
- /**
47
- * Load and parse crewx.yaml from a file path.
48
- */
49
- function loadYamlFile(filePath) {
50
- let content;
51
- try {
52
- content = (0, fs_1.readFileSync)(filePath, 'utf-8');
53
- }
54
- catch (err) {
55
- throw new ConfigLoadError(`Cannot read file: ${filePath}`, err);
56
- }
57
- return parseYamlContent(content);
58
- }
59
- /**
60
- * Normalize raw YAML output:
61
- * - agents map (Record<id, agentConfig>) → agents array ([{ id, ...agentConfig }])
62
- */
63
- function normalizeRaw(raw) {
64
- if (!raw || typeof raw !== 'object') {
65
- return { agents: [] };
66
- }
67
- const obj = raw;
68
- // Gather agents as array (support map form and array form)
69
- let agentsArray;
70
- if (obj.agents && typeof obj.agents === 'object' && !Array.isArray(obj.agents)) {
71
- const agentsMap = obj.agents;
72
- agentsArray = Object.entries(agentsMap).map(([id, cfg]) => {
73
- const agentCfg = (cfg && typeof cfg === 'object' ? cfg : {});
74
- return { id, ...agentCfg };
75
- });
76
- }
77
- else if (Array.isArray(obj.agents)) {
78
- agentsArray = obj.agents;
79
- }
80
- else {
81
- return { ...obj, agents: [] };
82
- }
83
- // Normalize inline.provider → top-level provider (fallback for cross-repo yaml compat)
84
- const normalizedAgents = agentsArray.map(agent => {
85
- if (agent.provider === undefined && agent.inline && typeof agent.inline === 'object') {
86
- const inline = agent.inline;
87
- if (inline.provider !== undefined) {
88
- return { ...agent, provider: inline.provider };
89
- }
90
- }
91
- return agent;
92
- });
93
- return { ...obj, agents: normalizedAgents };
94
- }