@rotifer/playground 0.5.0-alpha.2 → 0.7.1

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 (320) hide show
  1. package/CHANGELOG.md +159 -15
  2. package/LICENSE +1 -1
  3. package/README.md +51 -23
  4. package/README.zh.md +54 -25
  5. package/dist/cloud/auth.d.ts +7 -1
  6. package/dist/cloud/auth.d.ts.map +1 -1
  7. package/dist/cloud/auth.js +65 -1
  8. package/dist/cloud/auth.js.map +1 -1
  9. package/dist/cloud/client.d.ts +4 -1
  10. package/dist/cloud/client.d.ts.map +1 -1
  11. package/dist/cloud/client.js +16 -3
  12. package/dist/cloud/client.js.map +1 -1
  13. package/dist/cloud/types.d.ts +6 -1
  14. package/dist/cloud/types.d.ts.map +1 -1
  15. package/dist/cloud/types.js.map +1 -1
  16. package/dist/commands/agent-create.d.ts.map +1 -1
  17. package/dist/commands/agent-create.js +66 -3
  18. package/dist/commands/agent-create.js.map +1 -1
  19. package/dist/commands/agent-run.d.ts.map +1 -1
  20. package/dist/commands/agent-run.js +296 -32
  21. package/dist/commands/agent-run.js.map +1 -1
  22. package/dist/commands/arena-list.js +8 -2
  23. package/dist/commands/arena-list.js.map +1 -1
  24. package/dist/commands/arena-submit.d.ts.map +1 -1
  25. package/dist/commands/arena-submit.js +45 -17
  26. package/dist/commands/arena-submit.js.map +1 -1
  27. package/dist/commands/arena-watch.js +8 -2
  28. package/dist/commands/arena-watch.js.map +1 -1
  29. package/dist/commands/compile.d.ts.map +1 -1
  30. package/dist/commands/compile.js +9 -3
  31. package/dist/commands/compile.js.map +1 -1
  32. package/dist/commands/init.d.ts.map +1 -1
  33. package/dist/commands/init.js +13 -3
  34. package/dist/commands/init.js.map +1 -1
  35. package/dist/commands/login.d.ts.map +1 -1
  36. package/dist/commands/login.js +23 -16
  37. package/dist/commands/login.js.map +1 -1
  38. package/dist/commands/network.js +4 -4
  39. package/dist/commands/network.js.map +1 -1
  40. package/dist/commands/publish.d.ts.map +1 -1
  41. package/dist/commands/publish.js +200 -44
  42. package/dist/commands/publish.js.map +1 -1
  43. package/dist/commands/test.d.ts.map +1 -1
  44. package/dist/commands/test.js +209 -23
  45. package/dist/commands/test.js.map +1 -1
  46. package/dist/commands/wrap.d.ts.map +1 -1
  47. package/dist/commands/wrap.js +17 -1
  48. package/dist/commands/wrap.js.map +1 -1
  49. package/dist/index.js +0 -0
  50. package/dist/runtime/network-gateway.d.ts +53 -0
  51. package/dist/runtime/network-gateway.d.ts.map +1 -0
  52. package/dist/runtime/network-gateway.js +147 -0
  53. package/dist/runtime/network-gateway.js.map +1 -0
  54. package/dist/utils/binding.d.ts +25 -0
  55. package/dist/utils/binding.d.ts.map +1 -1
  56. package/dist/utils/binding.js.map +1 -1
  57. package/dist/utils/open-browser.d.ts +10 -0
  58. package/dist/utils/open-browser.d.ts.map +1 -0
  59. package/dist/utils/open-browser.js +23 -0
  60. package/dist/utils/open-browser.js.map +1 -0
  61. package/genes/academic-writer/.cloud-manifest.json +6 -0
  62. package/genes/academic-writer/.gene-manifest.json +8 -0
  63. package/genes/academic-writer/SKILL.md +274 -0
  64. package/genes/academic-writer/phenotype.json +28 -0
  65. package/genes/ai-components/.cloud-manifest.json +6 -0
  66. package/genes/ai-components/.gene-manifest.json +8 -0
  67. package/genes/ai-components/SKILL.md +381 -0
  68. package/genes/ai-components/phenotype.json +28 -0
  69. package/genes/algorithmic-art/.cloud-manifest.json +6 -0
  70. package/genes/algorithmic-art/.gene-manifest.json +8 -0
  71. package/genes/algorithmic-art/SKILL.md +405 -0
  72. package/genes/algorithmic-art/phenotype.json +28 -0
  73. package/genes/answer-synthesizer/.cloud-manifest.json +6 -0
  74. package/genes/answer-synthesizer/index.ts +194 -0
  75. package/genes/answer-synthesizer/phenotype.json +61 -0
  76. package/genes/api-designer/.cloud-manifest.json +6 -0
  77. package/genes/api-designer/.gene-manifest.json +8 -0
  78. package/genes/api-designer/SKILL.md +456 -0
  79. package/genes/api-designer/phenotype.json +28 -0
  80. package/genes/auto-coder/.cloud-manifest.json +6 -0
  81. package/genes/auto-coder/.gene-manifest.json +8 -0
  82. package/genes/auto-coder/SKILL.md +400 -0
  83. package/genes/auto-coder/phenotype.json +28 -0
  84. package/genes/auto-writer/.cloud-manifest.json +6 -0
  85. package/genes/auto-writer/.gene-manifest.json +8 -0
  86. package/genes/auto-writer/SKILL.md +361 -0
  87. package/genes/auto-writer/phenotype.json +28 -0
  88. package/genes/brand-personality/.cloud-manifest.json +6 -0
  89. package/genes/brand-personality/.gene-manifest.json +8 -0
  90. package/genes/brand-personality/SKILL.md +549 -0
  91. package/genes/brand-personality/phenotype.json +28 -0
  92. package/genes/business-writer/.cloud-manifest.json +6 -0
  93. package/genes/business-writer/.gene-manifest.json +8 -0
  94. package/genes/business-writer/SKILL.md +448 -0
  95. package/genes/business-writer/phenotype.json +28 -0
  96. package/genes/citation-manager/.cloud-manifest.json +6 -0
  97. package/genes/citation-manager/.gene-manifest.json +8 -0
  98. package/genes/citation-manager/SKILL.md +279 -0
  99. package/genes/citation-manager/index.ts +162 -0
  100. package/genes/citation-manager/package.json +1 -0
  101. package/genes/citation-manager/phenotype.json +50 -0
  102. package/genes/code-complexity/.cloud-manifest.json +6 -0
  103. package/genes/code-complexity/README.md +35 -0
  104. package/genes/code-complexity/index.ts +101 -0
  105. package/genes/code-complexity/phenotype.json +34 -0
  106. package/genes/copywriter/.cloud-manifest.json +6 -0
  107. package/genes/copywriter/.gene-manifest.json +8 -0
  108. package/genes/copywriter/SKILL.md +329 -0
  109. package/genes/copywriter/phenotype.json +28 -0
  110. package/genes/creative-writer/.cloud-manifest.json +6 -0
  111. package/genes/creative-writer/.gene-manifest.json +8 -0
  112. package/genes/creative-writer/SKILL.md +356 -0
  113. package/genes/creative-writer/phenotype.json +28 -0
  114. package/genes/data-modeler/.cloud-manifest.json +6 -0
  115. package/genes/data-modeler/.gene-manifest.json +8 -0
  116. package/genes/data-modeler/SKILL.md +486 -0
  117. package/genes/data-modeler/phenotype.json +28 -0
  118. package/genes/debugger/.cloud-manifest.json +6 -0
  119. package/genes/debugger/.gene-manifest.json +8 -0
  120. package/genes/debugger/SKILL.md +416 -0
  121. package/genes/debugger/phenotype.json +28 -0
  122. package/genes/design-tokens/.cloud-manifest.json +6 -0
  123. package/genes/design-tokens/.gene-manifest.json +8 -0
  124. package/genes/design-tokens/SKILL.md +222 -0
  125. package/genes/design-tokens/index.ts +128 -0
  126. package/genes/design-tokens/package.json +1 -0
  127. package/genes/design-tokens/phenotype.json +1 -0
  128. package/genes/devops-automator/.cloud-manifest.json +6 -0
  129. package/genes/devops-automator/.gene-manifest.json +8 -0
  130. package/genes/devops-automator/SKILL.md +490 -0
  131. package/genes/devops-automator/phenotype.json +28 -0
  132. package/genes/doc-coauthoring/.cloud-manifest.json +6 -0
  133. package/genes/doc-coauthoring/.gene-manifest.json +8 -0
  134. package/genes/doc-coauthoring/SKILL.md +375 -0
  135. package/genes/doc-coauthoring/phenotype.json +28 -0
  136. package/genes/doc-retrieval/.cloud-manifest.json +6 -0
  137. package/genes/doc-retrieval/index.ts +134 -0
  138. package/genes/doc-retrieval/phenotype.json +54 -0
  139. package/genes/docs-writer/.cloud-manifest.json +6 -0
  140. package/genes/docs-writer/.gene-manifest.json +8 -0
  141. package/genes/docs-writer/SKILL.md +492 -0
  142. package/genes/docs-writer/phenotype.json +28 -0
  143. package/genes/evolve-life/.cloud-manifest.json +6 -0
  144. package/genes/evolve-life/.compile-result.json +12 -0
  145. package/genes/evolve-life/README.md +52 -0
  146. package/genes/evolve-life/gene.ir.wasm +0 -0
  147. package/genes/evolve-life/gene.wasm +0 -0
  148. package/genes/evolve-life/index.ts +255 -0
  149. package/genes/evolve-life/phenotype.json +129 -0
  150. package/genes/evolve-life-bitwise/.cloud-manifest.json +6 -0
  151. package/genes/evolve-life-bitwise/.compile-result.json +12 -0
  152. package/genes/evolve-life-bitwise/gene.ir.wasm +0 -0
  153. package/genes/evolve-life-bitwise/gene.wasm +0 -0
  154. package/genes/evolve-life-bitwise/index.ts +273 -0
  155. package/genes/evolve-life-bitwise/phenotype.json +129 -0
  156. package/genes/evolve-life-sparse/.cloud-manifest.json +6 -0
  157. package/genes/evolve-life-sparse/.compile-result.json +12 -0
  158. package/genes/evolve-life-sparse/gene.ir.wasm +0 -0
  159. package/genes/evolve-life-sparse/gene.wasm +0 -0
  160. package/genes/evolve-life-sparse/index.ts +236 -0
  161. package/genes/evolve-life-sparse/phenotype.json +129 -0
  162. package/genes/fact-checker/.cloud-manifest.json +6 -0
  163. package/genes/fact-checker/.gene-manifest.json +8 -0
  164. package/genes/fact-checker/SKILL.md +373 -0
  165. package/genes/fact-checker/phenotype.json +28 -0
  166. package/genes/genesis-code-format/.cloud-manifest.json +6 -0
  167. package/genes/genesis-code-format/package.json +1 -0
  168. package/genes/genesis-code-format/phenotype.json +1 -0
  169. package/genes/genesis-file-read/.cloud-manifest.json +6 -0
  170. package/genes/genesis-file-read/index.ts +11 -1
  171. package/genes/genesis-file-read/package.json +1 -0
  172. package/genes/genesis-file-read/phenotype.json +1 -0
  173. package/genes/genesis-l0-constraint/.cloud-manifest.json +6 -0
  174. package/genes/genesis-l0-constraint/package.json +1 -0
  175. package/genes/genesis-l0-constraint/phenotype.json +1 -0
  176. package/genes/genesis-web-search/.cloud-manifest.json +2 -2
  177. package/genes/genesis-web-search/package.json +1 -0
  178. package/genes/genesis-web-search/phenotype.json +1 -0
  179. package/genes/genesis-web-search-lite/.cloud-manifest.json +6 -0
  180. package/genes/genesis-web-search-lite/package.json +1 -0
  181. package/genes/genesis-web-search-lite/phenotype.json +1 -0
  182. package/genes/git-workflow/.cloud-manifest.json +6 -0
  183. package/genes/git-workflow/.gene-manifest.json +8 -0
  184. package/genes/git-workflow/SKILL.md +407 -0
  185. package/genes/git-workflow/phenotype.json +28 -0
  186. package/genes/grammar-checker/.cloud-manifest.json +6 -0
  187. package/genes/grammar-checker/.gene-manifest.json +8 -0
  188. package/genes/grammar-checker/SKILL.md +194 -0
  189. package/genes/grammar-checker/index.ts +168 -0
  190. package/genes/grammar-checker/package.json +1 -0
  191. package/genes/grammar-checker/phenotype.json +52 -0
  192. package/genes/json-validator/.cloud-manifest.json +6 -0
  193. package/genes/json-validator/README.md +42 -0
  194. package/genes/json-validator/index.ts +112 -0
  195. package/genes/json-validator/phenotype.json +42 -0
  196. package/genes/license-advisor/.cloud-manifest.json +6 -0
  197. package/genes/license-advisor/.gene-manifest.json +8 -0
  198. package/genes/license-advisor/SKILL.md +117 -0
  199. package/genes/license-advisor/phenotype.json +28 -0
  200. package/genes/logic-architect/.cloud-manifest.json +6 -0
  201. package/genes/logic-architect/.gene-manifest.json +8 -0
  202. package/genes/logic-architect/SKILL.md +451 -0
  203. package/genes/logic-architect/phenotype.json +28 -0
  204. package/genes/markdown-formatter/.cloud-manifest.json +6 -0
  205. package/genes/markdown-formatter/README.md +34 -0
  206. package/genes/markdown-formatter/index.ts +86 -0
  207. package/genes/markdown-formatter/phenotype.json +32 -0
  208. package/genes/orch/.cloud-manifest.json +6 -0
  209. package/genes/orch/.gene-manifest.json +8 -0
  210. package/genes/orch/SKILL.md +504 -0
  211. package/genes/orch/phenotype.json +28 -0
  212. package/genes/particle-barneshut/.cloud-manifest.json +6 -0
  213. package/genes/particle-barneshut/.compile-result.json +12 -0
  214. package/genes/particle-barneshut/README.md +55 -0
  215. package/genes/particle-barneshut/gene.ir.wasm +0 -0
  216. package/genes/particle-barneshut/gene.wasm +0 -0
  217. package/genes/particle-barneshut/index.ts +486 -0
  218. package/genes/particle-barneshut/phenotype.json +137 -0
  219. package/genes/particle-brute/.cloud-manifest.json +6 -0
  220. package/genes/particle-brute/.compile-result.json +12 -0
  221. package/genes/particle-brute/README.md +55 -0
  222. package/genes/particle-brute/gene.ir.wasm +0 -0
  223. package/genes/particle-brute/gene.wasm +0 -0
  224. package/genes/particle-brute/index.ts +277 -0
  225. package/genes/particle-brute/phenotype.json +137 -0
  226. package/genes/particle-spatial/.cloud-manifest.json +6 -0
  227. package/genes/particle-spatial/.compile-result.json +12 -0
  228. package/genes/particle-spatial/README.md +53 -0
  229. package/genes/particle-spatial/gene.ir.wasm +0 -0
  230. package/genes/particle-spatial/gene.wasm +0 -0
  231. package/genes/particle-spatial/index.ts +352 -0
  232. package/genes/particle-spatial/phenotype.json +137 -0
  233. package/genes/performance-optimizer/.cloud-manifest.json +6 -0
  234. package/genes/performance-optimizer/.gene-manifest.json +8 -0
  235. package/genes/performance-optimizer/SKILL.md +480 -0
  236. package/genes/performance-optimizer/phenotype.json +28 -0
  237. package/genes/plagiarism-checker/.cloud-manifest.json +6 -0
  238. package/genes/plagiarism-checker/.gene-manifest.json +8 -0
  239. package/genes/plagiarism-checker/SKILL.md +342 -0
  240. package/genes/plagiarism-checker/phenotype.json +28 -0
  241. package/genes/product-manager/.cloud-manifest.json +6 -0
  242. package/genes/product-manager/.gene-manifest.json +8 -0
  243. package/genes/product-manager/SKILL.md +249 -0
  244. package/genes/product-manager/phenotype.json +28 -0
  245. package/genes/project-reviewer/.cloud-manifest.json +6 -0
  246. package/genes/project-reviewer/.gene-manifest.json +8 -0
  247. package/genes/project-reviewer/SKILL.md +312 -0
  248. package/genes/project-reviewer/phenotype.json +28 -0
  249. package/genes/prompt-engineer/.cloud-manifest.json +6 -0
  250. package/genes/prompt-engineer/.gene-manifest.json +8 -0
  251. package/genes/prompt-engineer/SKILL.md +411 -0
  252. package/genes/prompt-engineer/phenotype.json +28 -0
  253. package/genes/readability-analyzer/.cloud-manifest.json +6 -0
  254. package/genes/readability-analyzer/.gene-manifest.json +8 -0
  255. package/genes/readability-analyzer/SKILL.md +357 -0
  256. package/genes/readability-analyzer/index.ts +123 -0
  257. package/genes/readability-analyzer/package.json +1 -0
  258. package/genes/readability-analyzer/phenotype.json +35 -0
  259. package/genes/rotifer-protocol/SKILL.md +121 -0
  260. package/genes/security-auditor/.cloud-manifest.json +6 -0
  261. package/genes/security-auditor/.gene-manifest.json +8 -0
  262. package/genes/security-auditor/SKILL.md +494 -0
  263. package/genes/security-auditor/phenotype.json +28 -0
  264. package/genes/seo-optimizer/.cloud-manifest.json +6 -0
  265. package/genes/seo-optimizer/.gene-manifest.json +8 -0
  266. package/genes/seo-optimizer/SKILL.md +327 -0
  267. package/genes/seo-optimizer/index.ts +206 -0
  268. package/genes/seo-optimizer/package.json +1 -0
  269. package/genes/seo-optimizer/phenotype.json +1 -0
  270. package/genes/source-linker/.cloud-manifest.json +6 -0
  271. package/genes/source-linker/index.ts +88 -0
  272. package/genes/source-linker/phenotype.json +45 -0
  273. package/genes/style-optimizer/.cloud-manifest.json +6 -0
  274. package/genes/style-optimizer/.gene-manifest.json +8 -0
  275. package/genes/style-optimizer/SKILL.md +285 -0
  276. package/genes/style-optimizer/phenotype.json +28 -0
  277. package/genes/tech-lead/.cloud-manifest.json +6 -0
  278. package/genes/tech-lead/.gene-manifest.json +8 -0
  279. package/genes/tech-lead/SKILL.md +451 -0
  280. package/genes/tech-lead/phenotype.json +28 -0
  281. package/genes/test-wrap/.cloud-manifest.json +6 -0
  282. package/genes/test-wrap/.gene-manifest.json +8 -0
  283. package/genes/test-wrap/phenotype.json +28 -0
  284. package/genes/testing-strategist/.cloud-manifest.json +6 -0
  285. package/genes/testing-strategist/.gene-manifest.json +8 -0
  286. package/genes/testing-strategist/SKILL.md +500 -0
  287. package/genes/testing-strategist/phenotype.json +28 -0
  288. package/genes/text-summarizer/.cloud-manifest.json +6 -0
  289. package/genes/text-summarizer/README.md +34 -0
  290. package/genes/text-summarizer/index.ts +122 -0
  291. package/genes/text-summarizer/phenotype.json +32 -0
  292. package/genes/tone-analyzer/.cloud-manifest.json +6 -0
  293. package/genes/tone-analyzer/.gene-manifest.json +8 -0
  294. package/genes/tone-analyzer/SKILL.md +410 -0
  295. package/genes/tone-analyzer/phenotype.json +28 -0
  296. package/genes/translator/.cloud-manifest.json +6 -0
  297. package/genes/translator/.gene-manifest.json +8 -0
  298. package/genes/translator/SKILL.md +355 -0
  299. package/genes/translator/phenotype.json +28 -0
  300. package/genes/ui-components/.cloud-manifest.json +6 -0
  301. package/genes/ui-components/.gene-manifest.json +8 -0
  302. package/genes/ui-components/SKILL.md +467 -0
  303. package/genes/ui-components/phenotype.json +28 -0
  304. package/genes/uiux-designer/.cloud-manifest.json +6 -0
  305. package/genes/uiux-designer/.gene-manifest.json +8 -0
  306. package/genes/uiux-designer/SKILL.md +353 -0
  307. package/genes/uiux-designer/phenotype.json +28 -0
  308. package/genes/url-extractor/.cloud-manifest.json +6 -0
  309. package/genes/url-extractor/README.md +37 -0
  310. package/genes/url-extractor/index.ts +86 -0
  311. package/genes/url-extractor/phenotype.json +48 -0
  312. package/genes/ux-patterns/.cloud-manifest.json +6 -0
  313. package/genes/ux-patterns/.gene-manifest.json +8 -0
  314. package/genes/ux-patterns/SKILL.md +872 -0
  315. package/genes/ux-patterns/phenotype.json +28 -0
  316. package/genes/web3-components/.cloud-manifest.json +6 -0
  317. package/genes/web3-components/.gene-manifest.json +8 -0
  318. package/genes/web3-components/SKILL.md +390 -0
  319. package/genes/web3-components/phenotype.json +28 -0
  320. package/package.json +6 -5
