create-agdf 0.9.1 → 0.9.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/README.md +33 -4
  2. package/bin/create-agdf.js +2 -3333
  3. package/generated/.agdf/control/templates/MASTER_BACKLOG.md +3 -3
  4. package/generated/.github/skills/agdf-gate-check/SKILL.md +5 -0
  5. package/generated/.github/skills/agdf-interaction-locales.json +36 -0
  6. package/generated/.github/skills/contracts/interaction.md +9 -1
  7. package/generated/.opencode/agdf-interaction-locales.json +36 -0
  8. package/generated/.opencode/contracts/interaction.md +9 -1
  9. package/generated/.opencode/skills/agdf-gate-check/SKILL.md +5 -0
  10. package/generated/plugins/agdf/.codex-plugin/plugin.json +1 -1
  11. package/generated/plugins/agdf/control/templates/MASTER_BACKLOG.md +3 -3
  12. package/generated/plugins/agdf/meta/agdf-interaction-locales.json +36 -0
  13. package/generated/plugins/agdf/meta/agdf-plugin.definition.json +1 -1
  14. package/generated/plugins/agdf/meta/contracts/interaction.md +9 -1
  15. package/generated/plugins/agdf/skills/gate-check/SKILL.md +5 -0
  16. package/lib/cli/application.js +342 -0
  17. package/lib/cli/command-registry.js +119 -0
  18. package/lib/cli/delivery-path-search-command.js +75 -0
  19. package/lib/cli/parse-args.js +150 -0
  20. package/lib/cli/runtime-context.js +83 -0
  21. package/lib/control-evaluation/delivery-map.js +291 -0
  22. package/lib/control-evaluation/doctor.js +265 -0
  23. package/lib/control-evaluation/gate-check.js +404 -0
  24. package/lib/control-evaluation/gate-policy.js +283 -0
  25. package/lib/control-evaluation/run-state.js +217 -0
  26. package/lib/control-evaluation/shared.js +344 -0
  27. package/lib/control-evaluation/verified-change.js +156 -0
  28. package/lib/installers/opencode.js +443 -0
  29. package/lib/installers/plugin-installers.js +99 -0
  30. package/lib/lifecycle/operations.js +177 -0
  31. package/lib/lifecycle/presentation.js +52 -0
  32. package/lib/lifecycle/result.js +69 -0
  33. package/lib/lifecycle/status.js +108 -0
  34. package/lib/scaffold/plan.js +278 -0
  35. package/lib/scaffold/presentation.js +98 -0
  36. package/lib/scaffold/write.js +45 -0
  37. package/package.json +4 -2
