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,550 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# setup-safeword.sh
|
|
3
|
+
# Sets up standardized agent project structure with SAFEWORD framework
|
|
4
|
+
# Copies skills, guides, templates, and prompts to target project
|
|
5
|
+
|
|
6
|
+
set -e
|
|
7
|
+
|
|
8
|
+
PROJECT_ROOT=$(pwd)
|
|
9
|
+
SAFEWORD_DIR="$PROJECT_ROOT/.safeword"
|
|
10
|
+
# Locate framework files relative to this script
|
|
11
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
12
|
+
|
|
13
|
+
echo "Setting up agent project structure..."
|
|
14
|
+
|
|
15
|
+
# Copy framework skills to project .claude/skills/
|
|
16
|
+
FRAMEWORK_SKILLS_DIR="$SCRIPT_DIR/../skills"
|
|
17
|
+
PROJECT_SKILLS_DIR="$PROJECT_ROOT/.claude/skills"
|
|
18
|
+
|
|
19
|
+
if [ -d "$FRAMEWORK_SKILLS_DIR" ]; then
|
|
20
|
+
echo "Copying skills to .claude/skills/..."
|
|
21
|
+
mkdir -p "$PROJECT_SKILLS_DIR"
|
|
22
|
+
for skill in "$FRAMEWORK_SKILLS_DIR"/*; do
|
|
23
|
+
if [ -d "$skill" ]; then
|
|
24
|
+
skill_name=$(basename "$skill")
|
|
25
|
+
target="$PROJECT_SKILLS_DIR/$skill_name"
|
|
26
|
+
|
|
27
|
+
# Copy skill folder (overwrite if exists)
|
|
28
|
+
rm -rf "$target" 2>/dev/null || true
|
|
29
|
+
cp -r "$skill" "$target"
|
|
30
|
+
echo " ✓ Copied $skill_name"
|
|
31
|
+
fi
|
|
32
|
+
done
|
|
33
|
+
fi
|
|
34
|
+
|
|
35
|
+
# Create directory structure with archive folders
|
|
36
|
+
mkdir -p "$SAFEWORD_DIR"/planning/{user-stories/{,archive},test-definitions/{,archive},design/{,archive},issues/{,archive}}
|
|
37
|
+
mkdir -p "$SAFEWORD_DIR"/tickets/{,completed,archived}
|
|
38
|
+
|
|
39
|
+
# Create Claude Code directory structure
|
|
40
|
+
mkdir -p "$PROJECT_ROOT/.claude"
|
|
41
|
+
|
|
42
|
+
# Copy framework SAFEWORD.md into project .safeword/ (global patterns)
|
|
43
|
+
mkdir -p "$SAFEWORD_DIR"
|
|
44
|
+
if [ -f "$SCRIPT_DIR/../SAFEWORD.md" ]; then
|
|
45
|
+
cp "$SCRIPT_DIR/../SAFEWORD.md" "$SAFEWORD_DIR/SAFEWORD.md"
|
|
46
|
+
echo " ✓ Copied framework SAFEWORD.md to .safeword/SAFEWORD.md"
|
|
47
|
+
else
|
|
48
|
+
echo " ⚠ Warning: framework SAFEWORD.md not found at $SCRIPT_DIR/../SAFEWORD.md (skipping)"
|
|
49
|
+
fi
|
|
50
|
+
|
|
51
|
+
# Copy guides and templates into .safeword/ for standalone operation
|
|
52
|
+
if [ -d "$SCRIPT_DIR/../guides" ]; then
|
|
53
|
+
cp -R "$SCRIPT_DIR/../guides" "$SAFEWORD_DIR/" 2>/dev/null || true
|
|
54
|
+
echo " ✓ Copied guides to .safeword/guides/"
|
|
55
|
+
else
|
|
56
|
+
echo " ⚠ Warning: framework guides not found at $SCRIPT_DIR/../guides (skipping)"
|
|
57
|
+
fi
|
|
58
|
+
if [ -d "$SCRIPT_DIR/../templates" ]; then
|
|
59
|
+
cp -R "$SCRIPT_DIR/../templates" "$SAFEWORD_DIR/" 2>/dev/null || true
|
|
60
|
+
echo " ✓ Copied templates to .safeword/templates/"
|
|
61
|
+
else
|
|
62
|
+
echo " ⚠ Warning: framework templates not found at $SCRIPT_DIR/../templates (skipping)"
|
|
63
|
+
fi
|
|
64
|
+
|
|
65
|
+
# Copy prompts into .safeword/prompts/ for LLM review hooks
|
|
66
|
+
if [ -d "$SCRIPT_DIR/../prompts" ]; then
|
|
67
|
+
cp -R "$SCRIPT_DIR/../prompts" "$SAFEWORD_DIR/" 2>/dev/null || true
|
|
68
|
+
echo " ✓ Copied prompts to .safeword/prompts/"
|
|
69
|
+
else
|
|
70
|
+
echo " ⚠ Warning: framework prompts not found at $SCRIPT_DIR/../prompts (skipping)"
|
|
71
|
+
fi
|
|
72
|
+
|
|
73
|
+
# Copy scripts to .safeword/scripts/
|
|
74
|
+
mkdir -p "$SAFEWORD_DIR/scripts"
|
|
75
|
+
|
|
76
|
+
if [ -f "$SCRIPT_DIR/arch-review.sh" ]; then
|
|
77
|
+
cp "$SCRIPT_DIR/arch-review.sh" "$SAFEWORD_DIR/scripts/" 2>/dev/null || true
|
|
78
|
+
chmod +x "$SAFEWORD_DIR/scripts/arch-review.sh"
|
|
79
|
+
echo " ✓ Copied arch-review.sh to .safeword/scripts/"
|
|
80
|
+
else
|
|
81
|
+
echo " ⚠ Warning: arch-review.sh not found (skipping)"
|
|
82
|
+
fi
|
|
83
|
+
|
|
84
|
+
if [ -f "$SCRIPT_DIR/check-linting-sync.sh" ]; then
|
|
85
|
+
cp "$SCRIPT_DIR/check-linting-sync.sh" "$SAFEWORD_DIR/scripts/" 2>/dev/null || true
|
|
86
|
+
chmod +x "$SAFEWORD_DIR/scripts/check-linting-sync.sh"
|
|
87
|
+
echo " ✓ Copied check-linting-sync.sh to .safeword/scripts/"
|
|
88
|
+
else
|
|
89
|
+
echo " ⚠ Warning: check-linting-sync.sh not found (skipping)"
|
|
90
|
+
fi
|
|
91
|
+
|
|
92
|
+
if [ -f "$SCRIPT_DIR/setup-linting.sh" ]; then
|
|
93
|
+
cp "$SCRIPT_DIR/setup-linting.sh" "$SAFEWORD_DIR/scripts/" 2>/dev/null || true
|
|
94
|
+
chmod +x "$SAFEWORD_DIR/scripts/setup-linting.sh"
|
|
95
|
+
echo " ✓ Copied setup-linting.sh to .safeword/scripts/"
|
|
96
|
+
else
|
|
97
|
+
echo " ⚠ Warning: setup-linting.sh not found (skipping)"
|
|
98
|
+
fi
|
|
99
|
+
|
|
100
|
+
# Create .claude/hooks directory and add timestamp injection hook
|
|
101
|
+
mkdir -p "$PROJECT_ROOT/.claude/hooks"
|
|
102
|
+
cat > "$PROJECT_ROOT/.claude/hooks/inject-timestamp.sh" << 'EOF'
|
|
103
|
+
#!/bin/bash
|
|
104
|
+
# Inject Timestamp - Notification Hook
|
|
105
|
+
# Outputs current Unix timestamp at session start for Claude's context awareness
|
|
106
|
+
# Helps with accurate ticket timestamps and time-based reasoning
|
|
107
|
+
|
|
108
|
+
echo "Current time: $(date +%s) ($(date -u +%Y-%m-%dT%H:%M:%SZ))"
|
|
109
|
+
EOF
|
|
110
|
+
chmod +x "$PROJECT_ROOT/.claude/hooks/inject-timestamp.sh"
|
|
111
|
+
echo " ✓ Created inject-timestamp.sh hook"
|
|
112
|
+
|
|
113
|
+
# Create SAFEWORD.md at project root if missing
|
|
114
|
+
if [ ! -f "$PROJECT_ROOT/SAFEWORD.md" ]; then
|
|
115
|
+
echo "Creating SAFEWORD.md with project template..."
|
|
116
|
+
cat > "$PROJECT_ROOT/SAFEWORD.md" << 'EOF'
|
|
117
|
+
# [Project Name] - SAFEWORD Configuration
|
|
118
|
+
|
|
119
|
+
Use the guides under `@./.safeword/guides/` for core patterns, workflows, and conventions.
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## Project Overview
|
|
124
|
+
|
|
125
|
+
[Brief description. Current status.]
|
|
126
|
+
|
|
127
|
+
## Tech Stack
|
|
128
|
+
|
|
129
|
+
- [List your technologies here]
|
|
130
|
+
|
|
131
|
+
## Architecture Decisions
|
|
132
|
+
|
|
133
|
+
### [Tech Choice]
|
|
134
|
+
**Decision:** [What we chose]
|
|
135
|
+
**Why:** [Specific reasoning]
|
|
136
|
+
**Trade-off:** [What we gave up]
|
|
137
|
+
**Gotcha:** [Common mistake to avoid]
|
|
138
|
+
|
|
139
|
+
## Common Gotchas
|
|
140
|
+
|
|
141
|
+
1. **[Thing]:** [Why it breaks and how to fix]
|
|
142
|
+
|
|
143
|
+
## File Organization
|
|
144
|
+
|
|
145
|
+
**Dir** (`path/`) - Purpose
|
|
146
|
+
EOF
|
|
147
|
+
fi
|
|
148
|
+
|
|
149
|
+
# Create .claude/settings.json with hook references
|
|
150
|
+
if [ ! -f "$PROJECT_ROOT/.claude/settings.json" ]; then
|
|
151
|
+
echo "Creating .claude/settings.json with hook references..."
|
|
152
|
+
cat > "$PROJECT_ROOT/.claude/settings.json" << 'EOF'
|
|
153
|
+
{
|
|
154
|
+
"$schema": "https://json.schemastore.org/claude-code-settings.json",
|
|
155
|
+
"hooks": {
|
|
156
|
+
"Notification": [
|
|
157
|
+
{
|
|
158
|
+
"hooks": [
|
|
159
|
+
{
|
|
160
|
+
"type": "command",
|
|
161
|
+
"command": "$CLAUDE_PROJECT_DIR/.claude/hooks/inject-timestamp.sh"
|
|
162
|
+
}
|
|
163
|
+
]
|
|
164
|
+
}
|
|
165
|
+
]
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
EOF
|
|
169
|
+
else
|
|
170
|
+
echo "Note: .claude/settings.json already exists, skipping..."
|
|
171
|
+
# Check if Notification hook needs to be added
|
|
172
|
+
if command -v jq &> /dev/null; then
|
|
173
|
+
if ! jq -e '.hooks.Notification[]?.hooks[]? | select(.command | contains("inject-timestamp"))' "$PROJECT_ROOT/.claude/settings.json" > /dev/null 2>&1; then
|
|
174
|
+
jq '.hooks.Notification = (.hooks.Notification // []) + [{"hooks": [{"type": "command", "command": "$CLAUDE_PROJECT_DIR/.claude/hooks/inject-timestamp.sh"}]}]' \
|
|
175
|
+
"$PROJECT_ROOT/.claude/settings.json" > "$PROJECT_ROOT/.claude/settings.json.tmp"
|
|
176
|
+
mv "$PROJECT_ROOT/.claude/settings.json.tmp" "$PROJECT_ROOT/.claude/settings.json"
|
|
177
|
+
echo " ✓ Added Notification hook for timestamp injection"
|
|
178
|
+
fi
|
|
179
|
+
fi
|
|
180
|
+
fi
|
|
181
|
+
|
|
182
|
+
# Create git pre-commit hook for architecture enforcement
|
|
183
|
+
if [ -d "$PROJECT_ROOT/.git" ]; then
|
|
184
|
+
mkdir -p "$PROJECT_ROOT/.git/hooks"
|
|
185
|
+
|
|
186
|
+
# Check if pre-commit hook already exists
|
|
187
|
+
if [ -f "$PROJECT_ROOT/.git/hooks/pre-commit" ]; then
|
|
188
|
+
# Check if our section is already there (has our marker)
|
|
189
|
+
if grep -q "SAFEWORD_ARCH_CHECK_START" "$PROJECT_ROOT/.git/hooks/pre-commit" 2>/dev/null; then
|
|
190
|
+
echo " ✓ Architecture checks already in pre-commit hook (skipped)"
|
|
191
|
+
else
|
|
192
|
+
# Append our checks to existing hook
|
|
193
|
+
echo " Appending architecture checks to existing pre-commit hook..."
|
|
194
|
+
cat >> "$PROJECT_ROOT/.git/hooks/pre-commit" << 'EOF'
|
|
195
|
+
|
|
196
|
+
# === SAFEWORD_ARCH_CHECK_START ===
|
|
197
|
+
# Architecture Enforcement (appended by setup-safeword.sh)
|
|
198
|
+
# Get staged JS/TS files
|
|
199
|
+
STAGED_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep -E '\.(js|ts|tsx|jsx)$' || true)
|
|
200
|
+
|
|
201
|
+
if [ -n "$STAGED_FILES" ]; then
|
|
202
|
+
echo "Running architecture checks..."
|
|
203
|
+
|
|
204
|
+
# ESLint (if configured)
|
|
205
|
+
if command -v npx &> /dev/null && { [ -f "eslint.config.mjs" ] || [ -f ".eslintrc.json" ] || [ -f ".eslintrc.js" ]; }; then
|
|
206
|
+
echo "$STAGED_FILES" | xargs npx eslint --max-warnings 0 || exit 1
|
|
207
|
+
fi
|
|
208
|
+
|
|
209
|
+
# Architecture review (if configured and API key set)
|
|
210
|
+
if [ -f ".safeword/scripts/arch-review.sh" ] && [ -n "$ANTHROPIC_API_KEY" ]; then
|
|
211
|
+
bash .safeword/scripts/arch-review.sh --staged || {
|
|
212
|
+
if [ $? -eq 1 ]; then exit 1; fi # Only fail on refactor_needed
|
|
213
|
+
}
|
|
214
|
+
fi
|
|
215
|
+
fi
|
|
216
|
+
# === SAFEWORD_ARCH_CHECK_END ===
|
|
217
|
+
EOF
|
|
218
|
+
echo " ✓ Appended architecture checks to existing pre-commit hook"
|
|
219
|
+
fi
|
|
220
|
+
else
|
|
221
|
+
# Create new pre-commit hook
|
|
222
|
+
cat > "$PROJECT_ROOT/.git/hooks/pre-commit" << 'EOF'
|
|
223
|
+
#!/bin/bash
|
|
224
|
+
# === SAFEWORD_ARCH_CHECK_START ===
|
|
225
|
+
################################################################################
|
|
226
|
+
# Pre-commit Hook: Architecture Enforcement
|
|
227
|
+
#
|
|
228
|
+
# Runs:
|
|
229
|
+
# 1. ESLint on staged files (fast, free, deterministic)
|
|
230
|
+
# 2. arch-review.sh on staged files (semantic LLM review, requires ANTHROPIC_API_KEY)
|
|
231
|
+
#
|
|
232
|
+
# Exit codes:
|
|
233
|
+
# 0 - All checks pass, commit allowed
|
|
234
|
+
# 1 - Issues found, commit blocked
|
|
235
|
+
################################################################################
|
|
236
|
+
|
|
237
|
+
# Get staged JS/TS files
|
|
238
|
+
STAGED_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep -E '\.(js|ts|tsx|jsx)$' || true)
|
|
239
|
+
|
|
240
|
+
if [ -z "$STAGED_FILES" ]; then
|
|
241
|
+
# No JS/TS files staged, skip checks
|
|
242
|
+
exit 0
|
|
243
|
+
fi
|
|
244
|
+
|
|
245
|
+
echo "Running architecture checks on staged files..."
|
|
246
|
+
echo ""
|
|
247
|
+
|
|
248
|
+
# Step 1: ESLint (fast, deterministic)
|
|
249
|
+
echo "=== ESLint Check ==="
|
|
250
|
+
if command -v npx &> /dev/null && { [ -f "eslint.config.mjs" ] || [ -f ".eslintrc.json" ] || [ -f ".eslintrc.js" ]; }; then
|
|
251
|
+
# Run ESLint on staged files
|
|
252
|
+
echo "$STAGED_FILES" | xargs npx eslint --max-warnings 0
|
|
253
|
+
ESLINT_EXIT=$?
|
|
254
|
+
|
|
255
|
+
if [ $ESLINT_EXIT -ne 0 ]; then
|
|
256
|
+
echo ""
|
|
257
|
+
echo "✗ ESLint found errors. Please fix them before committing."
|
|
258
|
+
exit 1
|
|
259
|
+
fi
|
|
260
|
+
echo "✓ ESLint passed"
|
|
261
|
+
else
|
|
262
|
+
echo "⚠ ESLint not configured, skipping"
|
|
263
|
+
fi
|
|
264
|
+
echo ""
|
|
265
|
+
|
|
266
|
+
# Step 2: Architecture Review (semantic, requires API key)
|
|
267
|
+
echo "=== Architecture Review ==="
|
|
268
|
+
ARCH_REVIEW_SCRIPT=""
|
|
269
|
+
|
|
270
|
+
# Find arch-review.sh (check multiple locations)
|
|
271
|
+
if [ -f ".safeword/scripts/arch-review.sh" ]; then
|
|
272
|
+
ARCH_REVIEW_SCRIPT=".safeword/scripts/arch-review.sh"
|
|
273
|
+
elif [ -f ".claude/hooks/arch-review.sh" ]; then
|
|
274
|
+
ARCH_REVIEW_SCRIPT=".claude/hooks/arch-review.sh"
|
|
275
|
+
fi
|
|
276
|
+
|
|
277
|
+
if [ -n "$ARCH_REVIEW_SCRIPT" ] && [ -n "$ANTHROPIC_API_KEY" ]; then
|
|
278
|
+
bash "$ARCH_REVIEW_SCRIPT" --staged
|
|
279
|
+
ARCH_EXIT=$?
|
|
280
|
+
|
|
281
|
+
if [ $ARCH_EXIT -eq 1 ]; then
|
|
282
|
+
echo ""
|
|
283
|
+
echo "✗ Architecture review found issues that need refactoring."
|
|
284
|
+
echo " Fix them before committing, or use 'git commit --no-verify' to bypass."
|
|
285
|
+
exit 1
|
|
286
|
+
elif [ $ARCH_EXIT -eq 2 ]; then
|
|
287
|
+
echo "⚠ Architecture review encountered an error (continuing anyway)"
|
|
288
|
+
else
|
|
289
|
+
echo "✓ Architecture review passed"
|
|
290
|
+
fi
|
|
291
|
+
elif [ -z "$ANTHROPIC_API_KEY" ]; then
|
|
292
|
+
echo "⚠ ANTHROPIC_API_KEY not set, skipping LLM architecture review"
|
|
293
|
+
echo " Set it to enable: export ANTHROPIC_API_KEY='your-key'"
|
|
294
|
+
else
|
|
295
|
+
echo "⚠ arch-review.sh not found, skipping LLM architecture review"
|
|
296
|
+
fi
|
|
297
|
+
|
|
298
|
+
echo ""
|
|
299
|
+
echo "✓ All pre-commit checks passed"
|
|
300
|
+
exit 0
|
|
301
|
+
# === SAFEWORD_ARCH_CHECK_END ===
|
|
302
|
+
EOF
|
|
303
|
+
|
|
304
|
+
chmod +x "$PROJECT_ROOT/.git/hooks/pre-commit"
|
|
305
|
+
echo " ✓ Created git pre-commit hook for architecture enforcement"
|
|
306
|
+
fi
|
|
307
|
+
else
|
|
308
|
+
echo " ⚠ Not a git repository, skipping pre-commit hook"
|
|
309
|
+
fi
|
|
310
|
+
|
|
311
|
+
# Ensure learnings directory exists
|
|
312
|
+
mkdir -p "$SAFEWORD_DIR/learnings" "$SAFEWORD_DIR/learnings/archive"
|
|
313
|
+
echo " ✓ Ensured .safeword/learnings/ and archive/ exist"
|
|
314
|
+
|
|
315
|
+
# If AGENTS.md exists, ensure it includes the SAFEWORD trigger at the top
|
|
316
|
+
if [ -f "$PROJECT_ROOT/AGENTS.md" ]; then
|
|
317
|
+
if grep -q "@./.safeword/SAFEWORD.md" "$PROJECT_ROOT/AGENTS.md"; then
|
|
318
|
+
echo " ✓ AGENTS.md already has SAFEWORD.md reference (skipped)"
|
|
319
|
+
else
|
|
320
|
+
temp_file=$(mktemp)
|
|
321
|
+
cat > "$temp_file" << 'EOF'
|
|
322
|
+
**⚠️ ALWAYS READ FIRST: @./.safeword/SAFEWORD.md**
|
|
323
|
+
|
|
324
|
+
The SAFEWORD.md file contains core development patterns, workflows, and conventions.
|
|
325
|
+
Read it BEFORE working on any task in this project.
|
|
326
|
+
|
|
327
|
+
---
|
|
328
|
+
|
|
329
|
+
EOF
|
|
330
|
+
cat "$PROJECT_ROOT/AGENTS.md" >> "$temp_file"
|
|
331
|
+
mv "$temp_file" "$PROJECT_ROOT/AGENTS.md"
|
|
332
|
+
echo " ✓ Added SAFEWORD.md reference to existing AGENTS.md"
|
|
333
|
+
fi
|
|
334
|
+
else
|
|
335
|
+
# Create AGENTS.md with SAFEWORD trigger
|
|
336
|
+
cat > "$PROJECT_ROOT/AGENTS.md" << 'EOF'
|
|
337
|
+
# Project Name - Developer Context
|
|
338
|
+
|
|
339
|
+
**⚠️ ALWAYS READ FIRST: @./.safeword/SAFEWORD.md**
|
|
340
|
+
|
|
341
|
+
The SAFEWORD.md file contains core development patterns, workflows, and conventions.
|
|
342
|
+
Read it BEFORE working on any task in this project.
|
|
343
|
+
|
|
344
|
+
---
|
|
345
|
+
|
|
346
|
+
## Project-Specific Context
|
|
347
|
+
|
|
348
|
+
### Tech Stack
|
|
349
|
+
- Add your technologies here
|
|
350
|
+
|
|
351
|
+
### Architecture
|
|
352
|
+
- Add architecture notes here
|
|
353
|
+
|
|
354
|
+
### Gotchas
|
|
355
|
+
- Add project-specific gotchas here
|
|
356
|
+
|
|
357
|
+
### Conventions
|
|
358
|
+
- Add coding conventions here
|
|
359
|
+
EOF
|
|
360
|
+
echo " ✓ Created AGENTS.md with SAFEWORD.md reference"
|
|
361
|
+
fi
|
|
362
|
+
|
|
363
|
+
# Create README for planning
|
|
364
|
+
cat > "$SAFEWORD_DIR/planning/README.md" << 'EOF'
|
|
365
|
+
# Planning
|
|
366
|
+
|
|
367
|
+
## Structure
|
|
368
|
+
|
|
369
|
+
- `user-stories/` - User stories for features (As a X / Given-When-Then)
|
|
370
|
+
- `user-stories/archive/` - Completed/obsolete user stories
|
|
371
|
+
- `test-definitions/` - Test scenarios and acceptance criteria
|
|
372
|
+
- `test-definitions/archive/` - Completed/obsolete test definitions
|
|
373
|
+
- `design/` - Design docs for complex features (>3 components, new data model, architectural decisions)
|
|
374
|
+
- `design/archive/` - Completed/obsolete design docs
|
|
375
|
+
- `issues/` - Issue tracking and requirements
|
|
376
|
+
- `issues/archive/` - Completed/obsolete issues
|
|
377
|
+
|
|
378
|
+
## Naming Convention
|
|
379
|
+
|
|
380
|
+
**Planning docs share the same prefix as their ticket:**
|
|
381
|
+
|
|
382
|
+
Example for ticket `001-user-authentication.md`:
|
|
383
|
+
- `user-stories/001-user-authentication.md`
|
|
384
|
+
- `test-definitions/001-user-authentication.md`
|
|
385
|
+
- `design/001-user-authentication.md`
|
|
386
|
+
|
|
387
|
+
This makes it easy to find all related docs: `ls **/001-user-authentication.md`
|
|
388
|
+
|
|
389
|
+
## Archiving
|
|
390
|
+
|
|
391
|
+
When planning docs are completed and no longer actively referenced:
|
|
392
|
+
- Move to corresponding `archive/` subfolder
|
|
393
|
+
- Preserves history while preventing bloat in active folders
|
|
394
|
+
|
|
395
|
+
## Workflow
|
|
396
|
+
|
|
397
|
+
1. **User stories** → Define what we're building
|
|
398
|
+
2. **Test definitions** → Define how we'll verify it works
|
|
399
|
+
3. **Design docs** (optional for complex features) → Plan implementation
|
|
400
|
+
4. **Implementation (TDD)** → RED → GREEN → REFACTOR
|
|
401
|
+
5. **Archive** → Move completed docs to archive/
|
|
402
|
+
|
|
403
|
+
See `@./.safeword/SAFEWORD.md` for full workflow.
|
|
404
|
+
EOF
|
|
405
|
+
|
|
406
|
+
# Create README for tickets
|
|
407
|
+
cat > "$SAFEWORD_DIR/tickets/README.md" << 'EOF'
|
|
408
|
+
# Tickets
|
|
409
|
+
|
|
410
|
+
Higher-level feature/epic tracking. Each ticket references planning docs.
|
|
411
|
+
|
|
412
|
+
## Structure
|
|
413
|
+
|
|
414
|
+
- `./` - Active tickets (in progress or todo)
|
|
415
|
+
- `completed/` - Verified completed tickets (user confirmed)
|
|
416
|
+
- `archived/` - Blocked or cancelled tickets
|
|
417
|
+
|
|
418
|
+
## Naming Convention
|
|
419
|
+
|
|
420
|
+
**Tickets:** `{id}-{feature-slug}.md`
|
|
421
|
+
- Example: `001-user-authentication.md`, `002-payment-flow.md`
|
|
422
|
+
|
|
423
|
+
**Planning docs share same prefix:**
|
|
424
|
+
- User stories: `./.safeword/planning/user-stories/001-user-authentication.md`
|
|
425
|
+
- Test definitions: `./.safeword/planning/test-definitions/001-user-authentication.md`
|
|
426
|
+
- Design doc: `./.safeword/planning/design/001-user-authentication.md`
|
|
427
|
+
|
|
428
|
+
This makes it easy to find all related docs by prefix.
|
|
429
|
+
|
|
430
|
+
## Format
|
|
431
|
+
|
|
432
|
+
```markdown
|
|
433
|
+
---
|
|
434
|
+
id: 001
|
|
435
|
+
status: todo|in_progress|done|blocked
|
|
436
|
+
created: 2025-01-19T14:30:00Z
|
|
437
|
+
priority: low|medium|high
|
|
438
|
+
planning_refs:
|
|
439
|
+
- ./.safeword/planning/user-stories/001-user-authentication.md
|
|
440
|
+
- ./.safeword/planning/test-definitions/001-user-authentication.md
|
|
441
|
+
- ./.safeword/planning/design/001-user-authentication.md (if complex)
|
|
442
|
+
---
|
|
443
|
+
|
|
444
|
+
# User Authentication System
|
|
445
|
+
|
|
446
|
+
## Description
|
|
447
|
+
{High-level feature description}
|
|
448
|
+
|
|
449
|
+
## Scope
|
|
450
|
+
{What's included in this ticket}
|
|
451
|
+
|
|
452
|
+
## Acceptance Criteria
|
|
453
|
+
- [ ] All user stories completed
|
|
454
|
+
- [ ] All tests passing
|
|
455
|
+
- [ ] Documentation updated
|
|
456
|
+
|
|
457
|
+
## Work Log
|
|
458
|
+
{Progress notes, decisions, blockers}
|
|
459
|
+
```
|
|
460
|
+
|
|
461
|
+
## Completion Process
|
|
462
|
+
|
|
463
|
+
**CRITICAL:** Never mark ticket as done or archive without user confirmation.
|
|
464
|
+
|
|
465
|
+
1. Update status to `done` when work complete
|
|
466
|
+
2. **Ask user to confirm** all acceptance criteria met
|
|
467
|
+
3. User verifies:
|
|
468
|
+
- All tests passing
|
|
469
|
+
- Feature works as expected
|
|
470
|
+
- No regressions introduced
|
|
471
|
+
4. After confirmation: Move to `completed/`
|
|
472
|
+
5. Blocked/cancelled tickets: Move to `archived/`
|
|
473
|
+
|
|
474
|
+
## Relationship
|
|
475
|
+
|
|
476
|
+
- **Ticket** = Higher-level feature/epic
|
|
477
|
+
- **Planning docs** = Detailed specs (user stories, test definitions, design)
|
|
478
|
+
- **TodoWrite** = Task-level tracking in current session
|
|
479
|
+
|
|
480
|
+
See `@./.safeword/SAFEWORD.md` → Ticket System for details.
|
|
481
|
+
EOF
|
|
482
|
+
|
|
483
|
+
# Create .gitignore if it doesn't exist
|
|
484
|
+
if [ ! -f "$PROJECT_ROOT/.gitignore" ]; then
|
|
485
|
+
echo "Creating .gitignore..."
|
|
486
|
+
cat > "$PROJECT_ROOT/.gitignore" << 'EOF'
|
|
487
|
+
# Claude Code - Personal settings
|
|
488
|
+
.claude/settings.local.json
|
|
489
|
+
.claude/todos/
|
|
490
|
+
.claude/shell-snapshots/
|
|
491
|
+
|
|
492
|
+
# SAFEWORD planning (local state)
|
|
493
|
+
.safeword/planning/
|
|
494
|
+
.safeword/tickets/
|
|
495
|
+
|
|
496
|
+
# Node
|
|
497
|
+
node_modules/
|
|
498
|
+
dist/
|
|
499
|
+
*.log
|
|
500
|
+
.env
|
|
501
|
+
.env.local
|
|
502
|
+
|
|
503
|
+
# OS
|
|
504
|
+
.DS_Store
|
|
505
|
+
EOF
|
|
506
|
+
else
|
|
507
|
+
# Add .safeword planning folders to existing gitignore if not present
|
|
508
|
+
if ! grep -q "^\.safeword/planning/$" "$PROJECT_ROOT/.gitignore"; then
|
|
509
|
+
echo "" >> "$PROJECT_ROOT/.gitignore"
|
|
510
|
+
echo "# SAFEWORD planning (local state)" >> "$PROJECT_ROOT/.gitignore"
|
|
511
|
+
echo ".safeword/planning/" >> "$PROJECT_ROOT/.gitignore"
|
|
512
|
+
echo ".safeword/tickets/" >> "$PROJECT_ROOT/.gitignore"
|
|
513
|
+
echo "Added .safeword planning folders to .gitignore"
|
|
514
|
+
fi
|
|
515
|
+
|
|
516
|
+
# Add Claude Code ignores if not present
|
|
517
|
+
if ! grep -q "^\.claude/settings\.local\.json$" "$PROJECT_ROOT/.gitignore"; then
|
|
518
|
+
echo "" >> "$PROJECT_ROOT/.gitignore"
|
|
519
|
+
echo "# Claude Code - Personal settings" >> "$PROJECT_ROOT/.gitignore"
|
|
520
|
+
echo ".claude/settings.local.json" >> "$PROJECT_ROOT/.gitignore"
|
|
521
|
+
echo ".claude/todos/" >> "$PROJECT_ROOT/.gitignore"
|
|
522
|
+
echo ".claude/shell-snapshots/" >> "$PROJECT_ROOT/.gitignore"
|
|
523
|
+
echo "Added Claude Code ignores to .gitignore"
|
|
524
|
+
fi
|
|
525
|
+
fi
|
|
526
|
+
|
|
527
|
+
echo ""
|
|
528
|
+
echo "✓ Project setup complete!"
|
|
529
|
+
echo ""
|
|
530
|
+
echo "Structure created:"
|
|
531
|
+
echo " /SAFEWORD.md - Project configuration (references guides)"
|
|
532
|
+
echo " /.safeword/planning/user-stories/ - Active user stories"
|
|
533
|
+
echo " /.safeword/planning/user-stories/archive/ - Completed user stories"
|
|
534
|
+
echo " /.safeword/planning/test-definitions/ - Active test definitions"
|
|
535
|
+
echo " /.safeword/planning/test-definitions/archive/ - Completed test definitions"
|
|
536
|
+
echo " /.safeword/planning/design/ - Active design docs"
|
|
537
|
+
echo " /.safeword/planning/design/archive/ - Completed design docs"
|
|
538
|
+
echo " /.safeword/planning/issues/ - Active issues"
|
|
539
|
+
echo " /.safeword/planning/issues/archive/ - Completed issues"
|
|
540
|
+
echo " /.safeword/tickets/ - Active tickets"
|
|
541
|
+
echo " /.safeword/tickets/completed/ - Verified completed tickets"
|
|
542
|
+
echo " /.safeword/tickets/archived/ - Blocked/cancelled tickets"
|
|
543
|
+
echo " .gitignore - Updated to exclude planning folders"
|
|
544
|
+
echo ""
|
|
545
|
+
echo "Next steps:"
|
|
546
|
+
echo "1. Review and customize SAFEWORD.md (add project-specific context)"
|
|
547
|
+
echo "2. Create tickets in .safeword/tickets/ for major features"
|
|
548
|
+
echo "3. Create planning docs in .safeword/planning/"
|
|
549
|
+
echo "4. (Optional) Run setup-quality.sh for auto quality review hooks"
|
|
550
|
+
echo "5. (Optional) Run setup-claude.sh for additional Claude Code configuration"
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# Architecture Check CI Workflow
|
|
2
|
+
#
|
|
3
|
+
# Runs on pull requests to enforce architectural boundaries.
|
|
4
|
+
#
|
|
5
|
+
# Steps:
|
|
6
|
+
# 1. Type check (tsc --noEmit)
|
|
7
|
+
# 2. ESLint (includes eslint-plugin-boundaries)
|
|
8
|
+
# 3. LLM architecture review (optional, non-blocking)
|
|
9
|
+
#
|
|
10
|
+
# Usage:
|
|
11
|
+
# 1. Copy to .github/workflows/architecture-check.yml
|
|
12
|
+
# 2. Set ANTHROPIC_API_KEY secret (optional, for LLM review)
|
|
13
|
+
# 3. Adjust paths and triggers as needed
|
|
14
|
+
|
|
15
|
+
name: Architecture Check
|
|
16
|
+
|
|
17
|
+
on:
|
|
18
|
+
pull_request:
|
|
19
|
+
branches: [main, develop]
|
|
20
|
+
paths:
|
|
21
|
+
- 'src/**'
|
|
22
|
+
- 'package.json'
|
|
23
|
+
- 'tsconfig.json'
|
|
24
|
+
- 'eslint.config.mjs'
|
|
25
|
+
|
|
26
|
+
jobs:
|
|
27
|
+
architecture-check:
|
|
28
|
+
runs-on: ubuntu-latest
|
|
29
|
+
|
|
30
|
+
steps:
|
|
31
|
+
- name: Checkout
|
|
32
|
+
uses: actions/checkout@v4
|
|
33
|
+
|
|
34
|
+
- name: Setup Node.js
|
|
35
|
+
uses: actions/setup-node@v4
|
|
36
|
+
with:
|
|
37
|
+
node-version: '20'
|
|
38
|
+
cache: 'npm'
|
|
39
|
+
|
|
40
|
+
- name: Install dependencies
|
|
41
|
+
run: npm ci
|
|
42
|
+
|
|
43
|
+
# Step 1: Type check
|
|
44
|
+
- name: TypeScript Check
|
|
45
|
+
run: npx tsc --noEmit
|
|
46
|
+
continue-on-error: false
|
|
47
|
+
|
|
48
|
+
# Step 2: ESLint (includes boundary rules)
|
|
49
|
+
- name: ESLint
|
|
50
|
+
run: npm run lint
|
|
51
|
+
continue-on-error: false
|
|
52
|
+
|
|
53
|
+
# Step 3: LLM Architecture Review (optional)
|
|
54
|
+
# Only runs if ANTHROPIC_API_KEY is set
|
|
55
|
+
# Non-blocking by default (continue-on-error: true)
|
|
56
|
+
- name: Architecture Review (LLM)
|
|
57
|
+
if: ${{ secrets.ANTHROPIC_API_KEY != '' }}
|
|
58
|
+
env:
|
|
59
|
+
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
|
|
60
|
+
run: |
|
|
61
|
+
# Get changed files in this PR
|
|
62
|
+
CHANGED_FILES=$(git diff --name-only origin/${{ github.base_ref }}...HEAD | grep -E '\.(js|ts|tsx|jsx)$' || true)
|
|
63
|
+
|
|
64
|
+
if [ -n "$CHANGED_FILES" ]; then
|
|
65
|
+
echo "Reviewing changed files:"
|
|
66
|
+
echo "$CHANGED_FILES"
|
|
67
|
+
echo ""
|
|
68
|
+
|
|
69
|
+
# Run architecture review if script exists
|
|
70
|
+
if [ -f ".safeword/scripts/arch-review.sh" ]; then
|
|
71
|
+
echo "$CHANGED_FILES" | xargs bash .safeword/scripts/arch-review.sh || true
|
|
72
|
+
else
|
|
73
|
+
echo "arch-review.sh not found, skipping LLM review"
|
|
74
|
+
fi
|
|
75
|
+
else
|
|
76
|
+
echo "No JS/TS files changed"
|
|
77
|
+
fi
|
|
78
|
+
continue-on-error: true # Non-blocking (advisory only)
|