@contractspec/app.alpic-mcp 3.7.6 → 3.7.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.
package/AGENTS.md CHANGED
@@ -1,4 +1,4 @@
1
- # AI Agent Guide — `alpic-mcp`
1
+ # AI Agent Guide — `@contractspec/app.alpic-mcp`
2
2
 
3
3
  Scope: `packages/apps/alpic-mcp/*`
4
4
 
@@ -6,33 +6,40 @@ MCP (Model Context Protocol) server for Alpic. Exposes ContractSpec documentatio
6
6
 
7
7
  ## Quick Context
8
8
 
9
- - **Layer**: app
10
- - **Consumers**: AI agents, IDE integrations, MCP clients
9
+ - Layer: `app`.
10
+ - Package visibility: published package.
11
+ - Primary consumers are deployed users, operators, or external clients of this app surface.
12
+ - Related packages: `@contractspec/bundle.alpic`, `@contractspec/lib.logger`, `@contractspec/tool.tsdown`, `@contractspec/tool.typescript`.
11
13
 
12
14
  ## Architecture
13
15
 
14
- - Uses `@contractspec/bundle.alpic` for Alpic business logic
15
- - Uses `@contractspec/lib.logger` for structured logging
16
- - Built with tsdown; runs as a Node.js server
16
+ - Uses `@contractspec/bundle.alpic` for Alpic business logic.
17
+ - Uses `@contractspec/lib.logger` for structured logging.
18
+ - Built with tsdown; runs as a Node.js server.
19
+ - `src/index.ts` is the root public barrel and package entrypoint.
20
+ - `src/server.ts` is the main server bootstrap entrypoint.
17
21
 
18
- ## Key Files
22
+ ## Public Surface
19
23
 
20
- - `src/server.ts` MCP server entry point
21
- - `src/index.ts` Library exports
22
-
23
- ## Public Exports
24
-
25
- - `.` → `dist/index.mjs`
26
- - `./server` → `dist/server.mjs`
24
+ - Export `.` resolves through `./dist/index.mjs`.
25
+ - Export `./server` resolves through `./dist/server.mjs`.
26
+ - Export `./*` resolves through `./*`.
27
27
 
28
28
  ## Guardrails
29
29
 
30
- - MCP protocol compliance is critical — do not break tool/resource schemas
31
- - Keep server startup fast; defer heavy initialization
30
+ - MCP protocol compliance is critical — do not break tool/resource schemas.
31
+ - Keep server startup fast; defer heavy initialization.
32
+ - Changes here can affect downstream packages such as `@contractspec/bundle.alpic`, `@contractspec/lib.logger`, `@contractspec/tool.tsdown`, `@contractspec/tool.typescript`.
33
+ - Changes here can affect downstream packages such as `@contractspec/bundle.alpic`, `@contractspec/lib.logger`, `@contractspec/tool.tsdown`, `@contractspec/tool.typescript`.
32
34
 
33
35
  ## Local Commands
34
36
 
35
- - Build: `bun run build`
36
- - Dev: `bun run dev`
37
- - Start: `bun run start`
38
- - Lint: `bun run lint`
37
+ - `bun run dev` — tsdown --watch
38
+ - `bun run start` — node dist/server.js
39
+ - `bun run build` — tsdown && mkdir -p dist && cp -R assets dist/assets
40
+ - `bun run lint`bun run lint:fix
41
+ - `bun run lint:check` — biome check .
42
+ - `bun run lint:fix` — biome check --write --unsafe --only=nursery/useSortedClasses . && biome check --write .
43
+ - `bun run publish:pkg` — bun publish --tolerate-republish --ignore-scripts --verbose
44
+ - `bun run publish:pkg:canary` — bun publish:pkg --tag canary
45
+ - `bun run clean` — rm -rf dist
package/README.md CHANGED
@@ -1,16 +1,60 @@
1
1
  # @contractspec/app.alpic-mcp
2
2
 
3
- Minimal MCP server and ChatGPT App asset host for Alpic.
3
+ Website: https://contractspec.io
4
4
 
5
- ## Alpic settings
5
+ **MCP (Model Context Protocol) server for Alpic. Exposes ContractSpec documentation and tooling to AI agents via the MCP standard.**
6
6
 
