@bendyline/gilde 0.1.4 → 0.1.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 (141) hide show
  1. package/README.md +1 -0
  2. package/data/chat-models/de/deepseek-v4-flash-284b-q2/manifest.json +4 -3
  3. package/data/chat-models/de/deepseek-v4-flash-284b-q4/manifest.json +4 -3
  4. package/data/chat-models/ge/gemma4-12b-q4/manifest.json +20 -11
  5. package/data/chat-models/ge/gemma4-12b-q4/versions/1.1.0/manifest.json +2 -8
  6. package/data/chat-models/ge/gemma4-12b-q4/versions/1.1.2/manifest.json +78 -0
  7. package/data/chat-models/ge/gemma4-12b-q8/manifest.json +23 -14
  8. package/data/chat-models/ge/gemma4-12b-q8/versions/1.0.0/manifest.json +2 -8
  9. package/data/chat-models/ge/gemma4-12b-q8/versions/1.0.2/manifest.json +78 -0
  10. package/data/chat-models/ge/gemma4-26b-q4/manifest.json +55 -46
  11. package/data/chat-models/ge/gemma4-26b-q4/versions/1.2.0/manifest.json +2 -8
  12. package/data/chat-models/ge/gemma4-26b-q4/versions/1.2.1/manifest.json +81 -0
  13. package/data/chat-models/ge/gemma4-31b-q4/manifest.json +36 -28
  14. package/data/chat-models/ge/gemma4-31b-q4/versions/1.2.0/manifest.json +2 -8
  15. package/data/chat-models/ge/gemma4-31b-q4/versions/1.2.1/manifest.json +87 -0
  16. package/data/chat-models/ge/gemma4-e2b-q8/manifest.json +76 -69
  17. package/data/chat-models/ge/gemma4-e2b-q8/versions/1.1.0/manifest.json +2 -8
  18. package/data/chat-models/ge/gemma4-e2b-q8/versions/1.1.2/manifest.json +71 -0
  19. package/data/chat-models/ge/gemma4-e4b-q8/manifest.json +71 -78
  20. package/data/chat-models/ge/gemma4-e4b-q8/versions/1.1.0/manifest.json +3 -9
  21. package/data/chat-models/ge/gemma4-e4b-q8/versions/1.1.2/manifest.json +71 -0
  22. package/data/chat-models/index.json +1 -1
  23. package/data/chat-models/la/laguna-s-2.1-118b-q4/manifest.json +17 -17
  24. package/data/chat-models/la/laguna-s-2.1-118b-q4/versions/1.0.1/manifest.json +124 -0
  25. package/data/chat-models/la/laguna-s-2.1-118b-q8/manifest.json +7 -7
  26. package/data/chat-models/la/laguna-s-2.1-118b-q8/versions/1.0.1/manifest.json +174 -0
  27. package/data/chat-models/mi/mistral-medium-3.5-128b-q4/manifest.json +4 -17
  28. package/data/chat-models/mi/mistral-medium-3.5-128b-q4/versions/1.0.0/manifest.json +2 -12
  29. package/data/chat-models/ne/nemotron3-nano-30b-q4/manifest.json +5 -0
  30. package/data/chat-models/qw/qwen3.5-122b-a10b-q4/manifest.json +27 -19
  31. package/data/chat-models/qw/qwen3.5-122b-a10b-q4/versions/1.0.1/manifest.json +164 -0
  32. package/data/chat-models/qw/qwen3.5-2b-q4/manifest.json +79 -77
  33. package/data/chat-models/qw/qwen3.5-2b-q4/versions/1.1.0/manifest.json +2 -8
  34. package/data/chat-models/qw/qwen3.5-2b-q4/versions/1.1.2/manifest.json +76 -0
  35. package/data/chat-models/qw/qwen3.5-4b-q4/manifest.json +79 -77
  36. package/data/chat-models/qw/qwen3.5-4b-q4/versions/1.1.0/manifest.json +2 -8
  37. package/data/chat-models/qw/qwen3.5-4b-q4/versions/1.1.2/manifest.json +76 -0
  38. package/data/chat-models/qw/qwen3.5-9b-q4/manifest.json +87 -85
  39. package/data/chat-models/qw/qwen3.5-9b-q4/versions/1.1.0/manifest.json +2 -8
  40. package/data/chat-models/qw/qwen3.5-9b-q4/versions/1.1.2/manifest.json +81 -0
  41. package/data/chat-models/qw/qwen3.6-27b-q4/manifest.json +99 -97
  42. package/data/chat-models/qw/qwen3.6-27b-q4/versions/1.1.0/manifest.json +2 -8
  43. package/data/chat-models/qw/qwen3.6-27b-q4/versions/1.1.4/manifest.json +91 -0
  44. package/data/chat-models/qw/qwen3.6-27b-q8/manifest.json +16 -12
  45. package/data/chat-models/qw/qwen3.6-27b-q8/versions/1.0.0/manifest.json +2 -8
  46. package/data/chat-models/qw/qwen3.6-27b-q8/versions/1.0.2/manifest.json +103 -0
  47. package/data/chat-models/qw/qwen3.6-35b-a3b-q4/manifest.json +18 -14
  48. package/data/chat-models/qw/qwen3.6-35b-a3b-q4/versions/1.0.0/manifest.json +2 -8
  49. package/data/chat-models/qw/qwen3.6-35b-a3b-q4/versions/1.0.1/manifest.json +93 -0
  50. package/data/chat-models/qw/qwen3.6-35b-a3b-q8/manifest.json +16 -12
  51. package/data/chat-models/qw/qwen3.6-35b-a3b-q8/versions/1.0.0/manifest.json +2 -8
  52. package/data/chat-models/qw/qwen3.6-35b-a3b-q8/versions/1.0.1/manifest.json +113 -0
  53. package/data/craftbook-templates/bu/bug-fix-tdd/versions/1.0.1/test.json +0 -5
  54. package/data/craftbook-templates/bu/build-loop/versions/1.1.0/craftbook.json +65 -0
  55. package/data/craftbook-templates/bu/build-loop/versions/1.1.0/test.json +121 -0
  56. package/data/craftbook-templates/ch/character-sheet/versions/1.0.0/test.json +1 -2
  57. package/data/craftbook-templates/ch/character-turnaround/versions/1.0.0/test.json +1 -2
  58. package/data/craftbook-templates/cl/cli-tool/versions/1.1.0/craftbook.json +139 -0
  59. package/data/craftbook-templates/cl/cli-tool/versions/1.1.0/test.json +128 -0
  60. package/data/craftbook-templates/cr/crossword-forge/manifest.json +1 -2
  61. package/data/craftbook-templates/de/deep-security-review/versions/1.1.0/craftbook.json +201 -0
  62. package/data/craftbook-templates/de/deep-security-review/versions/1.1.0/test.json +157 -0
  63. package/data/craftbook-templates/do/dockerize-app/versions/1.0.0/test.json +0 -5
  64. package/data/craftbook-templates/fr/freeze-scope/manifest.json +1 -2
  65. package/data/craftbook-templates/fr/freeze-scope/versions/{1.0.1 → 1.1.0}/craftbook.json +5 -17
  66. package/data/craftbook-templates/gr/graphql-api/versions/1.0.1/test.json +0 -5
  67. package/data/craftbook-templates/gr/grpc-service/versions/1.0.0/test.json +0 -5
  68. package/data/craftbook-templates/ho/hotfix-flow/versions/1.0.0/test.json +0 -5
  69. package/data/craftbook-templates/in/investigate/versions/1.1.0/craftbook.json +81 -0
  70. package/data/craftbook-templates/in/investigate/versions/1.1.0/test.json +122 -0
  71. package/data/craftbook-templates/in/invoice-run/manifest.json +1 -2
  72. package/data/craftbook-templates/in/invoice-run/versions/{1.0.1 → 1.1.0}/craftbook.json +4 -4
  73. package/data/craftbook-templates/index.json +1 -1
  74. package/data/craftbook-templates/li/library-package/versions/1.0.0/test.json +0 -5
  75. package/data/craftbook-templates/me/memory-prompt-session/manifest.json +1 -2
  76. package/data/craftbook-templates/me/message-queue-consumer/versions/1.0.0/test.json +0 -5
  77. package/data/craftbook-templates/of/office-hours/versions/1.1.0/craftbook.json +48 -0
  78. package/data/craftbook-templates/of/office-hours/versions/1.1.0/test.json +118 -0
  79. package/data/craftbook-templates/pa/page-spread/manifest.json +1 -2
  80. package/data/craftbook-templates/pa/parser-grammar/versions/1.0.0/test.json +0 -5
  81. package/data/craftbook-templates/pe/perf-optimization/versions/1.0.0/test.json +0 -5
  82. package/data/craftbook-templates/pl/plan/manifest.json +1 -2
  83. package/data/craftbook-templates/po/powerpoint-deck/versions/1.1.0/craftbook.json +128 -0
  84. package/data/craftbook-templates/{ro/root-cause-investigation/versions/1.0.1 → po/powerpoint-deck/versions/1.1.0}/test.json +6 -6
  85. package/data/craftbook-templates/pu/pull-request-review/versions/1.1.0/craftbook.json +118 -0
  86. package/data/craftbook-templates/pu/pull-request-review/versions/1.1.0/test.json +160 -0
  87. package/data/craftbook-templates/re/refactor-module/versions/1.0.1/test.json +0 -5
  88. package/data/craftbook-templates/re/regex-builder/versions/1.0.0/test.json +0 -5
  89. package/data/craftbook-templates/re/research-to-document/versions/1.1.0/craftbook.json +158 -0
  90. package/data/craftbook-templates/re/research-to-document/versions/1.1.0/test.json +97 -0
  91. package/data/craftbook-templates/ro/root-cause-investigation/manifest.json +1 -2
  92. package/data/craftbook-templates/sd/sdk-wrapper/versions/1.0.1/test.json +0 -5
  93. package/data/craftbook-templates/se/security-architecture-review/versions/1.1.0/craftbook.json +28 -0
  94. package/data/craftbook-templates/{te/technical-documentation/versions/1.0.1 → se/security-architecture-review/versions/1.1.0}/test.json +7 -7
  95. package/data/craftbook-templates/sh/ship/versions/1.1.0/craftbook.json +137 -0
  96. package/data/craftbook-templates/sh/ship/versions/1.1.0/test.json +225 -0
  97. package/data/craftbook-templates/st/state-machine/versions/1.0.0/test.json +0 -5
  98. package/data/craftbook-templates/te/technical-documentation/manifest.json +1 -2
  99. package/data/craftbook-templates/te/test-suite-backfill/versions/1.0.0/test.json +0 -5
  100. package/data/craftbook-templates/ti/tileset-batch/versions/1.0.0/test.json +1 -2
  101. package/data/craftbook-templates/ty/type-safety-pass/versions/1.0.0/test.json +0 -5
  102. package/data/craftbook-templates/ve/version-bump/versions/1.0.0/test.json +0 -5
  103. package/data/gezel-templates/ch/chess-player/manifest.json +20 -0
  104. package/data/gezel-templates/ch/chess-player/versions/1.0.0/about.md +21 -0
  105. package/data/gezel-templates/ch/chess-player/versions/1.0.0/manifest.json +10 -0
  106. package/data/gezel-templates/go/go-player/manifest.json +22 -0
  107. package/data/gezel-templates/go/go-player/versions/1.0.0/about.md +22 -0
  108. package/data/gezel-templates/go/go-player/versions/1.0.0/manifest.json +10 -0
  109. package/data/gezel-templates/index.json +1 -1
  110. package/data/project-types/ch/chess/manifest.json +20 -0
  111. package/data/project-types/ch/chess/versions/1.0.0/about.md +9 -0
  112. package/data/project-types/ch/chess/versions/1.0.0/game.json +127 -0
  113. package/data/project-types/ch/chess/versions/1.0.0/manifest.json +180 -0
  114. package/data/project-types/ch/chess/versions/1.0.0/mission.md +8 -0
  115. package/data/project-types/ch/chess/versions/1.0.0/pages/board/index.html +574 -0
  116. package/data/project-types/go/go/manifest.json +22 -0
  117. package/data/project-types/go/go/versions/1.0.0/about.md +9 -0
  118. package/data/project-types/go/go/versions/1.0.0/game.json +103 -0
  119. package/data/project-types/go/go/versions/1.0.0/manifest.json +166 -0
  120. package/data/project-types/go/go/versions/1.0.0/mission.md +8 -0
  121. package/data/project-types/go/go/versions/1.0.0/pages/board/index.html +637 -0
  122. package/data/project-types/index.json +1 -1
  123. package/package.json +2 -1
  124. package/schemas/chat-model-version.schema.json +22 -0
  125. package/schemas/craftbook-doc.schema.json +12 -0
  126. package/schemas/craftbook-template-version.schema.json +12 -0
  127. package/schemas/craftbook-test.schema.json +12 -0
  128. package/data/chat-models/gl/glm-5.2-754b-q2/manifest.json +0 -66
  129. package/data/chat-models/gl/glm-5.2-754b-q2/versions/1.0.0/manifest.json +0 -18
  130. package/data/craftbook-templates/cr/crossword-forge/versions/1.0.1/craftbook.json +0 -147
  131. package/data/craftbook-templates/cr/crossword-forge/versions/1.0.1/test.json +0 -135
  132. package/data/craftbook-templates/me/memory-prompt-session/versions/1.0.1/craftbook.json +0 -116
  133. package/data/craftbook-templates/me/memory-prompt-session/versions/1.0.1/test.json +0 -112
  134. package/data/craftbook-templates/pa/page-spread/versions/1.0.1/craftbook.json +0 -94
  135. package/data/craftbook-templates/pa/page-spread/versions/1.0.1/test.json +0 -133
  136. package/data/craftbook-templates/pl/plan/versions/1.0.1/craftbook.json +0 -104
  137. package/data/craftbook-templates/pl/plan/versions/1.0.1/test.json +0 -91
  138. package/data/craftbook-templates/ro/root-cause-investigation/versions/1.0.1/craftbook.json +0 -126
  139. package/data/craftbook-templates/te/technical-documentation/versions/1.0.1/craftbook.json +0 -152
  140. /package/data/craftbook-templates/fr/freeze-scope/versions/{1.0.1 → 1.1.0}/test.json +0 -0
  141. /package/data/craftbook-templates/in/invoice-run/versions/{1.0.1 → 1.1.0}/test.json +0 -0
