@aman_asmuei/aman 0.1.0 → 0.2.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 +62 -26
  2. package/dist/index.js +227 -12
  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 — one command, any AI.
12
+ Identity + Memory + Tools + Workflows + Guardrails + Evaluation — one command, any AI.
13
13
 
14
14
  <br>
15
15
 
@@ -31,16 +31,14 @@ Sets up your complete AI ecosystem:
31
31
  ```
32
32
  ◆ aman — your complete AI companion
33
33
 
34
- Created ~/.acore/core.md (identity)
35
- ✔ Memory: run npx @aman_asmuei/amem to add automated memory
36
- ✔ Tools: run npx @aman_asmuei/akit add github to add capabilities
34
+ Identity: created ~/.acore/core.md
35
+ ✔ Memory: run npx @aman_asmuei/amem to enable
36
+ ✔ Tools: run npx @aman_asmuei/akit add github
37
+ ✔ Workflows: run npx @aman_asmuei/aflow init
38
+ ✔ Guardrails: run npx @aman_asmuei/arules init
39
+ ✔ Evaluation: run npx @aman_asmuei/aeval init
37
40
 
38
41
  ✔ Your AI companion is ready.
39
-
40
- aman status See your full ecosystem
41
- acore customize Change personality
42
- akit add <tool> Add tools
43
- npx @aman_asmuei/amem Enable automated memory
44
42
  ```
45
43
 
46
44
  ---
@@ -49,17 +47,23 @@ Sets up your complete AI ecosystem:
49
47
 
50
48
  ```
51
49
  aman
52
- ├── acore → identity → who your AI IS
53
- ├── amem → memory → what your AI KNOWS
54
- └── akit → tools → what your AI CAN DO
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
55
56
  ```
56
57
 
57
58
  | Layer | Package | What it does |
58
59
  |:------|:--------|:-------------|
