@ignite-agent/agent 0.1.0 → 0.1.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 (44) hide show
  1. package/README.md +38 -13
  2. package/dist/cli/index.js +36 -9
  3. package/dist/cli/index.js.map +1 -1
  4. package/dist/client-public.d.ts +2 -0
  5. package/dist/client-public.js +3 -0
  6. package/dist/client-public.js.map +1 -0
  7. package/dist/client.d.ts +3 -1
  8. package/dist/client.js +7 -0
  9. package/dist/client.js.map +1 -1
  10. package/dist/env.js +1 -2
  11. package/dist/env.js.map +1 -1
  12. package/dist/index.d.ts +2 -1
  13. package/dist/index.js +1 -0
  14. package/dist/index.js.map +1 -1
  15. package/dist/mcp.d.ts +22 -0
  16. package/dist/mcp.js +88 -0
  17. package/dist/mcp.js.map +1 -0
  18. package/dist/operator/blog.d.ts +16 -0
  19. package/dist/operator/blog.js +27 -0
  20. package/dist/operator/blog.js.map +1 -0
  21. package/dist/operator/jsonld.d.ts +1 -0
  22. package/dist/operator/jsonld.js +1 -0
  23. package/dist/operator/jsonld.js.map +1 -1
  24. package/dist/operator/metadata.d.ts +1 -0
  25. package/dist/operator/metadata.js +1 -0
  26. package/dist/operator/metadata.js.map +1 -1
  27. package/dist/operator/page.d.ts +8 -0
  28. package/dist/operator/page.js +34 -0
  29. package/dist/operator/page.js.map +1 -0
  30. package/dist/operator/proxy.d.ts +2 -0
  31. package/dist/operator/proxy.js +43 -22
  32. package/dist/operator/proxy.js.map +1 -1
  33. package/dist/operator/robots.d.ts +1 -0
  34. package/dist/operator/robots.js +1 -0
  35. package/dist/operator/robots.js.map +1 -1
  36. package/dist/operator/sitemap.d.ts +1 -0
  37. package/dist/operator/sitemap.js +1 -0
  38. package/dist/operator/sitemap.js.map +1 -1
  39. package/dist/operator/wiki.d.ts +15 -0
  40. package/dist/operator/wiki.js +21 -0
  41. package/dist/operator/wiki.js.map +1 -0
  42. package/dist/types.d.ts +14 -0
  43. package/onboarding/CLAUDE-CODE-SETUP.md +21 -3
  44. package/package.json +26 -7
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
 
@@ -27,12 +30,11 @@ npx ignite connect --site-url https://yourdomain.com --email you@yourdomain.com
27
30
  npx ignite confirm --activation <activation_id> --code <email_code> # writes .env.local
28
31
  ```
29
32
 
30
- Or copy them from your Ignite workspace.
33
+ `confirm` mints a **read** token (`plugin_read`). It can fetch pages, directives, and send crawl events. It
34
+ cannot execute Action Center writes or proxy LLM spend.
31
35
 
32
36
  ## Wire it up
33
37
 
34
- Three files, each a one-line re-export:
35
-
36
38
  ```ts
37
39
  // app/robots.ts
38
40
  export { default } from '@ignite-agent/agent/robots'
@@ -43,6 +45,16 @@ export { default } from '@ignite-agent/agent/robots'
43
45
  export { default } from '@ignite-agent/agent/sitemap'
44
46
  ```
45
47
 
48
+ ```ts
49
+ // app/w/[slug]/page.tsx
50
+ export { default, generateStaticParams, generateMetadata, revalidate } from '@ignite-agent/agent/wiki'
51
+ ```
52
+
53
+ ```ts
54
+ // app/blog/[slug]/page.tsx
55
+ export { default, generateStaticParams, generateMetadata, revalidate } from '@ignite-agent/agent/blog'
56
+ ```
57
+
46
58
  ```tsx
47
59
  // app/layout.tsx
48
60
  import { IgniteJsonLd } from '@ignite-agent/agent/jsonld'
