monomind 2.5.2 → 2.5.3
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 +1 -1
- package/package.json +1 -1
- package/packages/@monomind/cli/.claude/agents/github/repo-architect.md +3 -3
- package/packages/@monomind/cli/.claude/agents/github/sync-coordinator.md +2 -2
- package/packages/@monomind/cli/.claude/agents/specialists/integration-architect.md +4 -4
- package/packages/@monomind/cli/.claude/commands/github/repo-architect.md +4 -4
- package/packages/@monomind/cli/.claude/commands/github/sync-coordinator.md +2 -2
- package/packages/@monomind/cli/.claude/helpers/event-logger.cjs +2 -2
- package/packages/@monomind/cli/.claude/helpers/extras-registry.json +1 -1
- package/packages/@monomind/cli/.claude/helpers/handlers/agent-start-handler.cjs +2 -2
- package/packages/@monomind/cli/.claude/helpers/handlers/edit-handler.cjs +2 -2
- package/packages/@monomind/cli/.claude/helpers/handlers/gates-handler.cjs +1 -1
- package/packages/@monomind/cli/.claude/helpers/handlers/route-handler.cjs +1 -1
- package/packages/@monomind/cli/.claude/helpers/handlers/session-handler.cjs +1 -1
- package/packages/@monomind/cli/.claude/helpers/handlers/session-restore-handler.cjs +11 -11
- package/packages/@monomind/cli/.claude/helpers/handlers/task-handler.cjs +2 -2
- package/packages/@monomind/cli/.claude/helpers/hook-handler.cjs +8 -8
- package/packages/@monomind/cli/.claude/skills/mastermind-techport/SKILL.md +1 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/SKILL.md +2 -2
- package/packages/@monomind/cli/.claude/skills/monodesign/reference/antipatterns-catalog.md +47 -2
- package/packages/@monomind/cli/.claude/skills/monodesign/reference/critique.md +1 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/reference/live.md +0 -8
- package/packages/@monomind/cli/.claude/skills/monodesign/reference/polish.md +2 -2
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/context-signals.mjs +39 -6
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/context.mjs +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/critique-storage.mjs +175 -2
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/detect-csp.mjs +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/detect.mjs +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/detector/browser/injected/index.mjs +25 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/detector/cli/main.mjs +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/detector/design-system.mjs +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/detector/detect-antipatterns-browser.js +356 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/detector/detect-antipatterns.mjs +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/detector/engines/browser/detect-url.mjs +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/detector/engines/browser/drivers.mjs +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/detector/engines/regex/detect-text.mjs +63 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/detector/engines/static-html/css-cascade.mjs +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/detector/engines/static-html/detect-html.mjs +19 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/detector/engines/visual/screenshot-contrast.mjs +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/detector/findings.mjs +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/detector/fix/css-regions.mjs +181 -0
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/detector/fix/fixers.mjs +373 -0
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/detector/fix/index.mjs +426 -0
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/detector/node/file-system.mjs +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/detector/profile/profiler.mjs +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/detector/registry/antipatterns.mjs +49 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/detector/rules/checks.mjs +292 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/detector/shared/color.mjs +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/detector/shared/constants.mjs +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/detector/shared/fonts.mjs +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/detector/shared/inline-ignores.mjs +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/detector/shared/page.mjs +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/hook-admin.mjs +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/hook-before-edit.mjs +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/hook-lib.mjs +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/hook.mjs +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/lib/design-parser.mjs +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/lib/is-generated.mjs +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/lib/monodesign-config.mjs +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/lib/monodesign-paths.mjs +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/lib/provider.mjs +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/lib/target-args.mjs +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live/browser-script-parts.mjs +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live/completion.mjs +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live/event-validation.mjs +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live/insert-ui.mjs +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live/manual-apply.mjs +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live/manual-edit-routes.mjs +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live/manual-edits-buffer.mjs +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live/session-store.mjs +5 -2
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live/svelte-component.mjs +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live/sveltekit-adapter.mjs +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live/ui-core.mjs +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live/vocabulary.mjs +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live-accept.mjs +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live-browser-dom.js +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live-browser-session.js +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live-browser.js +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live-commit-manual-edits.mjs +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live-complete.mjs +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live-copy-edit-agent.mjs +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live-discard-manual-edits.mjs +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live-inject.mjs +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live-insert.mjs +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live-manual-edit-evidence.mjs +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live-poll.mjs +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live-resume.mjs +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live-server.mjs +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live-status.mjs +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live-target.mjs +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live-wrap.mjs +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/live.mjs +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/modern-screenshot.umd.js +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/palette.mjs +0 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/scripts/pin.mjs +0 -1
- package/packages/@monomind/cli/README.md +1 -1
- package/packages/@monomind/cli/dist/src/commands/design-detect.js +62 -1
- package/packages/@monomind/cli/dist/src/commands/design-palette.d.ts +0 -1
- package/packages/@monomind/cli/dist/src/commands/design-palette.js +0 -1
- package/packages/@monomind/cli/dist/src/commands/doctor-project-checks.d.ts +1 -1
- package/packages/@monomind/cli/dist/src/commands/doctor-project-checks.js +1 -1
- package/packages/@monomind/cli/dist/src/commands/hooks-workers.d.ts +1 -1
- package/packages/@monomind/cli/dist/src/commands/hooks-workers.js +8 -8
- package/packages/@monomind/cli/dist/src/commands/init.js +2 -2
- package/packages/@monomind/cli/dist/src/index.d.ts +1 -1
- package/packages/@monomind/cli/dist/src/index.js +3 -3
- package/packages/@monomind/cli/dist/src/init/claudemd-generator.js +5 -5
- package/packages/@monomind/cli/dist/src/init/executor.js +3 -3
- package/packages/@monomind/cli/dist/src/knowledge/document-pipeline.js +3 -1
- package/packages/@monomind/cli/dist/src/mcp-server.js +2 -2
- package/packages/@monomind/cli/dist/src/mcp-tools/hooks-intelligence.d.ts +1 -1
- package/packages/@monomind/cli/dist/src/mcp-tools/hooks-intelligence.js +1 -1
- package/packages/@monomind/cli/dist/src/mcp-tools/hooks-routing.js +2 -2
- package/packages/@monomind/cli/dist/src/mcp-tools/hooks-tools.js +1 -1
- package/packages/@monomind/cli/dist/src/memory/memory-kg.d.ts +5 -4
- package/packages/@monomind/cli/dist/src/memory/memory-kg.js +5 -4
- package/packages/@monomind/cli/dist/src/routing/embed-worker.js +1 -1
- package/packages/@monomind/cli/dist/src/routing/llm-caller.js +1 -1
- package/packages/@monomind/cli/dist/src/routing/route-layer-factory.js +1 -1
- package/packages/@monomind/cli/dist/src/ui/dashboard.html +22 -20
- package/packages/@monomind/cli/dist/src/update/checker.js +3 -3
- package/packages/@monomind/cli/package.json +5 -5
package/README.md
CHANGED
|
@@ -365,7 +365,7 @@ Everything runs from inside Claude Code via slash commands. Here's the highlight
|
|
|
365
365
|
graph TD
|
|
366
366
|
CC["Claude Code"]
|
|
367
367
|
MCP["MCP Server\nmonomind mcp start"]
|
|
368
|
-
D["Background Workers\n(@
|
|
368
|
+
D["Background Workers\n(@monoes/hooks, in-process)"]
|
|
369
369
|
ORG["OrgDaemon\nmonomind org run\nreal SDK sessions"]
|
|
370
370
|
|
|
371
371
|
CC <-->|"MCP tools: monograph, memory"| MCP
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "monomind",
|
|
3
|
-
"version": "2.5.
|
|
3
|
+
"version": "2.5.3",
|
|
4
4
|
"description": "Open-source CLI extension for Claude Code. Adds an MCP server with a codebase knowledge graph, persistent memory, multi-agent coordination, and reusable slash commands. MIT licensed, runs locally, no data leaves your machine.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -220,7 +220,7 @@ jobs:
|
|
|
220
220
|
key: "architecture/analysis/results",
|
|
221
221
|
value: {
|
|
222
222
|
timestamp: Date.now(),
|
|
223
|
-
repositories_analyzed: ["@monomind/cli", "@
|
|
223
|
+
repositories_analyzed: ["@monomind/cli", "@monoes/hooks"],
|
|
224
224
|
optimization_areas: ["structure", "workflows", "templates", "documentation"],
|
|
225
225
|
recommendations: ["standardize_structure", "improve_workflows", "enhance_templates"],
|
|
226
226
|
implementation_status: "in_progress"
|
|
@@ -284,10 +284,10 @@ const integrationPattern = {
|
|
|
284
284
|
packages: {
|
|
285
285
|
"@monomind/cli": {
|
|
286
286
|
role: "orchestration_layer",
|
|
287
|
-
dependencies: ["@
|
|
287
|
+
dependencies: ["@monoes/hooks", "@monomind/memory"],
|
|
288
288
|
provides: ["CLI", "workflows", "commands"],
|
|
289
289
|
},
|
|
290
|
-
"@
|
|
290
|
+
"@monoes/hooks": {
|
|
291
291
|
role: "intelligence_engine",
|
|
292
292
|
dependencies: ["@monomind/memory"],
|
|
293
293
|
provides: ["hooks", "workers", "learning"],
|
|
@@ -182,7 +182,7 @@ Bash(`gh pr create \
|
|
|
182
182
|
key: "sync/complete/status",
|
|
183
183
|
value: {
|
|
184
184
|
timestamp: Date.now(),
|
|
185
|
-
packages_synced: ["@monomind/cli", "@
|
|
185
|
+
packages_synced: ["@monomind/cli", "@monoes/hooks"],
|
|
186
186
|
version_alignment: "completed",
|
|
187
187
|
documentation_sync: "completed",
|
|
188
188
|
github_integration: "completed",
|
|
@@ -225,7 +225,7 @@ const docSyncPattern = {
|
|
|
225
225
|
### 3. **Integration Testing Matrix**
|
|
226
226
|
```javascript
|
|
227
227
|
const testMatrix = {
|
|
228
|
-
packages: ["@monomind/cli", "@
|
|
228
|
+
packages: ["@monomind/cli", "@monoes/hooks", "@monomind/memory"],
|
|
229
229
|
tests: [
|
|
230
230
|
"unit_tests",
|
|
231
231
|
"integration_tests",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: v1-integration-architect
|
|
3
3
|
description: |
|
|
4
|
-
v1 Integration Architect for cross-package integration work within the Monomind monorepo. Owns the wiring between @monomind/cli, @
|
|
4
|
+
v1 Integration Architect for cross-package integration work within the Monomind monorepo. Owns the wiring between @monomind/cli, @monoes/hooks, @monomind/memory, @monomind/security, and @monoes/monograph — ensuring MCP tool contracts, hook event flows, and inter-package APIs stay coherent as each package evolves.
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Integration Architect
|
|
@@ -17,7 +17,7 @@ Keep the 5 Monomind packages working as a coherent system. When a package change
|
|
|
17
17
|
| Package | Role | Integration Surface |
|
|
18
18
|
|---------|------|-------------------|
|
|
19
19
|
| `@monomind/cli` | Orchestration layer | MCP server, CLI commands, init generator |
|
|
20
|
-
| `@
|
|
20
|
+
| `@monoes/hooks` | Intelligence engine | Hook events, background workers, pattern learning |
|
|
21
21
|
| `@monomind/memory` | Persistence layer | LanceDB, HNSW search, session state |
|
|
22
22
|
| `@monomind/security` | Input validation | CVE remediation, safe executor, path validator |
|
|
23
23
|
| `@monoes/monograph` | Knowledge graph | Dependency analysis, community detection, impact |
|
|
@@ -40,7 +40,7 @@ type HookEvent = {
|
|
|
40
40
|
All MCP tools exposed via `@monomind/cli/src/mcp-tools/` must:
|
|
41
41
|
1. Validate inputs through `@monomind/security` before execution
|
|
42
42
|
2. Persist results to `@monomind/memory` when stateful
|
|
43
|
-
3. Emit hook events via `@
|
|
43
|
+
3. Emit hook events via `@monoes/hooks` for learning
|
|
44
44
|
|
|
45
45
|
### Memory Access Pattern
|
|
46
46
|
|
|
@@ -58,7 +58,7 @@ const result = await db.search({ query, namespace: 'package-name' });
|
|
|
58
58
|
When a new feature spans multiple packages:
|
|
59
59
|
|
|
60
60
|
- [ ] API contract defined and typed in the consuming package
|
|
61
|
-
- [ ] Hook events documented in `@
|
|
61
|
+
- [ ] Hook events documented in `@monoes/hooks/src/types.ts`
|
|
62
62
|
- [ ] MCP tool registered in `@monomind/cli/src/mcp-tools/index.ts`
|
|
63
63
|
- [ ] Security validation added at system boundary
|
|
64
64
|
- [ ] Memory schema migration written if LanceDB schema changes
|
|
@@ -143,7 +143,7 @@ See CLAUDE.md for complete integration instructions.`
|
|
|
143
143
|
|
|
144
144
|
```javascript
|
|
145
145
|
// Synchronize structure across related repositories
|
|
146
|
-
const repositories = ["@monomind/cli", "@
|
|
146
|
+
const repositories = ["@monomind/cli", "@monoes/hooks", "@monomind/memory"];
|
|
147
147
|
|
|
148
148
|
// Update common files across repositories
|
|
149
149
|
repositories.forEach((repo) => {
|
|
@@ -248,7 +248,7 @@ monomind/
|
|
|
248
248
|
│ │ ├── src/
|
|
249
249
|
│ │ ├── .claude/
|
|
250
250
|
│ │ └── package.json
|
|
251
|
-
│ ├── @
|
|
251
|
+
│ ├── @monoes/hooks/
|
|
252
252
|
│ │ ├── src/
|
|
253
253
|
│ │ └── package.json
|
|
254
254
|
│ └── shared/
|
|
@@ -296,10 +296,10 @@ const integrationPattern = {
|
|
|
296
296
|
packages: {
|
|
297
297
|
"@monomind/cli": {
|
|
298
298
|
role: "orchestration_layer",
|
|
299
|
-
dependencies: ["@
|
|
299
|
+
dependencies: ["@monoes/hooks", "@monomind/memory"],
|
|
300
300
|
provides: ["CLI", "workflows", "commands"],
|
|
301
301
|
},
|
|
302
|
-
"@
|
|
302
|
+
"@monoes/hooks": {
|
|
303
303
|
role: "coordination_engine",
|
|
304
304
|
dependencies: [],
|
|
305
305
|
provides: ["MCP_tools", "neural_networks", "memory"],
|
|
@@ -225,7 +225,7 @@ const docSyncPattern = {
|
|
|
225
225
|
],
|
|
226
226
|
customSections: {
|
|
227
227
|
"@monomind/cli": "GitHub Commands Integration",
|
|
228
|
-
"@
|
|
228
|
+
"@monoes/hooks": "MCP Tools Reference"
|
|
229
229
|
}
|
|
230
230
|
}
|
|
231
231
|
```
|
|
@@ -234,7 +234,7 @@ const docSyncPattern = {
|
|
|
234
234
|
```javascript
|
|
235
235
|
// Comprehensive testing across synchronized packages
|
|
236
236
|
const testMatrix = {
|
|
237
|
-
packages: ["@monomind/cli", "@
|
|
237
|
+
packages: ["@monomind/cli", "@monoes/hooks"],
|
|
238
238
|
tests: [
|
|
239
239
|
"unit_tests",
|
|
240
240
|
"integration_tests",
|
|
@@ -194,7 +194,7 @@ async function main() {
|
|
|
194
194
|
|
|
195
195
|
// Detect route changes and worker metric updates by mtime and forward them too.
|
|
196
196
|
// These aren't Claude Code hook events — they're file writes from route-handler.cjs
|
|
197
|
-
// and the @
|
|
197
|
+
// and the @monoes/hooks workers respectively — so we poll cheaply on every hook invocation.
|
|
198
198
|
forwardFileChanges(monoDir, CWD);
|
|
199
199
|
|
|
200
200
|
clearTimeout(safety);
|
|
@@ -221,7 +221,7 @@ function forwardFileChanges(monoDir, workDir) {
|
|
|
221
221
|
}
|
|
222
222
|
} catch {}
|
|
223
223
|
|
|
224
|
-
// Worker-complete: newest mtime among .monomind/metrics/*.json (written by @
|
|
224
|
+
// Worker-complete: newest mtime among .monomind/metrics/*.json (written by @monoes/hooks workers)
|
|
225
225
|
const metricsDir = path.join(workDir, '.monomind', 'metrics');
|
|
226
226
|
try {
|
|
227
227
|
const files = fs.readdirSync(metricsDir).filter(f => f.endsWith('.json') && !f.startsWith('.'));
|
|
@@ -3686,7 +3686,7 @@
|
|
|
3686
3686
|
{
|
|
3687
3687
|
"slug": "v1-integration-architect",
|
|
3688
3688
|
"name": "v1-integration-architect",
|
|
3689
|
-
"description": "v1 Integration Architect for cross-package integration work within the Monomind monorepo. Owns the wiring between @monomind/cli, @
|
|
3689
|
+
"description": "v1 Integration Architect for cross-package integration work within the Monomind monorepo. Owns the wiring between @monomind/cli, @monoes/hooks, @monomind/memory, @monomind/security, and @monoes/monograph \u2014 ensuring MCP tool contracts, hook event flows, and inter-package APIs stay coherent as each package evolves.",
|
|
3690
3690
|
"category": "specialists",
|
|
3691
3691
|
"filePath": "../agents/specialists/integration-architect.md",
|
|
3692
3692
|
"keywords": [
|
|
@@ -106,7 +106,7 @@ module.exports = {
|
|
|
106
106
|
}
|
|
107
107
|
} catch (e) { /* non-fatal */ }
|
|
108
108
|
|
|
109
|
-
// Bridge to @
|
|
109
|
+
// Bridge to @monoes/hooks registry — fires AgentSpawn hooks (was previously never
|
|
110
110
|
// wired: HookEvent.AgentSpawn existed but no CJS handler ever fired it).
|
|
111
111
|
try {
|
|
112
112
|
var _hooksModule = hCtx._ensureHooksModule ? await hCtx._ensureHooksModule() : null;
|
|
@@ -125,7 +125,7 @@ module.exports = {
|
|
|
125
125
|
description: agentDescBridge.slice(0, 500),
|
|
126
126
|
},
|
|
127
127
|
}, { continueOnError: true, timeout: 1500 });
|
|
128
|
-
}, '@
|
|
128
|
+
}, '@monoes/hooks.AgentSpawn');
|
|
129
129
|
}
|
|
130
130
|
} catch (e) { /* non-fatal */ }
|
|
131
131
|
},
|
|
@@ -152,7 +152,7 @@ module.exports = {
|
|
|
152
152
|
}
|
|
153
153
|
} catch (e) { /* non-fatal */ }
|
|
154
154
|
|
|
155
|
-
// Bridge to @
|
|
155
|
+
// Bridge to @monoes/hooks registry — fires PostEdit hooks (observability bus, guidance provider).
|
|
156
156
|
// Each hook event runs in a fresh process, so hCtx._hooksModule set by session-restore in an
|
|
157
157
|
// earlier invocation is never visible here — must (re)load lazily via _ensureHooksModule().
|
|
158
158
|
var _hooksModule = hCtx._hooksModule || (hCtx._ensureHooksModule ? await hCtx._ensureHooksModule() : null);
|
|
@@ -169,7 +169,7 @@ module.exports = {
|
|
|
169
169
|
file: { path: editFileBridge, operation: 'modify' },
|
|
170
170
|
duration: 0,
|
|
171
171
|
}, { continueOnError: true, timeout: 1500 });
|
|
172
|
-
}, '@
|
|
172
|
+
}, '@monoes/hooks.PostEdit');
|
|
173
173
|
} catch (e) { /* non-fatal */ }
|
|
174
174
|
}
|
|
175
175
|
|
|
@@ -23,7 +23,7 @@ const path = require('path');
|
|
|
23
23
|
//
|
|
24
24
|
// monofence-ai (packages/monofence-ai) has real prompt-injection / evasion
|
|
25
25
|
// detection but is never wired into the live Claude Code PreToolUse path —
|
|
26
|
-
// it only registers hooks on @
|
|
26
|
+
// it only registers hooks on @monoes/hooks' internal HookRegistry, which
|
|
27
27
|
// this CJS dispatch path does not use. This loads it lazily (so a missing
|
|
28
28
|
// or unbuilt package never breaks the existing regex gates), bounds it with
|
|
29
29
|
// a hard timeout, and fails open on any error.
|
|
@@ -111,7 +111,7 @@ module.exports = {
|
|
|
111
111
|
var result = await Promise.resolve(routeFn(prompt));
|
|
112
112
|
|
|
113
113
|
// ── Enrichment: when router.cjs falls to the broad "coder" catch-all,
|
|
114
|
-
// try @
|
|
114
|
+
// try @monoes/routing's richer keyword pre-filter (30+ specialized
|
|
115
115
|
// rules for Solidity, game engines, DevOps, embedded, etc.) for a
|
|
116
116
|
// more specific agent match. This bridges the hooks layer (router.cjs)
|
|
117
117
|
// with the CLI routing package without requiring ESM imports. ─────────
|
|
@@ -166,7 +166,7 @@ module.exports = {
|
|
|
166
166
|
}
|
|
167
167
|
} catch (e) { console.log('[WARN] Session end failed: ' + e.message); }
|
|
168
168
|
|
|
169
|
-
// Bridge to @
|
|
169
|
+
// Bridge to @monoes/hooks registry — fires SessionEnd hooks (episode-binner closeEpisode, observability bus).
|
|
170
170
|
// Each hook event runs in a fresh process, so hCtx._hooksModule set by session-restore in an
|
|
171
171
|
// earlier invocation is never visible here — must (re)load lazily via _ensureHooksModule().
|
|
172
172
|
var _hooksModule = hCtx._hooksModule || (hCtx._ensureHooksModule ? await hCtx._ensureHooksModule() : null);
|
|
@@ -30,20 +30,20 @@ module.exports = {
|
|
|
30
30
|
}
|
|
31
31
|
} catch (e) { console.log('[WARN] Session restore failed: ' + e.message); }
|
|
32
32
|
|
|
33
|
-
// ── Non-blocking security scan via @
|
|
33
|
+
// ── Non-blocking security scan via @monoes/hooks worker ─────────────
|
|
34
34
|
// The hooks package ships a security worker (worker-security.ts) that scans
|
|
35
35
|
// for hardcoded secrets and vulnerability patterns. We run it at session
|
|
36
36
|
// start as a fire-and-forget check — failures are silently ignored since
|
|
37
37
|
// the package may not be installed or built.
|
|
38
38
|
try {
|
|
39
|
-
var hooksWorkersMod = require('@
|
|
39
|
+
var hooksWorkersMod = require('@monoes/hooks/dist/workers/worker-security.js');
|
|
40
40
|
var _createSecurityWorker = hooksWorkersMod.createSecurityWorker;
|
|
41
41
|
if (typeof _createSecurityWorker === 'function') {
|
|
42
42
|
var _securityScan = _createSecurityWorker(CWD);
|
|
43
43
|
// Fire-and-forget: do not await — must not delay session restore
|
|
44
44
|
Promise.resolve(_securityScan()).catch(function() {});
|
|
45
45
|
}
|
|
46
|
-
} catch (e) { /* @
|
|
46
|
+
} catch (e) { /* @monoes/hooks not available or not built — skip */ }
|
|
47
47
|
|
|
48
48
|
// Stale helper self-heal — silently refresh project helpers that drift from
|
|
49
49
|
// the bundled npm copy, so a `npm i -g monomind@latest` (or npx picking up a
|
|
@@ -226,16 +226,16 @@ module.exports = {
|
|
|
226
226
|
}
|
|
227
227
|
}
|
|
228
228
|
|
|
229
|
-
// Bridge to @
|
|
229
|
+
// Bridge to @monoes/hooks compiled workers (GAP-001).
|
|
230
230
|
// Uses the shared hCtx._ensureHooksModule() (defined in hook-handler.cjs) so worker
|
|
231
231
|
// registration happens exactly once per process instead of being duplicated here —
|
|
232
232
|
// every other bridging handler (agent-start, pre-task, post-task, post-edit,
|
|
233
233
|
// session-end) calls the same lazy loader since each hook event is its own process.
|
|
234
234
|
try {
|
|
235
|
-
var hooksModule = hCtx._ensureHooksModule ? await hCtx._ensureHooksModule() : await import('@
|
|
235
|
+
var hooksModule = hCtx._ensureHooksModule ? await hCtx._ensureHooksModule() : await import('@monoes/hooks');
|
|
236
236
|
if (hooksModule) {
|
|
237
237
|
hCtx._hooksModule = hooksModule;
|
|
238
|
-
console.log('[INFO] @
|
|
238
|
+
console.log('[INFO] @monoes/hooks workers initialized');
|
|
239
239
|
|
|
240
240
|
// Gate enforcement lives entirely in gates-handler.cjs (its own regex
|
|
241
241
|
// table, run on every PreToolUse). The @monomind/guidance package that
|
|
@@ -251,16 +251,16 @@ module.exports = {
|
|
|
251
251
|
startedAt: new Date(),
|
|
252
252
|
},
|
|
253
253
|
}, { continueOnError: true, timeout: 1500 });
|
|
254
|
-
}, '@
|
|
254
|
+
}, '@monoes/hooks.SessionStart');
|
|
255
255
|
} catch (e2) { /* non-fatal */ }
|
|
256
256
|
}
|
|
257
257
|
}
|
|
258
|
-
} catch (e) { /* @
|
|
258
|
+
} catch (e) { /* @monoes/hooks not compiled yet — skip */ }
|
|
259
259
|
|
|
260
260
|
// Refresh worker metrics once per session start — the statusline
|
|
261
261
|
// (.claude/helpers/statusline.cjs) reads .monomind/metrics/ddd-progress.json,
|
|
262
262
|
// route-handler.cjs and doctor read codebase-map/security-audit/performance/
|
|
263
|
-
// consolidation.json; the @
|
|
263
|
+
// consolidation.json; the @monoes/hooks workers are never otherwise
|
|
264
264
|
// scheduled on the live hook path (the worker daemon that used to produce
|
|
265
265
|
// these files was deleted).
|
|
266
266
|
//
|
|
@@ -295,7 +295,7 @@ module.exports = {
|
|
|
295
295
|
var _create = (hooksModule && typeof hooksModule[_w.factory] === 'function')
|
|
296
296
|
? hooksModule[_w.factory] : null;
|
|
297
297
|
if (!_create) {
|
|
298
|
-
// Dev-repo fallback: bare '@
|
|
298
|
+
// Dev-repo fallback: bare '@monoes/hooks' does not resolve from .claude/helpers
|
|
299
299
|
// in the monorepo (pnpm workspace link lives under packages/@monomind/cli), so
|
|
300
300
|
// import the compiled worker directly by path.
|
|
301
301
|
var _wDist = path.join(_hooksDistDir, _w.file);
|
|
@@ -307,7 +307,7 @@ module.exports = {
|
|
|
307
307
|
if (_create) {
|
|
308
308
|
var _wRun = _create(CWD);
|
|
309
309
|
// runWithTimeout caps each at 1.5s so a slow worker can never block session start.
|
|
310
|
-
await runWithTimeout(function() { return _wRun(); }, '@
|
|
310
|
+
await runWithTimeout(function() { return _wRun(); }, '@monoes/hooks.' + _w.factory);
|
|
311
311
|
}
|
|
312
312
|
} catch (e) { /* non-fatal — worker unavailable */ }
|
|
313
313
|
}
|
|
@@ -26,7 +26,7 @@ module.exports = {
|
|
|
26
26
|
// - PromptVersioning experiments (unused feature)
|
|
27
27
|
// - Monograph blast radius (already shown by post-edit hook on actual changes)
|
|
28
28
|
|
|
29
|
-
// Bridge to @
|
|
29
|
+
// Bridge to @monoes/hooks registry — fires Tasks 26 (PromptAssembler) and any other PreTask hooks.
|
|
30
30
|
// Each hook event runs in a fresh process, so hCtx._hooksModule set by session-restore in an
|
|
31
31
|
// earlier invocation is never visible here — must (re)load lazily via _ensureHooksModule().
|
|
32
32
|
var _hooksModule = hCtx._hooksModule || (hCtx._ensureHooksModule ? await hCtx._ensureHooksModule() : null);
|
|
@@ -114,7 +114,7 @@ module.exports = {
|
|
|
114
114
|
}
|
|
115
115
|
} catch (e) { /* non-fatal */ }
|
|
116
116
|
|
|
117
|
-
// Bridge to @
|
|
117
|
+
// Bridge to @monoes/hooks registry — fires Tasks 39 (SpecializationScorer) and any other PostTask hooks.
|
|
118
118
|
// Each hook event runs in a fresh process, so hCtx._hooksModule set by session-restore in an
|
|
119
119
|
// earlier invocation is never visible here — must (re)load lazily via _ensureHooksModule().
|
|
120
120
|
var _hooksModule = hCtx._hooksModule || (hCtx._ensureHooksModule ? await hCtx._ensureHooksModule() : null);
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* configuration. They are plain CommonJS scripts invoked directly
|
|
13
13
|
* by Claude Code's hook runtime. This is the "live" system.
|
|
14
14
|
*
|
|
15
|
-
* 2. @
|
|
15
|
+
* 2. @monoes/hooks TypeScript package (packages/@monomind/hooks/)
|
|
16
16
|
* A full TypeScript package with workers, learning services, and
|
|
17
17
|
* a WorkerManager. It compiles to dist/ but is only loaded
|
|
18
18
|
* optionally, bridged at six lifecycle events: SessionStart (restore),
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
*
|
|
24
24
|
* IMPORTANT: each hook event is dispatched as its OWN fresh `node`
|
|
25
25
|
* process (Claude Code spawns one invocation per event — this file
|
|
26
|
-
* does not stay resident across events). So the @
|
|
26
|
+
* does not stay resident across events). So the @monoes/hooks
|
|
27
27
|
* module, and anything it registers (trace collector spans, episode
|
|
28
28
|
* binner, etc.), cannot be set up once and reused across events —
|
|
29
29
|
* every bridging handler must call hCtx._ensureHooksModule() itself,
|
|
@@ -102,7 +102,7 @@ const session = safeRequire(path.join(helpersDir, 'session.cjs'));
|
|
|
102
102
|
const memory = safeRequire(path.join(helpersDir, 'memory.cjs'));
|
|
103
103
|
const intelligence = safeRequire(path.join(helpersDir, 'intelligence.cjs'));
|
|
104
104
|
|
|
105
|
-
// Module-level reference to @
|
|
105
|
+
// Module-level reference to @monoes/hooks — populated lazily via
|
|
106
106
|
// _ensureHooksModule(). NOTE: hook-handler.cjs runs as a fresh `node` process
|
|
107
107
|
// per hook event (Claude Code spawns one invocation per event, it does not
|
|
108
108
|
// keep the process alive across events), so a value set during one event
|
|
@@ -116,10 +116,10 @@ async function _ensureHooksModule() {
|
|
|
116
116
|
if (_hooksModule) return _hooksModule;
|
|
117
117
|
if (_hooksModuleLoadAttempted) return null; // already tried+failed this process
|
|
118
118
|
_hooksModuleLoadAttempted = true;
|
|
119
|
-
// 1) Bare specifier — works when @
|
|
119
|
+
// 1) Bare specifier — works when @monoes/hooks is installed/linked in a
|
|
120
120
|
// node_modules reachable from this file (e.g. an end-user install).
|
|
121
121
|
try {
|
|
122
|
-
_hooksModule = await import('@
|
|
122
|
+
_hooksModule = await import('@monoes/hooks');
|
|
123
123
|
} catch (e) {
|
|
124
124
|
_hooksModule = null;
|
|
125
125
|
}
|
|
@@ -141,11 +141,11 @@ async function _ensureHooksModule() {
|
|
|
141
141
|
return _hooksModule;
|
|
142
142
|
}
|
|
143
143
|
|
|
144
|
-
// ── Visible one-time warning when the @
|
|
144
|
+
// ── Visible one-time warning when the @monoes/hooks bridge fully fails ───
|
|
145
145
|
// Both load paths above (bare specifier + dev-repo file:// fallback) failed:
|
|
146
146
|
// the 15 background workers (metrics, security scan, DDD tracking, etc.) are
|
|
147
147
|
// unavailable for the rest of this session. This is almost always because
|
|
148
|
-
// @
|
|
148
|
+
// @monoes/hooks was never resolvable from npm (it ships with
|
|
149
149
|
// optionalDependencies:"*", which npm silently skips) — NOT a problem with
|
|
150
150
|
// the user's own project setup. Historically this failed completely
|
|
151
151
|
// silently (see docs/AUDIT-BACKLOG.md P1-1), burning debugging time on the
|
|
@@ -166,7 +166,7 @@ function _warnHooksBridgeUnavailable() {
|
|
|
166
166
|
}
|
|
167
167
|
if (alreadyWarned) return;
|
|
168
168
|
process.stderr.write(
|
|
169
|
-
'[WARN] @
|
|
169
|
+
'[WARN] @monoes/hooks could not be loaded (bare specifier and dev-repo fallback both failed) — ' +
|
|
170
170
|
'background workers (metrics, security scan, DDD tracking, etc.) are unavailable this session. ' +
|
|
171
171
|
'This is not a problem with your project configuration — the package is not resolvable via npm ' +
|
|
172
172
|
'from this install. See docs/AUDIT-BACKLOG.md P1-1 or https://github.com/monoes/monomind/issues.\n'
|
|
@@ -590,7 +590,7 @@ For each approved item, in recommended order.
|
|
|
590
590
|
| Exported functions | camelCase, no prefix | `buildGraph()`, `resolveAgent()` |
|
|
591
591
|
| Config keys | camelCase | `projectRoot`, `maxAgents` |
|
|
592
592
|
| Env vars | `MONOMIND_*` uppercase | `MONOMIND_PORT`, `MONOMIND_LOG_LEVEL` |
|
|
593
|
-
| npm packages | `@monomind/<name>` | `@
|
|
593
|
+
| npm packages | `@monomind/<name>` | `@monoes/hooks` |
|
|
594
594
|
| CLI commands | `monomind <command>` | `monomind agent spawn` |
|
|
595
595
|
| Error classes | extend monomind hierarchy | `class PortedError extends CLIError {}` |
|
|
596
596
|
| Event names | `domain:action` kebab | `'hook:fired'`, `'agent:spawned'` |
|
|
@@ -56,7 +56,7 @@ allowed-tools:
|
|
|
56
56
|
- Bash
|
|
57
57
|
- WebSearch
|
|
58
58
|
- WebFetch
|
|
59
|
-
license:
|
|
59
|
+
license: Apache-2.0
|
|
60
60
|
---
|
|
61
61
|
|
|
62
62
|
Designs and iterates production-grade frontend interfaces. Real working code, committed design choices, exceptional craft.
|
|
@@ -151,7 +151,7 @@ If someone could look at this interface and say "AI made that" without doubt, it
|
|
|
151
151
|
|
|
152
152
|
## Antipattern detection
|
|
153
153
|
|
|
154
|
-
Before finalizing any design, run the bundled detector. It checks
|
|
154
|
+
Before finalizing any design, run the bundled detector. It checks 51 known design antipatterns across two categories (**slop** — AI tells; **quality** — design principle violations):
|
|
155
155
|
|
|
156
156
|
```bash
|
|
157
157
|
monomind design detect <file-or-dir> # human-readable report
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
<!-- Synced from the monodesign v3.2.1 registry. Source of truth: cli/engine/registry/antipatterns.mjs -->
|
|
2
2
|
# Antipatterns Catalog
|
|
3
3
|
|
|
4
|
-
All
|
|
4
|
+
All 51 known design antipatterns with detection rules and remediation. These are what `monomind design detect` checks. Run this on any HTML/CSS target before presenting work.
|
|
5
5
|
|
|
6
6
|
## Categories
|
|
7
7
|
|
|
8
8
|
These are the two categories the `monomind design detect` engine uses:
|
|
9
9
|
|
|
10
10
|
- **slop** — AI tells that signal lack of intentional design (27 patterns)
|
|
11
|
-
- **quality** — Design principle violations including contrast, motion, readability, and semantic structure (
|
|
11
|
+
- **quality** — Design principle violations including contrast, motion, readability, and semantic structure (24 patterns)
|
|
12
12
|
|
|
13
13
|
---
|
|
14
14
|
|
|
@@ -226,6 +226,14 @@ These are the two categories the `monomind design detect` engine uses:
|
|
|
226
226
|
**Why it's wrong:** Cramped elements are hard to read, harder to click, and communicate low quality. 8px is the absolute minimum; 16px is the default.
|
|
227
227
|
**Fix:** Minimum 12px padding inside cards. Minimum 10px vertical + 16px horizontal on buttons. Minimum 44×44px touch targets.
|
|
228
228
|
|
|
229
|
+
### `dark-scheme-contrast-blindspot` — Dark-scheme contrast blindspot
|
|
230
|
+
|
|
231
|
+
**Detect** (advisory): The page ships dark styling (a `@media (prefers-color-scheme: dark)` block or a `.dark` / `[data-theme=dark]` scope), but for some selector the dark override changes the background without changing the paired text color — or the reverse — while the light scheme defined both.
|
|
232
|
+
|
|
233
|
+
**Why it's wrong**: A half-updated color pair often collapses to unreadable contrast in dark mode (dark text left on a newly-dark background). It's the most common dark-mode regression and easy to miss because the light scheme looks fine.
|
|
234
|
+
|
|
235
|
+
**Fix**: Override text and background together for the same selector, or verify the inherited half still contrasts against the changed half. Prefer semantic tokens (`--fg` / `--bg`) that flip as a pair.
|
|
236
|
+
|
|
229
237
|
### `design-system-color` — Color outside DESIGN.md
|
|
230
238
|
|
|
231
239
|
**Detect**: A literal color value used in CSS that is not declared in the project's `DESIGN.md` palette or its tonal ramps.
|
|
@@ -263,6 +271,22 @@ These are the two categories the `monomind design detect` engine uses:
|
|
|
263
271
|
**Why it's wrong:** Gray text on colored backgrounds almost always fails WCAG contrast requirements and looks muddy.
|
|
264
272
|
**Fix:** Use white or the appropriate neutral from the color ramp. Never use a generic gray on a tinted background.
|
|
265
273
|
|
|
274
|
+
### `hover-only-affordance` — Functionality gated behind hover only
|
|
275
|
+
|
|
276
|
+
**Detect**: An element is hidden by default (`display: none`, `visibility: hidden`, or `opacity: 0`) and revealed only via a `:hover` rule on an ancestor, with no matching `:focus`, `:focus-within`, or `:active` rule.
|
|
277
|
+
|
|
278
|
+
**Why it's wrong**: Hover doesn't exist on touch devices and can't be reached by keyboard. Anything gated behind hover alone is invisible and unusable for a large share of users.
|
|
279
|
+
|
|
280
|
+
**Fix**: Mirror every hover reveal with a `:focus-within` (or `:active`) rule targeting the same element, so the affordance is reachable without a pointer.
|
|
281
|
+
|
|
282
|
+
### `image-missing-dimensions` — Image without reserved dimensions
|
|
283
|
+
|
|
284
|
+
**Detect**: An `<img>` ships without both `width` and `height` attributes and without a CSS `aspect-ratio` or explicit height.
|
|
285
|
+
|
|
286
|
+
**Why it's wrong**: The browser can't reserve space before the image loads, so surrounding content jumps when it arrives — cumulative layout shift (CLS), a Core Web Vitals failure and a jarring experience.
|
|
287
|
+
|
|
288
|
+
**Fix**: Set `width` and `height` attributes (the browser derives the aspect ratio), or give the image a CSS `aspect-ratio`. Either reserves the box before load.
|
|
289
|
+
|
|
266
290
|
### `justified-text` — Justified text
|
|
267
291
|
**Detect:** `text-align: justify` on paragraph elements.
|
|
268
292
|
**Why it's wrong:** CSS text justification creates uneven word spacing (rivers of white) because browsers don't hyphenate automatically. It reads as broken on web.
|
|
@@ -283,11 +307,27 @@ These are the two categories the `monomind design detect` engine uses:
|
|
|
283
307
|
**Why it's wrong:** Low contrast text fails WCAG AA requirements and creates genuine barriers for users with low vision, in bright ambient light, or on low-quality displays.
|
|
284
308
|
**Fix:** Increase the contrast between text and background. Use white or a high-lightness neutral on dark backgrounds; use Deep Graphite (`oklch(10% 0 0)`) or Soft Charcoal (`oklch(25% 0 0)`) on light ones. Tool: check with `monomind design detect` or the WebAIM contrast checker.
|
|
285
309
|
|
|
310
|
+
### `missing-focus-visible` — Suppressed focus outline with no replacement
|
|
311
|
+
|
|
312
|
+
**Detect**: An interactive element (link, button, input, `[role=button]`) removes its focus outline (`outline: none` / `0`), but the stylesheet never provides a `:focus-visible` or `:focus` replacement.
|
|
313
|
+
|
|
314
|
+
**Why it's wrong**: Removing the outline with no substitute strands keyboard users — there's no visible indication of where focus is. It's one of the most common and most damaging accessibility regressions.
|
|
315
|
+
|
|
316
|
+
**Fix**: Remove the suppression, or pair it with a visible `:focus-visible` ring — an `outline`, `box-shadow`, or `border` that clearly marks the focused control.
|
|
317
|
+
|
|
286
318
|
### `skipped-heading` — Skipped heading level
|
|
287
319
|
**Detect:** An `h3` or deeper element that is not preceded by an `h2` in the same section, or an `h2` not preceded by an `h1`.
|
|
288
320
|
**Why it's wrong:** Skipped headings break screen reader navigation and document outline semantics.
|
|
289
321
|
**Fix:** Maintain sequential heading hierarchy. If you need the visual size of `h3` without the `h2` parent, use a `h2` with class-based styling.
|
|
290
322
|
|
|
323
|
+
### `small-touch-target` — Touch target below 44px
|
|
324
|
+
|
|
325
|
+
**Detect**: A clickable control (`button`, link, clickable `input`, `[role=button]`) renders smaller than 44×44px on one or both axes. Inline text links inside prose are exempt.
|
|
326
|
+
|
|
327
|
+
**Why it's wrong**: Fingers are imprecise. Targets below ~44×44px (the WCAG 2.5.5 / platform HIG minimum) are missed and mis-tapped, especially on mobile and for users with motor impairments.
|
|
328
|
+
|
|
329
|
+
**Fix**: Give standalone controls at least 44×44px of hit area via `padding` or `min-width` / `min-height`. Spacing between adjacent targets helps too.
|
|
330
|
+
|
|
291
331
|
### `text-overflow` — Content overflowing its container
|
|
292
332
|
|
|
293
333
|
**Detect**: Content renders wider than its container — `scrollWidth > clientWidth` on any non-scroll element, or a horizontal scrollbar appears on the page.
|
|
@@ -349,16 +389,21 @@ These are the two categories the `monomind design detect` engine uses:
|
|
|
349
389
|
| `broken-image` | quality | Real image or remove tag |
|
|
350
390
|
| `clipped-overflow-container` | quality | Portal or visible overflow |
|
|
351
391
|
| `cramped-padding` | quality | 16px minimum |
|
|
392
|
+
| `dark-scheme-contrast-blindspot` | quality | Flip text + background as a pair |
|
|
352
393
|
| `design-system-color` | quality | Use palette token or update DESIGN.md |
|
|
353
394
|
| `design-system-font` | quality | Use type system or update DESIGN.md |
|
|
354
395
|
| `design-system-font-size` | quality | Use type-ramp step or update DESIGN.md |
|
|
355
396
|
| `design-system-radius` | quality | Use radius token or update DESIGN.md |
|
|
356
397
|
| `gray-on-color` | quality | White or appropriate ramp tone |
|
|
398
|
+
| `hover-only-affordance` | quality | Mirror hover with :focus-within |
|
|
399
|
+
| `image-missing-dimensions` | quality | width/height attrs or aspect-ratio |
|
|
357
400
|
| `justified-text` | quality | text-align: left |
|
|
358
401
|
| `layout-transition` | quality | transform + opacity only |
|
|
359
402
|
| `line-length` | quality | max-width: 65ch |
|
|
360
403
|
| `low-contrast` | quality | 4.5:1 normal, 3:1 large text |
|
|
404
|
+
| `missing-focus-visible` | quality | Add a :focus-visible ring |
|
|
361
405
|
| `skipped-heading` | quality | Sequential h1→h2→h3 |
|
|
406
|
+
| `small-touch-target` | quality | 44×44px minimum hit area |
|
|
362
407
|
| `text-overflow` | quality | overflow-wrap + constrained widths |
|
|
363
408
|
| `tight-leading` | quality | line-height: 1.6 |
|
|
364
409
|
| `tiny-text` | quality | 16px minimum body |
|
|
@@ -181,7 +181,7 @@ Skip this step if the Setup slug was null (vague or root-level target).
|
|
|
181
181
|
MONODESIGN_CRITIQUE_META='{"target":"<user phrasing>","total_score":<n>,"p0_count":<n>,"p1_count":<n>}' \
|
|
182
182
|
node .claude/skills/monodesign/scripts/critique-storage.mjs write <slug> <body-file>
|
|
183
183
|
```
|
|
184
|
-
The helper prints the absolute path it wrote.
|
|
184
|
+
The helper prints the absolute path it wrote. As part of the write it also best-effort mirrors a compact record (score, P0/P1 counts, date, slug, path) into monomind's persistent memory under the `design-critique` namespace, so design health carries across sessions. This mirror is silent and never fails the critique: if the monomind CLI is unavailable it is skipped, and setting `MONODESIGN_NO_MEMORY=1` disables it entirely. Do not report mirror status unless the user asks.
|
|
185
185
|
|
|
186
186
|
3. **Delete the temp body file** after the write attempt completes, whether the write succeeded or failed. If deletion fails, mention `temp-file cleanup failed: <reason>` briefly in the final output, but do not block the critique.
|
|
187
187
|
|
|
@@ -681,10 +681,6 @@ const __monodesignLiveDev =
|
|
|
681
681
|
- **SvelteKit**: edit `svelte.config.js`, appending to `kit.csp.directives['script-src']` and `kit.csp.directives['connect-src']`.
|
|
682
682
|
- **Nuxt + nuxt-security**: edit `nuxt.config.*`, appending to `security.headers.contentSecurityPolicy['script-src']` and `['connect-src']`.
|
|
683
683
|
|
|
684
|
-
Reference outputs:
|
|
685
|
-
- `tests/framework-fixtures/nextjs-turborepo/expected-after-patch.ts` (Next.js)
|
|
686
|
-
- `tests/framework-fixtures/sveltekit-csp/expected-after-patch.js` (SvelteKit)
|
|
687
|
-
|
|
688
684
|
Idempotency: if `__monodesignLiveDev` already exists in the file, the patch is already applied; skip asking and just mark `cspChecked: true`.
|
|
689
685
|
|
|
690
686
|
#### append-string
|
|
@@ -707,10 +703,6 @@ Per-framework specifics:
|
|
|
707
703
|
- **Next.js inline `headers()`**: edit `next.config.*`, splicing the variable into the CSP value.
|
|
708
704
|
- **Nuxt `routeRules`**: edit `nuxt.config.*`, splicing into the CSP in `routeRules['/**'].headers['Content-Security-Policy']`.
|
|
709
705
|
|
|
710
|
-
Reference outputs:
|
|
711
|
-
- `tests/framework-fixtures/nextjs-inline-csp/expected-after-patch.js` (Next.js)
|
|
712
|
-
- `tests/framework-fixtures/nuxt-csp/expected-after-patch.ts` (Nuxt)
|
|
713
|
-
|
|
714
706
|
### Troubleshooting
|
|
715
707
|
|
|
716
708
|
If a user says "no" to the CSP patch at setup time and later complains that live doesn't work: their dev CSP blocks `http://localhost:8400`. Fix: delete `cspChecked` from `.monodesign/live/config.json` and re-run `live.mjs`: setup will ask again.
|
|
@@ -38,9 +38,9 @@ Understand the current state and goals before touching anything:
|
|
|
38
38
|
4. **Pull in any prior critique** (optional signal): If `/monodesign critique` has been run on the same target, its priority issues are a useful prior for what to address first. Resolve the target to a file path or URL, then:
|
|
39
39
|
```bash
|
|
40
40
|
slug=$(node .claude/skills/monodesign/scripts/critique-storage.mjs slug "<resolved>")
|
|
41
|
-
node .claude/skills/monodesign/scripts/critique-storage.mjs
|
|
41
|
+
node .claude/skills/monodesign/scripts/critique-storage.mjs recall "$slug"
|
|
42
42
|
```
|
|
43
|
-
Exit 0 with
|
|
43
|
+
Exit 0 prints a compact markdown block: latest score, score trend with direction, the open P0/P1 item titles, and the snapshot path. Fold the P0/P1 items into your polish list and mention the snapshot path so the user sees what you read. If you need the full snapshot body behind an item, read the printed snapshot path directly (or run the `latest` subcommand). Exit 2 = no snapshot, continue without it. The critique is one input among many. Do your own pass either way.
|
|
44
44
|
|
|
45
45
|
5. **Triage cosmetic vs functional**: Classify each issue as **cosmetic** (looks off, doesn't impede the user) or **functional** (breaks, blocks, or confuses the experience). When polish time is tight, functional issues ship first; cosmetic ones can land in a follow-up. Quality should be consistent; never perfect one corner while leaving another rough.
|
|
46
46
|
|