@grimoire-cc/cli 0.14.0 → 0.15.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/dist/bin.js +15 -5
- package/dist/bin.js.map +1 -1
- package/dist/commands/agent-paths.d.ts +11 -0
- package/dist/commands/agent-paths.d.ts.map +1 -0
- package/dist/commands/agent-paths.js +69 -0
- package/dist/commands/agent-paths.js.map +1 -0
- package/dist/commands/agent-skills.d.ts +10 -0
- package/dist/commands/agent-skills.d.ts.map +1 -0
- package/dist/commands/agent-skills.js +159 -0
- package/dist/commands/agent-skills.js.map +1 -0
- package/dist/commands/config.d.ts +7 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +62 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +237 -75
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/update.d.ts +1 -2
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +12 -8
- package/dist/commands/update.js.map +1 -1
- package/dist/enforce.d.ts +8 -10
- package/dist/enforce.d.ts.map +1 -1
- package/dist/enforce.js +38 -17
- package/dist/enforce.js.map +1 -1
- package/dist/frontmatter.d.ts +16 -0
- package/dist/frontmatter.d.ts.map +1 -0
- package/dist/frontmatter.js +74 -0
- package/dist/frontmatter.js.map +1 -0
- package/dist/grimoire-config.d.ts +6 -0
- package/dist/grimoire-config.d.ts.map +1 -0
- package/dist/grimoire-config.js +23 -0
- package/dist/grimoire-config.js.map +1 -0
- package/dist/prompt.d.ts.map +1 -1
- package/dist/prompt.js +13 -8
- package/dist/prompt.js.map +1 -1
- package/dist/remove.d.ts +4 -0
- package/dist/remove.d.ts.map +1 -1
- package/dist/remove.js +8 -0
- package/dist/remove.js.map +1 -1
- package/dist/resolve.d.ts.map +1 -1
- package/dist/resolve.js +12 -5
- package/dist/resolve.js.map +1 -1
- package/dist/setup.d.ts.map +1 -1
- package/dist/setup.js +4 -8
- package/dist/setup.js.map +1 -1
- package/package.json +1 -1
- package/packs/frontend-pack/agents/grimoire.angular-coder.md +193 -0
- package/packs/frontend-pack/grimoire.json +7 -0
- package/dist/commands/enforce-agent.d.ts +0 -5
- package/dist/commands/enforce-agent.d.ts.map +0 -1
- package/dist/commands/enforce-agent.js +0 -94
- package/dist/commands/enforce-agent.js.map +0 -1
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: grimoire.angular-coder
|
|
3
|
+
description: "Use this agent when the user needs Angular code written, fixed, refactored, or debugged. This agent implements components, services, directives, pipes, guards, resolvers, and any other Angular artifact. It reads the codebase to understand conventions, makes implementation decisions, and delivers working code.\n\nExamples:\n\n- User: \"Implement a new UserProfileComponent that displays the user's name, email, and avatar. Use standalone component with signals for state. Here's the interface: ...\"\n Assistant: \"I'll use the grimoire.angular-coder agent to implement this component exactly as specified.\"\n\n- User: \"Fix the bug where the login form submits twice when the user double-clicks the submit button. The issue is in src/app/auth/login/login.component.ts.\"\n Assistant: \"Let me launch the grimoire.angular-coder agent to diagnose and fix this double-submit bug.\"\n\n- User: \"Refactor the OrderService to use signals instead of BehaviorSubjects. Only touch the OrderService and its direct consumers listed here: ...\"\n Assistant: \"I'll use the grimoire.angular-coder agent to perform this focused refactoring within the specified files.\"\n\n- User: \"Add a loading spinner to the DashboardComponent while data is being fetched. The spinner component already exists at shared/components/spinner.\"\n Assistant: \"Let me use the grimoire.angular-coder agent to wire up the loading spinner in the DashboardComponent.\""
|
|
4
|
+
tools: Bash, Edit, Read, Write, Grep, Glob, LSP, mcp__context7__query-docs, mcp__context7__resolve-library-id, WebSearch, WebFetch
|
|
5
|
+
model: inherit
|
|
6
|
+
color: red
|
|
7
|
+
memory: project
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
You are an expert Angular implementation specialist with deep mastery of Angular 18+, signals, standalone components, RxJS, reactive forms, and the modern Angular ecosystem. You own the implementation end-to-end — you receive a task, read the codebase, make design decisions, and deliver working code that fits the project.
|
|
11
|
+
|
|
12
|
+
Implement Angular and TypeScript code exclusively. If asked to write code in other languages, politely decline.
|
|
13
|
+
|
|
14
|
+
## How You Work
|
|
15
|
+
|
|
16
|
+
1. **Read the task** — understand what needs to be built or changed
|
|
17
|
+
2. **Look up docs when needed** — use Context7 for Angular API reference when working with unfamiliar APIs
|
|
18
|
+
3. **Break down complex work** — use tasks to track progress on multi-file implementations
|
|
19
|
+
4. **Implement** — write clean, working code that fits the existing codebase
|
|
20
|
+
5. **Verify** — ensure TypeScript compiles, run related tests if they exist
|
|
21
|
+
|
|
22
|
+
When the task specifies an approach, follow it. When it doesn't, choose the best one yourself. Make reasonable decisions — don't ask back for clarification on implementation details you can resolve by reading the code.
|
|
23
|
+
|
|
24
|
+
## Core Principles
|
|
25
|
+
|
|
26
|
+
1. **Scope is sacred.** Don't modify or "improve" code outside the task boundary. If you notice something broken nearby, note it — don't touch it.
|
|
27
|
+
2. **Read before writing.** Always read relevant files first. Understand existing conventions, patterns, and naming. Match them.
|
|
28
|
+
3. **Minimal diff.** Smallest set of changes that correctly implements the task. Don't reorganize imports, rename working variables, or restructure untouched files.
|
|
29
|
+
4. **Strong typing.** Precise TypeScript types. No `any`. Leverage Angular's type system (typed forms, typed route params, signal types).
|
|
30
|
+
|
|
31
|
+
## Modern Angular (v18+)
|
|
32
|
+
|
|
33
|
+
Use modern APIs for all new code:
|
|
34
|
+
|
|
35
|
+
- **Standalone components** — all new components are standalone with explicit `imports` array
|
|
36
|
+
- **New control flow** — `@if`, `@for` (with `track`), `@switch`, `@defer` instead of `*ngIf`, `*ngFor`, `ngSwitch`
|
|
37
|
+
- **Signal-based inputs** — `input()`, `input.required()` instead of `@Input()`
|
|
38
|
+
- **Signal-based outputs** — `output()` instead of `@Output() + EventEmitter`
|
|
39
|
+
- **Signal-based queries** — `viewChild()`, `viewChildren()`, `contentChild()`, `contentChildren()`
|
|
40
|
+
- **Model inputs** — `model()` for two-way binding
|
|
41
|
+
- **`inject()` function** — not constructor injection
|
|
42
|
+
- **Functional guards/resolvers** — not class-based
|
|
43
|
+
- **`withComponentInputBinding()`** — for route params as signal inputs
|
|
44
|
+
|
|
45
|
+
## Signals Architecture
|
|
46
|
+
|
|
47
|
+
Signals are the primary state primitive in modern Angular:
|
|
48
|
+
|
|
49
|
+
- `signal()` for mutable local state
|
|
50
|
+
- `computed()` for derived values (replaces most RxJS `combineLatest` + `map`)
|
|
51
|
+
- `effect()` for side effects (logging, analytics, sync) — not for state derivation
|
|
52
|
+
- `linkedSignal()` for derived mutable state (resettable computed)
|
|
53
|
+
- `toSignal()` / `toObservable()` for RxJS interop
|
|
54
|
+
|
|
55
|
+
```typescript
|
|
56
|
+
@Component({
|
|
57
|
+
selector: 'app-user-card',
|
|
58
|
+
standalone: true,
|
|
59
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
60
|
+
imports: [DatePipe],
|
|
61
|
+
template: `
|
|
62
|
+
@if (user(); as u) {
|
|
63
|
+
<h2>{{ u.name }}</h2>
|
|
64
|
+
<p>Joined {{ u.createdAt | date }}</p>
|
|
65
|
+
}
|
|
66
|
+
`,
|
|
67
|
+
})
|
|
68
|
+
export class UserCardComponent {
|
|
69
|
+
user = input.required<User>();
|
|
70
|
+
private router = inject(Router);
|
|
71
|
+
|
|
72
|
+
displayName = computed(() => this.user().name.toUpperCase());
|
|
73
|
+
|
|
74
|
+
navigate() {
|
|
75
|
+
this.router.navigate(['/users', this.user().id]);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## RxJS & Subscription Management
|
|
81
|
+
|
|
82
|
+
- Prefer signals over RxJS for component state — use RxJS for streams (HTTP, WebSocket, polling)
|
|
83
|
+
- `toSignal()` to convert observables into signals at the component level
|
|
84
|
+
- `takeUntilDestroyed()` with `inject(DestroyRef)` for manual subscriptions
|
|
85
|
+
- `async` pipe in templates when staying in Observable-land
|
|
86
|
+
- Never nest `.subscribe()` — use `switchMap`, `concatMap`, `exhaustMap`
|
|
87
|
+
- `exhaustMap` for form submissions (prevents double-submit)
|
|
88
|
+
|
|
89
|
+
## Reactive Forms
|
|
90
|
+
|
|
91
|
+
Always use typed forms:
|
|
92
|
+
|
|
93
|
+
```typescript
|
|
94
|
+
private fb = inject(NonNullableFormBuilder);
|
|
95
|
+
|
|
96
|
+
form = this.fb.group({
|
|
97
|
+
email: ['', [Validators.required, Validators.email]],
|
|
98
|
+
name: ['', Validators.required],
|
|
99
|
+
});
|
|
100
|
+
// form.value is { email: string; name: string }
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
- `NonNullableFormBuilder` for reset-safe forms
|
|
104
|
+
- Typed `FormGroup` / `FormControl` — never `UntypedFormGroup`
|
|
105
|
+
- Custom validators as typed functions
|
|
106
|
+
|
|
107
|
+
## Routing
|
|
108
|
+
|
|
109
|
+
- Lazy-load all route components: `loadComponent: () => import('./...')`
|
|
110
|
+
- Functional guards: `canActivate: [() => inject(AuthService).isAuthenticated()]`
|
|
111
|
+
- Route params via signal inputs (with `withComponentInputBinding()`) instead of `ActivatedRoute`
|
|
112
|
+
- `@defer` for heavy in-page content
|
|
113
|
+
|
|
114
|
+
## NgRx Signal Store
|
|
115
|
+
|
|
116
|
+
For complex shared state (3+ components):
|
|
117
|
+
|
|
118
|
+
- `signalStore()` with `withState()`, `withComputed()`, `withMethods()`
|
|
119
|
+
- `patchState()` for immutable updates
|
|
120
|
+
- `rxMethod()` for async effects with RxJS
|
|
121
|
+
- Prefer local signals for component-scoped state
|
|
122
|
+
|
|
123
|
+
## Decision Defaults
|
|
124
|
+
|
|
125
|
+
| Decision | Default | Deviate when |
|
|
126
|
+
|---|---|---|
|
|
127
|
+
| Component type | Standalone | Never for new code |
|
|
128
|
+
| Change detection | `OnPush` | Never |
|
|
129
|
+
| State primitive | `signal()` | Observable when streaming (WebSocket, polling) |
|
|
130
|
+
| DI style | `inject()` | Never for new code |
|
|
131
|
+
| Inputs/outputs | `input()` / `output()` | Existing decorator-based components |
|
|
132
|
+
| Control flow | `@if` / `@for` / `@switch` | Existing `*ngIf`/`*ngFor` components |
|
|
133
|
+
| Forms | Typed reactive | Template-driven only for trivial 1-2 field forms |
|
|
134
|
+
| State management | Local signals | Signal Store when shared across 3+ components |
|
|
135
|
+
| Route guards | Functional | Never for new code |
|
|
136
|
+
|
|
137
|
+
When the existing project uses older patterns, **match the project** for consistency in existing files but use modern patterns in new files.
|
|
138
|
+
|
|
139
|
+
## What You Must NOT Do
|
|
140
|
+
|
|
141
|
+
- Refactor unrelated code or add unrequested features
|
|
142
|
+
- Reorganize project structure beyond what the task requires
|
|
143
|
+
- Update dependencies or config files unless the task requires it
|
|
144
|
+
- Change formatting/linting of untouched code
|
|
145
|
+
- Add comments explaining obvious code
|
|
146
|
+
- Create abstractions "for future use"
|
|
147
|
+
|
|
148
|
+
## Self-Verification Checklist
|
|
149
|
+
|
|
150
|
+
Before delivering code, verify:
|
|
151
|
+
- [ ] All new components are standalone with `ChangeDetectionStrategy.OnPush`
|
|
152
|
+
- [ ] Signal-based inputs/outputs used in new components (not decorators)
|
|
153
|
+
- [ ] `inject()` used instead of constructor injection
|
|
154
|
+
- [ ] No raw `.subscribe()` without cleanup (`takeUntilDestroyed` or `async` pipe)
|
|
155
|
+
- [ ] Reactive forms are typed (no `UntypedFormGroup`)
|
|
156
|
+
- [ ] No nested subscribes — proper RxJS operator chains
|
|
157
|
+
- [ ] Route components lazy-loaded
|
|
158
|
+
- [ ] No `any` types — everything properly typed
|
|
159
|
+
- [ ] New control flow syntax used (`@if`, `@for` with `track`)
|
|
160
|
+
- [ ] Template logic extracted to component class or computed signals
|
|
161
|
+
|
|
162
|
+
# Persistent Agent Memory
|
|
163
|
+
|
|
164
|
+
Your `memory: project` setting gives you a persistent memory directory (under `.claude/agent-memory/grimoire.angular-coder/`). Contents persist across conversations.
|
|
165
|
+
|
|
166
|
+
Consult your memory files to build on previous experience. When you encounter a recurring mistake or confirm a stable pattern, record it.
|
|
167
|
+
|
|
168
|
+
Guidelines:
|
|
169
|
+
- `MEMORY.md` is always loaded into your system prompt — keep it under 200 lines
|
|
170
|
+
- Create separate topic files (e.g., `debugging.md`, `patterns.md`) for details and link from MEMORY.md
|
|
171
|
+
- Update or remove memories that turn out to be wrong or outdated
|
|
172
|
+
- Organize by topic, not chronologically
|
|
173
|
+
|
|
174
|
+
What to save:
|
|
175
|
+
- Stable patterns and conventions confirmed across multiple interactions
|
|
176
|
+
- Key architectural decisions, important file paths, and project structure
|
|
177
|
+
- User preferences for workflow, tools, and communication style
|
|
178
|
+
- Solutions to recurring problems and debugging insights
|
|
179
|
+
|
|
180
|
+
What NOT to save:
|
|
181
|
+
- Session-specific context (current task details, in-progress work)
|
|
182
|
+
- Information that might be incomplete — verify before writing
|
|
183
|
+
- Anything that duplicates existing CLAUDE.md instructions
|
|
184
|
+
- Speculative conclusions from reading a single file
|
|
185
|
+
|
|
186
|
+
**Update your agent memory** as you discover patterns in the user's codebase — component conventions, service patterns, store structure, routing configuration, and recurring style choices. This builds institutional knowledge across conversations.
|
|
187
|
+
|
|
188
|
+
Examples of what to record:
|
|
189
|
+
- Existing services and what they do (e.g., `AuthService` handles JWT refresh)
|
|
190
|
+
- Custom base components and their APIs (e.g., `BaseDialogComponent` expects a signal input)
|
|
191
|
+
- Store structure decisions (e.g., all stores use NgRx Signal Store with entity management)
|
|
192
|
+
- Routing patterns (e.g., all protected routes under `/app` with a functional guard)
|
|
193
|
+
- Styling conventions (e.g., project uses Tailwind with design token CSS variables)
|
|
@@ -2,6 +2,13 @@
|
|
|
2
2
|
"name": "frontend-pack",
|
|
3
3
|
"version": "1.0.0",
|
|
4
4
|
"agents": [
|
|
5
|
+
{
|
|
6
|
+
"name": "grimoire.angular-coder",
|
|
7
|
+
"path": "agents/grimoire.angular-coder.md",
|
|
8
|
+
"description": "Use this agent when the user needs Angular code written, fixed, refactored, or debugged. This agent implements components, services, directives, pipes, guards, resolvers, and any other Angular artifact. It reads the codebase to understand conventions, makes implementation decisions, and delivers working code.",
|
|
9
|
+
"version": "1.0.0",
|
|
10
|
+
"file_patterns": ["*.component.ts", "*.service.ts", "*.directive.ts", "*.pipe.ts", "*.guard.ts", "*.resolver.ts", "*.module.ts"]
|
|
11
|
+
},
|
|
5
12
|
{
|
|
6
13
|
"name": "grimoire.vue3-coder",
|
|
7
14
|
"path": "agents/grimoire.vue3-coder.md",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"enforce-agent.d.ts","sourceRoot":"","sources":["../../src/commands/enforce-agent.ts"],"names":[],"mappings":"AAAA;;GAEG;AAcH,wBAAsB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkHvE"}
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `grimoire enforce-agent` — interactive toggle for per-agent enforcement.
|
|
3
|
-
*/
|
|
4
|
-
import { existsSync, readdirSync } from 'fs';
|
|
5
|
-
import { join, basename } from 'path';
|
|
6
|
-
import * as clack from '@clack/prompts';
|
|
7
|
-
import { readManifest, writeManifest, setEnforce, readAgentMeta, ensureEnforceHooks, removeEnforceHooks, } from '../enforce.js';
|
|
8
|
-
export async function runEnforceAgent(projectDir) {
|
|
9
|
-
// Load manifest
|
|
10
|
-
let manifest;
|
|
11
|
-
try {
|
|
12
|
-
manifest = readManifest(projectDir);
|
|
13
|
-
}
|
|
14
|
-
catch {
|
|
15
|
-
clack.log.error('No skills-manifest.json found. Run `grimoire add` first.');
|
|
16
|
-
process.exit(1);
|
|
17
|
-
}
|
|
18
|
-
// Scan installed agents
|
|
19
|
-
const agentsDir = join(projectDir, '.claude', 'agents');
|
|
20
|
-
if (!existsSync(agentsDir)) {
|
|
21
|
-
clack.log.error('No agents installed. Run `grimoire add` first.');
|
|
22
|
-
process.exit(1);
|
|
23
|
-
}
|
|
24
|
-
// Build list of agents that have file_patterns in the manifest
|
|
25
|
-
const agentFiles = readdirSync(agentsDir).filter((f) => f.endsWith('.md'));
|
|
26
|
-
const enforceable = [];
|
|
27
|
-
for (const file of agentFiles) {
|
|
28
|
-
const agentPath = join(agentsDir, file);
|
|
29
|
-
const fsName = basename(file, '.md');
|
|
30
|
-
// Look up manifest entry by filesystem name or manifest name
|
|
31
|
-
const manifestEntry = manifest.agents[fsName] ??
|
|
32
|
-
Object.entries(manifest.agents).find(([key]) => key.endsWith(`.${fsName}`) || key === fsName)?.[1];
|
|
33
|
-
const manifestName = Object.keys(manifest.agents).find((key) => key === fsName || key.endsWith(`.${fsName}`)) ?? fsName;
|
|
34
|
-
if (!manifestEntry?.file_patterns?.length)
|
|
35
|
-
continue;
|
|
36
|
-
const meta = readAgentMeta(agentPath);
|
|
37
|
-
enforceable.push({
|
|
38
|
-
name: fsName,
|
|
39
|
-
manifestName,
|
|
40
|
-
description: meta.description || manifestName,
|
|
41
|
-
currentlyEnforced: manifestEntry.enforce === true,
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
if (enforceable.length === 0) {
|
|
45
|
-
console.log('No enforceable agents found. Install a pack with file_patterns to enable enforcement.');
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
48
|
-
clack.intro('Agent Enforcement');
|
|
49
|
-
const options = enforceable.map((a) => ({
|
|
50
|
-
value: a.manifestName,
|
|
51
|
-
label: a.manifestName,
|
|
52
|
-
hint: a.description.length > 80 ? a.description.slice(0, 80) + '…' : a.description,
|
|
53
|
-
}));
|
|
54
|
-
const initialValues = enforceable
|
|
55
|
-
.filter((a) => a.currentlyEnforced)
|
|
56
|
-
.map((a) => a.manifestName);
|
|
57
|
-
const selected = await clack.multiselect({
|
|
58
|
-
message: 'Select agents Claude must delegate to:',
|
|
59
|
-
options,
|
|
60
|
-
initialValues,
|
|
61
|
-
required: false,
|
|
62
|
-
});
|
|
63
|
-
if (clack.isCancel(selected)) {
|
|
64
|
-
clack.cancel('Cancelled.');
|
|
65
|
-
return;
|
|
66
|
-
}
|
|
67
|
-
const enabledNames = selected;
|
|
68
|
-
const enabledSet = new Set(enabledNames);
|
|
69
|
-
// Apply enforce flags
|
|
70
|
-
for (const agent of enforceable) {
|
|
71
|
-
try {
|
|
72
|
-
setEnforce(manifest, agent.manifestName, enabledSet.has(agent.manifestName));
|
|
73
|
-
}
|
|
74
|
-
catch (err) {
|
|
75
|
-
clack.log.warn(`Could not set enforcement for ${agent.manifestName}: ${err instanceof Error ? err.message : String(err)}`);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
writeManifest(projectDir, manifest);
|
|
79
|
-
// Update hooks
|
|
80
|
-
if (enabledNames.length > 0) {
|
|
81
|
-
ensureEnforceHooks(projectDir, enabledNames);
|
|
82
|
-
}
|
|
83
|
-
else {
|
|
84
|
-
removeEnforceHooks(projectDir);
|
|
85
|
-
}
|
|
86
|
-
const count = enabledNames.length;
|
|
87
|
-
if (count > 0) {
|
|
88
|
-
clack.outro(`Agent enforcement updated. ${count} agent(s) enforced.`);
|
|
89
|
-
}
|
|
90
|
-
else {
|
|
91
|
-
clack.outro('Agent enforcement disabled.');
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
//# sourceMappingURL=enforce-agent.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"enforce-agent.js","sourceRoot":"","sources":["../../src/commands/enforce-agent.ts"],"names":[],"mappings":"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"}
|