opengstack 0.13.10 → 0.14.2
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/AGENTS.md +4 -4
- package/CLAUDE.md +127 -110
- package/README.md +10 -5
- package/SKILL.md +500 -70
- package/bin/opengstack.js +69 -69
- package/{skills/land-and-deploy/SKILL.md → commands/autoplan.md} +7 -25
- package/{skills/benchmark/SKILL.md → commands/benchmark.md} +84 -108
- package/{skills/browse/SKILL.md → commands/browse.md} +60 -81
- package/{skills/ship/SKILL.md → commands/canary.md} +7 -27
- package/{skills/careful/SKILL.md → commands/careful.md} +2 -22
- package/{skills/canary/SKILL.md → commands/codex.md} +7 -26
- package/{skills/connect-chrome/SKILL.md → commands/connect-chrome.md} +7 -24
- package/commands/cso.md +70 -0
- package/commands/design-consultation.md +70 -0
- package/commands/design-review.md +70 -0
- package/commands/design-shotgun.md +70 -0
- package/commands/document-release.md +70 -0
- package/{skills/freeze/SKILL.md → commands/freeze.md} +3 -29
- package/{skills/guard/SKILL.md → commands/guard.md} +4 -35
- package/commands/investigate.md +70 -0
- package/commands/land-and-deploy.md +70 -0
- package/commands/office-hours.md +70 -0
- package/{skills/gstack-upgrade/SKILL.md → commands/opengstack-upgrade.md} +64 -79
- package/commands/plan-ceo-review.md +70 -0
- package/commands/plan-design-review.md +70 -0
- package/commands/plan-eng-review.md +70 -0
- package/commands/qa-only.md +70 -0
- package/commands/qa.md +70 -0
- package/commands/retro.md +70 -0
- package/commands/review.md +70 -0
- package/{skills/setup-browser-cookies/SKILL.md → commands/setup-browser-cookies.md} +22 -40
- package/commands/setup-deploy.md +70 -0
- package/commands/ship.md +70 -0
- package/commands/unfreeze.md +25 -0
- package/docs/designs/CHROME_VS_CHROMIUM_EXPLORATION.md +9 -9
- package/docs/designs/CONDUCTOR_CHROME_SIDEBAR_INTEGRATION.md +2 -2
- package/docs/designs/CONDUCTOR_SESSION_API.md +16 -16
- package/docs/designs/DESIGN_SHOTGUN.md +74 -74
- package/docs/designs/DESIGN_TOOLS_V1.md +111 -111
- package/docs/skills.md +483 -202
- package/package.json +42 -43
- package/scripts/analytics.ts +188 -0
- package/scripts/dev-skill.ts +83 -0
- package/scripts/discover-skills.ts +39 -0
- package/scripts/eval-compare.ts +97 -0
- package/scripts/eval-list.ts +117 -0
- package/scripts/eval-select.ts +86 -0
- package/scripts/eval-summary.ts +188 -0
- package/scripts/eval-watch.ts +172 -0
- package/scripts/gen-skill-docs.ts +473 -0
- package/scripts/resolvers/browse.ts +129 -0
- package/scripts/resolvers/codex-helpers.ts +133 -0
- package/scripts/resolvers/composition.ts +48 -0
- package/scripts/resolvers/confidence.ts +37 -0
- package/scripts/resolvers/constants.ts +50 -0
- package/scripts/resolvers/design.ts +950 -0
- package/scripts/resolvers/index.ts +59 -0
- package/scripts/resolvers/learnings.ts +96 -0
- package/scripts/resolvers/preamble.ts +505 -0
- package/scripts/resolvers/review.ts +884 -0
- package/scripts/resolvers/testing.ts +573 -0
- package/scripts/resolvers/types.ts +45 -0
- package/scripts/resolvers/utility.ts +421 -0
- package/scripts/skill-check.ts +190 -0
- package/scripts/cleanup.py +0 -100
- package/scripts/filter-skills.sh +0 -114
- package/scripts/filter_skills.py +0 -164
- package/scripts/install-skills.js +0 -60
- package/skills/autoplan/SKILL.md +0 -96
- package/skills/autoplan/SKILL.md.tmpl +0 -694
- package/skills/benchmark/SKILL.md.tmpl +0 -222
- package/skills/browse/SKILL.md.tmpl +0 -131
- package/skills/browse/bin/find-browse +0 -21
- package/skills/browse/bin/remote-slug +0 -14
- package/skills/browse/scripts/build-node-server.sh +0 -48
- package/skills/browse/src/activity.ts +0 -208
- package/skills/browse/src/browser-manager.ts +0 -959
- package/skills/browse/src/buffers.ts +0 -137
- package/skills/browse/src/bun-polyfill.cjs +0 -109
- package/skills/browse/src/cli.ts +0 -678
- package/skills/browse/src/commands.ts +0 -128
- package/skills/browse/src/config.ts +0 -150
- package/skills/browse/src/cookie-import-browser.ts +0 -625
- package/skills/browse/src/cookie-picker-routes.ts +0 -230
- package/skills/browse/src/cookie-picker-ui.ts +0 -688
- package/skills/browse/src/find-browse.ts +0 -61
- package/skills/browse/src/meta-commands.ts +0 -550
- package/skills/browse/src/platform.ts +0 -17
- package/skills/browse/src/read-commands.ts +0 -358
- package/skills/browse/src/server.ts +0 -1192
- package/skills/browse/src/sidebar-agent.ts +0 -280
- package/skills/browse/src/sidebar-utils.ts +0 -21
- package/skills/browse/src/snapshot.ts +0 -407
- package/skills/browse/src/url-validation.ts +0 -95
- package/skills/browse/src/write-commands.ts +0 -364
- package/skills/browse/test/activity.test.ts +0 -120
- package/skills/browse/test/adversarial-security.test.ts +0 -32
- package/skills/browse/test/browser-manager-unit.test.ts +0 -17
- package/skills/browse/test/bun-polyfill.test.ts +0 -72
- package/skills/browse/test/commands.test.ts +0 -2075
- package/skills/browse/test/compare-board.test.ts +0 -342
- package/skills/browse/test/config.test.ts +0 -316
- package/skills/browse/test/cookie-import-browser.test.ts +0 -519
- package/skills/browse/test/cookie-picker-routes.test.ts +0 -260
- package/skills/browse/test/file-drop.test.ts +0 -271
- package/skills/browse/test/find-browse.test.ts +0 -50
- package/skills/browse/test/findport.test.ts +0 -191
- package/skills/browse/test/fixtures/basic.html +0 -33
- package/skills/browse/test/fixtures/cursor-interactive.html +0 -22
- package/skills/browse/test/fixtures/dialog.html +0 -15
- package/skills/browse/test/fixtures/empty.html +0 -2
- package/skills/browse/test/fixtures/forms.html +0 -55
- package/skills/browse/test/fixtures/iframe.html +0 -30
- package/skills/browse/test/fixtures/network-idle.html +0 -30
- package/skills/browse/test/fixtures/qa-eval-checkout.html +0 -108
- package/skills/browse/test/fixtures/qa-eval-spa.html +0 -98
- package/skills/browse/test/fixtures/qa-eval.html +0 -51
- package/skills/browse/test/fixtures/responsive.html +0 -49
- package/skills/browse/test/fixtures/snapshot.html +0 -55
- package/skills/browse/test/fixtures/spa.html +0 -24
- package/skills/browse/test/fixtures/states.html +0 -17
- package/skills/browse/test/fixtures/upload.html +0 -25
- package/skills/browse/test/gstack-config.test.ts +0 -138
- package/skills/browse/test/gstack-update-check.test.ts +0 -514
- package/skills/browse/test/handoff.test.ts +0 -235
- package/skills/browse/test/path-validation.test.ts +0 -91
- package/skills/browse/test/platform.test.ts +0 -37
- package/skills/browse/test/server-auth.test.ts +0 -65
- package/skills/browse/test/sidebar-agent-roundtrip.test.ts +0 -226
- package/skills/browse/test/sidebar-agent.test.ts +0 -199
- package/skills/browse/test/sidebar-integration.test.ts +0 -320
- package/skills/browse/test/sidebar-unit.test.ts +0 -96
- package/skills/browse/test/snapshot.test.ts +0 -467
- package/skills/browse/test/state-ttl.test.ts +0 -35
- package/skills/browse/test/test-server.ts +0 -57
- package/skills/browse/test/url-validation.test.ts +0 -72
- package/skills/browse/test/watch.test.ts +0 -129
- package/skills/canary/SKILL.md.tmpl +0 -212
- package/skills/careful/SKILL.md.tmpl +0 -56
- package/skills/careful/bin/check-careful.sh +0 -112
- package/skills/codex/SKILL.md +0 -90
- package/skills/codex/SKILL.md.tmpl +0 -417
- package/skills/connect-chrome/SKILL.md.tmpl +0 -195
- package/skills/cso/ACKNOWLEDGEMENTS.md +0 -14
- package/skills/cso/SKILL.md +0 -93
- package/skills/cso/SKILL.md.tmpl +0 -606
- package/skills/design-consultation/SKILL.md +0 -94
- package/skills/design-consultation/SKILL.md.tmpl +0 -415
- package/skills/design-review/SKILL.md +0 -94
- package/skills/design-review/SKILL.md.tmpl +0 -290
- package/skills/design-shotgun/SKILL.md +0 -91
- package/skills/design-shotgun/SKILL.md.tmpl +0 -285
- package/skills/document-release/SKILL.md +0 -91
- package/skills/document-release/SKILL.md.tmpl +0 -359
- package/skills/freeze/SKILL.md.tmpl +0 -77
- package/skills/freeze/bin/check-freeze.sh +0 -79
- package/skills/gstack-upgrade/SKILL.md.tmpl +0 -222
- package/skills/guard/SKILL.md.tmpl +0 -77
- package/skills/investigate/SKILL.md +0 -105
- package/skills/investigate/SKILL.md.tmpl +0 -194
- package/skills/land-and-deploy/SKILL.md.tmpl +0 -881
- package/skills/office-hours/SKILL.md +0 -96
- package/skills/office-hours/SKILL.md.tmpl +0 -645
- package/skills/plan-ceo-review/SKILL.md +0 -94
- package/skills/plan-ceo-review/SKILL.md.tmpl +0 -811
- package/skills/plan-design-review/SKILL.md +0 -92
- package/skills/plan-design-review/SKILL.md.tmpl +0 -446
- package/skills/plan-eng-review/SKILL.md +0 -93
- package/skills/plan-eng-review/SKILL.md.tmpl +0 -303
- package/skills/qa/SKILL.md +0 -95
- package/skills/qa/SKILL.md.tmpl +0 -316
- package/skills/qa/references/issue-taxonomy.md +0 -85
- package/skills/qa/templates/qa-report-template.md +0 -126
- package/skills/qa-only/SKILL.md +0 -89
- package/skills/qa-only/SKILL.md.tmpl +0 -101
- package/skills/retro/SKILL.md +0 -89
- package/skills/retro/SKILL.md.tmpl +0 -820
- package/skills/review/SKILL.md +0 -92
- package/skills/review/SKILL.md.tmpl +0 -281
- package/skills/review/TODOS-format.md +0 -62
- package/skills/review/checklist.md +0 -220
- package/skills/review/design-checklist.md +0 -132
- package/skills/review/greptile-triage.md +0 -220
- package/skills/setup-browser-cookies/SKILL.md.tmpl +0 -81
- package/skills/setup-deploy/SKILL.md +0 -92
- package/skills/setup-deploy/SKILL.md.tmpl +0 -215
- package/skills/ship/SKILL.md.tmpl +0 -636
- package/skills/unfreeze/SKILL.md +0 -37
- package/skills/unfreeze/SKILL.md.tmpl +0 -36
package/bin/opengstack.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
4
|
+
* opengstack CLI - Install and manage AI workflow skills
|
|
5
5
|
* Usage: opengstack [options]
|
|
6
6
|
* Example: opengstack --install
|
|
7
7
|
*/
|
|
@@ -13,93 +13,93 @@ const PKG_DIR = path.dirname(__dirname);
|
|
|
13
13
|
const SKILLS_SOURCE = path.join(PKG_DIR, 'skills');
|
|
14
14
|
|
|
15
15
|
function getSkillDescription(skillName) {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
16
|
+
const skillPath = path.join(SKILLS_SOURCE, skillName, 'SKILL.md');
|
|
17
|
+
if (!fs.existsSync(skillPath)) return '';
|
|
18
|
+
|
|
19
|
+
const content = fs.readFileSync(skillPath, 'utf8');
|
|
20
|
+
const match = content.match(/description:\s*\|?\s*([^\n]+)/);
|
|
21
|
+
return match ? match[1].trim() : '';
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
function showHelp() {
|
|
25
|
-
|
|
26
|
-
|
|
25
|
+
console.log(`
|
|
26
|
+
opengstack - AI Engineering Workflow Skills
|
|
27
27
|
|
|
28
28
|
Usage: opengstack [options]
|
|
29
29
|
|
|
30
30
|
Options:
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
31
|
+
-h, --help Show this help message
|
|
32
|
+
-l, --list List all available skills
|
|
33
|
+
-i, --install Install skills to ~/.config/opencode/skills/,
|
|
34
|
+
~/.claude/skills/, and ~/.agents/skills/
|
|
35
35
|
|
|
36
36
|
In opencode/Claude, use /slash commands:
|
|
37
|
-
|
|
37
|
+
/ship, /qa, /review, etc.
|
|
38
38
|
`);
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
function listSkills() {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
42
|
+
console.log('\nAvailable skills:\n');
|
|
43
|
+
|
|
44
|
+
if (!fs.existsSync(SKILLS_SOURCE)) {
|
|
45
|
+
console.error('❌ No skills/ folder found');
|
|
46
|
+
process.exit(1);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
fs.readdirSync(SKILLS_SOURCE).forEach(skillName => {
|
|
50
|
+
const skillPath = path.join(SKILLS_SOURCE, skillName, 'SKILL.md');
|
|
51
|
+
if (!fs.existsSync(skillPath)) return;
|
|
52
|
+
|
|
53
|
+
const content = fs.readFileSync(skillPath, 'utf8');
|
|
54
|
+
const match = content.match(/description:\s*\|?\s*([^\n]+)/);
|
|
55
|
+
let description = '';
|
|
56
|
+
if (match) {
|
|
57
|
+
description = match[1].trim().substring(0, 60);
|
|
58
|
+
if (description.length === 60) description += '...';
|
|
59
|
+
}
|
|
60
|
+
console.log(` ${skillName.padEnd(20)} ${description}`);
|
|
61
|
+
});
|
|
62
|
+
console.log('');
|
|
63
63
|
}
|
|
64
64
|
|
|
65
65
|
function installSkills() {
|
|
66
|
-
|
|
67
|
-
|
|
66
|
+
console.log('Installing skills...');
|
|
67
|
+
require('../scripts/install-skills.js');
|
|
68
68
|
}
|
|
69
69
|
|
|
70
70
|
function main() {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
71
|
+
const args = process.argv.slice(2);
|
|
72
|
+
const command = args[0];
|
|
73
|
+
|
|
74
|
+
if (!command || command === '-h' || command === '--help') {
|
|
75
|
+
showHelp();
|
|
76
|
+
process.exit(0);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
if (command === '-l' || command === '--list') {
|
|
80
|
+
listSkills();
|
|
81
|
+
process.exit(0);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
if (command === '-i' || command === '--install') {
|
|
85
|
+
installSkills();
|
|
86
|
+
process.exit(0);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Check if skill exists in package
|
|
90
|
+
const skillPath = path.join(SKILLS_SOURCE, command, 'SKILL.md');
|
|
91
|
+
if (!fs.existsSync(skillPath)) {
|
|
92
|
+
console.error(`Unknown command: ${command}`);
|
|
93
|
+
console.error('Run "opengstack --help" for available commands');
|
|
94
|
+
process.exit(1);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Print instructions for using the skill
|
|
98
|
+
console.log(`\n🎯 Skill: ${command}`);
|
|
99
|
+
console.log(`📍 Location: ${skillPath}`);
|
|
100
|
+
console.log(`\nTo use this skill in opencode/Claude, type:`);
|
|
101
|
+
console.log(` /${command}\n`);
|
|
102
|
+
console.log('The skill instructions will be loaded automatically.\n');
|
|
103
103
|
}
|
|
104
104
|
|
|
105
105
|
main();
|
|
@@ -1,48 +1,30 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: land-and-deploy
|
|
3
|
-
preamble-tier: 4
|
|
4
|
-
version: 1.0.0
|
|
5
|
-
description: |
|
|
6
|
-
Land and deploy workflow. Merges the PR, waits for CI and deploy,
|
|
7
|
-
verifies production health via canary checks. Takes over after /ship
|
|
8
|
-
creates the PR. Use when: "merge", "land", "deploy", "merge and verify",
|
|
9
|
-
"land it", "ship it to production".
|
|
10
|
-
allowed-tools:
|
|
11
|
-
- Bash
|
|
12
|
-
- Read
|
|
13
|
-
- Write
|
|
14
|
-
- Glob
|
|
15
|
-
- AskUserQuestion
|
|
16
|
-
---
|
|
17
1
|
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
|
|
18
2
|
<!-- Regenerate: bun run gen:skill-docs -->
|
|
19
3
|
|
|
20
4
|
## Preamble (run first)
|
|
21
5
|
|
|
22
|
-
|
|
23
|
-
If `PROACTIVE` is `"false"`, do not proactively suggest gstack skills AND do not
|
|
6
|
+
If `PROACTIVE` is `"false"`, do not proactively suggest opengstack skills AND do not
|
|
24
7
|
auto-invoke skills based on conversation context. Only run skills the user explicitly
|
|
25
8
|
types (e.g., /qa, /ship). If you would have auto-invoked a skill, instead briefly say:
|
|
26
9
|
"I think /skillname might help here — want me to run it?" and wait for confirmation.
|
|
27
10
|
The user opted out of proactive behavior.
|
|
28
11
|
|
|
29
12
|
If `SKILL_PREFIX` is `"true"`, the user has namespaced skill names. When suggesting
|
|
30
|
-
or invoking other
|
|
31
|
-
of `/qa`, `/
|
|
13
|
+
or invoking other opengstack skills, use the `/opengstack-` prefix (e.g., `/opengstack-qa` instead
|
|
14
|
+
of `/qa`, `/opengstack-ship` instead of `/ship`). Disk paths are unaffected — always use
|
|
32
15
|
`~/.claude/skills/opengstack/[skill-name]/SKILL.md` for reading skill files.
|
|
33
16
|
|
|
34
17
|
If `LAKE_INTRO` is `no`: Before continuing, introduce the Completeness Principle.
|
|
35
18
|
Then offer to open the essay in their default browser:
|
|
36
19
|
|
|
37
20
|
```bash
|
|
38
|
-
touch ~/.
|
|
21
|
+
touch ~/.opengstack/.completeness-intro-seen
|
|
39
22
|
|
|
40
23
|
Only run `open` if the user says yes. Always run `touch` to mark as seen. This only happens once.
|
|
41
24
|
|
|
42
|
-
If `PROACTIVE_PROMPTED` is `no` AND `TEL_PROMPTED` is `yes`: After telemetry is handled,
|
|
43
25
|
ask the user about proactive behavior. Use AskUserQuestion:
|
|
44
26
|
|
|
45
|
-
>
|
|
27
|
+
> opengstack can proactively figure out when you might need a skill while you work —
|
|
46
28
|
> like suggesting /qa when you say "does this work?" or /investigate when you hit
|
|
47
29
|
> a bug. We recommend keeping this on — it speeds up every part of your workflow.
|
|
48
30
|
|
|
@@ -55,13 +37,13 @@ If B: run `echo set proactive false`
|
|
|
55
37
|
|
|
56
38
|
Always run:
|
|
57
39
|
```bash
|
|
58
|
-
touch ~/.
|
|
40
|
+
touch ~/.opengstack/.proactive-prompted
|
|
59
41
|
|
|
60
42
|
This only happens once. If `PROACTIVE_PROMPTED` is `yes`, skip this entirely.
|
|
61
43
|
|
|
62
44
|
## Voice
|
|
63
45
|
|
|
64
|
-
You are
|
|
46
|
+
You are opengstack, an open source AI builder framework
|
|
65
47
|
|
|
66
48
|
Lead with the point. Say what it does, why it matters, and what changes for the builder. Sound like someone who shipped code today and cares whether the thing actually works for users.
|
|
67
49
|
|
|
@@ -1,49 +1,30 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: benchmark
|
|
3
|
-
preamble-tier: 1
|
|
4
|
-
version: 1.0.0
|
|
5
|
-
description: |
|
|
6
|
-
Performance regression detection using the browse daemon. Establishes
|
|
7
|
-
baselines for page load times, Core Web Vitals, and resource sizes.
|
|
8
|
-
Compares before/after on every PR. Tracks performance trends over time.
|
|
9
|
-
Use when: "performance", "benchmark", "page speed", "lighthouse", "web vitals",
|
|
10
|
-
"bundle size", "load time".
|
|
11
|
-
allowed-tools:
|
|
12
|
-
- Bash
|
|
13
|
-
- Read
|
|
14
|
-
- Write
|
|
15
|
-
- Glob
|
|
16
|
-
- AskUserQuestion
|
|
17
|
-
---
|
|
18
1
|
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
|
|
19
2
|
<!-- Regenerate: bun run gen:skill-docs -->
|
|
20
3
|
|
|
21
4
|
## Preamble (run first)
|
|
22
5
|
|
|
23
|
-
|
|
24
|
-
If `PROACTIVE` is `"false"`, do not proactively suggest gstack skills AND do not
|
|
6
|
+
If `PROACTIVE` is `"false"`, do not proactively suggest opengstack skills AND do not
|
|
25
7
|
auto-invoke skills based on conversation context. Only run skills the user explicitly
|
|
26
8
|
types (e.g., /qa, /ship). If you would have auto-invoked a skill, instead briefly say:
|
|
27
9
|
"I think /skillname might help here — want me to run it?" and wait for confirmation.
|
|
28
10
|
The user opted out of proactive behavior.
|
|
29
11
|
|
|
30
12
|
If `SKILL_PREFIX` is `"true"`, the user has namespaced skill names. When suggesting
|
|
31
|
-
or invoking other
|
|
32
|
-
of `/qa`, `/
|
|
13
|
+
or invoking other opengstack skills, use the `/opengstack-` prefix (e.g., `/opengstack-qa` instead
|
|
14
|
+
of `/qa`, `/opengstack-ship` instead of `/ship`). Disk paths are unaffected — always use
|
|
33
15
|
`~/.claude/skills/opengstack/[skill-name]/SKILL.md` for reading skill files.
|
|
34
16
|
|
|
35
17
|
If `LAKE_INTRO` is `no`: Before continuing, introduce the Completeness Principle.
|
|
36
18
|
Then offer to open the essay in their default browser:
|
|
37
19
|
|
|
38
20
|
```bash
|
|
39
|
-
touch ~/.
|
|
21
|
+
touch ~/.opengstack/.completeness-intro-seen
|
|
40
22
|
|
|
41
23
|
Only run `open` if the user says yes. Always run `touch` to mark as seen. This only happens once.
|
|
42
24
|
|
|
43
|
-
If `PROACTIVE_PROMPTED` is `no` AND `TEL_PROMPTED` is `yes`: After telemetry is handled,
|
|
44
25
|
ask the user about proactive behavior. Use AskUserQuestion:
|
|
45
26
|
|
|
46
|
-
>
|
|
27
|
+
> opengstack can proactively figure out when you might need a skill while you work —
|
|
47
28
|
> like suggesting /qa when you say "does this work?" or /investigate when you hit
|
|
48
29
|
> a bug. We recommend keeping this on — it speeds up every part of your workflow.
|
|
49
30
|
|
|
@@ -56,7 +37,7 @@ If B: run `echo set proactive false`
|
|
|
56
37
|
|
|
57
38
|
Always run:
|
|
58
39
|
```bash
|
|
59
|
-
touch ~/.
|
|
40
|
+
touch ~/.opengstack/.proactive-prompted
|
|
60
41
|
|
|
61
42
|
This only happens once. If `PROACTIVE_PROMPTED` is `yes`, skip this entirely.
|
|
62
43
|
|
|
@@ -94,30 +75,29 @@ RECOMMENDATION:
|
|
|
94
75
|
|
|
95
76
|
Replace `SKILL_NAME` with the actual skill name from frontmatter, `OUTCOME` with
|
|
96
77
|
success/error/abort, and `USED_BROWSE` with true/false based on whether `$B` was used.
|
|
97
|
-
If you cannot determine the outcome, use "unknown".
|
|
98
|
-
remote binary only runs if telemetry is not off and the binary exists.
|
|
78
|
+
If you cannot determine the outcome, use "unknown".
|
|
99
79
|
|
|
100
80
|
## Plan Status Footer
|
|
101
81
|
|
|
102
82
|
When you are in plan mode and about to call ExitPlanMode:
|
|
103
83
|
|
|
104
|
-
1. Check if the plan file already has a `##
|
|
84
|
+
1. Check if the plan file already has a `## opengstack REVIEW REPORT` section.
|
|
105
85
|
2. If it DOES — skip (a review skill already wrote a richer report).
|
|
106
86
|
3. If it does NOT — run this command:
|
|
107
87
|
|
|
108
88
|
\`\`\`bash
|
|
109
|
-
~/.claude/skills/opengstack/bin/
|
|
89
|
+
~/.claude/skills/opengstack/bin/opengstack-review-read
|
|
110
90
|
\`\`\`
|
|
111
91
|
|
|
112
|
-
Then write a `##
|
|
92
|
+
Then write a `## opengstack REVIEW REPORT` section to the end of the plan file:
|
|
113
93
|
|
|
114
94
|
- If the output contains review entries (JSONL lines before `---CONFIG---`): format the
|
|
115
|
-
|
|
116
|
-
|
|
95
|
+
standard report table with runs/status/findings per skill, same format as the review
|
|
96
|
+
skills use.
|
|
117
97
|
- If the output is `NO_REVIEWS` or empty: write this placeholder table:
|
|
118
98
|
|
|
119
99
|
\`\`\`markdown
|
|
120
|
-
##
|
|
100
|
+
## opengstack REVIEW REPORT
|
|
121
101
|
|
|
122
102
|
| Review | Trigger | Why | Runs | Status | Findings |
|
|
123
103
|
|--------|---------|-----|------|--------|----------|
|
|
@@ -138,23 +118,23 @@ plan's living status.
|
|
|
138
118
|
```bash
|
|
139
119
|
_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)
|
|
140
120
|
B=""
|
|
141
|
-
[ -n "$_ROOT" ] && [ -x "$_ROOT/.claude/skills/
|
|
121
|
+
[ -n "$_ROOT" ] && [ -x "$_ROOT/.claude/skills/opengstack/browse/dist/browse" ] && B="$_ROOT/.claude/skills/opengstack/browse/dist/browse"
|
|
142
122
|
[ -z "$B" ] && B=~/.claude/skills/opengstack/browse/dist/browse
|
|
143
123
|
if [ -x "$B" ]; then
|
|
144
|
-
|
|
124
|
+
echo "READY: $B"
|
|
145
125
|
else
|
|
146
|
-
|
|
126
|
+
echo "NEEDS_SETUP"
|
|
147
127
|
fi
|
|
148
128
|
|
|
149
129
|
If `NEEDS_SETUP`:
|
|
150
|
-
1. Tell the user: "
|
|
130
|
+
1. Tell the user: "opengstack browse needs a one-time build (~10 seconds). OK to proceed?" Then STOP and wait.
|
|
151
131
|
2. Run: `cd <SKILL_DIR> && ./setup`
|
|
152
132
|
3. If `bun` is not installed:
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
133
|
+
```bash
|
|
134
|
+
if ! command -v bun >/dev/null 2>&1; then
|
|
135
|
+
curl -fsSL https://bun.sh/install | BUN_VERSION=1.3.10 bash
|
|
136
|
+
fi
|
|
137
|
+
```
|
|
158
138
|
|
|
159
139
|
# /benchmark — Performance Regression Detection
|
|
160
140
|
|
|
@@ -178,9 +158,9 @@ When the user types `/benchmark`, run this skill.
|
|
|
178
158
|
### Phase 1: Setup
|
|
179
159
|
|
|
180
160
|
```bash
|
|
181
|
-
eval "$(~/.claude/skills/opengstack/bin/
|
|
182
|
-
mkdir -p .
|
|
183
|
-
mkdir -p .
|
|
161
|
+
eval "$(~/.claude/skills/opengstack/bin/opengstack-slug 2>/dev/null || echo "SLUG=unknown")"
|
|
162
|
+
mkdir -p .OpenGStack/benchmark-reports
|
|
163
|
+
mkdir -p .OpenGStack/benchmark-reports/baselines
|
|
184
164
|
|
|
185
165
|
### Phase 2: Page Discovery
|
|
186
166
|
|
|
@@ -230,59 +210,58 @@ Save metrics to baseline file:
|
|
|
230
210
|
|
|
231
211
|
```json
|
|
232
212
|
{
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
213
|
+
"url": "<url>",
|
|
214
|
+
"timestamp": "<ISO>",
|
|
215
|
+
"branch": "<branch>",
|
|
216
|
+
"pages": {
|
|
217
|
+
"/": {
|
|
218
|
+
"ttfb_ms": 120,
|
|
219
|
+
"fcp_ms": 450,
|
|
220
|
+
"lcp_ms": 800,
|
|
221
|
+
"dom_interactive_ms": 600,
|
|
222
|
+
"dom_complete_ms": 1200,
|
|
223
|
+
"full_load_ms": 1400,
|
|
224
|
+
"total_requests": 42,
|
|
225
|
+
"total_transfer_bytes": 1250000,
|
|
226
|
+
"js_bundle_bytes": 450000,
|
|
227
|
+
"css_bundle_bytes": 85000,
|
|
228
|
+
"largest_resources": [
|
|
229
|
+
{"name": "main.js", "size": 320000, "duration": 180},
|
|
230
|
+
{"name": "vendor.js", "size": 130000, "duration": 90}
|
|
231
|
+
]
|
|
232
|
+
}
|
|
233
|
+
}
|
|
254
234
|
}
|
|
255
235
|
|
|
256
|
-
Write to `.
|
|
236
|
+
Write to `.OpenGStack/benchmark-reports/baselines/baseline.json`.
|
|
257
237
|
|
|
258
238
|
### Phase 5: Comparison
|
|
259
239
|
|
|
260
240
|
If baseline exists, compare current metrics against it:
|
|
261
241
|
|
|
262
|
-
|
|
263
242
|
PERFORMANCE REPORT —
|
|
264
243
|
══════════════════════════
|
|
265
244
|
Branch: [current-branch] vs baseline ([baseline-branch])
|
|
266
245
|
|
|
267
246
|
Page: /
|
|
268
247
|
─────────────────────────────────────────────────────
|
|
269
|
-
Metric
|
|
270
|
-
────────
|
|
271
|
-
TTFB
|
|
272
|
-
FCP
|
|
273
|
-
LCP
|
|
274
|
-
DOM Interactive
|
|
275
|
-
DOM Complete
|
|
276
|
-
Full Load
|
|
277
|
-
Total Requests
|
|
278
|
-
Transfer Size
|
|
279
|
-
JS Bundle
|
|
280
|
-
CSS Bundle
|
|
248
|
+
Metric Baseline Current Delta Status
|
|
249
|
+
──────── ──────── ─────── ───── ──────
|
|
250
|
+
TTFB 120ms 135ms +15ms OK
|
|
251
|
+
FCP 450ms 480ms +30ms OK
|
|
252
|
+
LCP 800ms 1600ms +800ms REGRESSION
|
|
253
|
+
DOM Interactive 600ms 650ms +50ms OK
|
|
254
|
+
DOM Complete 1200ms 1350ms +150ms WARNING
|
|
255
|
+
Full Load 1400ms 2100ms +700ms REGRESSION
|
|
256
|
+
Total Requests 42 58 +16 WARNING
|
|
257
|
+
Transfer Size 1.2MB 1.8MB +0.6MB REGRESSION
|
|
258
|
+
JS Bundle 450KB 720KB +270KB REGRESSION
|
|
259
|
+
CSS Bundle 85KB 88KB +3KB OK
|
|
281
260
|
|
|
282
261
|
REGRESSIONS DETECTED: 3
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
262
|
+
[1] LCP doubled (800ms → 1600ms) — likely a large new image or blocking resource
|
|
263
|
+
[2] Total transfer +50% (1.2MB → 1.8MB) — check new JS bundles
|
|
264
|
+
[3] JS bundle +60% (450KB → 720KB) — new dependency or missing tree-shaking
|
|
286
265
|
|
|
287
266
|
**Regression thresholds:**
|
|
288
267
|
- Timing metrics: >50% increase OR >500ms absolute increase = REGRESSION
|
|
@@ -293,15 +272,14 @@ REGRESSIONS DETECTED: 3
|
|
|
293
272
|
|
|
294
273
|
### Phase 6: Slowest Resources
|
|
295
274
|
|
|
296
|
-
|
|
297
275
|
TOP 10 SLOWEST RESOURCES
|
|
298
276
|
═════════════════════════
|
|
299
|
-
#
|
|
300
|
-
1
|
|
301
|
-
2
|
|
302
|
-
3
|
|
303
|
-
4
|
|
304
|
-
5
|
|
277
|
+
# Resource Type Size Duration
|
|
278
|
+
1 vendor.chunk.js script 320KB 480ms
|
|
279
|
+
2 main.js script 250KB 320ms
|
|
280
|
+
3 hero-image.webp img 180KB 280ms
|
|
281
|
+
4 analytics.js script 45KB 250ms ← third-party
|
|
282
|
+
5 fonts/inter-var.woff2 font 95KB 180ms
|
|
305
283
|
...
|
|
306
284
|
|
|
307
285
|
RECOMMENDATIONS:
|
|
@@ -313,17 +291,16 @@ RECOMMENDATIONS:
|
|
|
313
291
|
|
|
314
292
|
Check against industry budgets:
|
|
315
293
|
|
|
316
|
-
|
|
317
294
|
PERFORMANCE BUDGET CHECK
|
|
318
295
|
════════════════════════
|
|
319
|
-
Metric
|
|
320
|
-
────────
|
|
321
|
-
FCP
|
|
322
|
-
LCP
|
|
323
|
-
Total JS
|
|
324
|
-
Total CSS
|
|
325
|
-
Total Transfer
|
|
326
|
-
HTTP Requests
|
|
296
|
+
Metric Budget Actual Status
|
|
297
|
+
──────── ────── ────── ──────
|
|
298
|
+
FCP < 1.8s 0.48s PASS
|
|
299
|
+
LCP < 2.5s 1.6s PASS
|
|
300
|
+
Total JS < 500KB 720KB FAIL
|
|
301
|
+
Total CSS < 100KB 88KB PASS
|
|
302
|
+
Total Transfer < 2MB 1.8MB WARNING (90%)
|
|
303
|
+
HTTP Requests < 50 58 FAIL
|
|
327
304
|
|
|
328
305
|
Grade: B (4/6 passing)
|
|
329
306
|
|
|
@@ -331,22 +308,21 @@ Grade: B (4/6 passing)
|
|
|
331
308
|
|
|
332
309
|
Load historical baseline files and show trends:
|
|
333
310
|
|
|
334
|
-
|
|
335
311
|
PERFORMANCE TRENDS (last 5 benchmarks)
|
|
336
312
|
══════════════════════════════════════
|
|
337
|
-
Date
|
|
338
|
-
2026-03-10
|
|
339
|
-
2026-03-12
|
|
340
|
-
2026-03-14
|
|
341
|
-
2026-03-16
|
|
342
|
-
2026-03-18
|
|
313
|
+
Date FCP LCP Bundle Requests Grade
|
|
314
|
+
2026-03-10 420ms 750ms 380KB 38 A
|
|
315
|
+
2026-03-12 440ms 780ms 410KB 40 A
|
|
316
|
+
2026-03-14 450ms 800ms 450KB 42 A
|
|
317
|
+
2026-03-16 460ms 850ms 520KB 48 B
|
|
318
|
+
2026-03-18 480ms 1600ms 720KB 58 B
|
|
343
319
|
|
|
344
320
|
TREND: Performance degrading. LCP doubled in 8 days.
|
|
345
|
-
|
|
321
|
+
JS bundle growing 50KB/week. Investigate.
|
|
346
322
|
|
|
347
323
|
### Phase 9: Save Report
|
|
348
324
|
|
|
349
|
-
Write to `.
|
|
325
|
+
Write to `.OpenGStack/benchmark-reports/{date}-benchmark.md` and `.OpenGStack/benchmark-reports/{date}-benchmark.json`.
|
|
350
326
|
|
|
351
327
|
## Important Rules
|
|
352
328
|
|