@itznexus/itznexus-cli 1.29.0 → 1.31.0
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/dist/commands/api/files.js +72 -2
- package/dist/commands/api/files.js.map +1 -1
- package/dist/commands/api/project-instructions.d.ts +2 -0
- package/dist/commands/api/project-instructions.js +134 -0
- package/dist/commands/api/project-instructions.js.map +1 -0
- package/dist/commands/api/projects.js +39 -77
- package/dist/commands/api/projects.js.map +1 -1
- package/dist/commands/api/repositories.js +0 -46
- package/dist/commands/api/repositories.js.map +1 -1
- package/dist/commands/api/upwork-proposal-submissions.d.ts +2 -0
- package/dist/commands/api/upwork-proposal-submissions.js +176 -0
- package/dist/commands/api/upwork-proposal-submissions.js.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/project-context.d.ts +28 -21
- package/dist/lib/project-context.js +125 -95
- package/dist/lib/project-context.js.map +1 -1
- package/package.json +1 -1
|
@@ -2,63 +2,47 @@ import fs from "node:fs";
|
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { spawnSync } from "node:child_process";
|
|
4
4
|
import { api } from "./api.js";
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
5
|
+
// Materializes a project's agent instruction files (rendered by the API from
|
|
6
|
+
// project_agent_instructions) into the project folder: the root CLAUDE.md and
|
|
7
|
+
// gitignored CLAUDE.local.md files inside repo clones. Nexus is the single
|
|
8
|
+
// source of truth: managed files are always overwritten on sync and deleted
|
|
9
|
+
// when they disappear from Nexus. Local edits do not survive.
|
|
10
|
+
// Every file this module writes starts with this marker; only marked files
|
|
11
|
+
// (or the legacy <project-context> block that predates it) are ever
|
|
12
|
+
// overwritten or deleted without --force.
|
|
13
|
+
const NEXUS_MANAGED_MARKER = "<!-- Nexus-managed";
|
|
14
|
+
const LEGACY_CONTEXT_OPEN = "<project-context";
|
|
15
|
+
const MANAGED_HEADER = "<!-- Nexus-managed. Edit in Nexus (project Agents tab), not here: `itznexus project sync` overwrites this file. -->";
|
|
11
16
|
export function fetchProjectBySlug(slug) {
|
|
12
17
|
return api.get(`/projects/by-slug/${encodeURIComponent(slug)}`);
|
|
13
18
|
}
|
|
14
|
-
export
|
|
15
|
-
|
|
16
|
-
return context;
|
|
19
|
+
export function fetchRenderedInstructions(projectId) {
|
|
20
|
+
return api.get(`/projects/${projectId}/agent-instructions/rendered`);
|
|
17
21
|
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
if (!fs.existsSync(filePath))
|
|
23
|
-
return false;
|
|
24
|
-
const current = fs.readFileSync(filePath, "utf-8").trim();
|
|
25
|
-
const isManagedBlock = current.startsWith(PROJECT_CONTEXT_OPEN) &&
|
|
26
|
-
current.endsWith(PROJECT_CONTEXT_CLOSE);
|
|
27
|
-
return !isManagedBlock;
|
|
28
|
-
}
|
|
29
|
-
export function writeClaudeMd(dir, context, projectShortId) {
|
|
30
|
-
const filePath = path.join(dir, "CLAUDE.md");
|
|
31
|
-
const existed = fs.existsSync(filePath);
|
|
32
|
-
const current = existed ? fs.readFileSync(filePath, "utf-8").trim() : "";
|
|
33
|
-
const isManagedBlock = current.startsWith(PROJECT_CONTEXT_OPEN) &&
|
|
34
|
-
current.endsWith(PROJECT_CONTEXT_CLOSE);
|
|
35
|
-
let replacedProjectId = null;
|
|
36
|
-
if (isManagedBlock) {
|
|
37
|
-
const existingId = current.match(/project-id="([^"]+)"/)?.[1];
|
|
38
|
-
if (existingId && existingId !== projectShortId) {
|
|
39
|
-
replacedProjectId = existingId;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
fs.writeFileSync(filePath, context + "\n");
|
|
43
|
-
return { created: !existed, replacedProjectId };
|
|
22
|
+
function isNexusManaged(filePath) {
|
|
23
|
+
const head = fs.readFileSync(filePath, "utf-8").trimStart();
|
|
24
|
+
return (head.startsWith(NEXUS_MANAGED_MARKER) ||
|
|
25
|
+
head.startsWith(LEGACY_CONTEXT_OPEN));
|
|
44
26
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
27
|
+
/**
|
|
28
|
+
* Instruction paths that already exist on disk but were not written by Nexus.
|
|
29
|
+
* Callers fail fast on these before doing any other work, unless --force.
|
|
30
|
+
*/
|
|
31
|
+
export function findInstructionConflicts(cwd, files) {
|
|
32
|
+
return files
|
|
33
|
+
.map((f) => f.path)
|
|
34
|
+
.filter((rel) => {
|
|
35
|
+
const target = path.join(cwd, ...rel.split("/"));
|
|
36
|
+
return fs.existsSync(target) && !isNexusManaged(target);
|
|
37
|
+
});
|
|
48
38
|
}
|
|
49
|
-
// --- Per-repo CLAUDE.local.md sync ---------------------------------------
|
|
50
|
-
//
|
|
51
|
-
// A repository's Nexus-side agentInstructions are materialized as a gitignored
|
|
52
|
-
// CLAUDE.local.md inside the repo clone. The file never reaches git, so agent
|
|
53
|
-
// instructions are never visible to clients who receive the repo. Nexus is the
|
|
54
|
-
// single source of truth: the file is always overwritten on sync and deleted
|
|
55
|
-
// when the instructions are cleared. Local edits do not survive.
|
|
56
|
-
// Generic on purpose: the pattern a client can read in a committed .gitignore
|
|
57
|
-
// does not reveal that Claude instructions exist.
|
|
58
|
-
const LOCAL_IGNORE_PATTERN = "*.local.*";
|
|
59
39
|
function gitStatus(args, cwd) {
|
|
60
40
|
return spawnSync("git", args, { cwd, stdio: "ignore" }).status;
|
|
61
41
|
}
|
|
42
|
+
// Generic on purpose: the pattern a client can read in a committed .gitignore
|
|
43
|
+
// does not reveal that Claude instructions exist. It matches CLAUDE.local.md
|
|
44
|
+
// at any depth.
|
|
45
|
+
const LOCAL_IGNORE_PATTERN = "*.local.*";
|
|
62
46
|
// Guarantees the ignore entry mechanically instead of trusting instructions:
|
|
63
47
|
// one repo missing the entry plus a `git add .` would ship the instructions
|
|
64
48
|
// to the client.
|
|
@@ -75,67 +59,113 @@ function ensureLocalIgnored(repoDir) {
|
|
|
75
59
|
return true;
|
|
76
60
|
}
|
|
77
61
|
/**
|
|
78
|
-
*
|
|
79
|
-
*
|
|
80
|
-
*
|
|
81
|
-
*
|
|
82
|
-
*
|
|
62
|
+
* Writes every rendered instruction file into the project folder. Root-level
|
|
63
|
+
* files land as-is (the project folder is not a git repo). Nested files land
|
|
64
|
+
* inside repo clones and must be provably gitignored before writing: the
|
|
65
|
+
* .gitignore entry is added if missing, then verified with `git check-ignore`,
|
|
66
|
+
* and an already-tracked file is a hard error. Conflicts (existing unmanaged
|
|
67
|
+
* files) are the caller's job via findInstructionConflicts.
|
|
83
68
|
*/
|
|
84
|
-
export function
|
|
69
|
+
export function syncInstructionFiles(cwd, files) {
|
|
85
70
|
const results = [];
|
|
86
|
-
for (const
|
|
87
|
-
const
|
|
88
|
-
const
|
|
89
|
-
const instructions = repo.agentInstructions?.trim() ?? "";
|
|
90
|
-
const folderExists = fs.existsSync(repoDir);
|
|
71
|
+
for (const file of files) {
|
|
72
|
+
const segments = file.path.split("/");
|
|
73
|
+
const target = path.join(cwd, ...segments);
|
|
91
74
|
const push = (status, extra) => results.push({
|
|
92
|
-
|
|
75
|
+
path: file.path,
|
|
93
76
|
status,
|
|
94
77
|
gitignoreUpdated: false,
|
|
95
78
|
...extra,
|
|
96
79
|
});
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
80
|
+
let gitignoreUpdated = false;
|
|
81
|
+
if (segments.length > 1) {
|
|
82
|
+
const repoDir = path.join(cwd, segments[0]);
|
|
83
|
+
if (!fs.existsSync(repoDir)) {
|
|
84
|
+
push("skipped-no-folder");
|
|
85
|
+
continue;
|
|
101
86
|
}
|
|
102
|
-
|
|
103
|
-
|
|
87
|
+
// Ignored-in-git is a precondition of writing, not a hope. Folders that
|
|
88
|
+
// are not git repos (scratch dirs) are written plainly.
|
|
89
|
+
if (fs.existsSync(path.join(repoDir, ".git"))) {
|
|
90
|
+
const relInRepo = segments.slice(1).join("/");
|
|
91
|
+
if (gitStatus(["ls-files", "--error-unmatch", relInRepo], repoDir) === 0) {
|
|
92
|
+
push("error", {
|
|
93
|
+
error: `${relInRepo} is tracked by git; run \`git rm --cached ${relInRepo}\` in ${segments[0]} and commit before syncing`,
|
|
94
|
+
});
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
gitignoreUpdated = ensureLocalIgnored(repoDir);
|
|
98
|
+
if (gitStatus(["check-ignore", "-q", relInRepo], repoDir) !== 0) {
|
|
99
|
+
push("error", {
|
|
100
|
+
gitignoreUpdated,
|
|
101
|
+
error: `${relInRepo} is still not gitignored after adding ${LOCAL_IGNORE_PATTERN} (negated elsewhere?); refusing to write`,
|
|
102
|
+
});
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
104
105
|
}
|
|
105
|
-
continue;
|
|
106
106
|
}
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
107
|
+
fs.mkdirSync(path.dirname(target), { recursive: true });
|
|
108
|
+
fs.writeFileSync(target, `${MANAGED_HEADER}\n${file.content}\n`);
|
|
109
|
+
push("written", { gitignoreUpdated });
|
|
110
|
+
}
|
|
111
|
+
return results;
|
|
112
|
+
}
|
|
113
|
+
// Directories never scanned for stale instruction files.
|
|
114
|
+
const SCAN_SKIP = new Set([
|
|
115
|
+
".git",
|
|
116
|
+
"node_modules",
|
|
117
|
+
"dist",
|
|
118
|
+
"build",
|
|
119
|
+
".next",
|
|
120
|
+
".turbo",
|
|
121
|
+
"vendor",
|
|
122
|
+
"coverage",
|
|
123
|
+
]);
|
|
124
|
+
const SCAN_MAX_DEPTH = 6;
|
|
125
|
+
function findLocalInstructionFiles(dir, depth, out) {
|
|
126
|
+
if (depth > SCAN_MAX_DEPTH)
|
|
127
|
+
return;
|
|
128
|
+
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
129
|
+
if (entry.isDirectory()) {
|
|
130
|
+
if (!SCAN_SKIP.has(entry.name) && !entry.name.startsWith(".")) {
|
|
131
|
+
findLocalInstructionFiles(path.join(dir, entry.name), depth + 1, out);
|
|
132
|
+
}
|
|
110
133
|
}
|
|
111
|
-
if (
|
|
112
|
-
push(
|
|
113
|
-
continue;
|
|
134
|
+
else if (entry.name === "CLAUDE.local.md") {
|
|
135
|
+
out.push(path.join(dir, entry.name));
|
|
114
136
|
}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Deletes Nexus-managed files that no longer exist in Nexus: root-level
|
|
141
|
+
* markdown files plus any CLAUDE.local.md inside the given repo folders.
|
|
142
|
+
* Unmanaged files are never touched. Returns the deleted paths, relative to
|
|
143
|
+
* the project folder.
|
|
144
|
+
*/
|
|
145
|
+
export function cleanupStaleInstructionFiles(cwd, files, repoNames) {
|
|
146
|
+
const expected = new Set(files.map((f) => f.path));
|
|
147
|
+
const candidates = [];
|
|
148
|
+
for (const entry of fs.readdirSync(cwd, { withFileTypes: true })) {
|
|
149
|
+
if (entry.isFile() && entry.name.endsWith(".md")) {
|
|
150
|
+
candidates.push(path.join(cwd, entry.name));
|
|
123
151
|
}
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
});
|
|
130
|
-
continue;
|
|
152
|
+
}
|
|
153
|
+
for (const repoName of repoNames) {
|
|
154
|
+
const repoDir = path.join(cwd, repoName);
|
|
155
|
+
if (fs.existsSync(repoDir) && fs.statSync(repoDir).isDirectory()) {
|
|
156
|
+
findLocalInstructionFiles(repoDir, 1, candidates);
|
|
131
157
|
}
|
|
132
|
-
const content = [
|
|
133
|
-
`<!-- Nexus-managed (${repo.fullName}). Edit in Nexus, not here: \`itznexus project sync\` overwrites this file. -->`,
|
|
134
|
-
instructions,
|
|
135
|
-
].join("\n");
|
|
136
|
-
fs.writeFileSync(filePath, content + "\n");
|
|
137
|
-
push("written", { gitignoreUpdated });
|
|
138
158
|
}
|
|
139
|
-
|
|
159
|
+
const removed = [];
|
|
160
|
+
for (const candidate of candidates) {
|
|
161
|
+
const rel = path.relative(cwd, candidate).split(path.sep).join("/");
|
|
162
|
+
if (expected.has(rel))
|
|
163
|
+
continue;
|
|
164
|
+
if (!isNexusManaged(candidate))
|
|
165
|
+
continue;
|
|
166
|
+
fs.rmSync(candidate);
|
|
167
|
+
removed.push(rel);
|
|
168
|
+
}
|
|
169
|
+
return removed;
|
|
140
170
|
}
|
|
141
171
|
//# sourceMappingURL=project-context.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-context.js","sourceRoot":"","sources":["../../src/lib/project-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE/B,
|
|
1
|
+
{"version":3,"file":"project-context.js","sourceRoot":"","sources":["../../src/lib/project-context.ts"],"names":[],"mappings":"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"}
|