safeword 0.2.3 → 0.2.4
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/.claude/commands/arch-review.md +32 -0
- package/.claude/commands/lint.md +6 -0
- package/.claude/commands/quality-review.md +13 -0
- package/.claude/commands/setup-linting.md +6 -0
- package/.claude/hooks/auto-lint.sh +6 -0
- package/.claude/hooks/auto-quality-review.sh +170 -0
- package/.claude/hooks/check-linting-sync.sh +17 -0
- package/.claude/hooks/inject-timestamp.sh +6 -0
- package/.claude/hooks/question-protocol.sh +12 -0
- package/.claude/hooks/run-linters.sh +8 -0
- package/.claude/hooks/run-quality-review.sh +76 -0
- package/.claude/hooks/version-check.sh +10 -0
- package/.claude/mcp/README.md +96 -0
- package/.claude/mcp/arcade.sample.json +9 -0
- package/.claude/mcp/context7.sample.json +7 -0
- package/.claude/mcp/playwright.sample.json +7 -0
- package/.claude/settings.json +62 -0
- package/.claude/skills/quality-reviewer/SKILL.md +190 -0
- package/.claude/skills/safeword-quality-reviewer/SKILL.md +13 -0
- package/.env.arcade.example +4 -0
- package/.env.example +11 -0
- package/.gitmodules +4 -0
- package/.safeword/SAFEWORD.md +33 -0
- package/.safeword/eslint/eslint-base.mjs +101 -0
- package/.safeword/guides/architecture-guide.md +404 -0
- package/.safeword/guides/code-philosophy.md +174 -0
- package/.safeword/guides/context-files-guide.md +405 -0
- package/.safeword/guides/data-architecture-guide.md +183 -0
- package/.safeword/guides/design-doc-guide.md +165 -0
- package/.safeword/guides/learning-extraction.md +515 -0
- package/.safeword/guides/llm-instruction-design.md +239 -0
- package/.safeword/guides/llm-prompting.md +95 -0
- package/.safeword/guides/tdd-best-practices.md +570 -0
- package/.safeword/guides/test-definitions-guide.md +243 -0
- package/.safeword/guides/testing-methodology.md +573 -0
- package/.safeword/guides/user-story-guide.md +237 -0
- package/.safeword/guides/zombie-process-cleanup.md +214 -0
- package/{templates → .safeword}/hooks/agents-md-check.sh +0 -0
- package/{templates → .safeword}/hooks/post-tool.sh +0 -0
- package/{templates → .safeword}/hooks/pre-commit.sh +0 -0
- package/.safeword/planning/002-user-story-quality-evaluation.md +1840 -0
- package/.safeword/planning/003-langsmith-eval-setup-prompt.md +363 -0
- package/.safeword/planning/004-llm-eval-test-cases.md +3226 -0
- package/.safeword/planning/005-architecture-enforcement-system.md +169 -0
- package/.safeword/planning/006-reactive-fix-prevention-research.md +135 -0
- package/.safeword/planning/011-cli-ux-vision.md +330 -0
- package/.safeword/planning/012-project-structure-cleanup.md +154 -0
- package/.safeword/planning/README.md +39 -0
- package/.safeword/planning/automation-plan-v2.md +1225 -0
- package/.safeword/planning/automation-plan-v3.md +1291 -0
- package/.safeword/planning/automation-plan.md +3058 -0
- package/.safeword/planning/design/005-cli-implementation.md +343 -0
- package/.safeword/planning/design/013-cli-self-contained-templates.md +596 -0
- package/.safeword/planning/design/013a-eslint-plugin-suite.md +256 -0
- package/.safeword/planning/design/013b-implementation-snippets.md +385 -0
- package/.safeword/planning/design/013c-config-isolation-strategy.md +242 -0
- package/.safeword/planning/design/code-philosophy-improvements.md +60 -0
- package/.safeword/planning/mcp-analysis.md +545 -0
- package/.safeword/planning/phase2-subagents-vs-skills-analysis.md +451 -0
- package/.safeword/planning/settings-improvements.md +970 -0
- package/.safeword/planning/test-definitions/005-cli-implementation.md +1301 -0
- package/.safeword/planning/test-definitions/cli-self-contained-templates.md +205 -0
- package/.safeword/planning/user-stories/001-guides-review-user-stories.md +1381 -0
- package/.safeword/planning/user-stories/003-reactive-fix-prevention.md +132 -0
- package/.safeword/planning/user-stories/004-technical-constraints.md +86 -0
- package/.safeword/planning/user-stories/005-cli-implementation.md +311 -0
- package/.safeword/planning/user-stories/cli-self-contained-templates.md +172 -0
- package/.safeword/planning/versioned-distribution.md +740 -0
- package/.safeword/prompts/arch-review.md +43 -0
- package/.safeword/prompts/quality-review.md +11 -0
- package/.safeword/scripts/arch-review.sh +235 -0
- package/.safeword/scripts/check-linting-sync.sh +58 -0
- package/.safeword/scripts/setup-linting.sh +559 -0
- package/.safeword/templates/architecture-template.md +136 -0
- package/.safeword/templates/ci/architecture-check.yml +79 -0
- package/.safeword/templates/design-doc-template.md +127 -0
- package/.safeword/templates/test-definitions-feature.md +100 -0
- package/.safeword/templates/ticket-template.md +74 -0
- package/.safeword/templates/user-stories-template.md +82 -0
- package/.safeword/tickets/001-guides-review-user-stories.md +83 -0
- package/.safeword/tickets/002-architecture-enforcement.md +211 -0
- package/.safeword/tickets/003-reactive-fix-prevention.md +57 -0
- package/.safeword/tickets/004-technical-constraints-in-user-stories.md +39 -0
- package/.safeword/tickets/005-cli-implementation.md +248 -0
- package/.safeword/tickets/006-flesh-out-skills.md +43 -0
- package/.safeword/tickets/007-flesh-out-questioning.md +44 -0
- package/.safeword/tickets/008-upgrade-questioning.md +58 -0
- package/.safeword/tickets/009-naming-conventions.md +41 -0
- package/.safeword/tickets/010-safeword-md-cleanup.md +34 -0
- package/.safeword/tickets/011-cursor-setup.md +86 -0
- package/.safeword/tickets/README.md +73 -0
- package/.safeword/version +1 -0
- package/AGENTS.md +59 -0
- package/CLAUDE.md +12 -0
- package/README.md +347 -0
- package/docs/001-cli-implementation-plan.md +856 -0
- package/docs/elite-dx-implementation-plan.md +1034 -0
- package/framework/README.md +131 -0
- package/framework/mcp/README.md +96 -0
- package/framework/mcp/arcade.sample.json +8 -0
- package/framework/mcp/context7.sample.json +6 -0
- package/framework/mcp/playwright.sample.json +6 -0
- package/framework/scripts/arch-review.sh +235 -0
- package/framework/scripts/check-linting-sync.sh +58 -0
- package/framework/scripts/load-env.sh +49 -0
- package/framework/scripts/setup-claude.sh +223 -0
- package/framework/scripts/setup-linting.sh +559 -0
- package/framework/scripts/setup-quality.sh +477 -0
- package/framework/scripts/setup-safeword.sh +550 -0
- package/framework/templates/ci/architecture-check.yml +78 -0
- package/learnings/ai-sdk-v5-breaking-changes.md +178 -0
- package/learnings/e2e-test-zombie-processes.md +231 -0
- package/learnings/milkdown-crepe-editor-property.md +96 -0
- package/learnings/prosemirror-fragment-traversal.md +119 -0
- package/package.json +19 -43
- package/packages/cli/AGENTS.md +1 -0
- package/packages/cli/ARCHITECTURE.md +279 -0
- package/packages/cli/package.json +51 -0
- package/packages/cli/src/cli.ts +63 -0
- package/packages/cli/src/commands/check.ts +166 -0
- package/packages/cli/src/commands/diff.ts +209 -0
- package/packages/cli/src/commands/reset.ts +190 -0
- package/packages/cli/src/commands/setup.ts +325 -0
- package/packages/cli/src/commands/upgrade.ts +163 -0
- package/packages/cli/src/index.ts +3 -0
- package/packages/cli/src/templates/config.ts +58 -0
- package/packages/cli/src/templates/content.ts +18 -0
- package/packages/cli/src/templates/index.ts +12 -0
- package/packages/cli/src/utils/agents-md.ts +66 -0
- package/packages/cli/src/utils/fs.ts +179 -0
- package/packages/cli/src/utils/git.ts +124 -0
- package/packages/cli/src/utils/hooks.ts +29 -0
- package/packages/cli/src/utils/output.ts +60 -0
- package/packages/cli/src/utils/project-detector.test.ts +185 -0
- package/packages/cli/src/utils/project-detector.ts +44 -0
- package/packages/cli/src/utils/version.ts +28 -0
- package/packages/cli/src/version.ts +6 -0
- package/packages/cli/templates/SAFEWORD.md +776 -0
- package/packages/cli/templates/doc-templates/architecture-template.md +136 -0
- package/packages/cli/templates/doc-templates/design-doc-template.md +134 -0
- package/packages/cli/templates/doc-templates/test-definitions-feature.md +131 -0
- package/packages/cli/templates/doc-templates/ticket-template.md +82 -0
- package/packages/cli/templates/doc-templates/user-stories-template.md +92 -0
- package/packages/cli/templates/guides/architecture-guide.md +423 -0
- package/packages/cli/templates/guides/code-philosophy.md +195 -0
- package/packages/cli/templates/guides/context-files-guide.md +457 -0
- package/packages/cli/templates/guides/data-architecture-guide.md +200 -0
- package/packages/cli/templates/guides/design-doc-guide.md +171 -0
- package/packages/cli/templates/guides/learning-extraction.md +552 -0
- package/packages/cli/templates/guides/llm-instruction-design.md +248 -0
- package/packages/cli/templates/guides/llm-prompting.md +102 -0
- package/packages/cli/templates/guides/tdd-best-practices.md +615 -0
- package/packages/cli/templates/guides/test-definitions-guide.md +334 -0
- package/packages/cli/templates/guides/testing-methodology.md +618 -0
- package/packages/cli/templates/guides/user-story-guide.md +256 -0
- package/packages/cli/templates/guides/zombie-process-cleanup.md +219 -0
- package/packages/cli/templates/hooks/agents-md-check.sh +27 -0
- package/packages/cli/templates/hooks/post-tool.sh +4 -0
- package/packages/cli/templates/hooks/pre-commit.sh +10 -0
- package/packages/cli/templates/prompts/arch-review.md +43 -0
- package/packages/cli/templates/prompts/quality-review.md +10 -0
- package/packages/cli/templates/skills/safeword-quality-reviewer/SKILL.md +207 -0
- package/packages/cli/tests/commands/check.test.ts +129 -0
- package/packages/cli/tests/commands/cli.test.ts +89 -0
- package/packages/cli/tests/commands/diff.test.ts +115 -0
- package/packages/cli/tests/commands/reset.test.ts +310 -0
- package/packages/cli/tests/commands/self-healing.test.ts +170 -0
- package/packages/cli/tests/commands/setup-blocking.test.ts +71 -0
- package/packages/cli/tests/commands/setup-core.test.ts +135 -0
- package/packages/cli/tests/commands/setup-git.test.ts +139 -0
- package/packages/cli/tests/commands/setup-hooks.test.ts +334 -0
- package/packages/cli/tests/commands/setup-linting.test.ts +189 -0
- package/packages/cli/tests/commands/setup-noninteractive.test.ts +80 -0
- package/packages/cli/tests/commands/setup-templates.test.ts +181 -0
- package/packages/cli/tests/commands/upgrade.test.ts +215 -0
- package/packages/cli/tests/helpers.ts +243 -0
- package/packages/cli/tests/npm-package.test.ts +83 -0
- package/packages/cli/tests/technical-constraints.test.ts +96 -0
- package/packages/cli/tsconfig.json +25 -0
- package/packages/cli/tsup.config.ts +11 -0
- package/packages/cli/vitest.config.ts +23 -0
- package/promptfoo.yaml +3270 -0
- package/dist/check-3NGQ4NR5.js +0 -129
- package/dist/check-3NGQ4NR5.js.map +0 -1
- package/dist/chunk-2XWIUEQK.js +0 -190
- package/dist/chunk-2XWIUEQK.js.map +0 -1
- package/dist/chunk-GZRQL3SX.js +0 -146
- package/dist/chunk-GZRQL3SX.js.map +0 -1
- package/dist/chunk-ORQHKDT2.js +0 -10
- package/dist/chunk-ORQHKDT2.js.map +0 -1
- package/dist/chunk-W66Z3C5H.js +0 -21
- package/dist/chunk-W66Z3C5H.js.map +0 -1
- package/dist/cli.d.ts +0 -1
- package/dist/cli.js +0 -34
- package/dist/cli.js.map +0 -1
- package/dist/diff-Y6QTAW4O.js +0 -166
- package/dist/diff-Y6QTAW4O.js.map +0 -1
- package/dist/index.d.ts +0 -11
- package/dist/index.js +0 -7
- package/dist/index.js.map +0 -1
- package/dist/reset-3ACTIYYE.js +0 -143
- package/dist/reset-3ACTIYYE.js.map +0 -1
- package/dist/setup-RR4M334C.js +0 -266
- package/dist/setup-RR4M334C.js.map +0 -1
- package/dist/upgrade-6AR3DHUV.js +0 -134
- package/dist/upgrade-6AR3DHUV.js.map +0 -1
- /package/{templates → framework}/SAFEWORD.md +0 -0
- /package/{templates → framework}/guides/architecture-guide.md +0 -0
- /package/{templates → framework}/guides/code-philosophy.md +0 -0
- /package/{templates → framework}/guides/context-files-guide.md +0 -0
- /package/{templates → framework}/guides/data-architecture-guide.md +0 -0
- /package/{templates → framework}/guides/design-doc-guide.md +0 -0
- /package/{templates → framework}/guides/learning-extraction.md +0 -0
- /package/{templates → framework}/guides/llm-instruction-design.md +0 -0
- /package/{templates → framework}/guides/llm-prompting.md +0 -0
- /package/{templates → framework}/guides/tdd-best-practices.md +0 -0
- /package/{templates → framework}/guides/test-definitions-guide.md +0 -0
- /package/{templates → framework}/guides/testing-methodology.md +0 -0
- /package/{templates → framework}/guides/user-story-guide.md +0 -0
- /package/{templates → framework}/guides/zombie-process-cleanup.md +0 -0
- /package/{templates → framework}/prompts/arch-review.md +0 -0
- /package/{templates → framework}/prompts/quality-review.md +0 -0
- /package/{templates/skills/safeword-quality-reviewer → framework/skills/quality-reviewer}/SKILL.md +0 -0
- /package/{templates/doc-templates → framework/templates}/architecture-template.md +0 -0
- /package/{templates/doc-templates → framework/templates}/design-doc-template.md +0 -0
- /package/{templates/doc-templates → framework/templates}/test-definitions-feature.md +0 -0
- /package/{templates/doc-templates → framework/templates}/ticket-template.md +0 -0
- /package/{templates/doc-templates → framework/templates}/user-stories-template.md +0 -0
- /package/{templates → packages/cli/templates}/commands/arch-review.md +0 -0
- /package/{templates → packages/cli/templates}/commands/lint.md +0 -0
- /package/{templates → packages/cli/templates}/commands/quality-review.md +0 -0
- /package/{templates → packages/cli/templates}/hooks/inject-timestamp.sh +0 -0
- /package/{templates → packages/cli/templates}/lib/common.sh +0 -0
- /package/{templates → packages/cli/templates}/lib/jq-fallback.sh +0 -0
- /package/{templates → packages/cli/templates}/markdownlint.jsonc +0 -0
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Architecture Review Prompt
|
|
2
|
+
|
|
3
|
+
Review the following code changes for architectural issues.
|
|
4
|
+
|
|
5
|
+
## Check for:
|
|
6
|
+
|
|
7
|
+
1. **Misplaced logic** - Business rules in wrong layer?
|
|
8
|
+
2. **God module** - Too many responsibilities (>10 dependents or >500 lines)?
|
|
9
|
+
3. **Leaky abstraction** - Implementation details exposed to callers?
|
|
10
|
+
4. **Tight coupling** - Changes would cascade unnecessarily?
|
|
11
|
+
5. **Boundary violation** - Import from disallowed layer?
|
|
12
|
+
|
|
13
|
+
## Context
|
|
14
|
+
|
|
15
|
+
Read the project's ARCHITECTURE.md for:
|
|
16
|
+
- Defined layers and their responsibilities
|
|
17
|
+
- Allowed dependencies between layers
|
|
18
|
+
- Project-specific patterns and conventions
|
|
19
|
+
|
|
20
|
+
## Response Format
|
|
21
|
+
|
|
22
|
+
Return JSON:
|
|
23
|
+
|
|
24
|
+
```json
|
|
25
|
+
{
|
|
26
|
+
"issues": [
|
|
27
|
+
{
|
|
28
|
+
"type": "misplaced_logic | god_module | leaky_abstraction | tight_coupling | boundary_violation",
|
|
29
|
+
"location": "file:line or module name",
|
|
30
|
+
"description": "What's wrong",
|
|
31
|
+
"fix": "How to fix it"
|
|
32
|
+
}
|
|
33
|
+
],
|
|
34
|
+
"verdict": "clean | minor | refactor_needed"
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### Verdict definitions:
|
|
39
|
+
|
|
40
|
+
- **clean**: No issues found
|
|
41
|
+
- **minor**: Small issues that should be noted but don't block commit
|
|
42
|
+
- **refactor_needed**: Significant issues that should be addressed before commit
|
|
43
|
+
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# Quality Review Prompt
|
|
2
|
+
|
|
3
|
+
Double check and critique your work just in case.
|
|
4
|
+
|
|
5
|
+
- Is it correct?
|
|
6
|
+
- Is it elegant?
|
|
7
|
+
- Does it adhere to the latest documentation and best practices for the relevant stack items, UX principles, domain requirements, and testing practices?
|
|
8
|
+
- Ask me any non-obvious questions you can't research yourself in the codebase or online.
|
|
9
|
+
- Think hard.
|
|
10
|
+
- Avoid bloat.
|
|
11
|
+
|
|
@@ -0,0 +1,235 @@
|
|
|
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
|
+
|
|
@@ -0,0 +1,58 @@
|
|
|
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
|
+
|