myaiforone 1.0.0 → 1.0.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 (44) hide show
  1. package/.claude/commands/MyAgentSkillCreate.md +300 -0
  2. package/.claude/commands/onboarding.md +162 -0
  3. package/.claude/commands/opAgents_AddNew.md +248 -0
  4. package/.claude/commands/opcompact.md +47 -0
  5. package/.claude/commands/opreset.md +25 -0
  6. package/.claude/commands/setup.md +294 -0
  7. package/agents/platform/gym/CLAUDE.md +32 -0
  8. package/agents/platform/gym/agent.json +2 -2
  9. package/agents/platform/gym/programs/ai-tools-onboarding/program.json +202 -0
  10. package/agents/platform/gym/programs/using-myaiforone/program.json +229 -0
  11. package/agents/platform/hub/CLAUDE.md +9 -0
  12. package/config.example.json +18 -0
  13. package/dist/executor.d.ts.map +1 -1
  14. package/dist/executor.js +2 -1
  15. package/dist/executor.js.map +1 -1
  16. package/dist/web-ui.d.ts.map +1 -1
  17. package/dist/web-ui.js +27 -21
  18. package/dist/web-ui.js.map +1 -1
  19. package/docs/CrossAgentObserverArchitecture.md +148 -0
  20. package/package.json +2 -1
  21. package/public/admin.html +0 -3
  22. package/public/agent-dashboard.html +0 -2
  23. package/public/changelog.html +0 -2
  24. package/public/gym.html +38 -1
  25. package/public/home.html +0 -2
  26. package/public/home2.html +3303 -0
  27. package/public/index.html +0 -2
  28. package/public/lab.html +0 -2
  29. package/public/library.html +0 -2
  30. package/public/marketplace.html +0 -2
  31. package/public/monitor.html +0 -2
  32. package/public/org.html +0 -2
  33. package/public/projects.html +0 -2
  34. package/public/settings.html +0 -2
  35. package/public/tasks.html +0 -2
  36. package/public/user-guide.html +0 -2
  37. package/src/executor.ts +2 -1
  38. package/src/web-ui.ts +26 -19
  39. package/agents/platform/gym/programs/agent-building/program.json +0 -160
  40. package/agents/platform/gym/programs/automations-mastery/program.json +0 -129
  41. package/agents/platform/gym/programs/getting-started/program.json +0 -124
  42. package/agents/platform/gym/programs/mcp-integrations/program.json +0 -116
  43. package/agents/platform/gym/programs/multi-model-strategy/program.json +0 -115
  44. package/agents/platform/gym/programs/prompt-engineering/program.json +0 -136
