@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.
Files changed (3) hide show
  1. package/README.md +10 -0
  2. package/dist/index.js +129 -3
  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 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.1").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.1",
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": {