@sublang/playbook 4.0.0 → 6.0.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.
Files changed (73) hide show
  1. package/README.md +69 -122
  2. package/docs/assets/playbook-venn.svg +13 -0
  3. package/docs/cli.md +43 -26
  4. package/docs/configuration.md +63 -18
  5. package/docs/embedding.md +24 -16
  6. package/package.json +43 -22
  7. package/reference/sdlc/captain.md +70 -83
  8. package/reference/sdlc/captain.playbook/captain.fsm.d.ts +127 -142
  9. package/reference/sdlc/captain.playbook/captain.fsm.js +349 -470
  10. package/reference/sdlc/captain.playbook/captain.fsm.ts +535 -598
  11. package/reference/sdlc/captain.playbook/captain.gears.md +37 -41
  12. package/reference/sdlc/captain.playbook/captain.playbook.d.ts +90 -15
  13. package/reference/sdlc/captain.playbook/captain.playbook.js +466 -976
  14. package/reference/sdlc/captain.playbook/captain.playbook.ts +698 -1001
  15. package/reference/sdlc/code.md +55 -97
  16. package/reference/sdlc/code.playbook/code.fsm.d.ts +229 -94
  17. package/reference/sdlc/code.playbook/code.fsm.introspect.d.ts +26 -44
  18. package/reference/sdlc/code.playbook/code.fsm.introspect.js +61 -66
  19. package/reference/sdlc/code.playbook/code.fsm.introspect.ts +100 -149
  20. package/reference/sdlc/code.playbook/code.fsm.js +587 -1347
  21. package/reference/sdlc/code.playbook/code.fsm.ts +809 -1650
  22. package/reference/sdlc/code.playbook/code.gears.md +51 -263
  23. package/reference/sdlc/code.playbook/code.playbook.d.ts +8 -47
  24. package/reference/sdlc/code.playbook/code.playbook.js +69 -639
  25. package/reference/sdlc/code.playbook/code.playbook.ts +90 -850
  26. package/reference/sdlc/code.playbook/code.registry.d.ts +9 -25
  27. package/reference/sdlc/code.playbook/code.registry.js +20 -78
  28. package/reference/sdlc/code.playbook/code.registry.ts +58 -122
  29. package/reference/sdlc/code.playbook/playbook-captain.d.ts +2 -0
  30. package/reference/sdlc/code.playbook/playbook-captain.js +1877 -251
  31. package/reference/sdlc/code.playbook/playbook-captain.ts +2385 -352
  32. package/reference/sdlc/code.playbook/playbook.config.template.yaml +33 -22
  33. package/reference/sdlc/decide.md +54 -0
  34. package/reference/sdlc/decide.playbook/decide.fsm.d.ts +261 -0
  35. package/reference/sdlc/decide.playbook/decide.fsm.js +894 -0
  36. package/reference/sdlc/decide.playbook/decide.fsm.ts +1152 -0
  37. package/reference/sdlc/decide.playbook/decide.gears.md +88 -0
  38. package/reference/sdlc/decide.playbook/decide.playbook.d.ts +67 -0
  39. package/reference/sdlc/{discuss.playbook/discuss.playbook.js → decide.playbook/decide.playbook.js} +511 -370
  40. package/reference/sdlc/{discuss.playbook/discuss.playbook.ts → decide.playbook/decide.playbook.ts} +616 -451
  41. package/reference/sdlc/decide.playbook/decide.registry.d.ts +41 -0
  42. package/reference/sdlc/decide.playbook/decide.registry.js +60 -0
  43. package/reference/sdlc/decide.playbook/decide.registry.ts +125 -0
  44. package/reference/sdlc/review.md +81 -0
  45. package/reference/sdlc/review.playbook/review.fsm.d.ts +183 -0
  46. package/reference/sdlc/review.playbook/review.fsm.js +524 -0
  47. package/reference/sdlc/review.playbook/review.fsm.ts +652 -0
  48. package/reference/sdlc/review.playbook/review.gears.md +112 -0
  49. package/reference/sdlc/review.playbook/review.playbook.d.ts +12 -0
  50. package/reference/sdlc/review.playbook/review.playbook.js +112 -0
  51. package/reference/sdlc/review.playbook/review.playbook.ts +201 -0
  52. package/reference/sdlc/review.playbook/review.registry.d.ts +43 -0
  53. package/reference/sdlc/review.playbook/review.registry.js +73 -0
  54. package/reference/sdlc/review.playbook/review.registry.ts +138 -0
  55. package/slc/gears2fsm.md +67 -6
  56. package/slc/link.md +339 -25
  57. package/slc/text2gears.md +22 -2
  58. package/src/runtime.d.ts +36 -1
  59. package/src/runtime.ts +59 -0
  60. package/src/xstate-playbook-runtime.d.ts +96 -7
  61. package/src/xstate-playbook-runtime.js +1018 -49
  62. package/src/xstate-playbook-runtime.ts +1283 -59
  63. package/src/xstate-runtime.js +25 -0
  64. package/src/xstate-runtime.ts +51 -0
  65. package/reference/sdlc/discuss.md +0 -93
  66. package/reference/sdlc/discuss.playbook/discuss.fsm.d.ts +0 -396
  67. package/reference/sdlc/discuss.playbook/discuss.fsm.js +0 -2067
  68. package/reference/sdlc/discuss.playbook/discuss.fsm.ts +0 -2465
  69. package/reference/sdlc/discuss.playbook/discuss.gears.md +0 -258
  70. package/reference/sdlc/discuss.playbook/discuss.playbook.d.ts +0 -113
  71. package/reference/sdlc/discuss.playbook/discuss.registry.d.ts +0 -58
  72. package/reference/sdlc/discuss.playbook/discuss.registry.js +0 -97
  73. package/reference/sdlc/discuss.playbook/discuss.registry.ts +0 -153
