trackops 2.1.0 → 2.2.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 (37) hide show
  1. package/README.md +14 -2
  2. package/lib/opera.js +1 -1
  3. package/lib/skills.js +94 -41
  4. package/package.json +6 -6
  5. package/scripts/skills-marketplace-smoke.js +156 -124
  6. package/scripts/smoke-tests.js +21 -14
  7. package/scripts/sync-skill-version.js +29 -19
  8. package/scripts/validate-skill.js +188 -103
  9. package/skills/trackops/SKILL.md +25 -7
  10. package/skills/trackops/locales/en/SKILL.md +25 -7
  11. package/skills/trackops/locales/en/references/activation.md +3 -3
  12. package/skills/trackops/locales/en/references/workflow.md +5 -4
  13. package/skills/trackops/references/activation.md +3 -3
  14. package/skills/trackops/references/workflow.md +5 -4
  15. package/skills/trackops/skill.json +2 -2
  16. package/skills/trackops-quality-guard/SKILL.md +78 -0
  17. package/skills/trackops-quality-guard/agents/openai.yaml +7 -0
  18. package/skills/trackops-quality-guard/locales/en/SKILL.md +78 -0
  19. package/skills/trackops-quality-guard/locales/en/references/commands.md +36 -0
  20. package/skills/trackops-quality-guard/locales/en/references/decision-policy.md +16 -0
  21. package/skills/trackops-quality-guard/locales/en/references/output-format.md +24 -0
  22. package/skills/trackops-quality-guard/references/commands.md +36 -0
  23. package/skills/trackops-quality-guard/references/decision-policy.md +16 -0
  24. package/skills/trackops-quality-guard/references/output-format.md +24 -0
  25. package/skills/trackops-quality-guard/skill.json +28 -0
  26. package/templates/skills/opera-skill/SKILL.md +4 -0
  27. package/templates/skills/opera-skill/locales/en/SKILL.md +4 -0
  28. package/templates/skills/trackops-quality-guard/SKILL.md +72 -0
  29. package/templates/skills/trackops-quality-guard/locales/en/SKILL.md +72 -0
  30. package/templates/skills/trackops-quality-guard/locales/en/references/commands.md +30 -0
  31. package/templates/skills/trackops-quality-guard/locales/en/references/decision-policy.md +14 -0
  32. package/templates/skills/trackops-quality-guard/locales/en/references/output-format.md +21 -0
  33. package/templates/skills/trackops-quality-guard/references/commands.md +30 -0
  34. package/templates/skills/trackops-quality-guard/references/decision-policy.md +14 -0
  35. package/templates/skills/trackops-quality-guard/references/output-format.md +21 -0
  36. package/templates/skills/opera-quality-guard/SKILL.md +0 -26
  37. package/templates/skills/opera-quality-guard/locales/en/SKILL.md +0 -26