@@ -72,28 +84,41 @@ export async function generateMetadata() {
72
84
  Crawler logging (optional, recommended):
73
85
 
74
86
  ```ts
75
- // proxy.ts (project root)
87
+ // Next 16 — proxy.ts at the project root
76
88
  export { proxy, config } from '@ignite-agent/agent/proxy'
89
+
90
+ // Next 15 — middleware.ts at the project root
91
+ export { middleware, config } from '@ignite-agent/agent/proxy'
77
92
  ```
78
93
 
79
- Or let the CLI write all of the above:
94
+ Or let the CLI write the files:
80
95
 
81
96
  ```bash
82
97
  npx ignite init
83
98
  ```
84
99
 
85
- ## Three ways to onboard
100
+ ## How pages land
101
+
102
+ Approved wiki and article bodies live on Ignite. Your app fetches them on the server (`revalidate = 60`) and
103
+ renders the HTML. Bots hit **your origin**, not the Ignite API. Unpublish in Ignite → the slug 404s on the
104
+ next fetch.
105
+
106
+ You can wrap `FeedArticle` later if you want your own layout. Do not fetch the feed from a Client Component.
107
+
108
+ ## MCP (coding agents only)
109
+
110
+ ```bash
111
+ npx ignite mcp
112
+ ```
86
113
 
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.
114
+ stdio tools: `list_pages`, `get_page`, `get_directives`. Same read token. No writes. Point Claude Code / Cursor
115
+ at this command. The Next.js app does not speak MCP.
91
116
 
92
117
  ## How it degrades
93
118
 
94
119
  Ignite is additive. If the SDK is unconfigured or the Ignite API is unreachable, `robots` falls back to
95
120
  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.
121
+ defaults stand. A missing page 404s. A Hub outage on a cached page keeps the last ISR copy.
97
122
 
98
123
  ## Environment
99
124
 
package/dist/cli/index.js CHANGED
@@ -11,6 +11,17 @@ function write(path, contents) {
11
11
  writeFileSync(path, contents);
12
12
  console.log(` write ${path}`);
13
13
  }
14
+ function nextMajor(cwd) {
15
+ try {
16
+ const pkg = JSON.parse(readFileSync(join(cwd, 'package.json'), 'utf8'));
17
+ const raw = pkg.dependencies?.next ?? pkg.devDependencies?.next ?? '';
18
+ const match = raw.match(/(\d+)/);
19
+ return match ? Number(match[1]) : 16;
20
+ }
21
+ catch {
22
+ return 16;
23
+ }
24
+ }
14
25
  function init() {
15
26
  const cwd = process.cwd();
16
27
  if (!existsSync(join(cwd, 'app'))) {
@@ -19,10 +30,19 @@ function init() {
19
30
  }
20
31
  write(join(cwd, 'app/robots.ts'), `export { default } from '@ignite-agent/agent/robots'\n`);
21
32
  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`);
33
+ write(join(cwd, 'app/w/[slug]/page.tsx'), `export { default, generateStaticParams, generateMetadata, revalidate } from '@ignite-agent/agent/wiki'\n`);
34
+ write(join(cwd, 'app/blog/[slug]/page.tsx'), `export { default, generateStaticParams, generateMetadata, revalidate } from '@ignite-agent/agent/blog'\n`);
35
+ write(join(cwd, 'app/blog/page.tsx'), `export { BlogIndex as default, revalidate } from '@ignite-agent/agent/blog'\n`);
36
+ if (nextMajor(cwd) <= 15) {
37
+ write(join(cwd, 'middleware.ts'), `export { middleware, config } from '@ignite-agent/agent/proxy'\n`);
38
+ }
39
+ else {
40
+ write(join(cwd, 'proxy.ts'), `export { proxy, config } from '@ignite-agent/agent/proxy'\n`);
41
+ }
23
42
  console.log('\nAdd <IgniteJsonLd /> to app/layout.tsx:');
24
43
  console.log(` import { IgniteJsonLd } from '@ignite-agent/agent/jsonld' // then render <IgniteJsonLd /> in <head>`);
25
44
  console.log('\nSet IGNITE_SITE_ID and IGNITE_SITE_TOKEN in .env.local and in your host, then deploy.');
45
+ console.log('Keep IGNITE_SITE_TOKEN on the server. Never prefix it with NEXT_PUBLIC_.');
26
46
  }
27
47
  async function doctor() {
28
48
  const siteId = process.env.IGNITE_SITE_ID?.trim();
@@ -32,11 +52,14 @@ async function doctor() {
32
52
  process.exit(1);
33
53
  }
34
54
  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);
55
+ const headers = { 'X-Ignite-Site-Token': token };
56
+ const directives = await fetch(`${HUB_URL}/v1/sites/${siteId}/agent-directives`, { headers });
57
+ const pages = await fetch(`${HUB_URL}/v1/sites/${siteId}/pages`, { headers });
58
+ const ok = directives.ok && pages.ok;
59
+ console.log(ok
60
+ ? `ok reached ${HUB_URL} (directives ${directives.status}, pages ${pages.status})`
61
+ : `fail HTTP directives ${directives.status} pages ${pages.status} from ${HUB_URL}`);
62
+ process.exit(ok ? 0 : 1);
40
63
  }
41
64
  catch (error) {
42
65
  console.error(`fail could not reach ${HUB_URL}: ${error.message}`);
@@ -80,7 +103,7 @@ async function confirm() {
80
103
  const res = await fetch(`${HUB_URL}/v1/activate/confirm`, {
81
104
  method: 'POST',
82
105
  headers: { 'Content-Type': 'application/json' },
83
- body: JSON.stringify({ activation_id: activationId, email_code: code }),
106
+ body: JSON.stringify({ activation_id: activationId, email_code: code, client: 'nextjs' }),
84
107
  });
85
108
  const body = await res.json().catch(() => ({}));
86
109
  if (!res.ok || !body.token || !body.site_id) {
@@ -125,11 +148,15 @@ switch (command) {
125
148
  case 'confirm':
126
149
  void confirm();
127
150
  break;
151
+ case 'mcp':
152
+ void import('../mcp.js').then((mod) => mod.runMcpStdio());
153
+ break;
128
154
  default:
129
- console.log('Usage: ignite <init|connect|confirm|doctor>');
130
- console.log(' init write app/robots.ts, app/sitemap.ts, proxy.ts');
155
+ console.log('Usage: ignite <init|connect|confirm|doctor|mcp>');
156
+ console.log(' init write robots, sitemap, wiki/blog routes, proxy or middleware');
131
157
  console.log(' connect start the site activation handshake (--site-url --email)');
132
158
  console.log(' confirm finish activation and write .env.local (--activation --code)');
133
159
  console.log(' doctor check config and reach the Ignite API');
160
+ console.log(' mcp stdio MCP for coding agents (reads the same feed; not for the front end)');
134
161
  }
135
162
  //# 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,2 @@
1
+ import 'server-only';
2
+ export { IgniteClient, IgniteApiError, type ClientOptions, type CrawlEvent, } from './client.js';
@@ -0,0 +1,3 @@
1
+ import 'server-only';
2
+ export { IgniteClient, IgniteApiError, } from './client.js';
3
+ //# sourceMappingURL=client-public.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-public.js","sourceRoot":"","sources":["../src/client-public.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAC;AAErB,OAAO,EACL,YAAY,EACZ,cAAc,GAGf,MAAM,aAAa,CAAC"}
package/dist/client.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { type IgniteConfig } from './env.js';
2
- import type { AgentDirectives } from './types.js';
2
+ import type { AgentDirectives, FeedIndex, FeedPage } from './types.js';
3
3
  export declare class IgniteApiError extends Error {
4
4
  readonly status: number;
5
5
  readonly path: string;
@@ -15,6 +15,8 @@ export declare class IgniteClient {
15
15
  static fromEnv(options?: ClientOptions): IgniteClient;
16
16
  static fromEnvOrNull(options?: ClientOptions): IgniteClient | null;
17
17
  directives(): Promise<AgentDirectives>;
18
+ pages(): Promise<FeedIndex>;
19
+ page(slug: string): Promise<FeedPage>;
18
20
  recordCrawlEvents(events: CrawlEvent[]): Promise<void>;
19
21
  private site;
20
22
  private get;
package/dist/client.js CHANGED
@@ -27,6 +27,13 @@ export class IgniteClient {
27
27
  async directives() {
28
28
  return this.get('/agent-directives');
29
29
  }
30
+ async pages() {
31
+ return this.get('/pages');
32
+ }
33
+ async page(slug) {
34
+ const body = await this.get(`/pages/${encodeURIComponent(slug)}`);
35
+ return body.page;
36
+ }
30
37
  async recordCrawlEvents(events) {
31
38
  if (events.length === 0)
32
39
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/env.js CHANGED
@@ -5,8 +5,7 @@ export class IgniteConfigError extends Error {
5
5
  this.name = 'IgniteConfigError';
6
6
  }
7
7
  }
8
- // The token can mutate the site, so it must stay server-side. Reading process.env here means a `'use client'`
9
- // module that imports it fails to build, which is intended.
8
+ // The token is a Hub credential. `server-only` fails the build if a client component imports this file.
10
9
  export function readConfig() {
11
10
  const token = process.env.IGNITE_SITE_TOKEN?.trim();
12
11
  const siteId = process.env.IGNITE_SITE_ID?.trim();
package/dist/env.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAMA,MAAM,eAAe,GAAG,4BAA4B,CAAC;AAErD,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAC1C,YAAY,OAAe;QACzB,KAAK,CAAC,yBAAyB,OAAO,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED,8GAA8G;AAC9G,4DAA4D;AAC5D,MAAM,UAAU,UAAU;IACxB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC;IACpD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC;IAClD,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEnC,OAAO;QACL,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,eAAe,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QACnF,MAAM;QACN,KAAK;KACN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,iBAAiB,CACzB,gGAAgG,CACjG,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAMA,MAAM,eAAe,GAAG,4BAA4B,CAAC;AAErD,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAC1C,YAAY,OAAe;QACzB,KAAK,CAAC,yBAAyB,OAAO,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED,wGAAwG;AACxG,MAAM,UAAU,UAAU;IACxB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC;IACpD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC;IAClD,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEnC,OAAO;QACL,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,eAAe,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QACnF,MAAM;QACN,KAAK;KACN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,iBAAiB,CACzB,gGAAgG,CACjG,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
+ import 'server-only';
1
2
  export { IgniteClient, IgniteApiError, type ClientOptions, type CrawlEvent } from './client.js';
2
3
  export { readConfig, requireConfig, IgniteConfigError, type IgniteConfig } from './env.js';
3
- export type { AgentDirectives, RobotsDirective, SitemapEntry, MetadataDirective, Measured, RateCI, } from './types.js';
4
+ export type { AgentDirectives, RobotsDirective, SitemapEntry, MetadataDirective, FeedPage, FeedIndex, Measured, RateCI, } from './types.js';
4
5
  export { default as robots } from './operator/robots.js';
5
6
  export { default as sitemap } from './operator/sitemap.js';
6
7
  export { IgniteJsonLd } from './operator/jsonld.js';
package/dist/index.js CHANGED
@@ -1,3 +1,4 @@
1
+ import 'server-only';
1
2
  export { IgniteClient, IgniteApiError } from './client.js';
2
3
  export { readConfig, requireConfig, IgniteConfigError } from './env.js';
3
4
  export { default as robots } from './operator/robots.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAuC,MAAM,aAAa,CAAC;AAChG,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,iBAAiB,EAAqB,MAAM,UAAU,CAAC;AAU3F,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAC;AAErB,OAAO,EAAE,YAAY,EAAE,cAAc,EAAuC,MAAM,aAAa,CAAC;AAChG,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,iBAAiB,EAAqB,MAAM,UAAU,CAAC;AAY3F,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC"}
package/dist/mcp.d.ts ADDED
@@ -0,0 +1,22 @@
1
+ import { IgniteClient } from './client.js';
2
+ type JsonRpc = {
3
+ jsonrpc: '2.0';
4
+ id?: string | number | null;
5
+ method?: string;
6
+ params?: {
7
+ name?: string;
8
+ arguments?: Record<string, unknown>;
9
+ };
10
+ };
11
+ type JsonRpcResponse = {
12
+ jsonrpc: '2.0';
13
+ id: string | number | null;
14
+ result?: unknown;
15
+ error?: {
16
+ code: number;
17
+ message: string;
18
+ };
19
+ };
20
+ export declare function handleMcp(msg: JsonRpc, client: IgniteClient): Promise<JsonRpcResponse | null>;
21
+ export declare function runMcpStdio(): Promise<void>;
22
+ export {};
package/dist/mcp.js ADDED
@@ -0,0 +1,88 @@
1
+ import { createInterface } from 'node:readline';
2
+ import { IgniteClient } from './client.js';
3
+ const TOOLS = [
4
+ {
5
+ name: 'list_pages',
6
+ description: 'List published wiki and blog pages from the Ignite feed (no drafts).',
7
+ inputSchema: { type: 'object', properties: {}, additionalProperties: false },
8
+ },
9
+ {
10
+ name: 'get_page',
11
+ description: 'Fetch one published page body by slug.',
12
+ inputSchema: {
13
+ type: 'object',
14
+ properties: { slug: { type: 'string' } },
15
+ required: ['slug'],
16
+ additionalProperties: false,
17
+ },
18
+ },
19
+ {
20
+ name: 'get_directives',
21
+ description: 'Fetch robots, sitemap, JSON-LD, and metadata directives for this site.',
22
+ inputSchema: { type: 'object', properties: {}, additionalProperties: false },
23
+ },
24
+ ];
25
+ export async function handleMcp(msg, client) {
26
+ if (msg.id === undefined || msg.id === null)
27
+ return null;
28
+ const id = msg.id;
29
+ try {
30
+ switch (msg.method) {
31
+ case 'initialize':
32
+ return {
33
+ jsonrpc: '2.0',
34
+ id,
35
+ result: {
36
+ protocolVersion: '2024-11-05',
37
+ capabilities: { tools: {} },
38
+ serverInfo: { name: 'ignite-feed', version: '0.1.1' },
39
+ },
40
+ };
41
+ case 'tools/list':
42
+ return { jsonrpc: '2.0', id, result: { tools: TOOLS } };
43
+ case 'tools/call':
44
+ return { jsonrpc: '2.0', id, result: await callTool(client, msg.params) };
45
+ case 'notifications/initialized':
46
+ case 'ping':
47
+ return { jsonrpc: '2.0', id, result: {} };
48
+ default:
49
+ return { jsonrpc: '2.0', id, error: { code: -32601, message: `Unknown method ${msg.method ?? ''}` } };
50
+ }
51
+ }
52
+ catch (error) {
53
+ return { jsonrpc: '2.0', id, error: { code: -32000, message: error.message } };
54
+ }
55
+ }
56
+ async function callTool(client, params) {
57
+ const name = params?.name ?? '';
58
+ const args = params?.arguments ?? {};
59
+ let payload;
60
+ if (name === 'list_pages')
61
+ payload = await client.pages();
62
+ else if (name === 'get_page')
63
+ payload = await client.page(String(args.slug ?? ''));
64
+ else if (name === 'get_directives')
65
+ payload = await client.directives();
66
+ else
67
+ throw new Error(`Unknown tool ${name}`);
68
+ return { content: [{ type: 'text', text: JSON.stringify(payload) }] };
69
+ }
70
+ export async function runMcpStdio() {
71
+ const client = IgniteClient.fromEnv();
72
+ const rl = createInterface({ input: process.stdin });
73
+ for await (const line of rl) {
74
+ if (!line.trim())
75
+ continue;
76
+ let msg;
77
+ try {
78
+ msg = JSON.parse(line);
79
+ }
80
+ catch {
81
+ continue;
82
+ }
83
+ const res = await handleMcp(msg, client);
84
+ if (res)
85
+ process.stdout.write(`${JSON.stringify(res)}\n`);
86
+ }
87
+ }
88
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import 'server-only';
2
+ import { revalidate } from './page.js';
3
+ export { revalidate };
4
+ type SlugParams = {
5
+ params: Promise<{
6
+ slug: string;
7
+ }>;
8
+ };
9
+ export declare function generateStaticParams(): Promise<Array<{
10
+ slug: string;
11
+ }>>;
12
+ export declare function generateMetadata({ params }: SlugParams): Promise<{
13
+ title?: string;
14
+ }>;
15
+ export default function BlogPage({ params }: SlugParams): Promise<import("react").JSX.Element>;
16
+ export declare function BlogIndex(): Promise<import("react").JSX.Element | null>;
@@ -0,0 +1,27 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import 'server-only';
3
+ import { notFound } from 'next/navigation';
4
+ import { FeedArticle, feedPagesOfKind, revalidate, tryLoadFeedPage } from './page.js';
5
+ export { revalidate };
6
+ export async function generateStaticParams() {
7
+ return (await feedPagesOfKind('article')).map((page) => ({ slug: page.slug }));
8
+ }
9
+ export async function generateMetadata({ params }) {
10
+ const { slug } = await params;
11
+ const page = await tryLoadFeedPage('article', slug);
12
+ return page ? { title: page.title } : {};
13
+ }
14
+ export default async function BlogPage({ params }) {
15
+ const { slug } = await params;
16
+ const page = await tryLoadFeedPage('article', slug);
17
+ if (!page)
18
+ notFound();
19
+ return _jsx(FeedArticle, { page: page });
20
+ }
21
+ export async function BlogIndex() {
22
+ const pages = await feedPagesOfKind('article');
23
+ if (pages.length === 0)
24
+ return null;
25
+ return (_jsx("ul", { children: pages.map((page) => (_jsx("li", { children: _jsx("a", { href: page.path, children: page.title }) }, page.slug))) }));
26
+ }
27
+ //# sourceMappingURL=blog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blog.js","sourceRoot":"","sources":["../../src/operator/blog.tsx"],"names":[],"mappings":";AAAA,OAAO,aAAa,CAAC;AAErB,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAEtF,OAAO,EAAE,UAAU,EAAE,CAAC;AAItB,MAAM,CAAC,KAAK,UAAU,oBAAoB;IACxC,OAAO,CAAC,MAAM,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AACjF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,EAAE,MAAM,EAAc;IAC3D,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC;IAC9B,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACpD,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AAC3C,CAAC;AAED,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,QAAQ,CAAC,EAAE,MAAM,EAAc;IAC3D,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC;IAC9B,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACpD,IAAI,CAAC,IAAI;QAAE,QAAQ,EAAE,CAAC;IACtB,OAAO,KAAC,WAAW,IAAC,IAAI,EAAE,IAAI,GAAI,CAAC;AACrC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,SAAS,CAAC,CAAC;IAC/C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,OAAO,CACL,uBACG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACnB,uBACE,YAAG,IAAI,EAAE,IAAI,CAAC,IAAI,YAAG,IAAI,CAAC,KAAK,GAAK,IAD7B,IAAI,CAAC,IAAI,CAEb,CACN,CAAC,GACC,CACN,CAAC;AACJ,CAAC"}
@@ -1 +1,2 @@
1
+ import 'server-only';
1
2
  export declare function IgniteJsonLd(): Promise<React.JSX.Element | null>;
@@ -1,4 +1,5 @@
1
1
  import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import 'server-only';
2
3
  import { IgniteClient } from '../client.js';
3
4
  // Drop into `app/layout.tsx`: import { IgniteJsonLd } from '@ignite-agent/agent/jsonld' then render <IgniteJsonLd />
4
5
  // An async server component that emits ld+json for the site. Renders nothing when unconfigured or unreachable.
@@ -1 +1 @@
1
- {"version":3,"file":"jsonld.js","sourceRoot":"","sources":["../../src/operator/jsonld.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,uHAAuH;AACvH,+GAA+G;AAC/G,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,MAAM,GAAG,YAAY,CAAC,aAAa,EAAE,CAAC;IAC5C,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEzB,IAAI,MAAM,GAA8B,EAAE,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAErC,OAAO,CACL,4BACG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CACxB,iBAEE,IAAI,EAAC,qBAAqB;YAC1B,kGAAkG;YAClG,uBAAuB,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,IAH9E,CAAC,CAIN,CACH,CAAC,GACD,CACJ,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"jsonld.js","sourceRoot":"","sources":["../../src/operator/jsonld.tsx"],"names":[],"mappings":";AAAA,OAAO,aAAa,CAAC;AAErB,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,uHAAuH;AACvH,+GAA+G;AAC/G,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,MAAM,GAAG,YAAY,CAAC,aAAa,EAAE,CAAC;IAC5C,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEzB,IAAI,MAAM,GAA8B,EAAE,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAErC,OAAO,CACL,4BACG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CACxB,iBAEE,IAAI,EAAC,qBAAqB;YAC1B,kGAAkG;YAClG,uBAAuB,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,IAH9E,CAAC,CAIN,CACH,CAAC,GACD,CACJ,CAAC;AACJ,CAAC"}
@@ -1,2 +1,3 @@
1
+ import 'server-only';
1
2
  import type { Metadata } from 'next';
2
3
  export declare function igniteMetadata(path: string): Promise<Metadata>;
@@ -1,3 +1,4 @@
1
+ import 'server-only';
1
2
  import { IgniteClient } from '../client.js';
2
3
  // Use inside `generateMetadata`: export async function generateMetadata() { return igniteMetadata('/pricing') }
3
4
  // Merge with your own values by spreading: { ...(await igniteMetadata(path)), title: 'override' }
@@ -1 +1 @@
1
- {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/operator/metadata.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,iHAAiH;AACjH,kGAAkG;AAClG,yFAAyF;AACzF,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY;IAC/C,MAAM,MAAM,GAAG,YAAY,CAAC,aAAa,EAAE,CAAC;IAC5C,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAEvB,IAAI,SAAS,CAAC;IACd,IAAI,CAAC;QACH,SAAS,GAAG,CAAC,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,CAAC;IAE1B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,SAAS,CAAC,KAAK;QAAE,QAAQ,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;IACtD,IAAI,SAAS,CAAC,WAAW;QAAE,QAAQ,CAAC,WAAW,GAAG,SAAS,CAAC,WAAW,CAAC;IACxE,IAAI,SAAS,CAAC,SAAS;QAAE,QAAQ,CAAC,UAAU,GAAG,EAAE,SAAS,EAAE,SAAS,CAAC,SAAS,EAAE,CAAC;IAClF,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;QACxB,QAAQ,CAAC,SAAS,GAAG;YACnB,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1E,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,SAAS,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5F,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9E,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/operator/metadata.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAC;AAIrB,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,iHAAiH;AACjH,kGAAkG;AAClG,yFAAyF;AACzF,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY;IAC/C,MAAM,MAAM,GAAG,YAAY,CAAC,aAAa,EAAE,CAAC;IAC5C,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAEvB,IAAI,SAAS,CAAC;IACd,IAAI,CAAC;QACH,SAAS,GAAG,CAAC,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,CAAC;IAE1B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,SAAS,CAAC,KAAK;QAAE,QAAQ,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;IACtD,IAAI,SAAS,CAAC,WAAW;QAAE,QAAQ,CAAC,WAAW,GAAG,SAAS,CAAC,WAAW,CAAC;IACxE,IAAI,SAAS,CAAC,SAAS;QAAE,QAAQ,CAAC,UAAU,GAAG,EAAE,SAAS,EAAE,SAAS,CAAC,SAAS,EAAE,CAAC;IAClF,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;QACxB,QAAQ,CAAC,SAAS,GAAG;YACnB,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1E,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,SAAS,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5F,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9E,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,8 @@
1
+ import 'server-only';
2
+ import type { FeedPage } from '../types.js';
3
+ export declare const revalidate = 60;
4
+ export declare function feedPagesOfKind(kind: FeedPage['kind']): Promise<FeedPage[]>;
5
+ export declare function tryLoadFeedPage(kind: FeedPage['kind'], slug: string): Promise<FeedPage | null>;
6
+ export declare function FeedArticle({ page }: {
7
+ page: FeedPage;
8
+ }): import("react").JSX.Element;
@@ -0,0 +1,34 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import 'server-only';
3
+ import { IgniteApiError, IgniteClient } from '../client.js';
4
+ export const revalidate = 60;
5
+ export async function feedPagesOfKind(kind) {
6
+ const client = IgniteClient.fromEnvOrNull();
7
+ if (!client)
8
+ return [];
9
+ try {
10
+ const { pages } = await client.pages();
11
+ return pages.filter((page) => page.kind === kind);
12
+ }
13
+ catch {
14
+ return [];
15
+ }
16
+ }
17
+ export async function tryLoadFeedPage(kind, slug) {
18
+ const client = IgniteClient.fromEnvOrNull();
19
+ if (!client)
20
+ return null;
21
+ try {
22
+ const page = await client.page(slug);
23
+ return page.kind === kind ? page : null;
24
+ }
25
+ catch (error) {
26
+ if (error instanceof IgniteApiError && error.status === 404)
27
+ return null;
28
+ throw error;
29
+ }
30
+ }
31
+ export function FeedArticle({ page }) {
32
+ return (_jsxs("article", { children: [_jsx("h1", { children: page.title }), _jsx("div", { dangerouslySetInnerHTML: { __html: page.html } })] }));
33
+ }
34
+ //# sourceMappingURL=page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page.js","sourceRoot":"","sources":["../../src/operator/page.tsx"],"names":[],"mappings":";AAAA,OAAO,aAAa,CAAC;AAErB,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAG5D,MAAM,CAAC,MAAM,UAAU,GAAG,EAAE,CAAC;AAE7B,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAsB;IAC1D,MAAM,MAAM,GAAG,YAAY,CAAC,aAAa,EAAE,CAAC;IAC5C,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IACvB,IAAI,CAAC;QACH,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACvC,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAsB,EAAE,IAAY;IACxE,MAAM,MAAM,GAAG,YAAY,CAAC,aAAa,EAAE,CAAC;IAC5C,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,cAAc,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC;QACzE,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,EAAE,IAAI,EAAsB;IACtD,OAAO,CACL,8BACE,uBAAK,IAAI,CAAC,KAAK,GAAM,EACrB,cAAK,uBAAuB,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,GAAI,IAC/C,CACX,CAAC;AACJ,CAAC"}
@@ -1,5 +1,7 @@
1
+ import 'server-only';
1
2
  import { type NextRequest, NextResponse } from 'next/server';
2
3
  export declare function proxy(request: NextRequest): Promise<NextResponse>;
4
+ export declare const middleware: typeof proxy;
3
5
  export declare const config: {
4
6
  matcher: string[];
5
7
  };
@@ -1,3 +1,4 @@
1
+ import 'server-only';
1
2
  import { NextResponse } from 'next/server';
2
3
  import { IgniteClient } from '../client.js';
3
4
  // Well-known AI and search crawler user-agent tokens. Matching is case-insensitive substring; the first match
@@ -31,34 +32,54 @@ function clientIp(request) {
31
32
  return forwarded.split(',')[0]?.trim() || undefined;
32
33
  return request.headers.get('x-real-ip')?.trim() || undefined;
33
34
  }
34
- // Drop into `proxy.ts` at the project root: export { proxy, config } from '@ignite-agent/agent/proxy'
35
- // Passes every request through untouched, and records a crawl event when the visitor is a known crawler.
36
- // Recording is best-effort: a failure never affects the response.
35
+ // Drop into `proxy.ts` (Next 16) or `middleware.ts` (Next 15):
36
+ // export { proxy, config } from '@ignite-agent/agent/proxy'
37
+ // export { middleware, config } from '@ignite-agent/agent/proxy'
38
+ // Passes every request through untouched. Crawl ingest runs after the response so a slow Hub never stalls a bot.
37
39
  export async function proxy(request) {
38
40
  const botName = matchedCrawler(request.headers.get('user-agent') ?? '');
39
41
  if (botName) {
40
- const client = IgniteClient.fromEnvOrNull();
41
- if (client) {
42
- const ip = clientIp(request);
43
- const userAgent = request.headers.get('user-agent') ?? undefined;
44
- const event = {
45
- bot_name: botName,
46
- path: request.nextUrl.pathname,
47
- observed_at: new Date().toISOString(),
48
- method: request.method,
49
- ...(ip ? { ip } : {}),
50
- ...(userAgent ? { user_agent: userAgent } : {}),
51
- };
52
- try {
53
- await client.recordCrawlEvents([event]);
54
- }
55
- catch {
56
- // best-effort; ignore
57
- }
58
- }
42
+ const ip = clientIp(request);
43
+ const userAgent = request.headers.get('user-agent') ?? undefined;
44
+ const event = {
45
+ bot_name: botName,
46
+ path: request.nextUrl.pathname,
47
+ observed_at: new Date().toISOString(),
48
+ method: request.method,
49
+ ...(ip ? { ip } : {}),
50
+ ...(userAgent ? { user_agent: userAgent } : {}),
51
+ };
52
+ schedule(() => record(event));
59
53
  }
60
54
  return NextResponse.next();
61
55
  }
56
+ export const middleware = proxy;
57
+ function schedule(work) {
58
+ void import('next/server')
59
+ .then((mod) => {
60
+ if (typeof mod.after === 'function') {
61
+ mod.after(() => {
62
+ void work();
63
+ });
64
+ return;
65
+ }
66
+ void work();
67
+ })
68
+ .catch(() => {
69
+ void work();
70
+ });
71
+ }
72
+ async function record(event) {
73
+ const client = IgniteClient.fromEnvOrNull();
74
+ if (!client)
75
+ return;
76
+ try {
77
+ await client.recordCrawlEvents([event]);
78
+ }
79
+ catch {
80
+ // best-effort
81
+ }
82
+ }
62
83
  // Limit the proxy to page requests; skip static assets.
63
84
  export const config = {
64
85
  matcher: ['/((?!_next/static|_next/image|favicon.ico).*)'],
@@ -1 +1 @@
1
- {"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../src/operator/proxy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,YAAY,EAAE,MAAM,aAAa,CAAC;AAE7D,OAAO,EAAE,YAAY,EAAmB,MAAM,cAAc,CAAC;AAE7D,8GAA8G;AAC9G,gHAAgH;AAChH,wDAAwD;AACxD,MAAM,cAAc,GAAG;IACrB,QAAQ;IACR,eAAe;IACf,cAAc;IACd,WAAW;IACX,YAAY;IACZ,cAAc;IACd,eAAe;IACf,iBAAiB;IACjB,iBAAiB;IACjB,WAAW;IACX,SAAS;IACT,UAAU;IACV,WAAW;IACX,oBAAoB;IACpB,YAAY;IACZ,OAAO;CACR,CAAC;AAEF,SAAS,cAAc,CAAC,SAAiB;IACvC,MAAM,EAAE,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;IACnC,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC;AAClF,CAAC;AAED,SAAS,QAAQ,CAAC,OAAoB;IACpC,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACzD,IAAI,SAAS;QAAE,OAAO,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;IACnE,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;AAC/D,CAAC;AAED,uGAAuG;AACvG,yGAAyG;AACzG,kEAAkE;AAClE,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,OAAoB;IAC9C,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;IAExE,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,MAAM,GAAG,YAAY,CAAC,aAAa,EAAE,CAAC;QAC5C,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC7B,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,SAAS,CAAC;YACjE,MAAM,KAAK,GAAe;gBACxB,QAAQ,EAAE,OAAO;gBACjB,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ;gBAC9B,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACrC,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrB,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAChD,CAAC;YACF,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;YAC1C,CAAC;YAAC,MAAM,CAAC;gBACP,sBAAsB;YACxB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,YAAY,CAAC,IAAI,EAAE,CAAC;AAC7B,CAAC;AAED,wDAAwD;AACxD,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,OAAO,EAAE,CAAC,+CAA+C,CAAC;CAC3D,CAAC"}
1
+ {"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../src/operator/proxy.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,3 @@
1
+ import 'server-only';
1
2
  import type { MetadataRoute } from 'next';
2
3
  export default function robots(): Promise<MetadataRoute.Robots>;
@@ -1,3 +1,4 @@
1
+ import 'server-only';
1
2
  import { IgniteClient } from '../client.js';
2
3
  // Drop into `app/robots.ts`: export { default } from '@ignite-agent/agent/robots'
3
4
  // Resolves rules from your Ignite workspace at request time. Falls back to allow-all when unconfigured or
@@ -1 +1 @@
1
- {"version":3,"file":"robots.js","sourceRoot":"","sources":["../../src/operator/robots.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,mFAAmF;AACnF,0GAA0G;AAC1G,wDAAwD;AACxD,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,MAAM;IAClC,MAAM,QAAQ,GAAyB,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC;IAEjF,MAAM,MAAM,GAAG,YAAY,CAAC,aAAa,EAAE,CAAC;IAC5C,IAAI,CAAC,MAAM;QAAE,OAAO,QAAQ,CAAC;IAE7B,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;QAC7C,IAAI,CAAC,MAAM;YAAE,OAAO,QAAQ,CAAC;QAC7B,OAAO;YACL,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtD,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9C,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"robots.js","sourceRoot":"","sources":["../../src/operator/robots.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAC;AAIrB,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,mFAAmF;AACnF,0GAA0G;AAC1G,wDAAwD;AACxD,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,MAAM;IAClC,MAAM,QAAQ,GAAyB,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC;IAEjF,MAAM,MAAM,GAAG,YAAY,CAAC,aAAa,EAAE,CAAC;IAC5C,IAAI,CAAC,MAAM;QAAE,OAAO,QAAQ,CAAC;IAE7B,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;QAC7C,IAAI,CAAC,MAAM;YAAE,OAAO,QAAQ,CAAC;QAC7B,OAAO;YACL,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtD,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9C,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -1,2 +1,3 @@
1
+ import 'server-only';
1
2
  import type { MetadataRoute } from 'next';
2
3
  export default function sitemap(): Promise<MetadataRoute.Sitemap>;
@@ -1,3 +1,4 @@
1
+ import 'server-only';
1
2
  import { IgniteClient } from '../client.js';
2
3
  // Drop into `app/sitemap.ts`: export { default } from '@ignite-agent/agent/sitemap'
3
4
  // Returns an empty sitemap when unconfigured or unreachable so it never overrides a real one with bad data.
@@ -1 +1 @@
1
- {"version":3,"file":"sitemap.js","sourceRoot":"","sources":["../../src/operator/sitemap.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,qFAAqF;AACrF,4GAA4G;AAC5G,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,OAAO;IACnC,MAAM,MAAM,GAAG,YAAY,CAAC,aAAa,EAAE,CAAC;IAC5C,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAEvB,IAAI,CAAC;QACH,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;QAC9C,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,CAAC;QACxB,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC7B,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnE,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5E,GAAG,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtE,CAAC,CAAC,CAAC;IACN,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"sitemap.js","sourceRoot":"","sources":["../../src/operator/sitemap.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAC;AAIrB,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,qFAAqF;AACrF,4GAA4G;AAC5G,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,OAAO;IACnC,MAAM,MAAM,GAAG,YAAY,CAAC,aAAa,EAAE,CAAC;IAC5C,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAEvB,IAAI,CAAC;QACH,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;QAC9C,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,CAAC;QACxB,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC7B,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnE,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5E,GAAG,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtE,CAAC,CAAC,CAAC;IACN,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,15 @@
1
+ import 'server-only';
2
+ import { revalidate } from './page.js';
3
+ export { revalidate };
4
+ type SlugParams = {
5
+ params: Promise<{
6
+ slug: string;
7
+ }>;
8
+ };
9
+ export declare function generateStaticParams(): Promise<Array<{
10
+ slug: string;
11
+ }>>;
12
+ export declare function generateMetadata({ params }: SlugParams): Promise<{
13
+ title?: string;
14
+ }>;
15
+ export default function WikiPage({ params }: SlugParams): Promise<import("react").JSX.Element>;
@@ -0,0 +1,21 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import 'server-only';
3
+ import { notFound } from 'next/navigation';
4
+ import { FeedArticle, feedPagesOfKind, revalidate, tryLoadFeedPage } from './page.js';
5
+ export { revalidate };
6
+ export async function generateStaticParams() {
7
+ return (await feedPagesOfKind('wiki')).map((page) => ({ slug: page.slug }));
8
+ }
9
+ export async function generateMetadata({ params }) {
10
+ const { slug } = await params;
11
+ const page = await tryLoadFeedPage('wiki', slug);
12
+ return page ? { title: page.title } : {};
13
+ }
14
+ export default async function WikiPage({ params }) {
15
+ const { slug } = await params;
16
+ const page = await tryLoadFeedPage('wiki', slug);
17
+ if (!page)
18
+ notFound();
19
+ return _jsx(FeedArticle, { page: page });
20
+ }
21
+ //# sourceMappingURL=wiki.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wiki.js","sourceRoot":"","sources":["../../src/operator/wiki.tsx"],"names":[],"mappings":";AAAA,OAAO,aAAa,CAAC;AAErB,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAEtF,OAAO,EAAE,UAAU,EAAE,CAAC;AAItB,MAAM,CAAC,KAAK,UAAU,oBAAoB;IACxC,OAAO,CAAC,MAAM,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,EAAE,MAAM,EAAc;IAC3D,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC;IAC9B,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACjD,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AAC3C,CAAC;AAED,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,QAAQ,CAAC,EAAE,MAAM,EAAc;IAC3D,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC;IAC9B,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACjD,IAAI,CAAC,IAAI;QAAE,QAAQ,EAAE,CAAC;IACtB,OAAO,KAAC,WAAW,IAAC,IAAI,EAAE,IAAI,GAAI,CAAC;AACrC,CAAC"}
package/dist/types.d.ts CHANGED
@@ -36,3 +36,17 @@ export type MetadataDirective = {
36
36
  images?: string[];
37
37
  };
38
38
  };
39
+ export type FeedPage = {
40
+ slug: string;
41
+ kind: 'wiki' | 'article';
42
+ path: string;
43
+ title: string;
44
+ html: string;
45
+ updatedAt: string;
46
+ indexable: true;
47
+ };
48
+ export type FeedIndex = {
49
+ generatedAt: string;
50
+ version: string;
51
+ pages: FeedPage[];
52
+ };
@@ -34,7 +34,17 @@ and report what changed.
34
34
  ```
35
35
  Same rule if it already exists.
36
36
 
37
- 6. In `app/layout.tsx`, import and render the JSON-LD component inside `<head>` (or at the top of `<body>` if the
37
+ 6. Create the hosted page routes (skip if the files already exist show me them instead):
38
+ ```ts
39
+ // app/w/[slug]/page.tsx
40
+ export { default, generateStaticParams, generateMetadata, revalidate } from '@ignite-agent/agent/wiki'
41
+ ```
42
+ ```ts
43
+ // app/blog/[slug]/page.tsx
44
+ export { default, generateStaticParams, generateMetadata, revalidate } from '@ignite-agent/agent/blog'
45
+ ```
46
+
47
+ 7. In `app/layout.tsx`, import and render the JSON-LD component inside `<head>` (or at the top of `<body>` if the
38
48
  layout has no explicit `<head>`):
39
49
  ```tsx
40
50
  import { IgniteJsonLd } from '@ignite-agent/agent/jsonld'
@@ -42,10 +52,18 @@ and report what changed.
42
52
  <IgniteJsonLd />
43
53
  ```
44
54
 
45
- 7. (Optional, recommended) Create `proxy.ts` at the project root with:
55
+ 8. (Optional, recommended) Crawl logging. If `package.json` has Next 15, create `middleware.ts`:
56
+ ```ts
57
+ export { middleware, config } from '@ignite-agent/agent/proxy'
58
+ ```
59
+ If Next 16+, create `proxy.ts`:
46
60
  ```ts
47
61
  export { proxy, config } from '@ignite-agent/agent/proxy'
48
62
  ```
49
63
  If a `proxy.ts` or `middleware.ts` already exists, do NOT overwrite it — show it to me and we will merge.
50
64
 
51
- 8. Run the build (`npm run build`) and report any errors. Do not change unrelated files.
65
+ 9. Keep `IGNITE_SITE_TOKEN` server-side. Never write `NEXT_PUBLIC_IGNITE_SITE_TOKEN`. Never fetch Ignite
66
+ from a Client Component. The front end renders Hub JSON via the server routes above. MCP (`npx ignite mcp`)
67
+ is for coding agents only.
68
+
69
+ 10. Run the build (`npm run build`) and report any errors. Do not change unrelated files.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@ignite-agent/agent",
3
- "version": "0.1.0",
4
- "description": "Ignite for Next.js: a drop-in App Router SDK for robots, sitemap, JSON-LD, metadata, crawl logging, and the approve-and-apply change loop, driven by your Ignite workspace.",
3
+ "version": "0.1.1",
4
+ "description": "Ignite for Next.js: App Router SDK for robots, sitemap, JSON-LD, metadata, crawl logging, and hosted wiki/blog pages. Server-only. The front end reads JSON; MCP is for coding agents, not the browser.",
5
5
  "type": "module",
6
6
  "license": "UNLICENSED",
7
7
  "private": false,
@@ -16,7 +16,10 @@
16
16
  },
17
17
  "files": [
18
18
  "dist",
19
- "onboarding"
19
+ "onboarding",
20
+ "!dist/**/*.test.js",
21
+ "!dist/**/*.test.d.ts",
22
+ "!dist/**/*.test.js.map"
20
23
  ],
21
24
  "exports": {
22
25
  ".": "./dist/index.js",
@@ -25,20 +28,27 @@
25
28
  "./jsonld": "./dist/operator/jsonld.js",
26
29
  "./metadata": "./dist/operator/metadata.js",
27
30
  "./proxy": "./dist/operator/proxy.js",
28
- "./client": "./dist/client.js"
31
+ "./wiki": "./dist/operator/wiki.js",
32
+ "./blog": "./dist/operator/blog.js",
33
+ "./client": "./dist/client-public.js"
29
34
  },
30
35
  "scripts": {
31
36
  "build": "tsc -p tsconfig.json",
32
37
  "prepublishOnly": "npm run build",
33
38
  "typecheck": "tsc -p tsconfig.json --noEmit",
34
- "test": "node --test dist/**/*.test.js"
39
+ "test": "npm run build && node --test dist/client.test.js dist/mcp.test.js"
40
+ },
41
+ "dependencies": {
42
+ "server-only": "^0.0.1"
35
43
  },
36
44
  "peerDependencies": {
37
45
  "next": ">=15.0.0 <17.0.0",
38
46
  "react": ">=18.2.0"
39
47
  },
40
48
  "peerDependenciesMeta": {
41
- "react": { "optional": true }
49
+ "react": {
50
+ "optional": true
51
+ }
42
52
  },
43
53
  "devDependencies": {
44
54
  "@types/node": "^22.0.0",
@@ -47,5 +57,14 @@
47
57
  "react": "^19.0.0",
48
58
  "typescript": "^5.6.0"
49
59
  },
50
- "keywords": ["ignite", "nextjs", "app-router", "robots", "sitemap", "json-ld", "metadata", "ai-search", "llm"]
60
+ "keywords": [
61
+ "ignite",
62
+ "nextjs",
63
+ "app-router",
64
+ "robots",
65
+ "sitemap",
66
+ "json-ld",
67
+ "metadata",
68
+ "ai-search"
69
+ ]
51
70
  }