@@ -1,153 +0,0 @@
1
- // SPDX-License-Identifier: Apache-2.0
2
- // SPDX-FileCopyrightText: 2026 SubLang International <https://sublang.ai>
3
-
4
- // Registry entry for the DISCUSS playbook — the host-side adapter the generic
5
- // `playbook` launcher loads via a config block's `from:` specifier. The three
6
- // core artifacts beside this file (discuss.gears.md, discuss.fsm.ts,
7
- // discuss.playbook.ts) were compiled by `slc playbook reference/sdlc/discuss.md`
8
- // through slc's pinned compiled meta-phase playbooks and verified by slc's
9
- // generated compilation-correctness tests; this entry is hand-written host
10
- // infrastructure, out of slc's compile scope (slc DR-009).
11
-
12
- import type { PlaybookRuntime } from '@sublang/playbook/runtime';
13
-
14
- import createPlaybookRuntime from './discuss.playbook.js';
15
- import type { PlaybookRuntimeOptions } from './discuss.playbook.js';
16
-
17
- export interface RegistryPlayer {
18
- id: string;
19
- adapter?: string;
20
- model?: string;
21
- }
22
-
23
- export interface CreateDiscussRuntimeOptions {
24
- captainOptions: unknown;
25
- players: readonly RegistryPlayer[];
26
- }
27
-
28
- export interface DiscussOptions {
29
- /** Which alias alternative runs `Committer` commits; defaults to `host`. */
30
- committer?: 'host' | 'participant';
31
- }
32
-
33
- const DISCUSS_OPTION_KEYS = new Set(['committer']);
34
- const COMMITTER_PLAYER_IDS = new Set(['host', 'participant']);
35
-
36
- export function validateDiscussOptions(optionSlice: unknown): DiscussOptions {
37
- if (optionSlice === undefined) return {};
38
- if (
39
- typeof optionSlice !== 'object' ||
40
- optionSlice === null ||
41
- Array.isArray(optionSlice)
42
- ) {
43
- throw new Error(
44
- 'captain.options.playbooks.discuss.options must be an object',
45
- );
46
- }
47
- const slice = optionSlice as Record<string, unknown>;
48
- for (const key of Object.keys(slice)) {
49
- if (!DISCUSS_OPTION_KEYS.has(key)) {
50
- throw new Error(
51
- `Unknown config field captain.options.playbooks.discuss.options.${key}`,
52
- );
53
- }
54
- }
55
- const options: DiscussOptions = {};
56
- const committer = slice.committer;
57
- if (committer !== undefined) {
58
- if (typeof committer !== 'string' || !COMMITTER_PLAYER_IDS.has(committer)) {
59
- throw new Error(
60
- "captain.options.playbooks.discuss.options.committer must be " +
61
- "'host' or 'participant'",
62
- );
63
- }
64
- options.committer = committer as 'host' | 'participant';
65
- }
66
- return options;
67
- }
68
-
69
- function playerIdentity(
70
- players: readonly RegistryPlayer[],
71
- id: string,
72
- ): string | undefined {
73
- const entry = players.find((p) => p.id === id);
74
- return entry?.model ?? entry?.adapter;
75
- }
76
-
77
- export function createDiscussRuntimeOptions({
78
- captainOptions,
79
- players,
80
- }: CreateDiscussRuntimeOptions): PlaybookRuntimeOptions {
81
- const discussOptions = validateDiscussOptions(captainOptions);
82
- const options: PlaybookRuntimeOptions = {
83
- host: playerIdentity(players, 'host'),
84
- participant: playerIdentity(players, 'participant'),
85
- };
86
- if (discussOptions.committer !== undefined) {
87
- options.committer = discussOptions.committer;
88
- }
89
- return options;
90
- }
91
-
92
- // CAPTAIN-19/20: the DISCUSS turn-summary policy — counted round states,
93
- // the payload-carrying guards whose content Boss would otherwise relay
94
- // between the players by hand, and the saved-counts wording — so the shell
95
- // reports how many interruptions a run saved.
96
- const discussStateCountLabels = {
97
- initialProposalRound: 'proposal round',
98
- reconciliationRound: 'proposal round',
99
- reviewSpecInitialCommit: 'review round',
100
- reviewSpecHostChanges: 'review round',
101
- reviewDrInitialCommit: 'review round',
102
- reviewDrHostChanges: 'review round',
103
- reviewMixedInitialCommit: 'review round',
104
- reviewMixedHostChanges: 'review round',
105
- } as const;
106
-
107
- const discussCopyPasteGuardNames = [
108
- 'proposalMade',
109
- 'findingsRaised',
110
- 'rebuttalsRaised',
111
- 'rebuttalsAddressed',
112
- 'changesMade',
113
- ] as const;
114
-
115
- function countNoun(count: number, singular: string, plural = `${singular}s`): string {
116
- return `${count} ${count === 1 ? singular : plural}`;
117
- }
118
-
119
- export function discussSavedCountsLine(
120
- counts: { interruptions: number; copyPastes: number },
121
- rounds: number,
122
- ): string {
123
- return [
124
- 'Saved you',
125
- countNoun(counts.interruptions, 'interruption'),
126
- 'and',
127
- countNoun(counts.copyPastes, 'copy-paste'),
128
- 'across',
129
- countNoun(rounds, 'round'),
130
- 'of proposals/reviews.',
131
- ].join(' ');
132
- }
133
-
134
- export const discussSummaryPolicy = {
135
- stateCountLabels: discussStateCountLabels,
136
- copyPasteGuardNames: discussCopyPasteGuardNames,
137
- savedCountsLine: discussSavedCountsLine,
138
- };
139
-
140
- export const discussPlaybookRegistryEntry = {
141
- id: 'discuss',
142
- command: 'discuss',
143
- intent:
144
- 'design discussion: two agents converge on spec items or decision records',
145
- requiredRoleIds: ['host', 'participant'],
146
- summaryPolicy: discussSummaryPolicy,
147
- validateOptions: validateDiscussOptions,
148
- createRuntime(options: CreateDiscussRuntimeOptions): PlaybookRuntime {
149
- return createPlaybookRuntime(createDiscussRuntimeOptions(options));
150
- },
151
- };
152
-
153
- export default discussPlaybookRegistryEntry;