7
- - Build command: `npm run build`
8
- - Output directory: `dist`
9
- - MCP endpoints: `/` (SSE + Streamable HTTP) and `/mcp` (Streamable HTTP)
10
- - Assets: `/assets`
7
+ ## What It Does
8
+
9
+ - Uses `@contractspec/bundle.alpic` for Alpic business logic.
10
+ - Uses `@contractspec/lib.logger` for structured logging.
11
+ - Built with tsdown; runs as a Node.js server.
12
+ - Related ContractSpec packages include `@contractspec/bundle.alpic`, `@contractspec/lib.logger`, `@contractspec/tool.tsdown`, `@contractspec/tool.typescript`.
13
+
14
+ ## Running Locally
15
+
16
+ From `packages/apps/alpic-mcp`:
17
+ - `bun run dev`
18
+ - `bun run start`
19
+ - `bun run build`
20
+
21
+ ## Usage
22
+
23
+ ```bash
24
+ bun run dev
25
+ ```
26
+
27
+ ## Architecture
28
+
29
+ - Uses `@contractspec/bundle.alpic` for Alpic business logic.
30
+ - Uses `@contractspec/lib.logger` for structured logging.
31
+ - Built with tsdown; runs as a Node.js server.
32
+ - `src/index.ts` is the root public barrel and package entrypoint.
33
+ - `src/server.ts` is the main server bootstrap entrypoint.
34
+
35
+ ## Public Entry Points
36
+
37
+ - Export `.` resolves through `./dist/index.mjs`.
38
+ - Export `./server` resolves through `./dist/server.mjs`.
39
+ - Export `./*` resolves through `./*`.
40
+
41
+ ## Local Commands
42
+
43
+ - `bun run dev` — tsdown --watch
44
+ - `bun run start` — node dist/server.js
45
+ - `bun run build` — tsdown && mkdir -p dist && cp -R assets dist/assets
46
+ - `bun run lint` — bun run lint:fix
47
+ - `bun run lint:check` — biome check .
48
+ - `bun run lint:fix` — biome check --write --unsafe --only=nursery/useSortedClasses . && biome check --write .
49
+ - `bun run publish:pkg` — bun publish --tolerate-republish --ignore-scripts --verbose
50
+ - `bun run publish:pkg:canary` — bun publish:pkg --tag canary
51
+ - `bun run clean` — rm -rf dist
52
+
53
+ ## Recent Updates
54
+
55
+ - Replace eslint+prettier by biomejs to optimize speed.
11
56
 
12
57
  ## Notes
13
58
 
14
- - Place static UI files in `assets/` at the project root.
15
- - Alpic merges `assets/` and `dist/assets/` on deploy.
16
- - If assets are cached in ChatGPT, use the in-app refresh option.
59
+ - MCP protocol compliance is critical do not break tool/resource schemas.
60
+ - Keep server startup fast; defer heavy initialization.
package/assets/app.js CHANGED
@@ -1,40 +1,40 @@
1
1
  const origin = window.location.origin;
2
2
 
3
3
  const config = {
4
- mcpServers: {
5
- 'alpic-app': {
6
- url: origin,
7
- transport: 'http',
8
- },
9
- },
4
+ mcpServers: {
5
+ 'alpic-app': {
6
+ url: origin,
7
+ transport: 'http',
8
+ },
9
+ },
10
10
  };
11
11
 
12
12
  const originTargets = document.querySelectorAll('[data-origin]');
13
13
  originTargets.forEach((node) => {
14
- node.textContent = origin;
14
+ node.textContent = origin;
15
15
  });
16
16
 
17
17
  const configNode = document.getElementById('config-json');
18
18
  if (configNode) {
19
- configNode.textContent = JSON.stringify(config, null, 2);
19
+ configNode.textContent = JSON.stringify(config, null, 2);
20
20
  }
21
21
 
22
22
  const copyButton = document.getElementById('copy-config');
