scientify 1.3.0 → 1.4.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 (50) hide show
  1. package/README.md +38 -14
  2. package/README.zh.md +38 -15
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +21 -2
  5. package/dist/index.js.map +1 -1
  6. package/dist/src/services/auto-updater.d.ts +15 -0
  7. package/dist/src/services/auto-updater.d.ts.map +1 -0
  8. package/dist/src/services/auto-updater.js +188 -0
  9. package/dist/src/services/auto-updater.js.map +1 -0
  10. package/dist/src/tools/arxiv-download.d.ts +25 -0
  11. package/dist/src/tools/arxiv-download.d.ts.map +1 -0
  12. package/dist/src/tools/arxiv-download.js +179 -0
  13. package/dist/src/tools/arxiv-download.js.map +1 -0
  14. package/dist/src/tools/{arxiv-tool.d.ts → arxiv-search.d.ts} +11 -8
  15. package/dist/src/tools/arxiv-search.d.ts.map +1 -0
  16. package/dist/src/tools/arxiv-search.js +140 -0
  17. package/dist/src/tools/arxiv-search.js.map +1 -0
  18. package/dist/src/tools/github-search-tool.d.ts +5 -1
  19. package/dist/src/tools/github-search-tool.d.ts.map +1 -1
  20. package/dist/src/tools/github-search-tool.js +10 -30
  21. package/dist/src/tools/github-search-tool.js.map +1 -1
  22. package/dist/src/tools/result.d.ts +37 -0
  23. package/dist/src/tools/result.d.ts.map +1 -0
  24. package/dist/src/tools/result.js +39 -0
  25. package/dist/src/tools/result.js.map +1 -0
  26. package/dist/src/tools/workspace.d.ts +32 -0
  27. package/dist/src/tools/workspace.d.ts.map +1 -0
  28. package/dist/src/tools/workspace.js +69 -0
  29. package/dist/src/tools/workspace.js.map +1 -0
  30. package/openclaw.plugin.json +22 -1
  31. package/package.json +13 -2
  32. package/skills/_shared/workspace-spec.md +15 -5
  33. package/skills/idea-generation/SKILL.md +2 -0
  34. package/skills/install-scientify/SKILL.md +17 -17
  35. package/skills/literature-survey/SKILL.md +86 -214
  36. package/skills/research-experiment/SKILL.md +114 -0
  37. package/skills/research-implement/SKILL.md +166 -0
  38. package/skills/research-pipeline/SKILL.md +104 -166
  39. package/skills/research-plan/SKILL.md +121 -0
  40. package/skills/research-review/SKILL.md +110 -0
  41. package/skills/research-survey/SKILL.md +140 -0
  42. package/skills/write-review-paper/SKILL.md +2 -0
  43. package/dist/src/tools/arxiv-tool.d.ts.map +0 -1
  44. package/dist/src/tools/arxiv-tool.js +0 -258
  45. package/dist/src/tools/arxiv-tool.js.map +0 -1
  46. package/skills/research-pipeline/references/prompts/implement.md +0 -135
  47. package/skills/research-pipeline/references/prompts/plan.md +0 -142
  48. package/skills/research-pipeline/references/prompts/review.md +0 -118
  49. package/skills/research-pipeline/references/prompts/survey.md +0 -105
  50. package/skills/research-pipeline/references/workspace-spec.md +0 -5
