@aman_asmuei/aman 0.3.0 → 0.4.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 (3) hide show
  1. package/README.md +88 -12
  2. package/dist/index.js +129 -3
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -9,7 +9,7 @@
9
9
 
10
10
  ### Your complete AI companion.
11
11
 
12
- Identity + Memory + Tools + Workflows + Guardrails + Evaluation — one command, any AI.
12
+ Identity + Memory + Tools + Workflows + Guardrails + Skills + Evaluation — setup, deploy, run anywhere.
13
13
 
14
14
  <br>
15
15
 
@@ -20,6 +20,16 @@ Identity + Memory + Tools + Workflows + Guardrails + Evaluation — one command,
20
20
 
21
21
  ---
22
22
 
23
+ <div align="center">
24
+
25
+ <img src="assets/aman-ecosystem-overview.jpeg" alt="Aman Ecosystem Overview — from v0.7.7 to Full AI Companion Platform" width="100%">
26
+
27
+ *18+ releases across 5 packages. From a CLI tool to a deployable, browser-accessible, multi-agent AI companion ecosystem.*
28
+
29
+ </div>
30
+
31
+ ---
32
+
23
33
  ## One Command
24
34
 
25
35
  ```bash
@@ -47,23 +57,29 @@ Sets up your complete AI ecosystem:
47
57
 
48
58
  ```
49
59
  aman
