@fredcallagan/arn-spark 5.1.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/.claude-plugin/plugin.json +9 -0
- package/.opencode/plugins/arn-spark.js +272 -0
- package/package.json +17 -0
- package/plugins/arn-spark/.claude-plugin/plugin.json +9 -0
- package/plugins/arn-spark/LICENSE +21 -0
- package/plugins/arn-spark/README.md +25 -0
- package/plugins/arn-spark/agents/arn-spark-brand-strategist.md +299 -0
- package/plugins/arn-spark/agents/arn-spark-dev-env-builder.md +228 -0
- package/plugins/arn-spark/agents/arn-spark-doctor.md +92 -0
- package/plugins/arn-spark/agents/arn-spark-forensic-investigator.md +181 -0
- package/plugins/arn-spark/agents/arn-spark-market-researcher.md +232 -0
- package/plugins/arn-spark/agents/arn-spark-marketing-pm.md +225 -0
- package/plugins/arn-spark/agents/arn-spark-persona-architect.md +259 -0
- package/plugins/arn-spark/agents/arn-spark-persona-impersonator.md +183 -0
- package/plugins/arn-spark/agents/arn-spark-product-strategist.md +191 -0
- package/plugins/arn-spark/agents/arn-spark-prototype-builder.md +497 -0
- package/plugins/arn-spark/agents/arn-spark-scaffolder.md +228 -0
- package/plugins/arn-spark/agents/arn-spark-spike-runner.md +209 -0
- package/plugins/arn-spark/agents/arn-spark-style-capture.md +196 -0
- package/plugins/arn-spark/agents/arn-spark-tech-evaluator.md +229 -0
- package/plugins/arn-spark/agents/arn-spark-ui-interactor.md +235 -0
- package/plugins/arn-spark/agents/arn-spark-use-case-writer.md +280 -0
- package/plugins/arn-spark/agents/arn-spark-ux-judge.md +215 -0
- package/plugins/arn-spark/agents/arn-spark-ux-specialist.md +200 -0
- package/plugins/arn-spark/agents/arn-spark-visual-sketcher.md +285 -0
- package/plugins/arn-spark/agents/arn-spark-visual-test-engineer.md +224 -0
- package/plugins/arn-spark/references/copilot-tools.md +62 -0
- package/plugins/arn-spark/skills/arn-brainstorming/SKILL.md +520 -0
- package/plugins/arn-spark/skills/arn-brainstorming/references/add-feature-flow.md +155 -0
- package/plugins/arn-spark/skills/arn-spark-arch-vision/SKILL.md +226 -0
- package/plugins/arn-spark/skills/arn-spark-arch-vision/references/architecture-vision-template.md +153 -0
- package/plugins/arn-spark/skills/arn-spark-arch-vision/references/technology-evaluation-guide.md +86 -0
- package/plugins/arn-spark/skills/arn-spark-clickable-prototype/SKILL.md +471 -0
- package/plugins/arn-spark/skills/arn-spark-clickable-prototype/references/clickable-prototype-criteria.md +65 -0
- package/plugins/arn-spark/skills/arn-spark-clickable-prototype/references/journey-template.md +62 -0
- package/plugins/arn-spark/skills/arn-spark-clickable-prototype/references/review-report-template.md +75 -0
- package/plugins/arn-spark/skills/arn-spark-clickable-prototype/references/showcase-capture-guide.md +213 -0
- package/plugins/arn-spark/skills/arn-spark-clickable-prototype-teams/SKILL.md +642 -0
- package/plugins/arn-spark/skills/arn-spark-clickable-prototype-teams/references/debate-protocol.md +242 -0
- package/plugins/arn-spark/skills/arn-spark-clickable-prototype-teams/references/debate-review-report-template.md +161 -0
- package/plugins/arn-spark/skills/arn-spark-clickable-prototype-teams/references/expert-interaction-review-template.md +152 -0
- package/plugins/arn-spark/skills/arn-spark-concept-review/SKILL.md +350 -0
- package/plugins/arn-spark/skills/arn-spark-concept-review/references/conflict-resolution-protocol.md +145 -0
- package/plugins/arn-spark/skills/arn-spark-concept-review/references/review-report-template.md +185 -0
- package/plugins/arn-spark/skills/arn-spark-dev-setup/SKILL.md +366 -0
- package/plugins/arn-spark/skills/arn-spark-dev-setup/references/dev-setup-checklist.md +84 -0
- package/plugins/arn-spark/skills/arn-spark-dev-setup/references/dev-setup-template.md +205 -0
- package/plugins/arn-spark/skills/arn-spark-discover/SKILL.md +303 -0
- package/plugins/arn-spark/skills/arn-spark-discover/references/competitive-landscape-template.md +87 -0
- package/plugins/arn-spark/skills/arn-spark-discover/references/discovery-questions.md +120 -0
- package/plugins/arn-spark/skills/arn-spark-discover/references/persona-profile-template.md +97 -0
- package/plugins/arn-spark/skills/arn-spark-discover/references/product-concept-template.md +253 -0
- package/plugins/arn-spark/skills/arn-spark-ensure-config/SKILL.md +23 -0
- package/plugins/arn-spark/skills/arn-spark-ensure-config/references/ensure-config.md +388 -0
- package/plugins/arn-spark/skills/arn-spark-ensure-config/references/step-0-fast-path.md +25 -0
- package/plugins/arn-spark/skills/arn-spark-ensure-config/scripts/cache-check.sh +127 -0
- package/plugins/arn-spark/skills/arn-spark-feature-extract/SKILL.md +483 -0
- package/plugins/arn-spark/skills/arn-spark-feature-extract/references/feature-backlog-template.md +176 -0
- package/plugins/arn-spark/skills/arn-spark-feature-extract/references/feature-entry-template.md +209 -0
- package/plugins/arn-spark/skills/arn-spark-help/SKILL.md +149 -0
- package/plugins/arn-spark/skills/arn-spark-help/references/pipeline-map.md +211 -0
- package/plugins/arn-spark/skills/arn-spark-init/SKILL.md +312 -0
- package/plugins/arn-spark/skills/arn-spark-init/references/agent-models-presets/all-opus.md +23 -0
- package/plugins/arn-spark/skills/arn-spark-init/references/agent-models-presets/balanced.md +23 -0
- package/plugins/arn-spark/skills/arn-spark-init/references/bkt-setup.md +55 -0
- package/plugins/arn-spark/skills/arn-spark-init/references/jira-mcp-setup.md +61 -0
- package/plugins/arn-spark/skills/arn-spark-init/references/platform-labels.md +97 -0
- package/plugins/arn-spark/skills/arn-spark-naming/SKILL.md +275 -0
- package/plugins/arn-spark/skills/arn-spark-naming/references/creative-brief-template.md +146 -0
- package/plugins/arn-spark/skills/arn-spark-naming/references/naming-methodology.md +237 -0
- package/plugins/arn-spark/skills/arn-spark-naming/references/naming-report-template.md +122 -0
- package/plugins/arn-spark/skills/arn-spark-naming/references/trademark-databases.md +88 -0
- package/plugins/arn-spark/skills/arn-spark-naming/references/whois-server-map.md +164 -0
- package/plugins/arn-spark/skills/arn-spark-naming/scripts/whois-check.js +502 -0
- package/plugins/arn-spark/skills/arn-spark-naming/scripts/whois-check.py +533 -0
- package/plugins/arn-spark/skills/arn-spark-prototype-lock/SKILL.md +260 -0
- package/plugins/arn-spark/skills/arn-spark-prototype-lock/references/lock-report-template.md +68 -0
- package/plugins/arn-spark/skills/arn-spark-prototype-lock/references/pretooluse-hook-template.json +35 -0
- package/plugins/arn-spark/skills/arn-spark-prototype-lock/references/prototype-guardrail-rules.md +38 -0
- package/plugins/arn-spark/skills/arn-spark-report/SKILL.md +144 -0
- package/plugins/arn-spark/skills/arn-spark-report/references/issue-template.md +81 -0
- package/plugins/arn-spark/skills/arn-spark-report/references/spark-knowledge-base.md +293 -0
- package/plugins/arn-spark/skills/arn-spark-scaffold/SKILL.md +239 -0
- package/plugins/arn-spark/skills/arn-spark-scaffold/references/scaffold-checklist.md +79 -0
- package/plugins/arn-spark/skills/arn-spark-scaffold/references/scaffold-summary-template.md +74 -0
- package/plugins/arn-spark/skills/arn-spark-spike/SKILL.md +209 -0
- package/plugins/arn-spark/skills/arn-spark-spike/references/spike-report-template.md +123 -0
- package/plugins/arn-spark/skills/arn-spark-static-prototype/SKILL.md +362 -0
- package/plugins/arn-spark/skills/arn-spark-static-prototype/references/review-report-template.md +65 -0
- package/plugins/arn-spark/skills/arn-spark-static-prototype/references/showcase-capture-guide.md +153 -0
- package/plugins/arn-spark/skills/arn-spark-static-prototype/references/static-prototype-criteria.md +54 -0
- package/plugins/arn-spark/skills/arn-spark-static-prototype-teams/SKILL.md +518 -0
- package/plugins/arn-spark/skills/arn-spark-static-prototype-teams/references/debate-protocol.md +230 -0
- package/plugins/arn-spark/skills/arn-spark-static-prototype-teams/references/debate-review-report-template.md +148 -0
- package/plugins/arn-spark/skills/arn-spark-static-prototype-teams/references/expert-visual-review-template.md +130 -0
- package/plugins/arn-spark/skills/arn-spark-stress-competitive/SKILL.md +166 -0
- package/plugins/arn-spark/skills/arn-spark-stress-competitive/references/competitive-report-template.md +139 -0
- package/plugins/arn-spark/skills/arn-spark-stress-competitive/references/gap-analysis-framework.md +111 -0
- package/plugins/arn-spark/skills/arn-spark-stress-interview/SKILL.md +257 -0
- package/plugins/arn-spark/skills/arn-spark-stress-interview/references/interview-protocol.md +140 -0
- package/plugins/arn-spark/skills/arn-spark-stress-interview/references/interview-report-template.md +165 -0
- package/plugins/arn-spark/skills/arn-spark-stress-interview/references/persona-casting-spec.md +138 -0
- package/plugins/arn-spark/skills/arn-spark-stress-premortem/SKILL.md +181 -0
- package/plugins/arn-spark/skills/arn-spark-stress-premortem/references/premortem-protocol.md +112 -0
- package/plugins/arn-spark/skills/arn-spark-stress-premortem/references/premortem-report-template.md +158 -0
- package/plugins/arn-spark/skills/arn-spark-stress-prfaq/SKILL.md +206 -0
- package/plugins/arn-spark/skills/arn-spark-stress-prfaq/references/prfaq-report-template.md +139 -0
- package/plugins/arn-spark/skills/arn-spark-stress-prfaq/references/prfaq-workflow.md +118 -0
- package/plugins/arn-spark/skills/arn-spark-style-explore/SKILL.md +281 -0
- package/plugins/arn-spark/skills/arn-spark-style-explore/references/style-brief-template.md +198 -0
- package/plugins/arn-spark/skills/arn-spark-use-cases/SKILL.md +359 -0
- package/plugins/arn-spark/skills/arn-spark-use-cases/references/expert-review-template.md +94 -0
- package/plugins/arn-spark/skills/arn-spark-use-cases/references/review-protocol.md +150 -0
- package/plugins/arn-spark/skills/arn-spark-use-cases/references/use-case-index-template.md +108 -0
- package/plugins/arn-spark/skills/arn-spark-use-cases/references/use-case-template.md +125 -0
- package/plugins/arn-spark/skills/arn-spark-use-cases-teams/SKILL.md +306 -0
- package/plugins/arn-spark/skills/arn-spark-use-cases-teams/references/debate-protocol.md +272 -0
- package/plugins/arn-spark/skills/arn-spark-use-cases-teams/references/review-report-template.md +112 -0
- package/plugins/arn-spark/skills/arn-spark-visual-readiness/SKILL.md +293 -0
- package/plugins/arn-spark/skills/arn-spark-visual-readiness/references/readiness-checklist.md +196 -0
- package/plugins/arn-spark/skills/arn-spark-visual-sketch/SKILL.md +376 -0
- package/plugins/arn-spark/skills/arn-spark-visual-sketch/references/aesthetic-philosophy.md +210 -0
- package/plugins/arn-spark/skills/arn-spark-visual-sketch/references/sketch-gallery-guide.md +282 -0
- package/plugins/arn-spark/skills/arn-spark-visual-sketch/references/visual-direction-template.md +174 -0
- package/plugins/arn-spark/skills/arn-spark-visual-strategy/SKILL.md +447 -0
- package/plugins/arn-spark/skills/arn-spark-visual-strategy/references/baseline-capture-script-template.js +89 -0
- package/plugins/arn-spark/skills/arn-spark-visual-strategy/references/journey-schema.md +375 -0
- package/plugins/arn-spark/skills/arn-spark-visual-strategy/references/spike-checklist.md +122 -0
- package/plugins/arn-spark/skills/arn-spark-visual-strategy/references/strategy-layers-guide.md +132 -0
- package/plugins/arn-spark/skills/arn-spark-visual-strategy/references/visual-strategy-template.md +141 -0
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: arn-spark-prototype-lock
|
|
3
|
+
description: >-
|
|
4
|
+
This skill should be used when the user says "prototype lock", "lock prototype",
|
|
5
|
+
"arn prototype lock", "freeze prototype", "preserve prototype",
|
|
6
|
+
"snapshot prototype", "protect prototype", "archive prototype",
|
|
7
|
+
"save the prototype", "don't overwrite the prototype",
|
|
8
|
+
"lock the design", "freeze the design",
|
|
9
|
+
or wants to create a frozen snapshot of the validated prototype before
|
|
10
|
+
development begins, preventing production code from overwriting the
|
|
11
|
+
validated reference artifact.
|
|
12
|
+
version: 1.0.0
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# Arness Prototype Lock
|
|
16
|
+
|
|
17
|
+
Create a frozen, independently servable snapshot of the validated prototype before development code begins to modify shared source files. The primary artifacts are a **frozen prototype copy**, **arness.md guardrail rules** that prevent agents from modifying prototype files, an optional **PreToolUse hook** for enforcement, and a **git tag** marking the prototype completion point.
|
|
18
|
+
|
|
19
|
+
This skill addresses the problem: once development starts, production code overwrites prototype components because they share the same source files. The locked copy preserves the validated design reference for visual comparison and rollback.
|
|
20
|
+
|
|
21
|
+
## Prerequisites
|
|
22
|
+
|
|
23
|
+
Read the project's `arness.md` for a `## Arness` section. If no `## Arness` section exists or Arness Spark fields are missing, inform the user: "Arness Spark is not configured for this project yet. Run `/arn-brainstorming` to get started — it will set everything up automatically." Do not proceed without it.
|
|
24
|
+
|
|
25
|
+
Extract:
|
|
26
|
+
- **Prototypes directory** (default: `.arness/prototypes`)
|
|
27
|
+
- **Vision directory** (default: `.arness/vision`)
|
|
28
|
+
- **Git** (yes/no)
|
|
29
|
+
- **Platform** (github/bitbucket/none)
|
|
30
|
+
|
|
31
|
+
Check for prototype validation evidence:
|
|
32
|
+
1. Check for `[prototypes-dir]/clickable/final-report.md` -- if found, read it. Extract the latest version number and judge verdict.
|
|
33
|
+
2. Check for `[prototypes-dir]/static/final-report.md` -- same.
|
|
34
|
+
3. Check for `[prototypes-dir]/criteria.md`
|
|
35
|
+
|
|
36
|
+
**If no prototype validation evidence found:** Inform the user: "No prototype validation results found. This skill works best after `/arn-spark-clickable-prototype` or `/arn-spark-static-prototype` has validated a prototype. You can still lock any existing prototype files. What prototype source should I preserve?"
|
|
37
|
+
|
|
38
|
+
**If validation found but judge verdict was FAIL:** Warn the user: "The latest prototype version (v[N]) received a FAIL verdict from the judge. Are you sure you want to lock this version, or would you prefer to run more validation cycles first?"
|
|
39
|
+
|
|
40
|
+
Check for architecture vision to detect the stack:
|
|
41
|
+
1. Read `architecture-vision.md` from the Vision directory
|
|
42
|
+
2. Extract: UI framework (Svelte/SvelteKit, React/Next.js, Vue/Nuxt, etc.), application framework (Tauri, Electron, plain web), package manager
|
|
43
|
+
|
|
44
|
+
## Workflow
|
|
45
|
+
|
|
46
|
+
### Step 1: Inventory Prototype Artifacts
|
|
47
|
+
|
|
48
|
+
Scan the prototypes directory structure. Build an inventory:
|
|
49
|
+
|
|
50
|
+
"I found the following prototype artifacts:
|
|
51
|
+
|
|
52
|
+
**Clickable prototype:**
|
|
53
|
+
- Latest version: v[N] (Judge: [PASS/FAIL])
|
|
54
|
+
- App source: [prototypes-dir]/clickable/v[N]/app/ ([X] files, [Y] KB)
|
|
55
|
+
- Journey screenshots: [prototypes-dir]/clickable/v[N]/journeys/ ([Z] files)
|
|
56
|
+
- Showcase: [prototypes-dir]/clickable/v[N]/showcase/ ([W] files)
|
|
57
|
+
- Review/judge reports: [list]
|
|
58
|
+
|
|
59
|
+
**Static prototype:**
|
|
60
|
+
- Latest version: v[M] (Judge: [PASS/FAIL])
|
|
61
|
+
- Showcase: [prototypes-dir]/static/v[M]/showcase/ ([A] files)
|
|
62
|
+
- Review/judge reports: [list]
|
|
63
|
+
|
|
64
|
+
**Shared:**
|
|
65
|
+
- Criteria: [prototypes-dir]/criteria.md
|
|
66
|
+
|
|
67
|
+
**Total size:** [calculated total]
|
|
68
|
+
|
|
69
|
+
Which version should I lock? (Default: latest passing version)"
|
|
70
|
+
|
|
71
|
+
Wait for user to confirm or specify a different version before proceeding. Do not continue until the user responds.
|
|
72
|
+
|
|
73
|
+
### Step 2: Detect Stack and Plan Copy Strategy
|
|
74
|
+
|
|
75
|
+
Read the prototype app directory and detect the framework:
|
|
76
|
+
- Check for `package.json` -- read for framework indicators (svelte, react, vue, next, nuxt, sveltekit)
|
|
77
|
+
- Check for `Cargo.toml` if Tauri
|
|
78
|
+
- Check for build configuration files (vite.config, next.config, svelte.config, etc.)
|
|
79
|
+
|
|
80
|
+
Determine copy strategy based on stack:
|
|
81
|
+
|
|
82
|
+
| Framework | Copy Strategy | Validation |
|
|
83
|
+
|-----------|--------------|------------|
|
|
84
|
+
| SvelteKit | Copy full app directory, exclude node_modules. Include package.json, lockfile, svelte.config, vite.config, tailwind.config, src/, static/ | `cd [dest] && [pm] install && [pm] run build` |
|
|
85
|
+
| Next.js | Copy full app directory, exclude node_modules and .next/. Include package.json, lockfile, next.config, tsconfig, src/, public/ | `cd [dest] && [pm] install && [pm] run build` |
|
|
86
|
+
| Vue/Nuxt | Copy full app directory, exclude node_modules and .nuxt/. Include package.json, lockfile, nuxt.config, src/ | `cd [dest] && [pm] install && [pm] run build` |
|
|
87
|
+
| Plain HTML/CSS/JS | Copy all files directly | Open index.html in browser or serve with `npx serve` |
|
|
88
|
+
| Tauri | Copy the webview source (follows its own framework row above). Copy src-tauri/ config only if relevant to the UI snapshot | Framework-specific build (webview only) |
|
|
89
|
+
|
|
90
|
+
Present the plan:
|
|
91
|
+
|
|
92
|
+
"**Stack detected:** [framework]
|
|
93
|
+
|
|
94
|
+
**Copy plan:**
|
|
95
|
+
- Source: [prototypes-dir]/clickable/v[N]/app/
|
|
96
|
+
- Destination: [prototypes-dir]/locked/clickable-v[N]/
|
|
97
|
+
- Strategy: [framework-specific description]
|
|
98
|
+
- Excludes: node_modules/, build output dirs (.svelte-kit/, .next/, dist/)
|
|
99
|
+
- Includes: lockfile (package-lock.json/pnpm-lock.yaml/yarn.lock/bun.lockb), all config, all source
|
|
100
|
+
|
|
101
|
+
Also copying:
|
|
102
|
+
- Validation evidence (review reports, judge reports, screenshots, showcase)
|
|
103
|
+
- Criteria document
|
|
104
|
+
|
|
105
|
+
Proceed?"
|
|
106
|
+
|
|
107
|
+
Wait for user confirmation.
|
|
108
|
+
|
|
109
|
+
### Step 3: Execute Copy
|
|
110
|
+
|
|
111
|
+
1. Create destination directory: `[prototypes-dir]/locked/clickable-v[N]/`
|
|
112
|
+
2. Copy the prototype app source using `cp -r` with exclusion of `node_modules/` and framework build output directories
|
|
113
|
+
3. Copy validation evidence:
|
|
114
|
+
- Journey screenshots from the locked version
|
|
115
|
+
- Showcase screenshots
|
|
116
|
+
- Review and judge reports for the locked version
|
|
117
|
+
- The `final-report.md` for each prototype type
|
|
118
|
+
4. Copy `criteria.md`
|
|
119
|
+
5. Read the lock report template:
|
|
120
|
+
> Read `${CLAUDE_PLUGIN_ROOT}/skills/arn-spark-prototype-lock/references/lock-report-template.md`
|
|
121
|
+
6. Write a `LOCKED.md` manifest file at `[prototypes-dir]/locked/LOCKED.md` using the template. Populate all fields with the actual values from the copy operation.
|
|
122
|
+
|
|
123
|
+
If a static prototype exists and is validated, repeat the copy for the static prototype to `[prototypes-dir]/locked/static-v[M]/`.
|
|
124
|
+
|
|
125
|
+
### Step 4: Validate the Snapshot
|
|
126
|
+
|
|
127
|
+
1. `cd` into the locked copy
|
|
128
|
+
2. Run dependency install using the detected package manager (npm/pnpm/yarn/bun)
|
|
129
|
+
3. Run build using the framework's build command
|
|
130
|
+
4. If the project has a dev server command, start it briefly and verify it responds:
|
|
131
|
+
- Start the dev server in the background
|
|
132
|
+
- Poll for readiness (check HTTP response on the expected port)
|
|
133
|
+
- Kill the dev server after confirming it responds
|
|
134
|
+
5. Report validation result
|
|
135
|
+
|
|
136
|
+
**If validation fails:**
|
|
137
|
+
- Report the error
|
|
138
|
+
- Ask: "The locked copy does not build independently. Common causes: hard-coded paths, missing shared dependencies, monorepo imports. Should I investigate and fix, or skip validation?"
|
|
139
|
+
- If fixing: diagnose and fix path issues, missing deps, etc. Re-validate.
|
|
140
|
+
- After 3 failures: "Cannot make the locked copy build independently. The files are preserved as a reference but cannot be served standalone. Proceeding with guardrails."
|
|
141
|
+
|
|
142
|
+
Update the LOCKED.md manifest with the validation results.
|
|
143
|
+
|
|
144
|
+
### Step 5: Ask User to Confirm Access
|
|
145
|
+
|
|
146
|
+
"The prototype snapshot is at `[path]`. Can you confirm you can access it?
|
|
147
|
+
|
|
148
|
+
If this is a web-based prototype, you can verify by running:
|
|
149
|
+
```
|
|
150
|
+
cd [path]
|
|
151
|
+
[install command]
|
|
152
|
+
[dev server command]
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
Then open [URL] in your browser.
|
|
156
|
+
|
|
157
|
+
Is the snapshot accessible and working?"
|
|
158
|
+
|
|
159
|
+
Wait for user confirmation. If the user reports issues, investigate.
|
|
160
|
+
|
|
161
|
+
### Step 6: Git Tag
|
|
162
|
+
|
|
163
|
+
If Git is configured (`Git: yes`):
|
|
164
|
+
|
|
165
|
+
1. Check for uncommitted changes: `git status --short`
|
|
166
|
+
2. If uncommitted changes exist: "There are uncommitted changes. The git tag should mark a clean state. Should I commit current changes first, or tag despite uncommitted changes?"
|
|
167
|
+
3. If the tag name already exists, append a sequence number: `prototype-lock-[date]-2`
|
|
168
|
+
4. Create the tag: `git tag -a prototype-lock-[date] -m "Prototype locked after validation. Clickable v[N] (Judge: [verdict]). See [prototypes-dir]/locked/LOCKED.md"`
|
|
169
|
+
5. Report: "Git tag `prototype-lock-[date]` created. You can return to this exact state with `git checkout prototype-lock-[date]`."
|
|
170
|
+
|
|
171
|
+
If Git is not configured: skip, note that no tag was created.
|
|
172
|
+
|
|
173
|
+
### Step 7: Write arness.md Guardrail Rules
|
|
174
|
+
|
|
175
|
+
Read the guardrail rules template:
|
|
176
|
+
> Read `${CLAUDE_PLUGIN_ROOT}/skills/arn-spark-prototype-lock/references/prototype-guardrail-rules.md`
|
|
177
|
+
|
|
178
|
+
Substitute the placeholders with project-specific paths:
|
|
179
|
+
- `__LOCK_DATE__` -- today's date
|
|
180
|
+
- `__LOCK_TAG__` -- the git tag name from Step 6, or "none" if git is not configured
|
|
181
|
+
- `__LOCKED_DIR__` -- the locked directory path
|
|
182
|
+
- `__CLICKABLE_VERSION__` -- e.g., `clickable/v3/`
|
|
183
|
+
- `__STATIC_VERSION__` -- e.g., `static/v4/`
|
|
184
|
+
- `__PROTOTYPES_DIR__` -- base prototypes directory
|
|
185
|
+
|
|
186
|
+
Add the populated `### Prototype Lock` subsection to the `## Arness` section in the project's `arness.md`.
|
|
187
|
+
|
|
188
|
+
### Step 8: Optional PreToolUse Hook
|
|
189
|
+
|
|
190
|
+
Ask the user:
|
|
191
|
+
|
|
192
|
+
Ask the user:
|
|
193
|
+
|
|
194
|
+
**"The arness.md rules instruct agents not to modify prototype files. Do you want additional enforcement?"**
|
|
195
|
+
|
|
196
|
+
Options:
|
|
197
|
+
1. **Rules only** (default) — arness.md instructions are usually sufficient
|
|
198
|
+
2. **Rules + hook** — Adds a PreToolUse guard script for stricter enforcement
|
|
199
|
+
|
|
200
|
+
**If the user chooses hook:**
|
|
201
|
+
|
|
202
|
+
Read the hook template:
|
|
203
|
+
> Read `${CLAUDE_PLUGIN_ROOT}/skills/arn-spark-prototype-lock/references/pretooluse-hook-template.json`
|
|
204
|
+
|
|
205
|
+
The hook is installed in the **target project** (not in the arn-spark plugin):
|
|
206
|
+
|
|
207
|
+
**Other AI assistants:** The guard is installed as a PreToolUse hook.
|
|
208
|
+
1. Read or create `[PLATFORM_CONFIG_DIR]/settings.json` in the target project
|
|
209
|
+
2. If `[PLATFORM_CONFIG_DIR]/settings.json` already exists and has PreToolUse hooks, append the prototype guard to the existing hook list. Otherwise, create the hooks configuration using the template's `hooks_config`.
|
|
210
|
+
3. Adapt the guard script from the template:
|
|
211
|
+
- Replace `__PROTECTED_PATH_1__`, `__PROTECTED_PATH_2__`, etc. with the **relative paths** of the protected directories (relative to the project root, e.g., `.arness/prototypes/locked/`). The guard script resolves them at runtime using the `cwd` field from the hook input, so no user-specific absolute paths are committed.
|
|
212
|
+
4. Write the guard script to `[PLATFORM_CONFIG_DIR]/hooks/prototype-lock-guard.sh` in the target project
|
|
213
|
+
5. Make the script executable: `chmod +x [PLATFORM_CONFIG_DIR]/hooks/prototype-lock-guard.sh`
|
|
214
|
+
|
|
215
|
+
**OpenCode.ai:** Protection is automatic — the `arn-spark.js` plugin includes a `tool.execute.before` handler that reads the `#### Protected Paths` from `arness.md` at runtime and blocks Write/Edit calls targeting those paths. No additional configuration is needed.
|
|
216
|
+
|
|
217
|
+
**Note:** The hook guards Write and Edit tool calls only. Bash commands that modify the filesystem are not intercepted -- the arness.md rules (Step 7) are the primary defense for all operations including Bash.
|
|
218
|
+
|
|
219
|
+
### Step 9: Present Summary
|
|
220
|
+
|
|
221
|
+
"Prototype locked.
|
|
222
|
+
|
|
223
|
+
**Snapshot:** [prototypes-dir]/locked/clickable-v[N]/
|
|
224
|
+
**Manifest:** [prototypes-dir]/locked/LOCKED.md
|
|
225
|
+
**Independent build:** [PASS/FAIL/SKIPPED]
|
|
226
|
+
**Git tag:** prototype-lock-[date] [or 'none']
|
|
227
|
+
**Guardrails:** arness.md rules [+ PreToolUse hook]
|
|
228
|
+
|
|
229
|
+
**Protected paths** (agents will not modify):
|
|
230
|
+
- [list from guardrail rules]
|
|
231
|
+
|
|
232
|
+
**arness.md updated** with `### Prototype Lock` configuration.
|
|
233
|
+
|
|
234
|
+
Recommended next steps:
|
|
235
|
+
1. **Set up dev environment:** Run `/arn-spark-dev-setup` to configure the development environment
|
|
236
|
+
2. **Define visual testing:** Run `/arn-spark-visual-strategy` to set up visual regression testing against the prototype
|
|
237
|
+
3. **Extract features:** Run `/arn-spark-feature-extract` to build the backlog
|
|
238
|
+
4. **Start developing:** If you have the Arness Code plugin installed, run `/arn-planning` to begin the development pipeline. Arness auto-configures on first use."
|
|
239
|
+
|
|
240
|
+
## Agent Invocation Guide
|
|
241
|
+
|
|
242
|
+
| Situation | Action |
|
|
243
|
+
|-----------|--------|
|
|
244
|
+
| Copy and validate snapshot (Steps 3-4) | Execute directly in conversation via Bash and Write. No agent needed -- operations are deterministic. |
|
|
245
|
+
| Build validation fails with path issues | Diagnose directly. If the issue requires framework-specific knowledge, invoke `arn-spark-dev-env-builder` (foreground) for diagnosis assistance. |
|
|
246
|
+
| User asks about prototype quality | Reference the judge report and review reports. Do not re-run validation. |
|
|
247
|
+
| User wants to re-lock after more cycles | Re-run the skill. It detects the existing lock in Step 1 and offers to replace it. |
|
|
248
|
+
| User asks about visual testing | Defer: "Visual regression testing against the prototype is set up by `/arn-spark-visual-strategy`." |
|
|
249
|
+
| User asks about features | Defer: "Feature extraction is done by `/arn-spark-feature-extract`." |
|
|
250
|
+
|
|
251
|
+
## Error Handling
|
|
252
|
+
|
|
253
|
+
- **No prototype found:** Ask user to point to the prototype source directory. Proceed without validation evidence if necessary.
|
|
254
|
+
- **Prototype fails to build independently:** Preserve the files as reference. Note limitation in LOCKED.md. Guardrails still protect the files.
|
|
255
|
+
- **Lock already exists:** "A prototype lock already exists from [date]. Replace it, or keep both? (Keeping both creates `locked/clickable-v[N]-[date2]/`)"
|
|
256
|
+
- **Git tag already exists:** Append a sequence number: `prototype-lock-[date]-2`
|
|
257
|
+
- **arness.md write fails:** Print the guardrail block for manual insertion.
|
|
258
|
+
- **Hook installation fails:** Proceed with arness.md rules only. Explain that rules are usually sufficient.
|
|
259
|
+
- **Large prototype (>100MB):** Warn the user about disk usage. Suggest adding the locked directory to `.gitignore` if it should not be committed.
|
|
260
|
+
- **Monorepo prototype (shares dependencies with main project):** The locked copy may need its own dependency install. Note this in the LOCKED.md manifest.
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# Lock Report Template
|
|
2
|
+
|
|
3
|
+
This template defines the structure for the `LOCKED.md` manifest file written by the `arn-spark-prototype-lock` skill. The manifest is saved to `[prototypes-dir]/locked/LOCKED.md` and documents the frozen prototype snapshot.
|
|
4
|
+
|
|
5
|
+
## Template
|
|
6
|
+
|
|
7
|
+
```markdown
|
|
8
|
+
# Prototype Lock Manifest
|
|
9
|
+
|
|
10
|
+
Locked by `/arn-spark-prototype-lock` on [date].
|
|
11
|
+
|
|
12
|
+
## Locked Versions
|
|
13
|
+
|
|
14
|
+
| Type | Version | Judge Verdict | Source | Locked Copy |
|
|
15
|
+
|------|---------|--------------|--------|-------------|
|
|
16
|
+
| [Clickable / Static] | v[N] | [PASS / FAIL / N/A] | [relative path to original] | [relative path to locked copy] |
|
|
17
|
+
|
|
18
|
+
## Git Tag
|
|
19
|
+
|
|
20
|
+
Tag: `[tag-name]` (or "None -- Git not configured")
|
|
21
|
+
|
|
22
|
+
To return to this exact state: `git checkout [tag-name]`
|
|
23
|
+
|
|
24
|
+
## Independent Build Validation
|
|
25
|
+
|
|
26
|
+
| Check | Result |
|
|
27
|
+
|-------|--------|
|
|
28
|
+
| Dependency install | [PASS / FAIL / SKIPPED] |
|
|
29
|
+
| Build | [PASS / FAIL / SKIPPED] |
|
|
30
|
+
| Dev server | [PASS / FAIL / SKIPPED] |
|
|
31
|
+
|
|
32
|
+
[If any checks failed: description of why and whether the snapshot is still usable as a reference]
|
|
33
|
+
|
|
34
|
+
## Stack
|
|
35
|
+
|
|
36
|
+
- **UI framework:** [detected framework]
|
|
37
|
+
- **Package manager:** [npm / pnpm / yarn / bun]
|
|
38
|
+
- **Build tool:** [vite / webpack / turbopack / etc.]
|
|
39
|
+
|
|
40
|
+
## How to View
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
cd [locked-copy-path]
|
|
44
|
+
[package-manager] install
|
|
45
|
+
[package-manager] run dev
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Then open [URL, e.g., http://localhost:5173] in your browser.
|
|
49
|
+
|
|
50
|
+
## What is Locked
|
|
51
|
+
|
|
52
|
+
The locked directory contains:
|
|
53
|
+
- **Prototype source code** -- all components, routes, styles, and configuration
|
|
54
|
+
- **Lockfile** -- exact dependency versions for reproducible builds
|
|
55
|
+
- **Validation evidence** -- review reports, judge reports, journey screenshots, showcase
|
|
56
|
+
- **Criteria document** -- agreed validation criteria
|
|
57
|
+
|
|
58
|
+
## What is NOT Locked
|
|
59
|
+
|
|
60
|
+
- `node_modules/` -- excluded from the copy (reinstall via lockfile)
|
|
61
|
+
- Framework build output (`.svelte-kit/`, `.next/`, `dist/`) -- excluded (rebuild from source)
|
|
62
|
+
- Runtime state, caches, and temporary files
|
|
63
|
+
|
|
64
|
+
## Protected by
|
|
65
|
+
|
|
66
|
+
- **arness.md rules:** `### Prototype Lock > #### Protected Paths` in the project's arness.md
|
|
67
|
+
- **PreToolUse hook:** [yes / no] -- blocks Write/Edit operations targeting locked directories
|
|
68
|
+
```
|
package/plugins/arn-spark/skills/arn-spark-prototype-lock/references/pretooluse-hook-template.json
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"description": "PreToolUse hook template for prototype lock guard. The skill reads this template, substitutes project-specific protected paths, and writes the hook configuration to the target project's [PLATFORM_CONFIG_DIR]/settings.json and the guard script to [PLATFORM_CONFIG_DIR]/hooks/prototype-lock-guard.sh.",
|
|
3
|
+
|
|
4
|
+
"hooks_config": {
|
|
5
|
+
"hooks": {
|
|
6
|
+
"PreToolUse": [
|
|
7
|
+
{
|
|
8
|
+
"matcher": "Write|Edit",
|
|
9
|
+
"hooks": [
|
|
10
|
+
{
|
|
11
|
+
"type": "command",
|
|
12
|
+
"command": "bash [PLATFORM_CONFIG_DIR]/hooks/prototype-lock-guard.sh"
|
|
13
|
+
}
|
|
14
|
+
]
|
|
15
|
+
}
|
|
16
|
+
]
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
|
|
20
|
+
"guard_script": "#!/usr/bin/env bash\n# prototype-lock-guard.sh\n# Blocks Write/Edit operations targeting locked prototype directories.\n# Reads tool invocation JSON from stdin; outputs decision JSON to stdout.\n# Always exits 0 (hooks must not crash).\n#\n# Installed by /arn-spark-prototype-lock. See ### Prototype Lock in arness.md.\n#\n# Protected paths are RELATIVE to the project root. The script resolves\n# them at runtime using the cwd field from the hook input, so no\n# user-specific absolute paths are committed.\n#\n# JSON parsing: tries jq -> python3 -> node (first available wins).\n# If none are found, allows the operation (fail-open -- arness.md rules\n# remain the primary defense).\n\nPROTECTED_PATHS=(\n \"__PROTECTED_PATH_1__\"\n \"__PROTECTED_PATH_2__\"\n \"__PROTECTED_PATH_3__\"\n)\n\ninput=$(cat)\n\nparse_json() {\n if command -v jq >/dev/null 2>&1; then\n file_path=$(echo \"$input\" | jq -r '.tool_input.file_path // .tool_input.filePath // \"\"')\n cwd=$(echo \"$input\" | jq -r '.cwd // \"\"')\n elif command -v python3 >/dev/null 2>&1; then\n eval \"$(echo \"$input\" | python3 -c \"\nimport sys, json\ntry:\n d = json.load(sys.stdin)\n ti = d.get('tool_input', {})\n fp = ti.get('file_path', '') or ti.get('filePath', '')\n cwd = d.get('cwd', '')\n print(f'file_path={chr(34)}{fp}{chr(34)}')\n print(f'cwd={chr(34)}{cwd}{chr(34)}')\nexcept:\n print('file_path={0}{0}'.format(chr(34)))\n print('cwd={0}{0}'.format(chr(34)))\n\" 2>/dev/null)\"\n elif command -v node >/dev/null 2>&1; then\n eval \"$(echo \"$input\" | node -e \"\nlet d='';process.stdin.on('data',c=>d+=c);process.stdin.on('end',()=>{\ntry{const j=JSON.parse(d);const ti=j.tool_input||{};\nconsole.log('file_path=\\\"'+(ti.file_path||ti.filePath||'')+'\\\"');\nconsole.log('cwd=\\\"'+(j.cwd||'')+'\\\"');\n}catch(e){console.log('file_path=\\\"\\\"');console.log('cwd=\\\"\\\"');}\n});\" 2>/dev/null)\"\n else\n file_path=\"\"\n cwd=\"\"\n fi\n}\n\nparse_json\n\nif [ -z \"$file_path\" ]; then\n echo '{}'\n exit 0\nfi\n\nfor protected in \"${PROTECTED_PATHS[@]}\"; do\n resolved=\"${cwd}/${protected}\"\n if [[ \"$file_path\" == \"$resolved\"* ]]; then\n echo '{\"decision\":\"block\",\"reason\":\"This file is in the locked prototype directory. Prototype files are read-only reference artifacts. See ### Prototype Lock in arness.md.\"}'\n exit 0\n fi\ndone\n\necho '{}'\nexit 0",
|
|
21
|
+
|
|
22
|
+
"installation_notes": [
|
|
23
|
+
"The guard script and hook config are written to the TARGET PROJECT, not the arn-spark plugin.",
|
|
24
|
+
"Protected paths are RELATIVE to the project root (e.g., '.arness/prototypes/locked/'). The script resolves them at runtime using the cwd field from the hook input JSON, so no user-specific absolute paths are committed.",
|
|
25
|
+
"JSON parsing uses a fallback chain: jq (preferred, used in AI assistant documentation) -> python3 -> node. If none are available, the hook allows the operation (fail-open) and arness.md rules serve as the primary defense.",
|
|
26
|
+
"The script reads JSON from stdin (tool invocation), extracts file_path and cwd, resolves relative protected paths against cwd, and checks for matches.",
|
|
27
|
+
"If protected: outputs block decision with reason. If not: outputs empty JSON (allow).",
|
|
28
|
+
"Always exits 0 -- hooks must never crash or the tool call will fail.",
|
|
29
|
+
"The skill merges the hooks_config into the existing [PLATFORM_CONFIG_DIR]/settings.json (preserving other settings).",
|
|
30
|
+
"If [PLATFORM_CONFIG_DIR]/settings.json already has PreToolUse hooks, the prototype guard is appended to the existing list.",
|
|
31
|
+
"The hook guards Write and Edit tool calls only. Bash commands that modify the filesystem are not intercepted -- the arness.md rules are the primary defense for those operations.",
|
|
32
|
+
"OpenCode.ai uses a built-in `tool.execute.before` handler in the arn-spark.js plugin instead of this hook. The handler reads protected paths from arness.md's `#### Protected Paths` section at runtime, so this hook template is only relevant for hook-based AI assistants.",
|
|
33
|
+
"The `tool.execute.before` handler in arn-spark.js covers both hook-based assistants and OpenCode -- if the user runs on OpenCode, the handler activates automatically. No manual hook installation needed."
|
|
34
|
+
]
|
|
35
|
+
}
|
package/plugins/arn-spark/skills/arn-spark-prototype-lock/references/prototype-guardrail-rules.md
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Prototype Guardrail Rules Template
|
|
2
|
+
|
|
3
|
+
This template defines the `### Prototype Lock` subsection written to the target project's `arness.md` by the `arn-spark-prototype-lock` skill. The skill substitutes project-specific paths into the placeholders before writing.
|
|
4
|
+
|
|
5
|
+
## Placeholders
|
|
6
|
+
|
|
7
|
+
- `__LOCK_DATE__` -- date the lock was created
|
|
8
|
+
- `__LOCK_TAG__` -- git tag name (or "none")
|
|
9
|
+
- `__LOCKED_DIR__` -- path to the locked directory (e.g., `.arness/prototypes/locked/`)
|
|
10
|
+
- `__CLICKABLE_VERSION__` -- e.g., `clickable/v3/`
|
|
11
|
+
- `__STATIC_VERSION__` -- e.g., `static/v4/`
|
|
12
|
+
- `__PROTOTYPES_DIR__` -- base prototypes directory (e.g., `.arness/prototypes`)
|
|
13
|
+
|
|
14
|
+
## Template
|
|
15
|
+
|
|
16
|
+
```markdown
|
|
17
|
+
### Prototype Lock
|
|
18
|
+
- **Locked:** yes
|
|
19
|
+
- **Lock date:** __LOCK_DATE__
|
|
20
|
+
- **Lock tag:** __LOCK_TAG__
|
|
21
|
+
- **Locked directory:** __LOCKED_DIR__
|
|
22
|
+
|
|
23
|
+
#### Protected Paths
|
|
24
|
+
DO NOT modify, delete, or overwrite any files under these paths. They contain the validated prototype reference artifact:
|
|
25
|
+
- `__LOCKED_DIR__` -- frozen prototype snapshots (independently buildable)
|
|
26
|
+
- `__PROTOTYPES_DIR__/__CLICKABLE_VERSION__` -- original validated clickable prototype
|
|
27
|
+
- `__PROTOTYPES_DIR__/__STATIC_VERSION__` -- original validated static prototype
|
|
28
|
+
- `__PROTOTYPES_DIR__/criteria.md` -- agreed validation criteria
|
|
29
|
+
- `__PROTOTYPES_DIR__/*/final-report.md` -- complete validation history
|
|
30
|
+
- `__PROTOTYPES_DIR__/*/v*/review-report.md` -- version review reports
|
|
31
|
+
- `__PROTOTYPES_DIR__/*/v*/judge-report.md` -- judge verdicts
|
|
32
|
+
- `__PROTOTYPES_DIR__/*/v*/showcase/` -- visual showcase assets
|
|
33
|
+
- `__PROTOTYPES_DIR__/*/v*/journeys/` -- journey test screenshots
|
|
34
|
+
|
|
35
|
+
Any agent or skill that attempts to modify these files is operating incorrectly. The prototype is a reference artifact, not a working codebase. When implementing features, build in the project's source directories -- never in the prototype directories.
|
|
36
|
+
|
|
37
|
+
To view the locked prototype: see `__LOCKED_DIR__/LOCKED.md` for build and serve instructions.
|
|
38
|
+
```
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: arn-spark-report
|
|
3
|
+
description: >-
|
|
4
|
+
This skill should be used when the user says "spark report", "report spark issue",
|
|
5
|
+
"spark broke", "arn-spark-report", "greenfield issue", "report greenfield problem",
|
|
6
|
+
"report spark problem", "diagnose spark", "spark doctor",
|
|
7
|
+
"spark bug", "spark not working",
|
|
8
|
+
or wants to report a problem with an Arness Spark workflow skill.
|
|
9
|
+
Invokes the arn-spark-doctor agent to diagnose the issue, then files a GitHub
|
|
10
|
+
issue on the Arness plugin repository. Do NOT use this for filing issues on the
|
|
11
|
+
user's own project — use /arn-code-create-issue for that.
|
|
12
|
+
version: 1.0.0
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# Arness Spark Report
|
|
16
|
+
|
|
17
|
+
Report an Arness Spark workflow issue by running a diagnostic and filing a GitHub issue on the Arness plugin repository. The arn-spark-doctor agent analyzes Spark configuration and behavior — it never reads project source code or business logic.
|
|
18
|
+
|
|
19
|
+
## Workflow
|
|
20
|
+
|
|
21
|
+
### Step 0: Smart Routing
|
|
22
|
+
|
|
23
|
+
Before proceeding, check whether the user's issue actually belongs to a different Arness plugin:
|
|
24
|
+
|
|
25
|
+
1. Read the `## Arness` section from the project's arness.md (if it exists).
|
|
26
|
+
2. Check the user's description for keyword signals:
|
|
27
|
+
- **Code keywords:** "plan", "spec", "execute", "taskify", "swift", "standard", "batch", "ship", "PR", "review-pr", "assess", "catch-up", "document-project", "save-plan"
|
|
28
|
+
- **Infra keywords:** "deploy", "Dockerfile", "container", "IaC", "terraform", "pipeline", "CI/CD", "environment", "secrets", "monitor", "infrastructure"
|
|
29
|
+
3. If Code signals detected: "This sounds like an Arness Code issue. Run `/arn-code-report` instead."
|
|
30
|
+
4. If Infra signals detected: "This sounds like an Arness Infra issue. Run `/arn-infra-report` instead."
|
|
31
|
+
5. If the user confirms it is actually a Spark issue, proceed.
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
### Step 1: Explain the Process
|
|
36
|
+
|
|
37
|
+
Inform the user:
|
|
38
|
+
|
|
39
|
+
"I'll help you report an Arness Spark workflow issue. Here's how this works:
|
|
40
|
+
1. You describe what happened — which skill you used and what went wrong
|
|
41
|
+
2. I'll run a diagnostic that checks Spark's configuration and expected behavior (I won't read your project code)
|
|
42
|
+
3. You'll review the issue report before it's submitted
|
|
43
|
+
4. The issue gets filed on the Arness plugin repository for the maintainers
|
|
44
|
+
|
|
45
|
+
Your project code and business logic are never included in the report."
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
### Step 2: Gather User Description
|
|
50
|
+
|
|
51
|
+
Ask the user to describe the issue (free-form text, not a multi-choice question — this is open-ended):
|
|
52
|
+
|
|
53
|
+
"What happened? Which Arness Spark skill were you using and what went wrong?"
|
|
54
|
+
|
|
55
|
+
Let the user type a free-form description. This becomes the `user_description` for the diagnostic.
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
### Step 3: Check Prerequisites
|
|
60
|
+
|
|
61
|
+
1. Detect the plugin's GitHub repository:
|
|
62
|
+
- Read the `repository` field from [PLATFORM_PLUGIN_METADATA]. Parse `owner/repo` from the URL.
|
|
63
|
+
- Fallback: `git -C ${CLAUDE_PLUGIN_ROOT} remote get-url origin`. Extract `owner/repo` from the URL (strip `.git` suffix and `https://github.com/` or `git@github.com:` prefix).
|
|
64
|
+
|
|
65
|
+
2. Check `gh auth status` — user must be authenticated to file issues.
|
|
66
|
+
|
|
67
|
+
3. Read plugin version — use [PLATFORM_PLUGIN_METADATA] to read plugin version.
|
|
68
|
+
|
|
69
|
+
4. Read `## Arness` config from the project's arness.md (if it exists).
|
|
70
|
+
|
|
71
|
+
If GitHub access is not available, offer an alternative: generate the diagnostic report as a local file (`arness-spark-report-<YYYY-MM-DD>.md` in the project root) the user can manually submit.
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
### Step 4: Invoke arn-spark-doctor
|
|
76
|
+
|
|
77
|
+
Spawn the `arn-spark-doctor` agent via the Task tool, passing the model from `.arness/agent-models/spark.md` as the `model` parameter (see `plugins/arn-spark/skills/arn-spark-ensure-config/references/ensure-config.md` "Dispatch convention" for fallback). Context:
|
|
78
|
+
- The user's description of the issue
|
|
79
|
+
- Project root path
|
|
80
|
+
- `## Arness` config content (or "not configured")
|
|
81
|
+
- Plugin version
|
|
82
|
+
- Instruction to read the knowledge base at `${CLAUDE_PLUGIN_ROOT}/skills/arn-spark-report/references/spark-knowledge-base.md`
|
|
83
|
+
|
|
84
|
+
Wait for the agent to complete and collect the diagnostic report.
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
### Step 5: Compose and Review Issue
|
|
89
|
+
|
|
90
|
+
Assemble the GitHub issue using the template from `${CLAUDE_PLUGIN_ROOT}/skills/arn-spark-report/references/issue-template.md`:
|
|
91
|
+
- Include the user's original description in the "User Report" section
|
|
92
|
+
- Include the doctor's diagnostic findings (ISSUE items only, not OK items)
|
|
93
|
+
- Include the doctor's assessment
|
|
94
|
+
- Include plugin version and relevant config state
|
|
95
|
+
- Include environment info (OS, Git, GitHub, gh CLI, Node.js, Playwright status)
|
|
96
|
+
- Exclude any project code or business logic
|
|
97
|
+
|
|
98
|
+
Present the complete draft to the user, then request explicit consent.
|
|
99
|
+
|
|
100
|
+
Ask the user:
|
|
101
|
+
|
|
102
|
+
> **This report will be filed as a public GitHub issue on the Arness repository.** It contains only Arness configuration state and diagnostic findings — no project source code or business logic. Please review the report above carefully.
|
|
103
|
+
>
|
|
104
|
+
> 1. Submit — I've reviewed it and consent to filing this publicly
|
|
105
|
+
> 2. Save locally — save as a file instead of submitting
|
|
106
|
+
> 3. Edit first — let me modify the report before deciding
|
|
107
|
+
|
|
108
|
+
- If **Submit**: proceed to Step 6.
|
|
109
|
+
- If **Save locally**: save as `arness-spark-report-<YYYY-MM-DD>.md` in the project root. Inform the user. Do not submit.
|
|
110
|
+
- If **Edit first**: let the user modify the draft, then ask again.
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
### Step 6: Submit Issue
|
|
115
|
+
|
|
116
|
+
The `arn-spark-report` label must already exist on the plugin repository (maintained by the plugin maintainers, not created by this skill).
|
|
117
|
+
|
|
118
|
+
1. Create the issue with the `arn-spark-report` label:
|
|
119
|
+
```bash
|
|
120
|
+
gh issue create --repo <owner/repo> --title "<title>" --body "<body>" --label "arn-spark-report"
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
2. If the command fails because the label does not exist, retry without `--label` and inform the user that the issue was filed without a label.
|
|
124
|
+
|
|
125
|
+
3. Report the issue URL to the user.
|
|
126
|
+
|
|
127
|
+
If submission fails for other reasons (permissions, network), save the report as `arness-spark-report-<YYYY-MM-DD>.md` in the project root and inform the user with instructions to submit manually.
|
|
128
|
+
|
|
129
|
+
## Error Handling
|
|
130
|
+
|
|
131
|
+
- **Plugin not installed from GitHub** — no git remote found in plugin root and no `repository` field in plugin.json. Generate report as `arness-spark-report-<YYYY-MM-DD>.md` in the project root instead.
|
|
132
|
+
- **`gh` not authenticated** — suggest `gh auth login`, offer local file fallback (`arness-spark-report-<YYYY-MM-DD>.md`).
|
|
133
|
+
- **User lacks permission to file issues on plugin repo** — save report as `arness-spark-report-<YYYY-MM-DD>.md` in the project root, suggest opening manually.
|
|
134
|
+
- **arn-spark-doctor agent fails** — report the failure, offer to file a minimal issue with just the user's description.
|
|
135
|
+
- **`## Arness` config missing** — proceed anyway, note "not configured" in the report.
|
|
136
|
+
- **`arn-spark-report` label missing from plugin repo** — retry without `--label`, note this in the output.
|
|
137
|
+
|
|
138
|
+
## Constraints
|
|
139
|
+
|
|
140
|
+
- **Allowed tools:** Read, Glob, Grep, Bash, Agent (for arn-spark-doctor)
|
|
141
|
+
- **NEVER** include project source code, business logic, or sensitive data in the report
|
|
142
|
+
- **NEVER** file issues on the user's own project repository — this skill only files on the Arness plugin repository
|
|
143
|
+
- **ALWAYS** present the full report draft and obtain explicit user consent before submitting
|
|
144
|
+
- **ALWAYS** offer a local-file alternative — the user must never be forced to submit publicly
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# Issue Report Template
|
|
2
|
+
|
|
3
|
+
Template for GitHub issues created by `/arn-spark-report`. The skill assembles this template with data from the user's description and the arn-spark-doctor agent's diagnostic findings.
|
|
4
|
+
|
|
5
|
+
## Template Format
|
|
6
|
+
|
|
7
|
+
The issue body follows this structure:
|
|
8
|
+
|
|
9
|
+
```markdown
|
|
10
|
+
## Arness Spark Report
|
|
11
|
+
|
|
12
|
+
**Plugin version:** <version from plugin.json>
|
|
13
|
+
**Skill(s) involved:** <skill names identified by the arn-spark-doctor diagnostic>
|
|
14
|
+
|
|
15
|
+
### User Report
|
|
16
|
+
|
|
17
|
+
> <user's original description of the issue, quoted verbatim>
|
|
18
|
+
|
|
19
|
+
### Diagnostic Findings
|
|
20
|
+
|
|
21
|
+
<arn-spark-doctor's findings — only ISSUE items, not OK items>
|
|
22
|
+
|
|
23
|
+
### Assessment
|
|
24
|
+
|
|
25
|
+
<arn-spark-doctor's root cause assessment — 1-3 sentences>
|
|
26
|
+
|
|
27
|
+
### Config State
|
|
28
|
+
|
|
29
|
+
\```
|
|
30
|
+
<relevant ## Arness Spark fields from the project's arness.md, or "Arness Spark not configured">
|
|
31
|
+
\```
|
|
32
|
+
|
|
33
|
+
### Environment
|
|
34
|
+
|
|
35
|
+
- **OS:** <detected via uname or "unknown">
|
|
36
|
+
- **Git:** <yes/no>
|
|
37
|
+
- **GitHub:** <yes/no>
|
|
38
|
+
- **gh CLI:** <authenticated/not authenticated/not installed>
|
|
39
|
+
- **Node.js:** <version or not installed>
|
|
40
|
+
- **Playwright:** <available/not available>
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
*Filed via `/arn-spark-report` — Arness Spark v<version>*
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Issue Title Format
|
|
47
|
+
|
|
48
|
+
Use a concise title derived from the doctor's assessment:
|
|
49
|
+
|
|
50
|
+
`[arn-spark-report] <skill name>: <brief issue summary>`
|
|
51
|
+
|
|
52
|
+
Examples:
|
|
53
|
+
- `[arn-spark-report] arn-spark-discover: product concept not saved after discovery`
|
|
54
|
+
- `[arn-spark-report] arn-spark-naming: WHOIS check fails with timeout`
|
|
55
|
+
- `[arn-spark-report] arn-spark-clickable-prototype: Playwright journey test crashes`
|
|
56
|
+
|
|
57
|
+
## Privacy Guidelines
|
|
58
|
+
|
|
59
|
+
The issue MUST NOT include:
|
|
60
|
+
- Project source code or file contents
|
|
61
|
+
- Business logic or domain-specific data
|
|
62
|
+
- File paths outside of Arness configuration directories
|
|
63
|
+
- User credentials, tokens, or authentication details
|
|
64
|
+
- Any information that could identify the user's project
|
|
65
|
+
|
|
66
|
+
The issue SHOULD include:
|
|
67
|
+
- Arness Spark configuration state (## Arness fields)
|
|
68
|
+
- Directory existence checks (exists/missing, not contents)
|
|
69
|
+
- Skill names and pipeline stage where the issue occurred
|
|
70
|
+
- Error messages related to Arness Spark workflow behavior
|
|
71
|
+
- Plugin version and environment information
|
|
72
|
+
|
|
73
|
+
## Labels
|
|
74
|
+
|
|
75
|
+
The `arn-spark-report` label is applied automatically. This label must be pre-created on the plugin repository by maintainers — the skill does not create it.
|
|
76
|
+
|
|
77
|
+
## Notes
|
|
78
|
+
|
|
79
|
+
- The user ALWAYS reviews and approves the issue before submission
|
|
80
|
+
- If the user edits the draft, use their edited version
|
|
81
|
+
- If submission fails, save the report as a local markdown file
|