@ignite-agent/agent 0.1.0 → 0.4.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 (66) hide show
  1. package/AI.txt +7 -0
  2. package/LICENSE +57 -4
  3. package/README.md +194 -12
  4. package/dist/cli/index.js +105 -21
  5. package/dist/cli/index.js.map +1 -1
  6. package/dist/cli/project.d.ts +39 -0
  7. package/dist/cli/project.js +276 -0
  8. package/dist/cli/project.js.map +1 -0
  9. package/dist/client-public.d.ts +2 -0
  10. package/dist/client-public.js +3 -0
  11. package/dist/client-public.js.map +1 -0
  12. package/dist/client.d.ts +3 -1
  13. package/dist/client.js +7 -0
  14. package/dist/client.js.map +1 -1
  15. package/dist/env.js +1 -2
  16. package/dist/env.js.map +1 -1
  17. package/dist/ignite.css +228 -0
  18. package/dist/index.d.ts +9 -3
  19. package/dist/index.js +8 -2
  20. package/dist/index.js.map +1 -1
  21. package/dist/mcp.d.ts +22 -0
  22. package/dist/mcp.js +88 -0
  23. package/dist/mcp.js.map +1 -0
  24. package/dist/operator/blog.d.ts +21 -0
  25. package/dist/operator/blog.js +32 -0
  26. package/dist/operator/blog.js.map +1 -0
  27. package/dist/operator/card.d.ts +5 -0
  28. package/dist/operator/card.js +11 -0
  29. package/dist/operator/card.js.map +1 -0
  30. package/dist/operator/jsonld.d.ts +6 -0
  31. package/dist/operator/jsonld.js +6 -3
  32. package/dist/operator/jsonld.js.map +1 -1
  33. package/dist/operator/metadata.d.ts +1 -0
  34. package/dist/operator/metadata.js +1 -0
  35. package/dist/operator/metadata.js.map +1 -1
  36. package/dist/operator/page.d.ts +17 -0
  37. package/dist/operator/page.js +51 -0
  38. package/dist/operator/page.js.map +1 -0
  39. package/dist/operator/prose.d.ts +19 -0
  40. package/dist/operator/prose.js +26 -0
  41. package/dist/operator/prose.js.map +1 -0
  42. package/dist/operator/proxy.d.ts +2 -0
  43. package/dist/operator/proxy.js +43 -22
  44. package/dist/operator/proxy.js.map +1 -1
  45. package/dist/operator/robots.d.ts +1 -0
  46. package/dist/operator/robots.js +1 -0
  47. package/dist/operator/robots.js.map +1 -1
  48. package/dist/operator/sitemap-merge.d.ts +10 -0
  49. package/dist/operator/sitemap-merge.js +56 -0
  50. package/dist/operator/sitemap-merge.js.map +1 -0
  51. package/dist/operator/sitemap.d.ts +5 -1
  52. package/dist/operator/sitemap.js +28 -17
  53. package/dist/operator/sitemap.js.map +1 -1
  54. package/dist/operator/ui.d.ts +44 -0
  55. package/dist/operator/ui.js +477 -0
  56. package/dist/operator/ui.js.map +1 -0
  57. package/dist/operator/wiki.d.ts +21 -0
  58. package/dist/operator/wiki.js +41 -0
  59. package/dist/operator/wiki.js.map +1 -0
  60. package/dist/types.d.ts +39 -0
  61. package/onboarding/CLAUDE-CODE-SETUP.md +52 -18
  62. package/onboarding/CURSOR-SETUP.md +73 -0
  63. package/onboarding/LOVABLE-SETUP.md +76 -0
  64. package/onboarding/MIGRATE-EXISTING.md +94 -0
  65. package/onboarding/REPLIT-SETUP.md +76 -0
  66. package/package.json +32 -9
package/AI.txt ADDED
@@ -0,0 +1,7 @@
1
+ # Reserved for text and data mining / AI training.
2
+ # License: LICENSE (MIT + Additional Terms — no AI / ML training).
3
+ # EU Directive 2019/790 Art. 4 opt-out.
4
+
5
+ User-Agent: *
6
+ Disallow: /
7
+ TDM-Reservation: 1
package/LICENSE CHANGED
@@ -1,5 +1,58 @@
1
- Copyright (c) Ignite. All rights reserved.
1
+ Ignite Agent License
2
2
 
