@h9-foundry/agentforge-cli 0.3.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builtin-agents.d.ts","sourceRoot":"","sources":["../../src/internal/builtin-agents.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAwR/D,wBAAgB,0BAA0B,IAAI,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAOtE"}
@@ -0,0 +1,271 @@
1
+ import { agentManifestSchema, agentOutputSchema } from "@h9-foundry/agentforge-schemas";
2
+ const contextCollectorAgent = {
3
+ manifest: agentManifestSchema.parse({
4
+ version: 1,
5
+ name: "context-collector",
6
+ displayName: "Context Collector",
7
+ category: "context",
8
+ runtime: {
9
+ minVersion: "0.1.0",
10
+ kind: "deterministic"
11
+ },
12
+ permissions: {
13
+ model: false,
14
+ network: false,
15
+ tools: [],
16
+ readPaths: ["**/*"],
17
+ writePaths: []
18
+ },
19
+ inputs: ["repo", "changes", "context"],
20
+ outputs: ["summary", "metadata"],
21
+ contextPolicy: {
22
+ sections: ["repo", "changes", "context"],
23
+ minimalContext: true
24
+ },
25
+ trust: {
26
+ tier: "core",
27
+ source: "official",
28
+ reviewed: true
29
+ }
30
+ }),
31
+ outputSchema: agentOutputSchema,
32
+ async execute({ stateSlice }) {
33
+ const repo = stateSlice.repo;
34
+ const changes = stateSlice.changes;
35
+ const summary = repo && changes
36
+ ? `Collected context for ${repo.name}: ${changes.changedFiles.length} changed file(s), ${changes.impactedPaths.length} impacted path(s).`
37
+ : "Collected base repository context.";
38
+ return agentOutputSchema.parse({
39
+ summary,
40
+ findings: [],
41
+ proposedActions: [],
42
+ requestedTools: [],
43
+ blockedActionFlags: [],
44
+ metadata: {
45
+ repository: repo?.name,
46
+ changedFiles: changes?.changedFiles ?? [],
47
+ impactedPaths: changes?.impactedPaths ?? []
48
+ }
49
+ });
50
+ }
51
+ };
52
+ const codeReviewAgent = {
53
+ manifest: agentManifestSchema.parse({
54
+ version: 1,
55
+ name: "code-review",
56
+ displayName: "Code Review",
57
+ category: "review",
58
+ runtime: {
59
+ minVersion: "0.1.0",
60
+ kind: "reasoning"
61
+ },
62
+ permissions: {
63
+ model: true,
64
+ network: false,
65
+ tools: ["filesystem.read-file"],
66
+ readPaths: ["src/**", "packages/**", "agents/**", "adapters/**"],
67
+ writePaths: []
68
+ },
69
+ inputs: ["repo", "changes", "agentResults"],
70
+ outputs: ["findings", "proposedActions"],
71
+ contextPolicy: {
72
+ sections: ["repo", "changes", "agentResults"],
73
+ minimalContext: true
74
+ },
75
+ trust: {
76
+ tier: "core",
77
+ source: "official",
78
+ reviewed: true
79
+ }
80
+ }),
81
+ outputSchema: agentOutputSchema,
82
+ async execute({ stateSlice }) {
83
+ const changes = stateSlice.changes;
84
+ const findings = [];
85
+ const proposedActions = [];
86
+ for (const file of changes?.fileDetails ?? []) {
87
+ if (file.insertions >= 200 && !file.path.endsWith(".test.ts")) {
88
+ findings.push({
89
+ id: `review-${file.path}`,
90
+ title: "Large change without focused validation",
91
+ summary: `${file.path} adds ${file.insertions} lines. Split or add focused validation before merging.`,
92
+ severity: "medium",
93
+ rationale: "Large deltas are harder to review and regress more easily without focused checks.",
94
+ confidence: 0.74,
95
+ location: file.path,
96
+ tags: ["review", "change-size"]
97
+ });
98
+ }
99
+ if ((file.path.startsWith("packages/runtime") || file.path.startsWith("packages/policy-engine")) && !changes?.changedFiles.some((path) => path.includes(".test."))) {
100
+ findings.push({
101
+ id: `review-tests-${file.path}`,
102
+ title: "Core package changed without nearby tests",
103
+ summary: `${file.path} changes core workflow behavior but no test file changed in the same run.`,
104
+ severity: "medium",
105
+ rationale: "Runtime and policy changes need regression coverage because they shape guardrails for all agents.",
106
+ confidence: 0.82,
107
+ location: file.path,
108
+ tags: ["review", "tests"]
109
+ });
110
+ }
111
+ }
112
+ if (findings.length > 0) {
113
+ proposedActions.push({
114
+ id: "review-follow-up",
115
+ title: "Tighten test coverage for risky changes",
116
+ summary: "Add or update focused tests around changed runtime or policy logic before merge.",
117
+ sideEffectClass: "suggest",
118
+ targetPaths: ["tests/**"],
119
+ approvalRequired: false
120
+ });
121
+ }
122
+ return agentOutputSchema.parse({
123
+ summary: findings.length > 0
124
+ ? `Code review flagged ${findings.length} review concern(s).`
125
+ : "Code review found no high-signal structural concerns from the current diff metadata.",
126
+ findings,
127
+ proposedActions,
128
+ requestedTools: [],
129
+ blockedActionFlags: [],
130
+ confidence: findings.length > 0 ? 0.78 : 0.61,
131
+ metadata: {
132
+ changedFiles: changes?.changedFiles ?? []
133
+ }
134
+ });
135
+ }
136
+ };
137
+ const highRiskMatchers = [/\.env/i, /^secrets\//i, /^infra\/prod\//i];
138
+ const securityAuditAgent = {
139
+ manifest: agentManifestSchema.parse({
140
+ version: 1,
141
+ name: "security-audit",
142
+ displayName: "Security Audit",
143
+ category: "security",
144
+ runtime: {
145
+ minVersion: "0.1.0",
146
+ kind: "reasoning"
147
+ },
148
+ permissions: {
149
+ model: true,
150
+ network: false,
151
+ tools: ["git.diff-summary", "filesystem.read-file"],
152
+ readPaths: ["**/*"],
153
+ writePaths: []
154
+ },
155
+ inputs: ["repo", "changes", "policy"],
156
+ outputs: ["findings", "blockedActionFlags"],
157
+ contextPolicy: {
158
+ sections: ["repo", "changes", "policy"],
159
+ minimalContext: true
160
+ },
161
+ trust: {
162
+ tier: "core",
163
+ source: "official",
164
+ reviewed: true
165
+ }
166
+ }),
167
+ outputSchema: agentOutputSchema,
168
+ async execute({ stateSlice }) {
169
+ const findings = [];
170
+ const blockedActionFlags = [];
171
+ const changedFiles = stateSlice.changes?.changedFiles ?? [];
172
+ for (const filePath of changedFiles) {
173
+ if (highRiskMatchers.some((matcher) => matcher.test(filePath))) {
174
+ findings.push({
175
+ id: `security-${filePath}`,
176
+ title: "Blocked or high-risk path touched",
177
+ summary: `${filePath} matches a blocked or sensitive path pattern and should not be modified without explicit approval.`,
178
+ severity: "high",
179
+ rationale: "Secrets and production infrastructure paths are outside the default safe execution boundary.",
180
+ confidence: 0.95,
181
+ location: filePath,
182
+ tags: ["security", "blocked-path"]
183
+ });
184
+ blockedActionFlags.push(`Sensitive path detected: ${filePath}`);
185
+ }
186
+ }
187
+ return agentOutputSchema.parse({
188
+ summary: findings.length > 0
189
+ ? `Security audit raised ${findings.length} high-risk path finding(s).`
190
+ : "Security audit found no high-signal blocked-path issues in the current change set.",
191
+ findings,
192
+ proposedActions: [],
193
+ requestedTools: [],
194
+ blockedActionFlags,
195
+ confidence: findings.length > 0 ? 0.9 : 0.68,
196
+ metadata: {
197
+ changedFiles
198
+ }
199
+ });
200
+ }
201
+ };
202
+ const testGenerationAgent = {
203
+ manifest: agentManifestSchema.parse({
204
+ version: 1,
205
+ name: "test-generation",
206
+ displayName: "Test Generation",
207
+ category: "quality",
208
+ runtime: {
209
+ minVersion: "0.1.0",
210
+ kind: "reasoning"
211
+ },
212
+ permissions: {
213
+ model: true,
214
+ network: false,
215
+ tools: [],
216
+ readPaths: ["src/**", "packages/**", "tests/**"],
217
+ writePaths: ["tests/**"]
218
+ },
219
+ inputs: ["changes"],
220
+ outputs: ["proposedActions"],
221
+ contextPolicy: {
222
+ sections: ["changes"],
223
+ minimalContext: true
224
+ },
225
+ trust: {
226
+ tier: "core",
227
+ source: "official",
228
+ reviewed: true
229
+ }
230
+ }),
231
+ outputSchema: agentOutputSchema,
232
+ async execute({ stateSlice }) {
233
+ const changedFiles = stateSlice.changes?.changedFiles ?? [];
234
+ const srcTargets = changedFiles.filter((file) => /(^src\/|^packages\/.+\/src\/).+\.ts$/.test(file));
235
+ const hasTests = changedFiles.some((file) => file.includes(".test.") || file.includes(".spec."));
236
+ const proposedActions = srcTargets.length > 0 && !hasTests
237
+ ? [
238
+ {
239
+ id: "tests-add-coverage",
240
+ title: "Add focused tests for changed source files",
241
+ summary: `Changed source files (${srcTargets.join(", ")}) do not have matching updated tests in this run.`,
242
+ sideEffectClass: "suggest",
243
+ targetPaths: ["tests/**"],
244
+ approvalRequired: false
245
+ }
246
+ ]
247
+ : [];
248
+ return agentOutputSchema.parse({
249
+ summary: proposedActions.length > 0
250
+ ? "Test generation identified missing test coverage opportunities."
251
+ : "Test generation found no obvious test coverage gaps from the current diff metadata.",
252
+ findings: [],
253
+ proposedActions,
254
+ requestedTools: [],
255
+ blockedActionFlags: [],
256
+ confidence: proposedActions.length > 0 ? 0.73 : 0.57,
257
+ metadata: {
258
+ changedFiles
259
+ }
260
+ });
261
+ }
262
+ };
263
+ export function createBuiltinAgentRegistry() {
264
+ return new Map([
265
+ ["context-collector", contextCollectorAgent],
266
+ ["code-review", codeReviewAgent],
267
+ ["security-audit", securityAuditAgent],
268
+ ["test-generation", testGenerationAgent]
269
+ ]);
270
+ }
271
+ //# sourceMappingURL=builtin-agents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builtin-agents.js","sourceRoot":"","sources":["../../src/internal/builtin-agents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAGxF,MAAM,qBAAqB,GAAiB;IAC1C,QAAQ,EAAE,mBAAmB,CAAC,KAAK,CAAC;QAClC,OAAO,EAAE,CAAC;QACV,IAAI,EAAE,mBAAmB;QACzB,WAAW,EAAE,mBAAmB;QAChC,QAAQ,EAAE,SAAS;QACnB,OAAO,EAAE;YACP,UAAU,EAAE,OAAO;YACnB,IAAI,EAAE,eAAe;SACtB;QACD,WAAW,EAAE;YACX,KAAK,EAAE,KAAK;YACZ,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,EAAE;YACT,SAAS,EAAE,CAAC,MAAM,CAAC;YACnB,UAAU,EAAE,EAAE;SACf;QACD,MAAM,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC;QACtC,OAAO,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC;QAChC,aAAa,EAAE;YACb,QAAQ,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC;YACxC,cAAc,EAAE,IAAI;SACrB;QACD,KAAK,EAAE;YACL,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,UAAU;YAClB,QAAQ,EAAE,IAAI;SACf;KACF,CAAC;IACF,YAAY,EAAE,iBAAiB;IAC/B,KAAK,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE;QAC1B,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC;QAC7B,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC;QACnC,MAAM,OAAO,GAAG,IAAI,IAAI,OAAO;YAC7B,CAAC,CAAC,yBAAyB,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,YAAY,CAAC,MAAM,qBAAqB,OAAO,CAAC,aAAa,CAAC,MAAM,oBAAoB;YACzI,CAAC,CAAC,oCAAoC,CAAC;QAEzC,OAAO,iBAAiB,CAAC,KAAK,CAAC;YAC7B,OAAO;YACP,QAAQ,EAAE,EAAE;YACZ,eAAe,EAAE,EAAE;YACnB,cAAc,EAAE,EAAE;YAClB,kBAAkB,EAAE,EAAE;YACtB,QAAQ,EAAE;gBACR,UAAU,EAAE,IAAI,EAAE,IAAI;gBACtB,YAAY,EAAE,OAAO,EAAE,YAAY,IAAI,EAAE;gBACzC,aAAa,EAAE,OAAO,EAAE,aAAa,IAAI,EAAE;aAC5C;SACF,CAAC,CAAC;IACL,CAAC;CACF,CAAC;AAEF,MAAM,eAAe,GAAiB;IACpC,QAAQ,EAAE,mBAAmB,CAAC,KAAK,CAAC;QAClC,OAAO,EAAE,CAAC;QACV,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,aAAa;QAC1B,QAAQ,EAAE,QAAQ;QAClB,OAAO,EAAE;YACP,UAAU,EAAE,OAAO;YACnB,IAAI,EAAE,WAAW;SAClB;QACD,WAAW,EAAE;YACX,KAAK,EAAE,IAAI;YACX,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,CAAC,sBAAsB,CAAC;YAC/B,SAAS,EAAE,CAAC,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,CAAC;YAChE,UAAU,EAAE,EAAE;SACf;QACD,MAAM,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,cAAc,CAAC;QAC3C,OAAO,EAAE,CAAC,UAAU,EAAE,iBAAiB,CAAC;QACxC,aAAa,EAAE;YACb,QAAQ,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,cAAc,CAAC;YAC7C,cAAc,EAAE,IAAI;SACrB;QACD,KAAK,EAAE;YACL,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,UAAU;YAClB,QAAQ,EAAE,IAAI;SACf;KACF,CAAC;IACF,YAAY,EAAE,iBAAiB;IAC/B,KAAK,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE;QAC1B,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC;QACnC,MAAM,QAAQ,GAAG,EAAE,CAAC;QACpB,MAAM,eAAe,GAAG,EAAE,CAAC;QAE3B,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,WAAW,IAAI,EAAE,EAAE,CAAC;YAC9C,IAAI,IAAI,CAAC,UAAU,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC9D,QAAQ,CAAC,IAAI,CAAC;oBACZ,EAAE,EAAE,UAAU,IAAI,CAAC,IAAI,EAAE;oBACzB,KAAK,EAAE,yCAAyC;oBAChD,OAAO,EAAE,GAAG,IAAI,CAAC,IAAI,SAAS,IAAI,CAAC,UAAU,yDAAyD;oBACtG,QAAQ,EAAE,QAAiB;oBAC3B,SAAS,EAAE,mFAAmF;oBAC9F,UAAU,EAAE,IAAI;oBAChB,QAAQ,EAAE,IAAI,CAAC,IAAI;oBACnB,IAAI,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC;iBAChC,CAAC,CAAC;YACL,CAAC;YAED,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,wBAAwB,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;gBACnK,QAAQ,CAAC,IAAI,CAAC;oBACZ,EAAE,EAAE,gBAAgB,IAAI,CAAC,IAAI,EAAE;oBAC/B,KAAK,EAAE,2CAA2C;oBAClD,OAAO,EAAE,GAAG,IAAI,CAAC,IAAI,2EAA2E;oBAChG,QAAQ,EAAE,QAAiB;oBAC3B,SAAS,EAAE,mGAAmG;oBAC9G,UAAU,EAAE,IAAI;oBAChB,QAAQ,EAAE,IAAI,CAAC,IAAI;oBACnB,IAAI,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC;iBAC1B,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,eAAe,CAAC,IAAI,CAAC;gBACnB,EAAE,EAAE,kBAAkB;gBACtB,KAAK,EAAE,yCAAyC;gBAChD,OAAO,EAAE,kFAAkF;gBAC3F,eAAe,EAAE,SAAkB;gBACnC,WAAW,EAAE,CAAC,UAAU,CAAC;gBACzB,gBAAgB,EAAE,KAAK;aACxB,CAAC,CAAC;QACL,CAAC;QAED,OAAO,iBAAiB,CAAC,KAAK,CAAC;YAC7B,OAAO,EACL,QAAQ,CAAC,MAAM,GAAG,CAAC;gBACjB,CAAC,CAAC,uBAAuB,QAAQ,CAAC,MAAM,qBAAqB;gBAC7D,CAAC,CAAC,sFAAsF;YAC5F,QAAQ;YACR,eAAe;YACf,cAAc,EAAE,EAAE;YAClB,kBAAkB,EAAE,EAAE;YACtB,UAAU,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;YAC7C,QAAQ,EAAE;gBACR,YAAY,EAAE,OAAO,EAAE,YAAY,IAAI,EAAE;aAC1C;SACF,CAAC,CAAC;IACL,CAAC;CACF,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,QAAQ,EAAE,aAAa,EAAE,iBAAiB,CAAC,CAAC;AAEtE,MAAM,kBAAkB,GAAiB;IACvC,QAAQ,EAAE,mBAAmB,CAAC,KAAK,CAAC;QAClC,OAAO,EAAE,CAAC;QACV,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE,gBAAgB;QAC7B,QAAQ,EAAE,UAAU;QACpB,OAAO,EAAE;YACP,UAAU,EAAE,OAAO;YACnB,IAAI,EAAE,WAAW;SAClB;QACD,WAAW,EAAE;YACX,KAAK,EAAE,IAAI;YACX,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,CAAC,kBAAkB,EAAE,sBAAsB,CAAC;YACnD,SAAS,EAAE,CAAC,MAAM,CAAC;YACnB,UAAU,EAAE,EAAE;SACf;QACD,MAAM,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC;QACrC,OAAO,EAAE,CAAC,UAAU,EAAE,oBAAoB,CAAC;QAC3C,aAAa,EAAE;YACb,QAAQ,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC;YACvC,cAAc,EAAE,IAAI;SACrB;QACD,KAAK,EAAE;YACL,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,UAAU;YAClB,QAAQ,EAAE,IAAI;SACf;KACF,CAAC;IACF,YAAY,EAAE,iBAAiB;IAC/B,KAAK,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE;QAC1B,MAAM,QAAQ,GAAG,EAAE,CAAC;QACpB,MAAM,kBAAkB,GAAG,EAAE,CAAC;QAC9B,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,EAAE,YAAY,IAAI,EAAE,CAAC;QAE5D,KAAK,MAAM,QAAQ,IAAI,YAAY,EAAE,CAAC;YACpC,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;gBAC/D,QAAQ,CAAC,IAAI,CAAC;oBACZ,EAAE,EAAE,YAAY,QAAQ,EAAE;oBAC1B,KAAK,EAAE,mCAAmC;oBAC1C,OAAO,EAAE,GAAG,QAAQ,oGAAoG;oBACxH,QAAQ,EAAE,MAAe;oBACzB,SAAS,EAAE,8FAA8F;oBACzG,UAAU,EAAE,IAAI;oBAChB,QAAQ,EAAE,QAAQ;oBAClB,IAAI,EAAE,CAAC,UAAU,EAAE,cAAc,CAAC;iBACnC,CAAC,CAAC;gBACH,kBAAkB,CAAC,IAAI,CAAC,4BAA4B,QAAQ,EAAE,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;QAED,OAAO,iBAAiB,CAAC,KAAK,CAAC;YAC7B,OAAO,EACL,QAAQ,CAAC,MAAM,GAAG,CAAC;gBACjB,CAAC,CAAC,yBAAyB,QAAQ,CAAC,MAAM,6BAA6B;gBACvE,CAAC,CAAC,oFAAoF;YAC1F,QAAQ;YACR,eAAe,EAAE,EAAE;YACnB,cAAc,EAAE,EAAE;YAClB,kBAAkB;YAClB,UAAU,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI;YAC5C,QAAQ,EAAE;gBACR,YAAY;aACb;SACF,CAAC,CAAC;IACL,CAAC;CACF,CAAC;AAEF,MAAM,mBAAmB,GAAiB;IACxC,QAAQ,EAAE,mBAAmB,CAAC,KAAK,CAAC;QAClC,OAAO,EAAE,CAAC;QACV,IAAI,EAAE,iBAAiB;QACvB,WAAW,EAAE,iBAAiB;QAC9B,QAAQ,EAAE,SAAS;QACnB,OAAO,EAAE;YACP,UAAU,EAAE,OAAO;YACnB,IAAI,EAAE,WAAW;SAClB;QACD,WAAW,EAAE;YACX,KAAK,EAAE,IAAI;YACX,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,EAAE;YACT,SAAS,EAAE,CAAC,QAAQ,EAAE,aAAa,EAAE,UAAU,CAAC;YAChD,UAAU,EAAE,CAAC,UAAU,CAAC;SACzB;QACD,MAAM,EAAE,CAAC,SAAS,CAAC;QACnB,OAAO,EAAE,CAAC,iBAAiB,CAAC;QAC5B,aAAa,EAAE;YACb,QAAQ,EAAE,CAAC,SAAS,CAAC;YACrB,cAAc,EAAE,IAAI;SACrB;QACD,KAAK,EAAE;YACL,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,UAAU;YAClB,QAAQ,EAAE,IAAI;SACf;KACF,CAAC;IACF,YAAY,EAAE,iBAAiB;IAC/B,KAAK,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE;QAC1B,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,EAAE,YAAY,IAAI,EAAE,CAAC;QAC5D,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,sCAAsC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACpG,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;QACjG,MAAM,eAAe,GACnB,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ;YAChC,CAAC,CAAC;gBACE;oBACE,EAAE,EAAE,oBAAoB;oBACxB,KAAK,EAAE,4CAA4C;oBACnD,OAAO,EAAE,yBAAyB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,mDAAmD;oBAC1G,eAAe,EAAE,SAAkB;oBACnC,WAAW,EAAE,CAAC,UAAU,CAAC;oBACzB,gBAAgB,EAAE,KAAK;iBACxB;aACF;YACH,CAAC,CAAC,EAAE,CAAC;QAET,OAAO,iBAAiB,CAAC,KAAK,CAAC;YAC7B,OAAO,EACL,eAAe,CAAC,MAAM,GAAG,CAAC;gBACxB,CAAC,CAAC,iEAAiE;gBACnE,CAAC,CAAC,qFAAqF;YAC3F,QAAQ,EAAE,EAAE;YACZ,eAAe;YACf,cAAc,EAAE,EAAE;YAClB,kBAAkB,EAAE,EAAE;YACtB,UAAU,EAAE,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;YACpD,QAAQ,EAAE;gBACR,YAAY;aACb;SACF,CAAC,CAAC;IACL,CAAC;CACF,CAAC;AAEF,MAAM,UAAU,0BAA0B;IACxC,OAAO,IAAI,GAAG,CAAC;QACb,CAAC,mBAAmB,EAAE,qBAAqB,CAAC;QAC5C,CAAC,aAAa,EAAE,eAAe,CAAC;QAChC,CAAC,gBAAgB,EAAE,kBAAkB,CAAC;QACtC,CAAC,iBAAiB,EAAE,mBAAmB,CAAC;KACzC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { RuntimeAgent } from "@h9-foundry/agentforge-sdk";
2
+ export declare class LocalPluginRegistry {
3
+ private readonly repoRoot;
4
+ constructor(repoRoot: string);
5
+ loadLocalAgentPlugin(packageName: string): Promise<RuntimeAgent>;
6
+ }
7
+ //# sourceMappingURL=local-plugin-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-plugin-registry.d.ts","sourceRoot":"","sources":["../../src/internal/local-plugin-registry.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAwG/D,qBAAa,mBAAmB;IAClB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,MAAM;IAEvC,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;CAoBvE"}
@@ -0,0 +1,103 @@
1
+ import { existsSync, readdirSync, readFileSync } from "node:fs";
2
+ import { join, resolve } from "node:path";
3
+ import { pathToFileURL } from "node:url";
4
+ import { agentManifestSchema } from "@h9-foundry/agentforge-schemas";
5
+ function isRecord(value) {
6
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
7
+ }
8
+ function readJson(filePath) {
9
+ return JSON.parse(readFileSync(filePath, "utf8"));
10
+ }
11
+ function findWorkspacePackages(repoRoot) {
12
+ const workspaces = ["packages", "agents", "adapters"];
13
+ const found = [];
14
+ for (const workspace of workspaces) {
15
+ const workspaceRoot = join(repoRoot, workspace);
16
+ if (!existsSync(workspaceRoot)) {
17
+ continue;
18
+ }
19
+ for (const entry of readdirSync(workspaceRoot, { withFileTypes: true })) {
20
+ if (!entry.isDirectory()) {
21
+ continue;
22
+ }
23
+ const packageRoot = join(workspaceRoot, entry.name);
24
+ const manifestPath = join(packageRoot, "package.json");
25
+ if (!existsSync(manifestPath)) {
26
+ continue;
27
+ }
28
+ const manifest = readJson(manifestPath);
29
+ if (typeof manifest.name !== "string" || manifest.name.length === 0) {
30
+ continue;
31
+ }
32
+ found.push({
33
+ name: manifest.name,
34
+ root: packageRoot,
35
+ manifest
36
+ });
37
+ }
38
+ }
39
+ return found;
40
+ }
41
+ function resolveModuleEntrypoint(workspacePackage) {
42
+ const exportsRecord = isRecord(workspacePackage.manifest.exports) && isRecord(workspacePackage.manifest.exports["."])
43
+ ? workspacePackage.manifest.exports["."]
44
+ : undefined;
45
+ const candidateEntries = [
46
+ typeof exportsRecord?.default === "string" ? exportsRecord.default : undefined,
47
+ typeof workspacePackage.manifest.module === "string" ? workspacePackage.manifest.module : undefined,
48
+ typeof workspacePackage.manifest.main === "string" ? workspacePackage.manifest.main : undefined,
49
+ "dist/index.js",
50
+ "src/index.ts"
51
+ ].filter((value) => Boolean(value));
52
+ for (const candidate of candidateEntries) {
53
+ const resolvedPath = resolve(workspacePackage.root, candidate);
54
+ if (existsSync(resolvedPath)) {
55
+ return resolvedPath;
56
+ }
57
+ }
58
+ throw new Error(`No loadable entrypoint found for ${workspacePackage.name}`);
59
+ }
60
+ function isRuntimeAgent(value) {
61
+ if (!isRecord(value)) {
62
+ return false;
63
+ }
64
+ return isRecord(value.manifest) && typeof value.execute === "function" && "outputSchema" in value;
65
+ }
66
+ function pickRuntimeAgent(moduleValue) {
67
+ if (isRuntimeAgent(moduleValue)) {
68
+ return moduleValue;
69
+ }
70
+ if (!isRecord(moduleValue)) {
71
+ return undefined;
72
+ }
73
+ if (isRuntimeAgent(moduleValue.default)) {
74
+ return moduleValue.default;
75
+ }
76
+ if (isRuntimeAgent(moduleValue.agent)) {
77
+ return moduleValue.agent;
78
+ }
79
+ return Object.values(moduleValue).find((candidate) => isRuntimeAgent(candidate));
80
+ }
81
+ export class LocalPluginRegistry {
82
+ repoRoot;
83
+ constructor(repoRoot) {
84
+ this.repoRoot = repoRoot;
85
+ }
86
+ async loadLocalAgentPlugin(packageName) {
87
+ const workspacePackage = findWorkspacePackages(this.repoRoot).find((candidate) => candidate.name === packageName);
88
+ if (!workspacePackage) {
89
+ throw new Error(`Plugin package is not a local workspace package: ${packageName}`);
90
+ }
91
+ const entrypoint = resolveModuleEntrypoint(workspacePackage);
92
+ const imported = await import(pathToFileURL(entrypoint).href);
93
+ const agent = pickRuntimeAgent(imported);
94
+ if (!agent) {
95
+ throw new Error(`Plugin package does not export a RuntimeAgent: ${packageName}`);
96
+ }
97
+ return {
98
+ ...agent,
99
+ manifest: agentManifestSchema.parse(agent.manifest)
100
+ };
101
+ }
102
+ }
103
+ //# sourceMappingURL=local-plugin-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-plugin-registry.js","sourceRoot":"","sources":["../../src/internal/local-plugin-registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ export declare const TARGET_NPM_SCOPE = "@h9-foundry";
2
+ export declare const EXPECTED_PUBLIC_PACKAGES: readonly ["@h9-foundry/agentforge-cli", "@h9-foundry/agentforge-schemas", "@h9-foundry/agentforge-shared-types", "@h9-foundry/agentforge-sdk", "@h9-foundry/agentforge-context-engine", "@h9-foundry/agentforge-policy-engine", "@h9-foundry/agentforge-runtime", "@h9-foundry/agentforge-audit"];
3
+ export interface ReleaseCheckEntry {
4
+ id: string;
5
+ label: string;
6
+ status: "pass" | "fail";
7
+ detail: string;
8
+ }
9
+ export interface ReleaseCheckResult {
10
+ npmAuth: {
11
+ path: string;
12
+ present: boolean;
13
+ readable: boolean;
14
+ };
15
+ npmUser: {
16
+ resolved: boolean;
17
+ value?: string;
18
+ error?: string;
19
+ };
20
+ targetScope: string;
21
+ publicPackages: {
22
+ expected: string[];
23
+ actual: string[];
24
+ matches: boolean;
25
+ };
26
+ workflowTrustedPublishing: {
27
+ workflowPath: string;
28
+ idTokenWrite: boolean;
29
+ registryUrl: boolean;
30
+ usesChangesetsAction: boolean;
31
+ requiresNpmToken: boolean;
32
+ matches: boolean;
33
+ };
34
+ changesetConfig: {
35
+ configPath: string;
36
+ fixed: string[];
37
+ ignore: string[];
38
+ matches: boolean;
39
+ };
40
+ checks: ReleaseCheckEntry[];
41
+ ready: boolean;
42
+ }
43
+ export interface ReleaseGuide {
44
+ readonly title: string;
45
+ readonly steps: string[];
46
+ readonly urls: string[];
47
+ }
48
+ interface CommandResult {
49
+ readonly status: number;
50
+ readonly stdout: string;
51
+ readonly stderr: string;
52
+ }
53
+ export interface ReleaseCheckOptions {
54
+ readonly env?: NodeJS.ProcessEnv;
55
+ readonly runCommand?: (command: string, args: string[], cwd: string, env: NodeJS.ProcessEnv) => CommandResult;
56
+ readonly skipNpmAuth?: boolean;
57
+ readonly skipLocalCommands?: boolean;
58
+ }
59
+ export declare function getReleaseGuide(): ReleaseGuide;
60
+ export declare function renderReleaseGuide(): string;
61
+ export declare function checkReleaseReadiness(cwd?: string, options?: ReleaseCheckOptions): ReleaseCheckResult;
62
+ export {};
63
+ //# sourceMappingURL=release-preflight.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-preflight.d.ts","sourceRoot":"","sources":["../../src/internal/release-preflight.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,gBAAgB,gBAAgB,CAAC;AAE9C,eAAO,MAAM,wBAAwB,mSAS3B,CAAC;AAEX,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,OAAO,CAAC;QACjB,QAAQ,EAAE,OAAO,CAAC;KACnB,CAAC;IACF,OAAO,EAAE;QACP,QAAQ,EAAE,OAAO,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE;QACd,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnB,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC;IACF,yBAAyB,EAAE;QACzB,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,OAAO,CAAC;QACtB,WAAW,EAAE,OAAO,CAAC;QACrB,oBAAoB,EAAE,OAAO,CAAC;QAC9B,gBAAgB,EAAE,OAAO,CAAC;QAC1B,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC;IACF,eAAe,EAAE;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC;IACF,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,UAAU,aAAa;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACjC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,KAAK,aAAa,CAAC;IAC9G,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC;CACtC;AAiGD,wBAAgB,eAAe,IAAI,YAAY,CAkB9C;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAU3C;AAED,wBAAgB,qBAAqB,CAAC,GAAG,SAAgB,EAAE,OAAO,GAAE,mBAAwB,GAAG,kBAAkB,CAwIhH"}