claude-dev-env 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +219 -0
- package/agents/agent-writer.md +157 -0
- package/agents/clasp-deployment-orchestrator.md +609 -0
- package/agents/clean-coder.md +295 -0
- package/agents/code-quality-agent.md +40 -0
- package/agents/code-standards-agent.md +93 -0
- package/agents/config-centralizer.md +686 -0
- package/agents/config-extraction-agent.md +225 -0
- package/agents/doc-orchestrator.md +47 -0
- package/agents/docs-agent.md +112 -0
- package/agents/docx-agent.md +211 -0
- package/agents/git-commit-crafter.md +100 -0
- package/agents/magic-value-eliminator-agent.md +72 -0
- package/agents/mandatory-agent-workflow-agent.md +88 -0
- package/agents/parallel-workflow-coordinator.md +779 -0
- package/agents/pdf-agent.md +302 -0
- package/agents/plan-executor.md +226 -0
- package/agents/pr-description-writer.md +87 -0
- package/agents/project-context-loader.md +238 -0
- package/agents/project-docs-analyzer.md +54 -0
- package/agents/project-structure-organizer-agent.md +72 -0
- package/agents/readability-review-agent.md +76 -0
- package/agents/refactoring-specialist.md +69 -0
- package/agents/right-sized-engineer.md +129 -0
- package/agents/session-continuity-manager.md +53 -0
- package/agents/skill-to-agent-converter.md +371 -0
- package/agents/skill-writer-agent.md +470 -0
- package/agents/stub-detector-agent.md +140 -0
- package/agents/tdd-test-writer.md +62 -0
- package/agents/test-data-builder.md +68 -0
- package/agents/tooling-builder.md +78 -0
- package/agents/user-docs-writer.md +67 -0
- package/agents/validation-expert.md +71 -0
- package/agents/workflow-visual-documenter.md +82 -0
- package/agents/xlsx-agent.md +169 -0
- package/bin/install.mjs +256 -0
- package/commands/commit.md +28 -0
- package/commands/docupdate.md +322 -0
- package/commands/implement.md +102 -0
- package/commands/initialize.md +91 -0
- package/commands/plan.md +63 -0
- package/commands/pr-comments.md +47 -0
- package/commands/readability-review.md +20 -0
- package/commands/review-plan.md +7 -0
- package/commands/right-size.md +15 -0
- package/commands/stubcheck.md +89 -0
- package/commands/sum.md +30 -0
- package/docs/CODE_RULES.md +186 -0
- package/docs/DJANGO_PATTERNS.md +80 -0
- package/docs/REACT_PATTERNS.md +185 -0
- package/docs/TEST_QUALITY.md +104 -0
- package/hooks/advisory/migration-safety-advisor.py +49 -0
- package/hooks/advisory/refactor-guard.py +205 -0
- package/hooks/blocking/block-main-commit.py +168 -0
- package/hooks/blocking/code-rules-enforcer.py +549 -0
- package/hooks/blocking/destructive-command-blocker.py +107 -0
- package/hooks/blocking/docker-settings-guard.py +44 -0
- package/hooks/blocking/hedging-language-blocker.py +130 -0
- package/hooks/blocking/parallel-task-blocker.py +69 -0
- package/hooks/blocking/pr-description-enforcer.py +87 -0
- package/hooks/blocking/pyautogui-scroll-blocker.py +74 -0
- package/hooks/blocking/sensitive-file-protector.py +70 -0
- package/hooks/blocking/tdd-enforcer.py +62 -0
- package/hooks/blocking/test-preflight-check.py +343 -0
- package/hooks/blocking/write-existing-file-blocker.py +63 -0
- package/hooks/git-hooks/post-commit.py +103 -0
- package/hooks/github-action/test_workflow.py +33 -0
- package/hooks/hooks.json +246 -0
- package/hooks/lifecycle/config-change-guard.py +84 -0
- package/hooks/lifecycle/session-end-cleanup.py +59 -0
- package/hooks/notification/attention-needed-notify.py +63 -0
- package/hooks/notification/claude-notification-handler.py +59 -0
- package/hooks/notification/notification_utils.py +206 -0
- package/hooks/rewrite-plugin-paths.py +116 -0
- package/hooks/session/bulk-edit-reminder.py +30 -0
- package/hooks/session/code-rules-reminder.py +97 -0
- package/hooks/session/compact-context-reinject.py +39 -0
- package/hooks/session/hook-structure-context.py +140 -0
- package/hooks/session/plugin-data-dir-cleanup.py +39 -0
- package/hooks/validation/code-style-validator.py +145 -0
- package/hooks/validation/e2e-test-validator.py +142 -0
- package/hooks/validation/hook-format-validator.py +66 -0
- package/hooks/validation/mypy_validator.py +180 -0
- package/hooks/validators/README.md +125 -0
- package/hooks/validators/VALIDATION_REPORT.md +287 -0
- package/hooks/validators/__init__.py +19 -0
- package/hooks/validators/abbreviation_checks.py +82 -0
- package/hooks/validators/code_quality_checks.py +133 -0
- package/hooks/validators/comment_checks.py +188 -0
- package/hooks/validators/file_structure_checks.py +182 -0
- package/hooks/validators/git_checks.py +107 -0
- package/hooks/validators/health_check.py +214 -0
- package/hooks/validators/magic_value_checks.py +81 -0
- package/hooks/validators/mypy_integration.py +52 -0
- package/hooks/validators/output_formatter.py +266 -0
- package/hooks/validators/pr_reference_checks.py +72 -0
- package/hooks/validators/python_antipattern_checks.py +110 -0
- package/hooks/validators/python_style_checks.py +364 -0
- package/hooks/validators/react_checks.py +90 -0
- package/hooks/validators/ruff_integration.py +80 -0
- package/hooks/validators/run_all_validators.py +772 -0
- package/hooks/validators/security_checks.py +135 -0
- package/hooks/validators/test_abbreviation_checks.py +76 -0
- package/hooks/validators/test_bad.tsx +7 -0
- package/hooks/validators/test_code_quality_checks.py +129 -0
- package/hooks/validators/test_file_structure_checks.py +307 -0
- package/hooks/validators/test_files/01_basic_component.tsx +10 -0
- package/hooks/validators/test_files/02_component_without_react.tsx +10 -0
- package/hooks/validators/test_files/03_pure_component.tsx +10 -0
- package/hooks/validators/test_files/04_pure_component_import.tsx +10 -0
- package/hooks/validators/test_files/05_typescript_generics.tsx +14 -0
- package/hooks/validators/test_files/06_typescript_two_generics.tsx +18 -0
- package/hooks/validators/test_files/07_multiline_declaration.tsx +11 -0
- package/hooks/validators/test_files/08_error_boundary_valid.tsx +14 -0
- package/hooks/validators/test_files/09_error_boundary_with_other_class.tsx +20 -0
- package/hooks/validators/test_files/10_inheritance_chain.tsx +16 -0
- package/hooks/validators/test_files/11_ts_file.ts +10 -0
- package/hooks/validators/test_files/12_non_react_class.tsx +14 -0
- package/hooks/validators/test_files/13_functional_component.tsx +8 -0
- package/hooks/validators/test_files/14_indented_class.tsx +13 -0
- package/hooks/validators/test_files/15_getDerivedStateFromError.tsx +14 -0
- package/hooks/validators/test_files/16_mixed_components.tsx +20 -0
- package/hooks/validators/test_files/EXECUTIVE_SUMMARY.md +175 -0
- package/hooks/validators/test_files/TEST_RESULTS_TABLE.txt +60 -0
- package/hooks/validators/test_files/VALIDATION_REPORT.md +201 -0
- package/hooks/validators/test_files/async_views.py +23 -0
- package/hooks/validators/test_files/async_with_imports.py +14 -0
- package/hooks/validators/test_files/bad_inline_imports.py +37 -0
- package/hooks/validators/test_files/management/commands/cmd_01_no_debug_check.py +10 -0
- package/hooks/validators/test_files/management/commands/cmd_02_proper_debug_check.py +14 -0
- package/hooks/validators/test_files/management/commands/cmd_03_debug_check_with_return.py +14 -0
- package/hooks/validators/test_files/management/commands/cmd_04_imported_DEBUG.py +14 -0
- package/hooks/validators/test_files/management/commands/cmd_05_debug_check_in_helper.py +16 -0
- package/hooks/validators/test_files/management/commands/cmd_06_debug_check_late.py +22 -0
- package/hooks/validators/test_files/management/commands/cmd_07_positive_debug_check.py +15 -0
- package/hooks/validators/test_files/management/commands/cmd_08_debug_with_and.py +14 -0
- package/hooks/validators/test_files/not_management_command.py +10 -0
- package/hooks/validators/test_files/skip_decorators/test_01_simple_skip.py +8 -0
- package/hooks/validators/test_files/skip_decorators/test_02_pytest_skipif.py +8 -0
- package/hooks/validators/test_files/skip_decorators/test_03_unittest_skipIf.py +8 -0
- package/hooks/validators/test_files/skip_decorators/test_04_skip_with_parens.py +8 -0
- package/hooks/validators/test_files/skip_decorators/test_05_xfail.py +7 -0
- package/hooks/validators/test_files/skip_decorators/test_06_custom_skip.py +11 -0
- package/hooks/validators/test_files/skip_decorators/test_07_capital_Skip.py +8 -0
- package/hooks/validators/test_files/skip_decorators/test_08_skipUnless.py +7 -0
- package/hooks/validators/test_files/skip_decorators/test_09_pytest_mark_skip_simple.py +7 -0
- package/hooks/validators/test_files/test_async_functions.py +45 -0
- package/hooks/validators/test_files/test_purecomponent/PureComponentExample.tsx +7 -0
- package/hooks/validators/test_files/test_purecomponent/ReactPureComponentExample.tsx +7 -0
- package/hooks/validators/test_git_checks.py +295 -0
- package/hooks/validators/test_good.tsx +5 -0
- package/hooks/validators/test_health_check.py +57 -0
- package/hooks/validators/test_magic_value_checks.py +63 -0
- package/hooks/validators/test_mypy_integration.py +27 -0
- package/hooks/validators/test_output_formatter.py +150 -0
- package/hooks/validators/test_pr_reference_checks.py +41 -0
- package/hooks/validators/test_python_antipattern_checks.py +113 -0
- package/hooks/validators/test_python_style_checks.py +439 -0
- package/hooks/validators/test_react_checks.py +213 -0
- package/hooks/validators/test_results.txt +25 -0
- package/hooks/validators/test_ruff_integration.py +27 -0
- package/hooks/validators/test_run_all_validators.py +228 -0
- package/hooks/validators/test_run_all_validators_integration.py +48 -0
- package/hooks/validators/test_safety_checks.py +243 -0
- package/hooks/validators/test_security_checks.py +105 -0
- package/hooks/validators/test_test_safety_checks.py +321 -0
- package/hooks/validators/test_todo_checks.py +39 -0
- package/hooks/validators/test_type_safety_checks.py +85 -0
- package/hooks/validators/test_useless_test_checks.py +55 -0
- package/hooks/validators/test_validator_base.py +26 -0
- package/hooks/validators/test_verify_paths.py +34 -0
- package/hooks/validators/todo_checks.py +59 -0
- package/hooks/validators/type_safety_checks.py +101 -0
- package/hooks/validators/useless_test_checks.py +92 -0
- package/hooks/validators/validator_base.py +19 -0
- package/hooks/validators/verify_paths.py +57 -0
- package/hooks/workflow/auto-formatter.py +114 -0
- package/hooks/workflow/investigation-tracker-reset.py +46 -0
- package/package.json +30 -0
- package/rules/agent-spawn-protocol.md +47 -0
- package/rules/cleanup-temp-files.md +27 -0
- package/rules/code-reviews.md +11 -0
- package/rules/code-standards.md +43 -0
- package/rules/conservative-action.md +20 -0
- package/rules/context7.md +12 -0
- package/rules/explore-thoroughly.md +27 -0
- package/rules/git-workflow.md +42 -0
- package/rules/parallel-tools.md +23 -0
- package/rules/research-mode.md +23 -0
- package/rules/right-sized-engineering.md +28 -0
- package/rules/tdd.md +7 -0
- package/rules/testing.md +12 -0
- package/skills/agent-prompt/SKILL.md +102 -0
- package/skills/anthropic-plan/SKILL.md +107 -0
- package/skills/everything-search/SKILL.md +144 -0
- package/skills/ingest/SKILL.md +40 -0
- package/skills/npm-creator/SKILL.md +183 -0
- package/skills/pr-review-responder/EXAMPLES.md +590 -0
- package/skills/pr-review-responder/PRINCIPLES.md +539 -0
- package/skills/pr-review-responder/README.md +209 -0
- package/skills/pr-review-responder/SKILL.md +202 -0
- package/skills/pr-review-responder/TESTING.md +407 -0
- package/skills/pr-review-responder/scripts/respond_to_reviews.py +376 -0
- package/skills/pr-review-responder/update_skill.py +297 -0
- package/skills/prompt-generator/REFERENCE.md +150 -0
- package/skills/prompt-generator/SKILL.md +154 -0
- package/skills/readability-review/SKILL.md +127 -0
- package/skills/recall/SKILL.md +27 -0
- package/skills/remember/SKILL.md +63 -0
- package/skills/rule-audit/SKILL.md +307 -0
- package/skills/rule-creator/SKILL.md +150 -0
- package/skills/skill-writer/REFERENCE.md +246 -0
- package/skills/skill-writer/SKILL.md +270 -0
- package/skills/tdd-team/SKILL.md +128 -0
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: npm-creator
|
|
3
|
+
description: Scaffold an npm-installable package for any Claude Code plugin repo. Detects plugin directories (rules/, hooks/, agents/, etc.), asks about package metadata, then generates package.json and a cross-platform Node.js installer (bin/install.mjs). Use when turning a plugin repo into an npx-installable package.
|
|
4
|
+
user_invocable: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# npm-creator
|
|
8
|
+
|
|
9
|
+
## Overview
|
|
10
|
+
|
|
11
|
+
Scaffold a cross-platform npm package for Claude Code plugin repos so users can install via `npx <package-name>`.
|
|
12
|
+
|
|
13
|
+
**Core principle:** The installer copies plugin files to ~/.claude/ using only Node.js built-ins. Zero external dependencies, works on Linux, macOS, and Windows.
|
|
14
|
+
|
|
15
|
+
**Announce at start:** "I'm using the npm-creator skill to scaffold an npm package for this plugin repo."
|
|
16
|
+
|
|
17
|
+
**Context:** Use after a plugin repo has its content files (rules, hooks, agents, etc.) in place. This skill adds the packaging layer on top.
|
|
18
|
+
|
|
19
|
+
## The Process
|
|
20
|
+
|
|
21
|
+
### Step 1: Detect Plugin Structure
|
|
22
|
+
|
|
23
|
+
Scan the current repo root for these directories:
|
|
24
|
+
|
|
25
|
+
| Directory | Purpose | Install destination |
|
|
26
|
+
|-----------|---------|-------------------|
|
|
27
|
+
| `rules/` | Behavioral rules (.md) | `~/.claude/rules/` |
|
|
28
|
+
| `docs/` | Reference documents (.md) | `~/.claude/docs/` |
|
|
29
|
+
| `commands/` | Slash commands (.md) | `~/.claude/commands/` |
|
|
30
|
+
| `agents/` | Agent definitions (.md) | `~/.claude/agents/` |
|
|
31
|
+
| `skills/` | Skill packages (subdirs) | `~/.claude/skills/` |
|
|
32
|
+
| `hooks/` | Hook scripts + hooks.json | Merge into `~/.claude/settings.json` |
|
|
33
|
+
|
|
34
|
+
Use Glob to find which directories exist and count files in each. Report findings to the user.
|
|
35
|
+
|
|
36
|
+
If the repo has no recognized directories, say so and ask if the structure uses different names.
|
|
37
|
+
|
|
38
|
+
### Step 2: Gather Package Metadata
|
|
39
|
+
|
|
40
|
+
Ask the user (use AskUserQuestion, one call with all questions):
|
|
41
|
+
|
|
42
|
+
1. **Package name** — suggest the repo directory name. Ask if scoped (@org/) or unscoped.
|
|
43
|
+
2. **Description** — suggest based on detected content ("Claude Code plugin with X rules, Y agents, Z hooks").
|
|
44
|
+
3. **CLAUDE.md generation** — should the installer concatenate rules + docs into a CLAUDE.md? (Yes if both rules/ and docs/ exist.)
|
|
45
|
+
4. **Python detection** — does the plugin use Python hooks? (Yes if hooks/ contains .py files.) If yes, the installer will detect python3/python/py at install time.
|
|
46
|
+
|
|
47
|
+
### Step 3: Generate package.json
|
|
48
|
+
|
|
49
|
+
Create `package.json` at the repo root with:
|
|
50
|
+
|
|
51
|
+
- `name`: from Step 2
|
|
52
|
+
- `version`: "1.0.0"
|
|
53
|
+
- `description`: from Step 2
|
|
54
|
+
- `type`: "module"
|
|
55
|
+
- `bin`: `{ "<package-name>": "./bin/install.mjs" }`
|
|
56
|
+
- `files`: array of detected directories + `["bin/"]`
|
|
57
|
+
- `keywords`: `["claude-code", "plugin", "cli"]`
|
|
58
|
+
- `license`: "MIT"
|
|
59
|
+
- `repository`: detect from `git remote get-url origin` if available
|
|
60
|
+
|
|
61
|
+
### Step 4: Generate bin/install.mjs
|
|
62
|
+
|
|
63
|
+
Create `bin/install.mjs` with a shebang (`#!/usr/bin/env node`) and these capabilities:
|
|
64
|
+
|
|
65
|
+
**Imports:** Only `node:fs`, `node:path`, `node:os`, `node:child_process`, `node:url`.
|
|
66
|
+
|
|
67
|
+
**Path resolution:**
|
|
68
|
+
- `CLAUDE_HOME` = `path.join(os.homedir(), '.claude')`
|
|
69
|
+
- `PACKAGE_ROOT` = resolve from `import.meta.url` using `fileURLToPath` and `path.dirname`
|
|
70
|
+
|
|
71
|
+
**Install mode (default — no flags):**
|
|
72
|
+
|
|
73
|
+
For each detected directory from Step 1:
|
|
74
|
+
- Copy files from package to CLAUDE_HOME, preserving directory structure
|
|
75
|
+
- For skills/, copy recursively (each skill is a subdirectory)
|
|
76
|
+
- For each file, log with status icon:
|
|
77
|
+
- New file: ` ✓ rules/tdd.md (new)`
|
|
78
|
+
- Existing file: ` ↻ rules/tdd.md (updated)`
|
|
79
|
+
|
|
80
|
+
If CLAUDE.md generation is enabled:
|
|
81
|
+
- Concatenate all rules/*.md under `# Project Rules (from <package-name> plugin)`
|
|
82
|
+
- Concatenate all docs/*.md under `# Reference Docs`
|
|
83
|
+
- Each file gets an `## {filename without extension}` header
|
|
84
|
+
- Write to `CLAUDE_HOME/CLAUDE.md`
|
|
85
|
+
|
|
86
|
+
If Python hooks detected:
|
|
87
|
+
- Try `python3 --version`, then `python --version` (verify Python 3), then `py -3 --version`
|
|
88
|
+
- Use the first that succeeds
|
|
89
|
+
- If none work: print error and exit with code 1
|
|
90
|
+
|
|
91
|
+
If hooks/hooks.json exists:
|
|
92
|
+
- Read it and the destination `CLAUDE_HOME/settings.json` (create `{}` if missing)
|
|
93
|
+
- For each event type, for each matcher group:
|
|
94
|
+
- Replace `python3` with detected python command (if applicable)
|
|
95
|
+
- Replace `${CLAUDE_PLUGIN_ROOT}` with the absolute CLAUDE_HOME hooks path
|
|
96
|
+
- Check for duplicate matcher groups (idempotent — skip if already present)
|
|
97
|
+
- Append new groups
|
|
98
|
+
- Write settings.json with `JSON.stringify(data, null, 4)`
|
|
99
|
+
|
|
100
|
+
Print summary:
|
|
101
|
+
```
|
|
102
|
+
Installed <package-name>:
|
|
103
|
+
Rules: N files (X new, Y updated)
|
|
104
|
+
Agents: N files (X new, Y updated)
|
|
105
|
+
Hooks: N groups merged into settings.json
|
|
106
|
+
Python: python3
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
**Uninstall mode (`--uninstall` flag):**
|
|
110
|
+
- Remove only files matching the package's file list (never delete user-created files)
|
|
111
|
+
- Log each removal: ` ✗ rules/tdd.md (removed)`
|
|
112
|
+
- Remove hook entries from settings.json by matching command paths
|
|
113
|
+
- Remove generated CLAUDE.md if it exists
|
|
114
|
+
- Print removal summary
|
|
115
|
+
|
|
116
|
+
**Error handling:**
|
|
117
|
+
- Create CLAUDE_HOME with `fs.mkdirSync(path, { recursive: true })` if missing
|
|
118
|
+
- If settings.json is malformed JSON, print error and exit (never clobber)
|
|
119
|
+
- Skip missing source directories with a warning
|
|
120
|
+
|
|
121
|
+
### Step 5: Update README.md
|
|
122
|
+
|
|
123
|
+
If a README.md exists, offer to update the install section with:
|
|
124
|
+
|
|
125
|
+
```
|
|
126
|
+
## Install
|
|
127
|
+
|
|
128
|
+
\`\`\`bash
|
|
129
|
+
npx <package-name>
|
|
130
|
+
\`\`\`
|
|
131
|
+
|
|
132
|
+
To uninstall:
|
|
133
|
+
|
|
134
|
+
\`\`\`bash
|
|
135
|
+
npx <package-name> --uninstall
|
|
136
|
+
\`\`\`
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
Preserve all other README content.
|
|
140
|
+
|
|
141
|
+
## Output Format
|
|
142
|
+
|
|
143
|
+
Two new files created:
|
|
144
|
+
1. `package.json` at repo root
|
|
145
|
+
2. `bin/install.mjs` at bin/ directory
|
|
146
|
+
|
|
147
|
+
One file optionally updated:
|
|
148
|
+
3. `README.md` install section
|
|
149
|
+
|
|
150
|
+
## After Completion
|
|
151
|
+
|
|
152
|
+
Suggest the user test locally:
|
|
153
|
+
- `node bin/install.mjs` (install)
|
|
154
|
+
- `node bin/install.mjs --uninstall` (uninstall)
|
|
155
|
+
- Verify files appeared in `~/.claude/`
|
|
156
|
+
- Verify hooks merged into `~/.claude/settings.json`
|
|
157
|
+
|
|
158
|
+
When ready to publish: `npm publish`
|
|
159
|
+
|
|
160
|
+
## Red Flags - STOP
|
|
161
|
+
|
|
162
|
+
- Repo has no recognized plugin directories (rules/, hooks/, agents/, etc.)
|
|
163
|
+
- hooks.json references tools or paths outside the plugin structure
|
|
164
|
+
- Package name conflicts with an existing npm package (suggest checking npmjs.com)
|
|
165
|
+
- Plugin files contain secrets or credentials that would be published
|
|
166
|
+
|
|
167
|
+
## Rationalization Prevention
|
|
168
|
+
|
|
169
|
+
| Excuse | Reality |
|
|
170
|
+
|--------|---------|
|
|
171
|
+
| "I'll add cross-platform support later" | Use path.join() and os.homedir() from the start. Retrofitting is painful. |
|
|
172
|
+
| "Shell commands are simpler for file copying" | Shell commands break on Windows. fs APIs work everywhere. |
|
|
173
|
+
| "One big install function is fine" | Separate install/uninstall/detect functions keep each under 50 lines. |
|
|
174
|
+
| "We can skip idempotency" | Users will run the installer multiple times. Duplicate hooks break sessions. |
|
|
175
|
+
|
|
176
|
+
## Remember
|
|
177
|
+
|
|
178
|
+
- Zero external dependencies — only Node.js built-ins
|
|
179
|
+
- hooks.json in the repo stays canonical (python3 + ${CLAUDE_PLUGIN_ROOT})
|
|
180
|
+
- Rewriting happens only in the destination settings.json
|
|
181
|
+
- path.join() everywhere — never concatenate paths with `/` or `\`
|
|
182
|
+
- Idempotent: running twice produces the same result
|
|
183
|
+
- Log every file action so the user sees what changed
|