3
- This package is provided to Ignite customers for the sole purpose of integrating
4
- their site with the Ignite service. Use is subject to the Ignite Terms of Service.
5
- No other use, redistribution, or modification is permitted without written consent.
3
+ Copyright (c) 2026 Ignite
4
+
5
+ This license is the MIT License plus an additional reservation of rights for
6
+ text-and-data mining and AI/ML training. Software use, modification, and
7
+ redistribution (including as a dependency in your own application) are MIT.
8
+ Training models on this source is not.
9
+
10
+ -----------------------------------------------------------------------------
11
+ MIT License
12
+ -----------------------------------------------------------------------------
13
+
14
+ Permission is hereby granted, free of charge, to any person obtaining a copy
15
+ of this software and associated documentation files (the "Software"), to deal
16
+ in the Software without restriction, including without limitation the rights
17
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
18
+ copies of the Software, and to permit persons to whom the Software is
19
+ furnished to do so, subject to the following conditions:
20
+
21
+ The above copyright notice, this permission notice, and the Additional Terms
22
+ below shall be included in all copies or substantial portions of the Software.
23
+
24
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
25
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
26
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
27
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
28
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
29
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30
+ SOFTWARE.
31
+
32
+ -----------------------------------------------------------------------------
33
+ Additional Terms — no AI / ML training (TDM reservation)
34
+ -----------------------------------------------------------------------------
35
+
36
+ Notwithstanding the MIT grant above, the copyright holder reserves all rights
37
+ to use this Software, its source code, documentation, and associated files for
38
+ text and data mining and for training, fine-tuning, evaluating, or otherwise
39
+ improving machine-learning or artificial-intelligence models (including large
40
+ language models), pursuant to Article 4 of Directive (EU) 2019/790 and any
41
+ equivalent reservation available under applicable law.
42
+
43
+ Without prior written permission from the copyright holder, you may not:
44
+
45
+ 1. Include this Software in a corpus, dataset, or scrape used to train or
46
+ fine-tune an AI or ML model.
47
+ 2. Use this Software to evaluate, distill, or otherwise improve an AI or ML
48
+ model, other than incidentally while running, testing, or modifying the
49
+ Software as a software package.
50
+ 3. Circumvent this reservation by paraphrasing, translating, or converting
51
+ the source for the purposes in (1) or (2).
52
+
53
+ These Additional Terms do not limit ordinary use of the published package:
54
+ installing it, calling its APIs, modifying it to integrate with your own site,
55
+ and redistributing copies that retain this license.
56
+
57
+ This file is therefore not OSI “MIT” in isolation. The SPDX expression for
58
+ package metadata is LicenseRef-MIT-NoAI. See README.md.
package/README.md CHANGED
@@ -1,10 +1,13 @@
1
1
  # @ignite-agent/agent
2
2
 
3
3
  Ignite for Next.js. A drop-in App Router SDK that lets your Ignite workspace drive your site's `robots.txt`,
4
- `sitemap.xml`, JSON-LD, and page metadata, log crawler visits, and run the approve-and-apply change loop.
4
+ `sitemap.xml`, JSON-LD, page metadata, crawl logging, and hosted wiki/blog pages.
5
5
 
6
6
  Requires the **App Router** (Next.js 15 or 16) with server rendering. Content and directives resolve on the
7
- server; your site token never reaches the browser.
7
+ server. Your site token never reaches the browser.
8
+
9
+ The front end reads **JSON over HTTPS** (`GET /v1/sites/{id}/pages`). MCP is a stdio wrapper of that same GET
10
+ for coding agents. Do not call MCP from React. Do not put the token in `NEXT_PUBLIC_*`.
8
11
 
9
12
  ## Install
10
13
 
@@ -19,6 +22,8 @@ IGNITE_SITE_ID=your-site-id
19
22
  IGNITE_SITE_TOKEN=your-site-token
20
23
  ```
21
24
 
25
+ Never `NEXT_PUBLIC_IGNITE_SITE_TOKEN`. Send the token as the `X-Ignite-Site-Token` header from the server only.
26
+
22
27
  Provision them from the CLI:
23
28
 
24
29
  ```bash
@@ -27,11 +32,12 @@ npx ignite connect --site-url https://yourdomain.com --email you@yourdomain.com
27
32
  npx ignite confirm --activation <activation_id> --code <email_code> # writes .env.local
