@wentorai/research-plugins 1.0.0

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 (252) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +204 -0
  3. package/curated/analysis/README.md +64 -0
  4. package/curated/domains/README.md +104 -0
  5. package/curated/literature/README.md +53 -0
  6. package/curated/research/README.md +62 -0
  7. package/curated/tools/README.md +87 -0
  8. package/curated/writing/README.md +61 -0
  9. package/index.ts +39 -0
  10. package/mcp-configs/academic-db/ChatSpatial.json +17 -0
  11. package/mcp-configs/academic-db/academia-mcp.json +17 -0
  12. package/mcp-configs/academic-db/academic-paper-explorer.json +17 -0
  13. package/mcp-configs/academic-db/academic-search-mcp-server.json +17 -0
  14. package/mcp-configs/academic-db/agentinterviews-mcp.json +17 -0
  15. package/mcp-configs/academic-db/all-in-mcp.json +17 -0
  16. package/mcp-configs/academic-db/apple-health-mcp.json +17 -0
  17. package/mcp-configs/academic-db/arxiv-latex-mcp.json +17 -0
  18. package/mcp-configs/academic-db/arxiv-mcp-server.json +17 -0
  19. package/mcp-configs/academic-db/bgpt-mcp.json +17 -0
  20. package/mcp-configs/academic-db/biomcp.json +17 -0
  21. package/mcp-configs/academic-db/biothings-mcp.json +17 -0
  22. package/mcp-configs/academic-db/catalysishub-mcp-server.json +17 -0
  23. package/mcp-configs/academic-db/clinicaltrialsgov-mcp-server.json +17 -0
  24. package/mcp-configs/academic-db/deep-research-mcp.json +17 -0
  25. package/mcp-configs/academic-db/dicom-mcp.json +17 -0
  26. package/mcp-configs/academic-db/enrichr-mcp-server.json +17 -0
  27. package/mcp-configs/academic-db/fec-mcp-server.json +17 -0
  28. package/mcp-configs/academic-db/fhir-mcp-server-themomentum.json +17 -0
  29. package/mcp-configs/academic-db/fhir-mcp.json +19 -0
  30. package/mcp-configs/academic-db/gget-mcp.json +17 -0
  31. package/mcp-configs/academic-db/google-researcher-mcp.json +17 -0
  32. package/mcp-configs/academic-db/idea-reality-mcp.json +17 -0
  33. package/mcp-configs/academic-db/legiscan-mcp.json +19 -0
  34. package/mcp-configs/academic-db/lex.json +17 -0
  35. package/mcp-configs/ai-platform/Adaptive-Graph-of-Thoughts-MCP-server.json +17 -0
  36. package/mcp-configs/ai-platform/ai-counsel.json +17 -0
  37. package/mcp-configs/ai-platform/atlas-mcp-server.json +17 -0
  38. package/mcp-configs/ai-platform/counsel-mcp.json +17 -0
  39. package/mcp-configs/ai-platform/cross-llm-mcp.json +17 -0
  40. package/mcp-configs/ai-platform/gptr-mcp.json +17 -0
  41. package/mcp-configs/browser/decipher-research-agent.json +17 -0
  42. package/mcp-configs/browser/deep-research.json +17 -0
  43. package/mcp-configs/browser/everything-claude-code.json +17 -0
  44. package/mcp-configs/browser/gpt-researcher.json +17 -0
  45. package/mcp-configs/browser/heurist-agent-framework.json +17 -0
  46. package/mcp-configs/data-platform/4everland-hosting-mcp.json +17 -0
  47. package/mcp-configs/data-platform/context-keeper.json +17 -0
  48. package/mcp-configs/data-platform/context7.json +19 -0
  49. package/mcp-configs/data-platform/contextstream-mcp.json +17 -0
  50. package/mcp-configs/data-platform/email-mcp.json +17 -0
  51. package/mcp-configs/note-knowledge/ApeRAG.json +17 -0
  52. package/mcp-configs/note-knowledge/In-Memoria.json +17 -0
  53. package/mcp-configs/note-knowledge/agent-memory.json +17 -0
  54. package/mcp-configs/note-knowledge/aimemo.json +17 -0
  55. package/mcp-configs/note-knowledge/biel-mcp.json +19 -0
  56. package/mcp-configs/note-knowledge/cognee.json +17 -0
  57. package/mcp-configs/note-knowledge/context-awesome.json +17 -0
  58. package/mcp-configs/note-knowledge/context-mcp.json +17 -0
  59. package/mcp-configs/note-knowledge/conversation-handoff-mcp.json +17 -0
  60. package/mcp-configs/note-knowledge/cortex.json +17 -0
  61. package/mcp-configs/note-knowledge/devrag.json +17 -0
  62. package/mcp-configs/note-knowledge/easy-obsidian-mcp.json +17 -0
  63. package/mcp-configs/note-knowledge/engram.json +17 -0
  64. package/mcp-configs/note-knowledge/gnosis-mcp.json +17 -0
  65. package/mcp-configs/note-knowledge/graphlit-mcp-server.json +19 -0
  66. package/mcp-configs/reference-mgr/arxiv-cli.json +17 -0
  67. package/mcp-configs/reference-mgr/arxiv-search-mcp.json +17 -0
  68. package/mcp-configs/reference-mgr/chiken.json +17 -0
  69. package/mcp-configs/reference-mgr/claude-scholar.json +17 -0
  70. package/mcp-configs/reference-mgr/devonthink-mcp.json +17 -0
  71. package/mcp-configs/registry.json +447 -0
  72. package/openclaw.plugin.json +21 -0
  73. package/package.json +61 -0
  74. package/skills/analysis/dataviz/color-accessibility-guide/SKILL.md +230 -0
  75. package/skills/analysis/dataviz/geospatial-viz-guide/SKILL.md +218 -0
  76. package/skills/analysis/dataviz/interactive-viz-guide/SKILL.md +287 -0
  77. package/skills/analysis/dataviz/network-visualization-guide/SKILL.md +195 -0
  78. package/skills/analysis/dataviz/publication-figures-guide/SKILL.md +238 -0
  79. package/skills/analysis/dataviz/python-dataviz-guide/SKILL.md +195 -0
  80. package/skills/analysis/econometrics/causal-inference-guide/SKILL.md +197 -0
  81. package/skills/analysis/econometrics/iv-regression-guide/SKILL.md +198 -0
  82. package/skills/analysis/econometrics/panel-data-guide/SKILL.md +274 -0
  83. package/skills/analysis/econometrics/robustness-checks/SKILL.md +250 -0
  84. package/skills/analysis/econometrics/stata-regression/SKILL.md +117 -0
  85. package/skills/analysis/econometrics/time-series-guide/SKILL.md +235 -0
  86. package/skills/analysis/statistics/bayesian-statistics-guide/SKILL.md +221 -0
  87. package/skills/analysis/statistics/hypothesis-testing-guide/SKILL.md +210 -0
  88. package/skills/analysis/statistics/meta-analysis-guide/SKILL.md +206 -0
  89. package/skills/analysis/statistics/nonparametric-tests-guide/SKILL.md +221 -0
  90. package/skills/analysis/statistics/power-analysis-guide/SKILL.md +240 -0
  91. package/skills/analysis/statistics/sem-guide/SKILL.md +231 -0
  92. package/skills/analysis/statistics/survival-analysis-guide/SKILL.md +195 -0
  93. package/skills/analysis/wrangling/missing-data-handling/SKILL.md +224 -0
  94. package/skills/analysis/wrangling/pandas-data-wrangling/SKILL.md +242 -0
  95. package/skills/analysis/wrangling/questionnaire-design-guide/SKILL.md +234 -0
  96. package/skills/analysis/wrangling/text-mining-guide/SKILL.md +225 -0
  97. package/skills/domains/ai-ml/computer-vision-guide/SKILL.md +213 -0
  98. package/skills/domains/ai-ml/deep-learning-papers-guide/SKILL.md +200 -0
  99. package/skills/domains/ai-ml/llm-evaluation-guide/SKILL.md +194 -0
  100. package/skills/domains/ai-ml/prompt-engineering-research/SKILL.md +233 -0
  101. package/skills/domains/ai-ml/reinforcement-learning-guide/SKILL.md +254 -0
  102. package/skills/domains/ai-ml/transformer-architecture-guide/SKILL.md +233 -0
  103. package/skills/domains/biomedical/clinical-research-guide/SKILL.md +232 -0
  104. package/skills/domains/biomedical/clinicaltrials-api/SKILL.md +177 -0
  105. package/skills/domains/biomedical/epidemiology-guide/SKILL.md +200 -0
  106. package/skills/domains/biomedical/genomics-analysis-guide/SKILL.md +270 -0
  107. package/skills/domains/business/market-analysis-guide/SKILL.md +112 -0
  108. package/skills/domains/business/strategic-management-guide/SKILL.md +154 -0
  109. package/skills/domains/chemistry/computational-chemistry-guide/SKILL.md +266 -0
  110. package/skills/domains/chemistry/retrosynthesis-guide/SKILL.md +215 -0
  111. package/skills/domains/cs/algorithms-complexity-guide/SKILL.md +194 -0
  112. package/skills/domains/cs/dblp-api/SKILL.md +129 -0
  113. package/skills/domains/cs/software-engineering-research/SKILL.md +218 -0
  114. package/skills/domains/ecology/biodiversity-data-guide/SKILL.md +296 -0
  115. package/skills/domains/ecology/conservation-biology-guide/SKILL.md +198 -0
  116. package/skills/domains/ecology/gbif-api/SKILL.md +158 -0
  117. package/skills/domains/ecology/inaturalist-api/SKILL.md +173 -0
  118. package/skills/domains/economics/behavioral-economics-guide/SKILL.md +239 -0
  119. package/skills/domains/economics/development-economics-guide/SKILL.md +181 -0
  120. package/skills/domains/economics/fred-api/SKILL.md +189 -0
  121. package/skills/domains/education/curriculum-design-guide/SKILL.md +144 -0
  122. package/skills/domains/education/learning-science-guide/SKILL.md +150 -0
  123. package/skills/domains/finance/financial-data-analysis/SKILL.md +152 -0
  124. package/skills/domains/finance/quantitative-finance-guide/SKILL.md +151 -0
  125. package/skills/domains/geoscience/climate-science-guide/SKILL.md +158 -0
  126. package/skills/domains/geoscience/gis-remote-sensing-guide/SKILL.md +129 -0
  127. package/skills/domains/humanities/digital-humanities-guide/SKILL.md +181 -0
  128. package/skills/domains/humanities/philosophy-research-guide/SKILL.md +148 -0
  129. package/skills/domains/law/courtlistener-api/SKILL.md +213 -0
  130. package/skills/domains/law/legal-research-guide/SKILL.md +250 -0
  131. package/skills/domains/math/linear-algebra-applications/SKILL.md +227 -0
  132. package/skills/domains/math/numerical-methods-guide/SKILL.md +236 -0
  133. package/skills/domains/math/oeis-api/SKILL.md +158 -0
  134. package/skills/domains/pharma/clinical-pharmacology-guide/SKILL.md +165 -0
  135. package/skills/domains/pharma/drug-development-guide/SKILL.md +177 -0
  136. package/skills/domains/physics/computational-physics-guide/SKILL.md +300 -0
  137. package/skills/domains/physics/nasa-ads-api/SKILL.md +150 -0
  138. package/skills/domains/physics/quantum-computing-guide/SKILL.md +234 -0
  139. package/skills/domains/social-science/social-research-methods/SKILL.md +194 -0
  140. package/skills/domains/social-science/survey-research-guide/SKILL.md +182 -0
  141. package/skills/literature/discovery/citation-alert-guide/SKILL.md +154 -0
  142. package/skills/literature/discovery/conference-proceedings-guide/SKILL.md +142 -0
  143. package/skills/literature/discovery/literature-mapping-guide/SKILL.md +175 -0
  144. package/skills/literature/discovery/paper-tracking-guide/SKILL.md +211 -0
  145. package/skills/literature/discovery/rss-paper-feeds/SKILL.md +214 -0
  146. package/skills/literature/discovery/semantic-scholar-recs-guide/SKILL.md +164 -0
  147. package/skills/literature/fulltext/doaj-api/SKILL.md +120 -0
  148. package/skills/literature/fulltext/interlibrary-loan-guide/SKILL.md +163 -0
  149. package/skills/literature/fulltext/open-access-guide/SKILL.md +183 -0
  150. package/skills/literature/fulltext/pmc-oai-api/SKILL.md +184 -0
  151. package/skills/literature/fulltext/preprint-servers-guide/SKILL.md +128 -0
  152. package/skills/literature/fulltext/repository-harvesting-guide/SKILL.md +207 -0
  153. package/skills/literature/fulltext/unpaywall-api/SKILL.md +113 -0
  154. package/skills/literature/metadata/altmetrics-guide/SKILL.md +132 -0
  155. package/skills/literature/metadata/citation-network-guide/SKILL.md +236 -0
  156. package/skills/literature/metadata/crossref-api/SKILL.md +133 -0
  157. package/skills/literature/metadata/datacite-api/SKILL.md +126 -0
  158. package/skills/literature/metadata/doi-resolution-guide/SKILL.md +168 -0
  159. package/skills/literature/metadata/h-index-guide/SKILL.md +183 -0
  160. package/skills/literature/metadata/journal-metrics-guide/SKILL.md +188 -0
  161. package/skills/literature/metadata/opencitations-api/SKILL.md +128 -0
  162. package/skills/literature/metadata/orcid-api/SKILL.md +136 -0
  163. package/skills/literature/metadata/orcid-integration-guide/SKILL.md +178 -0
  164. package/skills/literature/search/arxiv-api/SKILL.md +95 -0
  165. package/skills/literature/search/biorxiv-api/SKILL.md +123 -0
  166. package/skills/literature/search/boolean-search-guide/SKILL.md +199 -0
  167. package/skills/literature/search/citation-chaining-guide/SKILL.md +148 -0
  168. package/skills/literature/search/database-comparison-guide/SKILL.md +100 -0
  169. package/skills/literature/search/europe-pmc-api/SKILL.md +120 -0
  170. package/skills/literature/search/google-scholar-guide/SKILL.md +182 -0
  171. package/skills/literature/search/mesh-terms-guide/SKILL.md +164 -0
  172. package/skills/literature/search/openalex-api/SKILL.md +134 -0
  173. package/skills/literature/search/pubmed-api/SKILL.md +130 -0
  174. package/skills/literature/search/scientify-literature-survey/SKILL.md +203 -0
  175. package/skills/literature/search/semantic-scholar-api/SKILL.md +134 -0
  176. package/skills/literature/search/systematic-search-strategy/SKILL.md +214 -0
  177. package/skills/research/automation/ai-scientist-guide/SKILL.md +228 -0
  178. package/skills/research/automation/data-collection-automation/SKILL.md +248 -0
  179. package/skills/research/automation/research-workflow-automation/SKILL.md +266 -0
  180. package/skills/research/deep-research/meta-synthesis-guide/SKILL.md +174 -0
  181. package/skills/research/deep-research/research-cog/SKILL.md +153 -0
  182. package/skills/research/deep-research/scoping-review-guide/SKILL.md +217 -0
  183. package/skills/research/deep-research/systematic-review-guide/SKILL.md +250 -0
  184. package/skills/research/funding/figshare-api/SKILL.md +163 -0
  185. package/skills/research/funding/grant-writing-guide/SKILL.md +233 -0
  186. package/skills/research/funding/nsf-grant-guide/SKILL.md +206 -0
  187. package/skills/research/funding/open-science-guide/SKILL.md +255 -0
  188. package/skills/research/funding/zenodo-api/SKILL.md +174 -0
  189. package/skills/research/methodology/action-research-guide/SKILL.md +201 -0
  190. package/skills/research/methodology/experimental-design-guide/SKILL.md +236 -0
  191. package/skills/research/methodology/grad-school-guide/SKILL.md +182 -0
  192. package/skills/research/methodology/grounded-theory-guide/SKILL.md +171 -0
  193. package/skills/research/methodology/mixed-methods-guide/SKILL.md +208 -0
  194. package/skills/research/methodology/qualitative-research-guide/SKILL.md +234 -0
  195. package/skills/research/methodology/scientify-idea-generation/SKILL.md +222 -0
  196. package/skills/research/paper-review/paper-reading-assistant/SKILL.md +266 -0
  197. package/skills/research/paper-review/peer-review-guide/SKILL.md +227 -0
  198. package/skills/research/paper-review/rebuttal-writing-guide/SKILL.md +185 -0
  199. package/skills/research/paper-review/scientify-write-review-paper/SKILL.md +209 -0
  200. package/skills/tools/code-exec/jupyter-notebook-guide/SKILL.md +178 -0
  201. package/skills/tools/code-exec/python-reproducibility-guide/SKILL.md +341 -0
  202. package/skills/tools/code-exec/r-reproducibility-guide/SKILL.md +236 -0
  203. package/skills/tools/code-exec/sandbox-execution-guide/SKILL.md +221 -0
  204. package/skills/tools/diagram/mermaid-diagram-guide/SKILL.md +269 -0
  205. package/skills/tools/diagram/plantuml-guide/SKILL.md +397 -0
  206. package/skills/tools/diagram/scientific-illustration-guide/SKILL.md +225 -0
  207. package/skills/tools/document/anystyle-api/SKILL.md +199 -0
  208. package/skills/tools/document/grobid-pdf-parsing/SKILL.md +294 -0
  209. package/skills/tools/document/markdown-academic-guide/SKILL.md +217 -0
  210. package/skills/tools/document/pdf-extraction-guide/SKILL.md +321 -0
  211. package/skills/tools/knowledge-graph/knowledge-graph-construction/SKILL.md +306 -0
  212. package/skills/tools/knowledge-graph/ontology-design-guide/SKILL.md +214 -0
  213. package/skills/tools/knowledge-graph/rag-methodology-guide/SKILL.md +325 -0
  214. package/skills/tools/ocr-translate/formula-recognition-guide/SKILL.md +367 -0
  215. package/skills/tools/ocr-translate/handwriting-recognition-guide/SKILL.md +211 -0
  216. package/skills/tools/ocr-translate/latex-ocr-guide/SKILL.md +204 -0
  217. package/skills/tools/ocr-translate/multilingual-research-guide/SKILL.md +234 -0
  218. package/skills/tools/scraping/academic-web-scraping/SKILL.md +326 -0
  219. package/skills/tools/scraping/api-data-collection-guide/SKILL.md +301 -0
  220. package/skills/tools/scraping/web-scraping-ethics-guide/SKILL.md +250 -0
  221. package/skills/writing/citation/bibtex-management-guide/SKILL.md +246 -0
  222. package/skills/writing/citation/citation-style-guide/SKILL.md +248 -0
  223. package/skills/writing/citation/reference-manager-comparison/SKILL.md +208 -0
  224. package/skills/writing/citation/zotero-api/SKILL.md +188 -0
  225. package/skills/writing/composition/abstract-writing-guide/SKILL.md +188 -0
  226. package/skills/writing/composition/discussion-writing-guide/SKILL.md +194 -0
  227. package/skills/writing/composition/introduction-writing-guide/SKILL.md +194 -0
  228. package/skills/writing/composition/literature-review-writing/SKILL.md +196 -0
  229. package/skills/writing/composition/methods-section-guide/SKILL.md +185 -0
  230. package/skills/writing/composition/response-to-reviewers/SKILL.md +215 -0
  231. package/skills/writing/composition/scientific-writing-guide/SKILL.md +152 -0
  232. package/skills/writing/latex/bibliography-management-guide/SKILL.md +206 -0
  233. package/skills/writing/latex/latex-drawing-guide/SKILL.md +234 -0
  234. package/skills/writing/latex/latex-ecosystem-guide/SKILL.md +240 -0
  235. package/skills/writing/latex/math-typesetting-guide/SKILL.md +231 -0
  236. package/skills/writing/latex/overleaf-collaboration-guide/SKILL.md +211 -0
  237. package/skills/writing/latex/tikz-diagrams-guide/SKILL.md +211 -0
  238. package/skills/writing/polish/academic-translation-guide/SKILL.md +175 -0
  239. package/skills/writing/polish/academic-writing-refiner/SKILL.md +143 -0
  240. package/skills/writing/polish/ai-writing-humanizer/SKILL.md +178 -0
  241. package/skills/writing/polish/grammar-checker-guide/SKILL.md +184 -0
  242. package/skills/writing/polish/plagiarism-detection-guide/SKILL.md +167 -0
  243. package/skills/writing/templates/beamer-presentation-guide/SKILL.md +263 -0
  244. package/skills/writing/templates/conference-paper-template/SKILL.md +219 -0
  245. package/skills/writing/templates/thesis-template-guide/SKILL.md +200 -0
  246. package/skills/writing/templates/thesis-writing-guide/SKILL.md +220 -0
  247. package/src/tools/arxiv.ts +131 -0
  248. package/src/tools/crossref.ts +112 -0
  249. package/src/tools/openalex.ts +174 -0
  250. package/src/tools/pubmed.ts +166 -0
  251. package/src/tools/semantic-scholar.ts +108 -0
  252. package/src/tools/unpaywall.ts +58 -0