50
- ├── acore → identity → who your AI IS
51
- ├── amem → memory → what your AI KNOWS
52
- ├── akit → tools → what your AI CAN DO
53
- ├── aflow → workflows → HOW your AI works
54
- ├── arules → guardrails → what your AI WON'T do
55
- └── aeval evaluation how GOOD your AI is
60
+ ├── acore → identity → who your AI IS
61
+ ├── amem → memory → what your AI KNOWS
62
+ ├── akit → tools → what your AI CAN DO
63
+ ├── aflow → workflows → HOW your AI works
64
+ ├── arules → guardrails → what your AI WON'T do
65
+ ├── askill skills what your AI MASTERS
66
+ ├── aeval → evaluation → how GOOD your AI is
67
+ ├── achannel → channels → WHERE your AI lives
68
+ └── aman-agent → runtime → the engine that runs it all
56
69
  ```
57
70
 
58
71
  | Layer | Package | What it does |
59
72
  |:------|:--------|:-------------|
60
- | Identity | [acore](https://github.com/amanasmuei/acore) | Personality, values, relationship memory |
61
- | Memory | [amem](https://github.com/amanasmuei/amem) | Automated knowledge storage (MCP) |
73
+ | Identity | [acore](https://github.com/amanasmuei/acore) | Personality, values, appearance, relationship memory |
74
+ | Memory | [amem](https://github.com/amanasmuei/amem) | Automated knowledge storage with semantic search (MCP) |
62
75
  | Tools | [akit](https://github.com/amanasmuei/akit) | 15 portable AI tools (MCP + manual fallback) |
63
76
  | Workflows | [aflow](https://github.com/amanasmuei/aflow) | Reusable AI workflows (code review, bug fix, etc.) |
64
77
  | Guardrails | [arules](https://github.com/amanasmuei/arules) | Safety boundaries and permissions |
78
+ | Skills | [askill](https://github.com/amanasmuei/askill) | Domain expertise with leveling (testing, security, etc.) |
65
79
  | Evaluation | [aeval](https://github.com/amanasmuei/aeval) | Relationship tracking and session logging |
66
- | **Unified** | **[aman](https://github.com/amanasmuei/aman)** | **One command to set up everything** |
80
+ | Channels | [achannel](https://github.com/amanasmuei/achannel) | Telegram, Discord, webhook server |
81
+ | Runtime | [aman-agent](https://github.com/amanasmuei/aman-agent) | Standalone AI companion CLI |
82
+ | **Unified** | **[aman](https://github.com/amanasmuei/aman)** | **Setup + Deploy — one command for everything** |
67
83
 
68
84
  Each package works independently. `aman` is the front door.
69
85
 
@@ -75,7 +91,8 @@ Each package works independently. `aman` is the front door.
75
91
  |:--------|:------------|
76
92
  | `aman` | First run: setup. After that: show status |
77
93
  | `aman setup` | Set up the full ecosystem |
78
- | `aman status` | View ecosystem status (all 6 layers) |
94
+ | `aman status` | View ecosystem status (all layers) |
95
+ | `aman deploy` | Deploy your AI anywhere (Docker, Ollama, systemd) |
79
96
 
80
97
  After setup, use the individual CLIs for detailed management:
81
98
 
@@ -114,6 +131,65 @@ $ aman status
114
131
 
115
132
  ---
116
133
 
134
+ ## Deploy Anywhere
135
+
136
+ Make your AI companion always-on — accessible from terminal, browser, Telegram, or Discord.
137
+
138
+ ```bash
139
+ npx @aman_asmuei/aman deploy
140
+ ```
141
+
142
+ Interactive wizard with 4 deployment methods:
143
+
144
+ ### Docker Compose (VPS / Home Server)
145
+
146
+ ```bash
147
+ aman deploy # select "Docker Compose", enter API key
148
+ docker compose up -d # → running on port 3000
149
+ ```
150
+
151
+ Packages the full ecosystem in one container: aman-agent + achannel (Telegram/Discord/webhook) + aman-mcp + amem.
152
+
153
+ ### Docker + Ollama (Fully Local)
154
+
155
+ ```bash
156
+ aman deploy # select "Docker + Ollama"
157
+ docker compose up -d # → aman + Ollama, zero cloud dependency
158
+ ```
159
+
160
+ No API key needed. Runs on Raspberry Pi 4/5 (ARM64), any Linux, macOS.
161
+
162
+ ### Systemd Service (Bare Metal / Raspberry Pi)
163
+
164
+ ```bash
165
+ aman deploy # select "Systemd service"
166
+ # Shows step-by-step install for bare metal Linux
167
+ ```
168
+
169
+ ### What's in the Docker Image
170
+
171
+ | Component | What it does |
172
+ |:---|:---|
173
+ | **aman-agent** | Interactive CLI companion |
174
+ | **achannel** | Telegram, Discord, webhook server |
175
+ | **aman-mcp** | MCP bridge for all ecosystem layers |
176
+ | **amem** | Persistent memory with SQLite |
177
+
178
+ ### Environment Variables
179
+
180
+ | Variable | Description |
181
+ |:---|:---|
182
+ | `ANTHROPIC_API_KEY` | Anthropic API key |
183
+ | `OPENAI_API_KEY` | OpenAI API key (alternative) |
184
+ | `AMAN_AI_NAME` | Your AI's name (default: Aman) |
185
+ | `AMAN_MODEL` | LLM model (default: claude-sonnet-4-6) |
186
+ | `TELEGRAM_BOT_TOKEN` | Optional — Telegram bot |
187
+ | `DISCORD_BOT_TOKEN` | Optional — Discord bot |
188
+
189
+ All data persists in Docker volumes (identity, memory, config, rules, workflows, skills, eval).
190
+
191
+ ---
192
+
117
193
  ## How It All Connects
118
194
 
119
195
  Every layer is a markdown file. acore auto-injects all of them into your AI's system prompt:
@@ -151,6 +227,6 @@ ChatGPT, Claude, Claude Code, Cursor, Windsurf, Gemini, Ollama, and any AI that
151
227
 
152
228
  <div align="center">
153
229
 
154
- **One command. 6 layers. Any AI. Your companion.**
230
+ **Setup. Deploy. Run anywhere. Your AI companion.**
155
231
 
156
232
  </div>
package/dist/index.js CHANGED
@@ -32,8 +32,8 @@ function detectPlatform(cwd) {
32
32
  const raw = fs.readFileSync(configPath, "utf-8");
33
33
  const parsed = JSON.parse(raw);
34
34
  if (typeof parsed.platform === "string") {
35
- const p4 = parsed.platform;
36
- if (p4 === "claude-code" || p4 === "cursor" || p4 === "windsurf") return p4;
35
+ const p5 = parsed.platform;
36
+ if (p5 === "claude-code" || p5 === "cursor" || p5 === "windsurf") return p5;
37
37
  }
38
38
  } catch {
39
39
  }
@@ -836,9 +836,132 @@ function copyDeployFile(pkgDir, destDir, filename) {
836
836
  }
837
837
  }
838
838
 
839
+ // src/commands/showcase.ts
840
+ import * as p4 from "@clack/prompts";
841
+ import pc4 from "picocolors";
842
+ import { spawnSync } from "child_process";
843
+ var SHOWCASE_PACKAGE = "@aman_asmuei/aman-showcase";
844
+ var CATEGORIES = {
845
+ health: "Health",
846
+ business: "Business",
847
+ learning: "Learning",
848
+ lifestyle: "Lifestyle",
849
+ monitoring: "Monitoring"
850
+ };
851
+ var EMBEDDED_MANIFEST = [
852
+ { name: "rutin", title: "Rutin \u2014 Medication Reminder", description: "Daily medication reminders for elderly parents and family.", category: "health", language: "ms", channels: ["telegram"] },
853
+ { name: "kedai", title: "Kedai \u2014 Small Business Assistant", description: "Transaction tracking for restaurants, salons, and laundries.", category: "business", language: "en+ms", channels: ["telegram"] },
854
+ { name: "monitor", title: "Monitor \u2014 AI Watchdog", description: "Price and website monitoring with real-time alerts.", category: "monitoring", language: "en", channels: ["telegram", "discord"] },
855
+ { name: "bahasa", title: "Bahasa \u2014 Language Tutor", description: "Malay/English language learning with structured curriculum.", category: "learning", language: "en+ms", channels: ["telegram"] },
856
+ { name: "quran", title: "Quran \u2014 Arabic Vocabulary", description: "Quranic Arabic lessons with 12 structured vocabulary units.", category: "learning", language: "en+ms", channels: ["telegram"] },
857
+ { name: "fitness", title: "Fitness \u2014 Personal Trainer", description: "Workout tracking with progressive overload and form guidance.", category: "health", language: "en", channels: ["telegram"] },
858
+ { name: "freelancer", title: "Freelancer \u2014 Business Tracker", description: "Invoice and client tracking for independent workers.", category: "business", language: "en", channels: ["telegram"] },
859
+ { name: "team", title: "Team \u2014 Collaboration Assistant", description: "Standups, task tracking, and team memory.", category: "business", language: "en", channels: ["telegram", "discord"] },
860
+ { name: "money", title: "Money \u2014 Finance Tracker", description: "Personal finance and budget monitoring.", category: "lifestyle", language: "en", channels: ["telegram"] },
861
+ { name: "feed", title: "Feed \u2014 News Companion", description: "Personalized news aggregation and daily digests.", category: "lifestyle", language: "en", channels: ["telegram"] },
862
+ { name: "support", title: "Support \u2014 Customer Assistant", description: "Customer support with context memory and escalation.", category: "business", language: "en", channels: ["telegram", "webhook"] },
863
+ { name: "iot", title: "IoT \u2014 Smart Monitor", description: "Sensor monitoring with anomaly detection and threshold alerts.", category: "monitoring", language: "en", channels: ["telegram"] },
864
+ { name: "muslim", title: "Muslim \u2014 Daily Companion", description: "Islamic companion with prayer times, hadith, and du'a.", category: "lifestyle", language: "en+ms", channels: ["telegram"] }
865
+ ];
866
+ function fetchManifest() {
867
+ const result = spawnSync(
868
+ "npx",
869
+ ["-y", SHOWCASE_PACKAGE, "list-json"],
870
+ { encoding: "utf8", timeout: 3e4 }
871
+ );
872
+ if (result.status !== 0 || !result.stdout.trim()) {
873
+ return EMBEDDED_MANIFEST;
874
+ }
875
+ try {
876
+ return JSON.parse(result.stdout);
877
+ } catch {
878
+ return EMBEDDED_MANIFEST;
879
+ }
880
+ }
881
+ async function showcaseCommand(nameArg, opts = {}) {
882
+ p4.intro(pc4.bold("aman showcase") + " \u2014 try any AI companion in one command");
883
+ const manifest = fetchManifest();
884
+ if (opts.list) {
885
+ console.log("\nAvailable showcases:\n");
886
+ const byCategory = manifest.reduce((acc, s) => {
887
+ (acc[s.category] ??= []).push(s);
888
+ return acc;
889
+ }, {});
890
+ for (const [cat, entries] of Object.entries(byCategory)) {
891
+ console.log(pc4.bold(CATEGORIES[cat] ?? cat));
892
+ for (const e of entries) {
893
+ console.log(` ${pc4.cyan(e.name.padEnd(14))} ${e.title}`);
894
+ }
895
+ console.log();
896
+ }
897
+ return;
898
+ }
899
+ let name = nameArg;
900
+ if (!name) {
901
+ const choice = await p4.select({
902
+ message: "Which showcase do you want to try?",
903
+ options: manifest.map((s) => ({
904
+ value: s.name,
905
+ label: s.title,
906
+ hint: s.description
907
+ }))
908
+ });
909
+ if (p4.isCancel(choice)) {
910
+ p4.cancel("Cancelled.");
911
+ process.exit(0);
912
+ }
913
+ name = choice;
914
+ }
915
+ const entry = manifest.find((s) => s.name === name);
916
+ if (!entry) {
917
+ p4.log.error(
918
+ `Unknown showcase: "${name}". Run ${pc4.cyan("aman showcase --list")} to see available options.`
919
+ );
920
+ process.exit(1);
921
+ }
922
+ if (opts.dryRun) {
923
+ p4.log.info(`Dry run for ${pc4.bold(entry.title)}`);
924
+ spawnSync("npx", ["-y", SHOWCASE_PACKAGE, "install", name, "--dry-run"], {
925
+ encoding: "utf8",
926
+ stdio: "inherit",
927
+ timeout: 3e4
928
+ });
929
+ return;
930
+ }
931
+ const confirmed = await p4.confirm({
932
+ message: `Install ${pc4.bold(entry.title)}? Existing ~/.acore, ~/.aflow, ~/.arules, ~/.askill files will be backed up.`,
933
+ initialValue: true
934
+ });
935
+ if (p4.isCancel(confirmed) || !confirmed) {
936
+ p4.cancel("Cancelled.");
937
+ process.exit(0);
938
+ }
939
+ const spinner2 = p4.spinner();
940
+ spinner2.start("Installing showcase files...");
941
+ const result = spawnSync("npx", ["-y", SHOWCASE_PACKAGE, "install", name], {
942
+ encoding: "utf8",
943
+ timeout: 6e4
944
+ });
945
+ if (result.status !== 0) {
946
+ spinner2.stop("Installation failed.");
947
+ p4.log.error(result.stderr || "Unknown error");
948
+ process.exit(1);
949
+ }
950
+ spinner2.stop("Showcase installed!");
951
+ p4.note(
952
+ [
953
+ `1. Copy ${pc4.cyan(".env.example")} to ${pc4.cyan(".env")}`,
954
+ `2. Fill in your ${pc4.yellow("ANTHROPIC_API_KEY")} and ${pc4.yellow("TELEGRAM_BOT_TOKEN")}`,
955
+ `3. Run: ${pc4.green("npx @aman_asmuei/achannel serve")}`
956
+ ].join("\n"),
957
+ "Next steps"
958
+ );
959
+ p4.outro(`${pc4.green("\u2713")} ${entry.title} is ready!`);
960
+ }
961
+
839
962
  // src/index.ts
840
963
  var program = new Command();
841
- program.name("aman").description("Your complete AI companion \u2014 identity, memory, and tools in one command").version("0.3.0").action(() => {
964
+ program.name("aman").description("Your complete AI companion \u2014 identity, memory, and tools in one command").version("0.4.0").action(() => {
842
965
  const ecosystem = detectEcosystem();
843
966
  if (ecosystem.acore.installed) {
844
967
  statusCommand();
@@ -849,4 +972,7 @@ program.name("aman").description("Your complete AI companion \u2014 identity, me
849
972
  program.command("setup").description("Set up your AI companion (identity + memory + tools)").action(() => setupCommand());
850
973
  program.command("status").description("View your full ecosystem status").action(() => statusCommand());
851
974
  program.command("deploy").description("Deploy your AI companion (Docker, systemd, or cloud)").action(() => deployCommand());
975
+ program.command("showcase [name]").description("Set up a showcase AI companion (rutin, kedai, monitor, ...)").option("--dry-run", "preview files without installing").option("--list", "list all available showcases").action(
976
+ (name, opts) => showcaseCommand(name, opts)
977
+ );
852
978
  program.parse();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aman_asmuei/aman",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "Your complete AI companion — identity, memory, and tools in one command",
5
5
  "type": "module",
6
6
  "bin": {