@deimoscloud/coreai 0.1.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 (216) hide show
  1. package/.prettierrc +9 -0
  2. package/AGENT_SPEC.md +347 -0
  3. package/ARCHITECTURE.md +547 -0
  4. package/DRAFT_PRD.md +1440 -0
  5. package/IMPLEMENTATION_PLAN.md +256 -0
  6. package/PRODUCT.md +473 -0
  7. package/README.md +303 -0
  8. package/WORKFLOWS.md +295 -0
  9. package/agents/_templates/ic-engineer.md +185 -0
  10. package/agents/_templates/reviewer.md +182 -0
  11. package/agents/backend-engineer.yaml +72 -0
  12. package/agents/devops-engineer.yaml +72 -0
  13. package/agents/engineering-manager.yaml +70 -0
  14. package/agents/examples/android-engineer.md +302 -0
  15. package/agents/examples/backend-engineer.md +320 -0
  16. package/agents/examples/devops-engineer.md +742 -0
  17. package/agents/examples/engineering-manager.md +469 -0
  18. package/agents/examples/frontend-engineer.md +58 -0
  19. package/agents/examples/product-manager.md +315 -0
  20. package/agents/examples/qa-engineer.md +371 -0
  21. package/agents/examples/security-engineer.md +525 -0
  22. package/agents/examples/solutions-architect.md +351 -0
  23. package/agents/examples/wearos-engineer.md +359 -0
  24. package/agents/frontend-engineer.yaml +72 -0
  25. package/commands/core/check-inbox.md +34 -0
  26. package/commands/core/delegate.md +30 -0
  27. package/commands/core/git-commit.md +144 -0
  28. package/commands/core/pr-create.md +193 -0
  29. package/commands/core/review.md +56 -0
  30. package/commands/core/sprint-status.md +65 -0
  31. package/commands/optional/docs-update.md +200 -0
  32. package/commands/optional/jira-create.md +200 -0
  33. package/commands/optional/jira-transition.md +184 -0
  34. package/commands/optional/worktree-cleanup.md +167 -0
  35. package/commands/optional/worktree-setup.md +110 -0
  36. package/dist/cli/index.js +4037 -0
  37. package/dist/cli/index.js.map +1 -0
  38. package/dist/index.d.ts +2978 -0
  39. package/dist/index.js +3867 -0
  40. package/dist/index.js.map +1 -0
  41. package/eslint.config.js +29 -0
  42. package/jest.config.js +22 -0
  43. package/knowledge-library/README.md +118 -0
  44. package/knowledge-library/android-engineer/context/current.txt +42 -0
  45. package/knowledge-library/android-engineer/control/decisions.txt +9 -0
  46. package/knowledge-library/android-engineer/control/dependencies.txt +19 -0
  47. package/knowledge-library/android-engineer/control/objectives.txt +26 -0
  48. package/knowledge-library/android-engineer/history/.gitkeep +0 -0
  49. package/knowledge-library/android-engineer/inbox/processed/.gitkeep +0 -0
  50. package/knowledge-library/android-engineer/outbox/.gitkeep +0 -0
  51. package/knowledge-library/android-engineer/tech/.gitkeep +0 -0
  52. package/knowledge-library/architecture.txt +61 -0
  53. package/knowledge-library/backend-engineer/context/current.txt +42 -0
  54. package/knowledge-library/backend-engineer/control/decisions.txt +9 -0
  55. package/knowledge-library/backend-engineer/control/dependencies.txt +19 -0
  56. package/knowledge-library/backend-engineer/control/objectives.txt +26 -0
  57. package/knowledge-library/backend-engineer/history/.gitkeep +0 -0
  58. package/knowledge-library/backend-engineer/inbox/processed/.gitkeep +0 -0
  59. package/knowledge-library/backend-engineer/outbox/.gitkeep +0 -0
  60. package/knowledge-library/backend-engineer/tech/.gitkeep +0 -0
  61. package/knowledge-library/context.txt +52 -0
  62. package/knowledge-library/devops-engineer/context/current.txt +42 -0
  63. package/knowledge-library/devops-engineer/control/decisions.txt +9 -0
  64. package/knowledge-library/devops-engineer/control/dependencies.txt +19 -0
  65. package/knowledge-library/devops-engineer/control/objectives.txt +26 -0
  66. package/knowledge-library/devops-engineer/history/.gitkeep +0 -0
  67. package/knowledge-library/devops-engineer/inbox/processed/.gitkeep +0 -0
  68. package/knowledge-library/devops-engineer/outbox/.gitkeep +0 -0
  69. package/knowledge-library/devops-engineer/tech/.gitkeep +0 -0
  70. package/knowledge-library/engineering-manager/context/current.txt +40 -0
  71. package/knowledge-library/engineering-manager/control/decisions.txt +9 -0
  72. package/knowledge-library/engineering-manager/control/objectives.txt +27 -0
  73. package/knowledge-library/engineering-manager/history/.gitkeep +0 -0
  74. package/knowledge-library/engineering-manager/inbox/processed/.gitkeep +0 -0
  75. package/knowledge-library/engineering-manager/outbox/.gitkeep +0 -0
  76. package/knowledge-library/engineering-manager/tech/.gitkeep +0 -0
  77. package/knowledge-library/prd.txt +81 -0
  78. package/knowledge-library/product-manager/context/current.txt +42 -0
  79. package/knowledge-library/product-manager/control/decisions.txt +9 -0
  80. package/knowledge-library/product-manager/control/dependencies.txt +19 -0
  81. package/knowledge-library/product-manager/control/objectives.txt +26 -0
  82. package/knowledge-library/product-manager/history/.gitkeep +0 -0
  83. package/knowledge-library/product-manager/inbox/processed/.gitkeep +0 -0
  84. package/knowledge-library/product-manager/outbox/.gitkeep +0 -0
  85. package/knowledge-library/product-manager/tech/.gitkeep +0 -0
  86. package/knowledge-library/qa-engineer/context/current.txt +42 -0
  87. package/knowledge-library/qa-engineer/control/decisions.txt +9 -0
  88. package/knowledge-library/qa-engineer/control/dependencies.txt +19 -0
  89. package/knowledge-library/qa-engineer/control/objectives.txt +26 -0
  90. package/knowledge-library/qa-engineer/history/.gitkeep +0 -0
  91. package/knowledge-library/qa-engineer/inbox/processed/.gitkeep +0 -0
  92. package/knowledge-library/qa-engineer/outbox/.gitkeep +0 -0
  93. package/knowledge-library/qa-engineer/tech/.gitkeep +0 -0
  94. package/knowledge-library/security-engineer/context/current.txt +42 -0
  95. package/knowledge-library/security-engineer/control/decisions.txt +9 -0
  96. package/knowledge-library/security-engineer/control/dependencies.txt +19 -0
  97. package/knowledge-library/security-engineer/control/objectives.txt +26 -0
  98. package/knowledge-library/security-engineer/history/.gitkeep +0 -0
  99. package/knowledge-library/security-engineer/inbox/processed/.gitkeep +0 -0
  100. package/knowledge-library/security-engineer/outbox/.gitkeep +0 -0
  101. package/knowledge-library/security-engineer/tech/.gitkeep +0 -0
  102. package/knowledge-library/solutions-architect/context/current.txt +42 -0
  103. package/knowledge-library/solutions-architect/control/decisions.txt +9 -0
  104. package/knowledge-library/solutions-architect/control/dependencies.txt +19 -0
  105. package/knowledge-library/solutions-architect/control/objectives.txt +26 -0
  106. package/knowledge-library/solutions-architect/history/.gitkeep +0 -0
  107. package/knowledge-library/solutions-architect/inbox/processed/.gitkeep +0 -0
  108. package/knowledge-library/solutions-architect/outbox/.gitkeep +0 -0
  109. package/knowledge-library/solutions-architect/tech/.gitkeep +0 -0
  110. package/knowledge-library/wearos-engineer/context/current.txt +42 -0
  111. package/knowledge-library/wearos-engineer/control/decisions.txt +9 -0
  112. package/knowledge-library/wearos-engineer/control/dependencies.txt +19 -0
  113. package/knowledge-library/wearos-engineer/control/objectives.txt +26 -0
  114. package/knowledge-library/wearos-engineer/history/.gitkeep +0 -0
  115. package/knowledge-library/wearos-engineer/inbox/processed/.gitkeep +0 -0
  116. package/knowledge-library/wearos-engineer/outbox/.gitkeep +0 -0
  117. package/knowledge-library/wearos-engineer/tech/.gitkeep +0 -0
  118. package/package.json +66 -0
  119. package/schemas/agent.schema.json +171 -0
  120. package/schemas/coreai.config.schema.json +257 -0
  121. package/scripts/add-agent.sh +323 -0
  122. package/scripts/install.sh +354 -0
  123. package/src/adapters/factory.test.ts +386 -0
  124. package/src/adapters/factory.ts +305 -0
  125. package/src/adapters/index.ts +113 -0
  126. package/src/adapters/interfaces.ts +268 -0
  127. package/src/adapters/mcp/client.test.ts +130 -0
  128. package/src/adapters/mcp/client.ts +451 -0
  129. package/src/adapters/mcp/discovery.test.ts +315 -0
  130. package/src/adapters/mcp/discovery.ts +340 -0
  131. package/src/adapters/mcp/index.ts +66 -0
  132. package/src/adapters/mcp/mapper.test.ts +218 -0
  133. package/src/adapters/mcp/mapper.ts +536 -0
  134. package/src/adapters/mcp/registry.test.ts +433 -0
  135. package/src/adapters/mcp/registry.ts +550 -0
  136. package/src/adapters/mcp/types.ts +258 -0
  137. package/src/adapters/native/filesystem.test.ts +350 -0
  138. package/src/adapters/native/filesystem.ts +393 -0
  139. package/src/adapters/native/github.test.ts +173 -0
  140. package/src/adapters/native/github.ts +627 -0
  141. package/src/adapters/native/index.ts +22 -0
  142. package/src/adapters/native/selector.test.ts +224 -0
  143. package/src/adapters/native/selector.ts +150 -0
  144. package/src/adapters/types.ts +270 -0
  145. package/src/agents/compiler.test.ts +399 -0
  146. package/src/agents/compiler.ts +359 -0
  147. package/src/agents/index.ts +36 -0
  148. package/src/agents/loader.test.ts +319 -0
  149. package/src/agents/loader.ts +143 -0
  150. package/src/agents/resolver.test.ts +282 -0
  151. package/src/agents/resolver.ts +262 -0
  152. package/src/agents/types.ts +87 -0
  153. package/src/cache/index.ts +38 -0
  154. package/src/cache/interfaces.ts +283 -0
  155. package/src/cache/manager.test.ts +266 -0
  156. package/src/cache/manager.ts +388 -0
  157. package/src/cache/provider.test.ts +485 -0
  158. package/src/cache/provider.ts +745 -0
  159. package/src/cache/types.test.ts +192 -0
  160. package/src/cache/types.ts +313 -0
  161. package/src/cli/commands/build.test.ts +248 -0
  162. package/src/cli/commands/build.ts +244 -0
  163. package/src/cli/commands/cache.test.ts +221 -0
  164. package/src/cli/commands/cache.ts +229 -0
  165. package/src/cli/commands/index.ts +63 -0
  166. package/src/cli/commands/init.test.ts +173 -0
  167. package/src/cli/commands/init.ts +296 -0
  168. package/src/cli/commands/skills.test.ts +272 -0
  169. package/src/cli/commands/skills.ts +348 -0
  170. package/src/cli/commands/status.test.ts +392 -0
  171. package/src/cli/commands/status.ts +332 -0
  172. package/src/cli/commands/sync.test.ts +213 -0
  173. package/src/cli/commands/sync.ts +251 -0
  174. package/src/cli/commands/validate.test.ts +216 -0
  175. package/src/cli/commands/validate.ts +340 -0
  176. package/src/cli/index.test.ts +190 -0
  177. package/src/cli/index.ts +493 -0
  178. package/src/commands/context.test.ts +163 -0
  179. package/src/commands/context.ts +111 -0
  180. package/src/commands/index.ts +56 -0
  181. package/src/commands/loader.test.ts +273 -0
  182. package/src/commands/loader.ts +355 -0
  183. package/src/commands/registry.test.ts +384 -0
  184. package/src/commands/registry.ts +248 -0
  185. package/src/commands/runner.test.ts +297 -0
  186. package/src/commands/runner.ts +222 -0
  187. package/src/commands/types.ts +361 -0
  188. package/src/config/index.ts +19 -0
  189. package/src/config/loader.test.ts +262 -0
  190. package/src/config/loader.ts +188 -0
  191. package/src/config/types.ts +154 -0
  192. package/src/context/index.ts +14 -0
  193. package/src/context/loader.test.ts +334 -0
  194. package/src/context/loader.ts +357 -0
  195. package/src/index.test.ts +13 -0
  196. package/src/index.ts +244 -0
  197. package/src/knowledge-library/index.ts +44 -0
  198. package/src/knowledge-library/manager.test.ts +536 -0
  199. package/src/knowledge-library/manager.ts +804 -0
  200. package/src/knowledge-library/types.ts +432 -0
  201. package/src/skills/generator.test.ts +602 -0
  202. package/src/skills/generator.ts +491 -0
  203. package/src/skills/index.ts +27 -0
  204. package/src/skills/templates.ts +520 -0
  205. package/src/skills/types.ts +251 -0
  206. package/templates/completion-report.md +72 -0
  207. package/templates/feedback.md +56 -0
  208. package/templates/project-files/CLAUDE.md.template +109 -0
  209. package/templates/project-files/coreai.json.example +47 -0
  210. package/templates/project-files/mcp.json.template +20 -0
  211. package/templates/review-complete.md +64 -0
  212. package/templates/review-request.md +67 -0
  213. package/templates/task-assignment.md +51 -0
  214. package/tsconfig.build.json +4 -0
  215. package/tsconfig.json +26 -0
  216. package/tsup.config.ts +23 -0