@@ -1,103 +1,188 @@
1
- #!/usr/bin/env node
2
-
3
- const fs = require("fs");
4
- const path = require("path");
5
-
6
- const ROOT = path.resolve(__dirname, "..");
7
- const PACKAGE_FILE = path.join(ROOT, "package.json");
8
- const SKILL_DIR = path.join(ROOT, "skills", "trackops");
9
- const SKILL_FILE = path.join(SKILL_DIR, "skill.json");
10
- const REQUIRED_FILES = [
11
- path.join(SKILL_DIR, "SKILL.md"),
12
- path.join(SKILL_DIR, "skill.json"),
13
- path.join(SKILL_DIR, "references", "activation.md"),
14
- path.join(SKILL_DIR, "references", "workflow.md"),
15
- path.join(SKILL_DIR, "references", "troubleshooting.md"),
16
- ];
17
-
18
- function fail(message) {
19
- console.error(message);
20
- process.exit(1);
21
- }
22
-
23
- function main() {
24
- const pkg = JSON.parse(fs.readFileSync(PACKAGE_FILE, "utf8"));
25
- const skill = JSON.parse(fs.readFileSync(SKILL_FILE, "utf8"));
26
- const skillMd = fs.readFileSync(path.join(SKILL_DIR, "SKILL.md"), "utf8");
27
-
28
- for (const file of REQUIRED_FILES) {
29
- if (!fs.existsSync(file)) {
30
- fail(`Missing required skill file: ${path.relative(ROOT, file)}`);
31
- }
32
- }
33
-
34
- if (!Array.isArray(pkg.files) || !pkg.files.includes("skills/")) {
35
- fail("package.json must publish the skills/ directory.");
36
- }
37
-
38
- if (skill.name !== "trackops") {
39
- fail("skills/trackops/skill.json must declare name 'trackops'.");
40
- }
41
-
42
- if (skill.skillVersion !== pkg.version || skill.trackopsVersion !== pkg.version) {
43
- fail(`skills/trackops/skill.json must be synced to package version ${pkg.version}.`);
44
- }
45
-
46
- if (skill.npmPackage !== pkg.name) {
47
- fail(`skills/trackops/skill.json must target npm package '${pkg.name}'.`);
48
- }
49
-
50
- if (skill.bootstrapPolicy !== "explicit_install") {
51
- fail("skills/trackops/skill.json must use bootstrapPolicy 'explicit_install'.");
52
- }
53
-
54
- const supportedAgents = Array.isArray(skill.supportedAgentsV1) ? skill.supportedAgentsV1 : [];
55
- for (const agent of ["antigravity", "claude-code", "codex", "cursor", "gemini-cli", "github-copilot", "kiro-cli"]) {
56
- if (!supportedAgents.includes(agent)) {
57
- fail(`skills/trackops/skill.json must include supported agent '${agent}'.`);
58
- }
59
- }
60
-
61
- if (!skill.distribution || skill.distribution.source !== "Baxahaun/trackops") {
62
- fail("skills/trackops/skill.json must declare distribution.source 'Baxahaun/trackops'.");
63
- }
64
-
65
- if (skill.distribution.skill !== "trackops") {
66
- fail("skills/trackops/skill.json must declare distribution.skill 'trackops'.");
67
- }
68
-
69
- if (skill.distribution.fullDepth !== true) {
70
- fail("skills/trackops/skill.json must declare distribution.fullDepth true.");
71
- }
72
-
73
- for (const requiredPhrase of [
74
- "npx skills add Baxahaun/trackops",
75
- "npm install -g trackops",
76
- "trackops --version",
77
- "trackops init",
78
- "trackops opera install",
79
- "trackops opera bootstrap --resume",
80
- ]) {
81
- if (!skillMd.includes(requiredPhrase)) {
82
- fail(`skills/trackops/SKILL.md must mention '${requiredPhrase}'.`);
83
- }
84
- }
85
-
86
- for (const forbiddenPhrase of [
87
- "node scripts/bootstrap-trackops.js",
88
- "ensures the runtime on first use",
89
- "asegura el runtime en el primer uso",
90
- ]) {
91
- if (skillMd.includes(forbiddenPhrase)) {
92
- fail(`skills/trackops/SKILL.md must not mention '${forbiddenPhrase}'.`);
93
- }
94
- }
95
-
96
- if (fs.existsSync(path.join(SKILL_DIR, "scripts", "bootstrap-trackops.js"))) {
97
- fail("skills/trackops must not publish scripts/bootstrap-trackops.js.");
98
- }
99
-
100
- console.log("skills/trackops validated successfully.");
101
- }
102
-
103
- main();
1
+ #!/usr/bin/env node
2
+
3
+ const fs = require("fs");
4
+ const path = require("path");
5
+
6
+ const ROOT = path.resolve(__dirname, "..");
7
+ const PACKAGE_FILE = path.join(ROOT, "package.json");
8
+ const SKILLS_ROOT = path.join(ROOT, "skills");
9
+ const REQUIRED_AGENTS = ["antigravity", "claude-code", "codex", "cursor", "gemini-cli", "github-copilot", "kiro-cli"];
10
+ const REQUIRED_PUBLIC_SKILLS = ["trackops", "trackops-quality-guard"];
11
+
12
+ const SKILL_REQUIREMENTS = {
13
+ trackops: {
14
+ requiredFiles: [
15
+ "SKILL.md",
16
+ "skill.json",
17
+ "agents/openai.yaml",
18
+ "references/activation.md",
19
+ "references/workflow.md",
20
+ "references/troubleshooting.md",
21
+ "locales/en/SKILL.md",
22
+ "locales/en/references/activation.md",
23
+ "locales/en/references/workflow.md",
24
+ "locales/en/references/troubleshooting.md",
25
+ ],
26
+ requiredPhrases: [
27
+ "npx skills add Baxahaun/trackops",
28
+ "npm install -g trackops",
29
+ "trackops --version",
30
+ "trackops init",
31
+ "trackops opera install",
32
+ "trackops opera bootstrap --resume",
33
+ "trackops-quality-guard",
34
+ ],
35
+ forbiddenPhrases: [
36
+ "node scripts/bootstrap-trackops.js",
37
+ "ensures the runtime on first use",
38
+ "asegura el runtime en el primer uso",
39
+ ],
40
+ validate(skill, skillMd, pkg, skillDir) {
41
+ if (skill.bootstrapPolicy !== "explicit_install") {
42
+ fail("skills/trackops/skill.json must use bootstrapPolicy 'explicit_install'.");
43
+ }
44
+ if (fs.existsSync(path.join(skillDir, "scripts", "bootstrap-trackops.js"))) {
45
+ fail("skills/trackops must not publish scripts/bootstrap-trackops.js.");
46
+ }
47
+ for (const phrase of [
48
+ "npx skills add Baxahaun/trackops",
49
+ "npm install -g trackops",
50
+ "trackops --version",
51
+ ]) {
52
+ if (!skillMd.includes(phrase)) {
53
+ fail(`skills/trackops/SKILL.md must mention '${phrase}'.`);
54
+ }
55
+ }
56
+ if (skill.npmPackage !== pkg.name) {
57
+ fail(`skills/trackops/skill.json must target npm package '${pkg.name}'.`);
58
+ }
59
+ },
60
+ },
61
+ "trackops-quality-guard": {
62
+ requiredFiles: [
63
+ "SKILL.md",
64
+ "skill.json",
65
+ "agents/openai.yaml",
66
+ "references/commands.md",
67
+ "references/decision-policy.md",
68
+ "references/output-format.md",
69
+ "locales/en/SKILL.md",
70
+ "locales/en/references/commands.md",
71
+ "locales/en/references/decision-policy.md",
72
+ "locales/en/references/output-format.md",
73
+ ],
74
+ requiredPhrases: [
75
+ "trackops quality status",
76
+ "trackops quality verify",
77
+ "trackops quality release-readiness",
78
+ "trackops quality promote-readiness --target production",
79
+ "Estado actual",
80
+ "Blockers reales",
81
+ "Acción siguiente",
82
+ "Decisión final",
83
+ ],
84
+ forbiddenPhrases: [
85
+ "opera-quality-guard",
86
+ ],
87
+ },
88
+ };
89
+
90
+ function fail(message) {
91
+ console.error(message);
92
+ process.exit(1);
93
+ }
94
+
95
+ function discoverPublicSkills() {
96
+ if (!fs.existsSync(SKILLS_ROOT)) return [];
97
+ return fs.readdirSync(SKILLS_ROOT, { withFileTypes: true })
98
+ .filter((entry) => entry.isDirectory() && fs.existsSync(path.join(SKILLS_ROOT, entry.name, "skill.json")))
99
+ .map((entry) => ({
100
+ name: entry.name,
101
+ dir: path.join(SKILLS_ROOT, entry.name),
102
+ configPath: path.join(SKILLS_ROOT, entry.name, "skill.json"),
103
+ skillMdPath: path.join(SKILLS_ROOT, entry.name, "SKILL.md"),
104
+ }))
105
+ .sort((a, b) => a.name.localeCompare(b.name));
106
+ }
107
+
108
+ function validateCommon(pkg, descriptor, skill, skillMd) {
109
+ if (!Array.isArray(pkg.files) || !pkg.files.includes("skills/")) {
110
+ fail("package.json must publish the skills/ directory.");
111
+ }
112
+ if (skill.name !== descriptor.name) {
113
+ fail(`${path.relative(ROOT, descriptor.configPath)} must declare name '${descriptor.name}'.`);
114
+ }
115
+ if (skill.skillVersion !== pkg.version || skill.trackopsVersion !== pkg.version) {
116
+ fail(`${path.relative(ROOT, descriptor.configPath)} must be synced to package version ${pkg.version}.`);
117
+ }
118
+ if (skill.npmPackage !== pkg.name) {
119
+ fail(`${path.relative(ROOT, descriptor.configPath)} must target npm package '${pkg.name}'.`);
120
+ }
121
+ if (!skill.distribution || skill.distribution.source !== "Baxahaun/trackops") {
122
+ fail(`${path.relative(ROOT, descriptor.configPath)} must declare distribution.source 'Baxahaun/trackops'.`);
123
+ }
124
+ if (skill.distribution.skill !== descriptor.name) {
125
+ fail(`${path.relative(ROOT, descriptor.configPath)} must declare distribution.skill '${descriptor.name}'.`);
126
+ }
127
+ if (skill.distribution.fullDepth !== true) {
128
+ fail(`${path.relative(ROOT, descriptor.configPath)} must declare distribution.fullDepth true.`);
129
+ }
130
+ const expectedSkillPath = path.relative(ROOT, descriptor.dir).replace(/\\/g, "/");
131
+ if (skill.repository?.skillPath !== expectedSkillPath) {
132
+ fail(`${path.relative(ROOT, descriptor.configPath)} must declare repository.skillPath '${expectedSkillPath}'.`);
133
+ }
134
+
135
+ const supportedAgents = Array.isArray(skill.supportedAgentsV1) ? skill.supportedAgentsV1 : [];
136
+ for (const agent of REQUIRED_AGENTS) {
137
+ if (!supportedAgents.includes(agent)) {
138
+ fail(`${path.relative(ROOT, descriptor.configPath)} must include supported agent '${agent}'.`);
139
+ }
140
+ }
141
+
142
+ const requirements = SKILL_REQUIREMENTS[descriptor.name] || { requiredPhrases: [], forbiddenPhrases: [] };
143
+ for (const phrase of requirements.requiredPhrases) {
144
+ if (!skillMd.includes(phrase)) {
145
+ fail(`${path.relative(ROOT, descriptor.skillMdPath)} must mention '${phrase}'.`);
146
+ }
147
+ }
148
+ for (const phrase of requirements.forbiddenPhrases) {
149
+ if (skillMd.includes(phrase)) {
150
+ fail(`${path.relative(ROOT, descriptor.skillMdPath)} must not mention '${phrase}'.`);
151
+ }
152
+ }
153
+ }
154
+
155
+ function main() {
156
+ const pkg = JSON.parse(fs.readFileSync(PACKAGE_FILE, "utf8"));
157
+ const skills = discoverPublicSkills();
158
+ if (!skills.length) {
159
+ fail("No public skills were found under skills/.");
160
+ }
161
+ for (const skillName of REQUIRED_PUBLIC_SKILLS) {
162
+ if (!skills.some((descriptor) => descriptor.name === skillName)) {
163
+ fail(`Missing required public skill under skills/: ${skillName}`);
164
+ }
165
+ }
166
+
167
+ for (const descriptor of skills) {
168
+ const requirements = SKILL_REQUIREMENTS[descriptor.name] || { requiredFiles: ["SKILL.md", "skill.json"] };
169
+ for (const relativeFile of requirements.requiredFiles) {
170
+ const filePath = path.join(descriptor.dir, relativeFile);
171
+ if (!fs.existsSync(filePath)) {
172
+ fail(`Missing required skill file: ${path.relative(ROOT, filePath)}`);
173
+ }
174
+ }
175
+
176
+ const skill = JSON.parse(fs.readFileSync(descriptor.configPath, "utf8"));
177
+ const skillMd = fs.readFileSync(descriptor.skillMdPath, "utf8");
178
+ validateCommon(pkg, descriptor, skill, skillMd);
179
+
180
+ if (typeof requirements.validate === "function") {
181
+ requirements.validate(skill, skillMd, pkg, descriptor.dir);
182
+ }
183
+
184
+ console.log(`${path.relative(ROOT, descriptor.dir)} validated successfully.`);
185
+ }
186
+ }
187
+
188
+ main();
@@ -20,11 +20,12 @@ Esta skill es la puerta de entrada al sistema. Úsala cuando alguien:
20
20
 
