@yeyuan98/opencode-bioresearcher-plugin 1.5.0 → 1.5.2-alpha.2

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 (173) hide show
  1. package/README.md +50 -50
  2. package/dist/agents/bioresearcher/prompt.d.ts +1 -1
  3. package/dist/agents/bioresearcher/prompt.js +235 -27
  4. package/dist/agents/bioresearcherDR/prompt.d.ts +1 -1
  5. package/dist/agents/bioresearcherDR/prompt.js +8 -8
  6. package/dist/agents/bioresearcherDR_worker/prompt.d.ts +3 -2
  7. package/dist/agents/bioresearcherDR_worker/prompt.js +37 -12
  8. package/dist/index.js +6 -6
  9. package/dist/shared/tool-restrictions.d.ts +2 -2
  10. package/dist/shared/tool-restrictions.js +4 -3
  11. package/dist/skills/bioresearcher-core/SKILL.md +58 -1
  12. package/dist/skills/bioresearcher-core/patterns/bioresearcher/analysis-methods.md +551 -0
  13. package/dist/skills/bioresearcher-core/patterns/bioresearcher/best-practices.md +647 -0
  14. package/dist/skills/bioresearcher-core/patterns/bioresearcher/python-standards.md +944 -0
  15. package/dist/skills/bioresearcher-core/patterns/bioresearcher/report-template.md +613 -0
  16. package/dist/skills/bioresearcher-core/patterns/bioresearcher/tool-selection.md +481 -0
  17. package/dist/skills/bioresearcher-core/patterns/citations.md +234 -0
  18. package/dist/skills/bioresearcher-core/patterns/rate-limiting.md +167 -0
  19. package/dist/skills/bioresearcher-tests/README.md +90 -0
  20. package/dist/skills/bioresearcher-tests/SKILL.md +255 -0
  21. package/dist/skills/bioresearcher-tests/pyproject.toml +6 -0
  22. package/dist/skills/bioresearcher-tests/resources/json_samples/in_markdown.md.gz +0 -0
  23. package/dist/skills/bioresearcher-tests/resources/json_samples/nested_object.json.gz +0 -0
  24. package/dist/skills/bioresearcher-tests/resources/json_samples/schema_draft7.json.gz +0 -0
  25. package/dist/skills/bioresearcher-tests/resources/json_samples/simple_array.json.gz +0 -0
  26. package/dist/skills/bioresearcher-tests/resources/json_samples/simple_object.json.gz +0 -0
  27. package/dist/skills/bioresearcher-tests/resources/obo_sample.obo.gz +0 -0
  28. package/dist/skills/bioresearcher-tests/resources/pubmed_sample.xml.gz +0 -0
  29. package/dist/skills/bioresearcher-tests/resources/table_sample.xlsx.gz +0 -0
  30. package/dist/skills/bioresearcher-tests/test_cases/json_tests.md +137 -0
  31. package/dist/skills/bioresearcher-tests/test_cases/misc_tests.md +141 -0
  32. package/dist/skills/bioresearcher-tests/test_cases/parser_tests.md +80 -0
  33. package/dist/skills/bioresearcher-tests/test_cases/skill_tests.md +59 -0
  34. package/dist/skills/bioresearcher-tests/test_cases/table_tests.md +194 -0
  35. package/dist/skills/bioresearcher-tests/test_runner.py +607 -0
  36. package/dist/skills/env-jsonc-setup/SKILL.md +206 -206
  37. package/dist/skills/long-table-summary/SKILL.md +117 -46
  38. package/dist/skills/long-table-summary/combine_outputs.py +55 -9
  39. package/dist/skills/long-table-summary/generate_prompts.py +9 -0
  40. package/dist/skills/pubmed-weekly/pubmed_weekly.py +130 -29
  41. package/dist/{db-tools → tools/db}/backends/mysql/translator.js +23 -23
  42. package/dist/{db-tools → tools/db}/tools.js +34 -34
  43. package/dist/{misc-tools → tools/misc}/json-validate.js +4 -5
  44. package/dist/tools/sandbox/bash-parser.d.ts +17 -0
  45. package/dist/tools/sandbox/bash-parser.js +166 -0
  46. package/dist/tools/sandbox/escape-scenarios.test.d.ts +7 -0
  47. package/dist/tools/sandbox/escape-scenarios.test.js +182 -0
  48. package/dist/tools/sandbox/expander.d.ts +30 -0
  49. package/dist/tools/sandbox/expander.js +57 -0
  50. package/dist/tools/sandbox/final-verification.test.d.ts +6 -0
  51. package/dist/tools/sandbox/final-verification.test.js +70 -0
  52. package/dist/tools/sandbox/hooks.d.ts +25 -0
  53. package/dist/tools/sandbox/hooks.js +217 -0
  54. package/dist/tools/sandbox/index.d.ts +19 -0
  55. package/dist/tools/sandbox/index.js +24 -0
  56. package/dist/tools/sandbox/manager.d.ts +60 -0
  57. package/dist/tools/sandbox/manager.js +113 -0
  58. package/dist/tools/sandbox/sandbox.integration.test.d.ts +7 -0
  59. package/dist/tools/sandbox/sandbox.integration.test.js +106 -0
  60. package/dist/tools/sandbox/sandbox.test.d.ts +6 -0
  61. package/dist/tools/sandbox/sandbox.test.js +160 -0
  62. package/dist/tools/sandbox/tool.d.ts +66 -0
  63. package/dist/tools/sandbox/tool.js +163 -0
  64. package/dist/tools/sandbox/types.d.ts +38 -0
  65. package/dist/tools/sandbox/types.js +6 -0
  66. package/dist/tools/sandbox/validator.d.ts +33 -0
  67. package/dist/tools/sandbox/validator.js +150 -0
  68. package/dist/{skill-tools → tools/skill}/registry.js +1 -2
  69. package/dist/{table-tools → tools/table}/utils.js +4 -4
  70. package/package.json +1 -1
  71. package/dist/db-tools/executor.d.ts +0 -13
  72. package/dist/db-tools/executor.js +0 -54
  73. package/dist/db-tools/pool.d.ts +0 -8
  74. package/dist/db-tools/pool.js +0 -49
  75. package/dist/db-tools/tools/index.d.ts +0 -27
  76. package/dist/db-tools/tools/index.js +0 -191
  77. package/dist/db-tools/types.d.ts +0 -94
  78. package/dist/db-tools/types.js +0 -40
  79. package/dist/misc-tools/json-tools.d.ts +0 -33
  80. package/dist/misc-tools/json-tools.js +0 -187
  81. package/dist/skill/frontmatter.d.ts +0 -2
  82. package/dist/skill/frontmatter.js +0 -65
  83. package/dist/skill/index.d.ts +0 -3
  84. package/dist/skill/index.js +0 -2
  85. package/dist/skill/registry.d.ts +0 -11
  86. package/dist/skill/registry.js +0 -64
  87. package/dist/skill/tool.d.ts +0 -9
  88. package/dist/skill/tool.js +0 -115
  89. package/dist/skill/types.d.ts +0 -22
  90. package/dist/skill/types.js +0 -7
  91. /package/dist/{db-tools → tools/db}/backends/index.d.ts +0 -0
  92. /package/dist/{db-tools → tools/db}/backends/index.js +0 -0
  93. /package/dist/{db-tools → tools/db}/backends/mongodb/backend.d.ts +0 -0
  94. /package/dist/{db-tools → tools/db}/backends/mongodb/backend.js +0 -0
  95. /package/dist/{db-tools → tools/db}/backends/mongodb/connection.d.ts +0 -0
  96. /package/dist/{db-tools → tools/db}/backends/mongodb/connection.js +0 -0
  97. /package/dist/{db-tools → tools/db}/backends/mongodb/index.d.ts +0 -0
  98. /package/dist/{db-tools → tools/db}/backends/mongodb/index.js +0 -0
  99. /package/dist/{db-tools → tools/db}/backends/mongodb/translator.d.ts +0 -0
  100. /package/dist/{db-tools → tools/db}/backends/mongodb/translator.js +0 -0
  101. /package/dist/{db-tools → tools/db}/backends/mysql/backend.d.ts +0 -0
  102. /package/dist/{db-tools → tools/db}/backends/mysql/backend.js +0 -0
  103. /package/dist/{db-tools → tools/db}/backends/mysql/connection.d.ts +0 -0
  104. /package/dist/{db-tools → tools/db}/backends/mysql/connection.js +0 -0
  105. /package/dist/{db-tools → tools/db}/backends/mysql/index.d.ts +0 -0
  106. /package/dist/{db-tools → tools/db}/backends/mysql/index.js +0 -0
  107. /package/dist/{db-tools → tools/db}/backends/mysql/translator.d.ts +0 -0
  108. /package/dist/{db-tools → tools/db}/core/base.d.ts +0 -0
  109. /package/dist/{db-tools → tools/db}/core/base.js +0 -0
  110. /package/dist/{db-tools → tools/db}/core/config-loader.d.ts +0 -0
  111. /package/dist/{db-tools → tools/db}/core/config-loader.js +0 -0
  112. /package/dist/{db-tools → tools/db}/core/index.d.ts +0 -0
  113. /package/dist/{db-tools → tools/db}/core/index.js +0 -0
  114. /package/dist/{db-tools → tools/db}/core/jsonc-parser.d.ts +0 -0
  115. /package/dist/{db-tools → tools/db}/core/jsonc-parser.js +0 -0
  116. /package/dist/{db-tools → tools/db}/core/validator.d.ts +0 -0
  117. /package/dist/{db-tools → tools/db}/core/validator.js +0 -0
  118. /package/dist/{db-tools → tools/db}/index.d.ts +0 -0
  119. /package/dist/{db-tools → tools/db}/index.js +0 -0
  120. /package/dist/{db-tools → tools/db}/interface/backend.d.ts +0 -0
  121. /package/dist/{db-tools → tools/db}/interface/backend.js +0 -0
  122. /package/dist/{db-tools → tools/db}/interface/connection.d.ts +0 -0
  123. /package/dist/{db-tools → tools/db}/interface/connection.js +0 -0
  124. /package/dist/{db-tools → tools/db}/interface/index.d.ts +0 -0
  125. /package/dist/{db-tools → tools/db}/interface/index.js +0 -0
  126. /package/dist/{db-tools → tools/db}/interface/query.d.ts +0 -0
  127. /package/dist/{db-tools → tools/db}/interface/query.js +0 -0
  128. /package/dist/{db-tools → tools/db}/interface/schema.d.ts +0 -0
  129. /package/dist/{db-tools → tools/db}/interface/schema.js +0 -0
  130. /package/dist/{db-tools → tools/db}/tools.d.ts +0 -0
  131. /package/dist/{db-tools → tools/db}/utils.d.ts +0 -0
  132. /package/dist/{db-tools → tools/db}/utils.js +0 -0
  133. /package/dist/{misc-tools → tools/misc}/calculator.d.ts +0 -0
  134. /package/dist/{misc-tools → tools/misc}/calculator.js +0 -0
  135. /package/dist/{misc-tools → tools/misc}/index.d.ts +0 -0
  136. /package/dist/{misc-tools → tools/misc}/index.js +0 -0
  137. /package/dist/{misc-tools → tools/misc}/json-extract.d.ts +0 -0
  138. /package/dist/{misc-tools → tools/misc}/json-extract.js +0 -0
  139. /package/dist/{misc-tools → tools/misc}/json-infer.d.ts +0 -0
  140. /package/dist/{misc-tools → tools/misc}/json-infer.js +0 -0
  141. /package/dist/{misc-tools → tools/misc}/json-validate.d.ts +0 -0
  142. /package/dist/{misc-tools → tools/misc}/timer.d.ts +0 -0
  143. /package/dist/{misc-tools → tools/misc}/timer.js +0 -0
  144. /package/dist/{parser-tools → tools/parser}/obo/index.d.ts +0 -0
  145. /package/dist/{parser-tools → tools/parser}/obo/index.js +0 -0
  146. /package/dist/{parser-tools → tools/parser}/obo/obo.d.ts +0 -0
  147. /package/dist/{parser-tools → tools/parser}/obo/obo.js +0 -0
  148. /package/dist/{parser-tools → tools/parser}/obo/types.d.ts +0 -0
  149. /package/dist/{parser-tools → tools/parser}/obo/types.js +0 -0
  150. /package/dist/{parser-tools → tools/parser}/obo/utils.d.ts +0 -0
  151. /package/dist/{parser-tools → tools/parser}/obo/utils.js +0 -0
  152. /package/dist/{parser-tools → tools/parser}/pubmed/index.d.ts +0 -0
  153. /package/dist/{parser-tools → tools/parser}/pubmed/index.js +0 -0
  154. /package/dist/{parser-tools → tools/parser}/pubmed/pubmed.d.ts +0 -0
  155. /package/dist/{parser-tools → tools/parser}/pubmed/pubmed.js +0 -0
  156. /package/dist/{parser-tools → tools/parser}/pubmed/types.d.ts +0 -0
  157. /package/dist/{parser-tools → tools/parser}/pubmed/types.js +0 -0
  158. /package/dist/{parser-tools → tools/parser}/pubmed/utils.d.ts +0 -0
  159. /package/dist/{parser-tools → tools/parser}/pubmed/utils.js +0 -0
  160. /package/dist/{skill-tools → tools/skill}/frontmatter.d.ts +0 -0
  161. /package/dist/{skill-tools → tools/skill}/frontmatter.js +0 -0
  162. /package/dist/{skill-tools → tools/skill}/index.d.ts +0 -0
  163. /package/dist/{skill-tools → tools/skill}/index.js +0 -0
  164. /package/dist/{skill-tools → tools/skill}/registry.d.ts +0 -0
  165. /package/dist/{skill-tools → tools/skill}/tool.d.ts +0 -0
  166. /package/dist/{skill-tools → tools/skill}/tool.js +0 -0
  167. /package/dist/{skill-tools → tools/skill}/types.d.ts +0 -0
  168. /package/dist/{skill-tools → tools/skill}/types.js +0 -0
  169. /package/dist/{table-tools → tools/table}/index.d.ts +0 -0
  170. /package/dist/{table-tools → tools/table}/index.js +0 -0
  171. /package/dist/{table-tools → tools/table}/tools.d.ts +0 -0
  172. /package/dist/{table-tools → tools/table}/tools.js +0 -0
  173. /package/dist/{table-tools → tools/table}/utils.d.ts +0 -0
