genesis-compiler 1.2.5 → 1.2.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 (40) hide show
  1. package/README.md +45 -19
  2. package/docs/prompt-integration.md +1 -1
  3. package/docs/stack-components.md +19 -4
  4. package/package.json +2 -4
  5. package/plugins/genesis/.codex-plugin/plugin.json +1 -1
  6. package/prompts/adopt.txt +6 -0
  7. package/src/cli.js +38 -10
  8. package/src/index/agent-skills.js +11 -3
  9. package/src/index/check.js +30 -2
  10. package/src/index/code-index.js +7 -2
  11. package/src/index/context.js +2 -2
  12. package/src/index/contracts.js +7 -0
  13. package/src/index/deployment.js +4 -2
  14. package/src/index/environment-files.js +8 -2
  15. package/src/index/init.js +2 -2
  16. package/src/index/launch.js +4 -1
  17. package/src/index/process.js +119 -5
  18. package/src/index/prompt.js +24 -16
  19. package/src/index/stack-catalog.js +111 -26
  20. package/src/index/stack.js +60 -8
  21. package/src/index/verification.js +15 -1
  22. package/src/index/workspace-setup.js +12 -2
  23. package/src/index.js +29 -17
  24. package/stacks/pieces/cpp.md +0 -34
  25. package/stacks/pieces/csharp.md +0 -22
  26. package/stacks/pieces/go.md +0 -22
  27. package/stacks/pieces/java.md +0 -22
  28. package/stacks/pieces/jskit-mysql.md +0 -56
  29. package/stacks/pieces/jskit-postgresql.md +0 -56
  30. package/stacks/pieces/jskit.md +0 -114
  31. package/stacks/pieces/kotlin.md +0 -22
  32. package/stacks/pieces/mysql.md +0 -29
  33. package/stacks/pieces/nodejs.md +0 -36
  34. package/stacks/pieces/php.md +0 -23
  35. package/stacks/pieces/postgresql.md +0 -30
  36. package/stacks/pieces/python.md +0 -23
  37. package/stacks/pieces/ruby.md +0 -22
  38. package/stacks/pieces/rust.md +0 -22
  39. package/stacks/pieces/shell.md +0 -23
  40. package/stacks/pieces/vue.md +0 -28
@@ -6,6 +6,9 @@ import { withStackEnvironmentDefaults } from './stack-environment-defaults.js';
6
6
  import { missingStackResources } from './stack-preflight.js';
7
7
  import { readStack } from './stack.js';
8
8
  import { inspectWorkspaceSetupForStack } from './workspace-setup.js';
9
+ import { GENESIS_CONTRACTS } from './contracts.js';
10
+
11
+ const DEFAULT_FINITE_COMMAND_TIMEOUT_MS = 30 * 60 * 1_000;
9
12
 