21
21
  Esta skill:
22
22
 
23
- - explica qué es TrackOps y cuándo conviene usarlo
24
- - exige una instalación explícita y visible del runtime
25
- - guía la activación por repositorio
26
- - ayuda a decidir si OPERA debe seguir por `direct bootstrap` o por `agent handoff`
27
- - explica que al instalar OPERA se activa un equipo de agentes coordinados por `opera-skill`
23
+ - explica qué es TrackOps y cuándo conviene usarlo
24
+ - exige una instalación explícita y visible del runtime
25
+ - guía la activación por repositorio
26
+ - ayuda a decidir si OPERA debe seguir por `direct bootstrap` o por `agent handoff`
27
+ - explica que al instalar OPERA se activa un equipo de agentes coordinados por `opera-skill`
28
+ - deriva decisiones de calidad, release y producción hacia `trackops-quality-guard`
28
29
 
29
30
  ## Que no hace esta skill
30
31
 
@@ -115,8 +116,25 @@ trackops opera bootstrap --resume
115
116
  - la skill global instala instrucciones en el agente
116
117
  - el runtime se instala por separado con npm
117
118
  - `trackops init` activa el proyecto
118
- - `trackops opera install` anade el framework operativo completo solo cuando hace falta
119
- - TrackOps separa producto y operacion para que el repo no se vuelva caotico
119
+ - `trackops opera install` anade el framework operativo completo solo cuando hace falta
120
+ - TrackOps separa producto y operacion para que el repo no se vuelva caotico
121
+
122
+ ## Cuándo delegar a `trackops-quality-guard`
123
+
124
+ Si TrackOps ya está activo y el usuario pide:
125
+
126
+ - una auditoría de calidad del proyecto
127
+ - validar si algo está listo para release
128
+ - validar si algo puede ir a producción
129
+ - revisar blockers antes de entregar
130
+
131
+ entonces deriva a `trackops-quality-guard`.
132
+
133
+ Si esa skill no está instalada todavía, la instalación explícita es:
134
+
135
+ ```bash
136
+ npx skills add Baxahaun/trackops --skill trackops-quality-guard --agent "*" --global -y
137
+ ```
120
138
 