23
23
  if (copyButton) {
24
- copyButton.addEventListener('click', async () => {
25
- try {
26
- await navigator.clipboard.writeText(JSON.stringify(config, null, 2));
27
- copyButton.textContent = 'Copied';
28
- copyButton.classList.add('is-copied');
29
- setTimeout(() => {
30
- copyButton.textContent = 'Copy MCP config';
31
- copyButton.classList.remove('is-copied');
32
- }, 1600);
33
- } catch {
34
- copyButton.textContent = 'Copy failed';
35
- setTimeout(() => {
36
- copyButton.textContent = 'Copy MCP config';
37
- }, 1600);
38
- }
39
- });
24
+ copyButton.addEventListener('click', async () => {
25
+ try {
26
+ await navigator.clipboard.writeText(JSON.stringify(config, null, 2));
27
+ copyButton.textContent = 'Copied';
28
+ copyButton.classList.add('is-copied');
29
+ setTimeout(() => {
30
+ copyButton.textContent = 'Copy MCP config';
31
+ copyButton.classList.remove('is-copied');
32
+ }, 1600);
33
+ } catch {
34
+ copyButton.textContent = 'Copy failed';
35
+ setTimeout(() => {
36
+ copyButton.textContent = 'Copy MCP config';
37
+ }, 1600);
38
+ }
39
+ });
40
40
  }
package/assets/style.css CHANGED
@@ -1,315 +1,315 @@
1
1
  :root {
2
- --bg: #f7f2ea;
3
- --bg-alt: #e9f3f1;
4
- --ink: #1f1b16;
5
- --muted: #6b6258;
6
- --card: #ffffff;
7
- --accent: #1b7f6b;
8
- --accent-strong: #156554;
9
- --accent-warm: #d97941;
10
- --border: rgba(31, 27, 22, 0.12);
11
- --shadow: 0 18px 40px rgba(31, 27, 22, 0.12);
12
- --radius: 24px;
13
- --radius-small: 14px;
14
- --space: 24px;
15
- --mono: 'Space Grotesk', 'Avenir Next', sans-serif;
16
- --serif: 'Newsreader', 'Georgia', serif;
2
+ --bg: #f7f2ea;
3
+ --bg-alt: #e9f3f1;
4
+ --ink: #1f1b16;
5
+ --muted: #6b6258;
6
+ --card: #ffffff;
7
+ --accent: #1b7f6b;
8
+ --accent-strong: #156554;
9
+ --accent-warm: #d97941;
10
+ --border: rgba(31, 27, 22, 0.12);
11
+ --shadow: 0 18px 40px rgba(31, 27, 22, 0.12);
12
+ --radius: 24px;
13
+ --radius-small: 14px;
14
+ --space: 24px;
15
+ --mono: "Space Grotesk", "Avenir Next", sans-serif;
16
+ --serif: "Newsreader", "Georgia", serif;
17
17
  }
18
18
 
19
19
  * {
20
- box-sizing: border-box;
20
+ box-sizing: border-box;
21
21
  }
22
22
 
