@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.
- package/README.md +88 -12
- package/dist/index.js +129 -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 —
|
|
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
|
|
51
|
-
├── amem
|
|
52
|
-
├── akit
|
|
53
|
-
├── aflow
|
|
54
|
-
├── arules
|
|
55
|
-
|
|
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
|
-
|
|
|
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
|
|
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
|
-
**
|
|
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
|
|
36
|
-
if (
|
|
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.
|
|
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();
|