121
139
  ## Que referencia leer y cuando
122
140
 
@@ -20,11 +20,12 @@ This skill is the entry point to the system. Use it when someone:
20
20
 
21
21
  This skill:
22
22
 
23
- - explains what TrackOps is and when to use it
24
- - requires an explicit and visible runtime installation
25
- - guides per-repository activation
26
- - helps route OPERA into either `direct bootstrap` or `agent handoff`
27
- - explains that installing OPERA activates a team of agents coordinated by `opera-skill`
23
+ - explains what TrackOps is and when to use it
24
+ - requires an explicit and visible runtime installation
25
+ - guides per-repository activation
26
+ - helps route OPERA into either `direct bootstrap` or `agent handoff`
27
+ - explains that installing OPERA activates a team of agents coordinated by `opera-skill`
28
+ - routes quality, release, and production decisions to `trackops-quality-guard`
28
29
 
29
30
  ## What this skill does not do
30
31
 
@@ -115,8 +116,25 @@ trackops opera bootstrap --resume
115
116
  - the global skill installs instructions into the agent
116
117
  - the runtime is installed separately with npm
117
118
  - `trackops init` activates the project
118
- - `trackops opera install` adds the full operating framework only when needed
119
- - TrackOps separates product and operations so the repository stays manageable
119
+ - `trackops opera install` adds the full operating framework only when needed
120
+ - TrackOps separates product and operations so the repository stays manageable
121
+
122
+ ## When to delegate to `trackops-quality-guard`
123
+
124
+ If TrackOps is already active and the user asks for:
125
+
126
+ - a project quality audit
127
+ - a release-readiness decision
128
+ - a production-readiness decision
129
+ - a blocker review before delivery
130
+
131
+ then delegate to `trackops-quality-guard`.
132
+
133
+ If that skill is not installed yet, the explicit install is:
134
+
135
+ ```bash
136
+ npx skills add Baxahaun/trackops --skill trackops-quality-guard --agent "*" --global -y
137
+ ```
120
138
 
