@jetrabbits/agentic 0.0.4 → 0.0.5
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 +9 -0
- package/Makefile +40 -0
- package/UPGRADE.md +61 -0
- package/agentic +948 -10
- package/areas/software/full-stack/AGENTS.md +1 -4
- package/areas/software/full-stack/workflows/debug-issue.md +2 -2
- package/docs/agentic-lifecycle.md +103 -0
- package/docs/agentic-token-minimization/README.md +79 -0
- package/docs/agentic-usage.md +145 -0
- package/docs/catalog.schema.json +203 -0
- package/docs/guidance-updates/2026-04-10-software-devops-best-practices.md +26 -0
- package/docs/opencode_prepare_agents.md +40 -0
- package/docs/opencode_setup.md +45 -0
- package/docs/prompt-format.md +80 -0
- package/docs/site/README.md +44 -0
- package/docs/site/app.js +127 -0
- package/docs/site/catalog.json +5002 -0
- package/docs/site/index.html +52 -0
- package/docs/site/styles.css +177 -0
- package/extensions/codex/agents/developer.toml +1 -1
- package/extensions/codex/agents/devops-engineer.toml +1 -1
- package/extensions/codex/agents/product-owner.toml +1 -1
- package/extensions/codex/agents/team-lead.toml +1 -1
- package/extensions/opencode/plugins/model-checker.json +2 -3
- package/extensions/opencode/plugins/model-checker.ts +23 -0
- package/extensions/opencode/plugins/telegram-notification.ts +33 -5
- package/package.json +6 -2
- package/scripts/assess_area_quality.py +216 -0
- package/scripts/build_docs_catalog.py +283 -0
- package/scripts/lint_prompts.py +113 -0
- package/areas/software/full-stack/skills/bash-pro/SKILL.md +0 -310
- package/areas/software/full-stack/skills/python-pro/SKILL.md +0 -158
- package/areas/software/full-stack/skills/skill-creator/LICENSE.txt +0 -202
- package/areas/software/full-stack/skills/skill-creator/SKILL.md +0 -356
- package/areas/software/full-stack/skills/skill-creator/references/output-patterns.md +0 -82
- package/areas/software/full-stack/skills/skill-creator/references/workflows.md +0 -28
- package/areas/software/full-stack/skills/skill-creator/scripts/init_skill.py +0 -303
- package/areas/software/full-stack/skills/skill-creator/scripts/package_skill.py +0 -110
- package/areas/software/full-stack/skills/skill-creator/scripts/quick_validate.py +0 -95
- package/extensions/codex/skills/babysit-pr/SKILL.md +0 -187
- package/extensions/codex/skills/babysit-pr/agents/openai.yaml +0 -4
- package/extensions/codex/skills/babysit-pr/references/github-api-notes.md +0 -72
- package/extensions/codex/skills/babysit-pr/references/heuristics.md +0 -58
- package/extensions/codex/skills/babysit-pr/scripts/gh_pr_watch.py +0 -806
- package/extensions/codex/skills/babysit-pr/scripts/test_gh_pr_watch.py +0 -155
- package/extensions/opencode/skills/code_review_expert/SKILL.md +0 -144
- package/extensions/opencode/skills/design_expert/SKILL.md +0 -42
- package/extensions/opencode/skills/qa_expert/SKILL.md +0 -116
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# Prompt format standard (EN/RU)
|
|
2
|
+
|
|
3
|
+
This repository expects every `areas/**/prompts/*.md` file to follow a strict structure so docs generation can reliably extract examples.
|
|
4
|
+
|
|
5
|
+
## Required structure
|
|
6
|
+
|
|
7
|
+
1. YAML front matter:
|
|
8
|
+
|
|
9
|
+
```md
|
|
10
|
+
---
|
|
11
|
+
workflow: your-workflow-stem
|
|
12
|
+
---
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
2. Prompt header:
|
|
16
|
+
|
|
17
|
+
```md
|
|
18
|
+
# Prompt: `/your-workflow-stem`
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
3. Use-when line:
|
|
22
|
+
|
|
23
|
+
```md
|
|
24
|
+
Use when: short scenario.
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
4. Two or three examples:
|
|
28
|
+
|
|
29
|
+
```md
|
|
30
|
+
## Example 1 — Human-readable title
|
|
31
|
+
|
|
32
|
+
**EN:**
|
|
33
|
+
```
|
|
34
|
+
/prompt-command
|
|
35
|
+
...
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
**RU:**
|
|
39
|
+
```
|
|
40
|
+
/prompt-command
|
|
41
|
+
...
|
|
42
|
+
```
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Rules
|
|
46
|
+
|
|
47
|
+
- `workflow:` in front matter is mandatory and must match a sibling file in `workflows/<workflow>.md`.
|
|
48
|
+
- Prompt filename must match the workflow stem, e.g. `prompts/testing-ci-pipeline.md` for `workflows/testing-ci-pipeline.md`.
|
|
49
|
+
- Prompt header and every slash command inside examples must be canonical and match the workflow stem, e.g. `/testing-ci-pipeline`.
|
|
50
|
+
- `Workflow link command:` is deprecated and must not appear.
|
|
51
|
+
- Every example must include **both** EN and RU fenced code blocks.
|
|
52
|
+
- Every prompt must contain **2 or 3** examples.
|
|
53
|
+
- Keep command and input payload realistic and copy-paste ready.
|
|
54
|
+
- Prefer concise titles for examples.
|
|
55
|
+
- Generic scaffold placeholders such as `<project context>` are not allowed.
|
|
56
|
+
|
|
57
|
+
## Validation
|
|
58
|
+
|
|
59
|
+
Run local format checks:
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
python3 scripts/lint_prompts.py
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Run full catalog consistency checks:
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
python3 scripts/build_docs_catalog.py --validate
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
## Mapping logic
|
|
73
|
+
|
|
74
|
+
Catalog builder links prompts to workflows using the prompt front matter key:
|
|
75
|
+
|
|
76
|
+
```yaml
|
|
77
|
+
workflow: workflow-file-name
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Validation then requires prompt filename, header command, and example commands to match that same workflow stem.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# Markdown docs site (search + menu)
|
|
2
|
+
|
|
3
|
+
This prototype renders a documentation site directly from markdown-derived catalog data.
|
|
4
|
+
|
|
5
|
+
## Why this stack
|
|
6
|
+
|
|
7
|
+
The user requirement was: site from markdown with search and menu. We evaluated popular GitHub projects:
|
|
8
|
+
|
|
9
|
+
- docsify: https://github.com/docsifyjs/docsify
|
|
10
|
+
- MkDocs: https://github.com/mkdocs/mkdocs
|
|
11
|
+
- Docusaurus: https://github.com/facebook/docusaurus
|
|
12
|
+
- markdown-it (parser): https://github.com/markdown-it/markdown-it
|
|
13
|
+
|
|
14
|
+
For this repo we keep it lightweight and dependency-minimal:
|
|
15
|
+
|
|
16
|
+
- catalog is generated offline by Python script from `areas/**/{workflows,prompts}`
|
|
17
|
+
- site is static HTML/CSS/JS
|
|
18
|
+
- markdown rendering via `marked` CDN
|
|
19
|
+
- full-text search via `lunr` CDN
|
|
20
|
+
|
|
21
|
+
## Run locally
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
python3 scripts/build_docs_catalog.py --output docs/site/catalog.json --validate
|
|
25
|
+
python3 -m http.server 8000
|
|
26
|
+
# open http://localhost:8000/docs/site/
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Features
|
|
30
|
+
|
|
31
|
+
- Left menu grouped by area.
|
|
32
|
+
- Full-text search by trigger/name/description/examples.
|
|
33
|
+
- Language switcher: EN only / RU only / EN+RU.
|
|
34
|
+
- Workflow page with quality gates and source paths.
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
## GitHub Pages
|
|
38
|
+
|
|
39
|
+
This site can be published from GitHub Pages via Actions workflow (`.github/workflows/docs-site.yml`).
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
## Workflow mapping
|
|
43
|
+
|
|
44
|
+
Prompt-to-workflow mapping is command-based: `/workflow-file-name` in prompt text links to `workflows/<workflow-file-name>.md` in the same area.
|
package/docs/site/app.js
ADDED
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
let catalog;
|
|
2
|
+
let current = null;
|
|
3
|
+
let idx;
|
|
4
|
+
let docs = [];
|
|
5
|
+
|
|
6
|
+
const menuEl = document.getElementById('menu');
|
|
7
|
+
const contentEl = document.getElementById('content');
|
|
8
|
+
const searchEl = document.getElementById('search');
|
|
9
|
+
const langEl = document.getElementById('language');
|
|
10
|
+
|
|
11
|
+
init();
|
|
12
|
+
|
|
13
|
+
async function init() {
|
|
14
|
+
const res = await fetch('./catalog.json');
|
|
15
|
+
catalog = await res.json();
|
|
16
|
+
buildIndex();
|
|
17
|
+
renderMenu(catalog.areas);
|
|
18
|
+
if (docs[0]) renderWorkflow(docs[0].id);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function buildIndex() {
|
|
22
|
+
docs = [];
|
|
23
|
+
for (const area of catalog.areas) {
|
|
24
|
+
for (const wf of area.workflows) {
|
|
25
|
+
docs.push({
|
|
26
|
+
id: `${area.area}:${wf.trigger}`,
|
|
27
|
+
area: area.area,
|
|
28
|
+
trigger: wf.trigger,
|
|
29
|
+
name: wf.name,
|
|
30
|
+
description: wf.description,
|
|
31
|
+
examples: (wf.examples?.both || []).map((e) => `${e.en}\n${e.ru}`).join('\n'),
|
|
32
|
+
data: wf,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
idx = lunr(function () {
|
|
38
|
+
this.ref('id');
|
|
39
|
+
this.field('area');
|
|
40
|
+
this.field('trigger');
|
|
41
|
+
this.field('name');
|
|
42
|
+
this.field('description');
|
|
43
|
+
this.field('examples');
|
|
44
|
+
docs.forEach((d) => this.add(d));
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function renderMenu(areas, filteredIds = null) {
|
|
49
|
+
menuEl.innerHTML = '';
|
|
50
|
+
for (const area of areas) {
|
|
51
|
+
const title = document.createElement('div');
|
|
52
|
+
title.className = 'area-title';
|
|
53
|
+
title.textContent = area.area;
|
|
54
|
+
menuEl.appendChild(title);
|
|
55
|
+
|
|
56
|
+
for (const wf of area.workflows) {
|
|
57
|
+
const id = `${area.area}:${wf.trigger}`;
|
|
58
|
+
if (filteredIds && !filteredIds.has(id)) continue;
|
|
59
|
+
const btn = document.createElement('button');
|
|
60
|
+
btn.className = 'wf-btn';
|
|
61
|
+
btn.textContent = `${wf.trigger} — ${wf.name}`;
|
|
62
|
+
btn.onclick = () => renderWorkflow(id);
|
|
63
|
+
menuEl.appendChild(btn);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function renderWorkflow(id) {
|
|
69
|
+
current = docs.find((d) => d.id === id);
|
|
70
|
+
if (!current) return;
|
|
71
|
+
const wf = current.data;
|
|
72
|
+
const lang = langEl.value;
|
|
73
|
+
|
|
74
|
+
const examples = (wf.examples?.both || []).map((ex) => {
|
|
75
|
+
const blocks = [];
|
|
76
|
+
if (lang === 'both' || lang === 'en') blocks.push(`**EN**\n\n\
|
|
77
|
+
\`\`\`\n${escapeFence(ex.en)}\n\`\`\``);
|
|
78
|
+
if (lang === 'both' || lang === 'ru') blocks.push(`**RU**\n\n\
|
|
79
|
+
\`\`\`\n${escapeFence(ex.ru)}\n\`\`\``);
|
|
80
|
+
return `### Example ${ex.number} — ${ex.title}\n\n${blocks.join('\n\n')}`;
|
|
81
|
+
}).join('\n\n');
|
|
82
|
+
|
|
83
|
+
const md = `
|
|
84
|
+
# ${wf.name}
|
|
85
|
+
\`${wf.trigger}\`
|
|
86
|
+
|
|
87
|
+
${wf.description || ''}
|
|
88
|
+
|
|
89
|
+
**Use when:** ${wf.use_when || '—'}
|
|
90
|
+
|
|
91
|
+
## Roles
|
|
92
|
+
${(wf.roles || []).map((r) => `<span class="chip">${r}</span>`).join(' ')}
|
|
93
|
+
|
|
94
|
+
## Quality gates
|
|
95
|
+
${(wf.quality_gates || []).map((q) => `- ${q}`).join('\n') || '- —'}
|
|
96
|
+
|
|
97
|
+
## Skills
|
|
98
|
+
${(wf.skill_refs || []).map((s) => `- ${s.name} (${s.path || "missing"})`).join('\n') || '- —'}
|
|
99
|
+
|
|
100
|
+
## Examples (${lang.toUpperCase()})
|
|
101
|
+
${examples || '_No examples_'}
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
<div class="meta">Workflow source: <code>${wf.workflow_path}</code><br/>Prompt source: <code>${wf.prompt_path || '—'}</code></div>
|
|
106
|
+
`;
|
|
107
|
+
|
|
108
|
+
contentEl.innerHTML = marked.parse(md);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function escapeFence(s) {
|
|
112
|
+
return (s || '').replace(/```/g, '\\\`\\\`\\\`');
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
searchEl.addEventListener('input', () => {
|
|
116
|
+
const q = searchEl.value.trim();
|
|
117
|
+
if (!q) {
|
|
118
|
+
renderMenu(catalog.areas);
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
const results = idx.search(`${q}*`);
|
|
122
|
+
renderMenu(catalog.areas, new Set(results.map((r) => r.ref)));
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
langEl.addEventListener('change', () => {
|
|
126
|
+
if (current) renderWorkflow(current.id);
|
|
127
|
+
});
|