10
13
  async function emit(onEvent, event) {
11
14
  try { await onEvent?.(event); } catch { /* Progress observers do not control verification. */ }
@@ -16,12 +19,16 @@ export async function verifyProject({
16
19
  onEvent,
17
20
  processRunner = runProcess,
18
21
  projectRoot,
22
+ signal,
23
+ stackPackages = [],
24
+ timeoutMs = DEFAULT_FINITE_COMMAND_TIMEOUT_MS,
19
25
  } = {}) {
20
26
  const root = (await gitContext(projectRoot)).repositoryRoot;
21
- const stack = await readStack(root);
27
+ const stack = await readStack(root, { stackPackages });
22
28
  const workspaceSetup = await inspectWorkspaceSetupForStack({ projectRoot: root, stack });
23
29
  if (workspaceSetup.status === 'blocked') {
24
30
  return {
31
+ contract: GENESIS_CONTRACTS.verification,
25
32
  status: 'blocked',
26
33
  summary: workspaceSetup.diagnostics.map(({ message }) => message).join(' '),
27
34
  commands: [],
@@ -33,6 +40,7 @@ export async function verifyProject({
33
40
  );
34
41
  if (waiting.length > 0) {
35
42
  return {
43
+ contract: GENESIS_CONTRACTS.verification,
36
44
  status: 'unconfigured',
37
45
  summary: waiting.map(({ message }) => message).join(' '),
38
46
  commands: [],
@@ -49,6 +57,7 @@ export async function verifyProject({
49
57
  });
50
58
  if (missing.length > 0) {
51
59
  return {
60
+ contract: GENESIS_CONTRACTS.verification,
52
61
  status: 'blocked',
53
62
  summary: missing.map(({ message }) => message).join(' '),
54
63
  commands: [],
@@ -57,6 +66,7 @@ export async function verifyProject({
57
66
  }
58
67
  if (stack.commands.length === 0) {
59
68
  return {
69
+ contract: GENESIS_CONTRACTS.verification,
60
70
  status: 'unconfigured',
61
71
  summary: 'The selected Stack declares no verification commands.',
62
72
  commands: [],
@@ -79,6 +89,8 @@ export async function verifyProject({
79
89
  env: resolvedEnvironment,
80
90
  maxBytes: 32 * 1024 * 1024,
81
91
  code: 'VERIFICATION_FAILED',
92
+ signal,
93
+ timeoutMs,
82
94
  });
83
95
  await emit(onEvent, {
84
96
  type: 'genesis.verification',
@@ -90,6 +102,7 @@ export async function verifyProject({
90
102
  }
91
103
  const evidence = await writeVerification({ projectRoot: root, stack });
92
104
  return {
105
+ contract: GENESIS_CONTRACTS.verification,
93
106
  status: 'passed',
94
107
  summary: `Passed ${commands.length} declared verification command${commands.length === 1 ? '' : 's'}.`,
95
108
  commands,
@@ -98,6 +111,7 @@ export async function verifyProject({
98
111
  };
99
112
  } catch (error) {
100
113
  return {
114
+ contract: GENESIS_CONTRACTS.verification,
101
115
  status: 'failed',
102
116
  summary: error.message,
103
117
  commands: [],
@@ -7,6 +7,9 @@ import { runProcess } from './process.js';
7
7
  import { readStack } from './stack.js';
8
8
  import { withStackEnvironmentDefaults } from './stack-environment-defaults.js';
9
9
  import { sha256, stableJson, uniqueSorted } from './utils.js';
10
+ import { GENESIS_CONTRACTS } from './contracts.js';
11
+
12
+ const DEFAULT_FINITE_COMMAND_TIMEOUT_MS = 30 * 60 * 1_000;
10
13
 
11
14
  async function emit(onEvent, event) {
12
15
  try { await onEvent?.(event); } catch { /* Progress observers do not control preparation. */ }
@@ -54,6 +57,7 @@ export async function inspectWorkspaceSetupForStack({ projectRoot: root, stack }
54
57
  ? sha256(stableJson({ version: 1, steps: applicableSteps }))
55
58
  : '';
56
59
  return {
60
+ contract: GENESIS_CONTRACTS.workspaceSetup,
57
61
  status,
58
62
  stackHash: stack.identityHash,
59
63
  recipeHash,
@@ -70,9 +74,10 @@ export async function inspectWorkspaceSetupForStack({ projectRoot: root, stack }
70
74
  /** Read the Stack's workspace preparation recipe without executing it. */
71
75
  export async function inspectProjectWorkspaceSetup({
72
76
  projectRoot,
77
+ stackPackages = [],
73
78
  } = {}) {
74
79
  const root = (await gitContext(projectRoot)).repositoryRoot;
75
- const stack = await readStack(root);
80
+ const stack = await readStack(root, { stackPackages });
76
81
  return inspectWorkspaceSetupForStack({ projectRoot: root, stack });
77
82
  }
78
83
 
@@ -82,9 +87,12 @@ export async function prepareProjectWorkspace({
82
87
  onEvent,
83
88
  processRunner = runProcess,
84
89
  projectRoot,
90
+ signal,
91
+ stackPackages = [],
92
+ timeoutMs = DEFAULT_FINITE_COMMAND_TIMEOUT_MS,
85
93
  } = {}) {
86
94
  const root = (await gitContext(projectRoot)).repositoryRoot;
87
- const stack = await readStack(root);
95
+ const stack = await readStack(root, { stackPackages });
88
96
  const setup = await inspectWorkspaceSetupForStack({ projectRoot: root, stack });
89
97
  if (setup.status !== 'ready') {
90
98
  const summary = setup.diagnostics.map(({ message }) => message).join(' ')
@@ -114,6 +122,8 @@ export async function prepareProjectWorkspace({
114
122
  env: resolvedEnvironment,
115
123
  maxBytes: 32 * 1024 * 1024,
116
124
  code: 'WORKSPACE_PREPARATION_FAILED',
125
+ signal,
126
+ timeoutMs,
117
127
  });
118
128
  commands.push({
119
129
  label: step.label,
package/src/index.js CHANGED
@@ -9,7 +9,7 @@ import { installCodexPlugin } from './index/codex-plugin.js';
9
9
  import { inspectProjectEnvironment } from './index/environment-files.js';
10
10
  import { inspectProjectDeployment } from './index/deployment.js';
11
11
  import { inspectProjectLaunch } from './index/launch.js';
12
- import { listBuiltinStackPieces } from './index/stack-catalog.js';
12
+ import { listStackCatalogPieces } from './index/stack-catalog.js';
13
13
  import { addStackPieces } from './index/stack.js';
14
14
  import { verifyProject } from './index/verification.js';
15
15
  import {
@@ -17,6 +17,8 @@ import {
17
17
  prepareProjectWorkspace,
18
18
  } from './index/workspace-setup.js';
19
19
 
20
+ export { GENESIS_CONTRACTS } from './index/contracts.js';
21
+
20
22
  function withIndexResult(result, index) {
21
23
  const changedFiles = [...new Set([...result.changedFiles, ...index.changedFiles])].sort();
22
24
  const refreshedOnly = result.status === 'unchanged' && index.changedFiles.length > 0;
@@ -29,21 +31,26 @@ function withIndexResult(result, index) {
29
31
  };
30
32
  }
31
33
 
32
- async function initializeWithIndex(projectRoot) {
33
- const initialized = await initializeProject({ projectRoot });
34
- const index = await buildProjectIndex({ projectRoot });
34
+ async function initializeWithIndex(projectRoot, stackPackages = []) {
35
+ const initialized = await initializeProject({ projectRoot, stackPackages });
36
+ const index = await buildProjectIndex({ projectRoot, stackPackages });
35
37
  return withIndexResult(initialized, index);
36
38
  }
37
39
 
38
- export function initialize({ projectRoot = process.cwd() } = {}) {
39
- return initializeWithIndex(projectRoot);
40
+ export function initialize({ projectRoot = process.cwd(), stackPackages = [] } = {}) {
41
+ return initializeWithIndex(projectRoot, stackPackages);
40
42
  }
41
43
 
42
- export async function adoptProject({ projectRoot = process.cwd(), request = '' } = {}) {
43
- const initialized = await initializeWithIndex(projectRoot);
44
+ export async function adoptProject({
45
+ projectRoot = process.cwd(),
46
+ request = '',
47
+ stackPackages = [],
48
+ } = {}) {
49
+ const initialized = await initializeWithIndex(projectRoot, stackPackages);
44
50
  const description = await generateProjectPrompt({
45
51
  projectRoot,
46
52
  request,
53
+ stackPackages,
47
54
  task: 'adopt',
48
55
  });
49
56
  return {
@@ -62,15 +69,15 @@ export function installCodex({ environment = process.env } = {}) {
62
69
  return installCodexPlugin({ environment });
63
70
  }
64
71
 
65
- export async function addStack({ pieces, projectRoot = process.cwd() } = {}) {
72
+ export async function addStack({ pieces, projectRoot = process.cwd(), stackPackages = [] } = {}) {
66
73
  const root = path.resolve(projectRoot);
67
- const selected = await addStackPieces({ pieces, projectRoot: root });
68
- const index = await buildProjectIndex({ projectRoot: root });
74
+ const selected = await addStackPieces({ pieces, projectRoot: root, stackPackages });
75
+ const index = await buildProjectIndex({ projectRoot: root, stackPackages });
69
76
  return withIndexResult(selected, index);
70
77
  }
71
78
 
72
- export function listStackPieces() {
73
- return listBuiltinStackPieces();
79
+ export function listStackPieces(options = {}) {
80
+ return listStackCatalogPieces(options);
74
81
  }
75
82
 
76
83
  export function inspectLaunch(options) {
@@ -97,12 +104,17 @@ export function generatePrompt(options) {
97
104
  return generateProjectPrompt(options);
98
105
  }
99
106
 
100
- export function getContext({ paths, projectRoot = process.cwd() } = {}) {
101
- return contextForProjectPaths({ paths, projectRoot });
107
+ export function getContext({ paths, projectRoot = process.cwd(), stackPackages = [] } = {}) {
108
+ return contextForProjectPaths({ paths, projectRoot, stackPackages });
102
109
  }
103
110
 
104
- export function indexCodebase({ projectRoot = process.cwd(), queries = [], write = true } = {}) {
105
- return buildProjectIndex({ projectRoot, queries, write });
111
+ export function indexCodebase({
112
+ projectRoot = process.cwd(),
113
+ queries = [],
114
+ stackPackages = [],
115
+ write = true,
116
+ } = {}) {
117
+ return buildProjectIndex({ projectRoot, queries, stackPackages, write });
106
118
  }
107
119
 
108
120
  export function verify(options) {
@@ -1,34 +0,0 @@
1
- # Stack piece: cpp
2
-
3
- ## Description
4
-
5
- C and C++ translation-unit, header, callable, ownership, build, and test conventions.
6
-
7
- ## Requires
8
-
9
- - Nothing.
10
-
11
- ## Indexers
12
-
13
- - `cpp`
14
-
15
- ## Adoption
16
-
17
- - Identify the actual build system and presets, compiler and language level,
18
- package/runtime dependencies, generated-source steps, and supported build
19
- configurations without substituting a preferred CMake or Meson layout.
20
- - Record exact configure/build/test commands and the executable argv, workdir,
21
- host/port handling, HTTP readiness predicate, and signal/shutdown contract for
22
- every web-service target.
23
- - Preserve public headers, ABI and platform assumptions. Treat databases,
24
- queues, TLS material, and external service credentials as explicit Resources,
25
- not implicit properties of the native binary.
26
-
27
- ## Deslop
28
-
29
- - Preserve public header boundaries, ABI expectations, build configuration,
30
- const correctness, lifetime ownership, and the codebase's C or C++ level.
31
- - Keep file-local helpers internal and near their callers. Consolidate repeated
32
- allocation, cleanup, conversion, and error paths with explicit ownership.
33
- - Remove unused wrappers, speculative templates, duplicate overload plumbing,
34
- and abstractions that obscure control flow without protecting a real boundary.
@@ -1,22 +0,0 @@
1
- # Stack piece: csharp
2
-
3
- ## Description
4
-
5
- C# namespace, public type, dependency, lifecycle, and test conventions.
6
-
7
- ## Requires
8
-
9
- - Nothing.
10
-
11
- ## Indexers
12
-
13
- - `csharp`
14
-
15
- ## Deslop
16
-
17
- - Preserve established namespaces, public contracts, dependency injection,
18
- async ownership, disposal, nullable annotations, and project conventions.
19
- - Keep private helpers with their owning type. Consolidate repeated mapping,
20
- validation, and error translation at an existing application boundary.
21
- - Remove redundant service wrappers, interfaces with no useful substitution
22
- boundary, and extension methods that only rename direct framework behavior.
@@ -1,22 +0,0 @@
1
- # Stack piece: go
2
-
3
- ## Description
4
-
5
- Go package, exported callable, interface, concurrency, resource, and test conventions.
6
-
7
- ## Requires
8
-
9
- - Nothing.
10
-
11
- ## Indexers
12
-
13
- - `go`
14
-
15
- ## Deslop
16
-
17
- - Preserve package ownership, exported APIs, context propagation, error
18
- wrapping, goroutine lifetime, and standard Go tooling conventions.
19
- - Keep unexported helpers close to their caller. Consolidate repeated setup,
20
- validation, cleanup, and conversion only at a clear package boundary.
21
- - Remove unnecessary interfaces, constructor wrappers, channels, and generic
22
- helpers that make direct control flow harder to follow.
@@ -1,22 +0,0 @@
1
- # Stack piece: java
2
-
3
- ## Description
4
-
5
- Java package, public type, dependency, lifecycle, and test conventions.
6
-
7
- ## Requires
8
-
9
- - Nothing.
10
-
11
- ## Indexers
12
-
13
- - `java`
14
-
15
- ## Deslop
16
-
17
- - Preserve established packages, public interfaces, dependency injection,
18
- lifecycle ownership, checked-error policy, and build-tool conventions.
19
- - Keep private helpers with their owning class. Consolidate repeated mapping,
20
- validation, and resource handling at an existing service or domain boundary.
21
- - Remove empty facades, single-implementation abstractions, and builder or DTO
22
- layers that do not protect a real public or compatibility boundary.
@@ -1,56 +0,0 @@
1
- # Stack piece: jskit-mysql
2
-
3
- ## Description
4
-
5
- JSKIT MySQL runtime, live-schema CRUD generation, and persistence conventions.
6
-
7
- ## Requires
8
-
9
- - `jskit`
10
- - `mysql`
11
-
12
- ## Conflicts
13
-
14
- - `jskit-postgresql`
15
-
16
- ## Environment defaults
17
-
18
- - Default `DB_CLIENT`: `mysql2`
19
-
20
- ## Resources
21
-
22
- ```json genesis-resource
23
- {
24
- "id": "database",
25
- "kind": "mysql",
26
- "environmentAlternatives": [
27
- {
28
- "required": ["DATABASE_URL"]
29
- },
30
- {
31
- "required": ["DB_HOST", "DB_PORT", "DB_NAME", "DB_USER", "DB_PASSWORD"],
32
- "allowEmpty": ["DB_PASSWORD"]
33
- }
34
- ]
35
- }
36
- ```
37
-
38
- ## Adoption
39
-
40
- - Confirm that the application's effective MySQL environment alternatives and
41
- driver match this Resource declaration; add a project Resource contract when
42
- the existing application legitimately differs.
43
- - Verify from source that the database preparation path discovers every
44
- package-owned migration, preserves the existing ledger, orders cross-package
45
- constraints safely, and invokes an app-owned idempotent seed. Do not execute
46
- it during adoption.
47
-
48
- ## Deslop
49
-
50
- - Use the installed JSKIT database runtime and generated resource/repository
51
- seams; do not add a second client, connection factory, CRUD transport, or
52
- file-persistence fallback.
53
- - Keep environment normalization, transactions, row mapping, and database
54
- error translation at one established persistence boundary.
55
- - Never compete with or rewrite a generator-owned baseline migration. Preserve
56
- retained migration history and data semantics.
@@ -1,56 +0,0 @@
1
- # Stack piece: jskit-postgresql
2
-
3
- ## Description
4
-
5
- JSKIT PostgreSQL runtime, live-schema CRUD generation, and persistence conventions.
6
-
7
- ## Requires
8
-
9
- - `jskit`
10
- - `postgresql`
11
-
12
- ## Conflicts
13
-
14
- - `jskit-mysql`
15
-
16
- ## Environment defaults
17
-
18
- - Default `DB_CLIENT`: `pg`
19
-
20
- ## Resources
21
-
22
- ```json genesis-resource
23
- {
24
- "id": "database",
25
- "kind": "postgresql",
26
- "environmentAlternatives": [
27
- {
28
- "required": ["DATABASE_URL"]
29
- },
30
- {
31
- "required": ["DB_HOST", "DB_PORT", "DB_NAME", "DB_USER", "DB_PASSWORD"],
32
- "allowEmpty": ["DB_PASSWORD"]
33
- }
34
- ]
35
- }
36
- ```
37
-
38
- ## Adoption
39
-
40
- - Confirm that the application's effective PostgreSQL environment alternatives
41
- and driver match this Resource declaration; add a project Resource contract
42
- when the existing application legitimately differs.
43
- - Verify from source that the database preparation path discovers every
44
- package-owned migration, preserves the existing ledger, orders cross-package
45
- constraints safely, and invokes an app-owned idempotent seed. Do not execute
46
- it during adoption.
47
-
48
- ## Deslop
49
-
50
- - Use the installed JSKIT database runtime and generated resource/repository
51
- seams; do not add a second client, connection factory, CRUD transport, or
52
- file-persistence fallback.
53
- - Keep environment normalization, transactions, row mapping, and database
54
- error translation at one established persistence boundary.
55
- - Never compete with or rewrite a generator-owned baseline migration. Preserve
56
- retained migration history and data semantics.
@@ -1,114 +0,0 @@
1
- # Stack piece: jskit
2
-
3
- ## Description
4
-
5
- AI-first JSKIT runtime capabilities, tested source patterns, Vue surfaces, and
6
- application-owned composition.
7
-
8
- ## Requires
9
-
10
- - `nodejs`
11
-
12
- ## Skill
13
-
14
- - Package: `@jskit-ai/agent-docs`
15
- - Path: `skills/jskit`
16
-
17
- ## Guidance
18
-
19
- - Before creating or modifying JSKIT Vue/Vuetify UI, load the installed
20
- `jskit` Agent Skill and read its `references/material-3.md` completely.
21
- - Implement Material 3 through JSKIT patterns, shared screens, shell and
22
- placement seams, app-owned theme configuration, and supported Vuetify APIs.
23
- - Use geometry-preserving Material skeletons for all user-visible loading;
24
- never use a generic spinner or circular progress indicator, or let content
25
- jump when data arrives. Actions use stable disabled/pending labels.
26
- - Keep resource-load and field errors in context, but route transient
27
- user-command failures through JSKIT's shared non-layout-shifting action
28
- feedback/snackbar path.
29
-
30
- ## Adoption
31
-
32
- - Read the installed JSKIT skill's existing-application migration guidance
33
- completely before editing Stack or assessing readiness.
34
- - Inventory the coordinated `@jskit-ai/*` package graph, application-owned
35
- composition, package-owned migrations, explicit repositories/features/named
36
- actions, and current client resources without running a broad package update.
37
- - Compare the real package scripts with JSKIT's current Workspace setup,
38
- Launch, verification, and Deployment declarations. Older source needs complete
39
- project-owned overrides until a separately approved port supplies the current
40
- commands.
41
- - Inspect existing setup and database preparation for both migration discovery
42
- and an app-owned idempotent seed. Never infer `db:prepare` from the selected
43
- component when the script or preparation file does not exist.
44
- - When authenticated Preview exists, preserve the app-owned Preview identity
45
- command, selectors, protocol, environment names, runtime, and timeout in the
46
- project's Launch declaration. A host-saved identity name/value is not a
47
- substitute for this application contract.
48
- - Treat generator descriptors, receipts, sync commands, legacy service
49
- locators, and retired tool manifests as migration evidence only. Translate
50
- live facts into current source/Stack and report remaining port work; do not
51
- add compatibility readers or claim adoption performed the port.
52
-
53
- ## Workspace setup
54
-
55
- - Prepare `Install dependencies` with `nodejs` when `package.json` exists: `npm` `install`
56
- - Prepare `Prepare database` with `nodejs` if `scripts/prepare-database.js` exists: `npm` `run` `db:prepare`
57
-
58
- ## Environment files
59
-
60
- - Dotenv `.env`
61
-
62
- ## City regions
63
-
64
- - Ignore `**/test/**`
65
- - Ignore `**/tests/**`
66
- - Ignore `**/__tests__/**`
67
- - Ignore `**/*.test.*`
68
- - Ignore `**/*.spec.*`
69
- - Match `packages` as `Packages`: `packages/**`
70
- - Match `source` as `Source`: `src/**`
71
- - Fallback `everything-else` as `Everything else`
72
-
73
- ## Launch
74
-
75
- ### Target `app`: Run app
76
-
77
- - Default.
78
- - Preferred port: `3000`
79
- - URL path: `/`
80
- - Ready when: `GET` `/api/health` returns `200`
81
- - Runtimes: `nodejs`
82
- - Serve `Develop`: `npm` `run` `develop`
83
-
84
- ## Deployment
85
-
86
- - Runtimes: `nodejs`
87
- - Ready when: `GET` `/api/health` returns `200`
88
- - Prepare `Install dependencies`: `npm` `install`
89
- - Build `Build`: `npm` `run` `build`
90
- - Migrate `Prepare database`: `npm` `run` `db:prepare`
91
- - Serve `Start`: `npm` `start`
92
-
93
- ## Deslop
94
-
95
- - For every affected JSKIT screen, load the installed `jskit` Agent Skill,
96
- read `references/material-3.md`, and execute its Material 3 audit.
97
- - Use JSKIT patterns, packages, resources, composables, screens, and placement
98
- seams instead of parallel framework plumbing.
99
- - Treat copied pattern source as app-owned and customizable. Adapt routes,
100
- placements, and infrastructure tests coherently; when replacing a foundation
101
- route, update its baseline browser coverage instead of deleting it.
102
- - Consolidate repeated validation, pending/error state, API access, and page
103
- behavior at the shared resource or established JSKIT seam.
104
- - Replace transient command-error alerts that shift page content with the
105
- established JSKIT action feedback/snackbar seam; preserve stable in-page
106
- resource-load errors, retry states, and field validation.
107
- - Replace generic in-content spinners with Material skeletons that reserve the
108
- final layout, and verify that loading completion does not shift content.
109
- - Remove pass-through wrappers and abandoned scaffold code only when doing so
110
- preserves routes, placements, baseline tests, and observable behavior.
111
-
112
- ## Commands
113
-
114
- - Verify `application`: `npm` `run` `verify`
@@ -1,22 +0,0 @@
1
- # Stack piece: kotlin
2
-
3
- ## Description
4
-
5
- Kotlin package, public callable, coroutine, nullability, build, and test conventions.
6
-
7
- ## Requires
8
-
9
- - Nothing.
10
-
11
- ## Indexers
12
-
13
- - `kotlin`
14
-
15
- ## Deslop
16
-
17
- - Preserve package visibility, nullability, coroutine ownership, public types,
18
- dependency injection, and Gradle or multiplatform conventions.
19
- - Keep private functions near their caller. Consolidate repeated mapping,
20
- validation, state, and error translation at an existing boundary.
21
- - Remove redundant extension functions, wrappers, sealed hierarchies, and
22
- generic layers that do not make the domain or lifecycle clearer.
@@ -1,29 +0,0 @@
1
- # Stack piece: mysql
2
-
3
- ## Description
4
-
5
- MySQL persistence and migration conventions.
6
-
7
- ## Requires
8
-
9
- - Nothing.
10
-
11
- ## Adoption
12
-
13
- - Identify the application's accepted connection alternatives, client/driver,
14
- migration directories and ledger, transaction ownership, and the exact
15
- preparation command without connecting to or mutating a database.
16
- - Distinguish fresh-schema creation from existing-database upgrade. Record how
17
- package/application migrations are ordered and how a retained ledger prevents
18
- historical migrations from rerunning.
19
- - Identify app-owned seed behavior and whether it is deterministic and
20
- idempotent. A migration-only command is not a complete seed contract.
21
-
22
- ## Deslop
23
-
24
- - Keep connection configuration, transaction ownership, and database error
25
- translation at one persistence boundary.
26
- - Use the selected integration's client and migration lifecycle instead of
27
- adding parallel connection factories or schema-management code.
28
- - Preserve migration history and data semantics. Deslop is not permission for
29
- destructive schema changes.
@@ -1,36 +0,0 @@
1
- # Stack piece: nodejs
2
-
3
- ## Description
4
-
5
- Node.js package, command, module, dependency, and test conventions.
6
-
7
- ## Requires
8
-
9
- - Nothing.
10
-
11
- ## Indexers
12
-
13
- - `javascript`
14
-
15
- ## Adoption
16
-
17
- - Identify the package manager from the lockfile and preserve the existing
18
- module system, supported Node.js version, package entrypoints, and executable
19
- commands.
20
- - Record the source's real dependency installation, build, verification,
21
- development, and production commands. Do not assume `npm run develop`,
22
- `npm test`, or `npm start` exists merely because a current foundation uses it.
23
- - Identify every long-running process, its workdir, host/port handling,
24
- readiness signal, and shutdown ownership before declaring Launch.
25
-
26
- ## Deslop
27
-
28
- - Preserve the package's existing module system, package manager, public
29
- exports, registered commands, and supported runtime.
30
- - Prefer direct modules and Node.js built-ins over wrappers that merely rename
31
- an operation.
32
- - Keep single-consumer helpers private and close to their caller. Consolidate
33
- repeated argument, path, serialization, error, and process-lifecycle logic
34
- only when one clear shared operation exists.
35
- - Make subprocess, listener, timer, and cleanup ownership obvious. Remove dead
36
- entrypoints and duplicate public exports instead of maintaining aliases.
@@ -1,23 +0,0 @@
1
- # Stack piece: php
2
-
3
- ## Description
4
-
5
- PHP package, namespace, callable, dependency, and test conventions.
6
-
7
- ## Requires
8
-
9
- - Nothing.
10
-
11
- ## Indexers
12
-
13
- - `php`
14
-
15
- ## Deslop
16
-
17
- - Preserve established namespaces, package boundaries, public interfaces,
18
- framework lifecycle, dependency injection, and Composer conventions.
19
- - Keep private and protected helpers close to their owning class. Consolidate
20
- repeated request, validation, mapping, and persistence behavior at the
21
- existing application seam rather than adding generic utility layers.
22
- - Remove abandoned service wrappers, duplicated facades, and aliases that do
23
- not protect a real compatibility boundary.