28
33
  ```
29
34
 
30
- Or copy them from your Ignite workspace.
35
+ `confirm` mints a **read** token (`plugin_read`). It can fetch pages, directives, and send crawl events. It
36
+ cannot execute Action Center writes or proxy LLM spend.
31
37
 
32
38
  ## Wire it up
33
39
 
34
- Three files, each a one-line re-export:
40
+ Works with `app/` or `src/app/`.
35
41
 
36
42
  ```ts
37
43
  // app/robots.ts
@@ -43,6 +49,39 @@ export { default } from '@ignite-agent/agent/robots'
43
49
  export { default } from '@ignite-agent/agent/sitemap'
44
50
  ```
45
51
 
52
+ That file is `/sitemap.xml`. It unions Hub crawled URLs with **every published wiki and blog page**
53
+ from the feed (`/w/...`, `/blog/...`, plus `/w` and `/blog` indexes). Set `IGNITE_SITE_URL` so those
54
+ locs are absolute. If you already have a sitemap, do not replace it — merge:
55
+
56
+ ```ts
57
+ import igniteSitemap, { mergeSitemap } from '@ignite-agent/agent/sitemap'
58
+
59
+ export default async function sitemap() {
60
+ const local = await localSitemap()
61
+ return mergeSitemap(local, await igniteSitemap())
62
+ }
63
+ ```
64
+
65
+ ```ts
66
+ // app/w/[slug]/page.tsx
67
+ export { default, generateStaticParams, generateMetadata, revalidate } from '@ignite-agent/agent/wiki'
68
+ ```
69
+
70
+ ```ts
71
+ // app/w/page.tsx
72
+ export { WikiIndex as default, revalidate } from '@ignite-agent/agent/wiki'
73
+ ```
74
+
75
+ ```ts
76
+ // app/blog/[slug]/page.tsx
77
+ export { default, generateStaticParams, generateMetadata, revalidate } from '@ignite-agent/agent/blog'
78
+ ```
79
+
80
+ ```ts
81
+ // app/blog/page.tsx
82
+ export { BlogIndex as default, revalidate } from '@ignite-agent/agent/blog'
83
+ ```
84
+
46
85
  ```tsx
47
86
  // app/layout.tsx
48
87
  import { IgniteJsonLd } from '@ignite-agent/agent/jsonld'