@@ -0,0 +1,278 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { generatedRoot, languageConfigContent, pluginDefinition } from "../cli/runtime-context.js";
4
+
5
+ export const agdfFragmentPath = "AGENTS.agdf.md";
6
+ export const openCodeConfigFragmentPath = "opencode.agdf.json";
7
+ const codexSkillNames = pluginDefinition.skillSet.map((skill) => `${pluginDefinition.codex.skillPrefix}${skill.slug}`);
8
+ const copilotSkillNames = pluginDefinition.skillSet.map((skill) => `${pluginDefinition.copilot.skillPrefix}${skill.slug}`);
9
+ const openCodeSkillNames = pluginDefinition.skillSet.map((skill) => `${pluginDefinition.opencode.skillPrefix}${skill.slug}`);
10
+ const globalOpenCodeSkillNames = pluginDefinition.skillSet.map((skill) => `${pluginDefinition.opencode.globalSkillPrefix}${skill.slug}`);
11
+ const contractModules = [
12
+ "gate-transition.md",
13
+ "interaction.md",
14
+ "modes.md",
15
+ "quality.md",
16
+ "context-graph.md",
17
+ "control-scaffold.md",
18
+ "closeout.md",
19
+ ];
20
+ const codexPluginFiles = [
21
+ join(".agents", "plugins", "marketplace.json"),
22
+ join("plugins", "agdf", ".codex-plugin", "plugin.json"),
23
+ join("plugins", "agdf", "control", "README.md"),
24
+ join("plugins", "agdf", "control", "templates", "AGDF_RUN.md"),
25
+ join("plugins", "agdf", "control", "templates", "RUN_STATE.md"),
26
+ join("plugins", "agdf", "control", "templates", "MASTER_BACKLOG.md"),
27
+ join("plugins", "agdf", "control", "templates", "SOT_REGISTRY.md"),
28
+ join("plugins", "agdf", "control", "templates", "CONTEXT_GRAPH.md"),
29
+ join("plugins", "agdf", "control", "templates", "AGENT_QUALITY_CONTRACTS.json"),
30
+ join("plugins", "agdf", "control", "templates", "artefacts", "UR.md"),
31
+ join("plugins", "agdf", "control", "templates", "artefacts", "BROWNFIELD_REVIEW.md"),
32
+ join("plugins", "agdf", "control", "templates", "artefacts", "VERIFIED_CHANGE.md"),
33
+ join("plugins", "agdf", "control", "templates", "artefacts", "PRD.md"),
34
+ join("plugins", "agdf", "control", "templates", "artefacts", "SD.md"),
35
+ join("plugins", "agdf", "control", "templates", "artefacts", "TP.md"),
36
+ join("plugins", "agdf", "control", "templates", "artefacts", "QA_REPORT.md"),
37
+ join("plugins", "agdf", "control", "templates", "artefacts", "OR.md"),
38
+ join("plugins", "agdf", "hooks", "hooks.json"),
39
+ join("plugins", "agdf", "hooks", "session-start.sh"),
40
+ join("plugins", "agdf", "meta", "agdf-agent-router.md"),
41
+ join("plugins", "agdf", "meta", "agdf-constitution.md"),
42
+ join("plugins", "agdf", "meta", "agdf-plugin.definition.json"),
43
+ join("plugins", "agdf", "meta", "agdf-runtime-contract.md"),
44
+ join("plugins", "agdf", "meta", "agdf-tenets.md"),
45
+ ...contractModules.map((moduleName) => join("plugins", "agdf", "meta", "contracts", moduleName)),
46
+ ...codexSkillNames.map((skillName) => join("plugins", "agdf", "skills", skillName, "SKILL.md")),
47
+ ];
48
+ const controlFiles = [
49
+ join(".agdf", "control", "README.md"),
50
+ join(".agdf", "control", "templates", "AGDF_RUN.md"),
51
+ join(".agdf", "control", "templates", "RUN_STATE.md"),
52
+ join(".agdf", "control", "templates", "MASTER_BACKLOG.md"),
53
+ join(".agdf", "control", "templates", "SOT_REGISTRY.md"),
54
+ join(".agdf", "control", "templates", "CONTEXT_GRAPH.md"),
55
+ join(".agdf", "control", "templates", "AGENT_QUALITY_CONTRACTS.json"),
56
+ join(".agdf", "control", "templates", "artefacts", "UR.md"),
57
+ join(".agdf", "control", "templates", "artefacts", "BROWNFIELD_REVIEW.md"),
58
+ join(".agdf", "control", "templates", "artefacts", "VERIFIED_CHANGE.md"),
59
+ join(".agdf", "control", "templates", "artefacts", "PRD.md"),
60
+ join(".agdf", "control", "templates", "artefacts", "SD.md"),
61
+ join(".agdf", "control", "templates", "artefacts", "TP.md"),
62
+ join(".agdf", "control", "templates", "artefacts", "QA_REPORT.md"),
63
+ join(".agdf", "control", "templates", "artefacts", "OR.md"),
64
+ ];
65
+ const liveControlFiles = [
66
+ {
67
+ path: join(".agdf", "control", "AGDF_RUN.md"),
68
+ source: join(".agdf", "control", "templates", "AGDF_RUN.md"),
69
+ },
70
+ {
71
+ path: join(".agdf", "control", "MASTER_BACKLOG.md"),
72
+ source: join(".agdf", "control", "templates", "MASTER_BACKLOG.md"),
73
+ },
74
+ {
75
+ path: join(".agdf", "control", "SOT_REGISTRY.md"),
76
+ source: join(".agdf", "control", "templates", "SOT_REGISTRY.md"),
77
+ },
78
+ {
79
+ path: join(".agdf", "control", "CONTEXT_GRAPH.md"),
80
+ source: join(".agdf", "control", "templates", "CONTEXT_GRAPH.md"),
81
+ },
82
+ {
83
+ path: join(".agdf", "control", "AGENT_QUALITY_CONTRACTS.json"),
84
+ source: join(".agdf", "control", "templates", "AGENT_QUALITY_CONTRACTS.json"),
85
+ },
86
+ ];
87
+ const artefactTemplateFiles = [
88
+ join(".agdf", "control", "templates", "artefacts", "UR.md"),
89
+ join(".agdf", "control", "templates", "artefacts", "BROWNFIELD_REVIEW.md"),
90
+ join(".agdf", "control", "templates", "artefacts", "VERIFIED_CHANGE.md"),
91
+ join(".agdf", "control", "templates", "artefacts", "PRD.md"),
92
+ join(".agdf", "control", "templates", "artefacts", "SD.md"),
93
+ join(".agdf", "control", "templates", "artefacts", "TP.md"),
94
+ join(".agdf", "control", "templates", "artefacts", "QA_REPORT.md"),
95
+ join(".agdf", "control", "templates", "artefacts", "OR.md"),
96
+ ];
97
+ export const doctorRequiredFiles = [
98
+ join(".agdf", "control", "AGDF_RUN.md"),
99
+ join(".agdf", "control", "MASTER_BACKLOG.md"),
100
+ join(".agdf", "control", "SOT_REGISTRY.md"),
101
+ join(".agdf", "control", "CONTEXT_GRAPH.md"),
102
+ join(".agdf", "control", "AGENT_QUALITY_CONTRACTS.json"),
103
+ ];
104
+ const copilotInstructionFiles = [
105
+ join(".github", "copilot-instructions.md"),
106
+ join(".github", "instructions", "agdf-governance.instructions.md"),
107
+ ];
108
+ const copilotSkillFiles = [
109
+ join(".github", "skills", "README.md"),
110
+ join(".github", "skills", pluginDefinition.copilot.runtimeContractFileName),
111
+ ...contractModules.map((moduleName) => join(".github", "skills", "contracts", moduleName)),
112
+ ...copilotSkillNames.map((skillName) => join(".github", "skills", skillName, "SKILL.md")),
113
+ ];
114
+ const openCodeFiles = [
115
+ join(".opencode", pluginDefinition.opencode.instructionsFileName),
116
+ join(".opencode", "README.md"),
117
+ join(".opencode", pluginDefinition.opencode.runtimeContractFileName),
118
+ ...contractModules.map((moduleName) => join(".opencode", "contracts", moduleName)),
119
+ ...openCodeSkillNames.map((skillName) => join(".opencode", "skills", skillName, "SKILL.md")),
120
+ ];
121
+
122
+ function loadAsset(relativePath) {
123
+ return readFileSync(join(generatedRoot, relativePath), "utf8");
124
+ }
125
+
126
+ function isAgdfOwnedAgentsFile(content) {
127
+ return content.includes("## Surface Convention")
128
+ && content.includes("GitHub Copilot repository skills do not have a plugin namespace")
129
+ && content.includes("AGDF is agent-native first and CLI-verifiable by design");
130
+ }
131
+
132
+ function addCopilotAgentsFile(files, targetDir, force) {
133
+ const agentsPath = join(targetDir, "AGENTS.md");
134
+ if (!existsSync(agentsPath) || force) {
135
+ files.push({
136
+ path: "AGENTS.md",
137
+ content: loadAsset("AGENTS.md"),
138
+ });
139
+ return;
140
+ }
141
+
142
+ const existingAgents = readFileSync(agentsPath, "utf8");
143
+ if (isAgdfOwnedAgentsFile(existingAgents)) {
144
+ files.push({
145
+ path: "AGENTS.md",
146
+ content: loadAsset("AGENTS.md"),
147
+ allowOverwrite: true,
148
+ action: "refreshed",
149
+ });
150
+ return;
151
+ }
152
+
153
+ files.push({
154
+ path: agdfFragmentPath,
155
+ content: loadAsset("AGENTS.md"),
156
+ allowOverwrite: true,
157
+ action: "refreshed",
158
+ preserved: "AGENTS.md",
159
+ });
160
+ }
161
+
162
+ function shouldWriteLanguageConfig(target, targetDir, force) {
163
+ if (force) return true;
164
+ if ((target === "copilot" || target === "both") && existsSync(join(targetDir, ".agdf", "control", "config.json"))) return false;
165
+ return true;
166
+ }
167
+
168
+ function addLanguageConfig(files, languagePreference) {
169
+ files.push({
170
+ path: join(".agdf", "control", "config.json"),
171
+ content: languageConfigContent(languagePreference),
172
+ });
173
+ }
174
+
175
+ export function generatedFilesForTarget(target, targetDir, force, languagePreference) {
176
+ const files = [];
177
+
178
+ if (target === "config") {
179
+ files.push({
180
+ path: join(".agdf", "control", "config.json"),
181
+ content: languageConfigContent(languagePreference),
182
+ allowOverwrite: true,
183
+ });
184
+ return files;
185
+ }
186
+
187
+ if (target === "init") {
188
+ addLanguageConfig(files, languagePreference);
189
+ files.push({
190
+ path: join(".agdf", "control", "README.md"),
191
+ content: loadAsset(join(".agdf", "control", "README.md")),
192
+ });
193
+
194
+ for (const controlPath of liveControlFiles) {
195
+ files.push({
196
+ path: controlPath.path,
197
+ content: loadAsset(controlPath.source),
198
+ });
199
+ }
200
+
201
+ for (const templatePath of artefactTemplateFiles) {
202
+ files.push({
203
+ path: templatePath,
204
+ content: loadAsset(templatePath),
205
+ });
206
+ }
207
+
208
+ return files;
209
+ }
210
+
211
+ if (target === "codex-repo" || target === "both") {
212
+ if (shouldWriteLanguageConfig(target, targetDir, force)) addLanguageConfig(files, languagePreference);
213
+ for (const codexPath of codexPluginFiles) {
214
+ files.push({
215
+ path: codexPath,
216
+ content: loadAsset(codexPath),
217
+ });
218
+ }
219
+ }
220
+
221
+ if (target === "copilot" || target === "both") {
222
+ if (target !== "both" && shouldWriteLanguageConfig(target, targetDir, force)) addLanguageConfig(files, languagePreference);
223
+ addCopilotAgentsFile(files, targetDir, force);
224
+
225
+ for (const controlPath of controlFiles) {
226
+ files.push({
227
+ path: controlPath,
228
+ content: loadAsset(controlPath),
229
+ allowOverwrite: true,
230
+ action: "refreshed",
231
+ });
232
+ }
233
+
234
+ for (const instructionPath of copilotInstructionFiles) {
235
+ files.push({
236
+ path: instructionPath,
237
+ content: loadAsset(instructionPath),
238
+ allowOverwrite: true,
239
+ action: "refreshed",
240
+ });
241
+ }
242
+
243
+ for (const skillPath of copilotSkillFiles) {
244
+ files.push({
245
+ path: skillPath,
246
+ content: loadAsset(skillPath),
247
+ allowOverwrite: true,
248
+ action: "refreshed",
249
+ });
250
+ }
251
+ }
252
+
253
+ if (target === "opencode-repo") {
254
+ addLanguageConfig(files, languagePreference);
255
+ const openCodeConfigTargetPath = existsSync(join(targetDir, "opencode.json")) && !force ? openCodeConfigFragmentPath : "opencode.json";
256
+ files.push({
257
+ path: openCodeConfigTargetPath,
258
+ content: loadAsset("opencode.json"),
259
+ });
260
+
261
+ for (const openCodePath of openCodeFiles) {
262
+ files.push({
263
+ path: openCodePath,
264
+ content: loadAsset(openCodePath),
265
+ });
266
+ }
267
+
268
+ for (const controlPath of controlFiles) {
269
+ files.push({
270
+ path: controlPath,
271
+ content: loadAsset(controlPath),
272
+ });
273
+ }
274
+ }
275
+
276
+ return files;
277
+ }
278
+
@@ -0,0 +1,98 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { pluginDefinition } from "../cli/runtime-context.js";
4
+ import { printLifecycleResult } from "../lifecycle/presentation.js";
5
+ import { createLifecycleResult } from "../lifecycle/result.js";
6
+ import { agdfFragmentPath, openCodeConfigFragmentPath } from "./plan.js";
7
+
8
+ const pluginInstallCommand = "npx --yes @agdf/cli@latest claude";
9
+
10
+ export function printNextSteps(target, destination, files, wroteAgentsFragment, wroteOpenCodeConfigFragment, removedOpenCodeAgents = [], io = console) {
11
+ io.log("");
12
+ io.log(`AGDF bootstrap complete in ${destination}`);
13
+ io.log("");
14
+ io.log("Generated:");
15
+ for (const file of files) {
16
+ const action = file.action ? `${file.action}: ` : "";
17
+ io.log(`- ${action}${file.path}`);
18
+ }
19
+
20
+ if (removedOpenCodeAgents.length > 0) {
21
+ io.log("");
22
+ io.log("Removed generated legacy OpenCode agents:");
23
+ for (const relativePath of removedOpenCodeAgents) io.log(`- ${relativePath}`);
24
+ }
25
+
26
+ const preservedFiles = [...new Set(files.map((file) => file.preserved).filter(Boolean))];
27
+ if (preservedFiles.length > 0) {
28
+ io.log("");
29
+ io.log("Preserved:");
30
+ for (const preserved of preservedFiles) io.log(`- ${preserved}`);
31
+ }
32
+
33
+ if (target === "codex-repo") {
34
+ const verified = files.every((file) => {
35
+ const path = join(destination, file.path);
36
+ return existsSync(path) && readFileSync(path, "utf8") === file.content;
37
+ });
38
+ printLifecycleResult(createLifecycleResult({
39
+ operation: "repository_setup",
40
+ result: verified ? "success" : "partial",
41
+ surface: "codex",
42
+ scope: "repository",
43
+ version: { expected: pluginDefinition.version, status: "expected" },
44
+ verification: { status: verified ? "healthy" : "degraded", evidence: files.map((file) => file.path) },
45
+ restart: { required: true, reason: "host_reload_and_repository_plugin_activation" },
46
+ next_action: {
47
+ kind: "host_action",
48
+ text: "Restart Codex, open /plugins, select This repository and install agdf; then start a new task with: Run an AGDF gate check for this request.",
49
+ },
50
+ }), { locale: JSON.parse(files.find((file) => file.path === join(".agdf", "control", "config.json"))?.content ?? "{}").chat_language, io });
51
+ return;
52
+ }
53
+
54
+ io.log("");
55
+ io.log("Next steps:");
56
+ const languageConfig = files.find((file) => file.path === join(".agdf", "control", "config.json"));
57
+ if (languageConfig) {
58
+ const language = JSON.parse(languageConfig.content);
59
+ io.log(`- AGDF language preference: artefacts=${language.artifact_language}, chat=${language.chat_language}, runtime=${language.runtime_language}.`);
60
+ }
61
+ if (target === "init") {
62
+ io.log("- Create or migrate a canonical run, then fill its RUN_STATE.md with the current gate, evidence and next allowed action.");
63
+ io.log("- Run npx --yes @agdf/cli@latest doctor to check the control state before the next agent run.");
64
+ io.log("- Commit the live control files once they represent the repository's current delivery state.");
65
+ return;
66
+ }
67
+ if (target === "config") {
68
+ io.log("- Restart or start a new agent session so the AGDF SessionStart hook reads the updated project language config.");
69
+ io.log("- Run npx --yes @agdf/cli@latest doctor when this repository also uses durable AGDF control state.");
70
+ return;
71
+ }
72
+ if (wroteAgentsFragment) {
73
+ io.log(`- Existing AGENTS.md detected. Merge ${agdfFragmentPath} into your current AGENTS.md before using Copilot with AGDF.`);
74
+ }
75
+ if (target === "both") {
76
+ io.log("- Restart Codex in this repository, open /plugins, select This repository and install agdf.");
77
+ io.log("- Start a new Codex thread in this repository and ask: Run an AGDF gate check for this request.");
78
+ }
79
+ if (target === "both") {
80
+ io.log(`- Optional global Claude Code install: ${pluginInstallCommand}`);
81
+ }
82
+ if (target === "opencode-repo") {
83
+ if (wroteOpenCodeConfigFragment) {
84
+ io.log(`- Existing opencode.json detected. Review ${openCodeConfigFragmentPath} and merge its owned entries so OpenCode loads .opencode/AGDF.md; preserve an explicit permission.question decision.`);
85
+ }
86
+ io.log(`- OpenCode will install the ${pluginDefinition.opencode.npmPackage} npm plugin from opencode.json at startup.`);
87
+ io.log("- Optional: also add create-agdf to ~/.config/opencode/opencode.json plugin[] for a user-wide OpenCode hook.");
88
+ io.log("- The global hook does not replace repository instructions or native skills; this repository's .opencode files remain the AGDF source of truth.");
89
+ io.log("- Start OpenCode in this repository; it will load opencode.json, .opencode/AGDF.md and the native AGDF skills.");
90
+ io.log("- Load agdf-gate-check through OpenCode's native skill tool for new build/change intent or unclear approval before later artefacts or implementation.");
91
+ io.log("- Run npx --yes @agdf/cli@latest init when the repository needs live AGDF control files.");
92
+ }
93
+ if (target === "copilot" || target === "both") {
94
+ io.log("- In GitHub Copilot CLI, run /instructions after the AGENTS.md step is complete to confirm that AGDF instructions and the repository skills are visible.");
95
+ io.log("- Run npx --yes @agdf/cli@latest init when the repository needs live AGDF control files.");
96
+ }
97
+ io.log("- Commit the generated files so the repository becomes the source of truth.");
98
+ }
@@ -0,0 +1,45 @@
1
+ import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, writeFileSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ import { pluginDefinition } from "../cli/runtime-context.js";
4
+
5
+ export function writeGeneratedFile(targetDir, relativePath, content, force, allowOverwrite = false) {
6
+ const outputPath = join(targetDir, relativePath);
7
+ mkdirSync(dirname(outputPath), { recursive: true });
8
+
9
+ if (existsSync(outputPath) && !force && !allowOverwrite) {
10
+ throw new Error(`Refusing to overwrite existing file: ${relativePath}. Re-run with --force if you want to replace it.`);
11
+ }
12
+
13
+ writeFileSync(outputPath, content, "utf8");
14
+ }
15
+
16
+ export function removeOwnedLegacyOpenCodeAgents(targetDir) {
17
+ const agentsDir = join(targetDir, ".opencode", "agents");
18
+ if (!existsSync(agentsDir)) return [];
19
+
20
+ const removed = [];
21
+ for (const skill of pluginDefinition.skillSet) {
22
+ const skillName = `${pluginDefinition.opencode.skillPrefix}${skill.slug}`;
23
+ const relativePath = join(".opencode", "agents", `${skillName}.md`);
24
+ const agentPath = join(targetDir, relativePath);
25
+ if (!existsSync(agentPath)) continue;
26
+
27
+ const content = readFileSync(agentPath, "utf8");
28
+ const ownedHeader = `---\ndescription: ${skill.useFor}\nmode: subagent\n---`;
29
+ if (!content.startsWith(ownedHeader) || !content.includes(`# ${skill.slug}`)) continue;
30
+
31
+ rmSync(agentPath);
32
+ removed.push(relativePath);
33
+ }
34
+
35
+ if (readdirSync(agentsDir).length === 0) rmSync(agentsDir, { recursive: true });
36
+ return removed;
37
+ }
38
+
39
+ export function assertGeneratedWritePlan(targetDir, files, force) {
40
+ const blocked = files.find((file) => existsSync(join(targetDir, file.path)) && !force && !file.allowOverwrite);
41
+ if (blocked) {
42
+ throw new Error(`Refusing to overwrite existing file: ${blocked.path}. Re-run with --force if you want to replace it.`);
43
+ }
44
+ }
45
+
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-agdf",
3
- "version": "0.9.1",
3
+ "version": "0.9.5",
4
4
  "description": "Bootstrap AGDF repository-local plugin files, Copilot/OpenCode instructions, skills, control files and machine-readable checks.",
