ace-swarm 2.0.6 → 2.0.7

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 (110) hide show
  1. package/README.md +17 -0
  2. package/assets/.agents/skills/landing-review-watcher/SKILL.md +68 -0
  3. package/assets/.agents/skills/problem-triage/SKILL.md +57 -0
  4. package/assets/.agents/skills/problem-triage/agents/openai.yaml +3 -0
  5. package/assets/.agents/skills/skill-auditor/SKILL.md +52 -0
  6. package/assets/.github/hooks/ace-copilot.json +68 -0
  7. package/assets/agent-state/ACE_WORKFLOW.md +66 -0
  8. package/assets/agent-state/INTERFACE_REGISTRY.md +50 -0
  9. package/assets/agent-state/MODULES/gates/gate-typescript-public-surface.json +7 -0
  10. package/assets/agent-state/MODULES/registry.json +10 -2
  11. package/assets/agent-state/MODULES/schemas/ACE_RUNTIME_PROFILE.schema.json +210 -0
  12. package/assets/agent-state/MODULES/schemas/RUNTIME_EXECUTOR_SESSION_REGISTRY.schema.json +290 -0
  13. package/assets/agent-state/MODULES/schemas/RUNTIME_TOOL_SPEC_REGISTRY.schema.json +144 -0
  14. package/assets/agent-state/MODULES/schemas/TRACKER_SNAPSHOT.schema.json +134 -0
  15. package/assets/agent-state/MODULES/schemas/VERICIFY_BRIDGE_SNAPSHOT.schema.json +157 -0
  16. package/assets/agent-state/MODULES/schemas/VERICIFY_PROCESS_POST_LOG.schema.json +92 -0
  17. package/assets/agent-state/MODULES/schemas/WORKSPACE_SESSION_REGISTRY.schema.json +133 -0
  18. package/assets/agent-state/SKILL_CATALOG.md +48 -0
  19. package/assets/agent-state/runtime-executor-sessions.json +5 -0
  20. package/assets/agent-state/runtime-tool-specs.json +5 -0
  21. package/assets/agent-state/runtime-workspaces.json +5 -0
  22. package/assets/agent-state/tracker-snapshot.json +7 -0
  23. package/assets/agent-state/vericify/ace-bridge.json +60 -0
  24. package/assets/agent-state/vericify/process-posts.json +5 -0
  25. package/assets/scripts/copilot-hook-dispatch.mjs +267 -0
  26. package/dist/helpers.d.ts.map +1 -1
  27. package/dist/helpers.js +284 -1
  28. package/dist/helpers.js.map +1 -1
  29. package/dist/problem-triage.d.ts +23 -0
  30. package/dist/problem-triage.d.ts.map +1 -0
  31. package/dist/problem-triage.js +429 -0
  32. package/dist/problem-triage.js.map +1 -0
  33. package/dist/prompts.d.ts.map +1 -1
  34. package/dist/prompts.js +46 -0
  35. package/dist/prompts.js.map +1 -1
  36. package/dist/public-surface.d.ts +30 -0
  37. package/dist/public-surface.d.ts.map +1 -0
  38. package/dist/public-surface.js +310 -0
  39. package/dist/public-surface.js.map +1 -0
  40. package/dist/resources.d.ts.map +1 -1
  41. package/dist/resources.js +148 -0
  42. package/dist/resources.js.map +1 -1
  43. package/dist/runtime-command.d.ts +18 -0
  44. package/dist/runtime-command.d.ts.map +1 -0
  45. package/dist/runtime-command.js +76 -0
  46. package/dist/runtime-command.js.map +1 -0
  47. package/dist/runtime-executor.d.ts +104 -0
  48. package/dist/runtime-executor.d.ts.map +1 -0
  49. package/dist/runtime-executor.js +774 -0
  50. package/dist/runtime-executor.js.map +1 -0
  51. package/dist/runtime-profile.d.ts +98 -0
  52. package/dist/runtime-profile.d.ts.map +1 -0
  53. package/dist/runtime-profile.js +441 -0
  54. package/dist/runtime-profile.js.map +1 -0
  55. package/dist/runtime-tool-specs.d.ts +68 -0
  56. package/dist/runtime-tool-specs.d.ts.map +1 -0
  57. package/dist/runtime-tool-specs.js +424 -0
  58. package/dist/runtime-tool-specs.js.map +1 -0
  59. package/dist/schemas.d.ts +6 -0
  60. package/dist/schemas.d.ts.map +1 -1
  61. package/dist/schemas.js +305 -0
  62. package/dist/schemas.js.map +1 -1
  63. package/dist/shared.d.ts +36 -3
  64. package/dist/shared.d.ts.map +1 -1
  65. package/dist/shared.js +36 -3
  66. package/dist/shared.js.map +1 -1
  67. package/dist/skill-auditor.d.ts +26 -0
  68. package/dist/skill-auditor.d.ts.map +1 -0
  69. package/dist/skill-auditor.js +184 -0
  70. package/dist/skill-auditor.js.map +1 -0
  71. package/dist/skill-catalog.d.ts +60 -0
  72. package/dist/skill-catalog.d.ts.map +1 -0
  73. package/dist/skill-catalog.js +263 -0
  74. package/dist/skill-catalog.js.map +1 -0
  75. package/dist/status-events.d.ts.map +1 -1
  76. package/dist/status-events.js +51 -8
  77. package/dist/status-events.js.map +1 -1
  78. package/dist/tools-agent.d.ts.map +1 -1
  79. package/dist/tools-agent.js +869 -0
  80. package/dist/tools-agent.js.map +1 -1
  81. package/dist/tools-files.d.ts.map +1 -1
  82. package/dist/tools-files.js +212 -1
  83. package/dist/tools-files.js.map +1 -1
  84. package/dist/tools-framework.d.ts.map +1 -1
  85. package/dist/tools-framework.js +86 -0
  86. package/dist/tools-framework.js.map +1 -1
  87. package/dist/tools-skills.d.ts +3 -0
  88. package/dist/tools-skills.d.ts.map +1 -0
  89. package/dist/tools-skills.js +104 -0
  90. package/dist/tools-skills.js.map +1 -0
  91. package/dist/tools.d.ts.map +1 -1
  92. package/dist/tools.js +2 -0
  93. package/dist/tools.js.map +1 -1
  94. package/dist/tracker-adapters.d.ts +74 -0
  95. package/dist/tracker-adapters.d.ts.map +1 -0
  96. package/dist/tracker-adapters.js +777 -0
  97. package/dist/tracker-adapters.js.map +1 -0
  98. package/dist/tracker-sync.d.ts +10 -0
  99. package/dist/tracker-sync.d.ts.map +1 -0
  100. package/dist/tracker-sync.js +84 -0
  101. package/dist/tracker-sync.js.map +1 -0
  102. package/dist/vericify-bridge.d.ts +142 -0
  103. package/dist/vericify-bridge.d.ts.map +1 -0
  104. package/dist/vericify-bridge.js +481 -0
  105. package/dist/vericify-bridge.js.map +1 -0
  106. package/dist/workspace-manager.d.ts +103 -0
  107. package/dist/workspace-manager.d.ts.map +1 -0
  108. package/dist/workspace-manager.js +526 -0
  109. package/dist/workspace-manager.js.map +1 -0
  110. package/package.json +1 -1