@@ -0,0 +1,220 @@
1
+ ---
2
+ name: thesis-writing-guide
3
+ description: "Templates, formatting rules, and strategies for thesis and dissertation writing"
4
+ metadata:
5
+ openclaw:
6
+ emoji: "📑"
7
+ category: "writing"
8
+ subcategory: "templates"
9
+ keywords: ["thesis template", "dissertation formatting", "journal formatting requirements", "page limit"]
10
+ source: "https://github.com/awesome-thesis/awesome-thesis"
11
+ ---
12
+
13
+ # Thesis Writing Guide
14
+
15
+ ## Overview
16
+
17
+ Writing a thesis or dissertation is the culminating challenge of graduate education. Unlike journal papers, a thesis demands sustained coherence across hundreds of pages, covering background, methodology, multiple studies, and synthesis. The formatting requirements are often institution-specific and unforgiving -- a misplaced margin or incorrect heading style can delay your defense.
18
+
19
+ This guide draws from the awesome-thesis repository (626+ stars), which curates practical tips and tricks for computer science theses, and extends the advice to cover all disciplines. It covers thesis structure, LaTeX and Word templates, formatting checklists, writing strategies for long documents, and common pitfalls that delay graduation.
20
+
21
+ Whether you are writing a master's thesis (50-100 pages) or a PhD dissertation (150-300 pages), the planning and execution patterns here will help you finish on time and produce a document you are proud of.
22
+
23
+ ## Thesis Structure
24
+
25
+ ### Standard Structure (Monograph Style)
26
+
27
+ | Chapter | Content | Typical Pages |
28
+ |---------|---------|---------------|
29
+ | 1. Introduction | Problem, motivation, contributions, outline | 10-20 |
30
+ | 2. Background | Core concepts, definitions, prerequisites | 15-25 |
31
+ | 3. Related Work | Comprehensive literature review | 15-30 |
32
+ | 4. Methodology | Your approach, design, algorithms | 20-40 |
33
+ | 5. Experiments | Setup, results, analysis | 20-40 |
34
+ | 6. Discussion | Interpretation, limitations, broader impact | 10-20 |
35
+ | 7. Conclusion | Summary, contributions, future work | 5-10 |
36
+
37
+ ### Paper-Based (Compilation) Style
38
+
39
+ Many institutions now accept theses composed of published papers:
40
+
41
+ ```
42
+ Chapter 1: Introduction and Overview (new content, 15-20 pages)
43
+ Chapter 2: Paper A (published, reformatted)
44
+ Chapter 3: Paper B (published, reformatted)
45
+ Chapter 4: Paper C (under review, reformatted)
46
+ Chapter 5: Synthesis and Conclusion (new content, 10-15 pages)
47
+ Appendix: Supplementary materials for each paper
48
+ ```
49
+
50
+ The key challenge with compilation theses is the "red thread" -- the narrative that connects your papers into a coherent whole. The introduction and conclusion chapters carry this responsibility.
51
+
52
+ ## LaTeX Templates
53
+
54
+ ### University Template Setup
55
+
56
+ Most universities provide official LaTeX templates. Here is a generic setup:
57
+
58
+ ```latex
59
+ \documentclass[12pt, a4paper, twoside]{report}
60
+
61
+ % Essential packages
62
+ \usepackage[margin=1in, bindingoffset=0.5in]{geometry}
63
+ \usepackage{setspace}
64
+ \doublespacing
65
+ \usepackage[hidelinks]{hyperref}
66
+ \usepackage{cleveref}
67
+ \usepackage[backend=biber, style=numeric]{biblatex}
68
+ \addbibresource{thesis.bib}
69
+
70
+ % Front matter
71
+ \begin{document}
72
+ \frontmatter
73
+ \include{chapters/titlepage}
74
+ \include{chapters/abstract}
75
+ \include{chapters/acknowledgments}
76
+ \tableofcontents
77
+ \listoffigures
78
+ \listoftables
79
+
80
+ % Main content
81
+ \mainmatter
82
+ \include{chapters/introduction}
83
+ \include{chapters/background}
84
+ \include{chapters/related_work}
85
+ \include{chapters/methodology}
86
+ \include{chapters/experiments}
87
+ \include{chapters/discussion}
88
+ \include{chapters/conclusion}
89
+
90
+ % Back matter
91
+ \backmatter
92
+ \printbibliography
93
+ \appendix
94
+ \include{chapters/appendix_a}
95
+ \end{document}
96
+ ```
97
+
98
+ ### Popular Thesis Templates
99
+
100
+ | Template | Institution/Style | Link |
101
+ |----------|-------------------|------|
102
+ | `thuthesis` | Tsinghua University | github.com/tuna/thuthesis |
103
+ | `SJTUThesis` | Shanghai Jiao Tong | github.com/sjtug/SJTUThesis |
104
+ | `Dissertate` | Harvard (multi-school) | github.com/suchow/Dissertate |
105
+ | `novathesis` | Universidade Nova de Lisboa | github.com/joaomlourenco/novathesis |
106
+ | `cleanthesis` | Generic clean style | github.com/derric/cleanthesis |
107
+
108
+ ### Project Organization
109
+
110
+ ```
111
+ thesis/
112
+ main.tex # Master file
113
+ thesis.bib # Bibliography
114
+ chapters/
115
+ titlepage.tex
116
+ abstract.tex
117
+ introduction.tex
118
+ ...
119
+ figures/
120
+ ch1/
121
+ ch2/
122
+ ...
123
+ tables/
124
+ code/ # Code listings
125
+ Makefile # Build automation
126
+ .gitignore
127
+ ```
128
+
129
+ ## Writing Strategies for Long Documents
130
+
131
+ ### The Modular Writing Approach
132
+
133
+ 1. **Write chapters independently.** Each chapter should be understandable on its own before integration.
134
+ 2. **Start with the easiest chapter.** Often this is the Methods or a chapter based on a published paper.
135
+ 3. **Write the Introduction last.** You need to know all your contributions before you can introduce them.
136
+ 4. **Set daily word count targets.** 500 words/day produces a 100-page thesis in roughly 4 months of writing.
137
+
138
+ ### Timeline Planning
139
+
140
+ For a 6-month writing period:
141
+
142
+ | Month | Task | Deliverable |
143
+ |-------|------|------------|
144
+ | 1 | Outline all chapters; write Methods | Methods draft |
145
+ | 2 | Write Experiments chapter | Experiments draft |
146
+ | 3 | Write Background and Related Work | Literature review draft |
147
+ | 4 | Write Discussion and Conclusion | Full rough draft |
148
+ | 5 | Write Introduction; revise all chapters | Complete first draft |
149
+ | 6 | Advisor review; final revisions; formatting | Submission-ready thesis |
150
+
151
+ ### Managing Advisor Feedback
152
+
153
+ - Send one chapter at a time for review, not the entire thesis.
154
+ - Include a cover note explaining what feedback you need (structure? content? prose?).
155
+ - Allow 2 weeks per chapter for advisor review.
156
+ - Track revisions using `latexdiff` or track changes in Word.
157
+
158
+ ```bash
159
+ # Generate a visual diff between thesis versions
160
+ latexdiff old_version.tex new_version.tex > diff.tex
161
+ pdflatex diff.tex
162
+ ```
163
+
164
+ ## Formatting Checklist
165
+
166
+ Before submission, verify every item:
167
+
168
+ ### Document-Level
169
+
170
+ - [ ] Title page matches university template exactly.
171
+ - [ ] Page numbers: roman for front matter, arabic for main text.
172
+ - [ ] Margins meet requirements (typically 1-1.5 inch, larger on binding side).
173
+ - [ ] Line spacing is correct (usually double-spaced; some allow 1.5).
174
+ - [ ] Font and size comply (usually 12pt Times New Roman or Computer Modern).
175
+
176
+ ### Figures and Tables
177
+
178
+ - [ ] All figures are referenced in the text.
179
+ - [ ] Figure captions are below figures; table captions are above tables.
180
+ - [ ] Resolution is at least 300 DPI for raster images.
181
+ - [ ] All figures are readable in grayscale (accessibility).
182
+
183
+ ### References
184
+
185
+ - [ ] All cited works appear in the bibliography.
186
+ - [ ] All bibliography entries are cited in the text.
187
+ - [ ] Citation style matches university requirements.
188
+ - [ ] DOIs are included where available.
189
+
190
+ ### Front and Back Matter
191
+
192
+ - [ ] Abstract is within the word limit.
193
+ - [ ] Acknowledgments are complete (funding, advisor, committee, family).
194
+ - [ ] Table of contents, list of figures, list of tables are up to date.
195
+ - [ ] Appendices are properly numbered and referenced.
196
+
197
+ ## Common Pitfalls
198
+
199
+ 1. **Starting too late.** Begin writing during your research, not after.
200
+ 2. **Perfectionism on first drafts.** "Done is better than perfect" for draft 1.
201
+ 3. **Inconsistent notation.** Define a notation table and stick to it across all chapters.
202
+ 4. **Ignoring the formatting guide.** Read your university's thesis manual before writing, not the week before submission.
203
+ 5. **Not backing up.** Use Git + cloud storage. Losing a thesis to hardware failure is devastating and preventable.
204
+
205
+ ## Best Practices
206
+
207
+ - **Use version control.** Git with a private GitHub/GitLab repository provides backup and history.
208
+ - **Compile frequently.** Catch LaTeX errors early rather than debugging 200 pages of broken code.
209
+ - **Create a glossary.** Define all domain-specific terms in one place for consistency.
210
+ - **Write the abstract in three versions:** 50-word (elevator pitch), 150-word (standard), and 300-word (extended).
211
+ - **Schedule your defense date early.** Having a deadline makes the writing timeline concrete.
212
+ - **Read other theses from your lab.** They set expectations for scope, depth, and style.
213
+
214
+ ## References
215
+
216
+ - [awesome-thesis](https://github.com/awesome-thesis/awesome-thesis) -- Practical thesis tips (626+ stars)
217
+ - [How to Write a Thesis](https://www.ldeo.columbia.edu/~martins/sen_res/how_to_thesis.html) -- Columbia University guide
218
+ - [Dissertate Template](https://github.com/suchow/Dissertate) -- Harvard multi-school LaTeX template
219
+ - [latexdiff](https://ctan.org/pkg/latexdiff) -- Visual diff tool for LaTeX documents
220
+ - [Overleaf Thesis Templates](https://www.overleaf.com/latex/templates/tagged/thesis) -- Gallery of institutional templates
@@ -0,0 +1,131 @@
1
+ import { Type } from "@sinclair/typebox";
2
+ import type { OpenClawPluginApi, OpenClawPluginToolContext } from "openclaw/plugin-sdk";
3
+
4
+ const BASE = "https://export.arxiv.org/api/query";
5
+
6
+ function parseArxivXml(xml: string) {
7
+ const entries: Record<string, unknown>[] = [];
8
+ const entryBlocks = xml.split("<entry>").slice(1);
9
+
10
+ for (const block of entryBlocks) {
11
+ const getText = (tag: string) => {
12
+ const m = block.match(new RegExp(`<${tag}[^>]*>([\\s\\S]*?)</${tag}>`));
13
+ return m ? m[1].trim() : "";
14
+ };
15
+
16
+ const getAll = (tag: string) => {
17
+ const results: string[] = [];
18
+ const re = new RegExp(`<${tag}[^>]*>([\\s\\S]*?)</${tag}>`, "g");
19
+ let m;
20
+ while ((m = re.exec(block)) !== null) results.push(m[1].trim());
21
+ return results;
22
+ };
23
+
24
+ const getAttr = (tag: string, attr: string) => {
25
+ const m = block.match(new RegExp(`<${tag}[^>]*${attr}="([^"]*)"[^>]*/?>`, "g"));
26
+ return m
27
+ ? m.map((s) => {
28
+ const am = s.match(new RegExp(`${attr}="([^"]*)"`));
29
+ return am ? am[1] : "";
30
+ })
31
+ : [];
32
+ };
33
+
34
+ const id = getText("id");
35
+ const arxivId = id.replace("http://arxiv.org/abs/", "").replace(/v\d+$/, "");
36
+
37
+ entries.push({
38
+ arxiv_id: arxivId,
39
+ title: getText("title").replace(/\s+/g, " "),
40
+ summary: getText("summary").replace(/\s+/g, " "),
41
+ authors: getAll("name"),
42
+ published: getText("published"),
43
+ updated: getText("updated"),
44
+ categories: getAttr("category", "term"),
45
+ pdf_url: `https://arxiv.org/pdf/${arxivId}`,
46
+ abs_url: `https://arxiv.org/abs/${arxivId}`,
47
+ doi: getText("arxiv:doi"),
48
+ comment: getText("arxiv:comment"),
49
+ });
50
+ }
51
+
52
+ return entries;
53
+ }
54
+
55
+ export function createArxivTools(
56
+ _ctx: OpenClawPluginToolContext,
57
+ _api: OpenClawPluginApi,
58
+ ) {
59
+ return [
60
+ {
61
+ name: "search_arxiv",
62
+ description:
63
+ "Search arXiv preprint repository. Covers physics, math, CS, biology, quantitative finance, statistics, and more.",
64
+ inputSchema: Type.Object({
65
+ query: Type.String({
66
+ description:
67
+ "Search query. Supports field prefixes: ti: (title), au: (author), abs: (abstract), cat: (category). E.g. 'ti:transformer AND cat:cs.CL'",
68
+ }),
69
+ max_results: Type.Optional(
70
+ Type.Number({ description: "Max results (default 10, max 50)" }),
71
+ ),
72
+ sort_by: Type.Optional(
73
+ Type.String({
74
+ description:
75
+ "Sort by: 'relevance', 'lastUpdatedDate', 'submittedDate'",
76
+ }),
77
+ ),
78
+ sort_order: Type.Optional(
79
+ Type.String({ description: "Sort order: 'ascending' or 'descending'" }),
80
+ ),
81
+ }),
82
+ handler: async (input: {
83
+ query: string;
84
+ max_results?: number;
85
+ sort_by?: string;
86
+ sort_order?: string;
87
+ }) => {
88
+ const params = new URLSearchParams({
89
+ search_query: input.query,
90
+ max_results: String(Math.min(input.max_results ?? 10, 50)),
91
+ sortBy: input.sort_by ?? "relevance",
92
+ sortOrder: input.sort_order ?? "descending",
93
+ });
94
+
95
+ const res = await fetch(`${BASE}?${params}`);
96
+ if (!res.ok) return { error: `API error: ${res.status} ${res.statusText}` };
97
+ const xml = await res.text();
98
+
99
+ const totalMatch = xml.match(
100
+ /<opensearch:totalResults[^>]*>(\d+)<\/opensearch:totalResults>/,
101
+ );
102
+ const total = totalMatch ? parseInt(totalMatch[1], 10) : 0;
103
+
104
+ return {
105
+ total_results: total,
106
+ papers: parseArxivXml(xml),
107
+ };
108
+ },
109
+ },
110
+ {
111
+ name: "get_arxiv_paper",
112
+ description:
113
+ "Get detailed information about a specific arXiv paper by its ID.",
114
+ inputSchema: Type.Object({
115
+ arxiv_id: Type.String({
116
+ description: "arXiv paper ID, e.g. '2301.00001' or '2301.00001v2'",
117
+ }),
118
+ }),
119
+ handler: async (input: { arxiv_id: string }) => {
120
+ const id = input.arxiv_id.replace("arXiv:", "");
121
+ const params = new URLSearchParams({ id_list: id });
122
+ const res = await fetch(`${BASE}?${params}`);
123
+ if (!res.ok) return { error: `API error: ${res.status} ${res.statusText}` };
124
+ const xml = await res.text();
125
+ const papers = parseArxivXml(xml);
126
+ if (papers.length === 0) return { error: "Paper not found" };
127
+ return papers[0];
128
+ },
129
+ },
130
+ ];
131
+ }
@@ -0,0 +1,112 @@
1
+ import { Type } from "@sinclair/typebox";
2
+ import type { OpenClawPluginApi, OpenClawPluginToolContext } from "openclaw/plugin-sdk";
3
+
4
+ const BASE = "https://api.crossref.org";
5
+
6
+ export function createCrossRefTools(
7
+ _ctx: OpenClawPluginToolContext,
8
+ _api: OpenClawPluginApi,
9
+ ) {
10
+ const headers: Record<string, string> = {
11
+ "User-Agent": "ResearchPlugins/1.0 (https://wentor.ai; mailto:dev@wentor.ai)",
12
+ };
13
+
14
+ return [
15
+ {
16
+ name: "resolve_doi",
17
+ description:
18
+ "Resolve a DOI to get full bibliographic metadata from CrossRef (title, authors, journal, dates, references).",
19
+ inputSchema: Type.Object({
20
+ doi: Type.String({
21
+ description: "DOI to resolve, e.g. '10.1038/nature12373'",
22
+ }),
23
+ }),
24
+ handler: async (input: { doi: string }) => {
25
+ const doi = input.doi.replace(/^https?:\/\/doi\.org\//, "");
26
+ const res = await fetch(`${BASE}/works/${encodeURIComponent(doi)}`, {
27
+ headers,
28
+ });
29
+ if (!res.ok) return { error: `API error: ${res.status} ${res.statusText}` };
30
+ const data = await res.json();
31
+ const w = data.message;
32
+ return {
33
+ doi: w.DOI,
34
+ title: w.title?.[0],
35
+ authors: w.author?.map(
36
+ (a: Record<string, string>) => `${a.given ?? ""} ${a.family ?? ""}`.trim(),
37
+ ),
38
+ container_title: w["container-title"]?.[0],
39
+ published_date: w.published?.["date-parts"]?.[0]?.join("-"),
40
+ type: w.type,
41
+ is_referenced_by_count: w["is-referenced-by-count"],
42
+ references_count: w["references-count"],
43
+ issn: w.ISSN,
44
+ url: w.URL,
45
+ abstract: w.abstract,
46
+ license: w.license?.[0]?.URL,
47
+ };
48
+ },
49
+ },
50
+ {
51
+ name: "search_crossref",
52
+ description:
53
+ "Search CrossRef for scholarly works by query. Covers 150M+ DOIs across all publishers.",
54
+ inputSchema: Type.Object({
55
+ query: Type.String({ description: "Search query" }),
56
+ limit: Type.Optional(
57
+ Type.Number({ description: "Max results (default 10, max 100)" }),
58
+ ),
59
+ from_year: Type.Optional(
60
+ Type.Number({ description: "Published from this year onward" }),
61
+ ),
62
+ type: Type.Optional(
63
+ Type.String({
64
+ description:
65
+ "Work type filter: 'journal-article', 'book-chapter', 'proceedings-article', etc.",
66
+ }),
67
+ ),
68
+ sort: Type.Optional(
69
+ Type.String({
70
+ description: "Sort by: 'relevance', 'published', 'is-referenced-by-count'",
71
+ }),
72
+ ),
73
+ }),
74
+ handler: async (input: {
75
+ query: string;
76
+ limit?: number;
77
+ from_year?: number;
78
+ type?: string;
79
+ sort?: string;
80
+ }) => {
81
+ const params = new URLSearchParams({
82
+ query: input.query,
83
+ rows: String(Math.min(input.limit ?? 10, 100)),
84
+ });
85
+ if (input.from_year)
86
+ params.set("filter", `from-pub-date:${input.from_year}`);
87
+ if (input.type)
88
+ params.append("filter", `type:${input.type}`);
89
+ if (input.sort) params.set("sort", input.sort);
90
+
91
+ const res = await fetch(`${BASE}/works?${params}`, { headers });
92
+ if (!res.ok) return { error: `API error: ${res.status} ${res.statusText}` };
93
+ const data = await res.json();
94
+ return {
95
+ total_results: data.message?.["total-results"],
96
+ items: data.message?.items?.map((w: Record<string, unknown>) => ({
97
+ doi: w.DOI,
98
+ title: (w.title as string[])?.[0],
99
+ authors: (w.author as Record<string, string>[])
100
+ ?.slice(0, 5)
101
+ .map((a) => `${a.given ?? ""} ${a.family ?? ""}`.trim()),
102
+ container_title: (w["container-title"] as string[])?.[0],
103
+ published:
104
+ (w.published as Record<string, unknown>)?.["date-parts"],
105
+ type: w.type,
106
+ cited_by: w["is-referenced-by-count"],
107
+ })),
108
+ };
109
+ },
110
+ },
111
+ ];
112
+ }
@@ -0,0 +1,174 @@
1
+ import { Type } from "@sinclair/typebox";
2
+ import type { OpenClawPluginApi, OpenClawPluginToolContext } from "openclaw/plugin-sdk";
3
+
4
+ const BASE = "https://api.openalex.org";
5
+
6
+ export function createOpenAlexTools(
7
+ _ctx: OpenClawPluginToolContext,
8
+ _api: OpenClawPluginApi,
9
+ ) {
10
+ const headers: Record<string, string> = {
11
+ "User-Agent": "ResearchPlugins/1.0 (https://wentor.ai)",
12
+ };
13
+
14
+ return [
15
+ {
16
+ name: "search_openalex",
17
+ description:
18
+ "Search academic works via OpenAlex (free, no key required). Covers 250M+ works across all disciplines.",
19
+ inputSchema: Type.Object({
20
+ query: Type.String({ description: "Search query for works" }),
21
+ limit: Type.Optional(
22
+ Type.Number({ description: "Max results (default 10, max 200)" }),
23
+ ),
24
+ from_year: Type.Optional(
25
+ Type.Number({ description: "Filter works from this year onward" }),
26
+ ),
27
+ to_year: Type.Optional(
28
+ Type.Number({ description: "Filter works up to this year" }),
29
+ ),
30
+ open_access: Type.Optional(
31
+ Type.Boolean({ description: "Only open access works" }),
32
+ ),
33
+ sort_by: Type.Optional(
34
+ Type.String({
35
+ description: "Sort by: 'cited_by_count', 'publication_date', 'relevance_score'",
36
+ }),
37
+ ),
38
+ }),
39
+ handler: async (input: {
40
+ query: string;
41
+ limit?: number;
42
+ from_year?: number;
43
+ to_year?: number;
44
+ open_access?: boolean;
45
+ sort_by?: string;
46
+ }) => {
47
+ const filters: string[] = [];
48
+ if (input.from_year) filters.push(`from_publication_date:${input.from_year}-01-01`);
49
+ if (input.to_year) filters.push(`to_publication_date:${input.to_year}-12-31`);
50
+ if (input.open_access) filters.push("is_oa:true");
51
+
52
+ const params = new URLSearchParams({
53
+ search: input.query,
54
+ per_page: String(Math.min(input.limit ?? 10, 200)),
55
+ });
56
+ if (filters.length > 0) params.set("filter", filters.join(","));
57
+ if (input.sort_by) params.set("sort", input.sort_by);
58
+
59
+ const res = await fetch(`${BASE}/works?${params}`, { headers });
60
+ if (!res.ok) return { error: `API error: ${res.status} ${res.statusText}` };
61
+ const data = await res.json();
62
+ return {
63
+ total_count: data.meta?.count,
64
+ results: data.results?.map((w: Record<string, unknown>) => ({
65
+ id: w.id,
66
+ doi: w.doi,
67
+ title: w.title,
68
+ publication_date: w.publication_date,
69
+ cited_by_count: w.cited_by_count,
70
+ is_oa: w.open_access && (w.open_access as Record<string, unknown>).is_oa,
71
+ oa_url:
72
+ w.open_access && (w.open_access as Record<string, unknown>).oa_url,
73
+ authors: Array.isArray(w.authorships)
74
+ ? (w.authorships as Record<string, unknown>[]).slice(0, 5).map(
75
+ (a) => (a.author as Record<string, unknown>)?.display_name,
76
+ )
77
+ : [],
78
+ })),
79
+ };
80
+ },
81
+ },
82
+ {
83
+ name: "get_work",
84
+ description:
85
+ "Get full details of a work by its OpenAlex ID, DOI, or other identifier.",
86
+ inputSchema: Type.Object({
87
+ work_id: Type.String({
88
+ description:
89
+ "Work identifier: OpenAlex ID (e.g. 'W2741809807'), DOI URL, or PMID",
90
+ }),
91
+ }),
92
+ handler: async (input: { work_id: string }) => {
93
+ const id = input.work_id.startsWith("10.")
94
+ ? `https://doi.org/${input.work_id}`
95
+ : input.work_id;
96
+ const res = await fetch(`${BASE}/works/${encodeURIComponent(id)}`, {
97
+ headers,
98
+ });
99
+ if (!res.ok) return { error: `API error: ${res.status} ${res.statusText}` };
100
+ const w = await res.json();
101
+ return {
102
+ id: w.id,
103
+ doi: w.doi,
104
+ title: w.title,
105
+ abstract: w.abstract,
106
+ publication_date: w.publication_date,
107
+ type: w.type,
108
+ cited_by_count: w.cited_by_count,
109
+ is_oa: w.open_access?.is_oa,
110
+ oa_url: w.open_access?.oa_url,
111
+ venue: w.primary_location?.source?.display_name,
112
+ authors: w.authorships?.map(
113
+ (a: Record<string, unknown>) =>
114
+ (a.author as Record<string, unknown>)?.display_name,
115
+ ),
116
+ concepts: w.concepts
117
+ ?.slice(0, 10)
118
+ .map((c: Record<string, unknown>) => c.display_name),
119
+ referenced_works_count: w.referenced_works?.length,
120
+ };
121
+ },
122
+ },
123
+ {
124
+ name: "get_author_openalex",
125
+ description:
126
+ "Get author information from OpenAlex including publications, h-index, and affiliations.",
127
+ inputSchema: Type.Object({
128
+ author_id: Type.String({
129
+ description:
130
+ "Author identifier: OpenAlex ID (e.g. 'A5023888391'), ORCID, or name search",
131
+ }),
132
+ }),
133
+ handler: async (input: { author_id: string }) => {
134
+ let url: string;
135
+ if (
136
+ input.author_id.startsWith("A") ||
137
+ input.author_id.startsWith("https://")
138
+ ) {
139
+ url = `${BASE}/authors/${encodeURIComponent(input.author_id)}`;
140
+ } else if (input.author_id.includes("-")) {
141
+ url = `${BASE}/authors/orcid:${input.author_id}`;
142
+ } else {
143
+ const params = new URLSearchParams({
144
+ search: input.author_id,
145
+ per_page: "5",
146
+ });
147
+ const res = await fetch(`${BASE}/authors?${params}`, { headers });
148
+ if (!res.ok) return { error: `API error: ${res.status} ${res.statusText}` };
149
+ return res.json();
150
+ }
151
+
152
+ const res = await fetch(url, { headers });
153
+ if (!res.ok) return { error: `API error: ${res.status} ${res.statusText}` };
154
+ const a = await res.json();
155
+ return {
156
+ id: a.id,
157
+ display_name: a.display_name,
158
+ orcid: a.orcid,
159
+ works_count: a.works_count,
160
+ cited_by_count: a.cited_by_count,
161
+ h_index: a.summary_stats?.h_index,
162
+ i10_index: a.summary_stats?.i10_index,
163
+ affiliations: a.affiliations?.map(
164
+ (af: Record<string, unknown>) =>
165
+ (af.institution as Record<string, unknown>)?.display_name,
166
+ ),
167
+ top_concepts: a.x_concepts
168
+ ?.slice(0, 5)
169
+ .map((c: Record<string, unknown>) => c.display_name),
170
+ };
171
+ },
172
+ },
173
+ ];
174
+ }