@@ -0,0 +1,574 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <title>Chess</title>
7
+ <style>
8
+ :root {
9
+ color-scheme: light dark;
10
+ --bg: #faf7f2;
11
+ --card: #fff;
12
+ --ink: #2b2620;
13
+ --muted: #7a7166;
14
+ --accent: #9a5928;
15
+ --track: #e8dfd2;
16
+ --sq-light: #efe4d1;
17
+ --sq-dark: #9a7455;
18
+ --sq-hint: #557a5b;
19
+ --frame-a: #8d694d;
20
+ --frame-b: #4d3424;
21
+ --frame-edge: #342116;
22
+ --white-piece: #fffaf0;
23
+ --black-piece: #2b2620;
24
+ --last-move: rgba(241, 184, 84, 0.42);
25
+ }
26
+ @media (prefers-color-scheme: dark) {
27
+ :root {
28
+ --bg: #1c1a17;
29
+ --card: #262320;
30
+ --ink: #efe9e0;
31
+ --muted: #a59a8c;
32
+ --accent: #e0894a;
33
+ --track: #3a352f;
34
+ --sq-light: #b8a58b;
35
+ --sq-dark: #674a35;
36
+ --sq-hint: #6f9b70;
37
+ --frame-a: #74543d;
38
+ --frame-b: #34241a;
39
+ --frame-edge: #1b120d;
40
+ --white-piece: #fff7e5;
41
+ --black-piece: #17130f;
42
+ --last-move: rgba(236, 159, 85, 0.38);
43
+ }
44
+ }
45
+ * { box-sizing: border-box; }
46
+ body {
47
+ margin: 0;
48
+ padding: 1.25rem;
49
+ background: var(--bg);
50
+ color: var(--ink);
51
+ font: 15px/1.5 system-ui, -apple-system, 'Segoe UI', sans-serif;
52
+ }
53
+ main { max-width: 760px; margin: 0 auto; }
54
+ header {
55
+ display: flex;
56
+ align-items: baseline;
57
+ justify-content: space-between;
58
+ gap: 0.75rem;
59
+ flex-wrap: wrap;
60
+ }
61
+ h1 {
62
+ margin: 0;
63
+ font-family: Georgia, 'PT Serif', 'Times New Roman', serif;
64
+ font-size: 1.35rem;
65
+ }
66
+ button { font: inherit; }
67
+ .newgame,
68
+ .passive-button {
69
+ border: 1px solid var(--track);
70
+ border-radius: 6px;
71
+ padding: 0.32rem 0.7rem;
72
+ background: var(--card);
73
+ color: var(--ink);
74
+ cursor: pointer;
75
+ }
76
+ .newgame:hover,
77
+ .passive-button:hover { border-color: var(--accent); }
78
+ .status { min-height: 1.5em; margin: 0.15rem 0 0.9rem; color: var(--muted); }
79
+ .status.thinking { color: var(--accent); }
80
+ .banner {
81
+ display: none;
82
+ margin-bottom: 0.75rem;
83
+ padding: 0.45rem 0.7rem;
84
+ border: 1px solid var(--accent);
85
+ border-radius: 6px;
86
+ font-size: 0.85rem;
87
+ }
88
+ .banner.show { display: block; }
89
+ .table { display: grid; grid-template-columns: minmax(0, 1fr) 220px; gap: 0.9rem; }
90
+ .boardwrap {
91
+ padding: 0.85rem;
92
+ border: 1px solid var(--frame-edge);
93
+ border-radius: 14px;
94
+ background: linear-gradient(145deg, var(--frame-a), var(--frame-b));
95
+ box-shadow:
96
+ inset 0 1px 0 rgba(255, 255, 255, 0.2),
97
+ inset 0 -4px 8px rgba(0, 0, 0, 0.25),
98
+ 0 10px 24px rgba(31, 21, 15, 0.22);
99
+ }
100
+ .board {
101
+ display: grid;
102
+ grid-template-columns: repeat(8, 1fr);
103
+ aspect-ratio: 1;
104
+ overflow: hidden;
105
+ border: 1px solid var(--frame-edge);
106
+ border-radius: 8px;
107
+ box-shadow: 0 5px 12px rgba(0, 0, 0, 0.3);
108
+ user-select: none;
109
+ }
110
+ .cell {
111
+ position: relative;
112
+ display: grid;
113
+ min-width: 0;
114
+ min-height: 0;
115
+ place-items: center;
116
+ padding: 0;
117
+ border: 0;
118
+ color: inherit;
119
+ }
120
+ .cell.light { background: var(--sq-light); }
121
+ .cell.dark { background: var(--sq-dark); }
122
+ .cell.selectable { cursor: pointer; }
123
+ .cell.selected {
124
+ outline: 3px solid var(--accent);
125
+ outline-offset: -3px;
126
+ z-index: 2;
127
+ }
128
+ .cell.hint { cursor: pointer; }
129
+ .cell.hint::after {
130
+ position: absolute;
131
+ z-index: 2;
132
+ width: 24%;
133
+ height: 24%;
134
+ border-radius: 50%;
135
+ background: var(--sq-hint);
136
+ box-shadow: 0 0 0 4px rgba(255, 255, 255, 0.18);
137
+ content: '';
138
+ }
139
+ .cell.hint.capture::after {
140
+ width: 72%;
141
+ height: 72%;
142
+ border: 5px solid var(--sq-hint);
143
+ background: transparent;
144
+ box-shadow: none;
145
+ }
146
+ .cell.last-from { box-shadow: inset 0 0 0 3px var(--last-move); }
147
+ .cell.last-to { box-shadow: inset 0 0 0 999px var(--last-move); }
148
+ .piece {
149
+ position: relative;
150
+ z-index: 1;
151
+ font-family: Georgia, 'Times New Roman', serif;
152
+ font-size: clamp(1.5rem, 7vw, 3.35rem);
153
+ line-height: 1;
154
+ filter: drop-shadow(0 2px 1px rgba(0, 0, 0, 0.35));
155
+ transition: transform 140ms ease-out;
156
+ }
157
+ .piece.white {
158
+ color: var(--white-piece);
159
+ -webkit-text-stroke: 1px rgba(43, 38, 32, 0.72);
160
+ }
161
+ .piece.black { color: var(--black-piece); }
162
+ .cell.selectable:hover .piece,
163
+ .cell.selected .piece { transform: translateY(-2px) scale(1.04); }
164
+ .coord {
165
+ position: absolute;
166
+ z-index: 3;
167
+ color: rgba(43, 38, 32, 0.55);
168
+ font-size: clamp(0.45rem, 1.3vw, 0.65rem);
169
+ font-weight: 700;
170
+ line-height: 1;
171
+ pointer-events: none;
172
+ }
173
+ .coord.rank { top: 5%; left: 6%; }
174
+ .coord.file { right: 6%; bottom: 5%; }
175
+ .dark .coord { color: rgba(255, 250, 242, 0.58); }
176
+ .aside { display: flex; flex-direction: column; gap: 0.6rem; min-width: 0; }
177
+ .panel {
178
+ padding: 0.7rem 0.85rem;
179
+ border: 1px solid var(--track);
180
+ border-radius: 10px;
181
+ background: var(--card);
182
+ font-size: 0.85rem;
183
+ }
184
+ .panel h2 {
185
+ margin: 0 0 0.35rem;
186
+ color: var(--muted);
187
+ font-size: 0.72rem;
188
+ letter-spacing: 0.05em;
189
+ text-transform: uppercase;
190
+ }
191
+ .move-thought { font-style: italic; }
192
+ .move-thought .who {
193
+ display: block;
194
+ margin-bottom: 0.15rem;
195
+ color: var(--muted);
196
+ font-size: 0.78rem;
197
+ font-style: normal;
198
+ }
199
+ .log { max-height: 230px; margin: 0; padding-left: 1.2rem; overflow-y: auto; }
200
+ .log li { margin: 0.12rem 0; color: var(--muted); }
201
+ .log li.latest { color: var(--ink); }
202
+ dialog {
203
+ width: min(410px, calc(100vw - 2rem));
204
+ padding: 0;
205
+ border: 1px solid var(--track);
206
+ border-radius: 10px;
207
+ background: var(--card);
208
+ color: var(--ink);
209
+ box-shadow: 0 18px 55px rgba(0, 0, 0, 0.35);
210
+ }
211
+ dialog::backdrop { background: rgba(20, 17, 14, 0.62); }
212
+ .dialog-content { padding: 1rem; }
213
+ .dialog-content h2 {
214
+ margin: 0 0 0.2rem;
215
+ font-family: Georgia, 'PT Serif', serif;
216
+ font-size: 1.1rem;
217
+ }
218
+ .dialog-content p { margin: 0 0 0.85rem; color: var(--muted); font-size: 0.85rem; }
219
+ .piece-tray {
220
+ display: grid;
221
+ grid-template-columns: repeat(4, 1fr);
222
+ gap: 0.35rem;
223
+ padding: 0.35rem;
224
+ border: 1px solid var(--track);
225
+ border-radius: 10px;
226
+ background: var(--track);
227
+ }
228
+ .promotion-key {
229
+ min-height: 3.2rem;
230
+ border: 1px solid transparent;
231
+ border-radius: 6px;
232
+ background: var(--card);
233
+ color: var(--ink);
234
+ cursor: pointer;
235
+ font-family: Georgia, 'Times New Roman', serif;
236
+ font-size: 1.8rem;
237
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.14);
238
+ }
239
+ .promotion-key:hover { border-color: var(--accent); }
240
+ .dialog-actions { display: flex; justify-content: flex-end; margin-top: 0.8rem; }
241
+ @media (max-width: 640px) {
242
+ .table { grid-template-columns: 1fr; }
243
+ .aside { display: grid; grid-template-columns: 1fr 1fr; }
244
+ }
245
+ @media (prefers-reduced-motion: reduce) {
246
+ .piece { transition: none; }
247
+ }
248
+ </style>
249
+ </head>
250
+ <body>
251
+ <main>
252
+ <div class="banner" id="banner"></div>
253
+ <header>
254
+ <h1>Chess</h1>
255
+ <button type="button" class="newgame" id="newgame">New game</button>
256
+ </header>
257
+ <p class="status" id="status">Setting up the board…</p>
258
+ <div class="table">
259
+ <div class="boardwrap"><div class="board" id="board" aria-label="Chess board"></div></div>
260
+ <div class="aside">
261
+ <div class="panel move-thought" id="move-thought-panel" hidden>
262
+ <span class="who">Schaakspeler says</span>
263
+ <span id="move-thought"></span>
264
+ </div>
265
+ <div class="panel">
266
+ <h2>Moves</h2>
267
+ <ol class="log" id="log"><li>No moves yet — white opens.</li></ol>
268
+ </div>
269
+ </div>
270
+ </div>
271
+ <dialog id="promotion-dialog" aria-labelledby="promotion-title">
272
+ <div class="dialog-content">
273
+ <h2 id="promotion-title">Promote your pawn</h2>
274
+ <p>Choose the piece that arrives on the back rank.</p>
275
+ <div class="piece-tray" id="promotion-choices"></div>
276
+ <div class="dialog-actions">
277
+ <button type="button" class="passive-button" id="cancel-promotion">Cancel</button>
278
+ </div>
279
+ </div>
280
+ </dialog>
281
+ </main>
282
+ <script>
283
+ (function () {
284
+ 'use strict';
285
+
286
+ var gezelPage = (function () {
287
+ var seq = 0;
288
+ var pending = {};
289
+ window.addEventListener('message', function (event) {
290
+ var data = event.data;
291
+ if (!data || data.__gezelPageResult !== true || typeof data.id !== 'string') return;
292
+ var entry = pending[data.id];
293
+ if (!entry) return;
294
+ delete pending[data.id];
295
+ clearTimeout(entry.timer);
296
+ if (data.ok) entry.resolve(data);
297
+ else entry.reject(new Error(data.error || 'invoke failed'));
298
+ });
299
+ return {
300
+ embedded: function () { return window.parent !== window; },
301
+ invoke: function (tool, input) {
302
+ return new Promise(function (resolve, reject) {
303
+ if (window.parent === window) return reject(new Error('not embedded in Gezel'));
304
+ seq += 1;
305
+ var id = 'pi-' + Date.now() + '-' + seq;
306
+ pending[id] = {
307
+ resolve: resolve,
308
+ reject: reject,
309
+ timer: setTimeout(function () {
310
+ delete pending[id];
311
+ reject(new Error('invoke timed out'));
312
+ }, 45000),
313
+ };
314
+ window.parent.postMessage(
315
+ { __gezelPageInvoke: true, id: id, tool: tool, input: input || {} },
316
+ '*',
317
+ );
318
+ });
319
+ },
320
+ refresh: function () {
321
+ if (window.parent !== window) window.parent.postMessage({ __gezelPageRefresh: true }, '*');
322
+ },
323
+ };
324
+ })();
325
+
326
+ var parts = location.pathname.split('/').filter(Boolean);
327
+ var typeIndex = parts.indexOf('type');
328
+ var capability = typeIndex > 0 ? parts[typeIndex - 1] : null;
329
+ var projectId = typeIndex >= 0 ? parts[typeIndex + 1] : null;
330
+ var FILES = 'abcdefgh';
331
+ var PIECES = {
332
+ K: '♔', Q: '♕', R: '♖', B: '♗', N: '♘', P: '♙',
333
+ k: '♚', q: '♛', r: '♜', b: '♝', n: '♞', p: '♟',
334
+ };
335
+ var PROMOTION_PIECES = { q: '♕', r: '♖', b: '♗', n: '♘' };
336
+ var state = null;
337
+ var selected = null;
338
+ var busy = false;
339
+ var pollTimer = null;
340
+ var failedPolls = 0;
341
+ var promotionMoves = [];
342
+
343
+ function squareName(x, y) { return FILES[x] + String(8 - y); }
344
+ function sideOf(piece) {
345
+ if (!piece || piece === '.') return null;
346
+ return piece === piece.toUpperCase() ? 'user' : 'ai';
347
+ }
348
+ function setBanner(text) {
349
+ var banner = document.getElementById('banner');
350
+ banner.textContent = text || '';
351
+ banner.className = text ? 'banner show' : 'banner';
352
+ }
353
+ function statusLine() {
354
+ if (!state) return 'Setting up the board…';
355
+ if (state.status === 'user_won') return 'Checkmate — you won. The Schaakspeler is ready for a rematch.';
356
+ if (state.status === 'ai_won') return 'Checkmate — the Schaakspeler takes this one.';
357
+ if (state.status === 'draw') return 'Draw — a balanced board, and a rematch whenever you like.';
358
+ if (busy) return 'Sending your move…';
359
+ if (state.turn === 'ai') return 'Schaakspeler is thinking…';
360
+ return selected ? 'Choose a highlighted destination.' : 'Your move — you have white.';
361
+ }
362
+ function movesFrom(name) {
363
+ if (!state) return [];
364
+ return state.legalMoves.filter(function (move) { return move.from === name; });
365
+ }
366
+ function movesTo(name) {
367
+ return selected
368
+ ? movesFrom(selected).filter(function (move) { return move.to === name; })
369
+ : [];
370
+ }
371
+ function render() {
372
+ var status = document.getElementById('status');
373
+ status.textContent = statusLine();
374
+ status.className =
375
+ state && state.turn === 'ai' && state.status === 'playing'
376
+ ? 'status thinking'
377
+ : 'status';
378
+
379
+ var thoughtPanel = document.getElementById('move-thought-panel');
380
+ if (state && state.lastMoveThought) {
381
+ thoughtPanel.hidden = false;
382
+ document.getElementById('move-thought').textContent = state.lastMoveThought;
383
+ } else {
384
+ thoughtPanel.hidden = true;
385
+ }
386
+
387
+ var log = document.getElementById('log');
388
+ if (state && state.moveLog.length) {
389
+ log.innerHTML = '';
390
+ state.moveLog.forEach(function (entry, index) {
391
+ var item = document.createElement('li');
392
+ item.textContent = (entry.by === 'user' ? 'White ' : 'Black ') + entry.notation;
393
+ if (index === state.moveLog.length - 1) item.className = 'latest';
394
+ log.appendChild(item);
395
+ });
396
+ log.scrollTop = log.scrollHeight;
397
+ } else {
398
+ log.innerHTML = '<li>No moves yet — white opens.</li>';
399
+ }
400
+
401
+ var board = document.getElementById('board');
402
+ board.innerHTML = '';
403
+ var myTurn = state && state.turn === 'user' && state.status === 'playing' && !busy;
404
+ for (var y = 0; y < 8; y += 1) {
405
+ for (var x = 0; x < 8; x += 1) {
406
+ var name = squareName(x, y);
407
+ var piece = state ? state.squares[y * 8 + x] : '.';
408
+ var choices = movesTo(name);
409
+ var cell = document.createElement('button');
410
+ cell.type = 'button';
411
+ cell.className = 'cell ' + ((x + y) % 2 ? 'dark' : 'light');
412
+ cell.setAttribute('aria-label', name + (piece === '.' ? ', empty' : ', ' + piece));
413
+ cell.dataset.square = name;
414
+ if (state && state.lastMove) {
415
+ if (state.lastMove.from === name) cell.className += ' last-from';
416
+ if (state.lastMove.to === name) cell.className += ' last-to';
417
+ }
418
+ if (selected === name) cell.className += ' selected';
419
+ if (choices.length) {
420
+ cell.className += ' hint';
421
+ if (piece !== '.') cell.className += ' capture';
422
+ }
423
+ if (myTurn && (movesFrom(name).length || choices.length)) cell.className += ' selectable';
424
+
425
+ if (x === 0) {
426
+ var rank = document.createElement('span');
427
+ rank.className = 'coord rank';
428
+ rank.textContent = String(8 - y);
429
+ cell.appendChild(rank);
430
+ }
431
+ if (y === 7) {
432
+ var file = document.createElement('span');
433
+ file.className = 'coord file';
434
+ file.textContent = FILES[x];
435
+ cell.appendChild(file);
436
+ }
437
+ if (piece !== '.') {
438
+ var figure = document.createElement('span');
439
+ figure.className = 'piece ' + (sideOf(piece) === 'user' ? 'white' : 'black');
440
+ figure.textContent = PIECES[piece];
441
+ cell.appendChild(figure);
442
+ }
443
+ cell.addEventListener('click', onSquareClick);
444
+ board.appendChild(cell);
445
+ }
446
+ }
447
+ }
448
+
449
+ function onSquareClick(event) {
450
+ if (!state || state.turn !== 'user' || state.status !== 'playing' || busy) return;
451
+ var name = event.currentTarget.dataset.square;
452
+ var destinations = movesTo(name);
453
+ if (selected && destinations.length) {
454
+ if (destinations.some(function (move) { return move.promotion; })) {
455
+ openPromotion(destinations);
456
+ } else {
457
+ submitMove(destinations[0]);
458
+ }
459
+ return;
460
+ }
461
+ if (movesFrom(name).length) selected = name;
462
+ else selected = null;
463
+ render();
464
+ }
465
+
466
+ function openPromotion(moves) {
467
+ promotionMoves = moves;
468
+ var tray = document.getElementById('promotion-choices');
469
+ tray.innerHTML = '';
470
+ moves.forEach(function (move) {
471
+ var button = document.createElement('button');
472
+ button.type = 'button';
473
+ button.className = 'promotion-key';
474
+ button.textContent = PROMOTION_PIECES[move.promotion];
475
+ button.setAttribute('aria-label', 'Promote to ' + move.promotion);
476
+ button.addEventListener('click', function () {
477
+ document.getElementById('promotion-dialog').close();
478
+ submitMove(move);
479
+ });
480
+ tray.appendChild(button);
481
+ });
482
+ document.getElementById('promotion-dialog').showModal();
483
+ }
484
+
485
+ function submitMove(move) {
486
+ selected = null;
487
+ busy = true;
488
+ render();
489
+ gezelPage
490
+ .invoke('user_move', {
491
+ from: move.from,
492
+ to: move.to,
493
+ ...(move.promotion ? { promotion: move.promotion } : {}),
494
+ })
495
+ .then(function (result) {
496
+ busy = false;
497
+ if (
498
+ result.reaction &&
499
+ result.reaction.delivered === false &&
500
+ result.reaction.reason === 'engagement-off'
501
+ ) {
502
+ setBanner('Move played — but AI engagement is off, so the Schaakspeler cannot reply.');
503
+ }
504
+ return poll();
505
+ })
506
+ .catch(function (error) {
507
+ busy = false;
508
+ setBanner(String(error && error.message ? error.message : error));
509
+ render();
510
+ });
511
+ }
512
+
513
+ function newGame() {
514
+ if (!gezelPage.embedded() || busy) return;
515
+ selected = null;
516
+ busy = true;
517
+ render();
518
+ gezelPage
519
+ .invoke('new_game', {})
520
+ .then(function () {
521
+ busy = false;
522
+ setBanner('');
523
+ return poll();
524
+ })
525
+ .catch(function (error) {
526
+ busy = false;
527
+ setBanner(String(error && error.message ? error.message : error));
528
+ render();
529
+ });
530
+ }
531
+
532
+ function transitionState(next) {
533
+ state = next;
534
+ if (selected && !movesFrom(selected).length) selected = null;
535
+ render();
536
+ }
537
+ function poll() {
538
+ if (!capability || !projectId) return Promise.resolve();
539
+ return fetch(
540
+ '/preview/' + encodeURIComponent(capability) + '/workspace/' + encodeURIComponent(projectId) + '/game.json',
541
+ { cache: 'no-store' },
542
+ )
543
+ .then(function (response) {
544
+ if (!response.ok) throw new Error('poll ' + response.status);
545
+ return response.json();
546
+ })
547
+ .then(function (next) {
548
+ failedPolls = 0;
549
+ transitionState(next);
550
+ })
551
+ .catch(function () {
552
+ failedPolls += 1;
553
+ if (failedPolls === 3) gezelPage.refresh();
554
+ });
555
+ }
556
+ function schedule() {
557
+ if (pollTimer) clearTimeout(pollTimer);
558
+ var wait = state && state.turn === 'ai' && state.status === 'playing' ? 1500 : 5000;
559
+ pollTimer = setTimeout(function () { poll().then(schedule, schedule); }, wait);
560
+ }
561
+
562
+ document.getElementById('newgame').addEventListener('click', newGame);
563
+ document.getElementById('cancel-promotion').addEventListener('click', function () {
564
+ promotionMoves = [];
565
+ document.getElementById('promotion-dialog').close();
566
+ });
567
+ if (!gezelPage.embedded()) {
568
+ setBanner('Read-only view — moves need the Gezel app (open this project and use the Output tab).');
569
+ }
570
+ poll().then(schedule, schedule);
571
+ })();
572
+ </script>
573
+ </body>
574
+ </html>
@@ -0,0 +1,22 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "kind": "project-type",
4
+ "id": "go",
5
+ "name": "Go",
6
+ "description": "Play Go against a gezel opponent on a live 9×9, 13×13, or 19×19 board. Place black stones; the Go-speler reads the exact position, replies in white, and keeps the conversation calm and sporting.",
7
+ "tags": [
8
+ "go",
9
+ "baduk",
10
+ "weiqi",
11
+ "game",
12
+ "board-game",
13
+ "strategy",
14
+ "play"
15
+ ],
16
+ "category": "game",
17
+ "maintainer": {
18
+ "name": "Gezel"
19
+ },
20
+ "license": "MIT",
21
+ "yankedVersions": []
22
+ }
@@ -0,0 +1,9 @@
1
+ A standing Go table. You place black stones on the board in the **Output**
2
+ tab; your Go-speler plays white — reading the exact position, responding on the
3
+ board, and keeping the conversation {{personality}} and unhurried.
4
+
5
+ Choose a quick 9×9 game, a roomier 13×13 board, or the full 19×19 goban. The
6
+ Go-speler plays as an **{{playStyle}}**: opponents keep their reading private,
7
+ while instructors offer one light teaching observation at a time. The board
8
+ enforces captures, suicide, simple ko, passing, and Chinese-style area scoring.
9
+ Two passes settle the score.