@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.
- package/README.md +62 -26
- package/dist/index.js +227 -12
- 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
|
-
✔
|
|
35
|
-
✔ Memory:
|
|
36
|
-
✔ Tools:
|
|
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
|
|
53
|
-
├── amem
|
|
54
|
-
|
|
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) |
|
|
62
|
-
|
|
|
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
|
|
74
|
-
| `aman status` | View
|
|
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
|
|
84
|
+
acore doctor # health check identity
|
|
81
85
|
akit add github # add tools
|
|
82
86
|
akit search database # find tools
|
|
83
|
-
|
|
84
|
-
|
|
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:
|
|
97
|
-
✔ Memory:
|
|
98
|
-
✔ Tools:
|
|
99
|
-
✔
|
|
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
|
-
|
|
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.
|
|
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("
|
|
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 +
|
|
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
|
-
|
|
410
|
-
|
|
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}/
|
|
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.
|
|
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();
|