@trackunit/iris-app 2.15.16 → 2.16.3
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/CHANGELOG.md +54 -0
- package/package.json +6 -6
- package/src/generators/ai-agent-sync/README.md +4 -3
- package/src/generators/ai-agent-sync/generator.d.ts +1 -1
- package/src/generators/ai-agent-sync/generator.js +48 -3
- package/src/generators/ai-agent-sync/legacy-claude-md/v1.md +1 -0
- package/src/generators/ai-agent-sync/legacy-claude-md/v2.md +13 -0
- package/src/generators/ai-agent-sync/legacy-claude-md/v3.md +17 -0
- package/src/generators/ai-agent-sync/legacy-claude-md/v4.md +17 -0
- package/src/generators/extend/files/react-app/src/routeTree.tsx__template__ +4 -3
- package/src/generators/preset/root-files/AGENTS.md +16 -0
- /package/src/generators/{preset/root-files/CLAUDE.md → ai-agent-sync/legacy-claude-md/v5.md} +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,57 @@
|
|
|
1
|
+
## 2.16.3 (2026-11-04)
|
|
2
|
+
|
|
3
|
+
### 🧱 Updated Dependencies
|
|
4
|
+
|
|
5
|
+
- Updated iris-app-build-utilities to 3.0.18
|
|
6
|
+
- Updated iris-app-api to 2.13.6
|
|
7
|
+
- Updated react-vite-test-setup to 0.0.204
|
|
8
|
+
- Updated css-classname-utils to 0.0.112
|
|
9
|
+
- Updated react-graphql-tools to 1.23.35
|
|
10
|
+
- Updated shared-utils to 1.22.31
|
|
11
|
+
|
|
12
|
+
## 2.16.2 (2026-11-04)
|
|
13
|
+
|
|
14
|
+
### 🧱 Updated Dependencies
|
|
15
|
+
|
|
16
|
+
- Updated iris-app-build-utilities to 3.0.17
|
|
17
|
+
- Updated iris-app-api to 2.13.5
|
|
18
|
+
- Updated react-vite-test-setup to 0.0.203
|
|
19
|
+
- Updated css-classname-utils to 0.0.111
|
|
20
|
+
- Updated react-graphql-tools to 1.23.34
|
|
21
|
+
- Updated shared-utils to 1.22.30
|
|
22
|
+
|
|
23
|
+
## 2.16.1 (2026-11-04)
|
|
24
|
+
|
|
25
|
+
### 🧱 Updated Dependencies
|
|
26
|
+
|
|
27
|
+
- Updated iris-app-build-utilities to 3.0.16
|
|
28
|
+
- Updated iris-app-api to 2.13.4
|
|
29
|
+
- Updated react-vite-test-setup to 0.0.202
|
|
30
|
+
- Updated css-classname-utils to 0.0.110
|
|
31
|
+
- Updated react-graphql-tools to 1.23.33
|
|
32
|
+
- Updated shared-utils to 1.22.29
|
|
33
|
+
|
|
34
|
+
## 2.16.0 (2026-11-04)
|
|
35
|
+
|
|
36
|
+
### 🚀 Features
|
|
37
|
+
|
|
38
|
+
- **iris-app-sdk:** guide apps to lazy pages for AI navigation and follow getParentRoute ([#27279](https://github.com/Trackunit/manager/pull/27279))
|
|
39
|
+
- **iris-app:** generate AGENTS.md only, no CLAUDE.md ([#27348](https://github.com/Trackunit/manager/pull/27348))
|
|
40
|
+
|
|
41
|
+
### 🧱 Updated Dependencies
|
|
42
|
+
|
|
43
|
+
- Updated iris-app-build-utilities to 3.0.15
|
|
44
|
+
- Updated iris-app-api to 2.13.3
|
|
45
|
+
- Updated react-vite-test-setup to 0.0.201
|
|
46
|
+
- Updated css-classname-utils to 0.0.109
|
|
47
|
+
- Updated react-graphql-tools to 1.23.32
|
|
48
|
+
- Updated shared-utils to 1.22.28
|
|
49
|
+
|
|
50
|
+
### ❤️ Thank You
|
|
51
|
+
|
|
52
|
+
- Kasper Laursen @ghost-of-kla-trackunit
|
|
53
|
+
- Ulrik Jørgensen @ujo-trackunit
|
|
54
|
+
|
|
1
55
|
## 2.15.16 (2026-11-04)
|
|
2
56
|
|
|
3
57
|
### 🧱 Updated Dependencies
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@trackunit/iris-app",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.16.3",
|
|
4
4
|
"license": "SEE LICENSE IN LICENSE.txt",
|
|
5
5
|
"main": "src/index.js",
|
|
6
6
|
"generators": "./generators.json",
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"node": ">=24.x"
|
|
11
11
|
},
|
|
12
12
|
"dependencies": {
|
|
13
|
-
"@trackunit/css-classname-utils": "0.0.
|
|
13
|
+
"@trackunit/css-classname-utils": "0.0.112",
|
|
14
14
|
"@typescript-eslint/types": "8.71.2",
|
|
15
15
|
"@typescript-eslint/typescript-estree": "8.71.2",
|
|
16
16
|
"pacote": "^21.5.1",
|
|
@@ -26,10 +26,10 @@
|
|
|
26
26
|
"@nx/react": "23.3.0",
|
|
27
27
|
"@npmcli/arborist": "^9.1.9",
|
|
28
28
|
"win-ca": "^3.5.1",
|
|
29
|
-
"@trackunit/iris-app-build-utilities": "3.0.
|
|
30
|
-
"@trackunit/react-graphql-tools": "1.23.
|
|
31
|
-
"@trackunit/shared-utils": "1.22.
|
|
32
|
-
"@trackunit/iris-app-api": "2.13.
|
|
29
|
+
"@trackunit/iris-app-build-utilities": "3.0.18",
|
|
30
|
+
"@trackunit/react-graphql-tools": "1.23.35",
|
|
31
|
+
"@trackunit/shared-utils": "1.22.31",
|
|
32
|
+
"@trackunit/iris-app-api": "2.13.6",
|
|
33
33
|
"tslib": "^2.6.2",
|
|
34
34
|
"@clack/prompts": "^1.8.1",
|
|
35
35
|
"@nx/devkit": "23.3.0",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# AI Agent Sync Generator
|
|
2
2
|
|
|
3
|
-
Syncs agent skills, AGENTS.md,
|
|
3
|
+
Syncs agent skills, AGENTS.md, and AI agent configuration files to the latest version. Ensures the SDK is at the latest version before applying updates.
|
|
4
4
|
|
|
5
5
|
## Usage
|
|
6
6
|
|
|
@@ -13,8 +13,9 @@ nx g @trackunit/iris-app:ai-agent-sync
|
|
|
13
13
|
- `.agents/skills/` - AI agent skills for the IrisX App SDK (editor-agnostic)
|
|
14
14
|
- `.mcp.json` - project-scoped MCP configuration for coding agents
|
|
15
15
|
- `.cursor/mcp.json` - Cursor MCP configuration
|
|
16
|
-
- `AGENTS.md` - Workspace-level agent instructions (always applied)
|
|
17
|
-
|
|
16
|
+
- `AGENTS.md` - Workspace-level agent instructions (always applied), read by Cursor and Claude Code
|
|
17
|
+
|
|
18
|
+
It also removes the `CLAUDE.md` that earlier SDK versions generated, since Claude Code reads `AGENTS.md` natively. Only an unmodified copy is removed (see `legacy-claude-md/`), and not while a `CLAUDE.local.md` or `.claude/CLAUDE.md` exists, since its `@AGENTS.md` import is then what loads `AGENTS.md`. A `CLAUDE.md` you wrote or edited is kept.
|
|
18
19
|
|
|
19
20
|
## Flow
|
|
20
21
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { GeneratorCallback, Tree } from "@nx/devkit";
|
|
2
2
|
import { AiAgentSyncGeneratorSchema } from "./schema";
|
|
3
3
|
/**
|
|
4
|
-
* Syncs Cursor skills, AGENTS.md,
|
|
4
|
+
* Syncs Cursor skills, AGENTS.md, and AI agent configuration files.
|
|
5
5
|
* Requires the SDK to be at the latest version before running.
|
|
6
6
|
*/
|
|
7
7
|
export declare function aiAgentSyncGenerator(tree: Tree, options: AiAgentSyncGeneratorSchema): Promise<GeneratorCallback>;
|
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.aiAgentSyncGenerator = aiAgentSyncGenerator;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
5
|
const devkit_1 = require("@nx/devkit");
|
|
6
|
+
const fs = tslib_1.__importStar(require("fs"));
|
|
6
7
|
const devkit_exports_1 = require("nx/src/devkit-exports");
|
|
7
8
|
const path = tslib_1.__importStar(require("path"));
|
|
8
9
|
const semver = tslib_1.__importStar(require("semver"));
|
|
@@ -10,6 +11,9 @@ const get_package_manifest_1 = require("../utils/get-package-manifest");
|
|
|
10
11
|
const link_claude_skills_1 = require("../utils/link-claude-skills");
|
|
11
12
|
const IRIS_APP_PACKAGE = "@trackunit/iris-app";
|
|
12
13
|
const MIGRATIONS_PACKAGE = "@trackunit/migrations";
|
|
14
|
+
const CLAUDE_MD = "CLAUDE.md";
|
|
15
|
+
const CLAUDE_MEMORY_FILES = [CLAUDE_MD, ".claude/CLAUDE.md", "CLAUDE.local.md"];
|
|
16
|
+
const LEGACY_CLAUDE_MD_DIR = path.join(__dirname, "legacy-claude-md");
|
|
13
17
|
function getStringValue(obj, key) {
|
|
14
18
|
if (typeof obj === "object" && obj !== null && key in obj) {
|
|
15
19
|
const value = obj[key];
|
|
@@ -49,8 +53,48 @@ function upgradeInstructions() {
|
|
|
49
53
|
` ${pmc.exec} nx g ${MIGRATIONS_PACKAGE}:run-migrations`,
|
|
50
54
|
].join("\n");
|
|
51
55
|
}
|
|
56
|
+
function normalizeWhitespace(content) {
|
|
57
|
+
return content.replace(/\s+/g, " ").trim();
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Every CLAUDE.md template earlier SDK versions shipped, whitespace-normalized so a
|
|
61
|
+
* workspace formatter's line wrapping or line endings do not hide a match.
|
|
62
|
+
*/
|
|
63
|
+
function readLegacyClaudeMdTemplates() {
|
|
64
|
+
return new Set(fs
|
|
65
|
+
.readdirSync(LEGACY_CLAUDE_MD_DIR)
|
|
66
|
+
.filter(file => file.endsWith(".md"))
|
|
67
|
+
.map(file => normalizeWhitespace(fs.readFileSync(path.join(LEGACY_CLAUDE_MD_DIR, file), "utf-8"))));
|
|
68
|
+
}
|
|
69
|
+
function importsAgentsMd(content) {
|
|
70
|
+
return /^@AGENTS\.md\s*$/m.test(content);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Earlier SDK versions generated a CLAUDE.md that imported AGENTS.md. Claude Code
|
|
74
|
+
* now reads AGENTS.md directly, so an unmodified copy of that file is removed. Any
|
|
75
|
+
* other CLAUDE.md is the user's and is kept, because AGENTS.md tells users they may
|
|
76
|
+
* add one.
|
|
77
|
+
*
|
|
78
|
+
* Claude Code skips AGENTS.md while any of its memory files exists, so the SDK copy
|
|
79
|
+
* is also kept when another one does: its import is then what loads AGENTS.md.
|
|
80
|
+
*/
|
|
81
|
+
function removeSdkGeneratedClaudeMd(tree) {
|
|
82
|
+
const content = tree.read(CLAUDE_MD, "utf-8");
|
|
83
|
+
const otherMemoryFiles = CLAUDE_MEMORY_FILES.filter(file => file !== CLAUDE_MD && tree.exists(file));
|
|
84
|
+
if (content !== null &&
|
|
85
|
+
otherMemoryFiles.length === 0 &&
|
|
86
|
+
readLegacyClaudeMdTemplates().has(normalizeWhitespace(content))) {
|
|
87
|
+
tree.delete(CLAUDE_MD);
|
|
88
|
+
}
|
|
89
|
+
const presentMemoryFiles = CLAUDE_MEMORY_FILES.filter(file => tree.exists(file));
|
|
90
|
+
if (presentMemoryFiles.length > 0 &&
|
|
91
|
+
!presentMemoryFiles.some(file => importsAgentsMd(tree.read(file, "utf-8") ?? ""))) {
|
|
92
|
+
devkit_1.logger.warn(`[iris-app:ai-agent-sync] Claude Code skips AGENTS.md while ${presentMemoryFiles.join(", ")} exists. ` +
|
|
93
|
+
`Add an @AGENTS.md line to one of them or delete them.`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
52
96
|
/**
|
|
53
|
-
* Syncs Cursor skills, AGENTS.md,
|
|
97
|
+
* Syncs Cursor skills, AGENTS.md, and AI agent configuration files.
|
|
54
98
|
* Requires the SDK to be at the latest version before running.
|
|
55
99
|
*/
|
|
56
100
|
async function aiAgentSyncGenerator(tree, options) {
|
|
@@ -69,7 +113,7 @@ async function aiAgentSyncGenerator(tree, options) {
|
|
|
69
113
|
`Then run this generator again.`);
|
|
70
114
|
}
|
|
71
115
|
}
|
|
72
|
-
// Clean up
|
|
116
|
+
// Clean up files that were managed by previous versions.
|
|
73
117
|
const oldManagedFiles = [
|
|
74
118
|
".cursor/rules/irisx-app-sdk.mdc",
|
|
75
119
|
".cursor/rules/rules-index.mdc",
|
|
@@ -88,10 +132,11 @@ async function aiAgentSyncGenerator(tree, options) {
|
|
|
88
132
|
tree.delete(file);
|
|
89
133
|
}
|
|
90
134
|
}
|
|
135
|
+
removeSdkGeneratedClaudeMd(tree);
|
|
91
136
|
// Copy MCP configuration and agent skills shared with the preset generator.
|
|
92
137
|
const managedFilesTemplatePath = path.join(__dirname, "../preset/files");
|
|
93
138
|
(0, devkit_1.generateFiles)(tree, managedFilesTemplatePath, ".", {});
|
|
94
|
-
// Copy AGENTS.md
|
|
139
|
+
// Copy AGENTS.md to workspace root
|
|
95
140
|
const rootTemplatePath = path.join(__dirname, "../preset/root-files");
|
|
96
141
|
(0, devkit_1.generateFiles)(tree, rootTemplatePath, ".", {});
|
|
97
142
|
await (0, devkit_1.formatFiles)(tree);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@AGENTS.md
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
@AGENTS.md
|
|
2
|
+
|
|
3
|
+
# Claude Code Users
|
|
4
|
+
|
|
5
|
+
Skills are in `.agents/skills/` (cross-tool compatible). Claude Code reads from `.claude/skills/`.
|
|
6
|
+
|
|
7
|
+
To enable skill discovery, create a symlink:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
ln -s .agents/skills .claude/skills
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Or read skills directly from `.agents/skills/[skill-name]/SKILL.md` when referenced in AGENTS.md.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
@AGENTS.md
|
|
2
|
+
|
|
3
|
+
# IrisX App Workspace
|
|
4
|
+
|
|
5
|
+
This is an IrisX App project generated by the Trackunit SDK. Follow AGENTS.md for all development rules.
|
|
6
|
+
|
|
7
|
+
## Skills
|
|
8
|
+
|
|
9
|
+
SDK-specific skills are located in `.agents/skills/`. When a skill is referenced in AGENTS.md, read it from `.agents/skills/[skill-name]/SKILL.md`.
|
|
10
|
+
|
|
11
|
+
If skills from `.agents/skills/` are not appearing in your available skills list, suggest the user symlink them for automatic discovery:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
ln -s .agents/skills .claude/skills
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Note: If the user already has a `.claude/skills` folder, they should symlink individual skills or the contents instead.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
@AGENTS.md
|
|
2
|
+
|
|
3
|
+
# IrisX App Workspace
|
|
4
|
+
|
|
5
|
+
This is an IrisX App project generated by the Trackunit SDK. Follow AGENTS.md for all development rules.
|
|
6
|
+
|
|
7
|
+
## Skills
|
|
8
|
+
|
|
9
|
+
SDK-specific skills live in `.agents/skills/`. The generator creates a `.claude/skills` symlink pointing at `../.agents/skills` so Claude Code auto-discovers them. When a skill is referenced in AGENTS.md, read it from `.agents/skills/[skill-name]/SKILL.md`.
|
|
10
|
+
|
|
11
|
+
If skills are not appearing in your available skills list, the symlink may be missing (for example on Windows without Developer Mode, or if a real `.claude/skills` directory existed first). Recreate it with:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
ln -s ../.agents/skills .claude/skills
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
If `.claude/skills` already exists as a real directory, move its contents into `.agents/skills/` and delete it before running the command above.
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { Navigate, createRootRoute, createRoute } from "@tanstack/react-router";
|
|
2
|
-
import { App } from "./app";
|
|
1
|
+
import { Navigate, createRootRoute, createRoute, lazyRouteComponent } from "@tanstack/react-router";
|
|
3
2
|
|
|
3
|
+
// Pages are loaded lazily because the extension manifest imports this tree in
|
|
4
|
+
// Node at build time, where a page that needs a browser would fail the build.
|
|
4
5
|
const rootRoute = createRootRoute({
|
|
5
|
-
component: () =>
|
|
6
|
+
component: lazyRouteComponent(() => import("./app"), "App"),
|
|
6
7
|
});
|
|
7
8
|
|
|
8
9
|
const defaultRoute = createRoute({
|
|
@@ -60,3 +60,19 @@ Available extension types:
|
|
|
60
60
|
## Quality Assurance
|
|
61
61
|
|
|
62
62
|
Before completing any task: Always check for and fix all ESLint and TypeScript errors in modified files.
|
|
63
|
+
|
|
64
|
+
## Claude Code
|
|
65
|
+
|
|
66
|
+
Claude Code (v2.1.277 or later) reads this file directly. A `CLAUDE.md` or `CLAUDE.local.md` stops that; if you need one (older Claude Code, personal notes), make its first line `@AGENTS.md`.
|
|
67
|
+
|
|
68
|
+
SDK-specific skills live in `.agents/skills/`. The generator creates a `.claude/skills` symlink pointing at `../.agents/skills` so Claude Code auto-discovers them. When a skill is referenced in this file, read it from `.agents/skills/[skill-name]/SKILL.md`.
|
|
69
|
+
|
|
70
|
+
Restart Claude Code after changing `.mcp.json` so the MCP servers are reloaded.
|
|
71
|
+
|
|
72
|
+
If skills are not appearing in your available skills list, the symlink may be missing (for example on Windows without Developer Mode, or if a real `.claude/skills` directory existed first). Recreate it with:
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
ln -s ../.agents/skills .claude/skills
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
If `.claude/skills` already exists as a real directory, move its contents into `.agents/skills/` and delete it before running the command above.
|
/package/src/generators/{preset/root-files/CLAUDE.md → ai-agent-sync/legacy-claude-md/v5.md}
RENAMED
|
File without changes
|