@boopkit/cli 0.7.1 → 0.8.1

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 (39) hide show
  1. package/README.md +8 -6
  2. package/dist/capability-catalog.json +10 -3
  3. package/dist/capability-versions.json +12 -11
  4. package/dist/commands/add.js +35 -7
  5. package/dist/commands/adopt.js +1 -1
  6. package/dist/commands/loop-merge.d.ts +11 -0
  7. package/dist/commands/loop-merge.js +135 -14
  8. package/dist/commands/loop.d.ts +19 -1
  9. package/dist/commands/loop.js +71 -3
  10. package/dist/commands/migrate-skill-edits.js +2 -2
  11. package/dist/commands/status.d.ts +10 -0
  12. package/dist/commands/status.js +27 -2
  13. package/dist/commands/update.js +157 -21
  14. package/dist/lib/capability.js +4 -1
  15. package/dist/lib/execute.js +19 -2
  16. package/dist/lib/install-layout.d.ts +5 -0
  17. package/dist/lib/install-layout.js +8 -0
  18. package/dist/lib/manifest.d.ts +1 -1
  19. package/dist/lib/moves.d.ts +88 -0
  20. package/dist/lib/moves.js +381 -0
  21. package/dist/lib/original-text.d.ts +2 -0
  22. package/dist/lib/original-text.js +15 -7
  23. package/dist/lib/preflight.d.ts +14 -1
  24. package/dist/lib/preflight.js +53 -17
  25. package/dist/lib/project.d.ts +17 -0
  26. package/dist/lib/project.js +26 -0
  27. package/dist/lib/scaffold.d.ts +12 -1
  28. package/dist/lib/scaffold.js +43 -4
  29. package/dist/lib/update.d.ts +36 -2
  30. package/dist/lib/update.js +82 -4
  31. package/docs/init.md +22 -0
  32. package/docs/loop.md +17 -3
  33. package/docs/skills.md +17 -13
  34. package/package.json +1 -1
  35. package/profiles/base/profile.md +13 -10
  36. package/profiles/development/profile.md +10 -8
  37. package/profiles/web-app/profile.md +6 -4
  38. package/profiles/web-app/reference/message-queue-patterns.ref.md +8 -13
  39. package/src/templates/kernel/tests/app.test.ts.hbs +17 -0
@@ -4,6 +4,7 @@ description: Development skills only — for a project with no application domai
4
4
  defaultCapabilities:
5
5
  # Development
6
6
  - coding
7
+ - typescript
7
8
  - testing
8
9
  - project-mgmt
9
10
  - product-design
@@ -31,16 +32,17 @@ but they are all developed the same way.
31
32
 
32
33
  ## What You Get
33
34
 
34
- Six capabilities, all of them `type: development` —
35
- pure skill bundles that guide agent behaviour,
36
- plus the handful of dev dependencies those skills assume:
35
+ Seven capabilities, all of them `type: development` —
36
+ skill bundles that guide agent behaviour,
37
+ plus the TypeScript toolchain those skills assume:
37
38
 
38
39
  - **coding** — development conventions, code style, commit and debugging skills
39
- - **testing** — Jest setup, test utilities, the TDD-Lite workflow
40
- - **project-mgmt** — beads issue tracking and planning skills
41
- - **product-design** — feature requirements, engineering design, documentation skills
40
+ - **typescript** — the TypeScript toolchain: Jest with ts-jest, `tsconfig.test.json`, and the `test` and `typecheck` scripts
41
+ - **testing** — the testing principles and the TDD-Lite workflow
42
+ - **project-mgmt** — beads issue tracking, planning, issue sweeps and stray disposition
43
+ - **product-design** — feature requirements, engineering design, documentation and knowledge backfill skills
42
44
  - **skills** — skill authoring, discovery and maintenance
43
- - **workflows** — the end-to-end development and writing workflows
45
+ - **workflows** — the end-to-end code development and audit workflows
44
46
 
45
47
  No web layer, no API layer, no service layer, no database.
46
48
  Add any of those with `boop add` if the project grows an application domain.
@@ -72,7 +74,7 @@ and the consequence is deliberate: `boop init --profile development` is refused
72
74
  with a message pointing at the two ways this profile is actually meant to be used —
73
75
  name it in an existing project's `.boop/config.json`,
74
76
  or `boop add` these capabilities one at a time.
75
- The capabilities carry their own dependencies (`jest`, `ts-jest`, `beads`),
77
+ The capabilities carry their own dependencies (`typescript` brings `jest` and `ts-jest`, and `project-mgmt` brings `beads`),
76
78
  so nothing is lost by having no kernel to merge them from.
77
79
 
78
80
  ### No reference/
@@ -9,6 +9,7 @@ defaultCapabilities:
9
9
  - database
10
10
  # Development
11
11
  - coding
12
+ - typescript
12
13
  - testing
