safeword 0.2.4 → 0.2.6
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/check-3NGQ4NR5.js +129 -0
- package/dist/check-3NGQ4NR5.js.map +1 -0
- package/dist/chunk-2XWIUEQK.js +190 -0
- package/dist/chunk-2XWIUEQK.js.map +1 -0
- package/dist/chunk-GZRQL3SX.js +146 -0
- package/dist/chunk-GZRQL3SX.js.map +1 -0
- package/dist/chunk-ORQHKDT2.js +10 -0
- package/dist/chunk-ORQHKDT2.js.map +1 -0
- package/dist/chunk-W66Z3C5H.js +21 -0
- package/dist/chunk-W66Z3C5H.js.map +1 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +34 -0
- package/dist/cli.js.map +1 -0
- package/dist/diff-Y6QTAW4O.js +166 -0
- package/dist/diff-Y6QTAW4O.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/reset-3ACTIYYE.js +143 -0
- package/dist/reset-3ACTIYYE.js.map +1 -0
- package/dist/setup-AIL5RL45.js +276 -0
- package/dist/setup-AIL5RL45.js.map +1 -0
- package/dist/upgrade-6AR3DHUV.js +134 -0
- package/dist/upgrade-6AR3DHUV.js.map +1 -0
- package/package.json +44 -19
- package/{.safeword → templates}/hooks/agents-md-check.sh +0 -0
- package/{.safeword → templates}/hooks/post-tool.sh +0 -0
- package/{.safeword → templates}/hooks/pre-commit.sh +0 -0
- package/.claude/commands/arch-review.md +0 -32
- package/.claude/commands/lint.md +0 -6
- package/.claude/commands/quality-review.md +0 -13
- package/.claude/commands/setup-linting.md +0 -6
- package/.claude/hooks/auto-lint.sh +0 -6
- package/.claude/hooks/auto-quality-review.sh +0 -170
- package/.claude/hooks/check-linting-sync.sh +0 -17
- package/.claude/hooks/inject-timestamp.sh +0 -6
- package/.claude/hooks/question-protocol.sh +0 -12
- package/.claude/hooks/run-linters.sh +0 -8
- package/.claude/hooks/run-quality-review.sh +0 -76
- package/.claude/hooks/version-check.sh +0 -10
- package/.claude/mcp/README.md +0 -96
- package/.claude/mcp/arcade.sample.json +0 -9
- package/.claude/mcp/context7.sample.json +0 -7
- package/.claude/mcp/playwright.sample.json +0 -7
- package/.claude/settings.json +0 -62
- package/.claude/skills/quality-reviewer/SKILL.md +0 -190
- package/.claude/skills/safeword-quality-reviewer/SKILL.md +0 -13
- package/.env.arcade.example +0 -4
- package/.env.example +0 -11
- package/.gitmodules +0 -4
- package/.safeword/SAFEWORD.md +0 -33
- package/.safeword/eslint/eslint-base.mjs +0 -101
- package/.safeword/guides/architecture-guide.md +0 -404
- package/.safeword/guides/code-philosophy.md +0 -174
- package/.safeword/guides/context-files-guide.md +0 -405
- package/.safeword/guides/data-architecture-guide.md +0 -183
- package/.safeword/guides/design-doc-guide.md +0 -165
- package/.safeword/guides/learning-extraction.md +0 -515
- package/.safeword/guides/llm-instruction-design.md +0 -239
- package/.safeword/guides/llm-prompting.md +0 -95
- package/.safeword/guides/tdd-best-practices.md +0 -570
- package/.safeword/guides/test-definitions-guide.md +0 -243
- package/.safeword/guides/testing-methodology.md +0 -573
- package/.safeword/guides/user-story-guide.md +0 -237
- package/.safeword/guides/zombie-process-cleanup.md +0 -214
- package/.safeword/planning/002-user-story-quality-evaluation.md +0 -1840
- package/.safeword/planning/003-langsmith-eval-setup-prompt.md +0 -363
- package/.safeword/planning/004-llm-eval-test-cases.md +0 -3226
- package/.safeword/planning/005-architecture-enforcement-system.md +0 -169
- package/.safeword/planning/006-reactive-fix-prevention-research.md +0 -135
- package/.safeword/planning/011-cli-ux-vision.md +0 -330
- package/.safeword/planning/012-project-structure-cleanup.md +0 -154
- package/.safeword/planning/README.md +0 -39
- package/.safeword/planning/automation-plan-v2.md +0 -1225
- package/.safeword/planning/automation-plan-v3.md +0 -1291
- package/.safeword/planning/automation-plan.md +0 -3058
- package/.safeword/planning/design/005-cli-implementation.md +0 -343
- package/.safeword/planning/design/013-cli-self-contained-templates.md +0 -596
- package/.safeword/planning/design/013a-eslint-plugin-suite.md +0 -256
- package/.safeword/planning/design/013b-implementation-snippets.md +0 -385
- package/.safeword/planning/design/013c-config-isolation-strategy.md +0 -242
- package/.safeword/planning/design/code-philosophy-improvements.md +0 -60
- package/.safeword/planning/mcp-analysis.md +0 -545
- package/.safeword/planning/phase2-subagents-vs-skills-analysis.md +0 -451
- package/.safeword/planning/settings-improvements.md +0 -970
- package/.safeword/planning/test-definitions/005-cli-implementation.md +0 -1301
- package/.safeword/planning/test-definitions/cli-self-contained-templates.md +0 -205
- package/.safeword/planning/user-stories/001-guides-review-user-stories.md +0 -1381
- package/.safeword/planning/user-stories/003-reactive-fix-prevention.md +0 -132
- package/.safeword/planning/user-stories/004-technical-constraints.md +0 -86
- package/.safeword/planning/user-stories/005-cli-implementation.md +0 -311
- package/.safeword/planning/user-stories/cli-self-contained-templates.md +0 -172
- package/.safeword/planning/versioned-distribution.md +0 -740
- package/.safeword/prompts/arch-review.md +0 -43
- package/.safeword/prompts/quality-review.md +0 -11
- package/.safeword/scripts/arch-review.sh +0 -235
- package/.safeword/scripts/check-linting-sync.sh +0 -58
- package/.safeword/scripts/setup-linting.sh +0 -559
- package/.safeword/templates/architecture-template.md +0 -136
- package/.safeword/templates/ci/architecture-check.yml +0 -79
- package/.safeword/templates/design-doc-template.md +0 -127
- package/.safeword/templates/test-definitions-feature.md +0 -100
- package/.safeword/templates/ticket-template.md +0 -74
- package/.safeword/templates/user-stories-template.md +0 -82
- package/.safeword/tickets/001-guides-review-user-stories.md +0 -83
- package/.safeword/tickets/002-architecture-enforcement.md +0 -211
- package/.safeword/tickets/003-reactive-fix-prevention.md +0 -57
- package/.safeword/tickets/004-technical-constraints-in-user-stories.md +0 -39
- package/.safeword/tickets/005-cli-implementation.md +0 -248
- package/.safeword/tickets/006-flesh-out-skills.md +0 -43
- package/.safeword/tickets/007-flesh-out-questioning.md +0 -44
- package/.safeword/tickets/008-upgrade-questioning.md +0 -58
- package/.safeword/tickets/009-naming-conventions.md +0 -41
- package/.safeword/tickets/010-safeword-md-cleanup.md +0 -34
- package/.safeword/tickets/011-cursor-setup.md +0 -86
- package/.safeword/tickets/README.md +0 -73
- package/.safeword/version +0 -1
- package/AGENTS.md +0 -59
- package/CLAUDE.md +0 -12
- package/README.md +0 -347
- package/docs/001-cli-implementation-plan.md +0 -856
- package/docs/elite-dx-implementation-plan.md +0 -1034
- package/framework/README.md +0 -131
- package/framework/mcp/README.md +0 -96
- package/framework/mcp/arcade.sample.json +0 -8
- package/framework/mcp/context7.sample.json +0 -6
- package/framework/mcp/playwright.sample.json +0 -6
- package/framework/scripts/arch-review.sh +0 -235
- package/framework/scripts/check-linting-sync.sh +0 -58
- package/framework/scripts/load-env.sh +0 -49
- package/framework/scripts/setup-claude.sh +0 -223
- package/framework/scripts/setup-linting.sh +0 -559
- package/framework/scripts/setup-quality.sh +0 -477
- package/framework/scripts/setup-safeword.sh +0 -550
- package/framework/templates/ci/architecture-check.yml +0 -78
- package/learnings/ai-sdk-v5-breaking-changes.md +0 -178
- package/learnings/e2e-test-zombie-processes.md +0 -231
- package/learnings/milkdown-crepe-editor-property.md +0 -96
- package/learnings/prosemirror-fragment-traversal.md +0 -119
- package/packages/cli/AGENTS.md +0 -1
- package/packages/cli/ARCHITECTURE.md +0 -279
- package/packages/cli/package.json +0 -51
- package/packages/cli/src/cli.ts +0 -63
- package/packages/cli/src/commands/check.ts +0 -166
- package/packages/cli/src/commands/diff.ts +0 -209
- package/packages/cli/src/commands/reset.ts +0 -190
- package/packages/cli/src/commands/setup.ts +0 -325
- package/packages/cli/src/commands/upgrade.ts +0 -163
- package/packages/cli/src/index.ts +0 -3
- package/packages/cli/src/templates/config.ts +0 -58
- package/packages/cli/src/templates/content.ts +0 -18
- package/packages/cli/src/templates/index.ts +0 -12
- package/packages/cli/src/utils/agents-md.ts +0 -66
- package/packages/cli/src/utils/fs.ts +0 -179
- package/packages/cli/src/utils/git.ts +0 -124
- package/packages/cli/src/utils/hooks.ts +0 -29
- package/packages/cli/src/utils/output.ts +0 -60
- package/packages/cli/src/utils/project-detector.test.ts +0 -185
- package/packages/cli/src/utils/project-detector.ts +0 -44
- package/packages/cli/src/utils/version.ts +0 -28
- package/packages/cli/src/version.ts +0 -6
- package/packages/cli/templates/SAFEWORD.md +0 -776
- package/packages/cli/templates/doc-templates/architecture-template.md +0 -136
- package/packages/cli/templates/doc-templates/design-doc-template.md +0 -134
- package/packages/cli/templates/doc-templates/test-definitions-feature.md +0 -131
- package/packages/cli/templates/doc-templates/ticket-template.md +0 -82
- package/packages/cli/templates/doc-templates/user-stories-template.md +0 -92
- package/packages/cli/templates/guides/architecture-guide.md +0 -423
- package/packages/cli/templates/guides/code-philosophy.md +0 -195
- package/packages/cli/templates/guides/context-files-guide.md +0 -457
- package/packages/cli/templates/guides/data-architecture-guide.md +0 -200
- package/packages/cli/templates/guides/design-doc-guide.md +0 -171
- package/packages/cli/templates/guides/learning-extraction.md +0 -552
- package/packages/cli/templates/guides/llm-instruction-design.md +0 -248
- package/packages/cli/templates/guides/llm-prompting.md +0 -102
- package/packages/cli/templates/guides/tdd-best-practices.md +0 -615
- package/packages/cli/templates/guides/test-definitions-guide.md +0 -334
- package/packages/cli/templates/guides/testing-methodology.md +0 -618
- package/packages/cli/templates/guides/user-story-guide.md +0 -256
- package/packages/cli/templates/guides/zombie-process-cleanup.md +0 -219
- package/packages/cli/templates/hooks/agents-md-check.sh +0 -27
- package/packages/cli/templates/hooks/post-tool.sh +0 -4
- package/packages/cli/templates/hooks/pre-commit.sh +0 -10
- package/packages/cli/templates/prompts/arch-review.md +0 -43
- package/packages/cli/templates/prompts/quality-review.md +0 -10
- package/packages/cli/templates/skills/safeword-quality-reviewer/SKILL.md +0 -207
- package/packages/cli/tests/commands/check.test.ts +0 -129
- package/packages/cli/tests/commands/cli.test.ts +0 -89
- package/packages/cli/tests/commands/diff.test.ts +0 -115
- package/packages/cli/tests/commands/reset.test.ts +0 -310
- package/packages/cli/tests/commands/self-healing.test.ts +0 -170
- package/packages/cli/tests/commands/setup-blocking.test.ts +0 -71
- package/packages/cli/tests/commands/setup-core.test.ts +0 -135
- package/packages/cli/tests/commands/setup-git.test.ts +0 -139
- package/packages/cli/tests/commands/setup-hooks.test.ts +0 -334
- package/packages/cli/tests/commands/setup-linting.test.ts +0 -189
- package/packages/cli/tests/commands/setup-noninteractive.test.ts +0 -80
- package/packages/cli/tests/commands/setup-templates.test.ts +0 -181
- package/packages/cli/tests/commands/upgrade.test.ts +0 -215
- package/packages/cli/tests/helpers.ts +0 -243
- package/packages/cli/tests/npm-package.test.ts +0 -83
- package/packages/cli/tests/technical-constraints.test.ts +0 -96
- package/packages/cli/tsconfig.json +0 -25
- package/packages/cli/tsup.config.ts +0 -11
- package/packages/cli/vitest.config.ts +0 -23
- package/promptfoo.yaml +0 -3270
- /package/{framework → templates}/SAFEWORD.md +0 -0
- /package/{packages/cli/templates → templates}/commands/arch-review.md +0 -0
- /package/{packages/cli/templates → templates}/commands/lint.md +0 -0
- /package/{packages/cli/templates → templates}/commands/quality-review.md +0 -0
- /package/{framework/templates → templates/doc-templates}/architecture-template.md +0 -0
- /package/{framework/templates → templates/doc-templates}/design-doc-template.md +0 -0
- /package/{framework/templates → templates/doc-templates}/test-definitions-feature.md +0 -0
- /package/{framework/templates → templates/doc-templates}/ticket-template.md +0 -0
- /package/{framework/templates → templates/doc-templates}/user-stories-template.md +0 -0
- /package/{framework → templates}/guides/architecture-guide.md +0 -0
- /package/{framework → templates}/guides/code-philosophy.md +0 -0
- /package/{framework → templates}/guides/context-files-guide.md +0 -0
- /package/{framework → templates}/guides/data-architecture-guide.md +0 -0
- /package/{framework → templates}/guides/design-doc-guide.md +0 -0
- /package/{framework → templates}/guides/learning-extraction.md +0 -0
- /package/{framework → templates}/guides/llm-instruction-design.md +0 -0
- /package/{framework → templates}/guides/llm-prompting.md +0 -0
- /package/{framework → templates}/guides/tdd-best-practices.md +0 -0
- /package/{framework → templates}/guides/test-definitions-guide.md +0 -0
- /package/{framework → templates}/guides/testing-methodology.md +0 -0
- /package/{framework → templates}/guides/user-story-guide.md +0 -0
- /package/{framework → templates}/guides/zombie-process-cleanup.md +0 -0
- /package/{packages/cli/templates → templates}/hooks/inject-timestamp.sh +0 -0
- /package/{packages/cli/templates → templates}/lib/common.sh +0 -0
- /package/{packages/cli/templates → templates}/lib/jq-fallback.sh +0 -0
- /package/{packages/cli/templates → templates}/markdownlint.jsonc +0 -0
- /package/{framework → templates}/prompts/arch-review.md +0 -0
- /package/{framework → templates}/prompts/quality-review.md +0 -0
- /package/{framework/skills/quality-reviewer → templates/skills/safeword-quality-reviewer}/SKILL.md +0 -0
package/framework/README.md
DELETED
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
# SAFEWORD Framework Setup Guide
|
|
2
|
-
|
|
3
|
-
A single place to install and understand the SAFEWORD framework in your project.
|
|
4
|
-
|
|
5
|
-
## What you get
|
|
6
|
-
|
|
7
|
-
- `.safeword/SAFEWORD.md` and guides for workflows, TDD, and best practices
|
|
8
|
-
- `.safeword/templates/` for user stories, test definitions, and design docs
|
|
9
|
-
- `.safeword/planning/` and `.safeword/tickets/` structure
|
|
10
|
-
- `.claude/` hooks and settings for:
|
|
11
|
-
- Auto-linting (PostToolUse)
|
|
12
|
-
- Quality review (Stop hook)
|
|
13
|
-
- Session start version message
|
|
14
|
-
|
|
15
|
-
All scripts are idempotent and safe to re-run.
|
|
16
|
-
|
|
17
|
-
## Requirements
|
|
18
|
-
|
|
19
|
-
- bash
|
|
20
|
-
- jq (required for hook settings merging)
|
|
21
|
-
- macOS: `brew install jq`
|
|
22
|
-
- Ubuntu/Debian: `sudo apt-get install jq`
|
|
23
|
-
- Node.js + npm (only for auto-linting setup)
|
|
24
|
-
|
|
25
|
-
## Recommended setup (2 commands)
|
|
26
|
-
|
|
27
|
-
```bash
|
|
28
|
-
cd /path/to/your/project
|
|
29
|
-
|
|
30
|
-
# 1) Install SAFEWORD structure and docs (planning, guides, templates)
|
|
31
|
-
bash ./framework/scripts/setup-safeword.sh
|
|
32
|
-
|
|
33
|
-
# 2) Install hooks (auto-linting + quality review)
|
|
34
|
-
bash ./framework/scripts/setup-claude.sh
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
Options for step 2:
|
|
38
|
-
|
|
39
|
-
- Skip linting (quality review only): `bash ./framework/scripts/setup-claude.sh --skip-linting`
|
|
40
|
-
- Skip quality review: `bash ./framework/scripts/setup-claude.sh --skip-quality`
|
|
41
|
-
|
|
42
|
-
## What each script does
|
|
43
|
-
|
|
44
|
-
### setup-safeword.sh (Project structure + docs)
|
|
45
|
-
|
|
46
|
-
- Copies `framework/SAFEWORD.md` to `.safeword/SAFEWORD.md`
|
|
47
|
-
- Copies `framework/guides/` and `framework/templates/` into `.safeword/`
|
|
48
|
-
- Creates `.safeword/planning/` and `.safeword/tickets/` (with archives)
|
|
49
|
-
- Creates or updates `AGENTS.md` with an always-read trigger for `@./.safeword/SAFEWORD.md`
|
|
50
|
-
- Ensures `.gitignore` includes `.safeword` planning folders and Claude local files
|
|
51
|
-
- Creates `.claude/settings.json` if missing
|
|
52
|
-
|
|
53
|
-
Note: Hook binaries are created by the scripts below. Running `setup-claude.sh` installs them.
|
|
54
|
-
|
|
55
|
-
### setup-claude.sh (Hooks orchestrator)
|
|
56
|
-
|
|
57
|
-
- Auto-detects project type (react, astro, electron, typescript, minimal) unless `--linting-mode` is provided
|
|
58
|
-
- Runs linting setup unless `--skip-linting`
|
|
59
|
-
- Runs quality review setup unless `--skip-quality`
|
|
60
|
-
- Seeds `.claude/skills/` and `.claude/mcp/` from `framework/skills` and `framework/mcp` if present
|
|
61
|
-
- Adds a sample Arcade MCP config and environment example if missing
|
|
62
|
-
- Ensures `CLAUDE.md` references `.safeword/SAFEWORD.md`
|
|
63
|
-
|
|
64
|
-
### setup-linting.sh (Auto-linting)
|
|
65
|
-
|
|
66
|
-
- **Auto-detects** project type from package.json and tsconfig.json
|
|
67
|
-
- **Two-file architecture** for safe updates:
|
|
68
|
-
- `.safeword/eslint/eslint-base.mjs` - Auto-generated every run
|
|
69
|
-
- `eslint.config.mjs` - User-owned, never overwritten (customize freely)
|
|
70
|
-
- All projects include:
|
|
71
|
-
- `eslint-plugin-boundaries` (architectural boundary enforcement)
|
|
72
|
-
- `eslint-plugin-sonarjs` (code smell detection)
|
|
73
|
-
- `@microsoft/eslint-plugin-sdl` (security rules)
|
|
74
|
-
- Creates:
|
|
75
|
-
- `.claude/hooks/run-linters.sh` (shared logic)
|
|
76
|
-
- `.claude/hooks/auto-lint.sh` (PostToolUse wrapper)
|
|
77
|
-
- `.claude/commands/lint.md`
|
|
78
|
-
- `.prettierrc` and `.prettierignore`
|
|
79
|
-
|
|
80
|
-
The base config is regenerated every run, so after adding/removing frameworks:
|
|
81
|
-
|
|
82
|
-
```bash
|
|
83
|
-
bash setup-linting.sh # Re-detects and updates
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
Options: `--no-typescript`, `--no-react`, `--no-astro` - Override auto-detection
|
|
87
|
-
|
|
88
|
-
### setup-quality.sh (Quality review)
|
|
89
|
-
|
|
90
|
-
- Creates:
|
|
91
|
-
- `.claude/hooks/auto-quality-review.sh` (Stop hook that inspects transcript)
|
|
92
|
-
- `.claude/hooks/run-quality-review.sh` (prompt)
|
|
93
|
-
- `.claude/commands/quality-review.md`
|
|
94
|
-
- `.claude/settings.json` merged with Stop + SessionStart hooks
|
|
95
|
-
|
|
96
|
-
Behavior:
|
|
97
|
-
|
|
98
|
-
- Triggers only when changes are proposed/made (JSON blob present)
|
|
99
|
-
- Skips when the assistant asked a question (waits for your answer)
|
|
100
|
-
- Works in monorepos by searching upward for `SAFEWORD.md` or `CLAUDE.md`
|
|
101
|
-
- Configurable via `.auto-quality-review.config`
|
|
102
|
-
|
|
103
|
-
## Outputs checklist
|
|
104
|
-
|
|
105
|
-
After recommended setup:
|
|
106
|
-
|
|
107
|
-
- `.safeword/SAFEWORD.md` and `.safeword/guides/`
|
|
108
|
-
- `.claude/hooks/auto-lint.sh`, `run-linters.sh`, `auto-quality-review.sh`, `run-quality-review.sh`, `version-check.sh`
|
|
109
|
-
- `.claude/commands/lint.md`, `quality-review.md`
|
|
110
|
-
- `.claude/settings.json` with:
|
|
111
|
-
- `PostToolUse` → `auto-lint.sh`
|
|
112
|
-
- `Stop` → `auto-quality-review.sh`
|
|
113
|
-
- `SessionStart` → `version-check.sh`
|
|
114
|
-
|
|
115
|
-
## Updating
|
|
116
|
-
|
|
117
|
-
Re-run the same scripts. Generated files include version headers like:
|
|
118
|
-
|
|
119
|
-
```bash
|
|
120
|
-
# Generated by setup-linting.sh v1.0.0
|
|
121
|
-
# To upgrade: Re-run this script in this project
|
|
122
|
-
```
|
|
123
|
-
|
|
124
|
-
## Troubleshooting
|
|
125
|
-
|
|
126
|
-
- jq missing: Install jq (see Requirements). Scripts will error clearly when required.
|
|
127
|
-
- Node missing: Install Node.js + npm to use auto-linting.
|
|
128
|
-
- Hooks not triggering:
|
|
129
|
-
- Check `.claude/settings.json`
|
|
130
|
-
- Ensure `SAFEWORD.md` or `CLAUDE.md` exists in project or parent
|
|
131
|
-
- See `.safeword/SAFEWORD.md` (methodology) and this guide (setup/troubleshooting)
|
package/framework/mcp/README.md
DELETED
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
# MCP Server Configurations
|
|
2
|
-
|
|
3
|
-
Sample configurations for Model Context Protocol (MCP) servers.
|
|
4
|
-
|
|
5
|
-
## Available Servers
|
|
6
|
-
|
|
7
|
-
| Server | Package | API Key | Purpose |
|
|
8
|
-
| -------------- | ----------------------- | --------------- | ------------------------------ |
|
|
9
|
-
| **Context7** | `@upstash/context7-mcp` | Required (free) | Library docs lookups |
|
|
10
|
-
| **Playwright** | `@playwright/mcp` | None | Browser automation (Microsoft) |
|
|
11
|
-
| **Arcade** | Arcade MCP Gateway | Required | Tool gateway |
|
|
12
|
-
|
|
13
|
-
## API Keys
|
|
14
|
-
|
|
15
|
-
| Server | Get Key |
|
|
16
|
-
| -------- | -------------------------------------------------------------------- |
|
|
17
|
-
| Context7 | [context7.com/dashboard](https://context7.com/dashboard) (free tier) |
|
|
18
|
-
| Arcade | [arcade.dev](https://arcade.dev) |
|
|
19
|
-
|
|
20
|
-
## Setup
|
|
21
|
-
|
|
22
|
-
### 1. Set Environment Variables
|
|
23
|
-
|
|
24
|
-
Add to `~/.zshrc` (or `~/.bashrc`):
|
|
25
|
-
|
|
26
|
-
```bash
|
|
27
|
-
export CONTEXT7_API_KEY="your-key-here"
|
|
28
|
-
export ARCADE_API_KEY="your-key-here"
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
Then reload: `source ~/.zshrc`
|
|
32
|
-
|
|
33
|
-
### 2. Add MCP Config
|
|
34
|
-
|
|
35
|
-
**Claude Desktop** — Add to `~/.claude/claude_desktop_config.json`:
|
|
36
|
-
|
|
37
|
-
```json
|
|
38
|
-
{
|
|
39
|
-
"mcpServers": {
|
|
40
|
-
"context7": {
|
|
41
|
-
"command": "npx",
|
|
42
|
-
"args": ["-y", "@upstash/context7-mcp@latest"]
|
|
43
|
-
},
|
|
44
|
-
"playwright": {
|
|
45
|
-
"command": "npx",
|
|
46
|
-
"args": ["@playwright/mcp@latest"]
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
**Cursor** — Add to `.cursor/mcp.json`:
|
|
53
|
-
|
|
54
|
-
```json
|
|
55
|
-
{
|
|
56
|
-
"mcpServers": {
|
|
57
|
-
"context7": {
|
|
58
|
-
"command": "npx",
|
|
59
|
-
"args": ["-y", "@upstash/context7-mcp@latest"]
|
|
60
|
-
},
|
|
61
|
-
"playwright": {
|
|
62
|
-
"command": "npx",
|
|
63
|
-
"args": ["@playwright/mcp@latest"]
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
MCP servers inherit environment variables from your shell automatically.
|
|
70
|
-
|
|
71
|
-
## Playwright Options
|
|
72
|
-
|
|
73
|
-
| Arg | Description |
|
|
74
|
-
| ------------------------------------- | ----------------------- |
|
|
75
|
-
| `--browser chromium\|firefox\|webkit` | Browser type |
|
|
76
|
-
| `--headless` | Run headless |
|
|
77
|
-
| `--user-data-dir <path>` | Persist browser profile |
|
|
78
|
-
|
|
79
|
-
Example:
|
|
80
|
-
|
|
81
|
-
```json
|
|
82
|
-
{
|
|
83
|
-
"command": "npx",
|
|
84
|
-
"args": ["@playwright/mcp@latest", "--browser", "chromium", "--headless"]
|
|
85
|
-
}
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
## Context7 Usage
|
|
89
|
-
|
|
90
|
-
Once configured, use in prompts:
|
|
91
|
-
|
|
92
|
-
```
|
|
93
|
-
use context7 to look up the latest React 19 useOptimistic hook documentation
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
Context7 fetches current docs directly from source repositories.
|
|
@@ -1,235 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
################################################################################
|
|
3
|
-
# Architecture Review Script
|
|
4
|
-
#
|
|
5
|
-
# Sends changed files to Claude Haiku API for semantic architecture review.
|
|
6
|
-
# Returns JSON verdict: clean | minor | refactor_needed
|
|
7
|
-
#
|
|
8
|
-
# Usage:
|
|
9
|
-
# arch-review.sh file1.ts file2.ts # Review specific files
|
|
10
|
-
# arch-review.sh --staged # Review git staged files
|
|
11
|
-
#
|
|
12
|
-
# Environment variables:
|
|
13
|
-
# ANTHROPIC_API_KEY - Required. Your Anthropic API key.
|
|
14
|
-
# ARCH_REVIEW_MODEL - Optional. Model to use (default: claude-3-haiku-20240307)
|
|
15
|
-
#
|
|
16
|
-
# Exit codes:
|
|
17
|
-
# 0 - Clean or minor issues (commit allowed)
|
|
18
|
-
# 1 - Refactor needed (commit blocked)
|
|
19
|
-
# 2 - Error (missing API key, network issue, etc.)
|
|
20
|
-
################################################################################
|
|
21
|
-
|
|
22
|
-
set -e
|
|
23
|
-
|
|
24
|
-
VERSION="v1.0.0"
|
|
25
|
-
|
|
26
|
-
# Configuration
|
|
27
|
-
MODEL="${ARCH_REVIEW_MODEL:-claude-3-haiku-20240307}"
|
|
28
|
-
MAX_TOKENS=1024
|
|
29
|
-
|
|
30
|
-
# Colors for output
|
|
31
|
-
RED='\033[0;31m'
|
|
32
|
-
YELLOW='\033[1;33m'
|
|
33
|
-
GREEN='\033[0;32m'
|
|
34
|
-
NC='\033[0m' # No Color
|
|
35
|
-
|
|
36
|
-
# Check for required tools
|
|
37
|
-
if ! command -v curl &> /dev/null; then
|
|
38
|
-
echo "ERROR: curl is required but not installed." >&2
|
|
39
|
-
exit 2
|
|
40
|
-
fi
|
|
41
|
-
|
|
42
|
-
if ! command -v jq &> /dev/null; then
|
|
43
|
-
echo "ERROR: jq is required but not installed." >&2
|
|
44
|
-
exit 2
|
|
45
|
-
fi
|
|
46
|
-
|
|
47
|
-
# Check for API key
|
|
48
|
-
if [ -z "$ANTHROPIC_API_KEY" ]; then
|
|
49
|
-
echo "ERROR: ANTHROPIC_API_KEY environment variable is not set." >&2
|
|
50
|
-
echo "Set it with: export ANTHROPIC_API_KEY='your-api-key'" >&2
|
|
51
|
-
exit 2
|
|
52
|
-
fi
|
|
53
|
-
|
|
54
|
-
# Parse arguments
|
|
55
|
-
FILES=()
|
|
56
|
-
STAGED_MODE=false
|
|
57
|
-
|
|
58
|
-
for arg in "$@"; do
|
|
59
|
-
case "$arg" in
|
|
60
|
-
--staged)
|
|
61
|
-
STAGED_MODE=true
|
|
62
|
-
;;
|
|
63
|
-
--help|-h)
|
|
64
|
-
echo "Architecture Review Script $VERSION"
|
|
65
|
-
echo ""
|
|
66
|
-
echo "Usage:"
|
|
67
|
-
echo " arch-review.sh file1.ts file2.ts # Review specific files"
|
|
68
|
-
echo " arch-review.sh --staged # Review git staged files"
|
|
69
|
-
echo ""
|
|
70
|
-
echo "Environment variables:"
|
|
71
|
-
echo " ANTHROPIC_API_KEY - Required. Your Anthropic API key."
|
|
72
|
-
echo " ARCH_REVIEW_MODEL - Optional. Model (default: claude-3-haiku-20240307)"
|
|
73
|
-
exit 0
|
|
74
|
-
;;
|
|
75
|
-
*)
|
|
76
|
-
FILES+=("$arg")
|
|
77
|
-
;;
|
|
78
|
-
esac
|
|
79
|
-
done
|
|
80
|
-
|
|
81
|
-
# Get staged files if --staged mode
|
|
82
|
-
if [ "$STAGED_MODE" = true ]; then
|
|
83
|
-
# Get staged files (only .js, .ts, .tsx, .jsx)
|
|
84
|
-
while IFS= read -r file; do
|
|
85
|
-
if [[ "$file" =~ \.(js|ts|tsx|jsx)$ ]]; then
|
|
86
|
-
FILES+=("$file")
|
|
87
|
-
fi
|
|
88
|
-
done < <(git diff --cached --name-only --diff-filter=ACM 2>/dev/null || true)
|
|
89
|
-
fi
|
|
90
|
-
|
|
91
|
-
# Check if we have files to review
|
|
92
|
-
if [ ${#FILES[@]} -eq 0 ]; then
|
|
93
|
-
echo "No files to review."
|
|
94
|
-
exit 0
|
|
95
|
-
fi
|
|
96
|
-
|
|
97
|
-
echo "Reviewing ${#FILES[@]} file(s) for architectural issues..."
|
|
98
|
-
|
|
99
|
-
# Find ARCHITECTURE.md (search upward from current directory)
|
|
100
|
-
ARCH_FILE=""
|
|
101
|
-
SEARCH_DIR="$PWD"
|
|
102
|
-
while [ "$SEARCH_DIR" != "/" ]; do
|
|
103
|
-
if [ -f "$SEARCH_DIR/ARCHITECTURE.md" ]; then
|
|
104
|
-
ARCH_FILE="$SEARCH_DIR/ARCHITECTURE.md"
|
|
105
|
-
break
|
|
106
|
-
fi
|
|
107
|
-
SEARCH_DIR=$(dirname "$SEARCH_DIR")
|
|
108
|
-
done
|
|
109
|
-
|
|
110
|
-
# Build context for the prompt
|
|
111
|
-
CONTEXT=""
|
|
112
|
-
|
|
113
|
-
# Add ARCHITECTURE.md if found
|
|
114
|
-
if [ -n "$ARCH_FILE" ]; then
|
|
115
|
-
ARCH_CONTENT=$(cat "$ARCH_FILE" | head -c 8000) # Limit to ~8KB
|
|
116
|
-
CONTEXT+="## ARCHITECTURE.md\n\n$ARCH_CONTENT\n\n"
|
|
117
|
-
fi
|
|
118
|
-
|
|
119
|
-
# Add file contents
|
|
120
|
-
CONTEXT+="## Changed Files\n\n"
|
|
121
|
-
for file in "${FILES[@]}"; do
|
|
122
|
-
if [ -f "$file" ]; then
|
|
123
|
-
FILE_CONTENT=$(cat "$file" | head -c 4000) # Limit each file to ~4KB
|
|
124
|
-
CONTEXT+="### $file\n\n\`\`\`\n$FILE_CONTENT\n\`\`\`\n\n"
|
|
125
|
-
fi
|
|
126
|
-
done
|
|
127
|
-
|
|
128
|
-
# Read the arch-review prompt
|
|
129
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
130
|
-
PROMPT_FILE="$SCRIPT_DIR/../prompts/arch-review.md"
|
|
131
|
-
|
|
132
|
-
# Fall back to .safeword location if framework location doesn't exist
|
|
133
|
-
if [ ! -f "$PROMPT_FILE" ]; then
|
|
134
|
-
# Try .safeword/prompts/ location (when installed in project)
|
|
135
|
-
PROJECT_ROOT="$PWD"
|
|
136
|
-
while [ "$PROJECT_ROOT" != "/" ]; do
|
|
137
|
-
if [ -f "$PROJECT_ROOT/.safeword/prompts/arch-review.md" ]; then
|
|
138
|
-
PROMPT_FILE="$PROJECT_ROOT/.safeword/prompts/arch-review.md"
|
|
139
|
-
break
|
|
140
|
-
fi
|
|
141
|
-
PROJECT_ROOT=$(dirname "$PROJECT_ROOT")
|
|
142
|
-
done
|
|
143
|
-
fi
|
|
144
|
-
|
|
145
|
-
if [ ! -f "$PROMPT_FILE" ]; then
|
|
146
|
-
echo "ERROR: arch-review.md prompt not found." >&2
|
|
147
|
-
exit 2
|
|
148
|
-
fi
|
|
149
|
-
|
|
150
|
-
PROMPT=$(cat "$PROMPT_FILE")
|
|
151
|
-
|
|
152
|
-
# Combine prompt with context
|
|
153
|
-
FULL_PROMPT="$PROMPT\n\n---\n\n$CONTEXT"
|
|
154
|
-
|
|
155
|
-
# Escape for JSON
|
|
156
|
-
FULL_PROMPT_ESCAPED=$(echo -e "$FULL_PROMPT" | jq -Rs .)
|
|
157
|
-
|
|
158
|
-
# Make API request
|
|
159
|
-
RESPONSE=$(curl -s -X POST "https://api.anthropic.com/v1/messages" \
|
|
160
|
-
-H "Content-Type: application/json" \
|
|
161
|
-
-H "x-api-key: $ANTHROPIC_API_KEY" \
|
|
162
|
-
-H "anthropic-version: 2023-06-01" \
|
|
163
|
-
-d "{
|
|
164
|
-
\"model\": \"$MODEL\",
|
|
165
|
-
\"max_tokens\": $MAX_TOKENS,
|
|
166
|
-
\"messages\": [
|
|
167
|
-
{
|
|
168
|
-
\"role\": \"user\",
|
|
169
|
-
\"content\": $FULL_PROMPT_ESCAPED
|
|
170
|
-
}
|
|
171
|
-
]
|
|
172
|
-
}" 2>&1)
|
|
173
|
-
|
|
174
|
-
# Check for API errors
|
|
175
|
-
if echo "$RESPONSE" | jq -e '.error' > /dev/null 2>&1; then
|
|
176
|
-
ERROR_MSG=$(echo "$RESPONSE" | jq -r '.error.message // "Unknown error"')
|
|
177
|
-
echo "ERROR: API request failed: $ERROR_MSG" >&2
|
|
178
|
-
exit 2
|
|
179
|
-
fi
|
|
180
|
-
|
|
181
|
-
# Extract the text response
|
|
182
|
-
TEXT_RESPONSE=$(echo "$RESPONSE" | jq -r '.content[0].text // empty')
|
|
183
|
-
|
|
184
|
-
if [ -z "$TEXT_RESPONSE" ]; then
|
|
185
|
-
echo "ERROR: Empty response from API" >&2
|
|
186
|
-
exit 2
|
|
187
|
-
fi
|
|
188
|
-
|
|
189
|
-
# Try to extract JSON from the response
|
|
190
|
-
JSON_RESULT=$(echo "$TEXT_RESPONSE" | grep -oP '\{[^{}]*"verdict"[^{}]*\}' | head -1 || true)
|
|
191
|
-
|
|
192
|
-
# If no simple JSON found, try to extract from code block
|
|
193
|
-
if [ -z "$JSON_RESULT" ]; then
|
|
194
|
-
JSON_RESULT=$(echo "$TEXT_RESPONSE" | sed -n '/```json/,/```/p' | grep -v '```' | tr -d '\n' || true)
|
|
195
|
-
fi
|
|
196
|
-
|
|
197
|
-
# Parse verdict
|
|
198
|
-
VERDICT="clean"
|
|
199
|
-
if [ -n "$JSON_RESULT" ]; then
|
|
200
|
-
VERDICT=$(echo "$JSON_RESULT" | jq -r '.verdict // "clean"' 2>/dev/null || echo "clean")
|
|
201
|
-
fi
|
|
202
|
-
|
|
203
|
-
# Output results
|
|
204
|
-
echo ""
|
|
205
|
-
echo "=== Architecture Review Results ==="
|
|
206
|
-
echo ""
|
|
207
|
-
|
|
208
|
-
# Show full response for debugging/context
|
|
209
|
-
echo "$TEXT_RESPONSE"
|
|
210
|
-
echo ""
|
|
211
|
-
|
|
212
|
-
# Show verdict with color
|
|
213
|
-
case "$VERDICT" in
|
|
214
|
-
clean)
|
|
215
|
-
echo -e "${GREEN}✓ Verdict: CLEAN${NC}"
|
|
216
|
-
echo "No architectural issues found."
|
|
217
|
-
exit 0
|
|
218
|
-
;;
|
|
219
|
-
minor)
|
|
220
|
-
echo -e "${YELLOW}⚠ Verdict: MINOR${NC}"
|
|
221
|
-
echo "Minor issues noted. Commit allowed."
|
|
222
|
-
exit 0
|
|
223
|
-
;;
|
|
224
|
-
refactor_needed)
|
|
225
|
-
echo -e "${RED}✗ Verdict: REFACTOR NEEDED${NC}"
|
|
226
|
-
echo "Significant architectural issues found. Please address before committing."
|
|
227
|
-
exit 1
|
|
228
|
-
;;
|
|
229
|
-
*)
|
|
230
|
-
echo -e "${YELLOW}? Verdict: UNKNOWN (${VERDICT})${NC}"
|
|
231
|
-
echo "Could not parse verdict. Allowing commit."
|
|
232
|
-
exit 0
|
|
233
|
-
;;
|
|
234
|
-
esac
|
|
235
|
-
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
################################################################################
|
|
3
|
-
# ESLint Config Sync Check (SessionStart hook)
|
|
4
|
-
#
|
|
5
|
-
# Checks if .safeword/eslint/eslint-base.mjs matches the frameworks in package.json.
|
|
6
|
-
# Alerts user if out of sync (e.g., React added but not in ESLint config).
|
|
7
|
-
#
|
|
8
|
-
# Usage: Called automatically at Claude Code session start
|
|
9
|
-
################################################################################
|
|
10
|
-
|
|
11
|
-
# Quick exit if no eslint config
|
|
12
|
-
[ ! -f ".safeword/eslint/eslint-base.mjs" ] && exit 0
|
|
13
|
-
[ ! -f "package.json" ] && exit 0
|
|
14
|
-
|
|
15
|
-
# Read dependencies
|
|
16
|
-
if command -v jq &> /dev/null; then
|
|
17
|
-
DEPS=$(jq -r '(.dependencies // {}), (.devDependencies // {}) | keys[]' package.json 2>/dev/null || echo "")
|
|
18
|
-
else
|
|
19
|
-
DEPS=$(grep -E '"[^"]+"\s*:' package.json | cut -d'"' -f2)
|
|
20
|
-
fi
|
|
21
|
-
|
|
22
|
-
# Detect what's installed
|
|
23
|
-
HAS_TS=false
|
|
24
|
-
HAS_REACT=false
|
|
25
|
-
HAS_ASTRO=false
|
|
26
|
-
|
|
27
|
-
{ [ -f "tsconfig.json" ] || echo "$DEPS" | grep -qx "typescript"; } && HAS_TS=true
|
|
28
|
-
echo "$DEPS" | grep -qx "react" && HAS_REACT=true
|
|
29
|
-
echo "$DEPS" | grep -qx "astro" && HAS_ASTRO=true
|
|
30
|
-
|
|
31
|
-
# Check what's in the config
|
|
32
|
-
CONFIG_HAS_TS=false
|
|
33
|
-
CONFIG_HAS_REACT=false
|
|
34
|
-
CONFIG_HAS_ASTRO=false
|
|
35
|
-
|
|
36
|
-
grep -q "typescript-eslint" .safeword/eslint/eslint-base.mjs 2>/dev/null && CONFIG_HAS_TS=true
|
|
37
|
-
grep -q "@eslint-react" .safeword/eslint/eslint-base.mjs 2>/dev/null && CONFIG_HAS_REACT=true
|
|
38
|
-
grep -q "eslint-plugin-astro" .safeword/eslint/eslint-base.mjs 2>/dev/null && CONFIG_HAS_ASTRO=true
|
|
39
|
-
|
|
40
|
-
# Build mismatch message
|
|
41
|
-
MISMATCHES=""
|
|
42
|
-
|
|
43
|
-
[ "$HAS_TS" = true ] && [ "$CONFIG_HAS_TS" = false ] && MISMATCHES+="TypeScript added. "
|
|
44
|
-
[ "$HAS_TS" = false ] && [ "$CONFIG_HAS_TS" = true ] && MISMATCHES+="TypeScript removed. "
|
|
45
|
-
[ "$HAS_REACT" = true ] && [ "$CONFIG_HAS_REACT" = false ] && MISMATCHES+="React added. "
|
|
46
|
-
[ "$HAS_REACT" = false ] && [ "$CONFIG_HAS_REACT" = true ] && MISMATCHES+="React removed. "
|
|
47
|
-
[ "$HAS_ASTRO" = true ] && [ "$CONFIG_HAS_ASTRO" = false ] && MISMATCHES+="Astro added. "
|
|
48
|
-
[ "$HAS_ASTRO" = false ] && [ "$CONFIG_HAS_ASTRO" = true ] && MISMATCHES+="Astro removed. "
|
|
49
|
-
|
|
50
|
-
# Alert if mismatched
|
|
51
|
-
if [ -n "$MISMATCHES" ]; then
|
|
52
|
-
echo "⚠️ ESLint config out of sync: $MISMATCHES"
|
|
53
|
-
echo " Run: bash .safeword/scripts/setup-linting.sh"
|
|
54
|
-
echo ""
|
|
55
|
-
fi
|
|
56
|
-
|
|
57
|
-
exit 0
|
|
58
|
-
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# Load environment variables from .env file
|
|
3
|
-
# Source this in other scripts: source "$(dirname "$0")/load-env.sh"
|
|
4
|
-
#
|
|
5
|
-
# Priority: Shell env > .env.local > .env
|
|
6
|
-
# Does NOT override existing shell variables
|
|
7
|
-
|
|
8
|
-
set -euo pipefail
|
|
9
|
-
|
|
10
|
-
# Find project root (look for .git or package.json)
|
|
11
|
-
find_project_root() {
|
|
12
|
-
local dir="$PWD"
|
|
13
|
-
while [[ "$dir" != "/" ]]; do
|
|
14
|
-
if [[ -f "$dir/package.json" ]] || [[ -d "$dir/.git" ]]; then
|
|
15
|
-
echo "$dir"
|
|
16
|
-
return 0
|
|
17
|
-
fi
|
|
18
|
-
dir="$(dirname "$dir")"
|
|
19
|
-
done
|
|
20
|
-
echo "$PWD"
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
PROJECT_ROOT="${PROJECT_ROOT:-$(find_project_root)}"
|
|
24
|
-
|
|
25
|
-
# Load .env file (does not override existing vars)
|
|
26
|
-
load_env_file() {
|
|
27
|
-
local env_file="$1"
|
|
28
|
-
if [[ -f "$env_file" ]]; then
|
|
29
|
-
while IFS='=' read -r key value; do
|
|
30
|
-
# Skip comments and empty lines
|
|
31
|
-
[[ "$key" =~ ^#.*$ ]] && continue
|
|
32
|
-
[[ -z "$key" ]] && continue
|
|
33
|
-
|
|
34
|
-
# Trim whitespace
|
|
35
|
-
key="${key// /}"
|
|
36
|
-
value="${value%"${value##*[![:space:]]}"}"
|
|
37
|
-
|
|
38
|
-
# Only set if not already in environment
|
|
39
|
-
if [[ -z "${!key:-}" ]]; then
|
|
40
|
-
export "$key=$value"
|
|
41
|
-
fi
|
|
42
|
-
done < "$env_file"
|
|
43
|
-
fi
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
# Load in priority order (first wins due to skip-if-exists logic)
|
|
47
|
-
load_env_file "$PROJECT_ROOT/.env.local"
|
|
48
|
-
load_env_file "$PROJECT_ROOT/.env"
|
|
49
|
-
|