@@ -0,0 +1,184 @@
1
+ import { safeWrite } from "./helpers.js";
2
+ import { listSkillCatalogEntries, summarizeSkillCatalog, } from "./skill-catalog.js";
3
+ function pushFinding(findings, severity, code, message) {
4
+ findings.push({ severity, code, message });
5
+ }
6
+ function clampScore(value) {
7
+ return Math.max(0, Math.min(100, value));
8
+ }
9
+ function auditSkillEntry(entry) {
10
+ const findings = [];
11
+ const strengths = [];
12
+ let score = 100;
13
+ if (entry.has_frontmatter) {
14
+ strengths.push("Portable frontmatter is present.");
15
+ }
16
+ else {
17
+ pushFinding(findings, "fail", "frontmatter", "Missing skill frontmatter.");
18
+ score -= 25;
19
+ }
20
+ if (entry.description.trim().length > 0) {
21
+ strengths.push("Description is present.");
22
+ }
23
+ else {
24
+ pushFinding(findings, "fail", "description", "Missing frontmatter description.");
25
+ score -= 15;
26
+ }
27
+ if (summarizeSkillCatalog([entry]).trigger_aware_descriptions > 0) {
28
+ strengths.push("Description is trigger-oriented.");
29
+ }
30
+ else {
31
+ pushFinding(findings, "fail", "trigger_description", "Description does not clearly say when to use the skill.");
32
+ score -= 15;
33
+ }
34
+ if (entry.has_use_cases_section) {
35
+ strengths.push("Canonical use cases are documented.");
36
+ }
37
+ else {
38
+ pushFinding(findings, "fail", "use_cases", "Missing canonical use cases/examples section.");
39
+ score -= 10;
40
+ }
41
+ if (entry.has_inputs_section && entry.has_workflow_section && entry.has_outputs_section) {
42
+ strengths.push("Core workflow contract sections are present.");
43
+ }
44
+ else {
45
+ if (!entry.has_inputs_section) {
46
+ pushFinding(findings, "fail", "inputs", "Missing Inputs section.");
47
+ score -= 10;
48
+ }
49
+ if (!entry.has_workflow_section) {
50
+ pushFinding(findings, "fail", "workflow", "Missing Workflow/Steps section.");
51
+ score -= 10;
52
+ }
53
+ if (!entry.has_outputs_section) {
54
+ pushFinding(findings, "fail", "outputs", "Missing Outputs/Artifacts section.");
55
+ score -= 10;
56
+ }
57
+ }
58
+ if (entry.has_failure_policy) {
59
+ strengths.push("Failure policy is explicit.");
60
+ }
61
+ else {
62
+ pushFinding(findings, "fail", "failure_policy", "Missing Failure Policy/Troubleshooting section.");
63
+ score -= 10;
64
+ }
65
+ if (entry.has_validation_surface) {
66
+ strengths.push("Validation or canary surface is documented.");
67
+ }
68
+ else {
69
+ pushFinding(findings, "warn", "validation_surface", "Validation/canary surface is not obvious from the portable skill contract.");
70
+ score -= 8;
71
+ }
72
+ if (entry.has_portability_notes) {
73
+ strengths.push("Vendor-neutral portability guidance is documented.");
74
+ }
75
+ else {
76
+ pushFinding(findings, "warn", "portability_notes", "Portability/cross-client guidance is missing from SKILL.md.");
77
+ score -= 6;
78
+ }
79
+ if (entry.line_count > 500 && !entry.has_references_dir) {
80
+ pushFinding(findings, "warn", "progressive_disclosure", "Long skill should move bulky detail into references/ for progressive disclosure.");
81
+ score -= 8;
82
+ }
83
+ else if (entry.line_count > 500 && entry.has_references_dir) {
84
+ strengths.push("Long skill already uses references/ for progressive disclosure.");
85
+ }
86
+ if (entry.has_optional_adapters) {
87
+ strengths.push(`Optional client adapters detected: ${entry.adapter_overlay_clients.join(", ")}.`);
88
+ if (!entry.has_portability_notes) {
89
+ pushFinding(findings, "warn", "adapter_parity", "Adapter overlays exist, but portable parity guidance is not explicit in SKILL.md.");
90
+ score -= 5;
91
+ }
92
+ }
93
+ const status = findings.some((finding) => finding.severity === "fail")
94
+ ? "fail"
95
+ : findings.length > 0
96
+ ? "warn"
97
+ : "pass";
98
+ return {
99
+ adapter_clients: entry.adapter_overlay_clients,
100
+ findings,
101
+ name: entry.name,
102
+ score: clampScore(score),
103
+ source: entry.source,
104
+ status,
105
+ strengths,
106
+ };
107
+ }
108
+ function buildRolloutBacklog(summary) {
109
+ const backlog = [];
110
+ if (summary.skills_missing_validation_surface.length > 0) {
111
+ backlog.push(`Add validation/canary surfaces for ${summary.skills_missing_validation_surface.length} skills.`);
112
+ }
113
+ if (summary.skills_missing_portability_notes.length > 0) {
114
+ backlog.push(`Add vendor-neutral portability notes for ${summary.skills_missing_portability_notes.length} skills.`);
115
+ }
116
+ if (summary.progressive_disclosure_gaps.length > 0) {
117
+ backlog.push(`Split ${summary.progressive_disclosure_gaps.length} long skills into slimmer SKILL.md + references/ layouts.`);
118
+ }
119
+ if (summary.skills_missing_core_sections.length > 0) {
120
+ backlog.push(`Repair core contract sections for ${summary.skills_missing_core_sections.length} skills.`);
121
+ }
122
+ if (summary.skills_missing_use_cases.length > 0) {
123
+ backlog.push(`Add canonical use cases for ${summary.skills_missing_use_cases.length} skills.`);
124
+ }
125
+ return backlog;
126
+ }
127
+ export function auditSkillCatalog(entries = listSkillCatalogEntries()) {
128
+ const summary = summarizeSkillCatalog(entries);
129
+ return {
130
+ entries: entries
131
+ .map((entry) => auditSkillEntry(entry))
132
+ .sort((a, b) => {
133
+ if (a.status !== b.status) {
134
+ const rank = { fail: 0, warn: 1, pass: 2 };
135
+ return rank[a.status] - rank[b.status];
136
+ }
137
+ return a.name.localeCompare(b.name);
138
+ }),
139
+ generated_at: new Date().toISOString(),
140
+ rollout_backlog: buildRolloutBacklog(summary),
141
+ summary,
142
+ };
143
+ }
144
+ export function renderSkillAuditReport(result) {
145
+ const passCount = result.entries.filter((entry) => entry.status === "pass").length;
146
+ const warnCount = result.entries.filter((entry) => entry.status === "warn").length;
147
+ const failCount = result.entries.filter((entry) => entry.status === "fail").length;
148
+ const lines = [
149
+ "# SKILL_AUDIT_REPORT",
150
+ "",
151
+ `Generated: ${result.generated_at}`,
152
+ "",
153
+ "## Summary",
154
+ `- total skills: \`${result.summary.total_skills}\``,
155
+ `- portable-contract-ready skills: \`${result.summary.portable_contract_ready_skills}\``,
156
+ `- pass/warn/fail: \`${passCount}\` / \`${warnCount}\` / \`${failCount}\``,
157
+ `- skills with validation surface: \`${result.summary.with_validation_surface}\``,
158
+ `- skills with portability notes: \`${result.summary.with_portability_notes}\``,
159
+ `- skills with optional adapters: \`${result.summary.with_adapter_overlays}\``,
160
+ `- adapter clients observed: \`${result.summary.adapter_clients.length > 0 ? result.summary.adapter_clients.join(", ") : "none"}\``,
161
+ `- legacy openai overlays observed: \`${result.summary.with_openai_yaml}\``,
162
+ "",
163
+ ];
164
+ if (result.rollout_backlog.length > 0) {
165
+ lines.push("## Rollout Backlog");
166
+ lines.push(...result.rollout_backlog.map((item) => `- ${item}`));
167
+ lines.push("");
168
+ }
169
+ lines.push("## Per Skill");
170
+ for (const entry of result.entries) {
171
+ lines.push(`- \`${entry.name}\` (${entry.source}) — status=\`${entry.status}\`, score=\`${entry.score}\`, adapters=\`${entry.adapter_clients.length > 0 ? entry.adapter_clients.join(", ") : "none"}\``);
172
+ if (entry.findings.length > 0) {
173
+ lines.push(...entry.findings.map((finding) => ` - [${finding.severity}] ${finding.code}: ${finding.message}`));
174
+ }
175
+ else {
176
+ lines.push(" - no blocking findings");
177
+ }
178
+ }
179
+ return lines.join("\n");
180
+ }
181
+ export function writeSkillAuditReport(result, targetPath = "agent-state/SKILL_AUDIT_REPORT.md") {
182
+ return safeWrite(targetPath, renderSkillAuditReport(result));
183
+ }
184
+ //# sourceMappingURL=skill-auditor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-auditor.js","sourceRoot":"","sources":["../src/skill-auditor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ import { type SkillReference } from "./helpers.js";
2
+ export interface SkillAdapterOverlay {
3
+ client: string;
4
+ format: string;
5
+ path: string;
6
+ relative_path: string;
7
+ }
8
+ export interface SkillCatalogEntry extends SkillReference {
9
+ description: string;
10
+ headings: string[];
11
+ normalized_headings: string[];
12
+ line_count: number;
13
+ has_frontmatter: boolean;
14
+ has_openai_yaml: boolean;
15
+ openai_yaml_path?: string;
16
+ openai_metadata: Record<string, string>;
17
+ has_inputs_section: boolean;
18
+ has_workflow_section: boolean;
19
+ has_outputs_section: boolean;
20
+ has_failure_policy: boolean;
21
+ has_use_cases_section: boolean;
22
+ has_references_dir: boolean;
23
+ has_validation_surface: boolean;
24
+ has_portability_notes: boolean;
25
+ has_optional_adapters: boolean;
26
+ adapter_overlay_clients: string[];
27
+ adapter_overlays: SkillAdapterOverlay[];
28
+ }
29
+ export interface SkillCatalogSummary {
30
+ total_skills: number;
31
+ with_openai_yaml: number;
32
+ with_adapter_overlays: number;
33
+ adapter_clients: string[];
34
+ with_frontmatter: number;
35
+ trigger_aware_descriptions: number;
36
+ with_validation_surface: number;
37
+ with_portability_notes: number;
38
+ portable_contract_ready_skills: number;
39
+ long_skills: Array<{
40
+ name: string;
41
+ line_count: number;
42
+ }>;
43
+ skills_missing_core_sections: string[];
44
+ skills_missing_use_cases: string[];
45
+ skills_missing_validation_surface: string[];
46
+ skills_missing_portability_notes: string[];
47
+ progressive_disclosure_gaps: string[];
48
+ }
49
+ interface ParsedFrontmatter {
50
+ attributes: Record<string, string>;
51
+ body: string;
52
+ has_frontmatter: boolean;
53
+ }
54
+ export declare function parseSkillFrontmatter(raw: string): ParsedFrontmatter;
55
+ export declare function readSkillCatalogEntry(skill: SkillReference): SkillCatalogEntry;
56
+ export declare function listSkillCatalogEntries(): SkillCatalogEntry[];
57
+ export declare function summarizeSkillCatalog(entries?: SkillCatalogEntry[]): SkillCatalogSummary;
58
+ export declare function findSkillCatalogEntry(name: string, entries?: SkillCatalogEntry[]): SkillCatalogEntry | undefined;
59
+ export {};
60
+ //# sourceMappingURL=skill-catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-catalog.d.ts","sourceRoot":"","sources":["../src/skill-catalog.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,cAAc,CAAC;AAEtB,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,iBAAkB,SAAQ,cAAc;IACvD,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,OAAO,CAAC;IACzB,eAAe,EAAE,OAAO,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,oBAAoB,EAAE,OAAO,CAAC;IAC9B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,sBAAsB,EAAE,OAAO,CAAC;IAChC,qBAAqB,EAAE,OAAO,CAAC;IAC/B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,uBAAuB,EAAE,MAAM,EAAE,CAAC;IAClC,gBAAgB,EAAE,mBAAmB,EAAE,CAAC;CACzC;AAED,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,0BAA0B,EAAE,MAAM,CAAC;IACnC,uBAAuB,EAAE,MAAM,CAAC;IAChC,sBAAsB,EAAE,MAAM,CAAC;IAC/B,8BAA8B,EAAE,MAAM,CAAC;IACvC,WAAW,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzD,4BAA4B,EAAE,MAAM,EAAE,CAAC;IACvC,wBAAwB,EAAE,MAAM,EAAE,CAAC;IACnC,iCAAiC,EAAE,MAAM,EAAE,CAAC;IAC5C,gCAAgC,EAAE,MAAM,EAAE,CAAC;IAC3C,2BAA2B,EAAE,MAAM,EAAE,CAAC;CACvC;AAED,UAAU,iBAAiB;IACzB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,OAAO,CAAC;CAC1B;AAgCD,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,CAmBpE;AA4HD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,cAAc,GAAG,iBAAiB,CAoD9E;AAED,wBAAgB,uBAAuB,IAAI,iBAAiB,EAAE,CAE7D;AAED,wBAAgB,qBAAqB,CACnC,OAAO,GAAE,iBAAiB,EAA8B,GACvD,mBAAmB,CA0DrB;AAED,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,iBAAiB,EAA8B,GACvD,iBAAiB,GAAG,SAAS,CAG/B"}
@@ -0,0 +1,263 @@
1
+ import { existsSync, readFileSync, readdirSync } from "node:fs";
2
+ import { basename, dirname, extname, relative, resolve } from "node:path";
3
+ import { ALL_MCP_CLIENTS, listAvailableSkills, } from "./helpers.js";
4
+ function stripQuotes(value) {
5
+ return value.replace(/^["']+|["']+$/g, "").trim();
6
+ }
7
+ function parseSimpleYamlBlock(raw) {
8
+ const result = {};
9
+ const lines = raw.replace(/\r\n/g, "\n").split("\n");
10
+ let currentKey;
11
+ for (const line of lines) {
12
+ if (!line.trim())
13
+ continue;
14
+ const keyMatch = line.match(/^([A-Za-z0-9_-]+):\s*(.*)$/);
15
+ if (keyMatch) {
16
+ currentKey = keyMatch[1];
17
+ result[currentKey] = stripQuotes(keyMatch[2] ?? "");
18
+ continue;
19
+ }
20
+ if (currentKey && /^[ \t]+/.test(line)) {
21
+ const nextValue = stripQuotes(line.trim());
22
+ result[currentKey] = result[currentKey]
23
+ ? `${result[currentKey]} ${nextValue}`.trim()
24
+ : nextValue;
25
+ }
26
+ }
27
+ return result;
28
+ }
29
+ export function parseSkillFrontmatter(raw) {
30
+ const normalized = raw.replace(/\r\n/g, "\n");
31
+ if (!normalized.startsWith("---\n")) {
32
+ return { attributes: {}, body: normalized, has_frontmatter: false };
33
+ }
34
+ const endIndex = normalized.indexOf("\n---\n", 4);
35
+ if (endIndex === -1) {
36
+ return { attributes: {}, body: normalized, has_frontmatter: false };
37
+ }
38
+ const frontmatter = normalized.slice(4, endIndex);
39
+ const body = normalized.slice(endIndex + 5);
40
+ return {
41
+ attributes: parseSimpleYamlBlock(frontmatter),
42
+ body,
43
+ has_frontmatter: true,
44
+ };
45
+ }
46
+ function extractHeadings(markdown) {
47
+ return [...markdown.matchAll(/^##\s+(.+)$/gm)].map((match) => match[1].trim());
48
+ }
49
+ function normalizeHeading(heading) {
50
+ return heading
51
+ .toLowerCase()
52
+ .replace(/[`*_]/g, "")
53
+ .replace(/[^a-z0-9]+/g, " ")
54
+ .trim();
55
+ }
56
+ function hasHeading(headings, terms) {
57
+ return headings.some((heading) => terms.some((term) => heading.includes(term)));
58
+ }
59
+ function bodyMentionsAny(markdown, terms) {
60
+ const text = markdown.toLowerCase();
61
+ return terms.some((term) => text.includes(term));
62
+ }
63
+ function descriptionLooksTriggerAware(description) {
64
+ const text = description.toLowerCase();
65
+ return [
66
+ "when the user",
67
+ "use when",
68
+ "use this",
69
+ "trigger when",
70
+ "asks for",
71
+ "when a task",
72
+ ].some((term) => text.includes(term));
73
+ }
74
+ function hasValidationSurface(markdown, headings) {
75
+ return (hasHeading(headings, ["validation", "verify", "verification", "test", "tests", "canary"]) ||
76
+ bodyMentionsAny(markdown, [
77
+ "validation command",
78
+ "expected evidence",
79
+ "trigger canary",
80
+ "functional canary",
81
+ "baseline comparison",
82
+ "verify by",
83
+ "run this check",
84
+ ]));
85
+ }
86
+ function hasPortabilityNotes(markdown, headings) {
87
+ return (hasHeading(headings, [
88
+ "compatibility",
89
+ "portability",
90
+ "portable",
91
+ "cross platform",
92
+ "cross-platform",
93
+ "client adapters",
94
+ "adapter policy",
95
+ ]) ||
96
+ bodyMentionsAny(markdown, [
97
+ "portable source of truth",
98
+ "portable contract",
99
+ "portable skill",
100
+ "vendor-neutral",
101
+ "cross-platform",
102
+ "cross platform",
103
+ "client-specific",
104
+ "optional overlay",
105
+ "optional adapter",
106
+ "works without",
107
+ ]));
108
+ }
109
+ function resolveOpenAiYamlPath(skillPath) {
110
+ const agentsPath = resolve(dirname(skillPath), "agents", "openai.yaml");
111
+ return existsSync(agentsPath) ? agentsPath : undefined;
112
+ }
113
+ const KNOWN_ADAPTER_CLIENTS = [...ALL_MCP_CLIENTS, "openai", "vscode"];
114
+ const ADAPTER_EXTENSIONS = new Set([".yaml", ".yml", ".json", ".jsonc", ".toml", ".md"]);
115
+ function detectAdapterClient(relativePath) {
116
+ const lower = relativePath.toLowerCase();
117
+ for (const client of KNOWN_ADAPTER_CLIENTS) {
118
+ if (lower.includes(client))
119
+ return client;
120
+ }
121
+ const stem = basename(lower, extname(lower)).replace(/[^a-z0-9]+/g, "-");
122
+ return stem || "generic";
123
+ }
124
+ function listSkillAdapterOverlays(skillPath) {
125
+ const agentsRoot = resolve(dirname(skillPath), "agents");
126
+ if (!existsSync(agentsRoot))
127
+ return [];
128
+ const overlays = [];
129
+ const walk = (dirPath) => {
130
+ const entries = readdirSync(dirPath, { withFileTypes: true });
131
+ for (const entry of entries) {
132
+ if (entry.name.startsWith("."))
133
+ continue;
134
+ const absolutePath = resolve(dirPath, entry.name);
135
+ if (entry.isDirectory()) {
136
+ walk(absolutePath);
137
+ continue;
138
+ }
139
+ const extension = extname(entry.name).toLowerCase();
140
+ const relativePath = relative(agentsRoot, absolutePath).replace(/\\/g, "/");
141
+ if (!ADAPTER_EXTENSIONS.has(extension))
142
+ continue;
143
+ if (relativePath.toLowerCase() === "readme.md")
144
+ continue;
145
+ overlays.push({
146
+ client: detectAdapterClient(relativePath),
147
+ format: extension.slice(1) || "unknown",
148
+ path: absolutePath,
149
+ relative_path: relativePath,
150
+ });
151
+ }
152
+ };
153
+ walk(agentsRoot);
154
+ return overlays.sort((a, b) => a.relative_path.localeCompare(b.relative_path));
155
+ }
156
+ export function readSkillCatalogEntry(skill) {
157
+ const raw = readFileSync(skill.path, "utf-8");
158
+ const parsed = parseSkillFrontmatter(raw);
159
+ const headings = extractHeadings(parsed.body);
160
+ const normalizedHeadings = headings.map(normalizeHeading);
161
+ const openaiYamlPath = resolveOpenAiYamlPath(skill.path);
162
+ const openaiMetadata = openaiYamlPath
163
+ ? parseSimpleYamlBlock(readFileSync(openaiYamlPath, "utf-8"))
164
+ : {};
165
+ const adapterOverlays = listSkillAdapterOverlays(skill.path);
166
+ const adapterOverlayClients = [...new Set(adapterOverlays.map((overlay) => overlay.client))];
167
+ return {
168
+ ...skill,
169
+ description: parsed.attributes.description?.trim() ?? "",
170
+ headings,
171
+ normalized_headings: normalizedHeadings,
172
+ line_count: raw.replace(/\r\n/g, "\n").split("\n").length,
173
+ has_frontmatter: parsed.has_frontmatter,
174
+ has_openai_yaml: Boolean(openaiYamlPath),
175
+ openai_yaml_path: openaiYamlPath,
176
+ openai_metadata: openaiMetadata,
177
+ has_inputs_section: hasHeading(normalizedHeadings, ["inputs", "input"]),
178
+ has_workflow_section: hasHeading(normalizedHeadings, [
179
+ "workflow",
180
+ "steps",
181
+ "process",
182
+ "procedure",
183
+ ]),
184
+ has_outputs_section: hasHeading(normalizedHeadings, [
185
+ "outputs",
186
+ "output",
187
+ "artifacts",
188
+ "resulting artifacts",
189
+ ]),
190
+ has_failure_policy: hasHeading(normalizedHeadings, [
191
+ "failure",
192
+ "troubleshooting",
193
+ "fallback",
194
+ ]),
195
+ has_use_cases_section: hasHeading(normalizedHeadings, [
196
+ "use cases",
197
+ "canonical use cases",
198
+ "examples",
199
+ ]),
200
+ has_references_dir: existsSync(resolve(dirname(skill.path), "references")),
201
+ has_validation_surface: hasValidationSurface(parsed.body, normalizedHeadings),
202
+ has_portability_notes: hasPortabilityNotes(parsed.body, normalizedHeadings),
203
+ has_optional_adapters: adapterOverlays.length > 0,
204
+ adapter_overlay_clients: adapterOverlayClients,
205
+ adapter_overlays: adapterOverlays,
206
+ };
207
+ }
208
+ export function listSkillCatalogEntries() {
209
+ return listAvailableSkills().map((skill) => readSkillCatalogEntry(skill));
210
+ }
211
+ export function summarizeSkillCatalog(entries = listSkillCatalogEntries()) {
212
+ const longSkills = entries
213
+ .filter((entry) => entry.line_count > 500)
214
+ .map((entry) => ({ name: entry.name, line_count: entry.line_count }));
215
+ const missingCoreSections = entries
216
+ .filter((entry) => !entry.has_inputs_section ||
217
+ !entry.has_workflow_section ||
218
+ !entry.has_outputs_section ||
219
+ !entry.has_failure_policy)
220
+ .map((entry) => entry.name);
221
+ const missingUseCases = entries
222
+ .filter((entry) => !entry.has_use_cases_section)
223
+ .map((entry) => entry.name);
224
+ const missingValidationSurface = entries
225
+ .filter((entry) => !entry.has_validation_surface)
226
+ .map((entry) => entry.name);
227
+ const missingPortabilityNotes = entries
228
+ .filter((entry) => !entry.has_portability_notes)
229
+ .map((entry) => entry.name);
230
+ const progressiveDisclosureGaps = entries
231
+ .filter((entry) => entry.line_count > 500 && !entry.has_references_dir)
232
+ .map((entry) => entry.name);
233
+ const adapterClients = [...new Set(entries.flatMap((entry) => entry.adapter_overlay_clients))].sort((a, b) => a.localeCompare(b));
234
+ const portableContractReadySkills = entries.filter((entry) => entry.has_frontmatter &&
235
+ descriptionLooksTriggerAware(entry.description) &&
236
+ entry.has_use_cases_section &&
237
+ entry.has_inputs_section &&
238
+ entry.has_workflow_section &&
239
+ entry.has_outputs_section &&
240
+ entry.has_failure_policy).length;
241
+ return {
242
+ total_skills: entries.length,
243
+ with_openai_yaml: entries.filter((entry) => entry.has_openai_yaml).length,
244
+ with_adapter_overlays: entries.filter((entry) => entry.has_optional_adapters).length,
245
+ adapter_clients: adapterClients,
246
+ with_frontmatter: entries.filter((entry) => entry.has_frontmatter).length,
247
+ trigger_aware_descriptions: entries.filter((entry) => descriptionLooksTriggerAware(entry.description)).length,
248
+ with_validation_surface: entries.filter((entry) => entry.has_validation_surface).length,
249
+ with_portability_notes: entries.filter((entry) => entry.has_portability_notes).length,
250
+ portable_contract_ready_skills: portableContractReadySkills,
251
+ long_skills: longSkills,
252
+ skills_missing_core_sections: missingCoreSections,
253
+ skills_missing_use_cases: missingUseCases,
254
+ skills_missing_validation_surface: missingValidationSurface,
255
+ skills_missing_portability_notes: missingPortabilityNotes,
256
+ progressive_disclosure_gaps: progressiveDisclosureGaps,
257
+ };
258
+ }
259
+ export function findSkillCatalogEntry(name, entries = listSkillCatalogEntries()) {
260
+ const target = name.trim().toLowerCase();
261
+ return entries.find((entry) => entry.name.toLowerCase() === target);
262
+ }
263
+ //# sourceMappingURL=skill-catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-catalog.js","sourceRoot":"","sources":["../src/skill-catalog.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"status-events.d.ts","sourceRoot":"","sources":["../src/status-events.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,sBAAsB,qCAAqC,CAAC;AAIzE,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;AAEjG,MAAM,WAAW,sBAAsB;IACrC,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,cAAc,EAAE,OAAO,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAyBD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,GAAG;IAChE,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,iBAAiB,CAAC;CAC1B,CAsCA;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,sBAAsB,GAC5B,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,iBAAiB,CAAA;CAAE,CAAC,CAErD;AAED,wBAAgB,gBAAgB,CAAC,KAAK,SAAM,GAAG,iBAAiB,EAAE,CAoBjE;AAED,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C"}
1
+ {"version":3,"file":"status-events.d.ts","sourceRoot":"","sources":["../src/status-events.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,sBAAsB,qCAAqC,CAAC;AAKzE,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;AAEjG,MAAM,WAAW,sBAAsB;IACrC,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,cAAc,EAAE,OAAO,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAoED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,GAAG;IAChE,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,iBAAiB,CAAC;CAC1B,CAsCA;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,sBAAsB,GAC5B,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,iBAAiB,CAAA;CAAE,CAAC,CAErD;AAED,wBAAgB,gBAAgB,CAAC,KAAK,SAAM,GAAG,iBAAiB,EAAE,CAoBjE;AAED,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C"}
@@ -1,12 +1,55 @@
1
1
  import { randomUUID } from "node:crypto";
2
- import { safeRead, safeWrite, wsPath, withFileLock } from "./helpers.js";
2
+ import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
3
+ import { dirname, resolve } from "node:path";
4
+ import { resolveWorkspaceRoot } from "./helpers.js";
3
5
  import { isReadError } from "./shared.js";
4
6
  import { validateStatusEventPayload, PROVENANCE_CRITICAL_EVENT_TYPES } from "./schemas.js";
5
7
  export const STATUS_EVENTS_REL_PATH = "agent-state/STATUS_EVENTS.ndjson";
6
8
  const STATUS_EVENTS_ARCHIVE_REL = "agent-state/STATUS_EVENTS-archive.ndjson";
7
9
  const MAX_EVENT_LINES = 2000;
10
+ const _fileLocks = new Map();
11
+ function resolveWorkspaceArtifactPath(filePath) {
12
+ return resolve(resolveWorkspaceRoot(), filePath);
13
+ }
14
+ function safeReadWorkspaceFile(filePath) {
15
+ try {
16
+ const abs = resolveWorkspaceArtifactPath(filePath);
17
+ if (!existsSync(abs))
18
+ return `[FILE NOT FOUND] ${abs}`;
19
+ return readFileSync(abs, "utf-8");
20
+ }
21
+ catch (error) {
22
+ return `[ACCESS DENIED] ${String(error)}`;
23
+ }
24
+ }
25
+ function safeWriteWorkspaceFile(filePath, content) {
26
+ const abs = resolveWorkspaceArtifactPath(filePath);
27
+ mkdirSync(dirname(abs), { recursive: true });
28
+ const tmpPath = `${abs}.${process.pid}.${Date.now()}.tmp`;
29
+ writeFileSync(tmpPath, content, "utf-8");
30
+ renameSync(tmpPath, abs);
31
+ return abs;
32
+ }
33
+ async function withDynamicFileLock(path, fn) {
34
+ const key = resolveWorkspaceArtifactPath(path);
35
+ const prev = _fileLocks.get(key) ?? Promise.resolve();
36
+ let releaseLock;
37
+ const next = new Promise((resolveLock) => {
38
+ releaseLock = resolveLock;
39
+ });
40
+ _fileLocks.set(key, next);
41
+ await prev;
42
+ try {
43
+ return await fn();
44
+ }
45
+ finally {
46
+ releaseLock();
47
+ if (_fileLocks.get(key) === next)
48
+ _fileLocks.delete(key);
49
+ }
50
+ }
8
51
  function readExistingNdjson() {
9
- const existing = safeRead(STATUS_EVENTS_REL_PATH);
52
+ const existing = safeReadWorkspaceFile(STATUS_EVENTS_REL_PATH);
10
53
  if (isReadError(existing)) {
11
54
  return "";
12
55
  }
@@ -18,11 +61,11 @@ function rotateIfNeeded(content) {
18
61
  return content;
19
62
  const excess = lines.splice(0, lines.length - MAX_EVENT_LINES);
20
63
  const archiveContent = excess.join("\n") + "\n";
21
- const existingArchive = safeRead(STATUS_EVENTS_ARCHIVE_REL);
64
+ const existingArchive = safeReadWorkspaceFile(STATUS_EVENTS_ARCHIVE_REL);
22
65
  const archiveFull = isReadError(existingArchive)
23
66
  ? archiveContent
24
67
  : existingArchive.trimEnd() + "\n" + archiveContent;
25
- safeWrite(STATUS_EVENTS_ARCHIVE_REL, archiveFull);
68
+ safeWriteWorkspaceFile(STATUS_EVENTS_ARCHIVE_REL, archiveFull);
26
69
  return lines.join("\n") + "\n";
27
70
  }
28
71
  export function appendStatusEvent(input) {
@@ -56,7 +99,7 @@ export function appendStatusEvent(input) {
56
99
  const line = JSON.stringify(event);
57
100
  const combined = existing.length > 0 ? `${existing}\n${line}\n` : `${line}\n`;
58
101
  const next = rotateIfNeeded(combined);
59
- const path = safeWrite(STATUS_EVENTS_REL_PATH, next);
102
+ const path = safeWriteWorkspaceFile(STATUS_EVENTS_REL_PATH, next);
60
103
  return { path, event };
61
104
  }
62
105
  /**
@@ -64,10 +107,10 @@ export function appendStatusEvent(input) {
64
107
  * Use this from async tool handlers where parallel subagents may fire.
65
108
  */
66
109
  export async function appendStatusEventSafe(input) {
67
- return withFileLock(STATUS_EVENTS_REL_PATH, () => appendStatusEvent(input));
110
+ return withDynamicFileLock(STATUS_EVENTS_REL_PATH, () => appendStatusEvent(input));
68
111
  }
69
112
  export function readStatusEvents(limit = 100) {
70
- const raw = safeRead(STATUS_EVENTS_REL_PATH);
113
+ const raw = safeReadWorkspaceFile(STATUS_EVENTS_REL_PATH);
71
114
  if (raw.startsWith("[FILE NOT FOUND]") || raw.startsWith("[ACCESS DENIED]")) {
72
115
  return [];
73
116
  }
@@ -88,6 +131,6 @@ export function readStatusEvents(limit = 100) {
88
131
  return parsed;
89
132
  }
90
133
  export function getStatusEventsPath() {
91
- return wsPath(STATUS_EVENTS_REL_PATH);
134
+ return resolveWorkspaceArtifactPath(STATUS_EVENTS_REL_PATH);
92
135
  }
93
136
  //# sourceMappingURL=status-events.js.map