azclaude-copilot 0.4.9 → 0.4.10

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "azclaude-copilot",
3
- "version": "0.4.9",
3
+ "version": "0.4.10",
4
4
  "description": "AI coding environment — 26 commands, 8 skills, 10 agents, memory, reflexes, evolution. Install: npm install -g azclaude-copilot@latest, then in Claude Code: azclaude-copilot setup --full",
5
5
  "bin": {
6
6
  "azclaude": "bin/cli.js",
@@ -16,6 +16,26 @@ If `.claude/agents/orchestrator.md` does not exist (fallback — run built-in lo
16
16
 
17
17
  ---
18
18
 
19
+ ## Step 0: Intent Check
20
+
21
+ Check if `.claude/copilot-intent.md` exists:
22
+ ```bash
23
+ ls .claude/copilot-intent.md 2>/dev/null && echo "intent=found" || echo "intent=missing"
24
+ ```
25
+
26
+ If `intent=missing`:
27
+ ```
28
+ ⚠ No copilot-intent.md found.
29
+
30
+ Run /dream first to define your product? (recommended — provides test strategy, done criteria, deployment target)
31
+ Or continue inferring intent from CLAUDE.md? (faster, less precise for complex projects)
32
+
33
+ Proceeding without copilot-intent.md — inferring from CLAUDE.md and plan.md.
34
+ ```
35
+ Continue to Step 1 either way — do NOT block. Log the absence in goals.md as a note.
36
+
37
+ ---
38
+
19
39
  ## Step 1: Read State
20
40
 
21
41
  Read these files (skip any that don't exist):
@@ -35,7 +35,7 @@ ls .claude/agents/loop-controller.md 2>/dev/null
35
35
  **If loop-controller.md exists**: delegate evolution work to it via Agent tool:
36
36
  ```
37
37
  Run a full evolution cycle: re-derivation check, then Cycle 1 (detect/generate/evaluate),
38
- Cycle 2 (knowledge consolidation if 3+ sessions), Cycle 3 (topology if friction detected).
38
+ Cycle 2 (knowledge consolidation if 2+ sessions), Cycle 3 (topology if friction detected).
39
39
  Show the full cycle report when done.
40
40
  ```
41
41
  **After loop-controller finishes**: continue to Step 7 (Generate Project-Specific Skills and Agents).
@@ -77,6 +77,8 @@ Compute SHA-256 of the `hooks` key in settings.json and compare.
77
77
  - Mismatch → +0 pts — **BLOCK** "Hook integrity mismatch — hooks modified outside AZCLAUDE"
78
78
  - Missing integrity file → +15 pts — "No integrity baseline (run `npx azclaude install` to establish one)"
79
79
 
80
+ Note: AZCLAUDE registers hooks in `.claude/settings.local.json` (project-level), not `~/.claude/settings.json` (global). The integrity baseline must be computed against `settings.local.json` — comparing against global settings will always produce a hash mismatch (MEDIUM finding).
81
+
80
82
  Check each hook script for dangerous patterns:
81
83
  ```bash
82
84
  ls .claude/hooks/ 2>/dev/null || ls "$HOME/.claude/hooks/" 2>/dev/null
@@ -119,7 +121,10 @@ Score: start at 20, subtract per finding: HIGH −8, MEDIUM −3, LOW −1 (floo
119
121
 
120
122
  ```bash
121
123
  cat .mcp.json 2>/dev/null
122
- cat "$HOME/.claude/mcp.json" 2>/dev/null
124
+ # Windows: %APPDATA%\Claude\mcp.json — Unix/Mac: ~/.claude/mcp.json
125
+ MCP_GLOBAL="${APPDATA:+$APPDATA/Claude/mcp.json}"
126
+ MCP_GLOBAL="${MCP_GLOBAL:-$HOME/.claude/mcp.json}"
127
+ cat "$MCP_GLOBAL" 2>/dev/null
123
128
  ```
124
129
 
125
130
  For each MCP server entry, check:
@@ -181,6 +186,10 @@ Also scan for:
181
186
  - `sk_live_` (Stripe secret), `SG\.` (SendGrid)
182
187
  - `-----BEGIN.*PRIVATE KEY` (private keys)
183
188
 
189
+ **IMPORTANT — Secret redaction in output:** Never print full secret values in the report.
190
+ Always truncate: show first 8 chars + `...` + last 3 chars. Example: `AIzaSyCM...VNM`.
191
+ The report may be logged, shared, or appear in conversation transcripts.
192
+
184
193
  If `.env` exists: check it is in `.gitignore`:
185
194
  ```bash
186
195
  grep -q "\.env" .gitignore 2>/dev/null && echo ".env gitignored: yes" || echo ".env gitignored: NO"
@@ -41,7 +41,7 @@ If problem-architect not installed OR git diff is only docs/config: skip and pro
41
41
  ```bash
42
42
  ls .claude/agents/security-auditor.md 2>/dev/null && echo "agent=found" || echo "agent=missing"
43
43
  ```
44
- If `agent=found`: spawn `security-auditor` agent. If verdict is `BLOCKED` → STOP.
44
+ If `agent=found`: read `.claude/agents/security-auditor.md` and execute the secrets scan inline using its rules. If verdict is `BLOCKED` → STOP.
45
45
  ```
46
46
  ✗ Pre-ship blocked: security-auditor found BLOCKED findings. Run /sentinel for details.
47
47
  ```
@@ -221,3 +221,26 @@ try { fs.writeFileSync(counterPath, String(editCount)); } catch (_) {}
221
221
  if (editCount > 0 && editCount % 15 === 0) {
222
222
  process.stdout.write(`\n⚠ ${editCount} edits this session — run /snapshot before context compaction loses your reasoning\n`);
223
223
  }
224
+
225
+ // ── Rapid-edit detection — same file edited 5+ times in <5 min ───────────────
226
+ // Signal: unclear spec before coding. Warn once, suggest /blueprint.
227
+ if (isFileTool && rel) {
228
+ const rapidPath = path.join(os.tmpdir(), `.azclaude-rapid-${process.ppid || process.pid}`);
229
+ let rapidLog = {};
230
+ try { rapidLog = JSON.parse(fs.readFileSync(rapidPath, 'utf8')); } catch (_) {}
231
+ const fileLog = rapidLog[rel] || { count: 0, firstTs: Date.now(), warned: false };
232
+ const elapsed = Date.now() - fileLog.firstTs;
233
+ if (elapsed > 5 * 60 * 1000) {
234
+ // Reset window
235
+ rapidLog[rel] = { count: 1, firstTs: Date.now(), warned: false };
236
+ } else {
237
+ fileLog.count += 1;
238
+ if (fileLog.count >= 5 && !fileLog.warned) {
239
+ fileLog.warned = true;
240
+ const shortName = path.basename(rel);
241
+ process.stdout.write(`\n⚠ ${fileLog.count} edits to ${shortName} in ${Math.round(elapsed/60000)}min — unclear spec? Consider /blueprint before continuing\n`);
242
+ }
243
+ rapidLog[rel] = fileLog;
244
+ }
245
+ try { fs.writeFileSync(rapidPath, JSON.stringify(rapidLog)); } catch (_) {}
246
+ }