23
23
  body {
24
- margin: 0;
25
- font-family: var(--mono);
26
- color: var(--ink);
27
- background:
28
- radial-gradient(circle at top left, #fff4e6, transparent 55%),
29
- linear-gradient(135deg, var(--bg), var(--bg-alt));
30
- min-height: 100vh;
31
- display: flex;
32
- justify-content: center;
24
+ margin: 0;
25
+ font-family: var(--mono);
26
+ color: var(--ink);
27
+ background:
28
+ radial-gradient(circle at top left, #fff4e6, transparent 55%),
29
+ linear-gradient(135deg, var(--bg), var(--bg-alt));
30
+ min-height: 100vh;
31
+ display: flex;
32
+ justify-content: center;
33
33
  }
34
34
 
35
35
  body::before,
36
36
  body::after {
37
- content: '';
38
- position: fixed;
39
- z-index: -1;
40
- width: 340px;
41
- height: 340px;
42
- border-radius: 50%;
43
- filter: blur(10px);
44
- opacity: 0.35;
37
+ content: "";
38
+ position: fixed;
39
+ z-index: -1;
40
+ width: 340px;
41
+ height: 340px;
42
+ border-radius: 50%;
43
+ filter: blur(10px);
44
+ opacity: 0.35;
45
45
  }
46
46
 
47
47
  body::before {
48
- top: -120px;
49
- right: -80px;
50
- background: radial-gradient(circle, #b6e2d3, transparent 70%);
48
+ top: -120px;
49
+ right: -80px;
50
+ background: radial-gradient(circle, #b6e2d3, transparent 70%);
51
51
  }
52
52
 
53
53
  body::after {
54
- bottom: -140px;
55
- left: -120px;
56
- background: radial-gradient(circle, #f2c4a0, transparent 70%);
54
+ bottom: -140px;
55
+ left: -120px;
56
+ background: radial-gradient(circle, #f2c4a0, transparent 70%);
57
57
  }
58
58
 
59
59
  .page {
60
- width: min(1100px, 92vw);
61
- padding: 48px 0 64px;
62
- display: flex;
63
- flex-direction: column;
64
- gap: 48px;
65
- animation: fade-in 0.6s ease-out;
60
+ width: min(1100px, 92vw);
61
+ padding: 48px 0 64px;
62
+ display: flex;
63
+ flex-direction: column;
64
+ gap: 48px;
65
+ animation: fade-in 0.6s ease-out;
66
66
  }
67
67
 
68
68
  @keyframes fade-in {
69
- from {
70
- opacity: 0;
71
- transform: translateY(14px);
72
- }
73
- to {
74
- opacity: 1;
75
- transform: translateY(0);
76
- }
69
+ from {
70
+ opacity: 0;
71
+ transform: translateY(14px);
72
+ }
73
+ to {
74
+ opacity: 1;
75
+ transform: translateY(0);
76
+ }
77
77
  }
78
78
 
79
79
  .hero {
80
- background: var(--card);
81
- padding: clamp(28px, 4vw, 48px);
82
- border-radius: var(--radius);
83
- box-shadow: var(--shadow);
84
- border: 1px solid var(--border);
85
- display: flex;
86
- flex-direction: column;
87
- gap: 16px;
80
+ background: var(--card);
81
+ padding: clamp(28px, 4vw, 48px);
82
+ border-radius: var(--radius);
83
+ box-shadow: var(--shadow);
84
+ border: 1px solid var(--border);
85
+ display: flex;
86
+ flex-direction: column;
87
+ gap: 16px;
88
88
  }
89
89
 
90
90
  .hero__badge {
91
- align-self: flex-start;
92
- padding: 8px 14px;
93
- border-radius: 999px;
94
- background: rgba(27, 127, 107, 0.12);
95
- color: var(--accent-strong);
96
- font-weight: 600;
97
- letter-spacing: 0.03em;
98
- text-transform: uppercase;
99
- font-size: 12px;
91
+ align-self: flex-start;
92
+ padding: 8px 14px;
93
+ border-radius: 999px;
94
+ background: rgba(27, 127, 107, 0.12);
95
+ color: var(--accent-strong);
96
+ font-weight: 600;
97
+ letter-spacing: 0.03em;
98
+ text-transform: uppercase;
99
+ font-size: 12px;
100
100
  }
101
101
 
102
102
  .hero h1 {
103
- font-size: clamp(32px, 4vw, 48px);
104
- margin: 0;
105
- line-height: 1.05;
103
+ font-size: clamp(32px, 4vw, 48px);
104
+ margin: 0;
105
+ line-height: 1.05;
106
106
  }
107
107
 
108
108
  .hero p {
109
- margin: 0;
110
- font-size: 17px;
111
- color: var(--muted);
112
- font-family: var(--serif);
109
+ margin: 0;
110
+ font-size: 17px;
111
+ color: var(--muted);
112
+ font-family: var(--serif);
113
113
  }
114
114
 
115
115
  .hero p span {
116
- font-weight: 600;
117
- color: var(--ink);
116
+ font-weight: 600;
117
+ color: var(--ink);
118
118
  }
119
119
 
120
120
  .hero__actions {
121
- display: flex;
122
- flex-wrap: wrap;
123
- gap: 14px;
121
+ display: flex;
122
+ flex-wrap: wrap;
123
+ gap: 14px;
124
124
  }
125
125
 
126
126
  .hero__actions .primary,
127
127
  .hero__actions .ghost {
128
- border-radius: 999px;
129
- padding: 12px 20px;
130
- font-size: 15px;
131
- border: none;
132
- cursor: pointer;
133
- text-decoration: none;
134
- transition:
135
- transform 0.2s ease,
136
- box-shadow 0.2s ease;
128
+ border-radius: 999px;
129
+ padding: 12px 20px;
130
+ font-size: 15px;
131
+ border: none;
132
+ cursor: pointer;
133
+ text-decoration: none;
134
+ transition:
135
+ transform 0.2s ease,
136
+ box-shadow 0.2s ease;
137
137
  }
138
138
 
139
139
  .hero__actions .primary {
140
- background: var(--accent);
141
- color: #fff;
142
- box-shadow: 0 14px 24px rgba(27, 127, 107, 0.25);
140
+ background: var(--accent);
141
+ color: #fff;
142
+ box-shadow: 0 14px 24px rgba(27, 127, 107, 0.25);
143
143
  }
144
144
 
145
145
  .hero__actions .primary:hover {
146
- transform: translateY(-1px);
147
- box-shadow: 0 18px 28px rgba(27, 127, 107, 0.3);
146
+ transform: translateY(-1px);
147
+ box-shadow: 0 18px 28px rgba(27, 127, 107, 0.3);
148
148
  }
149
149
 
150
150
  .hero__actions .primary.is-copied {
151
- background: var(--accent-strong);
151
+ background: var(--accent-strong);
152
152
  }
153
153
 
154
154
  .hero__actions .ghost {
155
- border: 1px solid var(--border);
156
- color: var(--ink);
157
- background: transparent;
155
+ border: 1px solid var(--border);
156
+ color: var(--ink);
157
+ background: transparent;
158
158
  }
159
159
 
160
160
  .hero__meta {
161
- display: grid;
162
- grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
163
- gap: 12px;
164
- margin-top: 10px;
161
+ display: grid;
162
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
163
+ gap: 12px;
164
+ margin-top: 10px;
165
165
  }
166
166
 
167
167
  .meta-card {
168
- border-radius: var(--radius-small);
169
- padding: 14px 16px;
170
- background: rgba(27, 127, 107, 0.08);
171
- display: grid;
172
- gap: 6px;
168
+ border-radius: var(--radius-small);
169
+ padding: 14px 16px;
170
+ background: rgba(27, 127, 107, 0.08);
171
+ display: grid;
172
+ gap: 6px;
173
173
  }
174
174
 
175
175
  .meta-card span {
176
- font-size: 12px;
177
- text-transform: uppercase;
178
- letter-spacing: 0.04em;
179
- color: var(--muted);
176
+ font-size: 12px;
177
+ text-transform: uppercase;
178
+ letter-spacing: 0.04em;
179
+ color: var(--muted);
180
180
  }
181
181
 
182
182
  .meta-card code {
183
- font-family: var(--mono);
184
- font-weight: 600;
183
+ font-family: var(--mono);
184
+ font-weight: 600;
185
185
  }
186
186
 
187
187
  .grid {
188
- display: grid;
189
- grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
190
- gap: 18px;
188
+ display: grid;
189
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
190
+ gap: 18px;
191
191
  }
192
192
 
193
193
  .card {
194
- background: var(--card);
195
- border: 1px solid var(--border);
196
- border-radius: var(--radius-small);
197
- padding: 20px;
198
- display: flex;
199
- flex-direction: column;
200
- gap: 12px;
201
- box-shadow: 0 14px 26px rgba(31, 27, 22, 0.08);
194
+ background: var(--card);
195
+ border: 1px solid var(--border);
196
+ border-radius: var(--radius-small);
197
+ padding: 20px;
198
+ display: flex;
199
+ flex-direction: column;
200
+ gap: 12px;
201
+ box-shadow: 0 14px 26px rgba(31, 27, 22, 0.08);
202
202
  }
203
203
 
204
204
  .card h2 {
205
- margin: 0;
206
- font-size: 20px;
205
+ margin: 0;
206
+ font-size: 20px;
207
207
  }
208
208
 
209
209
  .card p {
210
- margin: 0;
211
- color: var(--muted);
212
- font-family: var(--serif);
210
+ margin: 0;
211
+ color: var(--muted);
212
+ font-family: var(--serif);
213
213
  }
214
214
 
215
215
  .card ul {
216
- margin: 0;
217
- padding-left: 18px;
218
- color: var(--muted);
216
+ margin: 0;
217
+ padding-left: 18px;
218
+ color: var(--muted);
219
219
  }
220
220
 
221
221
  .card strong {
222
- color: var(--ink);
222
+ color: var(--ink);
223
223
  }
224
224
 
225
225
  .code {
226
- background: #0f172a;
227
- color: #dbeafe;
228
- padding: 16px;
229
- border-radius: 12px;
230
- font-size: 12px;
231
- line-height: 1.5;
232
- overflow-x: auto;
226
+ background: #0f172a;
227
+ color: #dbeafe;
228
+ padding: 16px;
229
+ border-radius: 12px;
230
+ font-size: 12px;
231
+ line-height: 1.5;
232
+ overflow-x: auto;
233
233
  }
234
234
 
235
235
  .assets {
236
- background: var(--card);
237
- padding: 24px;
238
- border-radius: var(--radius);
239
- border: 1px solid var(--border);
240
- display: grid;
241
- gap: 20px;
236
+ background: var(--card);
237
+ padding: 24px;
238
+ border-radius: var(--radius);
239
+ border: 1px solid var(--border);
240
+ display: grid;
241
+ gap: 20px;
242
242
  }
243
243
 
244
244
  .assets__header h2 {
245
- margin: 0 0 6px;
245
+ margin: 0 0 6px;
246
246
  }
247
247
 
248
248
  .assets__header p {
249
- margin: 0;
250
- color: var(--muted);
251
- font-family: var(--serif);
249
+ margin: 0;
250
+ color: var(--muted);
251
+ font-family: var(--serif);
252
252
  }
253
253
 
254
254
  .assets__list {
255
- display: grid;
256
- grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
257
- gap: 14px;
255
+ display: grid;
256
+ grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
257
+ gap: 14px;
258
258
  }
259
259
 
260
260
  .asset-item {
261
- padding: 16px;
262
- border-radius: 14px;
263
- border: 1px solid var(--border);
264
- background: rgba(217, 121, 65, 0.08);
265
- display: grid;
266
- gap: 6px;
261
+ padding: 16px;
262
+ border-radius: 14px;
263
+ border: 1px solid var(--border);
264
+ background: rgba(217, 121, 65, 0.08);
265
+ display: grid;
266
+ gap: 6px;
267
267
  }
268
268
 
269
269
  .asset-item span {
270
- font-weight: 600;
270
+ font-weight: 600;
271
271
  }
272
272
 
273
273
  .asset-item small {
274
- color: var(--muted);
274
+ color: var(--muted);
275
275
  }
276
276
 
277
277
  .footer {
278
- display: flex;
279
- flex-wrap: wrap;
280
- justify-content: space-between;
281
- gap: 12px;
282
- color: var(--muted);
283
- font-size: 14px;
278
+ display: flex;
279
+ flex-wrap: wrap;
280
+ justify-content: space-between;
281
+ gap: 12px;
282
+ color: var(--muted);
283
+ font-size: 14px;
284
284
  }
285
285
 
286
286
  .footer__links {
287
- display: flex;
288
- gap: 16px;
287
+ display: flex;
288
+ gap: 16px;
289
289
  }
290
290
 
291
291
  .footer a {
292
- color: var(--accent-strong);
293
- text-decoration: none;
292
+ color: var(--accent-strong);
293
+ text-decoration: none;
294
294
  }
295
295
 
296
296
  .footer a:hover {
297
- text-decoration: underline;
297
+ text-decoration: underline;
298
298
  }
299
299
 
300
300
  @media (max-width: 720px) {
301
- .page {
302
- padding-top: 32px;
303
- }
304
-
305
- .hero__actions {
306
- flex-direction: column;
307
- align-items: stretch;
308
- }
309
-
310
- .hero__actions .primary,
311
- .hero__actions .ghost {
312
- width: 100%;
313
- text-align: center;
314
- }
301
+ .page {
302
+ padding-top: 32px;
303
+ }
304
+
305
+ .hero__actions {
306
+ flex-direction: column;
307
+ align-items: stretch;
308
+ }
309
+
310
+ .hero__actions .primary,
311
+ .hero__actions .ghost {
312
+ width: 100%;
313
+ text-align: center;
314
+ }
315
315
  }
package/package.json CHANGED
@@ -1,43 +1,43 @@
1
1
  {
2
- "name": "@contractspec/app.alpic-mcp",
3
- "version": "3.7.6",
4
- "type": "module",
5
- "scripts": {
6
- "publish:pkg": "bun publish --tolerate-republish --ignore-scripts --verbose",
7
- "publish:pkg:canary": "bun publish:pkg --tag canary",
8
- "clean": "rm -rf dist",
9
- "lint": "bun run lint:fix",
10
- "lint:fix": "eslint src --fix",
11
- "lint:check": "eslint src",
12
- "build": "tsdown && mkdir -p dist && cp -R assets dist/assets",
13
- "dev": "tsdown --watch",
14
- "start": "node dist/server.js"
15
- },
16
- "dependencies": {
17
- "@contractspec/bundle.alpic": "3.7.6",
18
- "@contractspec/lib.logger": "3.7.6"
19
- },
20
- "devDependencies": {
21
- "@contractspec/tool.tsdown": "3.7.6",
22
- "@contractspec/tool.typescript": "3.7.6",
23
- "@types/node": "^25.3.5",
24
- "tsdown": "^0.21.0",
25
- "typescript": "^5.9.3"
26
- },
27
- "license": "MIT",
28
- "repository": {
29
- "type": "git",
30
- "url": "https://github.com/lssm-tech/contractspec.git",
31
- "directory": "packages/apps/alpic-mcp"
32
- },
33
- "publishConfig": {
34
- "registry": "https://registry.npmjs.org/",
35
- "access": "public"
36
- },
37
- "homepage": "https://contractspec.io",
38
- "exports": {
39
- ".": "./dist/index.mjs",
40
- "./server": "./dist/server.mjs",
41
- "./*": "./*"
42
- }
2
+ "name": "@contractspec/app.alpic-mcp",
3
+ "version": "3.7.7",
4
+ "type": "module",
5
+ "scripts": {
6
+ "publish:pkg": "bun publish --tolerate-republish --ignore-scripts --verbose",
7
+ "publish:pkg:canary": "bun publish:pkg --tag canary",
8
+ "clean": "rm -rf dist",
9
+ "lint": "bun run lint:fix",
10
+ "lint:fix": "biome check --write --unsafe --only=nursery/useSortedClasses . && biome check --write .",
11
+ "lint:check": "biome check .",
12
+ "build": "tsdown && mkdir -p dist && cp -R assets dist/assets",
13
+ "dev": "tsdown --watch",
14
+ "start": "node dist/server.js"
15
+ },
16
+ "dependencies": {
17
+ "@contractspec/bundle.alpic": "3.7.7",
18
+ "@contractspec/lib.logger": "3.7.6"
19
+ },
20
+ "devDependencies": {
21
+ "@contractspec/tool.tsdown": "3.7.6",
22
+ "@contractspec/tool.typescript": "3.7.6",
23
+ "@types/node": "^25.3.5",
24
+ "tsdown": "^0.21.4",
25
+ "typescript": "^5.9.3"
26
+ },
27
+ "license": "MIT",
28
+ "repository": {
29
+ "type": "git",
30
+ "url": "https://github.com/lssm-tech/contractspec.git",
31
+ "directory": "packages/apps/alpic-mcp"
32
+ },
33
+ "publishConfig": {
34
+ "registry": "https://registry.npmjs.org/",
35
+ "access": "public"
36
+ },
37
+ "homepage": "https://contractspec.io",
38
+ "exports": {
39
+ ".": "./dist/index.mjs",
40
+ "./server": "./dist/server.mjs",
41
+ "./*": "./*"
42
+ }
43
43
  }