121
139
  ## Which reference to read and when
122
140
 
@@ -27,9 +27,9 @@ trackops init
27
27
  trackops opera install
28
28
  ```
29
29
 
30
- `trackops opera install` also activates the project agent team:
31
- - `opera-skill` (coordinator)
32
- - `project-starter-skill`, `opera-contract-auditor`, `opera-policy-guard`
30
+ `trackops opera install` also activates the project agent team:
31
+ - `opera-skill` (coordinator)
32
+ - `trackops-quality-guard`, `project-starter-skill`, `opera-contract-auditor`, `opera-policy-guard`
33
33
 
34
34
  By default, `trackops init` creates a split workspace with:
35
35
 
@@ -37,10 +37,11 @@ If OPERA is installed:
37
37
 
38
38
  When OPERA is installed, a team of specialized agents is activated:
39
39
 
40
- - `opera-skill` — coordinator. Decides phase, state, delegation, and blocking.
41
- - `project-starter-skill` — discovery and structuring
42
- - `opera-contract-auditor` — operating contract audit
43
- - `opera-policy-guard` — risk control
40
+ - `opera-skill` — coordinator. Decides phase, state, delegation, and blocking.
41
+ - `trackops-quality-guard` — quality, verification, and readiness guard
42
+ - `project-starter-skill` — discovery and structuring
43
+ - `opera-contract-auditor` — operating contract audit
44
+ - `opera-policy-guard` — risk control
44
45
 
45
46
  Additional skills available:
46
47
 
@@ -27,9 +27,9 @@ trackops init
27
27
  trackops opera install
28
28
  ```
