@confiqure/cli 0.1.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/diff.js ADDED
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Compute the change-file by joining the local scan against the backend
3
+ * registry on {@code classUniqueId}.
4
+ *
5
+ * V1 rules:
6
+ * - Local annotated file not in registry → ADDED.
7
+ * - Matching classUniqueId, different gitSha → CHANGED.
8
+ * - Matching classUniqueId, same gitSha → unchanged (skipped).
9
+ * - Registry entry with no local match → DELETED.
10
+ * - RENAMED detection deferred (treated as DELETED + ADDED).
11
+ */
12
+ export function diffAgainstRegistry(local, registry) {
13
+ const byClassId = new Map(registry.map((r) => [r.classUniqueId, r]));
14
+ const changes = [];
15
+ let unchanged = 0;
16
+ const seen = new Set();
17
+ for (const cls of local) {
18
+ seen.add(cls.classUniqueId);
19
+ const existing = byClassId.get(cls.classUniqueId);
20
+ if (!existing) {
21
+ changes.push({
22
+ op: "ADDED",
23
+ classUniqueId: cls.classUniqueId,
24
+ className: cls.className,
25
+ configEnd: cls.configEnd,
26
+ filePath: cls.filePath,
27
+ gitSha: cls.gitSha,
28
+ });
29
+ }
30
+ else if (existing.gitVersion !== cls.gitSha) {
31
+ changes.push({
32
+ op: "CHANGED",
33
+ classUniqueId: cls.classUniqueId,
34
+ className: cls.className,
35
+ configEnd: cls.configEnd,
36
+ filePath: cls.filePath,
37
+ gitSha: cls.gitSha,
38
+ });
39
+ }
40
+ else {
41
+ unchanged++;
42
+ }
43
+ }
44
+ for (const r of registry) {
45
+ if (!seen.has(r.classUniqueId)) {
46
+ changes.push({
47
+ op: "DELETED",
48
+ classUniqueId: r.classUniqueId,
49
+ className: r.className,
50
+ configEnd: r.configEnd,
51
+ filePath: r.filePath ?? r.classUniqueId,
52
+ gitSha: r.gitVersion,
53
+ });
54
+ }
55
+ }
56
+ return { changes, unchanged };
57
+ }
58
+ export function renderDiff(diff, opts) {
59
+ const lines = [];
60
+ const limit = opts.contextListLimit ?? 6;
61
+ // --- Annotated classes section ---
62
+ lines.push(diff.changes.length === 0
63
+ ? `Annotated classes: no changes (${diff.unchanged} unchanged)`
64
+ : `Annotated classes (${diff.changes.length} change${diff.changes.length === 1 ? "" : "s"}, ${diff.unchanged} unchanged):`);
65
+ const opOrder = ["ADDED", "CHANGED", "RENAMED", "DELETED"];
66
+ for (const op of opOrder) {
67
+ const rows = diff.changes.filter((c) => c.op === op);
68
+ for (const r of rows) {
69
+ const sha = r.gitSha ? r.gitSha.slice(0, 7) : " ";
70
+ const tail = op === "DELETED" ? `(was: ${r.filePath})` : `${r.filePath} ${sha}`;
71
+ lines.push(` ${op.padEnd(8)} ${r.className.padEnd(28)} ${tail}`);
72
+ }
73
+ }
74
+ // --- Context files section ---
75
+ const annotatedSet = new Set(opts.annotatedPaths.map(normalize));
76
+ const contextFiles = opts.allScannedPaths
77
+ .map(normalize)
78
+ .filter((p) => !annotatedSet.has(p))
79
+ .sort();
80
+ lines.push("");
81
+ if (contextFiles.length === 0) {
82
+ lines.push("Context files: (none)");
83
+ }
84
+ else {
85
+ lines.push(`Context files: ${contextFiles.length} source file${contextFiles.length === 1 ? "" : "s"} reachable from a root (uploaded for AI parsing)`);
86
+ const shown = contextFiles.slice(0, limit);
87
+ for (const p of shown)
88
+ lines.push(` ${p}`);
89
+ if (contextFiles.length > limit) {
90
+ lines.push(` … +${contextFiles.length - limit} more`);
91
+ }
92
+ }
93
+ return lines.join("\n");
94
+ }
95
+ function normalize(p) {
96
+ return p.replace(/\\/g, "/");
97
+ }
98
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"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"}
package/dist/git.js ADDED
@@ -0,0 +1,93 @@
1
+ import { exec as execCb } from "node:child_process";
2
+ import { promisify } from "node:util";
3
+ const exec = promisify(execCb);
4
+ export async function gitHashObject(filePath, cwd) {
5
+ // hash-object computes the git blob SHA without needing the file to be staged.
6
+ const { stdout } = await exec(`git hash-object "${filePath}"`, { cwd });
7
+ return stdout.trim();
8
+ }
9
+ export async function gitStatus(cwd) {
10
+ let branch = "(detached)";
11
+ try {
12
+ const { stdout } = await exec("git rev-parse --abbrev-ref HEAD", { cwd });
13
+ branch = stdout.trim();
14
+ }
15
+ catch {
16
+ /* ignore */
17
+ }
18
+ let upstreamConfigured = false;
19
+ let aheadOfUpstream = false;
20
+ try {
21
+ const { stdout } = await exec("git rev-list --left-right --count HEAD...@{upstream}", { cwd });
22
+ upstreamConfigured = true;
23
+ const parts = stdout.trim().split(/\s+/);
24
+ aheadOfUpstream = parseInt(parts[0] ?? "0", 10) > 0;
25
+ }
26
+ catch {
27
+ upstreamConfigured = false;
28
+ }
29
+ let isDirty = false;
30
+ try {
31
+ const { stdout } = await exec("git status --porcelain", { cwd });
32
+ isDirty = stdout.trim().length > 0;
33
+ }
34
+ catch {
35
+ /* ignore */
36
+ }
37
+ return { branch, isDirty, aheadOfUpstream, upstreamConfigured };
38
+ }
39
+ export async function gitHeadSha(cwd) {
40
+ try {
41
+ const { stdout } = await exec("git rev-parse HEAD", { cwd });
42
+ return stdout.trim();
43
+ }
44
+ catch {
45
+ return "";
46
+ }
47
+ }
48
+ export async function gitRef(cwd) {
49
+ try {
50
+ const { stdout } = await exec("git symbolic-ref HEAD", { cwd });
51
+ return stdout.trim();
52
+ }
53
+ catch {
54
+ return "";
55
+ }
56
+ }
57
+ /**
58
+ * Return the subset of dirty files (modified, added, untracked) whose path
59
+ * falls under one of the given scan-path prefixes. Used by `confiqure push`
60
+ * to gate uploads on a clean working tree for confiqure-relevant files only.
61
+ *
62
+ * <p>Paths outside `scanPaths` are intentionally ignored — confiqure doesn't
63
+ * care if `README.md` or `infra/` is dirty.
64
+ */
65
+ export async function gitDirtyInScanPaths(cwd, scanPaths) {
66
+ let stdout = "";
67
+ try {
68
+ const res = await exec("git status --porcelain", { cwd });
69
+ stdout = res.stdout;
70
+ }
71
+ catch {
72
+ return [];
73
+ }
74
+ const normalizedScanPaths = scanPaths.map((p) => p.replace(/\\/g, "/").replace(/\/+$/, "") + "/");
75
+ const dirty = [];
76
+ for (const rawLine of stdout.split(/\r?\n/)) {
77
+ if (!rawLine)
78
+ continue;
79
+ // Porcelain v1 format: XY␣PATH (X = index status, Y = worktree status).
80
+ const status = rawLine.slice(0, 2);
81
+ let path = rawLine.slice(3);
82
+ // Renames look like "R old -> new" — keep the new path.
83
+ const arrow = path.indexOf(" -> ");
84
+ if (arrow !== -1)
85
+ path = path.slice(arrow + 4);
86
+ const normalized = path.replace(/\\/g, "/");
87
+ if (normalizedScanPaths.some((prefix) => normalized.startsWith(prefix))) {
88
+ dirty.push({ status, path: normalized });
89
+ }
90
+ }
91
+ return dirty;
92
+ }
93
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from "commander";
3
+ import chalk from "chalk";
4
+ import { registerLogin } from "./commands/login.js";
5
+ import { registerInit } from "./commands/init.js";
6
+ import { registerStatus } from "./commands/status.js";
7
+ import { registerDiff } from "./commands/diff.js";
8
+ import { registerPush } from "./commands/push.js";
9
+ import { registerTools } from "./commands/tools.js";
10
+ import { registerWorkspace } from "./commands/workspace.js";
11
+ const program = new Command();
12
+ program
13
+ .name("confiqure")
14
+ .description("confiqure.ai CLI — push @Confiqure-annotated classes to your workspace")
15
+ .version("0.1.0");
16
+ registerLogin(program);
17
+ registerInit(program);
18
+ registerStatus(program);
19
+ registerDiff(program);
20
+ registerPush(program);
21
+ registerTools(program);
22
+ registerWorkspace(program);
23
+ program.parseAsync(process.argv).catch((err) => {
24
+ const msg = err instanceof Error ? err.message : String(err);
25
+ console.error(chalk.red("✗"), msg);
26
+ process.exit(1);
27
+ });
28
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAC9B,OAAO;KACJ,IAAI,CAAC,WAAW,CAAC;KACjB,WAAW,CAAC,wEAAwE,CAAC;KACrF,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,aAAa,CAAC,OAAO,CAAC,CAAC;AACvB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,aAAa,CAAC,OAAO,CAAC,CAAC;AACvB,iBAAiB,CAAC,OAAO,CAAC,CAAC;AAE3B,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IACtD,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC7D,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
package/dist/scan.js ADDED
@@ -0,0 +1,120 @@
1
+ import fastGlob from "fast-glob";
2
+ import { readFile } from "node:fs/promises";
3
+ import { extname, basename } from "node:path";
4
+ import { gitHashObject } from "./git.js";
5
+ import { parseJavaFiles, buildClassTrees, } from "./classTree.js";
6
+ export async function scanProject(cwd, config) {
7
+ const buckets = Object.entries(config.languages).map(([langKey, lang]) => ({
8
+ extensions: lang.extensions,
9
+ tokenPattern: lang.tokenPattern,
10
+ langKey,
11
+ }));
12
+ const allExtensions = new Set();
13
+ buckets.forEach((b) => b.extensions.forEach((e) => allExtensions.add(e)));
14
+ const patterns = config.scanPaths.flatMap((p) => Array.from(allExtensions).map((ext) => `${p}/**/*${ext}`));
15
+ const ignorePatterns = config.ignore.map((d) => `**/${d}/**`);
16
+ const files = await fastGlob(patterns, {
17
+ cwd,
18
+ ignore: ignorePatterns,
19
+ absolute: false,
20
+ onlyFiles: true,
21
+ dot: false,
22
+ });
23
+ const allFiles = new Map();
24
+ const fileLanguage = new Map();
25
+ for (const filePath of files) {
26
+ const content = await readFile(`${cwd}/${filePath}`, "utf8");
27
+ allFiles.set(filePath, content);
28
+ const ext = extname(filePath);
29
+ const bucket = buckets.find((b) => b.extensions.includes(ext));
30
+ if (bucket)
31
+ fileLanguage.set(filePath, bucket.langKey);
32
+ }
33
+ // ── Java: tree-sitter reachability ────────────────────────────────────
34
+ // For Java we parse every file and walk the field-type graph from each
35
+ // `@Confiqure` root. The walk subsumes nested `@Confiqure` classes (e.g.
36
+ // a `PushPreferences` field on `NotificationPreferences`) so they don't
37
+ // show up as duplicate endpoints. For all other languages we fall back
38
+ // to the original keyword scan — those grammars will be wired later.
39
+ const javaTrees = [];
40
+ const javaFiles = new Map();
41
+ for (const [p, content] of allFiles) {
42
+ if (fileLanguage.get(p) === "java")
43
+ javaFiles.set(p, content);
44
+ }
45
+ if (javaFiles.size > 0) {
46
+ const parsed = await parseJavaFiles(javaFiles);
47
+ const { trees } = buildClassTrees(parsed);
48
+ javaTrees.push(...trees);
49
+ }
50
+ const annotated = [];
51
+ const reachableFiles = new Set();
52
+ for (const tree of javaTrees) {
53
+ const content = allFiles.get(tree.rootFile) ?? "";
54
+ const className = tree.rootClass;
55
+ const configEnd = extractEnd(content) ?? toSnakeCase(className);
56
+ const gitSha = await gitHashObject(tree.rootFile, cwd).catch(() => "");
57
+ annotated.push({
58
+ classUniqueId: tree.rootFile,
59
+ className,
60
+ configEnd,
61
+ filePath: tree.rootFile,
62
+ language: "java",
63
+ gitSha,
64
+ relatedFiles: Array.from(tree.reachableFiles),
65
+ visitedClasses: tree.visitedClasses,
66
+ subsumedConfiqureClasses: tree.subsumedConfiqureClasses,
67
+ });
68
+ for (const f of tree.reachableFiles)
69
+ reachableFiles.add(f);
70
+ }
71
+ // ── Non-Java: legacy keyword scan ─────────────────────────────────────
72
+ for (const [filePath, content] of allFiles) {
73
+ const langKey = fileLanguage.get(filePath);
74
+ if (!langKey || langKey === "java")
75
+ continue;
76
+ const bucket = buckets.find((b) => b.langKey === langKey);
77
+ if (!bucket || !content.includes(bucket.tokenPattern))
78
+ continue;
79
+ const ext = extname(filePath);
80
+ const className = basename(filePath, ext);
81
+ const configEnd = extractEnd(content) ?? toSnakeCase(className);
82
+ const gitSha = await gitHashObject(filePath, cwd).catch(() => "");
83
+ annotated.push({
84
+ classUniqueId: filePath,
85
+ className,
86
+ configEnd,
87
+ filePath,
88
+ language: langKey,
89
+ gitSha,
90
+ relatedFiles: [filePath],
91
+ visitedClasses: [className],
92
+ subsumedConfiqureClasses: [],
93
+ });
94
+ reachableFiles.add(filePath);
95
+ }
96
+ const langCounts = new Map();
97
+ for (const c of annotated) {
98
+ langCounts.set(c.language, (langCounts.get(c.language) ?? 0) + 1);
99
+ }
100
+ let primaryLanguage = "java";
101
+ let max = 0;
102
+ for (const [lang, n] of langCounts) {
103
+ if (n > max) {
104
+ max = n;
105
+ primaryLanguage = lang;
106
+ }
107
+ }
108
+ return { annotated, allFiles, primaryLanguage, reachableFiles };
109
+ }
110
+ function extractEnd(source) {
111
+ const m = source.match(/\b[Ee]nd\s*[:=]\s*["']([^"']+)["']/);
112
+ return m ? m[1] : null;
113
+ }
114
+ function toSnakeCase(s) {
115
+ return s
116
+ .replace(/([a-z0-9])([A-Z])/g, "$1_$2")
117
+ .replace(/([A-Z]+)([A-Z][a-z])/g, "$1_$2")
118
+ .toLowerCase();
119
+ }
120
+ //# sourceMappingURL=scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["../src/scan.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "@confiqure/cli",
3
+ "version": "0.1.0",
4
+ "description": "confiqure.ai CLI — push @Confiqure-annotated classes to your workspace",
5
+ "type": "module",
6
+ "bin": {
7
+ "confiqure": "./dist/index.js"
8
+ },
9
+ "main": "./dist/index.js",
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "dev": "tsx src/index.ts",
13
+ "start": "node dist/index.js",
14
+ "prepublishOnly": "npm run build"
15
+ },
16
+ "engines": {
17
+ "node": ">=18"
18
+ },
19
+ "files": [
20
+ "dist",
21
+ "README.md",
22
+ "LICENSE"
23
+ ],
24
+ "keywords": [
25
+ "confiqure",
26
+ "cli",
27
+ "ai",
28
+ "configuration",
29
+ "chat",
30
+ "annotations"
31
+ ],
32
+ "homepage": "https://confiqure.ai",
33
+ "repository": {
34
+ "type": "git",
35
+ "url": "git+https://github.com/Omer-Ozturk-SJSU/confiqure-cli.git"
36
+ },
37
+ "bugs": {
38
+ "url": "https://github.com/Omer-Ozturk-SJSU/confiqure-cli/issues"
39
+ },
40
+ "license": "MIT",
41
+ "dependencies": {
42
+ "@inquirer/prompts": "^7.0.0",
43
+ "chalk": "^5.3.0",
44
+ "commander": "^12.1.0",
45
+ "fast-glob": "^3.3.2",
46
+ "tree-sitter-wasms": "^0.1.13",
47
+ "web-tree-sitter": "^0.22.6"
48
+ },
49
+ "devDependencies": {
50
+ "@types/node": "^22.5.0",
51
+ "tsx": "^4.19.0",
52
+ "typescript": "^5.5.0"
53
+ }
54
+ }