@@ -72,28 +111,163 @@ export async function generateMetadata() {
72
111
  Crawler logging (optional, recommended):
73
112
 
74
113
  ```ts
75
- // proxy.ts (project root)
114
+ // Next 16 — proxy.ts at the project root
76
115
  export { proxy, config } from '@ignite-agent/agent/proxy'
116
+
117
+ // Next 15 — middleware.ts at the project root
118
+ export { middleware, config } from '@ignite-agent/agent/proxy'
77
119
  ```
78
120
 
79
- Or let the CLI write all of the above:
121
+ Or let the CLI write the files (and, when it finds `globals.css`, map brand variables):
80
122
 
81
123
  ```bash
82
124
  npx ignite init
125
+ npx ignite doctor
126
+ ```
127
+
128
+ Coding agents: paste the prompt in `onboarding/` for Claude Code, Cursor, Lovable, or Replit. `AGENTS.md` is the
129
+ source of truth.
130
+
131
+ ## How pages land
132
+
133
+ Approved wiki and article bodies live on Ignite. Your app fetches them on the server (`revalidate = 60`) and
134
+ renders the HTML in `FeedArticle`. Bots hit **your origin**, not the Ignite API. Unpublish in Ignite → the slug
135
+ 404s on the next fetch.
136
+
137
+ `FeedArticle` and `generateMetadata` use extra Hub fields when present: `author`, `image` / `images`,
138
+ `excerpt`, `datePublished`, `dateModified`, `lastReviewed`. Missing fields stay omitted (no invented person,
139
+ placeholder image, or bumped date). Per-page JSON-LD (`BlogPosting` / `WebPage`) is a sibling
140
+ `<script type="application/ld+json">` of the article — the Next.js App Router JSON-LD pattern. Site-level
141
+ `IgniteJsonLd` belongs in the root layout `<head>` (or the top of `<body>` if the layout has no `<head>`).
142
+
143
+ ### Absolute URLs (recommended)
144
+
145
+ Set one of these so canonical tags and JSON-LD become absolute:
146
+
147
+ ```
148
+ IGNITE_SITE_URL=https://yourdomain.com
149
+ # or
150
+ NEXT_PUBLIC_SITE_URL=https://yourdomain.com
151
+ ```
152
+
153
+ Prose CSS uses `<style href="ignite-ui" precedence="medium">` (hoisted and deduped). Injected styles are
154
+ on by default; to bundle the stylesheet yourself:
155
+
156
+ ```css
157
+ @import '@ignite-agent/agent/styles.css';
158
+ ```
159
+
160
+ then pass `injectCss={false}` to `IgniteFrame` / `IgniteProse`.
161
+
162
+ If this app already has `/blog` or `/w` pages, **do not replace them.** `npx ignite init` skips those files.
163
+ Wrap the existing route so local slugs keep winning and Hub pages occupy unused slugs. See
164
+ `onboarding/MIGRATE-EXISTING.md`.
165
+
166
+ Do not fetch the feed from a Client Component. Wrap the default export if you want your own layout:
167
+
168
+ ```tsx
169
+ import WikiPage, { generateStaticParams, generateMetadata, revalidate } from '@ignite-agent/agent/wiki'
170
+
171
+ export { generateStaticParams, generateMetadata, revalidate }
172
+
173
+ export default function Page(props: { params: Promise<{ slug: string }> }) {
174
+ return (
175
+ <main>
176
+ <WikiPage {...props} />
177
+ </main>
178
+ )
179
+ }
83
180
  ```
84
181
 
85
- ## Three ways to onboard
182
+ ## Brand tokens
183
+
184
+ Wiki and blog pages inherit the host brand through CSS variables. No `tokens` prop is required. Set these on
185
+ `:root` (or `.dark`) in your global CSS:
186
+
187
+ | Variable | Fallback |
188
+ |---|---|
189
+ | `--ignite-color-text` | `currentColor` |
190
+ | `--ignite-color-muted` | `#666` |
191
+ | `--ignite-color-primary` | `#2563eb` |
192
+ | `--ignite-color-border` | `#e5e5e5` |
193
+ | `--ignite-font-sans` | `system-ui, sans-serif` |
194
+ | `--ignite-font-heading` | the sans stack |
195
+ | `--ignite-radius` | `0.5rem` |
196
+ | `--ignite-prose-width` | `65ch` |
197
+ | `--ignite-space-scale` | `1` |
198
+
199
+ ### shadcn / Tailwind (HSL channels)
200
+
201
+ If `--foreground` is stored as `222.2 47.4% 11.2%` (no `hsl()`), wrap it:
202
+
203
+ ```css
204
+ :root {
205
+ --ignite-color-text: hsl(var(--foreground));
206
+ --ignite-color-muted: hsl(var(--muted-foreground));
207
+ --ignite-color-primary: hsl(var(--primary));
208
+ --ignite-color-border: hsl(var(--border));
209
+ --ignite-font-sans: var(--font-sans, system-ui, sans-serif);
210
+ --ignite-font-heading: var(--font-heading, var(--ignite-font-sans));
211
+ --ignite-radius: var(--radius, 0.5rem);
212
+ }
213
+ ```
214
+
215
+ ### Full color values (oklch, hex, rgb)
216
+
217
+ If `--foreground` is already a color, map it directly:
218
+
219
+ ```css
220
+ :root {
221
+ --ignite-color-text: var(--foreground);
222
+ --ignite-color-muted: var(--muted-foreground);
223
+ --ignite-color-primary: var(--primary);
224
+ --ignite-color-border: var(--border);
225
+ --ignite-font-sans: var(--font-body, system-ui, sans-serif);
226
+ --ignite-font-heading: var(--font-heading, var(--ignite-font-sans));
227
+ --ignite-radius: var(--radius);
228
+ }
229
+ ```
86
230
 
87
- - **Self-serve.** `npm install`, set the two env vars, run `npx ignite init`, deploy.
88
- - **With a coding agent.** Hand `onboarding/CLAUDE-CODE-SETUP.md` to Claude Code (or similar) in your repo; it
89
- installs, wires the files, and verifies the build.
90
- - **Managed.** The Ignite team does the setup in your repo for you.
231
+ `npx ignite init` detects shadcn vs Tailwind vs raw colors and writes a mapping when `globals.css` exists.
232
+
233
+ Dark mode follows the host `color-scheme` and your variables. Changing the host variables changes Ignite pages
234
+ with no extra CSS.
235
+
236
+ ### Programmatic tokens
237
+
238
+ ```tsx
239
+ import { FeedArticle, IgniteProse, IgniteTokensProvider } from '@ignite-agent/agent'
240
+
241
+ <IgniteTokensProvider tokens={{ colorPrimary: '#f19254', fontSans: 'Cairo, sans-serif' }}>
242
+ <FeedArticle page={page} />
243
+ </IgniteTokensProvider>
244
+ ```
245
+
246
+ Or pass `tokens` on `FeedArticle`, `IgniteProse`, `BlogIndex`, or `WikiIndex`.
247
+
248
+ ## Exports
249
+
250
+ ```ts
251
+ export { default, generateStaticParams, generateMetadata, revalidate, WikiIndex, FeedArticle, IgniteProse, pageJsonLd, tryLoadFeedPage, mergeSlugs } from '@ignite-agent/agent/wiki'
252
+ export { default, generateStaticParams, generateMetadata, revalidate, BlogIndex, FeedArticle, IgniteProse, pageJsonLd, tryLoadFeedPage, mergeSlugs } from '@ignite-agent/agent/blog'
253
+ export { FeedArticle, IgniteProse, IgniteTokensProvider, BlogIndex, WikiIndex, pageJsonLd, tryLoadFeedPage, mergeSlugs } from '@ignite-agent/agent'
254
+ ```
255
+
256
+ ## MCP (coding agents only)
257
+
258
+ ```bash
259
+ npx ignite mcp
260
+ ```
261
+
262
+ stdio tools: `list_pages`, `get_page`, `get_directives`. Same read token. No writes. Point Claude Code / Cursor
263
+ at this command. The Next.js app does not speak MCP.
91
264
 
92
265
  ## How it degrades
93
266
 
94
267
  Ignite is additive. If the SDK is unconfigured or the Ignite API is unreachable, `robots` falls back to
95
268
  allow-all, `sitemap` returns empty, JSON-LD renders nothing, and `metadata` returns `{}` — your app's own
96
- defaults stand. It never blocks a build or a crawler by accident.
269
+ defaults stand. A missing page 404s. A Hub outage on a cached page keeps the last ISR copy. Wiki/blog indexes
270
+ render nothing when the feed is empty.
97
271
 
98
272
  ## Environment
99
273
 
@@ -102,3 +276,11 @@ defaults stand. It never blocks a build or a crawler by accident.
102
276
  | `IGNITE_SITE_ID` | yes | — |
103
277
  | `IGNITE_SITE_TOKEN` | yes | — |
104
278
  | `IGNITE_HUB_URL` | no | `https://app.igniteagent.ai` |
279
+ | `IGNITE_SITE_URL` | no | public origin for canonical + JSON-LD (e.g. `https://www.example.com`). Falls back to `NEXT_PUBLIC_SITE_URL` or `VERCEL_PROJECT_PRODUCTION_URL`. |
280
+
281
+ ## License
282
+
283
+ MIT for ordinary software use (install, modify, ship as a dependency of your site), plus an additional
284
+ reservation: you may not use this source to train, fine-tune, or improve AI/ML models, including LLMs. That
285
+ reservation is an EU Directive 2019/790 Art. 4 opt-out. This is **not** OSI MIT in isolation. See `LICENSE`
286
+ and `AI.txt`.
package/dist/cli/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
3
3
  import { dirname, join } from 'node:path';
4
+ import { brandCssSnippet, detectDesignSystem, diagnoseProject, findGlobalsCss, hostOwnedContentRoutes, injectBrandCss, inspectRouteFile, loadEnvFile, migrateExistingSnippet, migrateSitemapSnippet, resolveAppDir, ROUTE_SOURCES, } from './project.js';
4
5
  const HUB_URL = (process.env.IGNITE_HUB_URL?.trim() || 'https://app.igniteagent.ai').replace(/\/+$/, '');
5
6
  function write(path, contents) {
6
7
  if (existsSync(path)) {
@@ -11,35 +12,114 @@ function write(path, contents) {
11
12
  writeFileSync(path, contents);
12
13
  console.log(` write ${path}`);
13
14
  }
15
+ function nextMajor(cwd) {
16
+ try {
17
+ const pkg = JSON.parse(readFileSync(join(cwd, 'package.json'), 'utf8'));
18
+ const raw = pkg.dependencies?.next ?? pkg.devDependencies?.next ?? '';
19
+ const match = raw.match(/(\d+)/);
20
+ return match ? Number(match[1]) : 16;
21
+ }
22
+ catch {
23
+ return 16;
24
+ }
25
+ }
26
+ function rel(cwd, path) {
27
+ return path.startsWith(cwd) ? path.slice(cwd.length + 1) : path;
28
+ }
14
29
  function init() {
15
30
  const cwd = process.cwd();
16
- if (!existsSync(join(cwd, 'app'))) {
17
- console.error('No app/ directory found. Run this from the root of a Next.js App Router project.');
31
+ const appDir = resolveAppDir(cwd);
32
+ if (!appDir) {
33
+ console.error('No app/ or src/app/ directory found. Run this from the root of a Next.js App Router project.');
18
34
  process.exit(1);
19
35
  }
20
- write(join(cwd, 'app/robots.ts'), `export { default } from '@ignite-agent/agent/robots'\n`);
21
- write(join(cwd, 'app/sitemap.ts'), `export { default } from '@ignite-agent/agent/sitemap'\n`);
22
- write(join(cwd, 'proxy.ts'), `export { proxy, config } from '@ignite-agent/agent/proxy'\n`);
23
- console.log('\nAdd <IgniteJsonLd /> to app/layout.tsx:');
36
+ write(join(appDir, 'robots.ts'), ROUTE_SOURCES.robots);
37
+ write(join(appDir, 'sitemap.ts'), ROUTE_SOURCES.sitemap);
38
+ write(join(appDir, 'w/[slug]/page.tsx'), ROUTE_SOURCES.wikiPage);
39
+ write(join(appDir, 'w/page.tsx'), ROUTE_SOURCES.wikiIndex);
40
+ write(join(appDir, 'blog/[slug]/page.tsx'), ROUTE_SOURCES.blogPage);
41
+ write(join(appDir, 'blog/page.tsx'), ROUTE_SOURCES.blogIndex);
42
+ if (nextMajor(cwd) <= 15) {
43
+ write(join(cwd, 'middleware.ts'), ROUTE_SOURCES.middleware);
44
+ }
45
+ else {
46
+ write(join(cwd, 'proxy.ts'), ROUTE_SOURCES.proxy);
47
+ }
48
+ const design = detectDesignSystem(cwd);
49
+ const cssPath = findGlobalsCss(cwd, appDir);
50
+ const snippet = brandCssSnippet(cssPath ? readFileSync(cssPath, 'utf8') : null, design);
51
+ if (cssPath) {
52
+ const result = injectBrandCss(cssPath, snippet);
53
+ console.log(result === 'wrote' ? ` write ${rel(cwd, cssPath)} (--ignite-* variables)` : ` skip ${rel(cwd, cssPath)} (already has --ignite-* variables)`);
54
+ }
55
+ else {
56
+ console.log('\nNo globals.css found. Add these variables to your global CSS so wiki/blog pages inherit your brand:');
57
+ console.log(snippet);
58
+ }
59
+ if (design === 'shadcn') {
60
+ console.log('Detected shadcn/ui. Mapped --ignite-* from --foreground/--primary. If those are raw HSL channels, keep the hsl() wrappers.');
61
+ }
62
+ else if (design === 'tailwind') {
63
+ console.log('Detected Tailwind. Mapped --ignite-* from common theme variables when present.');
64
+ }
65
+ console.log('\nAdd <IgniteJsonLd /> to app/layout.tsx (or src/app/layout.tsx):');
24
66
  console.log(` import { IgniteJsonLd } from '@ignite-agent/agent/jsonld' // then render <IgniteJsonLd /> in <head>`);
67
+ console.log('\nOptional layout wrapper (keep it a Server Component):');
68
+ console.log(` import WikiPage, { generateStaticParams, generateMetadata, revalidate } from '@ignite-agent/agent/wiki'`);
69
+ console.log(` export { generateStaticParams, generateMetadata, revalidate }`);
70
+ console.log(` export default function Page(props: { params: Promise<{ slug: string }> }) {`);
71
+ console.log(` return <main><WikiPage {...props} /></main>`);
72
+ console.log(` }`);
73
+ const hostRoutes = hostOwnedContentRoutes(appDir);
74
+ if (hostRoutes.length > 0) {
75
+ console.log('\nExisting blog/wiki routes were left untouched (never overwritten).');
76
+ console.log('Wrap them so local slugs keep winning and Hub pages fill the gaps:');
77
+ const printed = new Set();
78
+ for (const route of hostRoutes) {
79
+ const kind = route.kind === 'wiki' || route.kind === 'wiki-index' ? 'wiki' : 'blog';
80
+ if (printed.has(kind))
81
+ continue;
82
+ printed.add(kind);
83
+ console.log(`\n--- ${kind} (${route.rel}) ---\n${migrateExistingSnippet(kind)}`);
84
+ }
85
+ console.log('Full notes: onboarding/MIGRATE-EXISTING.md');
86
+ }
87
+ if (inspectRouteFile(join(appDir, 'sitemap.ts')) === 'host') {
88
+ console.log('\nExisting sitemap.ts was left untouched. Merge wiki/blog URLs in:');
89
+ console.log(migrateSitemapSnippet());
90
+ }
25
91
  console.log('\nSet IGNITE_SITE_ID and IGNITE_SITE_TOKEN in .env.local and in your host, then deploy.');
92
+ console.log('Keep IGNITE_SITE_TOKEN on the server. Never prefix it with NEXT_PUBLIC_.');
26
93
  }
27
94
  async function doctor() {
28
- const siteId = process.env.IGNITE_SITE_ID?.trim();
29
- const token = process.env.IGNITE_SITE_TOKEN?.trim();
30
- if (!siteId || !token) {
31
- console.error('Missing IGNITE_SITE_ID or IGNITE_SITE_TOKEN. Run `ignite connect` or set them in your env.');
32
- process.exit(1);
95
+ const cwd = process.cwd();
96
+ const env = { ...process.env };
97
+ loadEnvFile(join(cwd, '.env.local'), env);
98
+ const findings = diagnoseProject(cwd, env);
99
+ for (const finding of findings) {
100
+ const tag = finding.level === 'ok' ? 'ok ' : finding.level === 'warn' ? 'warn' : 'fail';
101
+ console.log(`${tag} ${finding.message}`);
33
102
  }
103
+ const failed = findings.some((finding) => finding.level === 'fail');
104
+ if (failed)
105
+ process.exit(1);
106
+ const siteId = env.IGNITE_SITE_ID?.trim();
107
+ const token = env.IGNITE_SITE_TOKEN?.trim();
108
+ const hubUrl = (env.IGNITE_HUB_URL?.trim() || HUB_URL).replace(/\/+$/, '');
109
+ if (!siteId || !token)
110
+ process.exit(1);
34
111
  try {
35
- const res = await fetch(`${HUB_URL}/v1/sites/${siteId}/agent-directives`, {
36
- headers: { 'X-Ignite-Site-Token': token },
37
- });
38
- console.log(res.ok ? `ok reached ${HUB_URL} (HTTP ${res.status})` : `fail HTTP ${res.status} from ${HUB_URL}`);
39
- process.exit(res.ok ? 0 : 1);
112
+ const headers = { 'X-Ignite-Site-Token': token };
113
+ const directives = await fetch(`${hubUrl}/v1/sites/${siteId}/agent-directives`, { headers });
114
+ const pages = await fetch(`${hubUrl}/v1/sites/${siteId}/pages`, { headers });
115
+ const ok = directives.ok && pages.ok;
116
+ console.log(ok
117
+ ? `ok reached ${hubUrl} (directives ${directives.status}, pages ${pages.status})`
118
+ : `fail HTTP directives ${directives.status} pages ${pages.status} from ${hubUrl}`);
119
+ process.exit(ok ? 0 : 1);
40
120
  }
41
121
  catch (error) {
42
- console.error(`fail could not reach ${HUB_URL}: ${error.message}`);
122
+ console.error(`fail could not reach ${hubUrl}: ${error.message}`);
43
123
  process.exit(1);
44
124
  }
45
125
  }
@@ -80,7 +160,7 @@ async function confirm() {
80
160
  const res = await fetch(`${HUB_URL}/v1/activate/confirm`, {
81
161
  method: 'POST',
82
162
  headers: { 'Content-Type': 'application/json' },
83
- body: JSON.stringify({ activation_id: activationId, email_code: code }),
163
+ body: JSON.stringify({ activation_id: activationId, email_code: code, client: 'nextjs' }),
84
164
  });
85
165
  const body = await res.json().catch(() => ({}));
86
166
  if (!res.ok || !body.token || !body.site_id) {
@@ -125,11 +205,15 @@ switch (command) {
125
205
  case 'confirm':
126
206
  void confirm();
127
207
  break;
208
+ case 'mcp':
209
+ void import('../mcp.js').then((mod) => mod.runMcpStdio());
210
+ break;
128
211
  default:
129
- console.log('Usage: ignite <init|connect|confirm|doctor>');
130
- console.log(' init write app/robots.ts, app/sitemap.ts, proxy.ts');
212
+ console.log('Usage: ignite <init|connect|confirm|doctor|mcp>');
213
+ console.log(' init write robots, sitemap, wiki/blog routes, proxy or middleware, brand CSS if possible');
131
214
  console.log(' connect start the site activation handshake (--site-url --email)');
132
215
  console.log(' confirm finish activation and write .env.local (--activation --code)');
133
- console.log(' doctor check config and reach the Ignite API');
216
+ console.log(' doctor check config, routes, token placement, and reach the Ignite API');
217
+ console.log(' mcp stdio MCP for coding agents (reads the same feed; not for the front end)');
134
218
  }
135
219
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ export type DesignSystem = 'shadcn' | 'tailwind' | 'unknown';
2
+ export type DoctorFinding = {
3
+ level: 'ok' | 'warn' | 'fail';
4
+ message: string;
5
+ };
6
+ export declare const ROUTE_SOURCES: {
7
+ readonly robots: "export { default } from '@ignite-agent/agent/robots'\n";
8
+ readonly sitemap: "export { default } from '@ignite-agent/agent/sitemap'\n";
9
+ readonly wikiPage: "export { default, generateStaticParams, generateMetadata, revalidate } from '@ignite-agent/agent/wiki'\n";
10
+ readonly wikiIndex: "export { WikiIndex as default, revalidate } from '@ignite-agent/agent/wiki'\n";
11
+ readonly blogPage: "export { default, generateStaticParams, generateMetadata, revalidate } from '@ignite-agent/agent/blog'\n";
12
+ readonly blogIndex: "export { BlogIndex as default, revalidate } from '@ignite-agent/agent/blog'\n";
13
+ readonly middleware: "export { middleware, config } from '@ignite-agent/agent/proxy'\n";
14
+ readonly proxy: "export { proxy, config } from '@ignite-agent/agent/proxy'\n";
15
+ };
16
+ export declare function resolveAppDir(cwd: string): string | null;
17
+ export declare function detectDesignSystem(cwd: string): DesignSystem;
18
+ export declare function findGlobalsCss(cwd: string, appDir: string): string | null;
19
+ export declare function loadEnvFile(path: string, env: NodeJS.Dict<string>): void;
20
+ export declare function brandCssSnippet(globalsCss: string | null, design: DesignSystem): string;
21
+ export type RouteOwner = 'missing' | 'ignite' | 'host';
22
+ export declare function inspectRouteFile(path: string): RouteOwner;
23
+ export declare function migrateSitemapSnippet(): string;
24
+ export declare function hostOwnedContentRoutes(appDir: string): Array<{
25
+ rel: string;
26
+ kind: 'blog' | 'wiki' | 'blog-index' | 'wiki-index';
27
+ }>;
28
+ export declare function migrateExistingSnippet(kind: 'blog' | 'wiki'): string;
29
+ export declare function injectBrandCss(cssPath: string, snippet: string): 'wrote' | 'skipped';
30
+ export declare function diagnoseProject(cwd: string, env: NodeJS.Dict<string>): DoctorFinding[];
31
+ export declare function colorMapping(globalsCss: string | null, design: DesignSystem): {
32
+ text: string;
33
+ muted: string;
34
+ primary: string;
35
+ border: string;
36
+ fontSans: string;
37
+ fontHeading: string;
38
+ radius: string;
39
+ };