@fprad0/skill-master-mcp 0.0.6 → 0.0.8
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/CHANGELOG.md +15 -0
- package/README.md +96 -6
- package/VERSION.md +2 -2
- package/bin/lib/menu-core.mjs +353 -0
- package/bin/skill-master-activation.mjs +163 -0
- package/bin/skill-master-eval-activation.mjs +32 -0
- package/bin/skill-master-menu.mjs +136 -143
- package/bin/skill-master-success-skills.mjs +307 -0
- package/dist/activation-evals.d.ts +32 -0
- package/dist/activation-evals.d.ts.map +1 -0
- package/dist/activation-evals.js +116 -0
- package/dist/activation-evals.js.map +1 -0
- package/dist/index.js +326 -1
- package/dist/index.js.map +1 -1
- package/dist/prompt-router.d.ts +43 -0
- package/dist/prompt-router.d.ts.map +1 -0
- package/dist/prompt-router.js +308 -0
- package/dist/prompt-router.js.map +1 -0
- package/dist/success-learning.d.ts +147 -0
- package/dist/success-learning.d.ts.map +1 -0
- package/dist/success-learning.js +444 -0
- package/dist/success-learning.js.map +1 -0
- package/docs/architecture/APRENDIZADO_DE_IMPLEMENTACOES_BEM_SUCEDIDAS.md +125 -0
- package/docs/architecture/ARQUITETURA_AUTO_UPDATE.md +9 -0
- package/docs/architecture/PLANO_MASTER_ACIONAMENTO_AUTOMATICO_E_APRENDIZADO.md +341 -0
- package/docs/architecture/REDE_SEGURA_DE_SKILLS.md +148 -0
- package/manifests/channels/beta.json +6 -5
- package/manifests/channels/stable.json +7 -6
- package/network/approved-skills.json +51 -2
- package/network/unapproved-skill-candidates.json +77 -0
- package/package.json +9 -3
- package/sources.json +4 -1
|
@@ -0,0 +1,444 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { promises as fs } from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
const SUCCESS_SKILL_SCHEMA_VERSION = 'skill-master-success-skill-v1';
|
|
5
|
+
const SUCCESS_LEARNING_POLICY_VERSION = 'success-learning-human-approval-v1';
|
|
6
|
+
const hashValue = (value) => createHash('sha256').update(value).digest('hex');
|
|
7
|
+
const normalizeName = (value) => value
|
|
8
|
+
.normalize('NFD')
|
|
9
|
+
.replace(/[\u0300-\u036f]/g, '')
|
|
10
|
+
.toLowerCase()
|
|
11
|
+
.trim();
|
|
12
|
+
const slugifySkillName = (value) => {
|
|
13
|
+
const slug = normalizeName(value)
|
|
14
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
15
|
+
.replace(/^-+|-+$/g, '')
|
|
16
|
+
.slice(0, 63);
|
|
17
|
+
return slug || 'learned-success-skill';
|
|
18
|
+
};
|
|
19
|
+
const singleLine = (value) => value.replace(/\s+/g, ' ').trim();
|
|
20
|
+
const yamlString = (value) => `"${singleLine(value).replace(/\\/g, '\\\\').replace(/"/g, '\\"')}"`;
|
|
21
|
+
const markdownList = (items) => items
|
|
22
|
+
.map((item) => `- ${singleLine(item)}`)
|
|
23
|
+
.join('\n');
|
|
24
|
+
const detectRiskFlags = (value) => {
|
|
25
|
+
const flags = new Set();
|
|
26
|
+
const content = value.toLowerCase();
|
|
27
|
+
if (/curl\s+[^|\n]+\|\s*(sh|bash)/i.test(value))
|
|
28
|
+
flags.add('shell-pipe-download');
|
|
29
|
+
if (/iwr\s+[^|\n]+\|\s*iex/i.test(value) || /invoke-webrequest[\s\S]{0,120}iex/i.test(value))
|
|
30
|
+
flags.add('powershell-download-exec');
|
|
31
|
+
if (/powershell(\.exe)?\s+-enc(odedcommand)?/i.test(value))
|
|
32
|
+
flags.add('encoded-powershell');
|
|
33
|
+
if (/\brm\s+-rf\s+(\/|\$HOME|~)/i.test(value))
|
|
34
|
+
flags.add('destructive-shell-command');
|
|
35
|
+
if (/\b(eval|exec)\s*\(/i.test(value))
|
|
36
|
+
flags.add('dynamic-code-execution');
|
|
37
|
+
if (/sk-[a-zA-Z0-9_-]{16,}/.test(value) || /gh[pousr]_[a-zA-Z0-9_]{20,}/.test(value))
|
|
38
|
+
flags.add('possible-secret');
|
|
39
|
+
if (content.includes('disable antivirus') || content.includes('bypass antivirus'))
|
|
40
|
+
flags.add('evasion-language');
|
|
41
|
+
return [...flags].sort();
|
|
42
|
+
};
|
|
43
|
+
const buildSkillMarkdown = ({ name, description, title, summary, reusablePattern, triggerPhrases, implementationNotes, validationEvidence, }) => [
|
|
44
|
+
'---',
|
|
45
|
+
`name: ${name}`,
|
|
46
|
+
`description: ${yamlString(description)}`,
|
|
47
|
+
'---',
|
|
48
|
+
'',
|
|
49
|
+
`# ${singleLine(title)}`,
|
|
50
|
+
'',
|
|
51
|
+
`Use this skill when: ${singleLine(reusablePattern)}`,
|
|
52
|
+
'',
|
|
53
|
+
'## Successful Pattern',
|
|
54
|
+
'',
|
|
55
|
+
singleLine(summary),
|
|
56
|
+
'',
|
|
57
|
+
'## Trigger Phrases',
|
|
58
|
+
'',
|
|
59
|
+
markdownList(triggerPhrases.length ? triggerPhrases : [name]),
|
|
60
|
+
'',
|
|
61
|
+
'## Workflow',
|
|
62
|
+
'',
|
|
63
|
+
markdownList(implementationNotes),
|
|
64
|
+
'',
|
|
65
|
+
'## Evidence Required',
|
|
66
|
+
'',
|
|
67
|
+
markdownList(validationEvidence),
|
|
68
|
+
'',
|
|
69
|
+
'## Boundaries',
|
|
70
|
+
'',
|
|
71
|
+
'- Treat this as a reusable pattern, not an automatic command runner.',
|
|
72
|
+
'- Re-check the current repository, dependencies, credentials, and environment before applying it.',
|
|
73
|
+
'- Do not publish, install globally, or modify user secrets unless the user explicitly authorizes that action.',
|
|
74
|
+
'',
|
|
75
|
+
].join('\n');
|
|
76
|
+
const buildApprovalBlockers = ({ riskFlags, approvedIndex, name, validationEvidence, implementationNotes, }) => {
|
|
77
|
+
const blockers = [];
|
|
78
|
+
const approvedNames = new Set(approvedIndex.skills.map((skill) => normalizeName(skill.name)));
|
|
79
|
+
if (approvedNames.has(normalizeName(name))) {
|
|
80
|
+
blockers.push('A skill with this normalized name is already approved.');
|
|
81
|
+
}
|
|
82
|
+
if (validationEvidence.length === 0) {
|
|
83
|
+
blockers.push('Validation evidence is required before this candidate can be approved.');
|
|
84
|
+
}
|
|
85
|
+
if (implementationNotes.length < 2) {
|
|
86
|
+
blockers.push('At least two implementation notes are required to make the pattern reusable.');
|
|
87
|
+
}
|
|
88
|
+
if (riskFlags.length > 0) {
|
|
89
|
+
blockers.push('Risk flags require manual security review.');
|
|
90
|
+
}
|
|
91
|
+
return blockers;
|
|
92
|
+
};
|
|
93
|
+
export const readSuccessSkillDraft = async (manifestPath) => {
|
|
94
|
+
try {
|
|
95
|
+
return JSON.parse(await fs.readFile(manifestPath, 'utf8'));
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
const findManifestFiles = async (directory) => {
|
|
102
|
+
const found = [];
|
|
103
|
+
const visit = async (current) => {
|
|
104
|
+
let entries;
|
|
105
|
+
try {
|
|
106
|
+
entries = await fs.readdir(current, { withFileTypes: true });
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
for (const entry of entries) {
|
|
112
|
+
const fullPath = path.join(current, entry.name);
|
|
113
|
+
if (entry.isDirectory()) {
|
|
114
|
+
await visit(fullPath);
|
|
115
|
+
}
|
|
116
|
+
else if (entry.isFile() && entry.name === 'manifest.json') {
|
|
117
|
+
found.push(fullPath);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
await visit(directory);
|
|
122
|
+
return found.sort();
|
|
123
|
+
};
|
|
124
|
+
export const prepareSuccessSkillDraft = async ({ title, summary, reusablePattern, implementationNotes, validationEvidence, triggerPhrases, sourceFiles, sourceUrls, candidateName, description, creatorName, creatorUrl, externalCandidates, approvedIndex, outputDir, }) => {
|
|
125
|
+
const generatedAt = new Date().toISOString();
|
|
126
|
+
const name = slugifySkillName(candidateName ?? title);
|
|
127
|
+
const skillDescription = singleLine(description ?? `Use when ${reusablePattern}`);
|
|
128
|
+
const markdown = buildSkillMarkdown({
|
|
129
|
+
name,
|
|
130
|
+
description: skillDescription,
|
|
131
|
+
title,
|
|
132
|
+
summary,
|
|
133
|
+
reusablePattern,
|
|
134
|
+
triggerPhrases,
|
|
135
|
+
implementationNotes,
|
|
136
|
+
validationEvidence,
|
|
137
|
+
});
|
|
138
|
+
const riskFlags = detectRiskFlags([
|
|
139
|
+
title,
|
|
140
|
+
summary,
|
|
141
|
+
reusablePattern,
|
|
142
|
+
implementationNotes.join('\n'),
|
|
143
|
+
validationEvidence.join('\n'),
|
|
144
|
+
markdown,
|
|
145
|
+
].join('\n'));
|
|
146
|
+
const approvalBlockers = buildApprovalBlockers({
|
|
147
|
+
riskFlags,
|
|
148
|
+
approvedIndex,
|
|
149
|
+
name,
|
|
150
|
+
validationEvidence,
|
|
151
|
+
implementationNotes,
|
|
152
|
+
});
|
|
153
|
+
const safeTimestamp = generatedAt.replace(/[:.]/g, '-');
|
|
154
|
+
const packageDir = path.join(outputDir, `${name}-${safeTimestamp}`);
|
|
155
|
+
const skillPath = path.join(packageDir, 'SKILL.md');
|
|
156
|
+
const manifestPath = path.join(packageDir, 'manifest.json');
|
|
157
|
+
const draft = {
|
|
158
|
+
schemaVersion: SUCCESS_SKILL_SCHEMA_VERSION,
|
|
159
|
+
generatedAt,
|
|
160
|
+
policyVersion: SUCCESS_LEARNING_POLICY_VERSION,
|
|
161
|
+
status: 'draft',
|
|
162
|
+
sourceImplementation: {
|
|
163
|
+
title: singleLine(title),
|
|
164
|
+
summary: singleLine(summary),
|
|
165
|
+
sourceFiles: sourceFiles.map(singleLine).filter(Boolean),
|
|
166
|
+
sourceUrls: sourceUrls.map(singleLine).filter(Boolean),
|
|
167
|
+
},
|
|
168
|
+
candidateSkill: {
|
|
169
|
+
name,
|
|
170
|
+
description: skillDescription,
|
|
171
|
+
triggerPhrases: triggerPhrases.map(singleLine).filter(Boolean),
|
|
172
|
+
skillMarkdownFile: skillPath,
|
|
173
|
+
contentHash: hashValue(markdown),
|
|
174
|
+
},
|
|
175
|
+
evidence: {
|
|
176
|
+
reusablePattern: singleLine(reusablePattern),
|
|
177
|
+
implementationNotes: implementationNotes.map(singleLine).filter(Boolean),
|
|
178
|
+
validationEvidence: validationEvidence.map(singleLine).filter(Boolean),
|
|
179
|
+
},
|
|
180
|
+
governance: {
|
|
181
|
+
requiresHumanApproval: true,
|
|
182
|
+
approved: false,
|
|
183
|
+
approvalBlockers,
|
|
184
|
+
riskFlags,
|
|
185
|
+
},
|
|
186
|
+
...(creatorName ? { creator: { name: singleLine(creatorName), ...(creatorUrl ? { url: singleLine(creatorUrl) } : {}) } } : {}),
|
|
187
|
+
externalCandidates,
|
|
188
|
+
};
|
|
189
|
+
await fs.mkdir(packageDir, { recursive: true });
|
|
190
|
+
await fs.writeFile(skillPath, markdown, 'utf8');
|
|
191
|
+
await fs.writeFile(manifestPath, JSON.stringify(draft, null, 2), 'utf8');
|
|
192
|
+
return { draft, manifestPath, skillPath };
|
|
193
|
+
};
|
|
194
|
+
export const reviewSuccessSkillDraft = async ({ manifestPath, approvedIndex, }) => {
|
|
195
|
+
const draft = await readSuccessSkillDraft(manifestPath);
|
|
196
|
+
if (!draft) {
|
|
197
|
+
return {
|
|
198
|
+
schemaVersion: 'unknown',
|
|
199
|
+
recommendation: 'invalid',
|
|
200
|
+
findings: ['Success skill manifest could not be parsed as JSON.'],
|
|
201
|
+
riskFlags: [],
|
|
202
|
+
approvalBlockers: ['Invalid JSON manifest.'],
|
|
203
|
+
externalUnapprovedCandidates: [],
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
if (draft.schemaVersion !== SUCCESS_SKILL_SCHEMA_VERSION) {
|
|
207
|
+
return {
|
|
208
|
+
schemaVersion: draft.schemaVersion ?? 'unknown',
|
|
209
|
+
generatedAt: draft.generatedAt,
|
|
210
|
+
candidateName: draft.candidateSkill?.name,
|
|
211
|
+
recommendation: 'invalid',
|
|
212
|
+
findings: ['Success skill schema is not supported.'],
|
|
213
|
+
riskFlags: [],
|
|
214
|
+
approvalBlockers: ['Unsupported schema.'],
|
|
215
|
+
externalUnapprovedCandidates: [],
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
const approvedNames = new Set(approvedIndex.skills.map((skill) => normalizeName(skill.name)));
|
|
219
|
+
const approvedHashes = new Set(approvedIndex.skills.map((skill) => skill.contentHash));
|
|
220
|
+
const approvalBlockers = [...draft.governance.approvalBlockers];
|
|
221
|
+
const findings = [];
|
|
222
|
+
if (approvedNames.has(normalizeName(draft.candidateSkill.name))) {
|
|
223
|
+
approvalBlockers.push('A skill with this normalized name is already approved.');
|
|
224
|
+
}
|
|
225
|
+
if (approvedHashes.has(draft.candidateSkill.contentHash)) {
|
|
226
|
+
approvalBlockers.push('A skill with this content hash is already approved.');
|
|
227
|
+
}
|
|
228
|
+
if (draft.evidence.validationEvidence.length === 0) {
|
|
229
|
+
approvalBlockers.push('Validation evidence is missing.');
|
|
230
|
+
}
|
|
231
|
+
if (draft.evidence.implementationNotes.length < 2) {
|
|
232
|
+
approvalBlockers.push('Implementation notes are too thin for reuse.');
|
|
233
|
+
}
|
|
234
|
+
const uniqueBlockers = [...new Set(approvalBlockers)];
|
|
235
|
+
const externalUnapprovedCandidates = draft.externalCandidates.filter((candidate) => candidate.reviewStatus !== 'approved' && candidate.reviewStatus !== 'pending-human-review');
|
|
236
|
+
if (draft.governance.riskFlags.length > 0) {
|
|
237
|
+
findings.push(`${draft.governance.riskFlags.length} risk flag(s) require manual security review.`);
|
|
238
|
+
}
|
|
239
|
+
if (externalUnapprovedCandidates.length > 0) {
|
|
240
|
+
findings.push(`${externalUnapprovedCandidates.length} external candidate(s) are not approved for use.`);
|
|
241
|
+
}
|
|
242
|
+
if (uniqueBlockers.length > 0) {
|
|
243
|
+
findings.push(...uniqueBlockers);
|
|
244
|
+
}
|
|
245
|
+
if (findings.length === 0) {
|
|
246
|
+
findings.push('No blocking issue found. Human approval is still required before activation or distribution.');
|
|
247
|
+
}
|
|
248
|
+
return {
|
|
249
|
+
schemaVersion: draft.schemaVersion,
|
|
250
|
+
generatedAt: draft.generatedAt,
|
|
251
|
+
candidateName: draft.candidateSkill.name,
|
|
252
|
+
recommendation: draft.governance.riskFlags.length > 0
|
|
253
|
+
? 'needs-security-review'
|
|
254
|
+
: uniqueBlockers.length > 0
|
|
255
|
+
? 'needs-more-evidence'
|
|
256
|
+
: 'ready-for-human-approval',
|
|
257
|
+
findings,
|
|
258
|
+
riskFlags: draft.governance.riskFlags,
|
|
259
|
+
approvalBlockers: uniqueBlockers,
|
|
260
|
+
externalUnapprovedCandidates,
|
|
261
|
+
};
|
|
262
|
+
};
|
|
263
|
+
export const listUnapprovedSuccessSkills = async (directory) => {
|
|
264
|
+
const manifests = await findManifestFiles(directory);
|
|
265
|
+
const entries = [];
|
|
266
|
+
for (const manifestPath of manifests) {
|
|
267
|
+
const draft = await readSuccessSkillDraft(manifestPath);
|
|
268
|
+
if (!draft || draft.schemaVersion !== SUCCESS_SKILL_SCHEMA_VERSION)
|
|
269
|
+
continue;
|
|
270
|
+
if (draft.governance.approved)
|
|
271
|
+
continue;
|
|
272
|
+
if (draft.status === 'rejected')
|
|
273
|
+
continue;
|
|
274
|
+
entries.push({
|
|
275
|
+
filePath: manifestPath,
|
|
276
|
+
generatedAt: draft.generatedAt,
|
|
277
|
+
candidateName: draft.candidateSkill.name,
|
|
278
|
+
reason: draft.governance.approvalBlockers.length
|
|
279
|
+
? draft.governance.approvalBlockers.join(' ')
|
|
280
|
+
: 'Pending explicit human approval before activation.',
|
|
281
|
+
riskFlags: draft.governance.riskFlags,
|
|
282
|
+
externalCandidates: draft.externalCandidates,
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
return entries.sort((a, b) => (b.generatedAt ?? '').localeCompare(a.generatedAt ?? ''));
|
|
286
|
+
};
|
|
287
|
+
export const listSuccessSkillDraftManifests = async (directory) => findManifestFiles(directory);
|
|
288
|
+
export const recordSuccessSkillDecision = async ({ manifestPath, decision, decidedBy, reason, }) => {
|
|
289
|
+
const draft = await readSuccessSkillDraft(manifestPath);
|
|
290
|
+
if (!draft || draft.schemaVersion !== SUCCESS_SKILL_SCHEMA_VERSION) {
|
|
291
|
+
throw new Error('Success skill manifest is invalid or unsupported.');
|
|
292
|
+
}
|
|
293
|
+
if (draft.status === 'activated' || draft.governance.approved) {
|
|
294
|
+
throw new Error('Activated or approved skills cannot be moved back by this decision command.');
|
|
295
|
+
}
|
|
296
|
+
const decidedAt = new Date().toISOString();
|
|
297
|
+
const reviewer = decidedBy ?? 'local-human-review';
|
|
298
|
+
const updatedDraft = {
|
|
299
|
+
...draft,
|
|
300
|
+
status: decision === 'pending' ? 'draft' : decision,
|
|
301
|
+
decisionLog: [
|
|
302
|
+
...(draft.decisionLog ?? []),
|
|
303
|
+
{
|
|
304
|
+
decidedAt,
|
|
305
|
+
decidedBy: reviewer,
|
|
306
|
+
decision,
|
|
307
|
+
reason: singleLine(reason),
|
|
308
|
+
notionUpdateRecommended: true,
|
|
309
|
+
},
|
|
310
|
+
],
|
|
311
|
+
};
|
|
312
|
+
await fs.writeFile(manifestPath, JSON.stringify(updatedDraft, null, 2), 'utf8');
|
|
313
|
+
return {
|
|
314
|
+
candidateName: draft.candidateSkill.name,
|
|
315
|
+
manifestPath,
|
|
316
|
+
decision,
|
|
317
|
+
decidedAt,
|
|
318
|
+
decidedBy: reviewer,
|
|
319
|
+
reason: singleLine(reason),
|
|
320
|
+
notionUpdateRecommended: true,
|
|
321
|
+
};
|
|
322
|
+
};
|
|
323
|
+
export const activateSuccessSkillDraft = async ({ manifestPath, approvedIndex, targetRoot, approvedBy, overwrite = false, }) => {
|
|
324
|
+
const draft = await readSuccessSkillDraft(manifestPath);
|
|
325
|
+
if (!draft || draft.schemaVersion !== SUCCESS_SKILL_SCHEMA_VERSION) {
|
|
326
|
+
throw new Error('Success skill manifest is invalid or unsupported.');
|
|
327
|
+
}
|
|
328
|
+
const review = await reviewSuccessSkillDraft({ manifestPath, approvedIndex });
|
|
329
|
+
if (review.recommendation !== 'ready-for-human-approval') {
|
|
330
|
+
throw new Error(`Success skill is not ready for activation: ${review.findings.join(' ')}`);
|
|
331
|
+
}
|
|
332
|
+
const sourceSkillPath = draft.candidateSkill.skillMarkdownFile;
|
|
333
|
+
const skillMarkdown = await fs.readFile(sourceSkillPath, 'utf8');
|
|
334
|
+
if (hashValue(skillMarkdown) !== draft.candidateSkill.contentHash) {
|
|
335
|
+
throw new Error('Draft SKILL.md hash does not match the manifest.');
|
|
336
|
+
}
|
|
337
|
+
const activatedAt = new Date().toISOString();
|
|
338
|
+
const targetDirectory = path.join(targetRoot, draft.candidateSkill.name);
|
|
339
|
+
const installedSkillPath = path.join(targetDirectory, 'SKILL.md');
|
|
340
|
+
const approvalRecordPath = path.join(targetDirectory, 'skill-master-approval.json');
|
|
341
|
+
try {
|
|
342
|
+
await fs.access(targetDirectory);
|
|
343
|
+
if (!overwrite) {
|
|
344
|
+
throw new Error(`Target skill directory already exists: ${targetDirectory}`);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
catch (error) {
|
|
348
|
+
if (error instanceof Error && !('code' in error)) {
|
|
349
|
+
throw error;
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
await fs.mkdir(targetDirectory, { recursive: true });
|
|
353
|
+
await fs.writeFile(installedSkillPath, skillMarkdown, 'utf8');
|
|
354
|
+
await fs.writeFile(approvalRecordPath, JSON.stringify({
|
|
355
|
+
schemaVersion: 'skill-master-success-activation-v1',
|
|
356
|
+
activatedAt,
|
|
357
|
+
approvedBy: approvedBy ?? 'local-human-review',
|
|
358
|
+
sourceManifest: manifestPath,
|
|
359
|
+
candidateName: draft.candidateSkill.name,
|
|
360
|
+
contentHash: draft.candidateSkill.contentHash,
|
|
361
|
+
sourceImplementation: draft.sourceImplementation,
|
|
362
|
+
targetRoot,
|
|
363
|
+
}, null, 2), 'utf8');
|
|
364
|
+
const updatedDraft = {
|
|
365
|
+
...draft,
|
|
366
|
+
status: 'activated',
|
|
367
|
+
governance: {
|
|
368
|
+
...draft.governance,
|
|
369
|
+
approved: true,
|
|
370
|
+
approvedAt: activatedAt,
|
|
371
|
+
approvedBy: approvedBy ?? 'local-human-review',
|
|
372
|
+
approvalBlockers: [],
|
|
373
|
+
},
|
|
374
|
+
};
|
|
375
|
+
await fs.writeFile(manifestPath, JSON.stringify(updatedDraft, null, 2), 'utf8');
|
|
376
|
+
return {
|
|
377
|
+
candidateName: draft.candidateSkill.name,
|
|
378
|
+
targetRoot,
|
|
379
|
+
targetDirectory,
|
|
380
|
+
installedSkillPath,
|
|
381
|
+
approvalRecordPath,
|
|
382
|
+
activatedAt,
|
|
383
|
+
};
|
|
384
|
+
};
|
|
385
|
+
export const prepareSuccessSkillApprovalPackage = async ({ directory, outputDir, approvedIndex, }) => {
|
|
386
|
+
const generatedAt = new Date().toISOString();
|
|
387
|
+
const manifests = await findManifestFiles(directory);
|
|
388
|
+
const rows = await Promise.all(manifests.map(async (manifestPath) => {
|
|
389
|
+
const draft = await readSuccessSkillDraft(manifestPath);
|
|
390
|
+
if (!draft || draft.schemaVersion !== SUCCESS_SKILL_SCHEMA_VERSION) {
|
|
391
|
+
return null;
|
|
392
|
+
}
|
|
393
|
+
const review = await reviewSuccessSkillDraft({ manifestPath, approvedIndex });
|
|
394
|
+
return { manifestPath, draft, review };
|
|
395
|
+
}));
|
|
396
|
+
const entries = rows.filter((entry) => entry !== null);
|
|
397
|
+
const readyForApproval = entries.filter((entry) => entry.review.recommendation === 'ready-for-human-approval').length;
|
|
398
|
+
const needsReview = entries.length - readyForApproval;
|
|
399
|
+
const safeTimestamp = generatedAt.replace(/[:.]/g, '-');
|
|
400
|
+
const filePath = path.join(outputDir, `success-skill-approval-package-${safeTimestamp}.md`);
|
|
401
|
+
const markdown = [
|
|
402
|
+
'# Success Skill Approval Package',
|
|
403
|
+
'',
|
|
404
|
+
`Generated at: ${generatedAt}`,
|
|
405
|
+
`Draft source: ${directory}`,
|
|
406
|
+
`Total drafts: ${entries.length}`,
|
|
407
|
+
`Ready for approval: ${readyForApproval}`,
|
|
408
|
+
`Needs review: ${needsReview}`,
|
|
409
|
+
'',
|
|
410
|
+
'## Human approval checklist',
|
|
411
|
+
'',
|
|
412
|
+
'- [ ] Read each generated SKILL.md before activation.',
|
|
413
|
+
'- [ ] Confirm validation evidence is real and current.',
|
|
414
|
+
'- [ ] Confirm no secrets, destructive commands, or environment-specific assumptions are embedded.',
|
|
415
|
+
'- [ ] Choose the activation target: workspace-local .codex/skills or user-global CODEX_HOME skills.',
|
|
416
|
+
'- [ ] Activate only one skill at a time and re-run catalog refresh afterward.',
|
|
417
|
+
'',
|
|
418
|
+
'## Drafts',
|
|
419
|
+
'',
|
|
420
|
+
...entries.flatMap((entry, index) => [
|
|
421
|
+
`### ${index + 1}. ${entry.draft.candidateSkill.name}`,
|
|
422
|
+
'',
|
|
423
|
+
`Recommendation: ${entry.review.recommendation}`,
|
|
424
|
+
`Manifest: ${entry.manifestPath}`,
|
|
425
|
+
`SKILL.md: ${entry.draft.candidateSkill.skillMarkdownFile}`,
|
|
426
|
+
`Risk flags: ${entry.review.riskFlags.length ? entry.review.riskFlags.join(', ') : 'none'}`,
|
|
427
|
+
`Approval blockers: ${entry.review.approvalBlockers.length ? entry.review.approvalBlockers.join('; ') : 'none'}`,
|
|
428
|
+
'',
|
|
429
|
+
'Findings:',
|
|
430
|
+
...entry.review.findings.map((finding) => `- ${finding}`),
|
|
431
|
+
'',
|
|
432
|
+
]),
|
|
433
|
+
].join('\n');
|
|
434
|
+
await fs.mkdir(outputDir, { recursive: true });
|
|
435
|
+
await fs.writeFile(filePath, markdown, 'utf8');
|
|
436
|
+
return {
|
|
437
|
+
generatedAt,
|
|
438
|
+
filePath,
|
|
439
|
+
totalDrafts: entries.length,
|
|
440
|
+
readyForApproval,
|
|
441
|
+
needsReview,
|
|
442
|
+
};
|
|
443
|
+
};
|
|
444
|
+
//# sourceMappingURL=success-learning.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"success-learning.js","sourceRoot":"","sources":["../src/success-learning.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,MAAM,4BAA4B,GAAG,+BAA+B,CAAC;AACrE,MAAM,+BAA+B,GAAG,oCAAoC,CAAC;AAyG7E,MAAM,SAAS,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAE9F,MAAM,aAAa,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,KAAK;KACnD,SAAS,CAAC,KAAK,CAAC;KAChB,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;KAC/B,WAAW,EAAE;KACb,IAAI,EAAE,CAAC;AAEV,MAAM,gBAAgB,GAAG,CAAC,KAAa,EAAU,EAAE;IACjD,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC;SAC9B,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAChB,OAAO,IAAI,IAAI,uBAAuB,CAAC;AACzC,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAEhF,MAAM,UAAU,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC;AAEnH,MAAM,YAAY,GAAG,CAAC,KAAe,EAAU,EAAE,CAAC,KAAK;KACpD,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;KACtC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEd,MAAM,eAAe,GAAG,CAAC,KAAa,EAAY,EAAE;IAClD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,MAAM,OAAO,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAEpC,IAAI,+BAA+B,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,KAAK,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IAClF,IAAI,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,oCAAoC,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,KAAK,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IACpI,IAAI,0CAA0C,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAC5F,IAAI,6BAA6B,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,KAAK,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IACtF,IAAI,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,KAAK,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IAC3E,IAAI,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,6BAA6B,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACnH,IAAI,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC;QAAE,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAEjH,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;AAC3B,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,EAC1B,IAAI,EACJ,WAAW,EACX,KAAK,EACL,OAAO,EACP,eAAe,EACf,cAAc,EACd,mBAAmB,EACnB,kBAAkB,GAUnB,EAAU,EAAE,CAAC;IACZ,KAAK;IACL,SAAS,IAAI,EAAE;IACf,gBAAgB,UAAU,CAAC,WAAW,CAAC,EAAE;IACzC,KAAK;IACL,EAAE;IACF,KAAK,UAAU,CAAC,KAAK,CAAC,EAAE;IACxB,EAAE;IACF,wBAAwB,UAAU,CAAC,eAAe,CAAC,EAAE;IACrD,EAAE;IACF,uBAAuB;IACvB,EAAE;IACF,UAAU,CAAC,OAAO,CAAC;IACnB,EAAE;IACF,oBAAoB;IACpB,EAAE;IACF,YAAY,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC7D,EAAE;IACF,aAAa;IACb,EAAE;IACF,YAAY,CAAC,mBAAmB,CAAC;IACjC,EAAE;IACF,sBAAsB;IACtB,EAAE;IACF,YAAY,CAAC,kBAAkB,CAAC;IAChC,EAAE;IACF,eAAe;IACf,EAAE;IACF,sEAAsE;IACtE,mGAAmG;IACnG,+GAA+G;IAC/G,EAAE;CACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,MAAM,qBAAqB,GAAG,CAAC,EAC7B,SAAS,EACT,aAAa,EACb,IAAI,EACJ,kBAAkB,EAClB,mBAAmB,GAOpB,EAAY,EAAE;IACb,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAE9F,IAAI,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QAC3C,QAAQ,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;IAC1E,CAAC;IACD,IAAI,kBAAkB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpC,QAAQ,CAAC,IAAI,CAAC,wEAAwE,CAAC,CAAC;IAC1F,CAAC;IACD,IAAI,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,QAAQ,CAAC,IAAI,CAAC,8EAA8E,CAAC,CAAC;IAChG,CAAC;IACD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,QAAQ,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,EAAE,YAAoB,EAAqC,EAAE;IACrG,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAsB,CAAC;IAClF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,KAAK,EAAE,SAAiB,EAAqB,EAAE;IACvE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,KAAK,GAAG,KAAK,EAAE,OAAe,EAAiB,EAAE;QACrD,IAAI,OAAO,CAAC;QACZ,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAChD,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC;YACxB,CAAC;iBAAM,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;gBAC5D,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC;IACvB,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;AACtB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,EAAE,EAC7C,KAAK,EACL,OAAO,EACP,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,cAAc,EACd,WAAW,EACX,UAAU,EACV,aAAa,EACb,WAAW,EACX,WAAW,EACX,UAAU,EACV,kBAAkB,EAClB,aAAa,EACb,SAAS,GAiBV,EAAkF,EAAE;IACnF,MAAM,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC7C,MAAM,IAAI,GAAG,gBAAgB,CAAC,aAAa,IAAI,KAAK,CAAC,CAAC;IACtD,MAAM,gBAAgB,GAAG,UAAU,CAAC,WAAW,IAAI,YAAY,eAAe,EAAE,CAAC,CAAC;IAClF,MAAM,QAAQ,GAAG,kBAAkB,CAAC;QAClC,IAAI;QACJ,WAAW,EAAE,gBAAgB;QAC7B,KAAK;QACL,OAAO;QACP,eAAe;QACf,cAAc;QACd,mBAAmB;QACnB,kBAAkB;KACnB,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,eAAe,CAAC;QAChC,KAAK;QACL,OAAO;QACP,eAAe;QACf,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;QAC9B,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;QAC7B,QAAQ;KACT,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACd,MAAM,gBAAgB,GAAG,qBAAqB,CAAC;QAC7C,SAAS;QACT,aAAa;QACb,IAAI;QACJ,kBAAkB;QAClB,mBAAmB;KACpB,CAAC,CAAC;IAEH,MAAM,aAAa,GAAG,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACxD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,IAAI,aAAa,EAAE,CAAC,CAAC;IACpE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IACpD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;IAE5D,MAAM,KAAK,GAAsB;QAC/B,aAAa,EAAE,4BAA4B;QAC3C,WAAW;QACX,aAAa,EAAE,+BAA+B;QAC9C,MAAM,EAAE,OAAO;QACf,oBAAoB,EAAE;YACpB,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC;YACxB,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC;YAC5B,WAAW,EAAE,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;YACxD,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;SACvD;QACD,cAAc,EAAE;YACd,IAAI;YACJ,WAAW,EAAE,gBAAgB;YAC7B,cAAc,EAAE,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;YAC9D,iBAAiB,EAAE,SAAS;YAC5B,WAAW,EAAE,SAAS,CAAC,QAAQ,CAAC;SACjC;QACD,QAAQ,EAAE;YACR,eAAe,EAAE,UAAU,CAAC,eAAe,CAAC;YAC5C,mBAAmB,EAAE,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;YACxE,kBAAkB,EAAE,kBAAkB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;SACvE;QACD,UAAU,EAAE;YACV,qBAAqB,EAAE,IAAI;YAC3B,QAAQ,EAAE,KAAK;YACf,gBAAgB;YAChB,SAAS;SACV;QACD,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,UAAU,CAAC,WAAW,CAAC,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9H,kBAAkB;KACnB,CAAC;IAEF,MAAM,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,MAAM,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAChD,MAAM,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAEzE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC;AAC5C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAG,KAAK,EAAE,EAC5C,YAAY,EACZ,aAAa,GAId,EAA+B,EAAE;IAChC,MAAM,KAAK,GAAG,MAAM,qBAAqB,CAAC,YAAY,CAAC,CAAC;IACxD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;YACL,aAAa,EAAE,SAAS;YACxB,cAAc,EAAE,SAAS;YACzB,QAAQ,EAAE,CAAC,qDAAqD,CAAC;YACjE,SAAS,EAAE,EAAE;YACb,gBAAgB,EAAE,CAAC,wBAAwB,CAAC;YAC5C,4BAA4B,EAAE,EAAE;SACjC,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,CAAC,aAAa,KAAK,4BAA4B,EAAE,CAAC;QACzD,OAAO;YACL,aAAa,EAAE,KAAK,CAAC,aAAa,IAAI,SAAS;YAC/C,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,aAAa,EAAE,KAAK,CAAC,cAAc,EAAE,IAAI;YACzC,cAAc,EAAE,SAAS;YACzB,QAAQ,EAAE,CAAC,wCAAwC,CAAC;YACpD,SAAS,EAAE,EAAE;YACb,gBAAgB,EAAE,CAAC,qBAAqB,CAAC;YACzC,4BAA4B,EAAE,EAAE;SACjC,CAAC;IACJ,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9F,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;IACvF,MAAM,gBAAgB,GAAG,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAChE,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,IAAI,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QAChE,gBAAgB,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;IAClF,CAAC;IACD,IAAI,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,CAAC;QACzD,gBAAgB,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;IAC/E,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnD,gBAAgB,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IAC3D,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClD,gBAAgB,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,cAAc,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC;IACtD,MAAM,4BAA4B,GAAG,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CACjF,SAAS,CAAC,YAAY,KAAK,UAAU,IAAI,SAAS,CAAC,YAAY,KAAK,sBAAsB,CAC3F,CAAC;IAEF,IAAI,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1C,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,+CAA+C,CAAC,CAAC;IACrG,CAAC;IACD,IAAI,4BAA4B,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5C,QAAQ,CAAC,IAAI,CAAC,GAAG,4BAA4B,CAAC,MAAM,kDAAkD,CAAC,CAAC;IAC1G,CAAC;IACD,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,QAAQ,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,CAAC;IACnC,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,QAAQ,CAAC,IAAI,CAAC,8FAA8F,CAAC,CAAC;IAChH,CAAC;IAED,OAAO;QACL,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,aAAa,EAAE,KAAK,CAAC,cAAc,CAAC,IAAI;QACxC,cAAc,EAAE,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;YACnD,CAAC,CAAC,uBAAuB;YACzB,CAAC,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC;gBACzB,CAAC,CAAC,qBAAqB;gBACvB,CAAC,CAAC,0BAA0B;QAChC,QAAQ;QACR,SAAS,EAAE,KAAK,CAAC,UAAU,CAAC,SAAS;QACrC,gBAAgB,EAAE,cAAc;QAChC,4BAA4B;KAC7B,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,2BAA2B,GAAG,KAAK,EAAE,SAAiB,EAA0C,EAAE;IAC7G,MAAM,SAAS,GAAG,MAAM,iBAAiB,CAAC,SAAS,CAAC,CAAC;IACrD,MAAM,OAAO,GAAkC,EAAE,CAAC;IAElD,KAAK,MAAM,YAAY,IAAI,SAAS,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,MAAM,qBAAqB,CAAC,YAAY,CAAC,CAAC;QACxD,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,aAAa,KAAK,4BAA4B;YAAE,SAAS;QAC7E,IAAI,KAAK,CAAC,UAAU,CAAC,QAAQ;YAAE,SAAS;QACxC,IAAI,KAAK,CAAC,MAAM,KAAK,UAAU;YAAE,SAAS;QAE1C,OAAO,CAAC,IAAI,CAAC;YACX,QAAQ,EAAE,YAAY;YACtB,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,aAAa,EAAE,KAAK,CAAC,cAAc,CAAC,IAAI;YACxC,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,gBAAgB,CAAC,MAAM;gBAC9C,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC;gBAC7C,CAAC,CAAC,oDAAoD;YACxD,SAAS,EAAE,KAAK,CAAC,UAAU,CAAC,SAAS;YACrC,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;SAC7C,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,CAAC;AAC1F,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,8BAA8B,GAAG,KAAK,EAAE,SAAiB,EAAqB,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;AAE3H,MAAM,CAAC,MAAM,0BAA0B,GAAG,KAAK,EAAE,EAC/C,YAAY,EACZ,QAAQ,EACR,SAAS,EACT,MAAM,GAMP,EAAiC,EAAE;IAClC,MAAM,KAAK,GAAG,MAAM,qBAAqB,CAAC,YAAY,CAAC,CAAC;IACxD,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,aAAa,KAAK,4BAA4B,EAAE,CAAC;QACnE,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,WAAW,IAAI,KAAK,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;QAC9D,MAAM,IAAI,KAAK,CAAC,6EAA6E,CAAC,CAAC;IACjG,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,MAAM,QAAQ,GAAG,SAAS,IAAI,oBAAoB,CAAC;IACnD,MAAM,YAAY,GAAsB;QACtC,GAAG,KAAK;QACR,MAAM,EAAE,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ;QACnD,WAAW,EAAE;YACX,GAAG,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC;YAC5B;gBACE,SAAS;gBACT,SAAS,EAAE,QAAQ;gBACnB,QAAQ;gBACR,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC;gBAC1B,uBAAuB,EAAE,IAAI;aAC9B;SACF;KACF,CAAC;IAEF,MAAM,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAEhF,OAAO;QACL,aAAa,EAAE,KAAK,CAAC,cAAc,CAAC,IAAI;QACxC,YAAY;QACZ,QAAQ;QACR,SAAS;QACT,SAAS,EAAE,QAAQ;QACnB,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC;QAC1B,uBAAuB,EAAE,IAAI;KAC9B,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG,KAAK,EAAE,EAC9C,YAAY,EACZ,aAAa,EACb,UAAU,EACV,UAAU,EACV,SAAS,GAAG,KAAK,GAOlB,EAAmC,EAAE;IACpC,MAAM,KAAK,GAAG,MAAM,qBAAqB,CAAC,YAAY,CAAC,CAAC;IACxD,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,aAAa,KAAK,4BAA4B,EAAE,CAAC;QACnE,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,uBAAuB,CAAC,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC,CAAC;IAC9E,IAAI,MAAM,CAAC,cAAc,KAAK,0BAA0B,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,8CAA8C,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC7F,CAAC;IAED,MAAM,eAAe,GAAG,KAAK,CAAC,cAAc,CAAC,iBAAiB,CAAC;IAC/D,MAAM,aAAa,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;IACjE,IAAI,SAAS,CAAC,aAAa,CAAC,KAAK,KAAK,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC;QAClE,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC7C,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IACzE,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;IAClE,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,4BAA4B,CAAC,CAAC;IAEpF,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QACjC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,0CAA0C,eAAe,EAAE,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,IAAI,KAAK,YAAY,KAAK,IAAI,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,EAAE,CAAC;YACjD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,MAAM,EAAE,CAAC,KAAK,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,MAAM,EAAE,CAAC,SAAS,CAAC,kBAAkB,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;IAC9D,MAAM,EAAE,CAAC,SAAS,CAAC,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC;QACpD,aAAa,EAAE,oCAAoC;QACnD,WAAW;QACX,UAAU,EAAE,UAAU,IAAI,oBAAoB;QAC9C,cAAc,EAAE,YAAY;QAC5B,aAAa,EAAE,KAAK,CAAC,cAAc,CAAC,IAAI;QACxC,WAAW,EAAE,KAAK,CAAC,cAAc,CAAC,WAAW;QAC7C,oBAAoB,EAAE,KAAK,CAAC,oBAAoB;QAChD,UAAU;KACX,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAErB,MAAM,YAAY,GAAsB;QACtC,GAAG,KAAK;QACR,MAAM,EAAE,WAAW;QACnB,UAAU,EAAE;YACV,GAAG,KAAK,CAAC,UAAU;YACnB,QAAQ,EAAE,IAAI;YACd,UAAU,EAAE,WAAW;YACvB,UAAU,EAAE,UAAU,IAAI,oBAAoB;YAC9C,gBAAgB,EAAE,EAAE;SACrB;KACF,CAAC;IACF,MAAM,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAEhF,OAAO;QACL,aAAa,EAAE,KAAK,CAAC,cAAc,CAAC,IAAI;QACxC,UAAU;QACV,eAAe;QACf,kBAAkB;QAClB,kBAAkB;QAClB,WAAW;KACZ,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kCAAkC,GAAG,KAAK,EAAE,EACvD,SAAS,EACT,SAAS,EACT,aAAa,GAKd,EAAwC,EAAE;IACzC,MAAM,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC7C,MAAM,SAAS,GAAG,MAAM,iBAAiB,CAAC,SAAS,CAAC,CAAC;IACrD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE;QAClE,MAAM,KAAK,GAAG,MAAM,qBAAqB,CAAC,YAAY,CAAC,CAAC;QACxD,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,aAAa,KAAK,4BAA4B,EAAE,CAAC;YACnE,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,uBAAuB,CAAC,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC,CAAC;QAC9E,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IACzC,CAAC,CAAC,CAAC,CAAC;IACJ,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAsC,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC;IAC3F,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,KAAK,0BAA0B,CAAC,CAAC,MAAM,CAAC;IACtH,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,gBAAgB,CAAC;IACtD,MAAM,aAAa,GAAG,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,kCAAkC,aAAa,KAAK,CAAC,CAAC;IAC5F,MAAM,QAAQ,GAAG;QACf,kCAAkC;QAClC,EAAE;QACF,iBAAiB,WAAW,EAAE;QAC9B,iBAAiB,SAAS,EAAE;QAC5B,iBAAiB,OAAO,CAAC,MAAM,EAAE;QACjC,uBAAuB,gBAAgB,EAAE;QACzC,iBAAiB,WAAW,EAAE;QAC9B,EAAE;QACF,6BAA6B;QAC7B,EAAE;QACF,uDAAuD;QACvD,wDAAwD;QACxD,mGAAmG;QACnG,qGAAqG;QACrG,+EAA+E;QAC/E,EAAE;QACF,WAAW;QACX,EAAE;QACF,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC;YACnC,OAAO,KAAK,GAAG,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE;YACtD,EAAE;YACF,mBAAmB,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE;YAChD,aAAa,KAAK,CAAC,YAAY,EAAE;YACjC,aAAa,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,iBAAiB,EAAE;YAC3D,eAAe,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE;YAC3F,sBAAsB,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE;YAChH,EAAE;YACF,WAAW;YACX,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,OAAO,EAAE,CAAC;YACzD,EAAE;SACH,CAAC;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAE/C,OAAO;QACL,WAAW;QACX,QAAQ;QACR,WAAW,EAAE,OAAO,CAAC,MAAM;QAC3B,gBAAgB;QAChB,WAAW;KACZ,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
# Aprendizado de Implementacoes Bem-Sucedidas
|
|
2
|
+
|
|
3
|
+
Este documento define como o `skill_master` deve aprender com implementacoes que deram certo sem transformar tentativa isolada em comportamento automatico perigoso.
|
|
4
|
+
|
|
5
|
+
## Principio
|
|
6
|
+
|
|
7
|
+
Uma implementacao bem-sucedida pode virar uma skill quando existe:
|
|
8
|
+
|
|
9
|
+
- contexto claro do problema resolvido;
|
|
10
|
+
- padrao reutilizavel, e nao apenas um comando pontual;
|
|
11
|
+
- evidencias de validacao;
|
|
12
|
+
- limites de uso;
|
|
13
|
+
- revisao humana antes de ativacao, instalacao ou publicacao.
|
|
14
|
+
|
|
15
|
+
O fluxo segue a mesma linha da rede segura de skills: catalogar, preparar rascunho, revisar, aprovar e so entao distribuir.
|
|
16
|
+
|
|
17
|
+
## Referencias tecnicas pesquisadas
|
|
18
|
+
|
|
19
|
+
- Claude Code Skills: uma skill deve ter `SKILL.md`, descricao para ativacao por relevancia e corpo carregado somente quando usado. Referencia: `https://docs.anthropic.com/en/docs/claude-code/skills`.
|
|
20
|
+
- Model Context Protocol Tools: ferramentas MCP devem expor acoes com schemas claros e metadados, evitando efeitos colaterais implicitos. Referencia: `https://modelcontextprotocol.io/docs/concepts/tools`.
|
|
21
|
+
- OpenAI Evals: mudancas de comportamento de IA devem ser avaliadas com exemplos, criterios e regressao antes de virarem comportamento confiavel. Referencia: `https://platform.openai.com/docs/guides/evals`.
|
|
22
|
+
|
|
23
|
+
## Pipeline proposto
|
|
24
|
+
|
|
25
|
+
1. Registrar o sucesso
|
|
26
|
+
- titulo da implementacao;
|
|
27
|
+
- resumo;
|
|
28
|
+
- arquivos ou links de origem;
|
|
29
|
+
- comandos de validacao;
|
|
30
|
+
- evidencias objetivas de que funcionou.
|
|
31
|
+
|
|
32
|
+
2. Extrair o padrao reutilizavel
|
|
33
|
+
- quando usar;
|
|
34
|
+
- quando nao usar;
|
|
35
|
+
- passos essenciais;
|
|
36
|
+
- pre-condicoes;
|
|
37
|
+
- riscos conhecidos.
|
|
38
|
+
|
|
39
|
+
3. Gerar rascunho local
|
|
40
|
+
- criar `SKILL.md` em uma pasta de staging;
|
|
41
|
+
- criar `manifest.json` com evidencias, hashes, riscos e origem;
|
|
42
|
+
- nao copiar para `~/.codex/skills`;
|
|
43
|
+
- nao publicar no npm;
|
|
44
|
+
- nao habilitar automaticamente.
|
|
45
|
+
|
|
46
|
+
4. Revisar
|
|
47
|
+
- checar duplicidade por nome e hash;
|
|
48
|
+
- exigir evidencias;
|
|
49
|
+
- marcar conteudo arriscado;
|
|
50
|
+
- listar candidatos externos nao aprovados com link do criador.
|
|
51
|
+
|
|
52
|
+
5. Aprovar manualmente
|
|
53
|
+
- somente depois da aprovacao humana a skill pode ser instalada em um diretorio ativo;
|
|
54
|
+
- publicacao para todos continua exigindo autorizacao explicita do usuario.
|
|
55
|
+
|
|
56
|
+
6. Ativar em um escopo escolhido
|
|
57
|
+
- workspace-local: `.codex/skills` dentro do projeto atual;
|
|
58
|
+
- user-global: `${CODEX_HOME:-~/.codex}/skills`;
|
|
59
|
+
- custom: caminho informado explicitamente pelo operador.
|
|
60
|
+
|
|
61
|
+
## Ferramentas MCP adicionadas
|
|
62
|
+
|
|
63
|
+
- `skill_master_prepare_success_skill`
|
|
64
|
+
- gera pacote local com `SKILL.md` e `manifest.json`;
|
|
65
|
+
- registra evidencias, riscos e candidatos externos;
|
|
66
|
+
- nao instala nem ativa.
|
|
67
|
+
|
|
68
|
+
- `skill_master_review_success_skill`
|
|
69
|
+
- revisa o manifesto;
|
|
70
|
+
- retorna recomendacao: `ready-for-human-approval`, `needs-more-evidence`, `needs-security-review` ou `invalid`.
|
|
71
|
+
|
|
72
|
+
- `skill_master_list_unapproved_success_skills`
|
|
73
|
+
- lista rascunhos locais ainda nao aprovados;
|
|
74
|
+
- inclui candidatos externos, motivo e links do criador.
|
|
75
|
+
|
|
76
|
+
- `skill_master_prepare_success_skill_approval_package`
|
|
77
|
+
- cria um pacote Markdown local com checklist de revisao humana;
|
|
78
|
+
- lista recomendacao, riscos, bloqueios e caminhos de cada draft.
|
|
79
|
+
|
|
80
|
+
- `skill_master_activate_success_skill`
|
|
81
|
+
- ativa uma skill aprendida em escopo local, global ou customizado;
|
|
82
|
+
- exige `confirm_activation: true`;
|
|
83
|
+
- grava um registro de aprovacao junto da skill instalada.
|
|
84
|
+
|
|
85
|
+
## Menu e notificacoes
|
|
86
|
+
|
|
87
|
+
O `skill-master-menu` mostra notificacoes no banner quando existem:
|
|
88
|
+
|
|
89
|
+
- drafts de skills aprendidas aguardando decisao;
|
|
90
|
+
- skills externas para estudo ainda nao aprovadas.
|
|
91
|
+
|
|
92
|
+
Acoes adicionadas:
|
|
93
|
+
|
|
94
|
+
- `notifications`: mostra pendencias e acoes sugeridas;
|
|
95
|
+
- `study-skills`: lista links de estudo e criadores;
|
|
96
|
+
- `approval-package`: gera pacote de aprovacao humana;
|
|
97
|
+
- `activate-learned-local`: ativa uma skill em `.codex/skills` do workspace;
|
|
98
|
+
- `activate-learned-global`: ativa uma skill em `${CODEX_HOME:-~/.codex}/skills`.
|
|
99
|
+
|
|
100
|
+
## Regra para candidatos externos
|
|
101
|
+
|
|
102
|
+
Skills encontradas na web ou em repositorios externos podem ajudar, mas entram como `unapproved` ate passarem pelo fluxo interno.
|
|
103
|
+
|
|
104
|
+
Campos minimos:
|
|
105
|
+
|
|
106
|
+
- nome;
|
|
107
|
+
- descricao;
|
|
108
|
+
- link da skill;
|
|
109
|
+
- nome do criador;
|
|
110
|
+
- link do criador;
|
|
111
|
+
- motivo de nao aprovacao;
|
|
112
|
+
- flags de risco.
|
|
113
|
+
|
|
114
|
+
## Estado atual da busca web pelo skill_master
|
|
115
|
+
|
|
116
|
+
No estado atual, `sources.json` cataloga skills locais do usuario e tambem roots de workspace:
|
|
117
|
+
|
|
118
|
+
- `.codex/skills`
|
|
119
|
+
- `.agents/skills`
|
|
120
|
+
|
|
121
|
+
Isso permite que uma skill aprendida e ativada no workspace apareca como fonte `workspace` no catalogo.
|
|
122
|
+
|
|
123
|
+
`webSources` continua vazio por padrao. Portanto, `skill_master_refresh_catalog` com `include_web: true` nao encontra skills web enquanto nao houver fontes allowlisted.
|
|
124
|
+
|
|
125
|
+
Isso e intencionalmente seguro: antes de usar skills externas, uma fonte GitHub precisa ser adicionada explicitamente, revisada e mantida como nao confiavel ate aprovacao.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Arquitetura de Atualizacao Automatica
|
|
2
|
+
|
|
3
|
+
> STATUS: HISTORICO COM PARTES AINDA VALIDAS
|
|
4
|
+
>
|
|
5
|
+
> Este documento nasceu na fase `00.01`.
|
|
6
|
+
> A base conceitual continua util, mas o estado operacional atual deve ser conferido junto com:
|
|
7
|
+
> - `README.md`
|
|
8
|
+
> - `docs/operations/GUIA_MULTI_COMPUTADOR.md`
|
|
9
|
+
> - `docs/operations/GUIA_NPM_PUBLICO.md`
|