@jetrabbits/agentic 0.0.4 → 0.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.
Files changed (49) hide show
  1. package/AGENTS.md +16 -0
  2. package/Makefile +40 -0
  3. package/README.md +3 -0
  4. package/UPGRADE.md +61 -0
  5. package/agentic +1236 -13
  6. package/areas/software/full-stack/AGENTS.md +1 -4
  7. package/areas/software/full-stack/workflows/debug-issue.md +2 -2
  8. package/docs/agentic-lifecycle.md +114 -0
  9. package/docs/agentic-token-minimization/README.md +81 -0
  10. package/docs/agentic-usage.md +157 -0
  11. package/docs/catalog.schema.json +203 -0
  12. package/docs/guidance-updates/2026-04-10-software-devops-best-practices.md +26 -0
  13. package/docs/opencode_prepare_agents.md +40 -0
  14. package/docs/opencode_setup.md +48 -0
  15. package/docs/prompt-format.md +80 -0
  16. package/docs/site/README.md +44 -0
  17. package/docs/site/app.js +127 -0
  18. package/docs/site/catalog.json +5002 -0
  19. package/docs/site/index.html +52 -0
  20. package/docs/site/styles.css +177 -0
  21. package/extensions/codex/agents/developer.toml +1 -1
  22. package/extensions/codex/agents/devops-engineer.toml +1 -1
  23. package/extensions/codex/agents/product-owner.toml +1 -1
  24. package/extensions/codex/agents/team-lead.toml +1 -1
  25. package/extensions/opencode/plugins/model-checker.json +2 -3
  26. package/extensions/opencode/plugins/model-checker.ts +23 -0
  27. package/extensions/opencode/plugins/telegram-notification.ts +33 -5
  28. package/package.json +6 -2
  29. package/scripts/assess_area_quality.py +216 -0
  30. package/scripts/build_docs_catalog.py +283 -0
  31. package/scripts/lint_prompts.py +113 -0
  32. package/areas/software/full-stack/skills/bash-pro/SKILL.md +0 -310
  33. package/areas/software/full-stack/skills/python-pro/SKILL.md +0 -158
  34. package/areas/software/full-stack/skills/skill-creator/LICENSE.txt +0 -202
  35. package/areas/software/full-stack/skills/skill-creator/SKILL.md +0 -356
  36. package/areas/software/full-stack/skills/skill-creator/references/output-patterns.md +0 -82
  37. package/areas/software/full-stack/skills/skill-creator/references/workflows.md +0 -28
  38. package/areas/software/full-stack/skills/skill-creator/scripts/init_skill.py +0 -303
  39. package/areas/software/full-stack/skills/skill-creator/scripts/package_skill.py +0 -110
  40. package/areas/software/full-stack/skills/skill-creator/scripts/quick_validate.py +0 -95
  41. package/extensions/codex/skills/babysit-pr/SKILL.md +0 -187
  42. package/extensions/codex/skills/babysit-pr/agents/openai.yaml +0 -4
  43. package/extensions/codex/skills/babysit-pr/references/github-api-notes.md +0 -72
  44. package/extensions/codex/skills/babysit-pr/references/heuristics.md +0 -58
  45. package/extensions/codex/skills/babysit-pr/scripts/gh_pr_watch.py +0 -806
  46. package/extensions/codex/skills/babysit-pr/scripts/test_gh_pr_watch.py +0 -155
  47. package/extensions/opencode/skills/code_review_expert/SKILL.md +0 -144
  48. package/extensions/opencode/skills/design_expert/SKILL.md +0 -42
  49. package/extensions/opencode/skills/qa_expert/SKILL.md +0 -116
@@ -0,0 +1,48 @@
1
+ # OpenCode setup
2
+
3
+ ## Configuration
4
+
5
+ The main OpenCode configuration file is located at:
6
+
7
+ ```text
8
+ ~/.config/opencode/opencode.json
9
+ ```
10
+
11
+ ## Authentication
12
+
13
+ ### Auth files
14
+
15
+ OpenCode stores authentication data in two locations:
16
+
17
+ | Path | Description |
18
+ |------|-------------|
19
+ | `~/.config/opencode/` | Plugin-level credentials (for example, `antigravity-accounts.json`) |
20
+ | `~/.local/share/opencode/auth.json` | Primary provider tokens (OpenAI, Google, and others) |
21
+
22
+ ## Notes
23
+
24
+ - Back up credentials before machine migration.
25
+ - Keep auth files out of version control.
26
+ - Prefer least-privilege API keys for automation.
27
+
28
+ ## Agentic optional plugins
29
+
30
+ When `agentic` installs the OpenCode extension, it configures optional plugins in:
31
+
32
+ ```text
33
+ ~/.config/agentic/opencode-plugins.json
34
+ ```
35
+
36
+ Telegram notifications and model checking are opt-in. If the config is absent or a plugin is disabled, the plugin returns no hooks and OpenCode continues without that behavior.
37
+
38
+ Telegram notifications use either the stored config values or these environment variables:
39
+
40
+ ```text
41
+ OPENCODE_TELEGRAM_BOT_TOKEN
42
+ OPENCODE_TELEGRAM_CHAT_ID
43
+ ```
44
+
45
+ Non-interactive `agentic install` defaults optional plugins to disabled when no config exists.
46
+
47
+ For OpenCode targets, `agentic` writes generated operating guidance to `.opencode/AGENTS.md`. If OpenCode is installed
48
+ alongside another agent target, root `AGENTS.md` is generated as well for the non-OpenCode target.
@@ -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.
@@ -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
+ });