@@ -0,0 +1,256 @@
1
+ # CoreAI Platform - Implementation Plan
2
+
3
+ ## Phase 1: Core Platform (MVP)
4
+
5
+ ### Epic 1: Project Foundation
6
+
7
+ #### 1.1 Initialize TypeScript/Node.js Project ✅
8
+ - [x] Initialize npm package with `@deimoscloud/coreai` name
9
+ - [x] Set up TypeScript configuration
10
+ - [x] Configure ESLint + Prettier
11
+ - [x] Set up Jest for testing
12
+ - [x] Create basic CLI entry point using Commander.js or similar
13
+ - [x] Set up build pipeline (tsup or similar)
14
+
15
+ #### 1.2 Configuration Schema ✅
16
+ - [x] Define JSON schema for `coreai.config.yaml`
17
+ - [x] Implement YAML parser with schema validation
18
+ - [x] Create TypeScript types from schema
19
+ - [x] Add config file discovery (walk up directory tree)
20
+ - [x] Implement config defaults and merging
21
+
22
+ **Deliverable:** `coreai init` command that creates a valid `coreai.config.yaml`
23
+
24
+ ---
25
+
26
+ ### Epic 2: Agent System ✅
27
+
28
+ #### 2.1 Agent YAML Schema
29
+ - [x] Define JSON schema for agent YAML definitions
30
+ - [x] Create core agent definitions (refactor from current .md files):
31
+ - [x] backend-engineer.yaml
32
+ - [x] frontend-engineer.yaml
33
+ - [x] devops-engineer.yaml
34
+ - [x] engineering-manager.yaml
35
+ - [x] Implement variable resolution (`${config.*}`, `${agent.*}`, `${remote.*}`)
36
+
37
+ #### 2.2 Agent Compiler (YAML → Markdown)
38
+ - [x] Build compiler that transforms YAML to Claude-compatible .md
39
+ - [x] Handle context source injection (remote + local paths)
40
+ - [x] Support agent customization from config overrides
41
+ - [x] Support custom agents from `coreai/agents/` directory
42
+
43
+ #### 2.3 Agent Commands ✅
44
+ - [x] `coreai build` - compile all agents to `.claude/agents/`
45
+ - [x] `coreai agents list` - show available agents
46
+ - [x] `coreai agents show <name>` - display agent details
47
+
48
+ **Deliverable:** Running `coreai build` generates `.claude/agents/*.md` files from YAML definitions ✅
49
+
50
+ ---
51
+
52
+ ### Epic 3: Integration Adapter Framework ✅
53
+
54
+ #### 3.1 Adapter Interfaces
55
+ - [x] Define `IssueTracker` interface
56
+ - [x] Define `GitProvider` interface
57
+ - [x] Define `DocumentationProvider` interface
58
+ - [x] Create adapter factory with provider selection logic
59
+
60
+ #### 3.2 MCP Integration Layer
61
+ - [x] Create MCP client wrapper
62
+ - [x] Implement server discovery (from claude config)
63
+ - [x] Build tool mapping system for supported servers
64
+ - [x] Add auto-discovery for unknown servers (with confidence scoring)
65
+
66
+ #### 3.3 MCP Server Registry
67
+ - [x] Create supported servers registry structure
68
+ - [x] Add mapping for `@modelcontextprotocol/server-github`
69
+ - [x] Research and add Jira MCP server mapping
70
+ - [x] Add mapping for Confluence MCP server
71
+
72
+ #### 3.4 Native Adapter Fallbacks (minimal for MVP)
73
+ - [x] GitHub native adapter (for when MCP unavailable)
74
+ - [x] Local filesystem adapter (offline/testing)
75
+
76
+ **Deliverable:** Commands can call `context.getAdapter('issue_tracker')` and get working adapter ✅
77
+
78
+ ---
79
+
80
+ ### Epic 4: Shared Context & Cache ✅
81
+
82
+ #### 4.1 Cache System
83
+ - [x] Create `.coreai/cache/` directory structure
84
+ - [x] Implement cache read/write operations
85
+ - [x] Add cache metadata (timestamps, source URLs)
86
+
87
+ #### 4.2 Context Loader
88
+ - [x] Implement remote context fetching via DocumentationProvider
89
+ - [x] Cache-first resolution with remote fallback
90
+ - [x] Handle missing cache (first run) gracefully
91
+
92
+ #### 4.3 Sync Commands
93
+ - [x] `coreai sync` - refresh cache from remote
94
+ - [x] `coreai sync --force` - clear and refresh
95
+ - [x] `coreai cache clear` - remove local cache
96
+ - [x] `coreai cache status` - show cache state
97
+
98
+ **Deliverable:** Agents can reference remote docs that are cached locally ✅
99
+
100
+ ---
101
+
102
+ ### Epic 5: Commands & Skills ✅
103
+
104
+ #### 5.1 Command Framework
105
+ - [x] Create command registration system
106
+ - [x] Implement runtime config reading
107
+ - [x] Add graceful degradation (skip steps if integration missing)
108
+ - [x] Support project-specific commands from `coreai/commands/`
109
+
110
+ #### 5.2 Core Commands
111
+ - [x] `coreai init` - initialize new project
112
+ - [x] `coreai build` - compile agents
113
+ - [x] `coreai sync` - sync shared context
114
+ - [x] `coreai validate` - validate config and setup
115
+
116
+ #### 5.3 Skill Generation
117
+ - [x] Generate Claude skills from config
118
+ - [x] Output to `.claude/commands/` directory
119
+ - [x] Skills adapt based on configured integrations
120
+
121
+ **Deliverable:** `coreai init && coreai build` sets up a working project ✅
122
+
123
+ ---
124
+
125
+ ### Epic 6: Local State (KnowledgeLibrary) ✅
126
+
127
+ #### 6.1 Directory Structure
128
+ - [x] Define KnowledgeLibrary structure per agent
129
+ - [x] Create initialization for new agents
130
+ - [x] Handle inbox/outbox directories
131
+
132
+ #### 6.2 State Commands
133
+ - [x] `coreai status` - show agent states, pending messages
134
+ - [x] Integration with agent build (ensure directories exist)
135
+
136
+ **Deliverable:** Local agent working state functions as before ✅
137
+
138
+ ---
139
+
140
+ ## Implementation Order (Suggested)
141
+
142
+ ```
143
+ Week 1-2: Epic 1 (Foundation)
144
+ └── Basic CLI, config schema, project structure
145
+
146
+ Week 3-4: Epic 2 (Agent System)
147
+ └── YAML schema, compiler, core agents
148
+
149
+ Week 5-6: Epic 3 (Adapters)
150
+ └── Interfaces, MCP integration, GitHub adapter
151
+
152
+ Week 7-8: Epic 4 (Context & Cache)
153
+ └── Cache system, sync commands
154
+
155
+ Week 9-10: Epic 5 (Commands)
156
+ └── Command framework, skill generation
157
+
158
+ Week 11-12: Epic 6 (Local State) + Integration Testing
159
+ └── KnowledgeLibrary, end-to-end testing
160
+ ```
161
+
162
+ ---
163
+
164
+ ## Definition of Done (Phase 1 MVP)
165
+
166
+ - [x] Engineer can run `npm install -g @deimoscloud/coreai`
167
+ - [x] Engineer can run `coreai init` in a new project
168
+ - [x] Engineer can configure integrations in `coreai.config.yaml`
169
+ - [x] Engineer can run `coreai build` to generate agent files
170
+ - [x] Engineer can run `coreai sync` to fetch shared context
171
+ - [x] Generated agents work with Claude Code
172
+ - [x] At least GitHub integration works end-to-end
173
+ - [ ] Documentation covers setup and configuration (in progress)
174
+
175
+ ---
176
+
177
+ ## Project Tooling
178
+
179
+ | Need | Decision |
180
+ |------|----------|
181
+ | Issue tracking | GitHub Issues |
182
+ | Git provider | GitHub |
183
+ | Documentation | Markdown in repo |
184
+
185
+ Lightweight approach for now. Will dogfood Jira/Confluence integrations once they're built.
186
+
187
+ ---
188
+
189
+ ## Open Implementation Questions
190
+
191
+ 1. **CLI framework** - Commander.js, oclif, or yargs?
192
+
193
+ **Answer:** Commander.js - lightweight, widely known, sufficient for our needs.
194
+
195
+ 2. **MCP client** - Use existing SDK or implement minimal client?
196
+
197
+ **Answer:** Official MCP SDK (`@modelcontextprotocol/sdk`) - handles protocol evolution, edge cases, and reduces maintenance burden.
198
+
199
+ 3. **Testing strategy** - Unit tests + integration tests with mocked MCP?
200
+
201
+ **Answer:** Unit + Mocked integration tests. Unit tests for pure logic (config, compiler), mocked integration for adapters. Jest as test framework. No real API calls in tests.
202
+
203
+ 4. **Monorepo vs single package** - One package or split (core, cli, adapters)?
204
+
205
+ **Answer:** Single package (`@deimoscloud/coreai`) for MVP. Simpler tooling, one install command. Can split later if needed based on real usage patterns.
206
+
207
+ ---
208
+
209
+ ## Files to Create (Initial Structure)
210
+
211
+ ```
212
+ coreai/
213
+ ├── package.json
214
+ ├── tsconfig.json
215
+ ├── src/
216
+ │ ├── cli/
217
+ │ │ ├── index.ts # Entry point
218
+ │ │ └── commands/
219
+ │ │ ├── init.ts
220
+ │ │ ├── build.ts
221
+ │ │ ├── sync.ts
222
+ │ │ └── validate.ts
223
+ │ ├── config/
224
+ │ │ ├── schema.ts # JSON schema
225
+ │ │ ├── loader.ts # Config loading
226
+ │ │ └── types.ts # TypeScript types
227
+ │ ├── agents/
228
+ │ │ ├── schema.ts # Agent YAML schema
229
+ │ │ ├── compiler.ts # YAML → MD compiler
230
+ │ │ └── definitions/ # Core agent YAMLs
231
+ │ ├── adapters/
232
+ │ │ ├── interfaces.ts # IssueTracker, GitProvider, etc.
233
+ │ │ ├── factory.ts # Adapter creation
234
+ │ │ ├── mcp/
235
+ │ │ │ ├── client.ts # MCP client wrapper
236
+ │ │ │ └── registry.ts # Supported servers
237
+ │ │ └── native/
238
+ │ │ ├── github.ts
239
+ │ │ └── filesystem.ts
240
+ │ ├── context/
241
+ │ │ ├── cache.ts # Cache operations
242
+ │ │ └── loader.ts # Context resolution
243
+ │ └── state/
244
+ │ └── knowledge-library.ts
245
+ ├── schemas/
246
+ │ ├── coreai.config.schema.json
247
+ │ └── agent.schema.json
248
+ └── agents/ # Core agent definitions
249
+ ├── backend-engineer.yaml
250
+ ├── frontend-engineer.yaml
251
+ └── ...
252
+ ```
253
+
254
+ ---
255
+
256
+ *Generated from DRAFT_PRD.md decisions*