@@ -1,12 +1,13 @@
1
- export declare const ArxivToolSchema: import("@sinclair/typebox").TObject<{
1
+ export declare const ArxivSearchSchema: import("@sinclair/typebox").TObject<{
2
2
  query: import("@sinclair/typebox").TString;
3
3
  max_results: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
4
4
  sort_by: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
5
5
  date_from: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
6
- download: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
7
- output_dir: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
8
6
  }>;
9
- export declare function createArxivTool(): {
7
+ /**
8
+ * arxiv_search: Search arXiv papers. Pure function, no side effects.
9
+ */
10
+ export declare function createArxivSearchTool(): {
10
11
  label: string;
11
12
  name: string;
12
13
  description: string;
@@ -15,12 +16,14 @@ export declare function createArxivTool(): {
15
16
  max_results: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
16
17
  sort_by: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
17
18
  date_from: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
18
- download: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
19
- output_dir: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
20
19
  }>;
21
20
  execute: (_toolCallId: string, rawArgs: unknown) => Promise<{
22
21
  type: "tool_result";
23
- content: string;
22
+ content: {
23
+ type: "text";
24
+ text: string;
25
+ }[];
26
+ isError?: boolean;
24
27
  }>;
25
28
  };
26
- //# sourceMappingURL=arxiv-tool.d.ts.map
29
+ //# sourceMappingURL=arxiv-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arxiv-search.d.ts","sourceRoot":"","sources":["../../../src/tools/arxiv-search.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,iBAAiB;;;;;EAmB5B,CAAC;AAkGH;;GAEG;AACH,wBAAgB,qBAAqB;;;;;;;;;;2BAMJ,MAAM,WAAW,OAAO;;;;;;;;EA0CxD"}
@@ -0,0 +1,140 @@
1
+ import { Type } from "@sinclair/typebox";
2
+ import { Result } from "./result.js";
3
+ const ARXIV_API_URL = "https://export.arxiv.org/api/query";
4
+ const DEFAULT_MAX_RESULTS = 10;
5
+ const MAX_RESULTS_LIMIT = 50;
6
+ export const ArxivSearchSchema = Type.Object({
7
+ query: Type.String({ description: "Search query for arXiv papers (e.g. 'graph neural network')." }),
8
+ max_results: Type.Optional(Type.Number({
9
+ description: "Maximum number of results to return (1-50). Default: 10.",
10
+ minimum: 1,
11
+ maximum: MAX_RESULTS_LIMIT,
12
+ })),
13
+ sort_by: Type.Optional(Type.String({
14
+ description: 'Sort order: "relevance" (default), "lastUpdatedDate", or "submittedDate".',
15
+ })),
16
+ date_from: Type.Optional(Type.String({
17
+ description: "Filter papers submitted after this date (YYYY-MM-DD).",
18
+ })),
19
+ });
20
+ const SORT_MAP = {
21
+ relevance: "relevance",
22
+ lastupdateddate: "lastUpdatedDate",
23
+ submitteddate: "submittedDate",
24
+ };
25
+ function readStringParam(params, key, opts) {
26
+ const value = params[key];
27
+ if (value === undefined || value === null) {
28
+ if (opts?.required) {
29
+ throw new Error(`Missing required parameter: ${key}`);
30
+ }
31
+ return undefined;
32
+ }
33
+ return String(value);
34
+ }
35
+ function readNumberParam(params, key, opts) {
36
+ const value = params[key];
37
+ if (value === undefined || value === null)
38
+ return undefined;
39
+ const num = Number(value);
40
+ if (isNaN(num))
41
+ return undefined;
42
+ return opts?.integer ? Math.floor(num) : num;
43
+ }
44
+ function buildSearchUrl(query, maxResults, sortBy, dateFrom) {
45
+ let searchQuery = query;
46
+ if (dateFrom) {
47
+ const dateFormatted = dateFrom.replace(/-/g, "");
48
+ searchQuery = `${query} AND submittedDate:[${dateFormatted}0000 TO 99991231]`;
49
+ }
50
+ const params = new URLSearchParams({
51
+ search_query: searchQuery,
52
+ start: "0",
53
+ max_results: String(maxResults),
54
+ sortBy,
55
+ sortOrder: "descending",
56
+ });
57
+ return `${ARXIV_API_URL}?${params.toString()}`;
58
+ }
59
+ function parseAtomXml(xml) {
60
+ const papers = [];
61
+ const entryRegex = /<entry>([\s\S]*?)<\/entry>/g;
62
+ let match;
63
+ while ((match = entryRegex.exec(xml)) !== null) {
64
+ const entry = match[1];
65
+ const getTag = (tag) => {
66
+ const m = entry.match(new RegExp(`<${tag}[^>]*>([\\s\\S]*?)<\\/${tag}>`));
67
+ return m ? m[1].trim() : "";
68
+ };
69
+ const title = getTag("title").replace(/\s+/g, " ");
70
+ const abstract = getTag("summary").replace(/\s+/g, " ");
71
+ const published = getTag("published");
72
+ const updated = getTag("updated");
73
+ const idUrl = getTag("id");
74
+ const arxivId = idUrl.replace("http://arxiv.org/abs/", "").replace(/v\d+$/, "");
75
+ const authors = [];
76
+ const authorRegex = /<author>\s*<name>([^<]+)<\/name>/g;
77
+ let authorMatch;
78
+ while ((authorMatch = authorRegex.exec(entry)) !== null) {
79
+ authors.push(authorMatch[1].trim());
80
+ }
81
+ const pdfMatch = entry.match(/<link[^>]+title="pdf"[^>]+href="([^"]+)"/);
82
+ const pdfUrl = pdfMatch ? pdfMatch[1] : `https://arxiv.org/pdf/${arxivId}`;
83
+ const categories = [];
84
+ const catRegex = /<category[^>]+term="([^"]+)"/g;
85
+ let catMatch;
86
+ while ((catMatch = catRegex.exec(entry)) !== null) {
87
+ categories.push(catMatch[1]);
88
+ }
89
+ if (title && arxivId) {
90
+ papers.push({ title, authors, abstract, arxivId, pdfUrl, published, updated, categories });
91
+ }
92
+ }
93
+ return papers;
94
+ }
95
+ /**
96
+ * arxiv_search: Search arXiv papers. Pure function, no side effects.
97
+ */
98
+ export function createArxivSearchTool() {
99
+ return {
100
+ label: "ArXiv Search",
101
+ name: "arxiv_search",
102
+ description: "Search arXiv.org for academic papers. Returns paper metadata (title, authors, abstract, arxiv_id). Does NOT download files.",
103
+ parameters: ArxivSearchSchema,
104
+ execute: async (_toolCallId, rawArgs) => {
105
+ const params = rawArgs;
106
+ const query = readStringParam(params, "query", { required: true });
107
+ const maxResults = Math.min(readNumberParam(params, "max_results", { integer: true }) ?? DEFAULT_MAX_RESULTS, MAX_RESULTS_LIMIT);
108
+ const rawSort = readStringParam(params, "sort_by") ?? "relevance";
109
+ const sortBy = SORT_MAP[rawSort.toLowerCase()] ?? "relevance";
110
+ const dateFrom = readStringParam(params, "date_from");
111
+ const url = buildSearchUrl(query, maxResults, sortBy, dateFrom);
112
+ let response;
113
+ try {
114
+ response = await fetch(url);
115
+ }
116
+ catch (error) {
117
+ return Result.err("network_error", `Failed to reach arXiv API: ${error instanceof Error ? error.message : String(error)}`);
118
+ }
119
+ if (!response.ok) {
120
+ return Result.err("api_error", `arXiv API returned ${response.status}: ${response.statusText}`);
121
+ }
122
+ const xml = await response.text();
123
+ const papers = parseAtomXml(xml);
124
+ return Result.ok({
125
+ query,
126
+ total: papers.length,
127
+ papers: papers.map((p) => ({
128
+ title: p.title,
129
+ authors: p.authors,
130
+ abstract: p.abstract,
131
+ arxiv_id: p.arxivId,
132
+ pdf_url: p.pdfUrl,
133
+ published: p.published,
134
+ categories: p.categories,
135
+ })),
136
+ });
137
+ },
138
+ };
139
+ }
140
+ //# sourceMappingURL=arxiv-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arxiv-search.js","sourceRoot":"","sources":["../../../src/tools/arxiv-search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,aAAa,GAAG,oCAAoC,CAAC;AAC3D,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAC/B,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAE7B,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC,MAAM,CAAC;IAC3C,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,8DAA8D,EAAE,CAAC;IACnG,WAAW,EAAE,IAAI,CAAC,QAAQ,CACxB,IAAI,CAAC,MAAM,CAAC;QACV,WAAW,EAAE,0DAA0D;QACvE,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,iBAAiB;KAC3B,CAAC,CACH;IACD,OAAO,EAAE,IAAI,CAAC,QAAQ,CACpB,IAAI,CAAC,MAAM,CAAC;QACV,WAAW,EAAE,2EAA2E;KACzF,CAAC,CACH;IACD,SAAS,EAAE,IAAI,CAAC,QAAQ,CACtB,IAAI,CAAC,MAAM,CAAC;QACV,WAAW,EAAE,uDAAuD;KACrE,CAAC,CACH;CACF,CAAC,CAAC;AAaH,MAAM,QAAQ,GAA2B;IACvC,SAAS,EAAE,WAAW;IACtB,eAAe,EAAE,iBAAiB;IAClC,aAAa,EAAE,eAAe;CAC/B,CAAC;AAEF,SAAS,eAAe,CAAC,MAA+B,EAAE,GAAW,EAAE,IAA6B;IAClG,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAC1C,IAAI,IAAI,EAAE,QAAQ,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,+BAA+B,GAAG,EAAE,CAAC,CAAC;QACxD,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC;AAED,SAAS,eAAe,CAAC,MAA+B,EAAE,GAAW,EAAE,IAA4B;IACjG,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5D,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC1B,IAAI,KAAK,CAAC,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IACjC,OAAO,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AAC/C,CAAC;AAED,SAAS,cAAc,CAAC,KAAa,EAAE,UAAkB,EAAE,MAAc,EAAE,QAAiB;IAC1F,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACjD,WAAW,GAAG,GAAG,KAAK,uBAAuB,aAAa,mBAAmB,CAAC;IAChF,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;QACjC,YAAY,EAAE,WAAW;QACzB,KAAK,EAAE,GAAG;QACV,WAAW,EAAE,MAAM,CAAC,UAAU,CAAC;QAC/B,MAAM;QACN,SAAS,EAAE,YAAY;KACxB,CAAC,CAAC;IACH,OAAO,GAAG,aAAa,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;AACjD,CAAC;AAED,SAAS,YAAY,CAAC,GAAW;IAC/B,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,MAAM,UAAU,GAAG,6BAA6B,CAAC;IACjD,IAAI,KAA6B,CAAC;IAElC,OAAO,CAAC,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC/C,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACvB,MAAM,MAAM,GAAG,CAAC,GAAW,EAAE,EAAE;YAC7B,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,GAAG,yBAAyB,GAAG,GAAG,CAAC,CAAC,CAAC;YAC1E,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9B,CAAC,CAAC;QAEF,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACnD,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACxD,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;QACtC,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;QAElC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAC3B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,uBAAuB,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAEhF,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,MAAM,WAAW,GAAG,mCAAmC,CAAC;QACxD,IAAI,WAAmC,CAAC;QACxC,OAAO,CAAC,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACxD,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACtC,CAAC;QAED,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;QACzE,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,yBAAyB,OAAO,EAAE,CAAC;QAE3E,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,+BAA+B,CAAC;QACjD,IAAI,QAAgC,CAAC;QACrC,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAClD,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/B,CAAC;QAED,IAAI,KAAK,IAAI,OAAO,EAAE,CAAC;YACrB,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;QAC7F,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB;IACnC,OAAO;QACL,KAAK,EAAE,cAAc;QACrB,IAAI,EAAE,cAAc;QACpB,WAAW,EAAE,6HAA6H;QAC1I,UAAU,EAAE,iBAAiB;QAC7B,OAAO,EAAE,KAAK,EAAE,WAAmB,EAAE,OAAgB,EAAE,EAAE;YACvD,MAAM,MAAM,GAAG,OAAkC,CAAC;YAClD,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAE,CAAC;YACpE,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CACzB,eAAe,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,IAAI,mBAAmB,EAChF,iBAAiB,CAClB,CAAC;YACF,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,WAAW,CAAC;YAClE,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,IAAI,WAAW,CAAC;YAC9D,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YAEtD,MAAM,GAAG,GAAG,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;YAEhE,IAAI,QAAkB,CAAC;YACvB,IAAI,CAAC;gBACH,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;YAC9B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,MAAM,CAAC,GAAG,CAAC,eAAe,EAAE,8BAA8B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC7H,CAAC;YAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,OAAO,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,sBAAsB,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;YAClG,CAAC;YAED,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;YAEjC,OAAO,MAAM,CAAC,EAAE,CAAC;gBACf,KAAK;gBACL,KAAK,EAAE,MAAM,CAAC,MAAM;gBACpB,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACzB,KAAK,EAAE,CAAC,CAAC,KAAK;oBACd,OAAO,EAAE,CAAC,CAAC,OAAO;oBAClB,QAAQ,EAAE,CAAC,CAAC,QAAQ;oBACpB,QAAQ,EAAE,CAAC,CAAC,OAAO;oBACnB,OAAO,EAAE,CAAC,CAAC,MAAM;oBACjB,SAAS,EAAE,CAAC,CAAC,SAAS;oBACtB,UAAU,EAAE,CAAC,CAAC,UAAU;iBACzB,CAAC,CAAC;aACJ,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -16,7 +16,11 @@ export declare function createGithubSearchTool(): {
16
16
  }>;