@@ -0,0 +1,300 @@
1
+ ---
2
+ name: MyAgentSkillCreate
3
+ description: Create skills for the MyAgent platform with proper placement (global, org, agent), optional processing scripts, and registry integration. Use when building reusable skills for agents on this platform.
4
+ ---
5
+
6
+ # MyAgent Skill Creator
7
+
8
+ Create skills for the MyAgent (MyAIforOne) platform. This skill understands the platform's multi-level skill system and ensures skills are properly structured, placed, and discoverable.
9
+
10
+ ## Skill Levels
11
+
12
+ Skills live at 4 levels. Ask the user which level makes sense:
13
+
14
+ | Level | Location | Who sees it | When to use |
15
+ |-------|----------|-------------|-------------|
16
+ | **Global** | `~/.claude/commands/` | All Claude sessions + all agents | Platform utilities, cross-cutting ops |
17
+ | **Personal** | `~/Desktop/MyAIforOne Drive/PersonalAgents/skills/` | All agents via shared index | User's custom skills not tied to an org |
18
+ | **Org-scoped** | `~/Desktop/MyAIforOne Drive/PersonalAgents/{OrgName}/skills/` | All agents in that org (auto-discovered, marked ◆) | Domain skills shared within a team/org |
19
+ | **Agent-specific** | `~/Desktop/MyAIforOne Drive/PersonalAgents/{OrgName}/{agentId}/skills/` or `{agentHome}/skills/` | Only that agent (marked ★) | Highly specific workflows for one agent |
20
+
21
+ If the user says "for this org" or names an org → **org-scoped**.
22
+ If the user says "for this agent" or names an agent → **agent-specific**.
23
+ If unclear → ask.
24
+
25
+ ## Skill Structure Convention
26
+
27
+ Every skill MUST follow this structure:
28
+
29
+ ### Simple skill (instructions only)
30
+ ```
31
+ skills/
32
+ └── my_skill.md # Skill definition with frontmatter
33
+ ```
34
+
35
+ ### Skill with processing scripts
36
+ ```
37
+ skills/
38
+ ├── my_skill.md # Skill definition (references scripts)
39
+ └── my_skill/ # Scripts folder (same name as .md, no extension)
40
+ ├── process.py # Reusable processing script
41
+ ├── helpers.sh # Helper scripts
42
+ └── templates/ # Templates, configs, etc.
43
+ └── output_template.xlsx
44
+ ```
45
+
46
+ **Convention rules:**
47
+ - The scripts folder MUST share the exact name as the `.md` file (minus extension)
48
+ - Scripts folder lives in the SAME directory as the `.md` file
49
+ - Scripts are **permanent and reusable** — never regenerated on each run
50
+ - The `.md` file references scripts by **relative path**: `{scripts}/process.py`
51
+ - Scripts accept CLI arguments for inputs/outputs — never hardcode paths
52
+ - Scripts should be executable and self-contained (include shebangs, dependency checks)
53
+
54
+ ## Frontmatter Format
55
+
56
+ Every skill `.md` file MUST start with YAML frontmatter:
57
+
58
+ ```yaml
59
+ ---
60
+ name: skill_name_snake_case
61
+ description: >-
62
+ One-line description of what this skill does.
63
+ Include WHEN to use it and WHAT triggers it.
64
+ scripts: skill_name_snake_case/ # Only if skill has a scripts folder
65
+ allowed-tools: Bash Read Write # Optional: space-separated tool restrictions
66
+ ---
67
+ ```
68
+
69
+ **Rules:**
70
+ - `name`: snake_case, matches filename without `.md`
71
+ - `description`: Critical — this is what tells Claude WHEN to invoke the skill. Be specific about triggers and use cases. Keep under 200 chars.
72
+ - `scripts`: Optional. Relative path to the scripts subfolder. Only include if the skill has processing scripts.
73
+ - `allowed-tools`: Optional. Space-separated list of tools the skill needs.
74
+
75
+ ## Creation Process
76
+
77
+ ### Step 1 — Gather Requirements
78
+
79
+ Ask the user (1-2 questions at a time, be conversational):
80
+
81
+ 1. **What does the skill do?** Get a clear description of the workflow.
82
+ 2. **Which level?** Global / Org / Agent? If org or agent, which one?
83
+ 3. **Does it need scripts?** Will it run processing code (Python, shell, Node, etc.)?
84
+ 4. **What are the inputs/outputs?** Files? User text? API calls?
85
+ 5. **How is it triggered?** User types a command? Agent auto-detects? Scheduled?
86
+
87
+ If the user gives everything in one message, skip the conversation and build it.
88
+
89
+ ### Step 2 — Determine Placement
90
+
91
+ Based on the level chosen:
92
+
93
+ | Level | Write `.md` to | Write scripts to |
94
+ |-------|----------------|-----------------|
95
+ | Global | `~/.claude/commands/{name}.md` | `~/.claude/commands/{name}/` |
96
+ | Personal | `~/Desktop/MyAIforOne Drive/PersonalAgents/skills/{name}.md` | `~/Desktop/MyAIforOne Drive/PersonalAgents/skills/{name}/` |
97
+ | Org-scoped | `~/Desktop/MyAIforOne Drive/PersonalAgents/{OrgName}/skills/{name}.md` | `~/Desktop/MyAIforOne Drive/PersonalAgents/{OrgName}/skills/{name}/` |
98
+ | Agent-specific | `{agentHome}/skills/{name}.md` | `{agentHome}/skills/{name}/` |
99
+
100
+ To find an agent's home directory, read config.json:
101
+ ```bash
102
+ cat ~/Desktop/APPs/channelToAgentToClaude/config.json | python3 -c "
103
+ import json,sys
104
+ c = json.load(sys.stdin)
105
+ for aid, a in c.get('agents',{}).items():
106
+ print(f'{aid}: {a.get(\"agentHome\", \"(not set)\")}')"
107
+ ```
108
+
109
+ To find an org's agents:
110
+ ```bash
111
+ cat ~/Desktop/APPs/channelToAgentToClaude/config.json | python3 -c "
112
+ import json,sys
113
+ c = json.load(sys.stdin)
114
+ for aid, a in c.get('agents',{}).items():
115
+ orgs = [o['organization'] for o in a.get('org',[])]
116
+ if orgs: print(f'{aid}: {orgs}')"
117
+ ```
118
+
119
+ ### Step 3 — Write the Skill
120
+
121
+ 1. **Create the `.md` file** with proper frontmatter and clear instructions
122
+ 2. **If scripts needed:** Create the scripts subfolder and write the script(s)
123
+ 3. Scripts must:
124
+ - Accept all file paths as CLI arguments (never hardcode)
125
+ - Include a `--help` flag that explains usage
126
+ - Include dependency checks at the top (e.g., `import` guards with helpful error messages)
127
+ - Use `argparse` (Python), `getopts` (bash), or similar for argument parsing
128
+ - Print progress and results to stdout
129
+ - Exit with non-zero code on error
130
+
131
+ ### Step 4 — Wire the Skill to Agent(s)
132
+
133
+ For **org-scoped** and **global** skills: No config changes needed — they're auto-discovered.
134
+
135
+ For **agent-specific** skills: Add the skill name to the agent's `agentSkills` array in config.json:
136
+ ```python
137
+ import json
138
+ with open('config.json') as f: c = json.load(f)
139
+ skills = c['agents']['AGENT_ID'].get('agentSkills', [])
140
+ if 'SKILL_NAME' not in skills:
141
+ skills.append('SKILL_NAME')
142
+ c['agents']['AGENT_ID']['agentSkills'] = skills
143
+ with open('config.json', 'w') as f: json.dump(c, f, indent=2)
144
+ ```
145
+
146
+ For **shared** skills referenced explicitly: Add to the agent's `skills` array instead.
147
+
148
+ ### Step 5 — Verify
149
+
150
+ 1. Confirm the file exists at the right path
151
+ 2. Confirm frontmatter parses correctly (name and description present)
152
+ 3. If scripts exist, confirm the subfolder is named correctly
153
+ 4. If agent-specific, confirm it's in the agent's config
154
+ 5. Print summary:
155
+ ```
156
+ Skill Created:
157
+ Name: {name}
158
+ Level: {level}
159
+ Location: {path}
160
+ Scripts: {scripts_path or "none"}
161
+ Discoverable by: {who can see it}
162
+ ```
163
+
164
+ ## Script Conventions (when scripts are needed)
165
+
166
+ ### Python scripts
167
+ ```python
168
+ #!/usr/bin/env python3
169
+ """Short description of what this script does."""
170
+ import argparse
171
+ import sys
172
+
173
+ def main():
174
+ parser = argparse.ArgumentParser(description=__doc__)
175
+ parser.add_argument('--input', required=True, help='Path to input file')
176
+ parser.add_argument('--output', required=True, help='Path to output file')
177
+ # ... more args
178
+ args = parser.parse_args()
179
+
180
+ # Processing logic here
181
+ print(f"Processing {args.input}...")
182
+ # ...
183
+ print(f"Output written to {args.output}")
184
+
185
+ if __name__ == '__main__':
186
+ main()
187
+ ```
188
+
189
+ ### Shell scripts
190
+ ```bash
191
+ #!/usr/bin/env bash
192
+ set -euo pipefail
193
+
194
+ usage() { echo "Usage: $0 --input FILE --output FILE" >&2; exit 1; }
195
+
196
+ INPUT="" OUTPUT=""
197
+ while [[ $# -gt 0 ]]; do
198
+ case $1 in
199
+ --input) INPUT="$2"; shift 2;;
200
+ --output) OUTPUT="$2"; shift 2;;
201
+ --help) usage;;
202
+ *) usage;;
203
+ esac
204
+ done
205
+
206
+ [[ -z "$INPUT" || -z "$OUTPUT" ]] && usage
207
+
208
+ # Processing logic here
209
+ echo "Processing $INPUT..."
210
+ echo "Output written to $OUTPUT"
211
+ ```
212
+
213
+ ### Node.js scripts
214
+ ```javascript
215
+ #!/usr/bin/env node
216
+ const { parseArgs } = require('node:util');
217
+ const { values } = parseArgs({
218
+ options: {
219
+ input: { type: 'string' },
220
+ output: { type: 'string' },
221
+ }
222
+ });
223
+ if (!values.input || !values.output) {
224
+ console.error('Usage: node script.js --input FILE --output FILE');
225
+ process.exit(1);
226
+ }
227
+ // Processing logic here
228
+ ```
229
+
230
+ ## How the .md References Scripts
231
+
232
+ In the skill body, reference the script using the `{scripts}` placeholder or the relative path convention:
233
+
234
+ ```markdown
235
+ ## Execution
236
+
237
+ Run the processing script:
238
+ ` ``bash
239
+ python3 {skill_dir}/process.py \
240
+ --input "$INPUT_FILE" \
241
+ --output "$OUTPUT_FILE" \
242
+ --date "$(date +%Y-%m-%d)"
243
+ ` ``
244
+
245
+ Where `{skill_dir}` is the scripts folder next to this .md file (same name, no extension).
246
+ ```
247
+
248
+ Or reference explicitly:
249
+ ```markdown
250
+ The processing script lives at the same level as this file, in the `weekly_wallet_update/` folder.
251
+ Run: `python3 /path/to/skills/weekly_wallet_update/process_update.py --mwi INPUT --tres TRESDATA --fb FIREBLOCKS --map TOKENMAP --output OUTPUT`
252
+ ```
253
+
254
+ ## Examples
255
+
256
+ ### Example: Simple skill (no scripts)
257
+ ```yaml
258
+ ---
259
+ name: code_review_checklist
260
+ description: Run through a standardized code review checklist for PRs. Use when reviewing code changes.
261
+ ---
262
+
263
+ # Code Review Checklist
264
+
265
+ When reviewing code, check each item...
266
+ ```
267
+
268
+ ### Example: Skill with Python processing script
269
+ ```yaml
270
+ ---
271
+ name: weekly_wallet_update
272
+ description: Weekly update of Total Quantity and Value (USD) in the MWI w Balance tab using TRESDATA and Fireblocks sources.
273
+ scripts: weekly_wallet_update/
274
+ ---
275
+
276
+ # Weekly Wallet Inventory Update
277
+
278
+ ## Execution
279
+
280
+ The user will attach 4 files. Run the processing script:
281
+
282
+ ` ``bash
283
+ python3 {skill_dir}/process_update.py \
284
+ --mwi "path/to/master_wallet.xlsx" \
285
+ --tresdata "path/to/tresdata.csv" \
286
+ --fireblocks "path/to/fireblocks.csv" \
287
+ --tokenmap "path/to/token_map.csv" \
288
+ --output "path/to/output.xlsx"
289
+ ` ``
290
+
291
+ Review the output summary and share results with the user.
292
+ ```
293
+
294
+ ## Important Notes
295
+
296
+ - Skills under 500 lines. If longer, split into the `.md` (instructions) and scripts (logic).
297
+ - Scripts are the RIGHT place for deterministic processing. The `.md` is for instructions, context, and orchestration.
298
+ - Never generate throwaway scripts in FileStorage/Temp. Always use the permanent scripts folder.
299
+ - If a skill evolves, update the script in place — it's version-controlled by the folder structure.
300
+ - Org-scoped skills are auto-discovered — no config.json changes needed for agents in that org.
@@ -0,0 +1,162 @@
1
+ ---
2
+ name: onboarding
3
+ description: Walk a first-time user through connecting messaging channels and creating their first agent. Used by the hub agent after /setup completes.
4
+ ---
5
+
6
+ # First-Time Onboarding
7
+
8
+ You are walking a new user through setting up MyAIforOne for the first time. They've just completed the terminal setup and are now in the web UI chatting with you. Your job is to connect their messaging channels and create their first personal agent.
9
+
10
+ ## Tone
11
+
12
+ Friendly, clear, one step at a time. Don't overwhelm. Celebrate each step completed.
13
+
14
+ ## Step 1: Welcome
15
+
16
+ ```
17
+ Welcome to MyAIforOne! I'm your hub agent — I'll help you get connected.
18
+
19
+ We'll do two things:
20
+ 1. Connect a messaging channel (so you can chat with agents from your phone)
21
+ 2. Create your first personal agent
22
+
23
+ This takes about 2 minutes. Let's go!
24
+ ```
25
+
26
+ ## Step 2: Choose Channels
27
+
28
+ Ask which channels they want. Present as a simple list:
29
+
30
+ ```
31
+ Which messaging apps do you want to use with your agents?
32
+
33
+ 1. Telegram (easiest — just need a bot token)
34
+ 2. WhatsApp (QR code pairing)
35
+ 3. Slack (needs a Slack App)
36
+ 4. iMessage (macOS only — skip this option on Windows)
37
+
38
+ Pick one or more, or type "skip" to set up channels later.
39
+ ```
40
+
41
+ ## Step 3: Configure Each Channel
42
+
43
+ ### Telegram
44
+ 1. Tell them: "Open Telegram, message @BotFather, send /newbot, follow the prompts, and paste the bot token here."
45
+ 2. When they paste the token, call `update_channel` with:
46
+ - channelName: "telegram"
47
+ - config: { botToken: "<their token>" }
48
+ 3. Call `restart_service` to pick up the change.
49
+ 4. Tell them: "Telegram connected! Now send any message to your bot — I'll grab the chat ID."
50
+ 5. Wait for them to confirm they sent a message.
51
+ 6. Check logs for "No route for telegram:" to find the chat ID. Use Bash:
52
+ - **macOS / Linux:** `grep "No route for telegram:" logs/service.log | tail -5`
53
+ - **Windows:** `Select-String "No route for telegram:" logs\service.log | Select-Object -Last 5`
54
+ 7. Save the chat ID for Step 5.
55
+
56
+ ### Slack
57
+ 1. Tell them:
58
+ - Go to https://api.slack.com/apps → Create New App
59
+ - Enable Socket Mode (Settings → Socket Mode → Enable)
60
+ - Add scopes: chat:write, channels:history, groups:history, im:history, files:read
61
+ - Install to workspace
62
+ - Copy Bot Token (xoxb-) and App Token (xapp-)
63
+ 2. When they paste both tokens, call `update_channel` with:
64
+ - channelName: "slack"
65
+ - config: { botToken: "<xoxb>", appToken: "<xapp>", mode: "socket" }
66
+ 3. Call `restart_service`.
67
+ 4. Tell them: "Slack connected! Now invite the bot to a channel (/invite @botname) and send a message."
68
+ 5. Ask them to paste the channel ID (right-click channel → View details → scroll to bottom).
69
+
70
+ ### WhatsApp
71
+ 1. Tell them: "WhatsApp needs a QR code scan. I'll start the pairing process."
72
+ 2. Call `update_channel` with:
73
+ - channelName: "whatsapp"
74
+ - config: { authDir: "./data/whatsapp-auth" }
75
+ 3. Call `restart_service`.
76
+ 4. Tell them: "Check your terminal — there should be a QR code. Open WhatsApp → Settings → Linked Devices → Link a Device → scan it."
77
+ 5. Once connected, tell them: "Send a message in the WhatsApp chat you want to use. I'll find the chat ID."
78
+ 6. Check logs for "No route for whatsapp:" to find the chat ID. Use Bash:
79
+ - **macOS / Linux:** `grep "No route for whatsapp:" logs/service.log | tail -5`
80
+ - **Windows:** `Select-String "No route for whatsapp:" logs\service.log | Select-Object -Last 5`
81
+
82
+ ### iMessage (macOS only)
83
+ 1. Tell them:
84
+ - Install imsg: `brew install phamson02/imsg/imsg`
85
+ - Grant Full Disk Access to Terminal (System Settings → Privacy & Security)
86
+ - Test: `imsg chats --json`
87
+ 2. Call `update_channel` with:
88
+ - channelName: "imessage"
89
+ - config: { enabled: true }
90
+ 3. Tell them: "Run `imsg chats --json` and paste the chat ID for the conversation you want."
91
+
92
+ ## Step 4: Create First Agent
93
+
94
+ ```
95
+ Now let's create your agent — this is the AI you'll chat with from your phone.
96
+
97
+ What do you want to call it? (e.g., "My Agent", "Assistant", "Jarvis")
98
+ What @mention should trigger it? (e.g., @agent, @jarvis, @ai)
99
+ ```
100
+
101
+ Only ask those two questions. Use these defaults (don't ask):
102
+ - persistent: true
103
+ - streaming: true
104
+ - advancedMemory: true
105
+ - autonomousCapable: true
106
+ - workspace: ~ (home directory)
107
+ - tools: all (Read, Edit, Write, Glob, Grep, Bash, WebFetch, WebSearch)
108
+ - description: "General-purpose AI agent accessible from phone and web."
109
+
110
+ Call `create_agent` with all the above.
111
+
112
+ ## Step 5: Wire the Route
113
+
114
+ For each channel configured in Step 3, call `add_agent_route` with:
115
+ - channelName: the channel
116
+ - agentId: the new agent's ID
117
+ - chatId: the chat ID discovered in Step 3
118
+ - requireMention: true (for group chats) or false (for DMs)
119
+
120
+ Then call `restart_service` one final time.
121
+
122
+ ## Step 6: Test
123
+
124
+ ```
125
+ You're all set! Try it now:
126
+
127
+ Send "@alias hello" from your phone.
128
+
129
+ If you get a response — you're live! Your agent is running.
130
+ ```
131
+
132
+ Wait for them to confirm it works. If it doesn't, troubleshoot:
133
+ - No response → check that the chat ID is correct
134
+ - Wrong agent responds → check requireMention settings
135
+ - Connection error → check the channel token
136
+
137
+ ## Step 7: Done
138
+
139
+ ```
140
+ Setup complete! Here's what you have:
141
+
142
+ Agent: [name] ([alias])
143
+ Channels: [list of connected channels]
144
+ Web UI: http://localhost:4888
145
+
146
+ Next steps:
147
+ - Visit /org to see your agent and configure it
148
+ - Visit /lab to create more specialized agents
149
+ - Visit /monitor to see your platform status
150
+ - Message @agentcreator in the web UI to create agents through conversation
151
+
152
+ Enjoy your AI team!
153
+ ```
154
+
155
+ ## Important
156
+
157
+ - One step at a time — don't dump all instructions at once
158
+ - If they get stuck, offer to skip and come back later
159
+ - If a channel fails, don't block the whole setup — move to the next step
160
+ - Always call `restart_service` after channel config changes
161
+ - Always validate the agent was created before wiring routes
162
+ - The "No route for {channel}:{chatId}" log pattern is how we discover chat IDs — it's a built-in feature