@@ -0,0 +1,141 @@
1
+ # Miscellaneous Tool Tests
2
+
3
+ ## Test: Timer - Short Delay
4
+ - Tool: blockingTimer
5
+ - Input:
6
+ ```json
7
+ {"delay": 1}
8
+ ```
9
+ - Validators:
10
+ - contains_string("Timer completed")
11
+ - contains_string("1 seconds")
12
+ - Expected: Timer completed message after 1 second
13
+
14
+ ## Test: Timer - Zero Delay
15
+ - Tool: blockingTimer
16
+ - Input:
17
+ ```json
18
+ {"delay": 0}
19
+ ```
20
+ - Validators:
21
+ - contains_string("Timer completed")
22
+ - Expected: Immediate completion
23
+
24
+ ## Test: Timer - Max Exceeded
25
+ - Tool: blockingTimer
26
+ - Input:
27
+ ```json
28
+ {"delay": 301}
29
+ ```
30
+ - Validators:
31
+ - contains_string("300")
32
+ - contains_string("NOT exceed")
33
+ - Expected: Error about max delay exceeded
34
+
35
+ ## Test: Calculator - Basic Arithmetic
36
+ - Tool: calculator
37
+ - Input:
38
+ ```json
39
+ {"formula": "2 + 3 * 4", "precision": 3}
40
+ ```
41
+ - Validators:
42
+ - has result
43
+ - result === 14
44
+ - Expected: 14 (order of operations: 3*4=12, 2+12=14)
45
+
46
+ ## Test: Calculator - Power
47
+ - Tool: calculator
48
+ - Input:
49
+ ```json
50
+ {"formula": "2 ^ 10", "precision": 0}
51
+ ```
52
+ - Validators:
53
+ - has result
54
+ - result === 1024
55
+ - Expected: 1024 (2 to power of 10)
56
+
57
+ ## Test: Calculator - Brackets
58
+ - Tool: calculator
59
+ - Input:
60
+ ```json
61
+ {"formula": "(2 + 3) * 4", "precision": 3}
62
+ ```
63
+ - Validators:
64
+ - has result
65
+ - result === 20
66
+ - Expected: 20 (brackets first: 5*4=20)
67
+
68
+ ## Test: Calculator - Scientific Notation
69
+ - Tool: calculator
70
+ - Input:
71
+ ```json
72
+ {"formula": "1e3 + 500", "precision": 3}
73
+ ```
74
+ - Validators:
75
+ - has result
76
+ - result === 1500
77
+ - Expected: 1500 (1000 + 500)
78
+
79
+ ## Test: Calculator - Division by Zero
80
+ - Tool: calculator
81
+ - Input:
82
+ ```json
83
+ {"formula": "1 / 0", "precision": 3}
84
+ ```
85
+ - Validators:
86
+ - contains_string("CALCULATOR ERROR")
87
+ - Expected: Error about division by zero
88
+
89
+ ## Test: Calculator - Invalid Syntax
90
+ - Tool: calculator
91
+ - Input:
92
+ ```json
93
+ {"formula": "2(3)", "precision": 3}
94
+ ```
95
+ - Validators:
96
+ - contains_string("CALCULATOR ERROR")
97
+ - contains_string("parentheses")
98
+ - Expected: Error about implicit multiplication not allowed
99
+
100
+ ## Test: Calculator - Precision
101
+ - Tool: calculator
102
+ - Input:
103
+ ```json
104
+ {"formula": "10 / 3", "precision": 2}
105
+ ```
106
+ - Validators:
107
+ - has result
108
+ - result === 3.33
109
+ - Expected: 3.33 (2 decimal places)
110
+
111
+ ## Test: Timer - Exact Boundary
112
+ - Tool: blockingTimer
113
+ - Input:
114
+ ```json
115
+ {"delay": 300}
116
+ ```
117
+ - Validators:
118
+ - contains_string("Timer completed")
119
+ - Expected: Timer completes at exact max boundary (300s)
120
+
121
+ ## Test: Calculator - Empty Formula
122
+ - Tool: calculator
123
+ - Input:
124
+ ```json
125
+ {"formula": "", "precision": 3}
126
+ ```
127
+ - Validators:
128
+ - contains_string("CALCULATOR ERROR")
129
+ - contains_string("empty")
130
+ - Expected: Error about empty formula
131
+
132
+ ## Test: Calculator - Invalid Characters
133
+ - Tool: calculator
134
+ - Input:
135
+ ```json
136
+ {"formula": "2 + abc", "precision": 3}
137
+ ```
138
+ - Validators:
139
+ - contains_string("CALCULATOR ERROR")
140
+ - contains_string("invalid characters")
141
+ - Expected: Error about invalid characters
@@ -0,0 +1,80 @@
1
+ # Parser Tool Tests
2
+
3
+ ## Test: PubMed XML - Single Mode
4
+ - Tool: parse_pubmed_articleSet
5
+ - Input:
6
+ ```json
7
+ {"filePath": ".bioresearcher-tests/workspace/pubmed_sample.xml", "outputMode": "single", "verbose": false}
8
+ ```
9
+ - Validators:
10
+ - success_is_true
11
+ - file_exists
12
+ - stats.total === 2
13
+ - stats.successful === 2
14
+ - Expected: Single markdown file with 2 articles
15
+
16
+ ## Test: PubMed XML - Excel Mode
17
+ - Tool: parse_pubmed_articleSet
18
+ - Input:
19
+ ```json
20
+ {"filePath": ".bioresearcher-tests/workspace/pubmed_sample.xml", "outputMode": "excel", "outputFileName": "pubmed_test.xlsx", "verbose": false}
21
+ ```
22
+ - Validators:
23
+ - success_is_true
24
+ - file_exists
25
+ - file ends with .xlsx
26
+ - Expected: Excel file with PMID, Title, Authors, Journal, DOI, Abstract, Keywords columns
27
+
28
+ ## Test: PubMed XML - Individual Mode
29
+ - Tool: parse_pubmed_articleSet
30
+ - Input:
31
+ ```json
32
+ {"filePath": ".bioresearcher-tests/workspace/pubmed_sample.xml", "outputMode": "individual", "verbose": false}
33
+ ```
34
+ - Validators:
35
+ - success_is_true
36
+ - directory exists
37
+ - Expected: Directory with individual .md files per article
38
+
39
+ ## Test: OBO - Basic Parsing
40
+ - Tool: parse_obo_file
41
+ - Input:
42
+ ```json
43
+ {"filePath": ".bioresearcher-tests/workspace/obo_sample.obo", "outputFileName": "obo_test.csv", "verbose": false}
44
+ ```
45
+ - Validators:
46
+ - success_is_true
47
+ - file_exists
48
+ - stats.terms >= 3
49
+ - Expected: CSV file with term data
50
+
51
+ ## Test: PubMed - Nonexistent File
52
+ - Tool: parse_pubmed_articleSet
53
+ - Input:
54
+ ```json
55
+ {"filePath": ".bioresearcher-tests/workspace/nonexistent.xml", "outputMode": "single"}
56
+ ```
57
+ - Validators:
58
+ - contains_string("error")
59
+ - Expected: Error response
60
+
61
+ ## Test: PubMed - Compressed Input
62
+ - Tool: parse_pubmed_articleSet
63
+ - Input:
64
+ ```json
65
+ {"filePath": "<skill_path>/resources/pubmed_sample.xml.gz", "outputMode": "single", "verbose": false}
66
+ ```
67
+ - Validators:
68
+ - success_is_true
69
+ - stats.total === 2
70
+ - Expected: Handles .xml.gz compressed files directly
71
+
72
+ ## Test: OBO - Nonexistent File
73
+ - Tool: parse_obo_file
74
+ - Input:
75
+ ```json
76
+ {"filePath": ".bioresearcher-tests/workspace/nonexistent.obo", "outputFileName": "test.csv", "verbose": false}
77
+ ```
78
+ - Validators:
79
+ - contains_string("error")
80
+ - Expected: Error response for file not found
@@ -0,0 +1,59 @@
1
+ # Skill Tests
2
+
3
+ ## Test: Load demo-skill
4
+ - Tool: skill
5
+ - Input:
6
+ ```json
7
+ {"name": "demo-skill"}
8
+ ```
9
+ - Validators:
10
+ - contains_string("skill_content")
11
+ - contains_string("demo-skill")
12
+ - Expected: Skill content loaded successfully
13
+
14
+ ## Test: Load bioresearcher-core
15
+ - Tool: skill
16
+ - Input:
17
+ ```json
18
+ {"name": "bioresearcher-core"}
19
+ ```
20
+ - Validators:
21
+ - contains_string("skill_content")
22
+ - contains_string("bioresearcher-core")
23
+ - contains_string("allowed_tools")
24
+ - Expected: Skill content with allowedTools list
25
+
26
+ ## Test: Execute demo-skill Script
27
+ - Tool: Bash
28
+ - Prerequisite: Load skill demo-skill first, extract skill_path
29
+ - Input:
30
+ ```bash
31
+ cd <skill_path>/../demo-skill && python demo_script.py
32
+ ```
33
+ - Validators:
34
+ - contains_string("Resources resolved")
35
+ - Expected: Demo script executes successfully
36
+
37
+ ## Test: Skill Not Found
38
+ - Tool: skill
39
+ - Input:
40
+ ```json
41
+ {"name": "nonexistent-skill-xyz-12345"}
42
+ ```
43
+ - Validators:
44
+ - contains_string("not found")
45
+ - Expected: Error with available skills list
46
+
47
+ ---
48
+
49
+ ## Skipped: Skills with User Interaction
50
+
51
+ The following skills are NOT tested because they use the Question tool
52
+ and require user interaction during execution:
53
+
54
+ - `python-setup-uv` - Uses Question tool for installer choice and AGENTS.md update
55
+ - `long-table-summary` - Uses Question tool for table location, instructions, batch size
56
+ - `env-jsonc-setup` - Uses Question tool for configuration options
57
+ - `pubmed-weekly` - May use Question tool for download options
58
+
59
+ These skills are tested for metadata only (loading succeeds, content returned).
@@ -0,0 +1,194 @@
1
+ # Table Tool Tests
2
+
3
+ ## Test: List Sheets
4
+ - Tool: tableListSheets
5
+ - Input:
6
+ ```json
7
+ {"file_path": ".bioresearcher-tests/workspace/table_sample.xlsx"}
8
+ ```
9
+ - Validators:
10
+ - has sheets array
11
+ - array_length >= 1
12
+ - Expected: List of sheet names
13
+
14
+ ## Test: Get Sheet Preview
15
+ - Tool: tableGetSheetPreview
16
+ - Input:
17
+ ```json
18
+ {"file_path": ".bioresearcher-tests/workspace/table_sample.xlsx"}
19
+ ```
20
+ - Validators:
21
+ - has preview array
22
+ - has total_rows
23
+ - Expected: First 6 rows preview
24
+
25
+ ## Test: Get Headers
26
+ - Tool: tableGetHeaders
27
+ - Input:
28
+ ```json
29
+ {"file_path": ".bioresearcher-tests/workspace/table_sample.xlsx"}
30
+ ```
31
+ - Validators:
32
+ - has headers array
33
+ - headers includes "Name"
34
+ - Expected: Column headers
35
+
36
+ ## Test: Get Cell
37
+ - Tool: tableGetCell
38
+ - Input:
39
+ ```json
40
+ {"file_path": ".bioresearcher-tests/workspace/table_sample.xlsx", "cell_address": "A1"}
41
+ ```
42
+ - Validators:
43
+ - has value
44
+ - has type
45
+ - Expected: Cell A1 value
46
+
47
+ ## Test: Get Range
48
+ - Tool: tableGetRange
49
+ - Input:
50
+ ```json
51
+ {"file_path": ".bioresearcher-tests/workspace/table_sample.xlsx", "range": "A1:C3"}
52
+ ```
53
+ - Validators:
54
+ - has data array
55
+ - rows === 3
56
+ - columns === 3
57
+ - Expected: 3x3 data array
58
+
59
+ ## Test: Filter Rows
60
+ - Tool: tableFilterRows
61
+ - Input:
62
+ ```json
63
+ {"file_path": ".bioresearcher-tests/workspace/table_sample.xlsx", "column": "Age", "operator": ">", "value": 25, "max_results": 100}
64
+ ```
65
+ - Validators:
66
+ - has matched_rows
67
+ - has total_matches
68
+ - Expected: Filtered rows where Age > 25
69
+
70
+ ## Test: Search
71
+ - Tool: tableSearch
72
+ - Input:
73
+ ```json
74
+ {"file_path": ".bioresearcher-tests/workspace/table_sample.xlsx", "search_term": "Active", "max_results": 50}
75
+ ```
76
+ - Validators:
77
+ - has results array
78
+ - has total_found
79
+ - Expected: Cells containing "Active"
80
+
81
+ ## Test: Summarize
82
+ - Tool: tableSummarize
83
+ - Input:
84
+ ```json
85
+ {"file_path": ".bioresearcher-tests/workspace/table_sample.xlsx", "columns": ["Age", "Score"]}
86
+ ```
87
+ - Validators:
88
+ - has summaries object
89
+ - Expected: Statistical summary with sum, avg, min, max, std_dev
90
+
91
+ ## Test: Group By
92
+ - Tool: tableGroupBy
93
+ - Input:
94
+ ```json
95
+ {"file_path": ".bioresearcher-tests/workspace/table_sample.xlsx", "group_column": "Category", "agg_column": "Score", "agg_type": "avg"}
96
+ ```
97
+ - Validators:
98
+ - has groups object
99
+ - Expected: Grouped averages by Category
100
+
101
+ ## Test: Create File
102
+ - Tool: tableCreateFile
103
+ - Input:
104
+ ```json
105
+ {"file_path": ".bioresearcher-tests/workspace/output_created.xlsx", "sheet_name": "TestData", "data": [{"Name": "Alice", "Age": 30}, {"Name": "Bob", "Age": 25}]}
106
+ ```
107
+ - Validators:
108
+ - success_is_true
109
+ - rows_created === 2
110
+ - Expected: New Excel file created with 2 rows
111
+
112
+ ## Test: Append Rows
113
+ - Tool: tableAppendRows
114
+ - Prerequisite: Test "Create File" must pass first
115
+ - Input:
116
+ ```json
117
+ {"file_path": ".bioresearcher-tests/workspace/output_created.xlsx", "rows": [{"Name": "Charlie", "Age": 35}]}
118
+ ```
119
+ - Validators:
120
+ - success_is_true
121
+ - rows_appended === 1
122
+ - Expected: Row appended to existing file
123
+
124
+ ## Test: Update Cell
125
+ - Tool: tableUpdateCell
126
+ - Prerequisite: Test "Create File" must pass first
127
+ - Input:
128
+ ```json
129
+ {"file_path": ".bioresearcher-tests/workspace/output_created.xlsx", "cell_address": "A1", "value": "UpdatedName"}
130
+ ```
131
+ - Validators:
132
+ - success_is_true
133
+ - Expected: Cell A1 updated to "UpdatedName"
134
+
135
+ ## Test: Pivot Summary
136
+ - Tool: tablePivotSummary
137
+ - Input:
138
+ ```json
139
+ {"file_path": ".bioresearcher-tests/workspace/table_sample.xlsx", "row_field": "Category", "col_field": "Status", "value_field": "Score", "agg": "sum"}
140
+ ```
141
+ - Validators:
142
+ - has pivot object
143
+ - has columns array
144
+ - Expected: Pivot table with Category rows, Status columns, Score sums
145
+
146
+ ## Test: Nonexistent File
147
+ - Tool: tableListSheets
148
+ - Input:
149
+ ```json
150
+ {"file_path": ".bioresearcher-tests/workspace/nonexistent.xlsx"}
151
+ ```
152
+ - Validators:
153
+ - contains_string("Error")
154
+ - Expected: Error response for file not found
155
+
156
+ ## Test: Invalid Cell Address
157
+ - Tool: tableGetCell
158
+ - Input:
159
+ ```json
160
+ {"file_path": ".bioresearcher-tests/workspace/table_sample.xlsx", "cell_address": "INVALID"}
161
+ ```
162
+ - Validators:
163
+ - contains_string("Error")
164
+ - Expected: Error response for invalid address
165
+
166
+ ## Test: Invalid Filter Operator
167
+ - Tool: tableFilterRows
168
+ - Input:
169
+ ```json
170
+ {"file_path": ".bioresearcher-tests/workspace/table_sample.xlsx", "column": "Age", "operator": "INVALID", "value": 25, "max_results": 100}
171
+ ```
172
+ - Validators:
173
+ - contains_string("Error")
174
+ - Expected: Error response for invalid operator
175
+
176
+ ## Test: Nonexistent Column
177
+ - Tool: tableSummarize
178
+ - Input:
179
+ ```json
180
+ {"file_path": ".bioresearcher-tests/workspace/table_sample.xlsx", "columns": ["NonexistentColumn"]}
181
+ ```
182
+ - Validators:
183
+ - has summaries object
184
+ - Expected: Empty summaries (graceful handling)
185
+
186
+ ## Test: Out of Bounds Range
187
+ - Tool: tableGetRange
188
+ - Input:
189
+ ```json
190
+ {"file_path": ".bioresearcher-tests/workspace/table_sample.xlsx", "range": "Z999:ZZ999"}
191
+ ```
192
+ - Validators:
193
+ - has data array
194
+ - Expected: Empty data array (out of bounds handled)