17
17
  execute: (_toolCallId: string, rawArgs: unknown) => Promise<{
18
18
  type: "tool_result";
19
- content: string;
19
+ content: {
20
+ type: "text";
21
+ text: string;
22
+ }[];
23
+ isError?: boolean;
20
24
  }>;
21
25
  };
22
26
  //# sourceMappingURL=github-search-tool.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"github-search-tool.d.ts","sourceRoot":"","sources":["../../../src/tools/github-search-tool.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,sBAAsB;;;;;EAqBjC,CAAC;AAyCH,wBAAgB,sBAAsB;;;;;;;;;;2BAOL,MAAM,WAAW,OAAO;;;;EA4FxD"}
1
+ {"version":3,"file":"github-search-tool.d.ts","sourceRoot":"","sources":["../../../src/tools/github-search-tool.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,sBAAsB;;;;;EAqBjC,CAAC;AAyCH,wBAAgB,sBAAsB;;;;;;;;;;2BAOL,MAAM,WAAW,OAAO;;;;;;;;EAsExD"}
@@ -1,4 +1,5 @@
1
1
  import { Type } from "@sinclair/typebox";
2
+ import { Result } from "./result.js";
2
3
  const GITHUB_SEARCH_API = "https://api.github.com/search/repositories";
3
4
  const DEFAULT_MAX_RESULTS = 10;
4
5
  const MAX_RESULTS_LIMIT = 30;
@@ -83,31 +84,13 @@ export function createGithubSearchTool() {
83
84
  response = await fetch(url, { headers });
84
85
  }
85
86
  catch (error) {
86
- return {
87
- type: "tool_result",
88
- content: JSON.stringify({
89
- error: "network_error",
90
- message: `Failed to reach GitHub API: ${error instanceof Error ? error.message : String(error)}`,
91
- }),
92
- };
87
+ return Result.err("network_error", `Failed to reach GitHub API: ${error instanceof Error ? error.message : String(error)}`);
93
88
  }
94
89
  if (response.status === 403) {
95
- return {
96
- type: "tool_result",
97
- content: JSON.stringify({
98
- error: "rate_limited",
99
- message: "GitHub API rate limit exceeded. Set GITHUB_TOKEN environment variable for higher limits.",
100
- }),
101
- };
90
+ return Result.err("rate_limited", "GitHub API rate limit exceeded. Set GITHUB_TOKEN environment variable for higher limits.");
102
91
  }
103
92
  if (!response.ok) {
104
- return {
105
- type: "tool_result",
106
- content: JSON.stringify({
107
- error: "api_error",
108
- message: `GitHub API returned ${response.status}: ${response.statusText}`,
109
- }),
110
- };
93
+ return Result.err("api_error", `GitHub API returned ${response.status}: ${response.statusText}`);
111
94
  }
112
95
  const data = (await response.json());
113
96
  const repos = (data.items ?? []).map((repo) => ({
@@ -119,15 +102,12 @@ export function createGithubSearchTool() {
119
102
  updated: repo.updated_at,
120
103
  topics: repo.topics ?? [],
121
104
  }));
122
- return {
123
- type: "tool_result",
124
- content: JSON.stringify({
125
- query,
126
- total_count: data.total_count ?? 0,
127
- returned: repos.length,
128
- repos,
129
- }),
130
- };
105
+ return Result.ok({
106
+ query,
107
+ total_count: data.total_count ?? 0,
108
+ returned: repos.length,
109
+ repos,
110
+ });
131
111
  },
132
112
  };