29
29
 
30
- `trackops opera install` también activa el equipo de agentes del proyecto:
31
- - `opera-skill` (coordinadora)
32
- - `project-starter-skill`, `opera-contract-auditor`, `opera-policy-guard`
30
+ `trackops opera install` también activa el equipo de agentes del proyecto:
31
+ - `opera-skill` (coordinadora)
32
+ - `trackops-quality-guard`, `project-starter-skill`, `opera-contract-auditor`, `opera-policy-guard`
33
33
 
34
34
  Por defecto, `trackops init` crea un workspace split con:
35
35
 
@@ -37,10 +37,11 @@ Si OPERA está instalado:
37
37
 
38
38
  Cuando OPERA está instalado, se activa un equipo de agentes especializados:
39
39
 
40
- - `opera-skill` — coordinadora. Decide fase, estado, delegación y bloqueo.
41
- - `project-starter-skill` — descubrimiento y estructuración
42
- - `opera-contract-auditor` — auditoría del contrato operativo
43
- - `opera-policy-guard` — control de riesgo
40
+ - `opera-skill` — coordinadora. Decide fase, estado, delegación y bloqueo.
41
+ - `trackops-quality-guard` — guardia de calidad, verificación y readiness
42
+ - `project-starter-skill` — descubrimiento y estructuración
43
+ - `opera-contract-auditor` — auditoría del contrato operativo
44
+ - `opera-policy-guard` — control de riesgo
44
45
 
45
46
  También se pueden instalar:
46
47
 
@@ -2,8 +2,8 @@
2
2
  "name": "trackops",
3
3
  "shortDescription": "Global TrackOps skill that explains TrackOps, requires explicit runtime install, and guides per-repository activation.",