@@ -41,49 +41,40 @@ const display = __importStar(require("../utils/display.js"));
41
41
  const config_js_1 = require("../utils/config.js");
42
42
  const auth_js_1 = require("../cloud/auth.js");
43
43
  const client_js_1 = require("../cloud/client.js");
44
- exports.publishCommand = new commander_1.Command("publish")
45
- .description("Publish a gene to Rotifer Cloud")
46
- .argument("<name>", "gene name to publish")
47
- .option("--description <text>", "gene description")
48
- .action(async (name, options) => {
49
- display.header("Publish to Cloud");
50
- let creds;
51
- try {
52
- creds = (0, auth_js_1.requireAuth)();
53
- }
54
- catch {
55
- display.error("Not logged in. Run 'rotifer login' first.");
56
- process.exit(1);
57
- }
58
- display.info(`Publishing as ${creds.user.username}`);
59
- const root = (0, config_js_1.getProjectRoot)();
60
- const config = (0, config_js_1.loadConfig)(root);
61
- const geneDir = (0, node_path_1.join)(root, config.genes_dir, name);
44
+ async function publishSingleGene(name, geneDir, creds, options, quiet = false) {
62
45
  const phenotypePath = (0, node_path_1.join)(geneDir, "phenotype.json");
63
46
  if (!(0, node_fs_1.existsSync)(phenotypePath)) {
64
- display.rustStyleError({
65
- code: "E0050",
66
- message: `Gene '${name}' not found`,
67
- file: phenotypePath,
68
- suggestion: "Run 'rotifer wrap " + name + " --domain <domain>' first",
69
- });
70
- process.exit(1);
47
+ if (!quiet) {
48
+ display.warn(`Skipping '${name}' — no phenotype.json`);
49
+ }
50
+ return { name, status: "skipped", error: "no phenotype.json" };
71
51
  }
72
52
  const phenotype = JSON.parse((0, node_fs_1.readFileSync)(phenotypePath, "utf-8"));
53
+ if (phenotype.fidelity === "Hybrid") {
54
+ const net = phenotype.network;
55
+ if (!net || !Array.isArray(net.allowedDomains) || net.allowedDomains.length === 0) {
56
+ return { name, status: "failed", error: "Hybrid gene missing allowedDomains" };
57
+ }
58
+ const forbidden = /^(localhost|127\.\d+\.\d+\.\d+|10\.\d+\.\d+\.\d+|172\.(1[6-9]|2\d|3[01])\.\d+\.\d+|192\.168\.\d+\.\d+|0\.0\.0\.0|\[?::1\]?)$/;
59
+ for (const domain of net.allowedDomains) {
60
+ if (forbidden.test(domain)) {
61
+ return { name, status: "failed", error: `forbidden domain: ${domain}` };
62
+ }
63
+ }
64
+ }
73
65
  const irWasmPath = (0, node_path_1.join)(geneDir, "gene.ir.wasm");
74
66
  const wasmBytes = (0, node_fs_1.existsSync)(irWasmPath)
75
67
  ? (0, node_fs_1.readFileSync)(irWasmPath)
76
68
  : null;
77
- if (!wasmBytes) {
78
- display.warn("No compiled WASM found — publishing metadata only. Run 'rotifer compile " +
79
- name +
80
- "' first for full publishing.");
81
- }
82
69
  const description = options.description ||
83
70
  phenotype.description ||
84
71
  `${name} gene (${phenotype.domain})`;
72
+ let readme = null;
73
+ const readmePath = (0, node_path_1.join)(geneDir, "README.md");
74
+ if ((0, node_fs_1.existsSync)(readmePath)) {
75
+ readme = (0, node_fs_1.readFileSync)(readmePath, "utf-8");
76
+ }
85
77
  try {
86
- display.info("Uploading to cloud registry...");
87
78
  const result = await (0, client_js_1.publishGene)({
88
79
  name,
89
80
  domain: phenotype.domain || "unknown",
@@ -92,6 +83,7 @@ exports.publishCommand = new commander_1.Command("publish")
92
83
  description,
93
84
  phenotype,
94
85
  wasmBytes,
86
+ readme,
95
87
  });
96
88
  (0, node_fs_1.writeFileSync)((0, node_path_1.join)(geneDir, ".cloud-manifest.json"), JSON.stringify({
97
89
  cloud_id: result.id,
@@ -99,23 +91,187 @@ exports.publishCommand = new commander_1.Command("publish")
99
91
  version: result.version,
100
92
  published_at: new Date().toISOString(),
101
93
  }, null, 2) + "\n");
102
- console.log();
103
- display.success(`Gene '${name}' published to cloud!`);
104
- display.keyValue("ID", result.id);
105
- display.keyValue("Owner", result.owner);
106
- display.keyValue("Domain", result.domain);
107
- display.keyValue("Version", result.version);
108
- display.keyValue("Fidelity", result.fidelity);
109
- if (wasmBytes) {
110
- display.keyValue("WASM Size", `${(wasmBytes.length / 1024).toFixed(1)}KB`);
94
+ const status = result.isUpdate ? "updated" : "created";
95
+ if (!options.skipArena) {
96
+ try {
97
+ const defaultFitness = {
98
+ value: 0.5,
99
+ safety_score: 1.0,
100
+ success_rate: 1.0,
101
+ latency_score: 0.8,
102
+ resource_efficiency: 0.8,
103
+ };
104
+ await (0, client_js_1.arenaSubmit)(result.id, defaultFitness);
105
+ await (0, client_js_1.getGeneReputation)(result.id);
106
+ }
107
+ catch {
108
+ // Arena chain failure is non-fatal
109
+ }
111
110
  }
112
- console.log();
113
- display.info("Others can install it: rotifer install " + result.id);
114
- display.info("Submit to cloud Arena: rotifer arena submit --cloud " + name);
111
+ return { name, status };
115
112
  }
116
113
  catch (err) {
117
- display.error(err.message || "Publish failed");
114
+ return { name, status: "failed", error: err.message };
115
+ }
116
+ }
117
+ exports.publishCommand = new commander_1.Command("publish")
118
+ .description("Publish gene(s) to Rotifer Cloud")
119
+ .argument("[name]", "gene name to publish (omit when using --all)")
120
+ .option("--description <text>", "gene description")
121
+ .option("--skip-arena", "skip automatic Arena submission and reputation computation")
122
+ .option("--all", "publish all valid genes in the genes directory")
123
+ .action(async (name, options) => {
124
+ if (!name && !options.all) {
125
+ display.error("Provide a gene name or use --all to publish all genes.");
118
126
  process.exit(1);
119
127
  }
128
+ const root = (0, config_js_1.getProjectRoot)();
129
+ const config = (0, config_js_1.loadConfig)(root);
130
+ if (!options.all && name) {
131
+ const geneDir = (0, node_path_1.join)(root, config.genes_dir, name);
132
+ const phenotypePath = (0, node_path_1.join)(geneDir, "phenotype.json");
133
+ if (!(0, node_fs_1.existsSync)(phenotypePath)) {
134
+ display.rustStyleError({
135
+ code: "E0050",
136
+ message: `Gene '${name}' not found`,
137
+ file: phenotypePath,
138
+ suggestion: "Run 'rotifer wrap " + name + " --domain <domain>' first",
139
+ });
140
+ process.exit(1);
141
+ }
142
+ const phenotype = JSON.parse((0, node_fs_1.readFileSync)(phenotypePath, "utf-8"));
143
+ if (phenotype.fidelity === "Hybrid") {
144
+ const net = phenotype.network;
145
+ if (!net || !Array.isArray(net.allowedDomains) || net.allowedDomains.length === 0) {
146
+ display.rustStyleError({
147
+ code: "E0055",
148
+ message: `Hybrid gene '${name}' missing allowedDomains in network config`,
149
+ file: phenotypePath,
150
+ suggestion: "Add network.allowedDomains to phenotype.json",
151
+ });
152
+ process.exit(1);
153
+ }
154
+ const forbidden = /^(localhost|127\.\d+\.\d+\.\d+|10\.\d+\.\d+\.\d+|172\.(1[6-9]|2\d|3[01])\.\d+\.\d+|192\.168\.\d+\.\d+|0\.0\.0\.0|\[?::1\]?)$/;
155
+ for (const domain of net.allowedDomains) {
156
+ if (forbidden.test(domain)) {
157
+ display.rustStyleError({
158
+ code: "E0056",
159
+ message: `Hybrid gene '${name}' has forbidden domain: ${domain}`,
160
+ file: phenotypePath,
161
+ suggestion: "Remove private/local addresses from allowedDomains",
162
+ });
163
+ process.exit(1);
164
+ }
165
+ }
166
+ }
167
+ }
168
+ let creds;
169
+ try {
170
+ creds = await (0, auth_js_1.requireAuth)();
171
+ }
172
+ catch {
173
+ display.error("Not logged in. Run 'rotifer login' first.");
174
+ process.exit(1);
175
+ }
176
+ if (options.all) {
177
+ display.header("Publish All Genes");
178
+ display.info(`Publishing as ${creds.user.username}`);
179
+ const genesRoot = (0, node_path_1.join)(root, config.genes_dir);
180
+ const dirs = (0, node_fs_1.readdirSync)(genesRoot, { withFileTypes: true })
181
+ .filter((d) => d.isDirectory())
182
+ .map((d) => d.name)
183
+ .sort();
184
+ display.info(`Found ${dirs.length} directories in ${config.genes_dir}/`);
185
+ console.log();
186
+ const results = [];
187
+ for (let i = 0; i < dirs.length; i++) {
188
+ const geneName = dirs[i];
189
+ const geneDir = (0, node_path_1.join)(genesRoot, geneName);
190
+ const progress = `[${i + 1}/${dirs.length}]`;
191
+ process.stdout.write(`${progress} ${geneName}... `);
192
+ const result = await publishSingleGene(geneName, geneDir, creds, options, true);
193
+ results.push(result);
194
+ const statusIcon = result.status === "created" ? "✅ created" :
195
+ result.status === "updated" ? "✅ updated" :
196
+ result.status === "skipped" ? "⏭ skipped" :
197
+ `❌ ${result.error}`;
198
+ console.log(statusIcon);
199
+ }
200
+ // Update developer reputation once at the end
201
+ if (!options.skipArena) {
202
+ try {
203
+ await (0, client_js_1.getDeveloperReputation)(creds.user.id);
204
+ }
205
+ catch {
206
+ // non-fatal
207
+ }
208
+ }
209
+ console.log();
210
+ display.header("Summary");
211
+ const created = results.filter((r) => r.status === "created").length;
212
+ const updated = results.filter((r) => r.status === "updated").length;
213
+ const skipped = results.filter((r) => r.status === "skipped").length;
214
+ const failed = results.filter((r) => r.status === "failed").length;
215
+ display.keyValue("Created", String(created));
216
+ display.keyValue("Updated", String(updated));
217
+ display.keyValue("Skipped", String(skipped));
218
+ if (failed > 0) {
219
+ display.keyValue("Failed", String(failed));
220
+ console.log();
221
+ display.warn("Failed genes:");
222
+ for (const r of results.filter((r) => r.status === "failed")) {
223
+ display.error(` ${r.name}: ${r.error}`);
224
+ }
225
+ }
226
+ display.success(`${created + updated} published, ${skipped} skipped, ${failed} failed`);
227
+ }
228
+ else {
229
+ display.header("Publish to Cloud");
230
+ display.info(`Publishing as ${creds.user.username}`);
231
+ const geneDir = (0, node_path_1.join)(root, config.genes_dir, name);
232
+ const phenotypePath = (0, node_path_1.join)(geneDir, "phenotype.json");
233
+ if (!(0, node_fs_1.existsSync)(phenotypePath)) {
234
+ display.rustStyleError({
235
+ code: "E0050",
236
+ message: `Gene '${name}' not found`,
237
+ file: phenotypePath,
238
+ suggestion: "Run 'rotifer wrap " + name + " --domain <domain>' first",
239
+ });
240
+ process.exit(1);
241
+ }
242
+ const result = await publishSingleGene(name, geneDir, creds, options);
243
+ if (result.status === "failed") {
244
+ display.error(result.error || "Publish failed");
245
+ process.exit(1);
246
+ }
247
+ if (result.status === "skipped") {
248
+ display.warn(`Gene '${name}' skipped: ${result.error}`);
249
+ process.exit(0);
250
+ }
251
+ console.log();
252
+ const verb = result.status === "updated" ? "updated" : "created";
253
+ display.success(`Gene '${name}' ${verb} on cloud!`);
254
+ const manifestPath = (0, node_path_1.join)(geneDir, ".cloud-manifest.json");
255
+ if ((0, node_fs_1.existsSync)(manifestPath)) {
256
+ const manifest = JSON.parse((0, node_fs_1.readFileSync)(manifestPath, "utf-8"));
257
+ display.keyValue("ID", manifest.cloud_id);
258
+ display.keyValue("Owner", manifest.owner);
259
+ display.keyValue("Version", manifest.version);
260
+ display.keyValue("Status", result.status === "updated" ? "Updated existing" : "Newly created");
261
+ }
262
+ if (!options.skipArena) {
263
+ try {
264
+ const devRep = await (0, client_js_1.getDeveloperReputation)(creds.user.id);
265
+ display.keyValue("Developer Reputation", devRep.score.toFixed(4));
266
+ display.keyValue("Genes Published", String(devRep.genes_published));
267
+ }
268
+ catch {
269
+ // non-fatal
270
+ }
271
+ }
272
+ else {
273
+ display.info("Skipped Arena (--skip-arena). Run manually: rotifer arena submit --cloud " + name);
274
+ }
275
+ }
120
276
  });
121
277
  //# sourceMappingURL=publish.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"publish.js","sourceRoot":"","sources":["../../src/commands/publish.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"publish.js","sourceRoot":"","sources":["../../src/commands/publish.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../src/commands/test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,eAAO,MAAM,WAAW,SA0JpB,CAAC"}
1
+ {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../src/commands/test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,eAAO,MAAM,WAAW,SA+UpB,CAAC"}
@@ -45,10 +45,12 @@ const ajv_1 = __importDefault(require("ajv"));
45
45
  const display = __importStar(require("../utils/display.js"));
46
46
  const config_js_1 = require("../utils/config.js");
47
47
  const binding_js_1 = require("../utils/binding.js");
48
+ const network_gateway_js_1 = require("../runtime/network-gateway.js");
48
49
  exports.testCommand = new commander_1.Command("test")
49
50
  .description("Test a gene in L2 sandbox")
50
51
  .argument("[name]", "gene name to test")
51
52
  .option("--verbose", "show detailed output", false)
53
+ .option("--compliance", "run structural compliance checks", false)
52
54
  .action(async (name, options) => {
53
55
  const root = (0, config_js_1.getProjectRoot)();
54
56
  const config = (0, config_js_1.loadConfig)(root);
@@ -130,9 +132,63 @@ exports.testCommand = new commander_1.Command("test")
130
132
  failed++;
131
133
  display.error(" No gene source file found (index.ts / index.js)");
132
134
  }
133
- // --- Test 6: L2 Sandbox execution (real express() call) ---
134
- display.info("Test 6: L2 Sandbox — express() Execution");
135
- if (srcFile) {
135
+ // --- Test 6: Sandbox execution ---
136
+ const irWasmPath = (0, node_path_1.join)(geneDir, "gene.ir.wasm");
137
+ const hasIrWasm = (0, node_fs_1.existsSync)(irWasmPath);
138
+ const binding = (0, binding_js_1.tryLoadBinding)();
139
+ if (hasIrWasm && binding) {
140
+ // WASM sandbox path — preferred for compiled genes
141
+ display.info("Test 6: WASM Sandbox — executeGene() Execution");
142
+ try {
143
+ const irWasm = (0, node_fs_1.readFileSync)(irWasmPath);
144
+ const result = binding.executeGene(irWasm, JSON.stringify(testInput), JSON.stringify(phenotype));
145
+ if (result.success) {
146
+ passed++;
147
+ display.success(` executeGene() succeeded (${result.durationMs}ms, fuel: ${result.fuelConsumed})`);
148
+ if (options.verbose) {
149
+ display.info(" Input: " + JSON.stringify(testInput));
150
+ display.info(" Output: " + JSON.stringify(result.output).slice(0, 200));
151
+ display.info(` Sandbox: ${result.sandboxType}`);
152
+ }
153
+ // --- Test 7: Output conforms to outputSchema ---
154
+ display.info("Test 7: Output Schema Conformance");
155
+ if (outputValidator && outputValidator(result.output)) {
156
+ passed++;
157
+ display.success(" Output conforms to outputSchema");
158
+ }
159
+ else if (outputValidator) {
160
+ failed++;
161
+ display.error(" Output does not conform to outputSchema");
162
+ if (options.verbose && outputValidator.errors) {
163
+ for (const err of outputValidator.errors) {
164
+ display.error(` ${err.instancePath}: ${err.message}`);
165
+ }
166
+ }
167
+ }
168
+ else {
169
+ passed++;
170
+ display.success(" Output schema check skipped (no validator)");
171
+ }
172
+ }
173
+ else {
174
+ failed++;
175
+ display.error(" executeGene() failed: " + result.errorMessage);
176
+ }
177
+ }
178
+ catch (err) {
179
+ failed++;
180
+ display.error(" WASM sandbox execution error: " + err.message);
181
+ }
182
+ }
183
+ else if (srcFile) {
184
+ // Node.js fallback path — for uncompiled (Wrapped) genes
185
+ display.info("Test 6: Node.js Fallback — express() Execution");
186
+ if (hasIrWasm) {
187
+ display.warn(" ⚠ Native addon not available — falling back to Node.js");
188
+ }
189
+ else {
190
+ display.warn(" ⚠ Running without sandbox — run 'rotifer compile " + name + "' first");
191
+ }
136
192
  try {
137
193
  const absPath = (0, node_path_1.resolve)(geneDir, srcFile);
138
194
  const mod = await import((0, node_url_1.pathToFileURL)(absPath).href);
@@ -141,8 +197,19 @@ exports.testCommand = new commander_1.Command("test")
141
197
  display.error(" Gene does not export an 'express' function");
142
198
  }
143
199
  else {
200
+ const isHybrid = phenotype.fidelity === "Hybrid" && phenotype.network;
201
+ let result;
202
+ let gatewayStats = null;
144
203
  const start = performance.now();
145
- const result = await mod.express(testInput);
204
+ if (isHybrid) {
205
+ const { gatewayFetch, gateway } = (0, network_gateway_js_1.createGatewayFetch)(phenotype.network);
206
+ display.info(` Hybrid Gene — gateway active (domains: ${phenotype.network.allowedDomains?.join(", ") || "none"})`);
207
+ result = await mod.express(testInput, { gatewayFetch });
208
+ gatewayStats = gateway.stats;
209
+ }
210
+ else {
211
+ result = await mod.express(testInput);
212
+ }
146
213
  const elapsed = performance.now() - start;
147
214
  if (result === undefined || result === null) {
148
215
  failed++;
@@ -154,6 +221,9 @@ exports.testCommand = new commander_1.Command("test")
154
221
  if (options.verbose) {
155
222
  display.info(" Input: " + JSON.stringify(testInput));
156
223
  display.info(" Output: " + JSON.stringify(result).slice(0, 200));
224
+ if (gatewayStats) {
225
+ display.info(` Gateway: ${gatewayStats.totalRequests} requests, ${gatewayStats.totalBytes} bytes`);
226
+ }
157
227
  }
158
228
  // --- Test 7: Output conforms to outputSchema ---
159
229
  display.info("Test 7: Output Schema Conformance");
@@ -183,13 +253,11 @@ exports.testCommand = new commander_1.Command("test")
183
253
  }
184
254
  }
185
255
  else {
186
- display.warn(" Skipped — no source file");
256
+ display.warn(" Skipped — no source file or compiled WASM");
187
257
  }
188
258
  // --- Test 8: IR verification (if gene.ir.wasm exists) ---
189
- const irWasmPath = (0, node_path_1.join)(geneDir, "gene.ir.wasm");
190
- if ((0, node_fs_1.existsSync)(irWasmPath)) {
259
+ if (hasIrWasm) {
191
260
  display.info("Test 8: IR Module Verification");
192
- const binding = (0, binding_js_1.tryLoadBinding)();
193
261
  if (binding) {
194
262
  const irWasm = (0, node_fs_1.readFileSync)(irWasmPath);
195
263
  const verifyResult = binding.verifyIrModule(irWasm);
@@ -210,6 +278,109 @@ exports.testCommand = new commander_1.Command("test")
210
278
  display.warn(" Skipped — native addon not available");
211
279
  }
212
280
  }
281
+ // --- Compliance Tests (optional, --compliance flag) ---
282
+ if (options.compliance) {
283
+ console.log();
284
+ display.header("Compliance Checks (v0.5.5)");
285
+ // C1: Sandbox execution verification
286
+ display.info("C1: Sandbox Execution Verification");
287
+ if (hasIrWasm && binding) {
288
+ const irWasm = (0, node_fs_1.readFileSync)(irWasmPath);
289
+ const result = binding.executeGene(irWasm, JSON.stringify(testInput), JSON.stringify(phenotype));
290
+ if (result.success && result.sandboxType === "wasm") {
291
+ passed++;
292
+ display.success(" Native gene executed through WASM sandbox");
293
+ }
294
+ else {
295
+ failed++;
296
+ display.error(` Sandbox type: ${result.sandboxType}, expected: wasm`);
297
+ }
298
+ }
299
+ else {
300
+ display.warn(" Skipped — no compiled WASM or native addon");
301
+ }
302
+ // C2: Fuel consumption verification
303
+ display.info("C2: Fuel Consumption Verification");
304
+ if (hasIrWasm && binding) {
305
+ const irWasm = (0, node_fs_1.readFileSync)(irWasmPath);
306
+ const result = binding.executeGene(irWasm, JSON.stringify(testInput), JSON.stringify(phenotype));
307
+ if (result.fuelConsumed > 0) {
308
+ passed++;
309
+ display.success(` Fuel consumed: ${result.fuelConsumed} units`);
310
+ }
311
+ else {
312
+ failed++;
313
+ display.error(" fuel_consumed is 0 — sandbox may not be metering");
314
+ }
315
+ }
316
+ else {
317
+ display.warn(" Skipped — no compiled WASM or native addon");
318
+ }
319
+ // C3: L0Gate check
320
+ display.info("C3: L0Gate Pre-execution Check");
321
+ if (binding) {
322
+ const l0Result = binding.l0Check(JSON.stringify(phenotype));
323
+ if (l0Result.passed) {
324
+ passed++;
325
+ display.success(` L0Gate: PASS (${l0Result.checksPerformed} checks)`);
326
+ }
327
+ else {
328
+ failed++;
329
+ display.error(` L0Gate violations: ${l0Result.violations.join("; ")}`);
330
+ }
331
+ }
332
+ else {
333
+ display.warn(" Skipped — native addon not available");
334
+ }
335
+ // C4: Phenotype completeness
336
+ display.info("C4: Phenotype Compliance (Gene Standard)");
337
+ const requiredPhenotypeFields = [
338
+ "domain", "inputSchema", "outputSchema", "version", "fidelity",
339
+ ];
340
+ const missingFields = requiredPhenotypeFields.filter((f) => !(f in phenotype));
341
+ if (missingFields.length === 0) {
342
+ passed++;
343
+ display.success(" All required phenotype fields present");
344
+ }
345
+ else {
346
+ failed++;
347
+ display.error(` Missing fields: ${missingFields.join(", ")}`);
348
+ }
349
+ // C5: F(g) computability
350
+ display.info("C5: Fitness Score Computability");
351
+ if (hasIrWasm && binding) {
352
+ const irWasm = (0, node_fs_1.readFileSync)(irWasmPath);
353
+ const result = binding.executeGene(irWasm, JSON.stringify(testInput), JSON.stringify(phenotype));
354
+ if (result.success && result.fuelConsumed > 0 && result.durationMs >= 0) {
355
+ passed++;
356
+ display.success(" All F(g) input metrics available");
357
+ }
358
+ else {
359
+ failed++;
360
+ display.error(" Cannot compute F(g) — missing execution metrics");
361
+ }
362
+ }
363
+ else {
364
+ display.warn(" Skipped — no compiled WASM or native addon");
365
+ }
366
+ // C6: IR segment integrity
367
+ display.info("C6: IR Segment Integrity");
368
+ if (hasIrWasm && binding) {
369
+ const irWasm = (0, node_fs_1.readFileSync)(irWasmPath);
370
+ const verifyResult = binding.verifyIrModule(irWasm);
371
+ if (verifyResult === "PASS") {
372
+ passed++;
373
+ display.success(" IR module contains all required custom sections");
374
+ }
375
+ else {
376
+ failed++;
377
+ display.error(" IR verification: " + verifyResult);
378
+ }
379
+ }
380
+ else {
381
+ display.warn(" Skipped — no compiled WASM or native addon");
382
+ }
383
+ }
213
384
  // --- Summary ---
214
385
  console.log();
215
386
  const total = passed + failed;
@@ -236,21 +407,36 @@ function generateTestInput(schema) {
236
407
  const result = {};
237
408
  const properties = (schema.properties || {});
238
409
  for (const [key, prop] of Object.entries(properties)) {
239
- switch (prop.type) {
240
- case "string":
241
- result[key] = "test_value";
242
- break;
243
- case "number":
244
- case "integer":
245
- result[key] = 42;
246
- break;
247
- case "boolean":
248
- result[key] = true;
249
- break;
250
- case "array":
251
- result[key] = [];
252
- break;
253
- default: result[key] = null;
410
+ const enumVal = prop.enum;
411
+ if (Array.isArray(enumVal) && enumVal.length > 0) {
412
+ result[key] = enumVal[0];
413
+ }
414
+ else if (prop.default !== undefined) {
415
+ result[key] = prop.default;
416
+ }
417
+ else {
418
+ switch (prop.type) {
419
+ case "string":
420
+ result[key] = "test_value";
421
+ break;
422
+ case "number":
423
+ case "integer": {
424
+ const min = typeof prop.minimum === "number" ? prop.minimum : 0;
425
+ const max = typeof prop.maximum === "number" ? prop.maximum : min + 10;
426
+ result[key] = Math.floor((min + max) / 2) || 1;
427
+ break;
428
+ }
429
+ case "boolean":
430
+ result[key] = true;
431
+ break;
432
+ case "array":
433
+ result[key] = [];
434
+ break;
435
+ case "object":
436
+ result[key] = {};
437
+ break;
438
+ default: result[key] = null;
439
+ }
254
440
  }
255
441
  }
256
442
  return result;