dme-agent 7.4.1 → 9.69.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 -43
- package/assets/agent/AGENTS.md +471 -0
- package/assets/agent/DME-Agent-v7.4-SYSTEM.md +29 -98
- package/assets/agent/DME-Agent-v9.69-SYSTEM.md +208 -0
- package/assets/agent/PROMPT-COMPACT.md +24 -15
- package/assets/agent/dme-v7.4.md +12 -14
- package/assets/agent/dme-v9.69.md +43 -0
- package/assets/manifesto/DME-Agent-v9.69.md +514 -0
- package/assets/references/icon-doctrine.md +122 -0
- package/assets/references/motion-bible.md +262 -0
- package/assets/references/palette-intake.md +159 -0
- package/assets/skills/dme-app-shell/SKILL.md +19 -0
- package/assets/skills/dme-critique/SKILL.md +105 -6
- package/assets/skills/dme-dashboard/SKILL.md +108 -35
- package/assets/skills/dme-design/SKILL.md +138 -11
- package/assets/skills/dme-icons/SKILL.md +21 -0
- package/assets/skills/dme-landing/SKILL.md +98 -23
- package/assets/skills/dme-motion/SKILL.md +19 -0
- package/assets/skills/dme-research/SKILL.md +134 -6
- package/assets/skills/dme-shadcn/SKILL.md +128 -6
- package/assets/skills/dme-ux/SKILL.md +110 -27
- package/assets/skills/dme-welcome/SKILL.md +20 -0
- package/bin/dme.mjs +166 -55
- package/package.json +9 -4
- package/src/detect.mjs +260 -0
- package/src/install.mjs +406 -177
- package/src/postinstall-hint.mjs +4 -3
- package/src/targets.mjs +39 -13
- package/src/tui.mjs +352 -0
- package/src/ui.mjs +139 -52
|
@@ -1,14 +1,136 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: dme-shadcn
|
|
3
3
|
description: >
|
|
4
|
-
|
|
5
|
-
Triggers: /dme-shadcn,
|
|
4
|
+
DME 9.69 shadcn-first composition skill. Install and compose primitives;
|
|
5
|
+
never reinvent Button/Input/Dialog/Table/Sidebar. Triggers: /dme-shadcn,
|
|
6
|
+
shadcn, compose UI, install components, don't reinvent primitives, ui atoms.
|
|
6
7
|
---
|
|
7
8
|
|
|
8
|
-
# DME shadcn
|
|
9
|
+
# DME shadcn 9.69 — Compose, Don't Invent
|
|
9
10
|
|
|
10
|
-
|
|
11
|
+
Law: **if shadcn has it, you use it.** You are a composer, not a component factory.
|
|
11
12
|
|
|
12
|
-
|
|
13
|
+
## When this skill owns the room
|
|
13
14
|
|
|
14
|
-
|
|
15
|
+
- Scaffolding any product UI, dashboard, landing form, dialog flow, table, sidebar
|
|
16
|
+
- He says “use shadcn”, “don’t hand-roll”, “install components”
|
|
17
|
+
- You feel the urge to write a custom Button or Modal from scratch → stop
|
|
18
|
+
|
|
19
|
+
## Install discipline
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npx shadcn@latest add button input label textarea select checkbox radio-group
|
|
23
|
+
npx shadcn@latest add dialog sheet drawer popover dropdown-menu
|
|
24
|
+
npx shadcn@latest add table tabs badge separator skeleton sonner tooltip
|
|
25
|
+
npx shadcn@latest add card form accordion progress pagination
|
|
26
|
+
npx shadcn@latest add sidebar command scroll-area avatar switch
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Add only what the surface needs. Prefer one `add` batch over drive-by custom CSS atoms.
|
|
30
|
+
|
|
31
|
+
## Primitive map (default to these)
|
|
32
|
+
|
|
33
|
+
| Need | Use |
|
|
34
|
+
|------|-----|
|
|
35
|
+
| Actions | `Button` variants: default, secondary, outline, ghost, destructive |
|
|
36
|
+
| Text | `Input` + `Label` · `Textarea` · `InputOTP` if needed |
|
|
37
|
+
| Choice | `Select` · `Checkbox` · `RadioGroup` · `Switch` |
|
|
38
|
+
| Overlay | `Dialog` (decision) · `Sheet` (detail/side) · `Drawer` (mobile) · `Popover` |
|
|
39
|
+
| Menus | `DropdownMenu` · `ContextMenu` · `Command` (palette) |
|
|
40
|
+
| Data | `Table` + `Pagination` · never fake tables with div grids for tabular data |
|
|
41
|
+
| Chrome | `Sidebar` · `Tabs` · `Breadcrumb` · `Separator` · `ScrollArea` |
|
|
42
|
+
| Feedback | `Sonner` toasts · `Progress` · `Skeleton` · `Badge` · `Alert` |
|
|
43
|
+
| Structure | `Card` only when entity/KPI/plan/media — not for every paragraph |
|
|
44
|
+
| Forms | `Form` (RHF + zod) when validation matters |
|
|
45
|
+
|
|
46
|
+
## Compose patterns
|
|
47
|
+
|
|
48
|
+
### Work surface (dashboard)
|
|
49
|
+
|
|
50
|
+
```
|
|
51
|
+
SidebarProvider
|
|
52
|
+
Sidebar
|
|
53
|
+
SidebarInset
|
|
54
|
+
header: search | filters | Button(CTA)
|
|
55
|
+
metric strip: plain numbers (not Card essays)
|
|
56
|
+
Table | list (divide-y)
|
|
57
|
+
Sheet | Dialog for detail/create
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Decision modal
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
Dialog
|
|
64
|
+
DialogHeader (title + 1 line description)
|
|
65
|
+
body ≤ 2–3 lines + fields
|
|
66
|
+
DialogFooter: outline cancel + primary verb
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Detail without route change
|
|
70
|
+
|
|
71
|
+
```
|
|
72
|
+
Sheet side="right"
|
|
73
|
+
identity header
|
|
74
|
+
dl / Table / Tabs
|
|
75
|
+
sticky footer actions
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### Empty
|
|
79
|
+
|
|
80
|
+
```
|
|
81
|
+
short title
|
|
82
|
+
one helper line
|
|
83
|
+
one Button CTA
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
No illustration spam unless brand requires it.
|
|
87
|
+
|
|
88
|
+
## Styling rules (peace / 9.69)
|
|
89
|
+
|
|
90
|
+
- Extend via `className` + CVA variants — don’t fork the primitive file unless token-level
|
|
91
|
+
- Radius ≤ 8px; keep shadcn radius tokens consistent with zinc peace palette
|
|
92
|
+
- Prefer `variant` and `size` over one-off colored divs
|
|
93
|
+
- Dark: bg `#09090b`, raise `#18181b`; Light: white/zinc-50 peace
|
|
94
|
+
- Accent sparingly on primary Button / key Badge — not every border
|
|
95
|
+
|
|
96
|
+
## Anti-patterns (instant fail)
|
|
97
|
+
|
|
98
|
+
| Fail | Fix |
|
|
99
|
+
|------|-----|
|
|
100
|
+
| Custom `<button className="...">` for primary actions | `Button` |
|
|
101
|
+
| Hand-rolled modal with fixed overlay | `Dialog` / `Sheet` |
|
|
102
|
+
| Div soup “table” | `Table` |
|
|
103
|
+
| Card wrapping every sentence | list / `Separator` / bare layout |
|
|
104
|
+
| Rebuilding toast system | `Sonner` |
|
|
105
|
+
| Custom sidebar from scratch | `Sidebar` primitives |
|
|
106
|
+
| Icon+title+paragraph feature grid as “design system” | not a system — delete |
|
|
107
|
+
|
|
108
|
+
## Accessibility (ships with shadcn — keep it)
|
|
109
|
+
|
|
110
|
+
- Don’t strip `Dialog` focus trap or `Label` association
|
|
111
|
+
- Icon-only `Button` → `aria-label` or `sr-only` text
|
|
112
|
+
- Touch targets ≥ 44px on mobile (size default / padding)
|
|
113
|
+
- Focus rings visible — never `outline-none` without replacement
|
|
114
|
+
|
|
115
|
+
## Motion pairing
|
|
116
|
+
|
|
117
|
+
Primitives stay dumb; motion wraps them:
|
|
118
|
+
|
|
119
|
+
```tsx
|
|
120
|
+
<motion.div {...fadeUp}>
|
|
121
|
+
<Card>...</Card>
|
|
122
|
+
</motion.div>
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
Don’t animate in a way that breaks Dialog/Sheet exit. See `/dme-motion`.
|
|
126
|
+
|
|
127
|
+
## Checklist
|
|
128
|
+
|
|
129
|
+
- [ ] Listed needed primitives before coding
|
|
130
|
+
- [ ] Installed via shadcn CLI (or confirmed present)
|
|
131
|
+
- [ ] Zero hand-rolled atoms that exist upstream
|
|
132
|
+
- [ ] Cards lean; tables for tabular data
|
|
133
|
+
- [ ] Forms labeled; errors human
|
|
134
|
+
- [ ] Composed shell matches platform (web vs app)
|
|
135
|
+
|
|
136
|
+
**Compose. Don’t invent.**
|
|
@@ -1,53 +1,136 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: dme-ux
|
|
3
3
|
description: >
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
microcopy, onboarding,
|
|
4
|
+
DME 9.69 human UX for non-developers: addiction via ease not dark patterns,
|
|
5
|
+
microcopy caps, clear verbs, complete states. Triggers: /dme-ux, UX writing,
|
|
6
|
+
microcopy, empty state, onboarding UX, usability, human UI, dark patterns.
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
# DME UX —
|
|
9
|
+
# DME UX 9.69 — Ease, Not Traps
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
Audience default: **humans who don’t code**. They scan. They fear mistakes. Next step must be obvious.
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
## Goal
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
Make the product **habit-forming through ease**: fast success, clear recovery, low shame.
|
|
16
|
+
**Never** through dark patterns (forced continuity, hidden costs, fake urgency, trick checkboxes).
|
|
16
17
|
|
|
17
|
-
|
|
18
|
-
2. Immediate feedback (<150ms state)
|
|
19
|
-
3. Prevent errors; confirm destructive
|
|
20
|
-
4. Easy exit / undo
|
|
21
|
-
5. Progressive disclosure
|
|
22
|
-
6. Consistent patterns
|
|
23
|
-
7. A11y: contrast, focus, 44px targets, labeled inputs
|
|
24
|
-
8. Button = real verb
|
|
25
|
-
9. Full states: empty · loading · partial · success · error · offline
|
|
26
|
-
10. First-minute magic: one valuable action
|
|
18
|
+
## Core loop (ethical stickiness)
|
|
27
19
|
|
|
28
|
-
|
|
20
|
+
1. **One obvious primary action** per view
|
|
21
|
+
2. **Time-to-first-success** as short as honest
|
|
22
|
+
3. **Forgiving errors** — say what happened + how to continue
|
|
23
|
+
4. **Memory** — remember filters, last place, drafts
|
|
24
|
+
5. **Feedback** — every action gets a visible result (toast, row update, progress)
|
|
25
|
+
|
|
26
|
+
If they return, it’s because work was easier — not because leave was hard.
|
|
27
|
+
|
|
28
|
+
## Microcopy caps (hard)
|
|
29
29
|
|
|
30
30
|
| Element | Max |
|
|
31
|
-
|
|
31
|
+
|---------|-----|
|
|
32
32
|
| Field label | 3 words |
|
|
33
33
|
| Helper | 1 line |
|
|
34
34
|
| Card body | 1–2 lines |
|
|
35
35
|
| Toast | 1 line |
|
|
36
|
-
|
|
|
36
|
+
| Modal body | 2–3 lines |
|
|
37
37
|
| Hero lead | 1 sentence |
|
|
38
|
+
| Empty title | 3–6 words |
|
|
39
|
+
| Error | 1–2 lines + action |
|
|
40
|
+
|
|
41
|
+
### Buttons = verbs
|
|
42
|
+
|
|
43
|
+
`Salvar` · `Criar pedido` · `Enviar` · `Aprovar` · `Tentar de novo`
|
|
44
|
+
|
|
45
|
+
Not: `OK` · `Submit` · `Click here` · `Explore`
|
|
46
|
+
|
|
47
|
+
### Errors
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
Não deu para salvar.
|
|
51
|
+
Verifique a conexão e tente de novo.
|
|
52
|
+
[ Tentar de novo ]
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Never stack traces, never blame, never “unexpected error” alone.
|
|
56
|
+
|
|
57
|
+
## States (every surface)
|
|
58
|
+
|
|
59
|
+
| State | Content |
|
|
60
|
+
|-------|---------|
|
|
61
|
+
| Empty | title + one line + one CTA |
|
|
62
|
+
| Loading | skeleton geometry of result |
|
|
63
|
+
| Success | toast or inline confirm, 1 line |
|
|
64
|
+
| Error | cause + recovery |
|
|
65
|
+
| Offline | honest status + safe actions only |
|
|
66
|
+
|
|
67
|
+
## Progressive disclosure
|
|
38
68
|
|
|
39
|
-
|
|
69
|
+
- Defaults cover 80%
|
|
70
|
+
- “Mais opções” / advanced filters collapsed
|
|
71
|
+
- Dangerous stuff: Dialog confirm with consequence in plain language
|
|
40
72
|
|
|
41
|
-
|
|
73
|
+
## Onboarding (UX lens)
|
|
74
|
+
|
|
75
|
+
Value → account → **one** essential setup → first success.
|
|
76
|
+
|
|
77
|
+
No 12-tooltip product tours. For motion/craft detail → `/dme-welcome`.
|
|
42
78
|
|
|
43
79
|
## Forms
|
|
44
80
|
|
|
45
|
-
|
|
81
|
+
- Labels outside fields (visible)
|
|
82
|
+
- Placeholders are examples, not labels
|
|
83
|
+
- Inline validation after blur or submit — not while first keystroke
|
|
84
|
+
- Password managers / autocomplete respected
|
|
85
|
+
- Required: mark few; don’t asterisk everything
|
|
86
|
+
|
|
87
|
+
## Navigation & wayfinding
|
|
88
|
+
|
|
89
|
+
- Current location always clear
|
|
90
|
+
- Destructive far from primary when possible
|
|
91
|
+
- Back restores context (scroll, filters)
|
|
92
|
+
|
|
93
|
+
## Addiction via ease (allowed)
|
|
94
|
+
|
|
95
|
+
- Keyboard shortcuts for power users (discoverable)
|
|
96
|
+
- Optimistic UI when safe
|
|
97
|
+
- Smart defaults
|
|
98
|
+
- Undo instead of scary confirms when reversible
|
|
99
|
+
- Fast search (`Command`)
|
|
100
|
+
|
|
101
|
+
## Dark patterns (banned)
|
|
102
|
+
|
|
103
|
+
| Pattern | Why banned |
|
|
104
|
+
|---------|------------|
|
|
105
|
+
| Confirmshaming (“No, I hate saving time”) | contempt |
|
|
106
|
+
| Hidden unsubscribe / cancel | trap |
|
|
107
|
+
| Fake countdown scarcity | lie |
|
|
108
|
+
| Prechecked marketing consent | coercion |
|
|
109
|
+
| Infinite guilt badges | anxiety ≠ retention |
|
|
110
|
+
| Roach motel (easy in, hard out) | hostility |
|
|
111
|
+
|
|
112
|
+
## Language
|
|
113
|
+
|
|
114
|
+
- Human language; no API field names in UI (`order_id` → `Nº do pedido`)
|
|
115
|
+
- Locale-aware dates/numbers when product requires
|
|
116
|
+
- Banned AI fluff: seamless, next-gen, powerful, unlock, supercharge, elevate, journey, empower…
|
|
117
|
+
|
|
118
|
+
## a11y floor
|
|
46
119
|
|
|
47
|
-
|
|
120
|
+
- Contrast AA
|
|
121
|
+
- Focus visible
|
|
122
|
+
- ≥44px targets mobile
|
|
123
|
+
- Labels on inputs
|
|
124
|
+
- Don’t rely on color alone for status
|
|
48
125
|
|
|
49
|
-
|
|
126
|
+
## Checklist
|
|
50
127
|
|
|
51
|
-
|
|
128
|
+
- [ ] Primary action obvious
|
|
129
|
+
- [ ] Copy under caps
|
|
130
|
+
- [ ] Verbs on buttons
|
|
131
|
+
- [ ] Empty/error/success real
|
|
132
|
+
- [ ] No dark patterns
|
|
133
|
+
- [ ] Non-dev language
|
|
134
|
+
- [ ] First success path short
|
|
52
135
|
|
|
53
|
-
|
|
136
|
+
**Be easy to love. Never hard to leave for the wrong reasons.**
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dme-welcome
|
|
3
|
+
description: >
|
|
4
|
+
DME 9.69 onboarding / first-run welcome. Value then one setup then first win.
|
|
5
|
+
Triggers: /dme-welcome, onboarding, first-run, empty state setup, welcome flow.
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# DME Welcome 9.69
|
|
9
|
+
|
|
10
|
+
1. Flow: **value → account → one essential setup → first success**
|
|
11
|
+
2. ≤3 visible steps · thin progress · skip always available
|
|
12
|
+
3. Motion: functional step crossfade 180–200ms
|
|
13
|
+
4. Icons: onboarding strategy (1–3 glyphs) — never 12-tooltip tours
|
|
14
|
+
5. After: empty state = short title + one line + one CTA
|
|
15
|
+
6. Copy caps: step title short · body ≤2 lines · buttons = real verbs
|
|
16
|
+
7. shadcn: Dialog/Sheet or full page · Progress · Button · Input
|
|
17
|
+
|
|
18
|
+
Banned: guided product tours with tooltip chains, feature-card spam on step 1.
|
|
19
|
+
|
|
20
|
+
Deliver: step list → copy → motion → implement → subtract.
|
package/bin/dme.mjs
CHANGED
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* DME Agent CLI —
|
|
3
|
+
* DME Agent CLI 9.69 — navigable TUI · detect-only install · strong AGENTS.md
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import { banner, colors as c, info, fail, hr } from "../src/ui.mjs";
|
|
7
|
-
import { installDme, doctor, uninstall } from "../src/install.mjs";
|
|
8
|
-
import { getTargets } from "../src/targets.mjs";
|
|
9
6
|
import fs from "node:fs";
|
|
10
7
|
import path from "node:path";
|
|
11
8
|
import { fileURLToPath } from "node:url";
|
|
9
|
+
import { asciiLogo, c, fail, info, hr, showCursor } from "../src/ui.mjs";
|
|
10
|
+
import { installDme, doctor, uninstall, scan, SKILL_NAMES } from "../src/install.mjs";
|
|
11
|
+
import { getTargets } from "../src/targets.mjs";
|
|
12
|
+
import { formatScanReport, getDetectedTargets } from "../src/detect.mjs";
|
|
13
|
+
import { runMainTui, printScanTable } from "../src/tui.mjs";
|
|
12
14
|
|
|
13
15
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
14
16
|
const pkg = JSON.parse(
|
|
@@ -16,7 +18,7 @@ const pkg = JSON.parse(
|
|
|
16
18
|
);
|
|
17
19
|
|
|
18
20
|
const args = process.argv.slice(2);
|
|
19
|
-
const cmd = (args[0] || "
|
|
21
|
+
const cmd = (args[0] || "").toLowerCase();
|
|
20
22
|
|
|
21
23
|
function parseFlags(argv) {
|
|
22
24
|
const flags = {
|
|
@@ -24,13 +26,28 @@ function parseFlags(argv) {
|
|
|
24
26
|
dryRun: false,
|
|
25
27
|
noProject: false,
|
|
26
28
|
force: false,
|
|
29
|
+
all: false,
|
|
30
|
+
agentsPolicy: "ask",
|
|
31
|
+
noTui: false,
|
|
32
|
+
yes: false,
|
|
27
33
|
};
|
|
28
34
|
for (let i = 0; i < argv.length; i++) {
|
|
29
35
|
const a = argv[i];
|
|
30
36
|
if (a === "--dry-run") flags.dryRun = true;
|
|
31
37
|
else if (a === "--no-project") flags.noProject = true;
|
|
32
38
|
else if (a === "--force") flags.force = true;
|
|
33
|
-
else if (a === "--
|
|
39
|
+
else if (a === "--all") {
|
|
40
|
+
flags.all = true;
|
|
41
|
+
flags.targets = ["all"];
|
|
42
|
+
} else if (a === "--no-tui" || a === "--plain") flags.noTui = true;
|
|
43
|
+
else if (a === "-y" || a === "--yes") {
|
|
44
|
+
flags.yes = true;
|
|
45
|
+
flags.agentsPolicy = "merge";
|
|
46
|
+
} else if (a === "--agents" || a === "--agents-policy") {
|
|
47
|
+
flags.agentsPolicy = (argv[++i] || "ask").toLowerCase();
|
|
48
|
+
} else if (a.startsWith("--agents=")) {
|
|
49
|
+
flags.agentsPolicy = a.slice(9).toLowerCase();
|
|
50
|
+
} else if (a === "--targets" || a === "-t") {
|
|
34
51
|
const v = argv[++i] || "";
|
|
35
52
|
flags.targets = v.split(",").map((s) => s.trim()).filter(Boolean);
|
|
36
53
|
} else if (a.startsWith("--targets=")) {
|
|
@@ -45,100 +62,194 @@ function parseFlags(argv) {
|
|
|
45
62
|
}
|
|
46
63
|
|
|
47
64
|
function help() {
|
|
48
|
-
|
|
49
|
-
console.log(
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
${c.
|
|
55
|
-
${c.
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
${c.
|
|
59
|
-
${c.
|
|
60
|
-
${c.
|
|
61
|
-
|
|
62
|
-
${c.
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
${c.dim}
|
|
71
|
-
${c.dim}
|
|
72
|
-
|
|
73
|
-
${c.
|
|
74
|
-
|
|
75
|
-
|
|
65
|
+
const ver = pkg.version || "9.69.0";
|
|
66
|
+
console.log(asciiLogo("9.69"));
|
|
67
|
+
console.log(`${c.bold}${c.brightCyan}DME Agent ${ver}${c.reset}
|
|
68
|
+
${c.dim}Ask palette · motion bible · web vs app · icons · welcome · TUI detect-only${c.reset}
|
|
69
|
+
|
|
70
|
+
${c.bold}${c.brightCyan}Usage${c.reset}
|
|
71
|
+
${c.brightYellow}dme${c.reset} interactive TUI
|
|
72
|
+
${c.brightYellow}dme${c.reset} <command> [options]
|
|
73
|
+
|
|
74
|
+
${c.bold}${c.brightCyan}Commands${c.reset}
|
|
75
|
+
${c.brightYellow}install${c.reset} Detect CLIs on this PC → install DME only there
|
|
76
|
+
${c.brightYellow}scan${c.reset} Show which CLIs are detected (detect-only)
|
|
77
|
+
${c.brightYellow}doctor${c.reset} Verify DME install health
|
|
78
|
+
${c.brightYellow}uninstall${c.reset} Remove DME (detected CLIs only)
|
|
79
|
+
${c.brightYellow}list${c.reset} List all supported targets
|
|
80
|
+
${c.brightYellow}skills${c.reset} List installer skill pack
|
|
81
|
+
${c.brightYellow}tui${c.reset} Open navigable menu
|
|
82
|
+
${c.brightYellow}path${c.reset} Print assets path
|
|
83
|
+
${c.brightYellow}version${c.reset} Print version
|
|
84
|
+
${c.brightYellow}help${c.reset} This screen
|
|
85
|
+
|
|
86
|
+
${c.bold}${c.brightCyan}Options${c.reset}
|
|
87
|
+
${c.dim}--targets${c.reset} claude,cursor,grok,detected,all
|
|
88
|
+
${c.dim}--all${c.reset} Force every surface (ignore detection)
|
|
89
|
+
${c.dim}--agents${c.reset} ask|merge|overwrite|skip
|
|
90
|
+
${c.dim}-y, --yes${c.reset} Auto-merge existing AGENTS.md
|
|
91
|
+
${c.dim}--dry-run${c.reset}
|
|
92
|
+
${c.dim}--no-project${c.reset} Skip cwd project files
|
|
93
|
+
${c.dim}--no-tui${c.reset} Disable interactive pickers
|
|
94
|
+
|
|
95
|
+
${c.bold}${c.brightCyan}9.69 skills${c.reset}
|
|
96
|
+
${c.dim}${SKILL_NAMES.map((s) => "/" + s).join(" ")}${c.reset}
|
|
97
|
+
|
|
98
|
+
${c.bold}${c.brightCyan}Examples${c.reset}
|
|
99
|
+
${c.dim}npx dme-agent@9.69.0${c.reset}
|
|
100
|
+
${c.dim}dme install${c.reset}
|
|
101
|
+
${c.dim}dme install --targets claude,cursor${c.reset}
|
|
102
|
+
${c.dim}dme install --agents merge -y${c.reset}
|
|
103
|
+
${c.dim}dme scan${c.reset}
|
|
104
|
+
|
|
105
|
+
${c.bold}${c.brightCyan}AGENTS.md${c.reset}
|
|
106
|
+
Written to each CLI’s ${c.underline}correct path${c.reset}.
|
|
107
|
+
Prefer assets: AGENTS.md · DME-Agent-v9.69-SYSTEM.md · dme-v9.69.md
|
|
108
|
+
(falls back to v7.4 names if 9.69 assets not yet present).
|
|
109
|
+
If the file already exists → TUI asks: Merge / Overwrite / Skip.
|
|
76
110
|
`);
|
|
77
111
|
}
|
|
78
112
|
|
|
113
|
+
async function doInstall(flags) {
|
|
114
|
+
const targets =
|
|
115
|
+
flags.targets.length > 0
|
|
116
|
+
? flags.targets
|
|
117
|
+
: flags.all
|
|
118
|
+
? ["all"]
|
|
119
|
+
: ["detected"];
|
|
120
|
+
|
|
121
|
+
await installDme({
|
|
122
|
+
targets,
|
|
123
|
+
dryRun: flags.dryRun,
|
|
124
|
+
force: flags.force,
|
|
125
|
+
cwdProject: !flags.noProject,
|
|
126
|
+
agentsPolicy: flags.agentsPolicy,
|
|
127
|
+
interactive: !flags.noTui && !flags.yes,
|
|
128
|
+
quiet: flags.yes,
|
|
129
|
+
pick: !flags.noTui && flags.targets.length === 0 && !flags.all,
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
|
|
79
133
|
async function main() {
|
|
80
|
-
|
|
134
|
+
process.on("exit", () => showCursor());
|
|
135
|
+
process.on("SIGINT", () => {
|
|
136
|
+
showCursor();
|
|
137
|
+
process.exit(130);
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
const flags = parseFlags(cmd ? args.slice(1) : args);
|
|
141
|
+
|
|
142
|
+
if (!cmd) {
|
|
143
|
+
if (process.stdin.isTTY && process.stdout.isTTY && !flags.noTui) {
|
|
144
|
+
await runMainTui({
|
|
145
|
+
version: pkg.version,
|
|
146
|
+
onInstall: () => doInstall({ ...flags, targets: [] }),
|
|
147
|
+
onDoctor: () => doctor(),
|
|
148
|
+
onUninstall: () => uninstall({ all: flags.all }),
|
|
149
|
+
onScan: () => {
|
|
150
|
+
printScanTable(formatScanReport());
|
|
151
|
+
const n = getDetectedTargets().length;
|
|
152
|
+
console.log(
|
|
153
|
+
info(`${n} CLI(s) will receive DME on install (detect-only)`)
|
|
154
|
+
);
|
|
155
|
+
console.log("");
|
|
156
|
+
},
|
|
157
|
+
});
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
help();
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
81
163
|
|
|
82
164
|
switch (cmd) {
|
|
83
165
|
case "i":
|
|
84
166
|
case "install":
|
|
85
167
|
case "bootstrap":
|
|
86
168
|
case "update":
|
|
87
|
-
case "init":
|
|
88
|
-
|
|
89
|
-
console.log(info("Bootstrapping Neominimal Identity Engine…"));
|
|
90
|
-
console.log(hr());
|
|
91
|
-
await installDme({
|
|
92
|
-
targets: flags.targets.length ? flags.targets : ["all"],
|
|
93
|
-
dryRun: flags.dryRun,
|
|
94
|
-
force: flags.force,
|
|
95
|
-
cwdProject: !flags.noProject,
|
|
96
|
-
});
|
|
169
|
+
case "init":
|
|
170
|
+
await doInstall(flags);
|
|
97
171
|
break;
|
|
98
|
-
|
|
172
|
+
|
|
173
|
+
case "scan":
|
|
174
|
+
case "detect":
|
|
175
|
+
scan();
|
|
176
|
+
break;
|
|
177
|
+
|
|
99
178
|
case "doctor":
|
|
100
179
|
case "status":
|
|
101
180
|
case "check":
|
|
102
|
-
console.log(banner(pkg.version));
|
|
103
181
|
doctor();
|
|
104
182
|
break;
|
|
183
|
+
|
|
105
184
|
case "uninstall":
|
|
106
185
|
case "remove":
|
|
107
|
-
|
|
108
|
-
|
|
186
|
+
uninstall({ all: flags.all });
|
|
187
|
+
break;
|
|
188
|
+
|
|
189
|
+
case "skills":
|
|
190
|
+
console.log(asciiLogo("9.69"));
|
|
191
|
+
console.log(hr());
|
|
192
|
+
for (const s of SKILL_NAMES) {
|
|
193
|
+
console.log(` ${c.brightYellow}/${s}${c.reset}`);
|
|
194
|
+
}
|
|
195
|
+
console.log("");
|
|
196
|
+
console.log(info(`${SKILL_NAMES.length} skills in installer pack`));
|
|
197
|
+
console.log("");
|
|
198
|
+
break;
|
|
199
|
+
|
|
200
|
+
case "tui":
|
|
201
|
+
case "menu":
|
|
202
|
+
case "ui":
|
|
203
|
+
await runMainTui({
|
|
204
|
+
version: pkg.version,
|
|
205
|
+
onInstall: () => doInstall({ ...flags, targets: [] }),
|
|
206
|
+
onDoctor: () => doctor(),
|
|
207
|
+
onUninstall: () => uninstall({ all: flags.all }),
|
|
208
|
+
onScan: () => scan(),
|
|
209
|
+
});
|
|
109
210
|
break;
|
|
211
|
+
|
|
110
212
|
case "list":
|
|
111
213
|
case "targets":
|
|
112
|
-
console.log(
|
|
214
|
+
console.log(asciiLogo("9.69"));
|
|
215
|
+
console.log(hr());
|
|
113
216
|
for (const t of getTargets()) {
|
|
114
217
|
console.log(
|
|
115
|
-
` ${c.
|
|
218
|
+
` ${c.brightYellow}${t.id.padEnd(14)}${c.reset} ${c.brightWhite}${t.name}${c.reset}`
|
|
116
219
|
);
|
|
220
|
+
if (t.agentsMd) {
|
|
221
|
+
console.log(` ${"".padEnd(14)} ${c.dim}AGENTS → ${t.agentsMd}${c.reset}`);
|
|
222
|
+
}
|
|
117
223
|
}
|
|
118
224
|
console.log("");
|
|
119
225
|
break;
|
|
226
|
+
|
|
120
227
|
case "path":
|
|
121
228
|
case "assets":
|
|
122
229
|
console.log(path.join(__dirname, "..", "assets"));
|
|
123
230
|
break;
|
|
231
|
+
|
|
124
232
|
case "version":
|
|
125
233
|
case "-v":
|
|
126
234
|
case "--version":
|
|
127
235
|
console.log(pkg.version);
|
|
128
236
|
break;
|
|
237
|
+
|
|
129
238
|
case "help":
|
|
130
239
|
case "-h":
|
|
131
240
|
case "--help":
|
|
241
|
+
help();
|
|
242
|
+
break;
|
|
243
|
+
|
|
132
244
|
default:
|
|
133
|
-
|
|
134
|
-
console.log(fail(`Unknown command: ${cmd}`));
|
|
135
|
-
}
|
|
245
|
+
console.log(fail(`Unknown command: ${cmd}`));
|
|
136
246
|
help();
|
|
137
|
-
process.exit(
|
|
247
|
+
process.exit(1);
|
|
138
248
|
}
|
|
139
249
|
}
|
|
140
250
|
|
|
141
251
|
main().catch((e) => {
|
|
252
|
+
showCursor();
|
|
142
253
|
console.error(fail(e?.stack || String(e)));
|
|
143
254
|
process.exit(1);
|
|
144
255
|
});
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dme-agent",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "DME Agent
|
|
3
|
+
"version": "9.69.0",
|
|
4
|
+
"description": "DME Agent 9.69 — Neominimal Identity Engine. Detect-only bootstrap + TUI. Ask palette · motion bible · web vs app · icons · welcome.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"dme": "bin/dme.mjs",
|
|
@@ -34,13 +34,18 @@
|
|
|
34
34
|
"neominimal",
|
|
35
35
|
"dashboard",
|
|
36
36
|
"landing-page",
|
|
37
|
-
"bootstrap"
|
|
37
|
+
"bootstrap",
|
|
38
|
+
"tui",
|
|
39
|
+
"motion",
|
|
40
|
+
"icons",
|
|
41
|
+
"electron",
|
|
42
|
+
"tauri"
|
|
38
43
|
],
|
|
39
44
|
"author": "AnThophicous / brennoleondesouza",
|
|
40
45
|
"license": "MIT",
|
|
41
46
|
"repository": {
|
|
42
47
|
"type": "git",
|
|
43
|
-
"url": "https://github.com/brennoleondesouza/dme-agent"
|
|
48
|
+
"url": "git+https://github.com/brennoleondesouza/dme-agent.git"
|
|
44
49
|
},
|
|
45
50
|
"homepage": "https://www.npmjs.com/package/dme-agent",
|
|
46
51
|
"engines": {
|