4
4
  "description": "Explains what TrackOps does, installs the global skill layer, requires explicit runtime installation with npm, supports Spanish and English, activates TrackOps repository by repository, and routes OPERA onboarding into either direct bootstrap or agent-led discovery.",
5
- "skillVersion": "2.1.0",
6
- "trackopsVersion": "2.1.0",
5
+ "skillVersion": "2.2.0",
6
+ "trackopsVersion": "2.2.0",
7
7
  "npmPackage": "trackops",
8
8
  "bootstrapPolicy": "explicit_install",
9
9
  "supportedAgentsV1": [
@@ -0,0 +1,78 @@
1
+ ---
2
+ name: "trackops-quality-guard"
3
+ description: "Skill pública de TrackOps para inspeccionar calidad, ejecutar verificaciones declaradas y decidir readiness antes de release o recomendaciones de producción."
4
+ metadata:
5
+ version: "1.0"
6
+ type: "global"
7
+ triggers:
8
+ - "quality"
9
+ - "calidad"
10
+ - "auditar"
11
+ - "auditoría"
12
+ - "readiness"
13
+ - "release readiness"
14
+ - "production readiness"
15
+ - "verifica calidad"
16
+ ---
17
+
18
+ # TrackOps Quality Guard
19
+
20
+ Si la conversación y el proyecto deben trabajar en inglés, lee `locales/en/SKILL.md` antes de seguir.
21
+
22
+ ## Misión
23
+
24
+ Complementar TrackOps con una guardia explícita de calidad y readiness de salida.
25
+
26
+ ## Cuándo usarla
27
+
28
+ Usa esta skill cuando el usuario:
29
+
30
+ - pida una auditoría de calidad del proyecto
31
+ - quiera validar si algo está listo para release
32
+ - quiera validar si algo puede ir a producción
33
+ - necesite revisar blockers reales antes de cerrar fase o entregar
34
+
35
+ ## Qué no hace
36
+
37
+ Esta skill no:
38
+
39
+ - sustituye al runtime `trackops quality ...`
40
+ - inventa checks o criterios fuera del runtime
41
+ - reinterpretar blockers para hacerlos “más suaves”
42
+ - publica, despliega o aprueba por su cuenta
43
+
44
+ ## Comandos obligatorios
45
+
46
+ - antes de cerrar una fase o declarar estabilidad, ejecuta `trackops quality status`
47
+ - si la decisión afecta a fase, consulta también `trackops quality phase-readiness`
48
+ - tras cambios relevantes en código, entorno, build o smoke, ejecuta `trackops quality verify`
49
+ - antes de `trackops release`, ejecuta `trackops quality release-readiness`
50
+ - antes de recomendar producción, ejecuta `trackops quality promote-readiness --target production`
51
+
52
+ ## Reglas de decisión
53
+
54
+ - `phase-readiness` es informativo
55
+ - `release-readiness` decide si se puede liberar
56
+ - `promote-readiness` decide si se puede recomendar producción
57
+ - si el runtime marca bloqueo, no inventes excepciones
58
+
59
+ ## Política de waivers
60
+
61
+ - solo usa waivers si existe aprobación humana explícita
62
+ - un waiver debe tener caducidad
63
+ - un waiver no borra la evidencia ni convierte un bloqueo en “no pasó nada”
64
+
65
+ ## Salida obligatoria
66
+
67
+ Responde siempre con este orden exacto:
68
+
69
+ 1. `Estado actual`
70
+ 2. `Blockers reales`
71
+ 3. `Acción siguiente`
72
+ 4. `Decisión final`
73
+
74
+ ## Qué referencia leer y cuándo
75
+
76
+ - lee `references/commands.md` para decidir qué comando corre en cada momento
77
+ - lee `references/decision-policy.md` para interpretar advisory vs gate duro
78
+ - lee `references/output-format.md` antes de responder si la salida puede afectar una decisión de release o producción
@@ -0,0 +1,7 @@
1
+ interface:
2
+ display_name: "TrackOps Quality Guard"
3
+ short_description: "Inspect quality and decide release readiness"
4
+ default_prompt: "Use $trackops-quality-guard to inspect TrackOps quality status, run declared verification, and decide release or production readiness without inventing blockers."
5
+
6
+ policy:
7
+ allow_implicit_invocation: true
@@ -0,0 +1,78 @@
1
+ ---
2
+ name: "trackops-quality-guard"
3
+ description: "Public TrackOps skill for inspecting quality, running declared verification, and deciding readiness before release or production recommendations."
4
+ metadata:
5
+ version: "1.0"
6
+ type: "global"
7
+ triggers:
8
+ - "quality"
9
+ - "calidad"
10
+ - "auditar"
11
+ - "auditoría"
12
+ - "readiness"
13
+ - "release readiness"
14
+ - "production readiness"
15
+ - "verifica calidad"
16
+ ---
17
+
18
+ # TrackOps Quality Guard
19
+
20
+ Use this localized file when the conversation and project should run in English.
21
+
22
+ ## Mission
23
+
24
+ Complement TrackOps with an explicit quality and production-readiness guard.
25
+
26
+ ## When to use it
27
+
28
+ Use this skill when the user:
29
+
30
+ - asks for a project quality audit
31
+ - wants to know whether something is ready for release
32
+ - wants to know whether something can go to production
33
+ - needs a real blocker review before closing a phase or delivering
34
+
35
+ ## What it does not do
36
+
37
+ This skill does not:
38
+
39
+ - replace the `trackops quality ...` runtime
40
+ - invent checks or criteria outside the runtime
41
+ - soften blockers to make them look acceptable
42
+ - publish, deploy, or approve by itself
43
+
44
+ ## Mandatory commands
45
+
46
+ - before closing a phase or declaring stability, run `trackops quality status`
47
+ - if the decision affects a phase, also run `trackops quality phase-readiness`
48
+ - after relevant code, environment, build, or smoke changes, run `trackops quality verify`
49
+ - before `trackops release`, run `trackops quality release-readiness`
50
+ - before recommending production, run `trackops quality promote-readiness --target production`
51
+
52
+ ## Decision rules
53
+
54
+ - `phase-readiness` is advisory
55
+ - `release-readiness` decides whether release is allowed
56
+ - `promote-readiness` decides whether production can be recommended
57
+ - if the runtime blocks, do not invent exceptions
58
+
59
+ ## Waiver policy
60
+
61
+ - only use waivers when there is explicit human approval
62
+ - a waiver must have an expiration
63
+ - a waiver does not erase evidence or turn a blocker into “nothing happened”
64
+
65
+ ## Required output
66
+
67
+ Always answer in this exact order:
68
+
69
+ 1. `Current state`
70
+ 2. `Real blockers`
71
+ 3. `Next action`
72
+ 4. `Final decision`
73
+
74
+ ## Which reference to read and when
75
+
76
+ - read `locales/en/references/commands.md` to decide which command to run
77
+ - read `locales/en/references/decision-policy.md` to interpret advisory vs hard gate
78
+ - read `locales/en/references/output-format.md` before replying when the answer may affect a release or production decision
@@ -0,0 +1,36 @@
1
+ # Commands
2
+
3
+ Use the `trackops quality ...` runtime as the single source of truth.
4
+
5
+ ## Execution order
6
+
7
+ 1. If the user wants a status check or phase close review:
8
+
9
+ ```bash
10
+ trackops quality status
11
+ trackops quality phase-readiness
12
+ ```
13
+
14
+ 2. If there were relevant code, environment, build, or smoke changes:
15
+
16
+ ```bash
17
+ trackops quality verify --scope all
18
+ ```
19
+
20
+ 3. If the decision affects release:
21
+
22
+ ```bash
23
+ trackops quality release-readiness
24
+ ```
25
+
26
+ 4. If the decision affects production:
27
+
28
+ ```bash
29
+ trackops quality promote-readiness --target production
30
+ ```
31
+
32
+ ## Rules
33
+
34
+ - do not replace these commands with subjective judgment
35
+ - if the user requests a specific scope, you may run `trackops quality verify --scope <scope>`
36
+ - if the runtime fails, report the failure before drawing conclusions