13
14
  - project-mgmt
14
15
  - product-design
@@ -86,11 +87,12 @@ The `web-app` profile ships all of the following capabilities by default:
86
87
  - **services** — Service layer scaffolding, auto-discovery, and design skills
87
88
  - **database** — PostgreSQL with Prisma ORM, migrations, and seeding
88
89
 
89
- **Development capabilities** — pure skill bundles that guide agent behavior:
90
+ **Development capabilities** — skill bundles that guide agent behavior, and the toolchain they assume:
90
91
  - **coding** — Development conventions and code style skills
91
- - **testing** — Jest setup, test utilities, TDD workflow skills
92
- - **project-mgmt** — Beads issue tracking, planning skills
93
- - **product-design** — Feature requirements, design thinking skills
92
+ - **typescript** — The TypeScript toolchain: Jest with ts-jest, `tsconfig.test.json`, and the `test` and `typecheck` scripts
93
+ - **testing** — Testing principles and the TDD-Lite workflow skills
94
+ - **project-mgmt** — Beads issue tracking, planning, issue sweeps and stray disposition
95
+ - **product-design** — Feature requirements, design thinking and knowledge backfill skills
94
96
  - **skills** — Skill authoring and maintenance
95
97
 
96
98
  **Demo:**
@@ -26,28 +26,23 @@ await MessageQueueService.publish('batch-ready', [message1, message2]);
26
26
  - **Error recovery**: If `publish()` catches an error (e.g., channel closed), it resets connection state and returns `false` — the next call will reconnect
27
27
  - **Shutdown**: The publish connection is tracked and closed by `close()` alongside the listener connection
28
28
 
29
- ### Publishing to a queue that does not exist
29
+ ### Publishing to a queue that does not exist yet
30
30
 
31
- `publish()` does not declare the queue; only `listen()` does.
32
- A broker confirms a message that it cannot put in any queue and then discards it,
33
- so a publish to a name that no consumer has ever listened on returns `true` and the message is lost.
31
+ `publish()` declares the queue's topology (main, `.retry` and `.failed` queues and their exchanges) before its first publish to it on a connection, exactly as `listen()` does,
32
+ so a message published before the consumer has ever run is kept until the consumer attaches.
34
33
 
35
- Pass `{ mandatory: true }` as the third argument when the publisher cannot be sure the queue exists:
36
- when the name is composed at run time (for example with `targetPrefix`),
37
- or when the publisher can start before the consumer ever has.
34
+ - Each queue is declared once per publish connection; concurrent first publishes share the declaration, and a queue a consumer in the same process already declared with the same arguments is not declared again
35
+ - The declaration runs on a short-lived channel, so a refused one (`PRECONDITION_FAILED`, when the arguments differ from the existing queue's) fails that publish alone: it is logged with the queue's name and `publish()` returns `false`
36
+ - Pass the consumer's `queueArguments` in the third argument whenever the consumer declares any:
38
37
 
39
38
  ```typescript
40
- const queued = await MessageQueueService.publish('batch-ready', message, { targetPrefix, mandatory: true });
39
+ const queued = await MessageQueueService.publish('batch-ready', message, { targetPrefix, queueArguments: BATCH_QUEUE_ARGUMENTS });
41
40
  if (!queued) {
42
41
  // Not queued anywhere: record or report it.
43
42
  }
44
43
  ```
45
44
 
46
- - The message is sent with the AMQP `mandatory` flag, and the broker returns it when no queue has the destination's name
47
- - `publish()` then logs `publish to "<queue>" was returned by the broker: no queue has that name` and returns `false`
48
- - The connection state is **not** reset in this case — the connection is healthy, and the next `publish()` reuses it
49
- - A queue that exists but has no consumer running still takes the message; the option reports a missing queue, not a missing worker
50
- - Without the option, `publish()` is unchanged
45
+ - `{ mandatory: true }` still makes the broker return a message no queue took; after the declaration that means a real fault, such as a queue deleted by hand, and `publish()` returns `false` without resetting the connection
51
46
 
52
47
  ### Why persistent (not per-call)
53
48
 
@@ -0,0 +1,17 @@
1
+ import app from '../src/app';
2
+
3
+ describe('app', () => {
4
+ it('exports a valid Express application', () => {
5
+ expect(app).toBeDefined();
6
+ expect(typeof app.get).toBe('function');
7
+ expect(typeof app.post).toBe('function');
8
+ expect(typeof app.use).toBe('function');
9
+ });
10
+
11
+ it('has JSON and URL-encoded body parsing enabled', () => {
12
+ const stack = (app as any).router?.stack ?? (app as any)._router?.stack ?? [];
13
+ const layerNames = stack.map((layer: any) => layer.name);
14
+ expect(layerNames).toContain('jsonParser');
15
+ expect(layerNames).toContain('urlencodedParser');
16
+ });
17
+ });