59
60
  | Identity | [acore](https://github.com/amanasmuei/acore) | Personality, values, relationship memory |
60
61
  | Memory | [amem](https://github.com/amanasmuei/amem) | Automated knowledge storage (MCP) |
61
- | Tools | [akit](https://github.com/amanasmuei/akit) | Portable AI capabilities (MCP + manual) |
62
- | **Unified** | **aman** | **One command to set up everything** |
62
+ | Tools | [akit](https://github.com/amanasmuei/akit) | 15 portable AI tools (MCP + manual fallback) |
63
+ | Workflows | [aflow](https://github.com/amanasmuei/aflow) | Reusable AI workflows (code review, bug fix, etc.) |
64
+ | Guardrails | [arules](https://github.com/amanasmuei/arules) | Safety boundaries and permissions |
65
+ | 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** |
63
67
 
64
68
  Each package works independently. `aman` is the front door.
65
69
 
@@ -70,18 +74,22 @@ Each package works independently. `aman` is the front door.
70
74
  | Command | What it does |
71
75
  |:--------|:------------|
72
76
  | `aman` | First run: setup. After that: show status |
73
- | `aman setup` | Set up identity + memory + tools |
74
- | `aman status` | View your full ecosystem status |
77
+ | `aman setup` | Set up the full ecosystem |
78
+ | `aman status` | View ecosystem status (all 6 layers) |
75
79
 
76
80
  After setup, use the individual CLIs for detailed management:
77
81
 
78
82
  ```bash
79
83
  acore customize # change AI personality
80
- acore show # view identity
84
+ acore doctor # health check identity
81
85
  akit add github # add tools
82
86
  akit search database # find tools
83
- acore doctor # health check identity
84
- akit doctor # health check tools
87
+ aflow init # set up AI workflows
88
+ aflow list # view workflows
89
+ arules init # set up guardrails
90
+ arules add Coding # add a coding rule
91
+ aeval log # log a session
92
+ aeval report # view relationship report
85
93
  ```
86
94
 
87
95
  ---
@@ -93,19 +101,47 @@ $ aman status
93
101
 
94
102
  ◆ aman — ecosystem status
95
103
 
96
- ✔ Identity: Companion + Aman
97
- ✔ Memory: amem connected (automated)
98
- ✔ Tools: 3 installed
99
- Platform: Claude Code (auto-save + MCP)
104
+ ✔ Identity: Companion + Aman
105
+ ✔ Memory: amem connected (automated)
106
+ ✔ Tools: 3 installed
107
+ Workflows: 4 defined
108
+ ✔ Guardrails: 24 rules
109
+ ✔ Evaluation: 12 sessions tracked
110
+ ✔ Platform: Claude Code (auto-save + MCP)
111
+
112
+ Ecosystem: Complete ecosystem (6/6 layers active)
113
+ ```
114
+
115
+ ---
116
+
117
+ ## How It All Connects
100
118
 
101
- Ecosystem: Complete ecosystem (3/3 layers active)
119
+ Every layer is a markdown file. acore auto-injects all of them into your AI's system prompt:
120
+
121
+ ```
122
+ CLAUDE.md / .cursorrules / .windsurfrules
123
+ ├── core.md (identity — acore)
124
+ ├── context.md (project — acore)
125
+ ├── kit.md (tools — akit)
126
+ ├── flow.md (workflows — aflow)
127
+ └── rules.md (guardrails — arules)
102
128
  ```
103
129
 
130
+ Your AI reads these files and behaves accordingly. Switch platforms? Bring your files.
131
+
132
+ ---
133
+
134
+ ## Not a Developer?
135
+
136
+ Generate your AI identity from a browser — no terminal needed:
137
+
138
+ https://amanasmuei.github.io/acore/
139
+
104
140
  ---
105
141
 
106
142
  ## Works With
107
143
 
108
- ChatGPT, Claude, Claude Code, Cursor, Windsurf, Gemini, and any AI that accepts a system prompt.
144
+ ChatGPT, Claude, Claude Code, Cursor, Windsurf, Gemini, Ollama, and any AI that accepts a system prompt.
109
145
 
110
146
  ## License
111
147
 
@@ -115,6 +151,6 @@ ChatGPT, Claude, Claude Code, Cursor, Windsurf, Gemini, and any AI that accepts
115
151
 
116
152
  <div align="center">
117
153
 
118
- **One command. Complete AI companion. Any platform.**
154
+ **One command. 6 layers. Any AI. Your companion.**
119
155
 
120
156
  </div>
package/dist/index.js CHANGED
@@ -104,10 +104,51 @@ function detectEcosystem() {
104
104
  }
105
105
  }
106
106
  }
107
+ const aflowPath = path.join(home, ".aflow", "flow.md");
108
+ let aflowWorkflowCount = 0;
109
+ if (fs.existsSync(aflowPath)) {
110
+ try {
111
+ const content = fs.readFileSync(aflowPath, "utf-8");
112
+ aflowWorkflowCount = (content.match(/^## /gm) || []).length;
113
+ } catch {
114
+ }
115
+ }
116
+ const arulesPath = path.join(home, ".arules", "rules.md");
117
+ let arulesRuleCount = 0;
118
+ if (fs.existsSync(arulesPath)) {
119
+ try {
120
+ const content = fs.readFileSync(arulesPath, "utf-8");
121
+ arulesRuleCount = (content.match(/^- /gm) || []).length;
122
+ } catch {
123
+ }
124
+ }
125
+ const aevalPath = path.join(home, ".aeval", "eval.md");
126
+ let aevalSessions = 0;
127
+ if (fs.existsSync(aevalPath)) {
128
+ try {
129
+ const content = fs.readFileSync(aevalPath, "utf-8");
130
+ const match = content.match(/- Sessions: (\d+)/);
131
+ aevalSessions = match ? parseInt(match[1], 10) : 0;
132
+ } catch {
133
+ }
134
+ }
135
+ const askillPath = path.join(home, ".askill", "skills.md");
136
+ let askillCount = 0;
137
+ if (fs.existsSync(askillPath)) {
138
+ try {
139
+ const content = fs.readFileSync(askillPath, "utf-8");
140
+ askillCount = (content.match(/^## /gm) || []).length;
141
+ } catch {
142
+ }
143
+ }
107
144
  return {
108
145
  acore: { installed: fs.existsSync(acorePath), path: acorePath },
109
146
  amem: { installed: amemInstalled },
110
- akit: { installed: fs.existsSync(akitPath), path: akitPath, toolCount: akitToolCount }
147
+ akit: { installed: fs.existsSync(akitPath), path: akitPath, toolCount: akitToolCount },
148
+ aflow: { installed: fs.existsSync(aflowPath), path: aflowPath, workflowCount: aflowWorkflowCount },
149
+ arules: { installed: fs.existsSync(arulesPath), path: arulesPath, ruleCount: arulesRuleCount },
150
+ aeval: { installed: fs.existsSync(aevalPath), path: aevalPath, sessions: aevalSessions },
151
+ askill: { installed: fs.existsSync(askillPath), path: askillPath, skillCount: askillCount }
111
152
  };
112
153
  }
113
154
 
@@ -215,6 +256,93 @@ function getPlatformFile(platform) {
215
256
  }
216
257
  }
217
258
 
259
+ // src/templates.ts
260
+ var STARTER_FLOW = `# My Workflows
261
+
262
+ ## code-review
263
+ When asked to review code:
264
+ 1. Analyze for bugs, logic errors, and edge cases
265
+ 2. Check for security vulnerabilities (OWASP top 10)
266
+ 3. Evaluate code style and maintainability
267
+ 4. Summarize findings with severity ratings (critical/warning/info)
268
+ 5. Suggest specific fixes with code examples
269
+
270
+ ## bug-fix
271
+ When asked to fix a bug:
272
+ 1. Reproduce \u2014 understand the expected vs actual behavior
273
+ 2. Locate \u2014 find the root cause in the codebase
274
+ 3. Fix \u2014 implement the minimal change that fixes the issue
275
+ 4. Test \u2014 verify the fix works and doesn't break other things
276
+ 5. Document \u2014 explain what was wrong and why the fix works
277
+
278
+ ## feature-build
279
+ When asked to build a feature:
280
+ 1. Clarify \u2014 ask questions until requirements are clear
281
+ 2. Design \u2014 propose an approach, get approval
282
+ 3. Implement \u2014 write the code in small, testable increments
283
+ 4. Test \u2014 write and run tests for the new code
284
+ 5. Review \u2014 check for edge cases, security, and performance
285
+
286
+ ## daily-standup
287
+ When starting a new session:
288
+ 1. Check git log for recent changes
289
+ 2. Review open PRs and issues
290
+ 3. Summarize: what was done, what's in progress, what's blocked
291
+ 4. Ask what to focus on today
292
+ `;
293
+ var STARTER_RULES = `# My AI Rules
294
+
295
+ ## Always
296
+ - Ask before deleting files or data
297
+ - Explain your reasoning before making changes
298
+ - Flag security concerns immediately
299
+ - Respect code review processes
300
+
301
+ ## Never
302
+ - Push directly to main/master without approval
303
+ - Expose secrets, API keys, or credentials in code
304
+ - Make changes to production systems without confirmation
305
+ - Skip tests when fixing bugs
306
+
307
+ ## Coding
308
+ - Follow existing code style and conventions
309
+ - Prefer simple solutions over clever ones
310
+ - Write tests for new functionality
311
+ - Keep PRs focused and small
312
+
313
+ ## Communication
314
+ - Be direct \u2014 lead with the answer
315
+ - Admit when you don't know something
316
+ - Ask clarifying questions before assuming
317
+ - Flag when a task is outside your expertise
318
+
319
+ ## Data
320
+ - Never log or expose personal information
321
+ - Treat user data as confidential
322
+ - Ask before accessing external APIs
323
+ - Don't store credentials in plain text
324
+
325
+ ## Team
326
+ - Follow the team's branching strategy
327
+ - Respect code ownership boundaries
328
+ - Tag relevant people for review
329
+ - Document breaking changes
330
+ `;
331
+ var STARTER_EVAL = `# AI Relationship Metrics
332
+
333
+ ## Overview
334
+ - Sessions: 0
335
+ - First session: {{DATE}}
336
+ - Trust level: 3/5
337
+ - Trajectory: building
338
+
339
+ ## Timeline
340
+
341
+ ## Milestones
342
+
343
+ ## Patterns
344
+ `;
345
+
218
346
  // src/commands/setup.ts
219
347
  var ARCHETYPES = {
220
348
  pragmatist: {
@@ -335,6 +463,74 @@ async function setupCommand() {
335
463
  if (stack) inferredParts.push(stack);
336
464
  p.log.info(`Inferred: ${pc.dim(inferredParts.join(" \xB7 "))}`);
337
465
  }
466
+ const home = os2.homedir();
467
+ const aflowExists = ecosystem.aflow.installed;
468
+ const arulesExists = ecosystem.arules.installed;
469
+ const aevalExists = ecosystem.aeval.installed;
470
+ if (aflowExists && arulesExists && aevalExists) {
471
+ p.log.success(`Workflows: ${ecosystem.aflow.workflowCount} defined`);
472
+ p.log.success(`Guardrails: ${ecosystem.arules.ruleCount} rules`);
473
+ p.log.success("Evaluation: already configured");
474
+ } else {
475
+ const setupChoice = await p.select({
476
+ message: "Set up additional layers?",
477
+ options: [
478
+ { value: "all", label: "Yes, set up everything", hint: "recommended" },
479
+ { value: "choose", label: "Let me choose" },
480
+ { value: "skip", label: "Skip for now" }
481
+ ],
482
+ initialValue: "all"
483
+ });
484
+ if (p.isCancel(setupChoice)) process.exit(0);
485
+ let doFlow = false;
486
+ let doRules = false;
487
+ let doEval = false;
488
+ if (setupChoice === "all") {
489
+ doFlow = !aflowExists;
490
+ doRules = !arulesExists;
491
+ doEval = !aevalExists;
492
+ } else if (setupChoice === "choose") {
493
+ const layers = await p.multiselect({
494
+ message: "Which layers?",
495
+ options: [
496
+ ...!aflowExists ? [{ value: "flow", label: "Workflows", hint: "4 starter workflows" }] : [],
497
+ ...!arulesExists ? [{ value: "rules", label: "Guardrails", hint: "24 starter rules" }] : [],
498
+ ...!aevalExists ? [{ value: "eval", label: "Evaluation", hint: "track relationship metrics" }] : []
499
+ ],
500
+ required: false
501
+ });
502
+ if (p.isCancel(layers)) process.exit(0);
503
+ const selected = layers;
504
+ doFlow = selected.includes("flow");
505
+ doRules = selected.includes("rules");
506
+ doEval = selected.includes("eval");
507
+ }
508
+ if (doFlow) {
509
+ const aflowDir = path3.join(home, ".aflow");
510
+ fs4.mkdirSync(aflowDir, { recursive: true });
511
+ fs4.writeFileSync(path3.join(aflowDir, "flow.md"), STARTER_FLOW, "utf-8");
512
+ p.log.success(`Workflows: created ${pc.dim("~/.aflow/flow.md")} (4 starter workflows)`);
513
+ } else if (aflowExists) {
514
+ p.log.success(`Workflows: ${ecosystem.aflow.workflowCount} defined`);
515
+ }
516
+ if (doRules) {
517
+ const arulesDir = path3.join(home, ".arules");
518
+ fs4.mkdirSync(arulesDir, { recursive: true });
519
+ fs4.writeFileSync(path3.join(arulesDir, "rules.md"), STARTER_RULES, "utf-8");
520
+ p.log.success(`Guardrails: created ${pc.dim("~/.arules/rules.md")} (24 rules)`);
521
+ } else if (arulesExists) {
522
+ p.log.success(`Guardrails: ${ecosystem.arules.ruleCount} rules`);
523
+ }
524
+ if (doEval) {
525
+ const aevalDir = path3.join(home, ".aeval");
526
+ fs4.mkdirSync(aevalDir, { recursive: true });
527
+ const today = (/* @__PURE__ */ new Date()).toISOString().split("T")[0];
528
+ fs4.writeFileSync(path3.join(aevalDir, "eval.md"), STARTER_EVAL.replace("{{DATE}}", today), "utf-8");
529
+ p.log.success(`Evaluation: created ${pc.dim("~/.aeval/eval.md")}`);
530
+ } else if (aevalExists) {
531
+ p.log.success("Evaluation: already configured");
532
+ }
533
+ }
338
534
  if (ecosystem.amem.installed) {
339
535
  p.log.success("Memory: amem connected");
340
536
  } else {
@@ -345,23 +541,18 @@ async function setupCommand() {
345
541
  p.log.info(`Memory: built-in via core.md (upgrade with ${pc.bold("npx @aman_asmuei/amem")})`);
346
542
  }
347
543
  }
348
- if (ecosystem.akit.installed) {
349
- p.log.success(`Tools: ${ecosystem.akit.toolCount} tools configured`);
350
- } else {
351
- p.log.info(`Tools: run ${pc.bold("npx @aman_asmuei/akit add github")} to add capabilities`);
352
- }
353
544
  const card = [
354
545
  "",
355
546
  ` ${pc.green("\u2714")} Your AI companion is ready.`,
356
547
  "",
357
548
  ` ${pc.bold("aman status")} See your full ecosystem`,
358
549
  ` ${pc.bold("acore customize")} Change personality`,
359
- ` ${pc.bold("akit add <tool>")} Add tools`,
550
+ ` ${pc.bold("askill add testing")} Install skills`,
360
551
  ` ${pc.bold("npx @aman_asmuei/amem")} Enable automated memory`,
361
552
  ""
362
553
  ];
363
554
  p.note(card.join("\n"), "");
364
- p.outro(pc.dim("Identity + Memory + Tools \u2014 one ecosystem."));
555
+ p.outro(pc.dim("Identity + Workflows + Guardrails + Evaluation \u2014 one ecosystem."));
365
556
  }
366
557
 
367
558
  // src/commands/status.ts
@@ -390,6 +581,26 @@ function statusCommand() {
390
581
  } else {
391
582
  p2.log.warning(`Tools: none \u2014 ${pc2.dim("npx @aman_asmuei/akit add github")}`);
392
583
  }
584
+ if (ecosystem.aflow.installed) {
585
+ p2.log.success(`Workflows: ${ecosystem.aflow.workflowCount} defined \u2014 ${pc2.dim("aflow list for details")}`);
586
+ } else {
587
+ p2.log.warning(`Workflows: none \u2014 ${pc2.dim("npx @aman_asmuei/aflow init")}`);
588
+ }
589
+ if (ecosystem.arules.installed) {
590
+ p2.log.success(`Guardrails: ${ecosystem.arules.ruleCount} rules defined \u2014 ${pc2.dim("arules list for details")}`);
591
+ } else {
592
+ p2.log.warning(`Guardrails: none \u2014 ${pc2.dim("npx @aman_asmuei/arules init")}`);
593
+ }
594
+ if (ecosystem.aeval.installed) {
595
+ p2.log.success(`Evaluation: ${ecosystem.aeval.sessions} sessions tracked \u2014 ${pc2.dim("aeval report")}`);
596
+ } else {
597
+ p2.log.warning(`Evaluation: not tracking \u2014 ${pc2.dim("npx @aman_asmuei/aeval init")}`);
598
+ }
599
+ if (ecosystem.askill.installed) {
600
+ p2.log.success(`Skills: ${ecosystem.askill.skillCount} installed \u2014 ${pc2.dim("askill list for details")}`);
601
+ } else {
602
+ p2.log.warning(`Skills: none \u2014 ${pc2.dim("npx @aman_asmuei/askill add testing")}`);
603
+ }
393
604
  const platformLabels = {
394
605
  "claude-code": "Claude Code",
395
606
  cursor: "Cursor",
@@ -406,16 +617,20 @@ function statusCommand() {
406
617
  if (ecosystem.acore.installed) score += 1;
407
618
  if (ecosystem.amem.installed) score += 1;
408
619
  if (ecosystem.akit.installed) score += 1;
409
- const levels = ["Not started", "Getting started", "Growing", "Complete ecosystem"];
410
- const colors = [pc2.red, pc2.yellow, pc2.cyan, pc2.green];
620
+ if (ecosystem.aflow.installed) score += 1;
621
+ if (ecosystem.arules.installed) score += 1;
622
+ if (ecosystem.aeval.installed) score += 1;
623
+ if (ecosystem.askill.installed) score += 1;
624
+ const levels = ["Not started", "Getting started", "Growing", "Building", "Expanding", "Strong", "Advanced", "Complete ecosystem"];
625
+ const colors = [pc2.red, pc2.red, pc2.yellow, pc2.yellow, pc2.cyan, pc2.cyan, pc2.cyan, pc2.green];
411
626
  p2.log.message("");
412
- p2.log.info(`Ecosystem: ${colors[score](levels[score])} (${score}/3 layers active)`);
627
+ p2.log.info(`Ecosystem: ${colors[score](levels[score])} (${score}/7 layers active)`);
413
628
  p2.outro("");
414
629
  }
415
630
 
416
631
  // src/index.ts
417
632
  var program = new Command();
418
- program.name("aman").description("Your complete AI companion \u2014 identity, memory, and tools in one command").version("0.1.0").action(() => {
633
+ program.name("aman").description("Your complete AI companion \u2014 identity, memory, and tools in one command").version("0.2.0").action(() => {
419
634
  const ecosystem = detectEcosystem();
420
635
  if (ecosystem.acore.installed) {
421
636
  statusCommand();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aman_asmuei/aman",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Your complete AI companion — identity, memory, and tools in one command",
5
5
  "type": "module",
6
6
  "bin": {