@jstn-sdk/ma 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/plugins/marketplace.json +20 -0
- package/.codex/agents/Architect.toml +4 -0
- package/.codex/agents/Auditor.toml +4 -0
- package/.codex/agents/Builder.toml +4 -0
- package/.codex/agents/Flow.toml +4 -0
- package/.codex/agents/Sage.toml +4 -0
- package/.codex/agents/Vibe.toml +4 -0
- package/.codex/hooks.json +15 -0
- package/.codex/prompts/enforcement.md +59 -0
- package/.codex/prompts/onboarding.md +41 -0
- package/.codex/prompts/release-rules.md +28 -0
- package/.codex/prompts/skill-contract.md +41 -0
- package/LICENSE +21 -0
- package/README.md +532 -0
- package/bin/ma.js +300 -0
- package/bin/meta-architect.js +3 -0
- package/docs/README.md +24 -0
- package/docs/assets/meta-architect-logo.png +0 -0
- package/docs/assets/meta-architect-logo.svg +8 -0
- package/docs/getting-started.md +451 -0
- package/docs/mcp-setup.md +5 -0
- package/docs/onboarding.md +65 -0
- package/docs/qa/release-readiness-0.1.0.md +62 -0
- package/docs/release-spec.md +86 -0
- package/docs/skills-publishing.md +231 -0
- package/docs/skills.md +91 -0
- package/index.js +28 -0
- package/mcp/collections.json +21 -0
- package/mcp/fallback.json +7 -0
- package/mcp/servers.json +55 -0
- package/package.json +84 -0
- package/plugins/meta-architect/.app.json +8 -0
- package/plugins/meta-architect/.codex-plugin/plugin.json +23 -0
- package/plugins/meta-architect/.mcp.json +12 -0
- package/plugins/meta-architect/README.md +121 -0
- package/plugins/meta-architect/skills/arch/SKILL.md +27 -0
- package/plugins/meta-architect/skills/arch/agents/openai.yaml +4 -0
- package/plugins/meta-architect/skills/build/SKILL.md +24 -0
- package/plugins/meta-architect/skills/build/agents/openai.yaml +4 -0
- package/plugins/meta-architect/skills/flow/SKILL.md +24 -0
- package/plugins/meta-architect/skills/flow/agents/openai.yaml +4 -0
- package/plugins/meta-architect/skills/meta-architect/SKILL.md +30 -0
- package/plugins/meta-architect/skills/meta-architect/agents/openai.yaml +4 -0
- package/plugins/meta-architect/skills/meta-architect/references/core-release-rules.md +13 -0
- package/plugins/meta-architect/skills/sage/SKILL.md +24 -0
- package/plugins/meta-architect/skills/sage/agents/openai.yaml +4 -0
- package/plugins/meta-architect/skills/vet/SKILL.md +25 -0
- package/plugins/meta-architect/skills/vet/agents/openai.yaml +4 -0
- package/plugins/meta-architect/skills/vibe/SKILL.md +24 -0
- package/plugins/meta-architect/skills/vibe/agents/openai.yaml +4 -0
- package/scripts/doctor.js +37 -0
- package/scripts/plugin-sync.js +92 -0
- package/scripts/postinstall.js +19 -0
- package/scripts/release-metadata.js +94 -0
- package/scripts/release-verify.js +153 -0
- package/scripts/setup-npmrc.js +39 -0
- package/scripts/skills-install.js +29 -0
- package/scripts/skills-manifest.js +61 -0
- package/scripts/skills-pack.js +54 -0
- package/scripts/skills-validate.js +118 -0
- package/skills/arch/SKILL.md +27 -0
- package/skills/arch/agents/openai.yaml +4 -0
- package/skills/build/SKILL.md +24 -0
- package/skills/build/agents/openai.yaml +4 -0
- package/skills/flow/SKILL.md +24 -0
- package/skills/flow/agents/openai.yaml +4 -0
- package/skills/index.json +40 -0
- package/skills/meta-architect/SKILL.md +30 -0
- package/skills/meta-architect/agents/openai.yaml +4 -0
- package/skills/meta-architect/references/core-release-rules.md +13 -0
- package/skills/sage/SKILL.md +24 -0
- package/skills/sage/agents/openai.yaml +4 -0
- package/skills/vet/SKILL.md +25 -0
- package/skills/vet/agents/openai.yaml +4 -0
- package/skills/vibe/SKILL.md +24 -0
- package/skills/vibe/agents/openai.yaml +4 -0
- package/sprint/00-idea.md +27 -0
- package/sprint/01-architecture.md +26 -0
- package/sprint/02-oss-evidence.md +26 -0
- package/sprint/03-logic.md +25 -0
- package/sprint/04-security.md +25 -0
- package/sprint/05-dx-ux.md +24 -0
- package/sprint/06-build-plan.md +26 -0
- package/sprint/07-release.md +26 -0
- package/src/build-gate.js +52 -0
- package/src/decision-log.js +40 -0
- package/src/fs-utils.js +25 -0
- package/src/launcher.js +55 -0
- package/src/mcp-config.js +30 -0
- package/src/mcp-live-client.js +186 -0
- package/src/paths.js +26 -0
- package/src/policy.js +23 -0
- package/src/release-state.js +59 -0
- package/src/runtime-artifacts.js +363 -0
- package/src/skill-installer.js +49 -0
- package/src/skills.js +507 -0
- package/src/state-sync.js +15 -0
package/bin/ma.js
ADDED
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
evaluateBuildGate,
|
|
5
|
+
formatBuildBlockers,
|
|
6
|
+
formatNextAllowedTriggers,
|
|
7
|
+
} from "../src/build-gate.js";
|
|
8
|
+
import { appendDecision } from "../src/decision-log.js";
|
|
9
|
+
import { runCodex, shouldDelegateToCodex } from "../src/launcher.js";
|
|
10
|
+
import {
|
|
11
|
+
canMarkBuildDone,
|
|
12
|
+
rejectsDirectProdPromotion,
|
|
13
|
+
validateMergeTarget,
|
|
14
|
+
validateReleaseOrigin,
|
|
15
|
+
} from "../src/policy.js";
|
|
16
|
+
import { loadReleaseState } from "../src/release-state.js";
|
|
17
|
+
import { writeBuildPlanArtifact } from "../src/runtime-artifacts.js";
|
|
18
|
+
import {
|
|
19
|
+
listSkills,
|
|
20
|
+
runArch,
|
|
21
|
+
runFlow,
|
|
22
|
+
runIdea,
|
|
23
|
+
runInit,
|
|
24
|
+
runSage,
|
|
25
|
+
runVet,
|
|
26
|
+
runVibe,
|
|
27
|
+
} from "../src/skills.js";
|
|
28
|
+
import { syncStatusUpdates } from "../src/state-sync.js";
|
|
29
|
+
|
|
30
|
+
function printUsage() {
|
|
31
|
+
console.error("Usage:");
|
|
32
|
+
console.error(" ma");
|
|
33
|
+
console.error(" ma setup");
|
|
34
|
+
console.error(" ma init");
|
|
35
|
+
console.error(' ma idea "..."');
|
|
36
|
+
console.error(" ma skills");
|
|
37
|
+
console.error(" ma status");
|
|
38
|
+
console.error(" ma run $arch|$sage|$flow|$vet|$vibe|$build");
|
|
39
|
+
console.error(" ma merge <source-branch> <target-branch>");
|
|
40
|
+
console.error(" ma release <origin-branch> <target-branch>");
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function printStatus(releaseState) {
|
|
44
|
+
console.log("Meta-Architect Status");
|
|
45
|
+
console.log("=====================");
|
|
46
|
+
console.log(`Idea: ${releaseState.idea_status}`);
|
|
47
|
+
console.log(`Architecture: ${releaseState.architecture_status}`);
|
|
48
|
+
console.log(`Evidence: ${releaseState.evidence_status}`);
|
|
49
|
+
console.log(`Logic: ${releaseState.logic_status}`);
|
|
50
|
+
console.log(`Security: ${releaseState.security_status}`);
|
|
51
|
+
console.log(`Experience: ${releaseState.experience_status}`);
|
|
52
|
+
console.log(`Build: ${releaseState.build_status}`);
|
|
53
|
+
|
|
54
|
+
const evaluation = evaluateBuildGate(releaseState);
|
|
55
|
+
console.log("Next allowed triggers:");
|
|
56
|
+
const triggers = formatNextAllowedTriggers(evaluation);
|
|
57
|
+
if (triggers.length === 0) {
|
|
58
|
+
console.log("$build");
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
for (const trigger of triggers) {
|
|
63
|
+
console.log(trigger);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
async function runBuild(releaseState) {
|
|
68
|
+
const evaluation = evaluateBuildGate(releaseState);
|
|
69
|
+
|
|
70
|
+
if (!evaluation.allowed) {
|
|
71
|
+
const blockers = formatBuildBlockers(evaluation);
|
|
72
|
+
await writeBuildPlanArtifact({
|
|
73
|
+
allowed: false,
|
|
74
|
+
blockers,
|
|
75
|
+
nextTriggers: formatNextAllowedTriggers(evaluation),
|
|
76
|
+
});
|
|
77
|
+
await appendDecision({
|
|
78
|
+
decision: "Blocked build execution",
|
|
79
|
+
status: "BLOCKED",
|
|
80
|
+
evidence: [
|
|
81
|
+
{
|
|
82
|
+
kind: "release-state",
|
|
83
|
+
path: ".ma/release.json",
|
|
84
|
+
},
|
|
85
|
+
],
|
|
86
|
+
blockers,
|
|
87
|
+
next_allowed_triggers: formatNextAllowedTriggers(evaluation),
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
console.error("Build is locked.");
|
|
91
|
+
for (const blocker of blockers) {
|
|
92
|
+
console.error(`- ${blocker}`);
|
|
93
|
+
}
|
|
94
|
+
process.exitCode = 1;
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const suggestedBranches = ["feature/ui", "feature/api"];
|
|
99
|
+
await writeBuildPlanArtifact({
|
|
100
|
+
allowed: true,
|
|
101
|
+
blockers: [],
|
|
102
|
+
nextTriggers: ["$build"],
|
|
103
|
+
suggestedBranches,
|
|
104
|
+
});
|
|
105
|
+
await appendDecision({
|
|
106
|
+
kind: "skill",
|
|
107
|
+
skill: "$build",
|
|
108
|
+
decision: "Build gate ready",
|
|
109
|
+
status: "READY",
|
|
110
|
+
evidence: [
|
|
111
|
+
{
|
|
112
|
+
kind: "release-state",
|
|
113
|
+
path: ".ma/release.json",
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
branches: ["feature/ui", "feature/api"],
|
|
117
|
+
},
|
|
118
|
+
],
|
|
119
|
+
blockers: [],
|
|
120
|
+
next_allowed_triggers: ["$build"],
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
await syncStatusUpdates({ build_status: "READY" });
|
|
124
|
+
|
|
125
|
+
console.log("Build gate is green.");
|
|
126
|
+
console.log("Suggested branches:");
|
|
127
|
+
console.log(`- ${suggestedBranches[0]}`);
|
|
128
|
+
console.log(`- ${suggestedBranches[1]}`);
|
|
129
|
+
console.log("Optional worktree commands:");
|
|
130
|
+
console.log("git worktree add ../ui feature/ui");
|
|
131
|
+
console.log("git worktree add ../api feature/api");
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
async function runMerge(sourceBranch, targetBranch) {
|
|
135
|
+
const releaseState = await loadReleaseState();
|
|
136
|
+
|
|
137
|
+
if (!validateMergeTarget(sourceBranch, targetBranch)) {
|
|
138
|
+
throw new Error("Merge policy violation: only feature/* -> development is allowed");
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
if (!canMarkBuildDone(releaseState)) {
|
|
142
|
+
throw new Error("Merge is blocked until build status is READY or RUNNING");
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
await appendDecision({
|
|
146
|
+
kind: "merge",
|
|
147
|
+
decision: `Merge approved from ${sourceBranch} to ${targetBranch}`,
|
|
148
|
+
status: "MERGED_TO_DEVELOPMENT",
|
|
149
|
+
evidence: [{ sourceBranch, targetBranch }],
|
|
150
|
+
blockers: [],
|
|
151
|
+
next_allowed_triggers: ["release"],
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
await syncStatusUpdates({
|
|
155
|
+
build_status: "DONE",
|
|
156
|
+
merge_status: "MERGED_TO_DEVELOPMENT",
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
console.log(`Merge approved: ${sourceBranch} -> ${targetBranch}`);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
async function runRelease(originBranch, targetBranch) {
|
|
163
|
+
const releaseState = await loadReleaseState();
|
|
164
|
+
|
|
165
|
+
if (targetBranch !== "prod") {
|
|
166
|
+
throw new Error("Release policy violation: target branch must be prod");
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
if (rejectsDirectProdPromotion(originBranch) || !validateReleaseOrigin(originBranch)) {
|
|
170
|
+
throw new Error(
|
|
171
|
+
"Release policy violation: only development or approved release/* can promote to prod",
|
|
172
|
+
);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
if (releaseState.merge_status !== "MERGED_TO_DEVELOPMENT") {
|
|
176
|
+
throw new Error("Release is blocked until merge_status is MERGED_TO_DEVELOPMENT");
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
await appendDecision({
|
|
180
|
+
kind: "release",
|
|
181
|
+
decision: `Release approved from ${originBranch} to ${targetBranch}`,
|
|
182
|
+
status: "SHIPPED_TO_PROD",
|
|
183
|
+
evidence: [{ originBranch, targetBranch }],
|
|
184
|
+
blockers: [],
|
|
185
|
+
next_allowed_triggers: [],
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
await syncStatusUpdates({
|
|
189
|
+
release_status: "SHIPPED_TO_PROD",
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
console.log(`Release approved: ${originBranch} -> ${targetBranch}`);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
async function main() {
|
|
196
|
+
const [, , command, ...rest] = process.argv;
|
|
197
|
+
const args = process.argv.slice(2);
|
|
198
|
+
const arg = rest[0];
|
|
199
|
+
|
|
200
|
+
if (shouldDelegateToCodex(args)) {
|
|
201
|
+
process.exitCode = runCodex(args);
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
if (command === "setup") {
|
|
206
|
+
const created = await runInit();
|
|
207
|
+
console.log("meta-architect setup");
|
|
208
|
+
console.log("====================");
|
|
209
|
+
for (const item of created) {
|
|
210
|
+
console.log(`ready: ${item}`);
|
|
211
|
+
}
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
if (command === "init") {
|
|
216
|
+
const created = await runInit();
|
|
217
|
+
console.log("meta-architect init");
|
|
218
|
+
console.log("===================");
|
|
219
|
+
for (const item of created) {
|
|
220
|
+
console.log(`ready: ${item}`);
|
|
221
|
+
}
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
if (command === "idea") {
|
|
226
|
+
const idea = rest.join(" ").trim();
|
|
227
|
+
await runIdea(idea);
|
|
228
|
+
console.log("Idea recorded.");
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
if (command === "skills") {
|
|
233
|
+
for (const skill of listSkills()) {
|
|
234
|
+
console.log(skill);
|
|
235
|
+
}
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
if (command === "status") {
|
|
240
|
+
const releaseState = await loadReleaseState();
|
|
241
|
+
printStatus(releaseState);
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
if (command === "merge") {
|
|
246
|
+
const [sourceBranch, targetBranch] = rest;
|
|
247
|
+
await runMerge(sourceBranch, targetBranch);
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
if (command === "release") {
|
|
252
|
+
const [originBranch, targetBranch] = rest;
|
|
253
|
+
await runRelease(originBranch, targetBranch);
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
if (command === "run" && arg === "$build") {
|
|
258
|
+
const releaseState = await loadReleaseState();
|
|
259
|
+
await runBuild(releaseState);
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
if (command === "run" && arg === "$arch") {
|
|
264
|
+
await runArch();
|
|
265
|
+
console.log("$arch complete");
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
if (command === "run" && arg === "$sage") {
|
|
270
|
+
await runSage();
|
|
271
|
+
console.log("$sage complete");
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
if (command === "run" && arg === "$flow") {
|
|
276
|
+
await runFlow();
|
|
277
|
+
console.log("$flow complete");
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
if (command === "run" && arg === "$vet") {
|
|
282
|
+
await runVet();
|
|
283
|
+
console.log("$vet complete");
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
if (command === "run" && arg === "$vibe") {
|
|
288
|
+
await runVibe();
|
|
289
|
+
console.log("$vibe complete");
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
printUsage();
|
|
294
|
+
process.exitCode = 1;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
main().catch((error) => {
|
|
298
|
+
console.error(error.message);
|
|
299
|
+
process.exitCode = 1;
|
|
300
|
+
});
|
package/docs/README.md
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Docs Index
|
|
2
|
+
|
|
3
|
+
Meta-Architect documentation is organized by operator task.
|
|
4
|
+
|
|
5
|
+
## Start here
|
|
6
|
+
|
|
7
|
+
- [Getting Started](./getting-started.md)
|
|
8
|
+
- [Release Spec](./release-spec.md)
|
|
9
|
+
- [Skills Reference](./skills.md)
|
|
10
|
+
|
|
11
|
+
## Packaging and installation
|
|
12
|
+
|
|
13
|
+
- [Skills Publishing](./skills-publishing.md)
|
|
14
|
+
- [MCP Setup](./mcp-setup.md)
|
|
15
|
+
- [Plugin Bundle](../plugins/meta-architect/README.md)
|
|
16
|
+
|
|
17
|
+
## QA and readiness
|
|
18
|
+
|
|
19
|
+
- [Release Readiness 0.1.0](./qa/release-readiness-0.1.0.md)
|
|
20
|
+
|
|
21
|
+
## Repo structure references
|
|
22
|
+
|
|
23
|
+
- [README.md](../README.md)
|
|
24
|
+
- [CONTRIBUTING.md](../CONTRIBUTING.md)
|
|
Binary file
|