@aman_asmuei/aman 0.3.1 → 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 +10 -0
- package/dist/index.js +129 -3
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -20,6 +20,16 @@ Identity + Memory + Tools + Workflows + Guardrails + Skills + Evaluation — set
|
|
|
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
|
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();
|