133
113
  }
@@ -1 +1 @@
1
- {"version":3,"file":"github-search-tool.js","sourceRoot":"","sources":["../../../src/tools/github-search-tool.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"github-search-tool.js","sourceRoot":"","sources":["../../../src/tools/github-search-tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Tool result helpers for pi-ai compatibility.
3
+ *
4
+ * pi-ai expects tool results in format:
5
+ * { type: "tool_result", content: [{ type: "text", text: string }] }
6
+ */
7
+ type ToolResultContent = {
8
+ type: "text";
9
+ text: string;
10
+ };
11
+ type ToolResult = {
12
+ type: "tool_result";
13
+ content: ToolResultContent[];
14
+ isError?: boolean;
15
+ };
16
+ /**
17
+ * Create a successful tool result with JSON data.
18
+ */
19
+ export declare function ok<T extends Record<string, unknown>>(data: T): ToolResult;
20
+ /**
21
+ * Create an error tool result.
22
+ */
23
+ export declare function err(code: string, message: string): ToolResult;
24
+ /**
25
+ * Create a tool result with plain text (no JSON).
26
+ */
27
+ export declare function text(content: string): ToolResult;
28
+ /**
29
+ * Namespace for cleaner imports: `import { Result } from "./result.js"`
30
+ */
31
+ export declare const Result: {
32
+ ok: typeof ok;
33
+ err: typeof err;
34
+ text: typeof text;
35
+ };
36
+ export {};
37
+ //# sourceMappingURL=result.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../../../src/tools/result.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,KAAK,iBAAiB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAExD,KAAK,UAAU,GAAG;IAChB,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF;;GAEG;AACH,wBAAgB,EAAE,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,UAAU,CAKzE;AAED;;GAEG;AACH,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,UAAU,CAM7D;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CAKhD;AAED;;GAEG;AACH,eAAO,MAAM,MAAM;;;;CAAoB,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Tool result helpers for pi-ai compatibility.
3
+ *
4
+ * pi-ai expects tool results in format:
5
+ * { type: "tool_result", content: [{ type: "text", text: string }] }
6
+ */
7
+ /**
8
+ * Create a successful tool result with JSON data.
9
+ */
10
+ export function ok(data) {
11
+ return {
12
+ type: "tool_result",
13
+ content: [{ type: "text", text: JSON.stringify(data) }],
14
+ };
15
+ }
16
+ /**
17
+ * Create an error tool result.
18
+ */
19
+ export function err(code, message) {
20
+ return {
21
+ type: "tool_result",
22
+ content: [{ type: "text", text: JSON.stringify({ error: code, message }) }],
23
+ isError: true,
24
+ };
25
+ }
26
+ /**
27
+ * Create a tool result with plain text (no JSON).
28
+ */
29
+ export function text(content) {
30
+ return {
31
+ type: "tool_result",
32
+ content: [{ type: "text", text: content }],
33
+ };
34
+ }
35
+ /**
36
+ * Namespace for cleaner imports: `import { Result } from "./result.js"`
37
+ */
38
+ export const Result = { ok, err, text };
39
+ //# sourceMappingURL=result.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result.js","sourceRoot":"","sources":["../../../src/tools/result.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH;;GAEG;AACH,MAAM,UAAU,EAAE,CAAoC,IAAO;IAC3D,OAAO;QACL,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;KACxD,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,OAAe;IAC/C,OAAO;QACL,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;QAC3E,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,IAAI,CAAC,OAAe;IAClC,OAAO;QACL,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;KAC3C,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC"}
@@ -0,0 +1,32 @@
1
+ export declare class NoActiveProjectError extends Error {
2
+ constructor();
3
+ }
4
+ /**
5
+ * Get the active project ID.
6
+ * @throws NoActiveProjectError if no project is active
7
+ */
8
+ export declare function getActiveProject(): string;
9
+ /**
10
+ * Get the active project's root directory.
11
+ * @throws NoActiveProjectError if no project is active
12
+ */
13
+ export declare function getActiveProjectDir(): string;
14
+ /**
15
+ * Get a subdirectory of the active project.
16
+ * @param subdir - Subdirectory name (e.g., "papers", "survey", "ideas")
17
+ * @throws NoActiveProjectError if no project is active
18
+ */
19
+ export declare function getProjectSubdir(subdir: string): string;
20
+ /**
21
+ * Check if there's an active project without throwing.
22
+ */
23
+ export declare function hasActiveProject(): boolean;
24
+ export declare const Workspace: {
25
+ root: string;
26
+ getActiveProject: typeof getActiveProject;
27
+ getActiveProjectDir: typeof getActiveProjectDir;
28
+ getProjectSubdir: typeof getProjectSubdir;
29
+ hasActiveProject: typeof hasActiveProject;
30
+ NoActiveProjectError: typeof NoActiveProjectError;
31
+ };
32
+ //# sourceMappingURL=workspace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../../src/tools/workspace.ts"],"names":[],"mappings":"AASA,qBAAa,oBAAqB,SAAQ,KAAK;;CAU9C;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAWzC;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAO1C;AAED,eAAO,MAAM,SAAS;;;;;;;CAOrB,CAAC"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Workspace utilities for tools that need to access project directories.
3
+ */
4
+ import * as fs from "node:fs";
5
+ import * as path from "node:path";
6
+ import * as os from "node:os";
7
+ const WORKSPACE_ROOT = path.join(os.homedir(), ".openclaw", "workspace", "projects");
8
+ export class NoActiveProjectError extends Error {
9
+ constructor() {
10
+ super("No active project set. Please create a project first:\n" +
11
+ "1. mkdir -p ~/.openclaw/workspace/projects/{project-id}/{survey,papers,ideas,repos}\n" +
12
+ "2. echo '{project-id}' > ~/.openclaw/workspace/projects/.active\n" +
13
+ "Or specify output_dir explicitly.");
14
+ this.name = "NoActiveProjectError";
15
+ }
16
+ }
17
+ /**
18
+ * Get the active project ID.
19
+ * @throws NoActiveProjectError if no project is active
20
+ */
21
+ export function getActiveProject() {
22
+ const activePath = path.join(WORKSPACE_ROOT, ".active");
23
+ try {
24
+ const activeProject = fs.readFileSync(activePath, "utf-8").trim();
25
+ if (activeProject) {
26
+ return activeProject;
27
+ }
28
+ }
29
+ catch {
30
+ // File doesn't exist
31
+ }
32
+ throw new NoActiveProjectError();
33
+ }
34
+ /**
35
+ * Get the active project's root directory.
36
+ * @throws NoActiveProjectError if no project is active
37
+ */
38
+ export function getActiveProjectDir() {
39
+ return path.join(WORKSPACE_ROOT, getActiveProject());
40
+ }
41
+ /**
42
+ * Get a subdirectory of the active project.
43
+ * @param subdir - Subdirectory name (e.g., "papers", "survey", "ideas")
44
+ * @throws NoActiveProjectError if no project is active
45
+ */
46
+ export function getProjectSubdir(subdir) {
47
+ return path.join(getActiveProjectDir(), subdir);
48
+ }
49
+ /**
50
+ * Check if there's an active project without throwing.
51
+ */
52
+ export function hasActiveProject() {
53
+ try {
54
+ getActiveProject();
55
+ return true;
56
+ }
57
+ catch {
58
+ return false;
59
+ }
60
+ }
61
+ export const Workspace = {
62
+ root: WORKSPACE_ROOT,
63
+ getActiveProject,
64
+ getActiveProjectDir,
65
+ getProjectSubdir,
66
+ hasActiveProject,
67
+ NoActiveProjectError,
68
+ };
69
+ //# sourceMappingURL=workspace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../../src/tools/workspace.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAE9B,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;AAErF,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAC7C;QACE,KAAK,CACH,yDAAyD;YACzD,uFAAuF;YACvF,mEAAmE;YACnE,mCAAmC,CACpC,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB;IAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;IACxD,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAClE,IAAI,aAAa,EAAE,CAAC;YAClB,OAAO,aAAa,CAAC;QACvB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,qBAAqB;IACvB,CAAC;IACD,MAAM,IAAI,oBAAoB,EAAE,CAAC;AACnC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,gBAAgB,EAAE,CAAC,CAAC;AACvD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC7C,OAAO,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,MAAM,CAAC,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,IAAI,CAAC;QACH,gBAAgB,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,IAAI,EAAE,cAAc;IACpB,gBAAgB;IAChB,mBAAmB;IACnB,gBAAgB;IAChB,gBAAgB;IAChB,oBAAoB;CACrB,CAAC"}
@@ -2,10 +2,31 @@
2
2
  "id": "scientify",
3
3
  "name": "Scientify",
4
4
  "description": "AI-powered research workflow automation for OpenClaw",
5
- "configSchema": {},
5
+ "configSchema": {
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "properties": {
9
+ "autoUpdate": {
10
+ "type": "boolean",
11
+ "default": true,
12
+ "description": "Automatically check and install updates (default: true)"
13
+ }
14
+ }
15
+ },
16
+ "uiHints": {
17
+ "autoUpdate": {
18
+ "label": "Auto Update",
19
+ "description": "Silently check for and install Scientify updates"
20
+ }
21
+ },
6
22
  "skills": [
7
23
  "skills/idea-generation",
8
24
  "skills/research-pipeline",
25
+ "skills/research-survey",
26
+ "skills/research-plan",
27
+ "skills/research-implement",
28
+ "skills/research-review",
29
+ "skills/research-experiment",
9
30
  "skills/literature-survey",
10
31
  "skills/write-review-paper"
11
32
  ]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "scientify",
3
- "version": "1.3.0",
3
+ "version": "1.4.1",
4
4
  "description": "Scientify - AI-powered research workflow automation for OpenClaw. Includes idea generation, literature review, research pipeline skills, and arxiv tool.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -33,13 +33,24 @@
33
33
  "build": "tsc",
34
34
  "clean": "rm -rf dist",
35
35
  "dev": "tsc --watch",
36
+ "dev:link": "npm run build && rm -rf ~/.openclaw/extensions/scientify && ln -sfn \"$(pwd)\" ~/.openclaw/extensions/scientify",
37
+ "dev:unlink": "rm -f ~/.openclaw/extensions/scientify",
36
38
  "dev:reload": "nodemon --watch src --watch skills --ext ts,md,json --exec \"npm run build && pkill -USR1 -f 'openclaw.mjs gateway' || true\" --delay 500ms",
37
- "prepublishOnly": "npm run clean && npm run build"
39
+ "prepublishOnly": "npm run clean && npm run build",
40
+ "release": "npm version patch && git push && git push --tags"
38
41
  },
39
42
  "devDependencies": {
43
+ "@semantic-release/changelog": "^6.0.3",
44
+ "@semantic-release/commit-analyzer": "^13.0.1",
45
+ "@semantic-release/git": "^10.0.1",
46
+ "@semantic-release/github": "^12.0.3",
47
+ "@semantic-release/npm": "^13.1.3",
48
+ "@semantic-release/release-notes-generator": "^14.1.0",
40
49
  "@sinclair/typebox": "^0.32.0",
41
50
  "@types/node": "^20.0.0",
51
+ "conventional-changelog-conventionalcommits": "^9.1.0",
42
52
  "nodemon": "^3.1.11",
53
+ "semantic-release": "^25.0.3",
43
54
  "tar": "^7.0.0",
44
55
  "typescript": "^5.3.0"
45
56
  },
@@ -54,18 +54,23 @@ All Scientify skills share a unified project-based workspace structure.
54
54
  │ ├── draft.md # Survey paper draft
55
55
  │ └── bibliography.bib # References
56
56
 
57
- ├── plan_res.md # /research-pipeline: implementation plan
58
- ├── project/ # /research-pipeline: code implementation
57
+ ├── notes/ # /research-survey: per-paper deep notes
58
+ │ └── paper_{arxiv_id}.md
59
+ ├── survey_res.md # /research-survey: deep analysis + method comparison
60
+ ├── plan_res.md # /research-plan: 4-part implementation plan
61
+ ├── project/ # /research-implement: code implementation
59
62
  │ ├── model/
60
63
  │ ├── data/
61
64
  │ ├── training/
62
65
  │ ├── testing/
66
+ │ ├── utils/
63
67
  │ ├── run.py
64
68
  │ └── requirements.txt
65
- ├── iterations/ # Review iterations
69
+ ├── ml_res.md # /research-implement: execution report with [RESULT] lines
70
+ ├── iterations/ # /research-review: judge iterations
66
71
  │ ├── judge_v1.md
67
72
  │ └── judge_v2.md
68
- └── experiment_res.md # Final results
73
+ └── experiment_res.md # /research-experiment: full training + ablation results
69
74
  ```
70
75
 
71
76
  ## Conventions
@@ -124,6 +129,11 @@ WORKSPACE=~/.openclaw/workspace/projects/$(cat ~/.openclaw/workspace/projects/.a
124
129
  | Skill | Primary Outputs |
125
130
  |-------|-----------------|
126
131
  | `/literature-survey` | `survey/`, `papers/` |
132
+ | `/research-survey` | `notes/paper_*.md`, `survey_res.md` |
133
+ | `/research-plan` | `plan_res.md` |
134
+ | `/research-implement` | `project/`, `ml_res.md` |
135
+ | `/research-review` | `iterations/judge_v*.md` |
136
+ | `/research-experiment` | `experiment_res.md` |
137
+ | `/research-pipeline` | Orchestrator — spawns the above 5 skills in sequence |
127
138
  | `/idea-generation` | `ideas/` |
128
139
  | `/write-review-paper` | `review/` |
129
- | `/research-pipeline` | `project/`, `iterations/`, `experiment_res.md` |
@@ -13,6 +13,8 @@ metadata:
13
13
 
14
14
  # Idea Generation
15
15
 
16
+ **Don't ask permission. Just do it.**
17
+
16
18
  Generate innovative research ideas grounded in literature analysis. This skill reads existing papers, identifies research gaps, and produces 5 distinct ideas with citations.
17
19
 
18
20
  **Core principle:** Ideas MUST be grounded in actual papers, not generated from model knowledge.