5
5
  "type": "module",
6
6
  "files": [
@@ -24,6 +24,8 @@
24
24
  "test:delivery-path-search": "node ./scripts/delivery-path-search-test.js",
25
25
  "test:delivery-path-search-unit": "node ./scripts/delivery-path-search-unit-test.js",
26
26
  "test:delivery-path-search-generator": "node ./scripts/delivery-path-search-generator-test.js",
27
+ "test:cli-modularization": "node ./scripts/cli-modularization-test.js",
28
+ "test:lifecycle": "node ./scripts/lifecycle-test.js",
27
29
  "test:control-state": "node ./scripts/control-state-test.js",
28
30
  "test:interaction-presentation": "node ./scripts/interaction-presentation-test.js",
29
31
  "test:verified-change": "node ./scripts/verified-change-test.js",
@@ -34,7 +36,7 @@
34
36
  "eval:skills:record": "node ./scripts/record-skill-evals.js",
35
37
  "test:release-bootstrap": "node ./scripts/release-bootstrap-smoke-test.js",
36
38
  "test:routing": "npm run sync-package-assets && node ./scripts/test-routing.js",
37
- "smoke-test": "npm run sync-package-assets && npm run test:control-state && npm run test:interaction-presentation && npm run test:verified-change && npm run test:runtime-integrity-layout && npm run test:runtime-integrity-negative && npm run test:skill-evals && npm run eval:skills && npm run test:delivery-path-search && npm run test:delivery-path-search-unit && npm run test:delivery-path-search-generator && node ./scripts/smoke-test.js && node ./scripts/test-routing.js",
39
+ "smoke-test": "npm run sync-package-assets && npm run test:cli-modularization && npm run test:lifecycle && npm run test:control-state && npm run test:interaction-presentation && npm run test:verified-change && npm run test:runtime-integrity-layout && npm run test:runtime-integrity-negative && npm run test:skill-evals && npm run eval:skills && npm run test:delivery-path-search && npm run test:delivery-path-search-unit && npm run test:delivery-path-search-generator && node ./scripts/smoke-test.js && node ./scripts/test-routing.js",
38
40
  "prepack": "npm run sync-package-assets"
39
41
  },
40
42
  "keywords": [