kord-aios 3.3.5 → 3.3.6
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/cli/config-manager.d.ts +6 -0
- package/dist/cli/doctor/checks/index.d.ts +1 -0
- package/dist/cli/doctor/checks/project-structure.d.ts +3 -0
- package/dist/cli/doctor/constants.d.ts +1 -0
- package/dist/cli/index.js +302 -260
- package/dist/cli/init/index.d.ts +6 -0
- package/dist/cli/project-layout.d.ts +10 -0
- package/dist/config/schema.d.ts +4 -0
- package/dist/features/builtin-commands/templates/git-commit.d.ts +1 -0
- package/dist/features/builtin-commands/templates/git-create-pr.d.ts +1 -0
- package/dist/features/builtin-commands/types.d.ts +1 -1
- package/dist/index.js +88 -20
- package/package.json +8 -8
|
@@ -168,5 +168,11 @@ export declare const ANTIGRAVITY_PROVIDER_CONFIG: {
|
|
|
168
168
|
};
|
|
169
169
|
};
|
|
170
170
|
export declare function addProviderConfig(config: InstallConfig): ConfigMergeResult;
|
|
171
|
+
export declare function detectProvidersFromKordAiosConfig(): {
|
|
172
|
+
hasOpenAI: boolean;
|
|
173
|
+
hasOpencodeZen: boolean;
|
|
174
|
+
hasZaiCodingPlan: boolean;
|
|
175
|
+
hasKimiForCoding: boolean;
|
|
176
|
+
};
|
|
171
177
|
export declare function detectCurrentConfig(): DetectedConfig;
|
|
172
178
|
export {};
|
|
@@ -31,6 +31,7 @@ export declare const CHECK_IDS: {
|
|
|
31
31
|
readonly MCP_OAUTH_TOKENS: "mcp-oauth-tokens";
|
|
32
32
|
readonly VERSION_STATUS: "version-status";
|
|
33
33
|
readonly PROJECT_LAYOUT: "project-layout";
|
|
34
|
+
readonly PROJECT_STRUCTURE: "project-structure";
|
|
34
35
|
};
|
|
35
36
|
export declare const CHECK_NAMES: Record<string, string>;
|
|
36
37
|
export declare const CATEGORY_NAMES: Record<string, string>;
|
package/dist/cli/index.js
CHANGED
|
@@ -6123,29 +6123,11 @@ function getTauriConfigDir(identifier) {
|
|
|
6123
6123
|
}
|
|
6124
6124
|
}
|
|
6125
6125
|
}
|
|
6126
|
-
function getCliConfigDir(
|
|
6126
|
+
function getCliConfigDir(_checkExisting) {
|
|
6127
6127
|
const envConfigDir = process.env.OPENCODE_CONFIG_DIR?.trim();
|
|
6128
6128
|
if (envConfigDir) {
|
|
6129
6129
|
return resolve(envConfigDir);
|
|
6130
6130
|
}
|
|
6131
|
-
if (process.platform === "win32") {
|
|
6132
|
-
const appData = process.env.APPDATA || join4(homedir2(), "AppData", "Roaming");
|
|
6133
|
-
const appdataDir = join4(appData, "opencode");
|
|
6134
|
-
const appdataConfig = join4(appdataDir, "opencode.json");
|
|
6135
|
-
const appdataConfigC = join4(appdataDir, "opencode.jsonc");
|
|
6136
|
-
const crossPlatformDir = join4(homedir2(), ".config", "opencode");
|
|
6137
|
-
const crossPlatformConfig = join4(crossPlatformDir, "opencode.json");
|
|
6138
|
-
const crossPlatformConfigC = join4(crossPlatformDir, "opencode.jsonc");
|
|
6139
|
-
if (checkExisting) {
|
|
6140
|
-
if (existsSync3(appdataConfig) || existsSync3(appdataConfigC)) {
|
|
6141
|
-
return appdataDir;
|
|
6142
|
-
}
|
|
6143
|
-
if (existsSync3(crossPlatformConfig) || existsSync3(crossPlatformConfigC)) {
|
|
6144
|
-
return crossPlatformDir;
|
|
6145
|
-
}
|
|
6146
|
-
}
|
|
6147
|
-
return appdataDir;
|
|
6148
|
-
}
|
|
6149
6131
|
const xdgConfig = process.env.XDG_CONFIG_HOME || join4(homedir2(), ".config");
|
|
6150
6132
|
return join4(xdgConfig, "opencode");
|
|
6151
6133
|
}
|
|
@@ -20096,13 +20078,13 @@ function addProviderConfig(config2) {
|
|
|
20096
20078
|
function detectProvidersFromKordAiosConfig() {
|
|
20097
20079
|
const kordAiosConfigPath = getKordAiosConfig();
|
|
20098
20080
|
if (!existsSync7(kordAiosConfigPath)) {
|
|
20099
|
-
return { hasOpenAI:
|
|
20081
|
+
return { hasOpenAI: false, hasOpencodeZen: false, hasZaiCodingPlan: false, hasKimiForCoding: false };
|
|
20100
20082
|
}
|
|
20101
20083
|
try {
|
|
20102
20084
|
const content = readFileSync6(kordAiosConfigPath, "utf-8");
|
|
20103
20085
|
const kordAiosConfig = parseJsonc(content);
|
|
20104
20086
|
if (!kordAiosConfig || typeof kordAiosConfig !== "object") {
|
|
20105
|
-
return { hasOpenAI:
|
|
20087
|
+
return { hasOpenAI: false, hasOpencodeZen: false, hasZaiCodingPlan: false, hasKimiForCoding: false };
|
|
20106
20088
|
}
|
|
20107
20089
|
const configStr = JSON.stringify(kordAiosConfig);
|
|
20108
20090
|
const hasOpenAI = configStr.includes('"openai/');
|
|
@@ -20111,18 +20093,18 @@ function detectProvidersFromKordAiosConfig() {
|
|
|
20111
20093
|
const hasKimiForCoding = configStr.includes('"kimi-for-coding/');
|
|
20112
20094
|
return { hasOpenAI, hasOpencodeZen, hasZaiCodingPlan, hasKimiForCoding };
|
|
20113
20095
|
} catch {
|
|
20114
|
-
return { hasOpenAI:
|
|
20096
|
+
return { hasOpenAI: false, hasOpencodeZen: false, hasZaiCodingPlan: false, hasKimiForCoding: false };
|
|
20115
20097
|
}
|
|
20116
20098
|
}
|
|
20117
20099
|
function detectCurrentConfig() {
|
|
20118
20100
|
const result = {
|
|
20119
20101
|
isInstalled: false,
|
|
20120
|
-
hasClaude:
|
|
20121
|
-
isMax20:
|
|
20122
|
-
hasOpenAI:
|
|
20102
|
+
hasClaude: false,
|
|
20103
|
+
isMax20: false,
|
|
20104
|
+
hasOpenAI: false,
|
|
20123
20105
|
hasGemini: false,
|
|
20124
20106
|
hasCopilot: false,
|
|
20125
|
-
hasOpencodeZen:
|
|
20107
|
+
hasOpencodeZen: false,
|
|
20126
20108
|
hasZaiCodingPlan: false,
|
|
20127
20109
|
hasKimiForCoding: false
|
|
20128
20110
|
};
|
|
@@ -21489,11 +21471,8 @@ import { join as join8 } from "path";
|
|
|
21489
21471
|
var KORD_DIR = ".kord";
|
|
21490
21472
|
var KORD_DOCS_DIR = "docs/kord";
|
|
21491
21473
|
var KORD_RULES_FILE = "kord-rules.md";
|
|
21492
|
-
var
|
|
21493
|
-
"scripts",
|
|
21474
|
+
var KORD_ACTIVE_SUBDIRS = [
|
|
21494
21475
|
"templates",
|
|
21495
|
-
"checklists",
|
|
21496
|
-
"skills",
|
|
21497
21476
|
"squads"
|
|
21498
21477
|
];
|
|
21499
21478
|
var KORD_OUTPUT_SUBDIRS = [
|
|
@@ -21733,92 +21712,10 @@ function runPostInstallDoctor(cwd, options) {
|
|
|
21733
21712
|
|
|
21734
21713
|
// src/cli/install.ts
|
|
21735
21714
|
init_config_manager();
|
|
21736
|
-
|
|
21737
|
-
// src/cli/kord-directory.ts
|
|
21738
|
-
import { existsSync as existsSync8, mkdirSync as mkdirSync3 } from "fs";
|
|
21739
|
-
import { join as join9 } from "path";
|
|
21740
|
-
function createKordDirectory(projectDir) {
|
|
21741
|
-
const kordPath = join9(projectDir, KORD_DIR);
|
|
21742
|
-
const alreadyExists = existsSync8(kordPath);
|
|
21743
|
-
try {
|
|
21744
|
-
if (!alreadyExists) {
|
|
21745
|
-
mkdirSync3(kordPath, { recursive: true });
|
|
21746
|
-
}
|
|
21747
|
-
for (const subdir of KORD_INPUT_SUBDIRS) {
|
|
21748
|
-
const subdirPath = join9(kordPath, subdir);
|
|
21749
|
-
if (!existsSync8(subdirPath)) {
|
|
21750
|
-
mkdirSync3(subdirPath, { recursive: true });
|
|
21751
|
-
}
|
|
21752
|
-
}
|
|
21753
|
-
return {
|
|
21754
|
-
success: true,
|
|
21755
|
-
created: !alreadyExists,
|
|
21756
|
-
kordPath
|
|
21757
|
-
};
|
|
21758
|
-
} catch (error45) {
|
|
21759
|
-
const message = error45 instanceof Error ? error45.message : String(error45);
|
|
21760
|
-
return {
|
|
21761
|
-
success: false,
|
|
21762
|
-
created: false,
|
|
21763
|
-
kordPath,
|
|
21764
|
-
error: message
|
|
21765
|
-
};
|
|
21766
|
-
}
|
|
21767
|
-
}
|
|
21768
|
-
|
|
21769
|
-
// src/cli/scaffolder.ts
|
|
21770
|
-
import { existsSync as existsSync9, mkdirSync as mkdirSync4, writeFileSync as writeFileSync4 } from "fs";
|
|
21771
|
-
import { join as join10 } from "path";
|
|
21772
|
-
var GITKEEP = "";
|
|
21773
|
-
function getScaffoldEntries(baseDir) {
|
|
21774
|
-
const entries = [];
|
|
21775
|
-
for (const subdir of KORD_OUTPUT_SUBDIRS) {
|
|
21776
|
-
const dirPath = join10(baseDir, KORD_DOCS_DIR, subdir);
|
|
21777
|
-
entries.push({ path: dirPath, isDir: true });
|
|
21778
|
-
entries.push({ path: join10(dirPath, ".gitkeep"), content: GITKEEP });
|
|
21779
|
-
}
|
|
21780
|
-
const templatesDir = join10(baseDir, KORD_DIR, "templates");
|
|
21781
|
-
entries.push({ path: templatesDir, isDir: true });
|
|
21782
|
-
entries.push({ path: join10(templatesDir, "story.md"), content: STORY_TEMPLATE_CONTENT });
|
|
21783
|
-
entries.push({ path: join10(templatesDir, "adr.md"), content: ADR_TEMPLATE_CONTENT });
|
|
21784
|
-
entries.push({ path: join10(baseDir, KORD_RULES_FILE), content: KORD_RULES_CONTENT });
|
|
21785
|
-
return entries;
|
|
21786
|
-
}
|
|
21787
|
-
function scaffoldProject(options) {
|
|
21788
|
-
const { directory, force = false } = options;
|
|
21789
|
-
const result = { created: [], skipped: [], errors: [] };
|
|
21790
|
-
const entries = getScaffoldEntries(directory);
|
|
21791
|
-
for (const entry of entries) {
|
|
21792
|
-
try {
|
|
21793
|
-
if (entry.isDir) {
|
|
21794
|
-
if (!existsSync9(entry.path)) {
|
|
21795
|
-
mkdirSync4(entry.path, { recursive: true });
|
|
21796
|
-
result.created.push(entry.path);
|
|
21797
|
-
} else {
|
|
21798
|
-
result.skipped.push(entry.path);
|
|
21799
|
-
}
|
|
21800
|
-
} else if (entry.content !== undefined) {
|
|
21801
|
-
if (!existsSync9(entry.path) || force) {
|
|
21802
|
-
const dir = join10(entry.path, "..");
|
|
21803
|
-
if (!existsSync9(dir)) {
|
|
21804
|
-
mkdirSync4(dir, { recursive: true });
|
|
21805
|
-
}
|
|
21806
|
-
writeFileSync4(entry.path, entry.content, "utf-8");
|
|
21807
|
-
result.created.push(entry.path);
|
|
21808
|
-
} else {
|
|
21809
|
-
result.skipped.push(entry.path);
|
|
21810
|
-
}
|
|
21811
|
-
}
|
|
21812
|
-
} catch (err) {
|
|
21813
|
-
result.errors.push(`${entry.path}: ${err instanceof Error ? err.message : String(err)}`);
|
|
21814
|
-
}
|
|
21815
|
-
}
|
|
21816
|
-
return result;
|
|
21817
|
-
}
|
|
21818
21715
|
// package.json
|
|
21819
21716
|
var package_default = {
|
|
21820
21717
|
name: "kord-aios",
|
|
21821
|
-
version: "3.3.
|
|
21718
|
+
version: "3.3.6",
|
|
21822
21719
|
description: "Kord AIOS: multi-model orchestration with story-driven development methodology",
|
|
21823
21720
|
main: "dist/index.js",
|
|
21824
21721
|
types: "dist/index.d.ts",
|
|
@@ -21900,13 +21797,13 @@ var package_default = {
|
|
|
21900
21797
|
typescript: "^5.7.3"
|
|
21901
21798
|
},
|
|
21902
21799
|
optionalDependencies: {
|
|
21903
|
-
"kord-aios-darwin-arm64": "3.3.
|
|
21904
|
-
"kord-aios-darwin-x64": "3.3.
|
|
21905
|
-
"kord-aios-linux-arm64": "3.3.
|
|
21906
|
-
"kord-aios-linux-arm64-musl": "3.3.
|
|
21907
|
-
"kord-aios-linux-x64": "3.3.
|
|
21908
|
-
"kord-aios-linux-x64-musl": "3.3.
|
|
21909
|
-
"kord-aios-windows-x64": "3.3.
|
|
21800
|
+
"kord-aios-darwin-arm64": "3.3.6",
|
|
21801
|
+
"kord-aios-darwin-x64": "3.3.6",
|
|
21802
|
+
"kord-aios-linux-arm64": "3.3.6",
|
|
21803
|
+
"kord-aios-linux-arm64-musl": "3.3.6",
|
|
21804
|
+
"kord-aios-linux-x64": "3.3.6",
|
|
21805
|
+
"kord-aios-linux-x64-musl": "3.3.6",
|
|
21806
|
+
"kord-aios-windows-x64": "3.3.6"
|
|
21910
21807
|
},
|
|
21911
21808
|
trustedDependencies: [
|
|
21912
21809
|
"@ast-grep/cli",
|
|
@@ -22247,7 +22144,7 @@ async function runNonTuiInstallWithArgs(args, detected) {
|
|
|
22247
22144
|
const isUpdate = effectiveStatus === "existing";
|
|
22248
22145
|
printHeader(isUpdate);
|
|
22249
22146
|
printInfo(getMaturityMessage(effectiveStatus));
|
|
22250
|
-
const totalSteps =
|
|
22147
|
+
const totalSteps = 4;
|
|
22251
22148
|
let step = 1;
|
|
22252
22149
|
printStep(step++, totalSteps, "Checking OpenCode installation...");
|
|
22253
22150
|
const installed = await isKordAiosInstalled();
|
|
@@ -22295,29 +22192,6 @@ async function runNonTuiInstallWithArgs(args, detected) {
|
|
|
22295
22192
|
return 1;
|
|
22296
22193
|
}
|
|
22297
22194
|
printSuccess(`Config written ${SYMBOLS.arrow} ${import_picocolors2.default.dim(kordAiosResult.configPath)}`);
|
|
22298
|
-
const projectConfigResult = writeProjectKordAiosConfig(process.cwd());
|
|
22299
|
-
if (!projectConfigResult.success) {
|
|
22300
|
-
printWarning(`Project config write warning: ${projectConfigResult.error} ${SYMBOLS.arrow} ${import_picocolors2.default.dim(projectConfigResult.configPath)}`);
|
|
22301
|
-
} else {
|
|
22302
|
-
printSuccess(`Project config written ${SYMBOLS.arrow} ${import_picocolors2.default.dim(projectConfigResult.configPath)}`);
|
|
22303
|
-
}
|
|
22304
|
-
printStep(step++, totalSteps, "Creating .kord/ directory structure...");
|
|
22305
|
-
const kordDirResult = createKordDirectory(process.cwd());
|
|
22306
|
-
if (!kordDirResult.success) {
|
|
22307
|
-
printWarning(`Could not create .kord/ directory: ${kordDirResult.error}`);
|
|
22308
|
-
} else if (kordDirResult.created) {
|
|
22309
|
-
printSuccess(`.kord/ directory created ${SYMBOLS.arrow} ${import_picocolors2.default.dim(kordDirResult.kordPath)}`);
|
|
22310
|
-
} else {
|
|
22311
|
-
printSuccess(`.kord/ directory verified ${SYMBOLS.arrow} ${import_picocolors2.default.dim(kordDirResult.kordPath)}`);
|
|
22312
|
-
}
|
|
22313
|
-
const scaffoldResult = scaffoldProject({ directory: process.cwd() });
|
|
22314
|
-
if (scaffoldResult.errors.length > 0) {
|
|
22315
|
-
printWarning(`Project scaffold warnings: ${scaffoldResult.errors.join("; ")}`);
|
|
22316
|
-
} else if (scaffoldResult.created.length > 0) {
|
|
22317
|
-
printSuccess(`Project scaffolded (${scaffoldResult.created.length} created, ${scaffoldResult.skipped.length} skipped)`);
|
|
22318
|
-
} else {
|
|
22319
|
-
printSuccess(`Project scaffold verified (${scaffoldResult.skipped.length} skipped)`);
|
|
22320
|
-
}
|
|
22321
22195
|
if (!args.skipDoctor) {
|
|
22322
22196
|
printStep(step++, totalSteps, "Running post-install verification...");
|
|
22323
22197
|
const doctorResult = runPostInstallDoctor(process.cwd());
|
|
@@ -22350,6 +22224,13 @@ async function runNonTuiInstallWithArgs(args, detected) {
|
|
|
22350
22224
|
console.log(`${SYMBOLS.star} ${import_picocolors2.default.bold(import_picocolors2.default.green(isUpdate ? "Configuration updated!" : "Installation complete!"))}`);
|
|
22351
22225
|
console.log(` Run ${import_picocolors2.default.cyan("opencode")} to start!`);
|
|
22352
22226
|
console.log();
|
|
22227
|
+
if (!isUpdate) {
|
|
22228
|
+
printBox(`To set up a project with Kord AIOS:
|
|
22229
|
+
` + ` ${import_picocolors2.default.cyan("cd your-project-directory")}
|
|
22230
|
+
` + ` ${import_picocolors2.default.cyan("bunx kord-aios init")}
|
|
22231
|
+
|
|
22232
|
+
` + import_picocolors2.default.dim("This will create .kord/, .opencode/, and baseline files."), "Project Setup");
|
|
22233
|
+
}
|
|
22353
22234
|
printBox(`${import_picocolors2.default.bold("Pro Tip:")} Include ${import_picocolors2.default.cyan("ultrawork")} (or ${import_picocolors2.default.cyan("ulw")}) in your prompt.
|
|
22354
22235
|
` + `All features work like magic\u2014parallel agents, background tasks,
|
|
22355
22236
|
` + `deep exploration, and relentless execution until completion.`, "The Magic Word");
|
|
@@ -22429,31 +22310,6 @@ async function install(args) {
|
|
|
22429
22310
|
return 1;
|
|
22430
22311
|
}
|
|
22431
22312
|
s.stop(`Config written to ${import_picocolors2.default.cyan(kordAiosResult.configPath)}`);
|
|
22432
|
-
s.start("Writing project-level Kord AIOS configuration");
|
|
22433
|
-
const projectConfigResult = writeProjectKordAiosConfig(process.cwd());
|
|
22434
|
-
if (!projectConfigResult.success) {
|
|
22435
|
-
s.stop(`Project config warning: ${projectConfigResult.error} ${import_picocolors2.default.yellow("[!]")} ${import_picocolors2.default.cyan(projectConfigResult.configPath)}`);
|
|
22436
|
-
} else {
|
|
22437
|
-
s.stop(`Project config written to ${import_picocolors2.default.cyan(projectConfigResult.configPath)}`);
|
|
22438
|
-
}
|
|
22439
|
-
s.start("Creating .kord/ directory structure");
|
|
22440
|
-
const kordDirResult = createKordDirectory(process.cwd());
|
|
22441
|
-
if (!kordDirResult.success) {
|
|
22442
|
-
s.stop(`.kord/ directory warning: ${kordDirResult.error} ${import_picocolors2.default.yellow("[!]")}`);
|
|
22443
|
-
} else if (kordDirResult.created) {
|
|
22444
|
-
s.stop(`.kord/ directory created at ${import_picocolors2.default.cyan(kordDirResult.kordPath)}`);
|
|
22445
|
-
} else {
|
|
22446
|
-
s.stop(`.kord/ directory verified at ${import_picocolors2.default.cyan(kordDirResult.kordPath)}`);
|
|
22447
|
-
}
|
|
22448
|
-
s.start("Scaffolding project baseline (templates + docs)");
|
|
22449
|
-
const scaffoldResult = scaffoldProject({ directory: process.cwd() });
|
|
22450
|
-
if (scaffoldResult.errors.length > 0) {
|
|
22451
|
-
s.stop(`Project scaffold warnings: ${scaffoldResult.errors.join("; ")} ${import_picocolors2.default.yellow("[!]")}`);
|
|
22452
|
-
} else if (scaffoldResult.created.length > 0) {
|
|
22453
|
-
s.stop(`Project scaffolded (${scaffoldResult.created.length} created, ${scaffoldResult.skipped.length} skipped)`);
|
|
22454
|
-
} else {
|
|
22455
|
-
s.stop(`Project scaffold verified (${scaffoldResult.skipped.length} skipped)`);
|
|
22456
|
-
}
|
|
22457
22313
|
if (!args.skipDoctor) {
|
|
22458
22314
|
s.start("Running post-install verification");
|
|
22459
22315
|
const doctorResult = runPostInstallDoctor(process.cwd());
|
|
@@ -22485,6 +22341,13 @@ async function install(args) {
|
|
|
22485
22341
|
Me(formatConfigSummary(config2), isUpdate ? "Updated Configuration" : "Installation Complete");
|
|
22486
22342
|
M2.success(import_picocolors2.default.bold(isUpdate ? "Configuration updated!" : "Installation complete!"));
|
|
22487
22343
|
M2.message(`Run ${import_picocolors2.default.cyan("opencode")} to start!`);
|
|
22344
|
+
if (!isUpdate) {
|
|
22345
|
+
Me(`To set up a project with Kord AIOS:
|
|
22346
|
+
` + ` ${import_picocolors2.default.cyan("cd your-project-directory")}
|
|
22347
|
+
` + ` ${import_picocolors2.default.cyan("bunx kord-aios init")}
|
|
22348
|
+
|
|
22349
|
+
` + import_picocolors2.default.dim("This will create .kord/, .opencode/, and baseline files."), "Project Setup");
|
|
22350
|
+
}
|
|
22488
22351
|
Me(`Include ${import_picocolors2.default.cyan("ultrawork")} (or ${import_picocolors2.default.cyan("ulw")}) in your prompt.
|
|
22489
22352
|
` + `All features work like magic\u2014parallel agents, background tasks,
|
|
22490
22353
|
` + `deep exploration, and relentless execution until completion.`, "The Magic Word");
|
|
@@ -22511,23 +22374,112 @@ async function install(args) {
|
|
|
22511
22374
|
return 0;
|
|
22512
22375
|
}
|
|
22513
22376
|
|
|
22377
|
+
// src/cli/kord-directory.ts
|
|
22378
|
+
import { existsSync as existsSync8, mkdirSync as mkdirSync3 } from "fs";
|
|
22379
|
+
import { join as join9 } from "path";
|
|
22380
|
+
function createKordDirectory(projectDir) {
|
|
22381
|
+
const kordPath = join9(projectDir, KORD_DIR);
|
|
22382
|
+
const alreadyExists = existsSync8(kordPath);
|
|
22383
|
+
try {
|
|
22384
|
+
if (!alreadyExists) {
|
|
22385
|
+
mkdirSync3(kordPath, { recursive: true });
|
|
22386
|
+
}
|
|
22387
|
+
for (const subdir of KORD_ACTIVE_SUBDIRS) {
|
|
22388
|
+
const subdirPath = join9(kordPath, subdir);
|
|
22389
|
+
if (!existsSync8(subdirPath)) {
|
|
22390
|
+
mkdirSync3(subdirPath, { recursive: true });
|
|
22391
|
+
}
|
|
22392
|
+
}
|
|
22393
|
+
return {
|
|
22394
|
+
success: true,
|
|
22395
|
+
created: !alreadyExists,
|
|
22396
|
+
kordPath
|
|
22397
|
+
};
|
|
22398
|
+
} catch (error45) {
|
|
22399
|
+
const message = error45 instanceof Error ? error45.message : String(error45);
|
|
22400
|
+
return {
|
|
22401
|
+
success: false,
|
|
22402
|
+
created: false,
|
|
22403
|
+
kordPath,
|
|
22404
|
+
error: message
|
|
22405
|
+
};
|
|
22406
|
+
}
|
|
22407
|
+
}
|
|
22408
|
+
|
|
22409
|
+
// src/cli/scaffolder.ts
|
|
22410
|
+
import { existsSync as existsSync9, mkdirSync as mkdirSync4, writeFileSync as writeFileSync4 } from "fs";
|
|
22411
|
+
import { join as join10 } from "path";
|
|
22412
|
+
var GITKEEP = "";
|
|
22413
|
+
function getScaffoldEntries(baseDir) {
|
|
22414
|
+
const entries = [];
|
|
22415
|
+
for (const subdir of KORD_OUTPUT_SUBDIRS) {
|
|
22416
|
+
const dirPath = join10(baseDir, KORD_DOCS_DIR, subdir);
|
|
22417
|
+
entries.push({ path: dirPath, isDir: true });
|
|
22418
|
+
entries.push({ path: join10(dirPath, ".gitkeep"), content: GITKEEP });
|
|
22419
|
+
}
|
|
22420
|
+
const templatesDir = join10(baseDir, KORD_DIR, "templates");
|
|
22421
|
+
entries.push({ path: templatesDir, isDir: true });
|
|
22422
|
+
entries.push({ path: join10(templatesDir, "story.md"), content: STORY_TEMPLATE_CONTENT });
|
|
22423
|
+
entries.push({ path: join10(templatesDir, "adr.md"), content: ADR_TEMPLATE_CONTENT });
|
|
22424
|
+
entries.push({ path: join10(baseDir, KORD_RULES_FILE), content: KORD_RULES_CONTENT });
|
|
22425
|
+
return entries;
|
|
22426
|
+
}
|
|
22427
|
+
function scaffoldProject(options) {
|
|
22428
|
+
const { directory, force = false } = options;
|
|
22429
|
+
const result = { created: [], skipped: [], errors: [] };
|
|
22430
|
+
const entries = getScaffoldEntries(directory);
|
|
22431
|
+
for (const entry of entries) {
|
|
22432
|
+
try {
|
|
22433
|
+
if (entry.isDir) {
|
|
22434
|
+
if (!existsSync9(entry.path)) {
|
|
22435
|
+
mkdirSync4(entry.path, { recursive: true });
|
|
22436
|
+
result.created.push(entry.path);
|
|
22437
|
+
} else {
|
|
22438
|
+
result.skipped.push(entry.path);
|
|
22439
|
+
}
|
|
22440
|
+
} else if (entry.content !== undefined) {
|
|
22441
|
+
if (!existsSync9(entry.path) || force) {
|
|
22442
|
+
const dir = join10(entry.path, "..");
|
|
22443
|
+
if (!existsSync9(dir)) {
|
|
22444
|
+
mkdirSync4(dir, { recursive: true });
|
|
22445
|
+
}
|
|
22446
|
+
writeFileSync4(entry.path, entry.content, "utf-8");
|
|
22447
|
+
result.created.push(entry.path);
|
|
22448
|
+
} else {
|
|
22449
|
+
result.skipped.push(entry.path);
|
|
22450
|
+
}
|
|
22451
|
+
}
|
|
22452
|
+
} catch (err) {
|
|
22453
|
+
result.errors.push(`${entry.path}: ${err instanceof Error ? err.message : String(err)}`);
|
|
22454
|
+
}
|
|
22455
|
+
}
|
|
22456
|
+
return result;
|
|
22457
|
+
}
|
|
22458
|
+
|
|
22514
22459
|
// src/cli/init/index.ts
|
|
22515
22460
|
init_config_manager();
|
|
22516
22461
|
var import_picocolors3 = __toESM(require_picocolors(), 1);
|
|
22462
|
+
import { existsSync as existsSync10, mkdirSync as mkdirSync5, cpSync } from "fs";
|
|
22463
|
+
import { join as join11 } from "path";
|
|
22464
|
+
var BUILTIN_SQUAD_PATH = join11(import.meta.dir, "..", "..", "features", "builtin-squads", "code");
|
|
22465
|
+
var BUILTIN_SQUAD_FILE = "SQUAD.yaml";
|
|
22517
22466
|
async function init(options) {
|
|
22518
22467
|
const cwd = options.directory ?? process.cwd();
|
|
22468
|
+
const force = options.force ?? false;
|
|
22519
22469
|
const kordResult = createKordDirectory(cwd);
|
|
22520
22470
|
const scaffoldResult = scaffoldProject({
|
|
22521
22471
|
directory: cwd,
|
|
22522
|
-
force
|
|
22472
|
+
force
|
|
22523
22473
|
});
|
|
22474
|
+
const squadExportResult = exportCodeSquad(cwd, force);
|
|
22524
22475
|
const configResult = writeProjectKordAiosConfig(cwd);
|
|
22525
22476
|
printInitResults({
|
|
22526
22477
|
kordCreated: kordResult.created,
|
|
22527
22478
|
scaffold: scaffoldResult,
|
|
22479
|
+
squadExport: squadExportResult,
|
|
22528
22480
|
config: configResult
|
|
22529
22481
|
});
|
|
22530
|
-
const success2 = kordResult.success && configResult.success;
|
|
22482
|
+
const success2 = kordResult.success && squadExportResult.success && configResult.success;
|
|
22531
22483
|
return {
|
|
22532
22484
|
success: success2,
|
|
22533
22485
|
kordDirectory: {
|
|
@@ -22535,6 +22487,7 @@ async function init(options) {
|
|
|
22535
22487
|
created: kordResult.created
|
|
22536
22488
|
},
|
|
22537
22489
|
scaffold: scaffoldResult,
|
|
22490
|
+
squadExport: squadExportResult,
|
|
22538
22491
|
config: {
|
|
22539
22492
|
success: configResult.success,
|
|
22540
22493
|
configPath: configResult.configPath,
|
|
@@ -22543,8 +22496,43 @@ async function init(options) {
|
|
|
22543
22496
|
exitCode: success2 ? 0 : 1
|
|
22544
22497
|
};
|
|
22545
22498
|
}
|
|
22499
|
+
function exportCodeSquad(projectDir, force) {
|
|
22500
|
+
try {
|
|
22501
|
+
const sourceSquadPath = join11(BUILTIN_SQUAD_PATH, BUILTIN_SQUAD_FILE);
|
|
22502
|
+
const targetSquadDir = join11(projectDir, KORD_DIR, "squads", "code");
|
|
22503
|
+
const targetSquadPath = join11(targetSquadDir, BUILTIN_SQUAD_FILE);
|
|
22504
|
+
if (!existsSync10(sourceSquadPath)) {
|
|
22505
|
+
return {
|
|
22506
|
+
success: false,
|
|
22507
|
+
exported: false,
|
|
22508
|
+
error: `Builtin squad not found at ${sourceSquadPath}`
|
|
22509
|
+
};
|
|
22510
|
+
}
|
|
22511
|
+
if (!force && existsSync10(targetSquadPath)) {
|
|
22512
|
+
return {
|
|
22513
|
+
success: true,
|
|
22514
|
+
exported: false
|
|
22515
|
+
};
|
|
22516
|
+
}
|
|
22517
|
+
if (!existsSync10(targetSquadDir)) {
|
|
22518
|
+
mkdirSync5(targetSquadDir, { recursive: true });
|
|
22519
|
+
}
|
|
22520
|
+
cpSync(sourceSquadPath, targetSquadPath, { force: true });
|
|
22521
|
+
return {
|
|
22522
|
+
success: true,
|
|
22523
|
+
exported: true
|
|
22524
|
+
};
|
|
22525
|
+
} catch (error45) {
|
|
22526
|
+
const message = error45 instanceof Error ? error45.message : String(error45);
|
|
22527
|
+
return {
|
|
22528
|
+
success: false,
|
|
22529
|
+
exported: false,
|
|
22530
|
+
error: message
|
|
22531
|
+
};
|
|
22532
|
+
}
|
|
22533
|
+
}
|
|
22546
22534
|
function printInitResults(params) {
|
|
22547
|
-
const { kordCreated, scaffold, config: config2 } = params;
|
|
22535
|
+
const { kordCreated, scaffold, squadExport, config: config2 } = params;
|
|
22548
22536
|
if (kordCreated) {
|
|
22549
22537
|
console.log(`${import_picocolors3.cyan("\u2713")} ${import_picocolors3.bold(".kord/")} directory created`);
|
|
22550
22538
|
}
|
|
@@ -22556,6 +22544,9 @@ function printInitResults(params) {
|
|
|
22556
22544
|
if (totalSkipped > 0) {
|
|
22557
22545
|
console.log(`${import_picocolors3.cyan("\u25CB")} ${import_picocolors3.bold(String(totalSkipped))} file(s) skipped (already exist)`);
|
|
22558
22546
|
}
|
|
22547
|
+
if (squadExport.exported) {
|
|
22548
|
+
console.log(`${import_picocolors3.cyan("\u2713")} ${import_picocolors3.bold(".kord/squads/code/")} squad exported`);
|
|
22549
|
+
}
|
|
22559
22550
|
if (config2.success) {
|
|
22560
22551
|
console.log(`${import_picocolors3.cyan("\u2713")} ${import_picocolors3.bold(".opencode/kord-aios.json")} written`);
|
|
22561
22552
|
} else if (config2.error) {
|
|
@@ -22567,6 +22558,9 @@ function printInitResults(params) {
|
|
|
22567
22558
|
console.log(` - ${err}`);
|
|
22568
22559
|
}
|
|
22569
22560
|
}
|
|
22561
|
+
if (squadExport.error) {
|
|
22562
|
+
console.log(`${import_picocolors3.cyan("\u2717")} Squad export error: ${squadExport.error}`);
|
|
22563
|
+
}
|
|
22570
22564
|
}
|
|
22571
22565
|
// node_modules/@opencode-ai/sdk/dist/gen/core/serverSentEvents.gen.js
|
|
22572
22566
|
var createSseClient = ({ onSseError, onSseEvent, responseTransformer, responseValidator, sseDefaultRetryDelay, sseMaxRetryAttempts, sseMaxRetryDelay, sseSleepFn, url: url2, ...options }) => {
|
|
@@ -24443,7 +24437,9 @@ var BuiltinCommandNameSchema = exports_external.enum([
|
|
|
24443
24437
|
"checkpoint",
|
|
24444
24438
|
"status",
|
|
24445
24439
|
"squad",
|
|
24446
|
-
"squad-create"
|
|
24440
|
+
"squad-create",
|
|
24441
|
+
"git-commit",
|
|
24442
|
+
"git-create-pr"
|
|
24447
24443
|
]);
|
|
24448
24444
|
var AgentOverrideConfigSchema = exports_external.object({
|
|
24449
24445
|
model: exports_external.string().optional(),
|
|
@@ -25168,9 +25164,9 @@ async function getLocalVersion(options = {}) {
|
|
|
25168
25164
|
}
|
|
25169
25165
|
|
|
25170
25166
|
// src/cli/doctor/checks/opencode.ts
|
|
25171
|
-
import { existsSync as
|
|
25167
|
+
import { existsSync as existsSync14 } from "fs";
|
|
25172
25168
|
import { homedir as homedir5 } from "os";
|
|
25173
|
-
import { join as
|
|
25169
|
+
import { join as join16 } from "path";
|
|
25174
25170
|
|
|
25175
25171
|
// src/cli/doctor/constants.ts
|
|
25176
25172
|
var import_picocolors8 = __toESM(require_picocolors(), 1);
|
|
@@ -25206,7 +25202,8 @@ var CHECK_IDS = {
|
|
|
25206
25202
|
MCP_USER: "mcp-user",
|
|
25207
25203
|
MCP_OAUTH_TOKENS: "mcp-oauth-tokens",
|
|
25208
25204
|
VERSION_STATUS: "version-status",
|
|
25209
|
-
PROJECT_LAYOUT: "project-layout"
|
|
25205
|
+
PROJECT_LAYOUT: "project-layout",
|
|
25206
|
+
PROJECT_STRUCTURE: "project-structure"
|
|
25210
25207
|
};
|
|
25211
25208
|
var CHECK_NAMES = {
|
|
25212
25209
|
[CHECK_IDS.OPENCODE_INSTALLATION]: "OpenCode Installation",
|
|
@@ -25225,7 +25222,8 @@ var CHECK_NAMES = {
|
|
|
25225
25222
|
[CHECK_IDS.MCP_USER]: "User MCP Configuration",
|
|
25226
25223
|
[CHECK_IDS.MCP_OAUTH_TOKENS]: "MCP OAuth Tokens",
|
|
25227
25224
|
[CHECK_IDS.VERSION_STATUS]: "Version Status",
|
|
25228
|
-
[CHECK_IDS.PROJECT_LAYOUT]: "Project Layout"
|
|
25225
|
+
[CHECK_IDS.PROJECT_LAYOUT]: "Project Layout",
|
|
25226
|
+
[CHECK_IDS.PROJECT_STRUCTURE]: "Project Structure"
|
|
25229
25227
|
};
|
|
25230
25228
|
var CATEGORY_NAMES = {
|
|
25231
25229
|
installation: "Installation",
|
|
@@ -25250,17 +25248,17 @@ function getDesktopAppPaths(platform) {
|
|
|
25250
25248
|
case "darwin":
|
|
25251
25249
|
return [
|
|
25252
25250
|
"/Applications/OpenCode.app/Contents/MacOS/OpenCode",
|
|
25253
|
-
|
|
25251
|
+
join16(home, "Applications", "OpenCode.app", "Contents", "MacOS", "OpenCode")
|
|
25254
25252
|
];
|
|
25255
25253
|
case "win32": {
|
|
25256
25254
|
const programFiles = process.env.ProgramFiles;
|
|
25257
25255
|
const localAppData = process.env.LOCALAPPDATA;
|
|
25258
25256
|
const paths = [];
|
|
25259
25257
|
if (programFiles) {
|
|
25260
|
-
paths.push(
|
|
25258
|
+
paths.push(join16(programFiles, "OpenCode", "OpenCode.exe"));
|
|
25261
25259
|
}
|
|
25262
25260
|
if (localAppData) {
|
|
25263
|
-
paths.push(
|
|
25261
|
+
paths.push(join16(localAppData, "OpenCode", "OpenCode.exe"));
|
|
25264
25262
|
}
|
|
25265
25263
|
return paths;
|
|
25266
25264
|
}
|
|
@@ -25268,8 +25266,8 @@ function getDesktopAppPaths(platform) {
|
|
|
25268
25266
|
return [
|
|
25269
25267
|
"/usr/bin/opencode",
|
|
25270
25268
|
"/usr/lib/opencode/opencode",
|
|
25271
|
-
|
|
25272
|
-
|
|
25269
|
+
join16(home, "Applications", "opencode-desktop-linux-x86_64.AppImage"),
|
|
25270
|
+
join16(home, "Applications", "opencode-desktop-linux-aarch64.AppImage")
|
|
25273
25271
|
];
|
|
25274
25272
|
default:
|
|
25275
25273
|
return [];
|
|
@@ -25289,7 +25287,7 @@ function buildVersionCommand(binaryPath, platform) {
|
|
|
25289
25287
|
}
|
|
25290
25288
|
return [binaryPath, "--version"];
|
|
25291
25289
|
}
|
|
25292
|
-
function findDesktopBinary(platform = process.platform, checkExists =
|
|
25290
|
+
function findDesktopBinary(platform = process.platform, checkExists = existsSync14) {
|
|
25293
25291
|
const desktopPaths = getDesktopAppPaths(platform);
|
|
25294
25292
|
for (const desktopPath of desktopPaths) {
|
|
25295
25293
|
if (checkExists(desktopPath)) {
|
|
@@ -25407,14 +25405,14 @@ function getOpenCodeCheckDefinition() {
|
|
|
25407
25405
|
}
|
|
25408
25406
|
|
|
25409
25407
|
// src/cli/doctor/checks/plugin.ts
|
|
25410
|
-
import { existsSync as
|
|
25408
|
+
import { existsSync as existsSync15, readFileSync as readFileSync10 } from "fs";
|
|
25411
25409
|
init_shared();
|
|
25412
25410
|
function detectConfigPath() {
|
|
25413
25411
|
const paths = getOpenCodeConfigPaths({ binary: "opencode", version: null });
|
|
25414
|
-
if (
|
|
25412
|
+
if (existsSync15(paths.configJsonc)) {
|
|
25415
25413
|
return { path: paths.configJsonc, format: "jsonc" };
|
|
25416
25414
|
}
|
|
25417
|
-
if (
|
|
25415
|
+
if (existsSync15(paths.configJson)) {
|
|
25418
25416
|
return { path: paths.configJson, format: "json" };
|
|
25419
25417
|
}
|
|
25420
25418
|
return null;
|
|
@@ -25518,12 +25516,12 @@ function getPluginCheckDefinition() {
|
|
|
25518
25516
|
}
|
|
25519
25517
|
|
|
25520
25518
|
// src/cli/doctor/checks/config.ts
|
|
25521
|
-
import { existsSync as
|
|
25522
|
-
import { join as
|
|
25519
|
+
import { existsSync as existsSync16, readFileSync as readFileSync11 } from "fs";
|
|
25520
|
+
import { join as join17 } from "path";
|
|
25523
25521
|
init_shared();
|
|
25524
25522
|
var USER_CONFIG_DIR2 = getOpenCodeConfigDir({ binary: "opencode" });
|
|
25525
|
-
var USER_CONFIG_BASE =
|
|
25526
|
-
var PROJECT_CONFIG_BASE =
|
|
25523
|
+
var USER_CONFIG_BASE = join17(USER_CONFIG_DIR2, `${PACKAGE_NAME3}`);
|
|
25524
|
+
var PROJECT_CONFIG_BASE = join17(process.cwd(), ".opencode", PACKAGE_NAME3);
|
|
25527
25525
|
function findConfigPath() {
|
|
25528
25526
|
const projectDetected = detectConfigFile(PROJECT_CONFIG_BASE);
|
|
25529
25527
|
if (projectDetected.format !== "none") {
|
|
@@ -25563,7 +25561,7 @@ function getConfigInfo() {
|
|
|
25563
25561
|
errors: []
|
|
25564
25562
|
};
|
|
25565
25563
|
}
|
|
25566
|
-
if (!
|
|
25564
|
+
if (!existsSync16(configPath.path)) {
|
|
25567
25565
|
return {
|
|
25568
25566
|
exists: false,
|
|
25569
25567
|
path: configPath.path,
|
|
@@ -25620,20 +25618,20 @@ function getConfigCheckDefinition() {
|
|
|
25620
25618
|
}
|
|
25621
25619
|
|
|
25622
25620
|
// src/cli/doctor/checks/model-resolution.ts
|
|
25623
|
-
import { readFileSync as readFileSync12, existsSync as
|
|
25621
|
+
import { readFileSync as readFileSync12, existsSync as existsSync17 } from "fs";
|
|
25624
25622
|
init_shared();
|
|
25625
25623
|
init_model_requirements();
|
|
25626
25624
|
import { homedir as homedir6 } from "os";
|
|
25627
|
-
import { join as
|
|
25625
|
+
import { join as join18 } from "path";
|
|
25628
25626
|
function getOpenCodeCacheDir2() {
|
|
25629
25627
|
const xdgCache = process.env.XDG_CACHE_HOME;
|
|
25630
25628
|
if (xdgCache)
|
|
25631
|
-
return
|
|
25632
|
-
return
|
|
25629
|
+
return join18(xdgCache, "opencode");
|
|
25630
|
+
return join18(homedir6(), ".cache", "opencode");
|
|
25633
25631
|
}
|
|
25634
25632
|
function loadAvailableModels() {
|
|
25635
|
-
const cacheFile =
|
|
25636
|
-
if (!
|
|
25633
|
+
const cacheFile = join18(getOpenCodeCacheDir2(), "models.json");
|
|
25634
|
+
if (!existsSync17(cacheFile)) {
|
|
25637
25635
|
return { providers: [], modelCount: 0, cacheExists: false };
|
|
25638
25636
|
}
|
|
25639
25637
|
try {
|
|
@@ -25653,9 +25651,9 @@ function loadAvailableModels() {
|
|
|
25653
25651
|
}
|
|
25654
25652
|
}
|
|
25655
25653
|
var PACKAGE_NAME4 = "kord-aios";
|
|
25656
|
-
var USER_CONFIG_DIR3 =
|
|
25657
|
-
var USER_CONFIG_BASE2 =
|
|
25658
|
-
var PROJECT_CONFIG_BASE2 =
|
|
25654
|
+
var USER_CONFIG_DIR3 = join18(homedir6(), ".config", "opencode");
|
|
25655
|
+
var USER_CONFIG_BASE2 = join18(USER_CONFIG_DIR3, PACKAGE_NAME4);
|
|
25656
|
+
var PROJECT_CONFIG_BASE2 = join18(process.cwd(), ".opencode", PACKAGE_NAME4);
|
|
25659
25657
|
function loadConfig() {
|
|
25660
25658
|
const projectDetected = detectConfigFile(PROJECT_CONFIG_BASE2);
|
|
25661
25659
|
if (projectDetected.format !== "none") {
|
|
@@ -25822,20 +25820,20 @@ function getModelResolutionCheckDefinition() {
|
|
|
25822
25820
|
}
|
|
25823
25821
|
|
|
25824
25822
|
// src/cli/doctor/checks/auth.ts
|
|
25825
|
-
import { existsSync as
|
|
25826
|
-
import { join as
|
|
25823
|
+
import { existsSync as existsSync18, readFileSync as readFileSync13 } from "fs";
|
|
25824
|
+
import { join as join19 } from "path";
|
|
25827
25825
|
init_shared();
|
|
25828
25826
|
var OPENCODE_CONFIG_DIR = getOpenCodeConfigDir({ binary: "opencode" });
|
|
25829
|
-
var OPENCODE_JSON =
|
|
25830
|
-
var OPENCODE_JSONC =
|
|
25827
|
+
var OPENCODE_JSON = join19(OPENCODE_CONFIG_DIR, "opencode.json");
|
|
25828
|
+
var OPENCODE_JSONC = join19(OPENCODE_CONFIG_DIR, "opencode.jsonc");
|
|
25831
25829
|
var AUTH_PLUGINS = {
|
|
25832
25830
|
anthropic: { plugin: "builtin", name: "Anthropic (Claude)" },
|
|
25833
25831
|
openai: { plugin: "opencode-openai-codex-auth", name: "OpenAI (ChatGPT)" },
|
|
25834
25832
|
google: { plugin: "opencode-antigravity-auth", name: "Google (Gemini)" }
|
|
25835
25833
|
};
|
|
25836
25834
|
function getOpenCodeConfig() {
|
|
25837
|
-
const configPath =
|
|
25838
|
-
if (!
|
|
25835
|
+
const configPath = existsSync18(OPENCODE_JSONC) ? OPENCODE_JSONC : OPENCODE_JSON;
|
|
25836
|
+
if (!existsSync18(configPath))
|
|
25839
25837
|
return null;
|
|
25840
25838
|
try {
|
|
25841
25839
|
const content = readFileSync13(configPath, "utf-8");
|
|
@@ -25976,15 +25974,15 @@ async function checkAstGrepNapi() {
|
|
|
25976
25974
|
path: null
|
|
25977
25975
|
};
|
|
25978
25976
|
} catch {
|
|
25979
|
-
const { existsSync:
|
|
25980
|
-
const { join:
|
|
25977
|
+
const { existsSync: existsSync19 } = await import("fs");
|
|
25978
|
+
const { join: join20 } = await import("path");
|
|
25981
25979
|
const { homedir: homedir7 } = await import("os");
|
|
25982
25980
|
const pathsToCheck = [
|
|
25983
|
-
|
|
25984
|
-
|
|
25981
|
+
join20(homedir7(), ".config", "opencode", "node_modules", "@ast-grep", "napi"),
|
|
25982
|
+
join20(process.cwd(), "node_modules", "@ast-grep", "napi")
|
|
25985
25983
|
];
|
|
25986
25984
|
for (const napiPath of pathsToCheck) {
|
|
25987
|
-
if (
|
|
25985
|
+
if (existsSync19(napiPath)) {
|
|
25988
25986
|
return {
|
|
25989
25987
|
name: "AST-Grep NAPI",
|
|
25990
25988
|
required: false,
|
|
@@ -26213,15 +26211,15 @@ function getGhCliCheckDefinition() {
|
|
|
26213
26211
|
}
|
|
26214
26212
|
|
|
26215
26213
|
// src/tools/lsp/config.ts
|
|
26216
|
-
import { existsSync as
|
|
26217
|
-
import { join as
|
|
26214
|
+
import { existsSync as existsSync19, readFileSync as readFileSync14 } from "fs";
|
|
26215
|
+
import { join as join20 } from "path";
|
|
26218
26216
|
init_shared();
|
|
26219
26217
|
function isServerInstalled(command) {
|
|
26220
26218
|
if (command.length === 0)
|
|
26221
26219
|
return false;
|
|
26222
26220
|
const cmd = command[0];
|
|
26223
26221
|
if (cmd.includes("/") || cmd.includes("\\")) {
|
|
26224
|
-
if (
|
|
26222
|
+
if (existsSync19(cmd))
|
|
26225
26223
|
return true;
|
|
26226
26224
|
}
|
|
26227
26225
|
const isWindows = process.platform === "win32";
|
|
@@ -26243,23 +26241,23 @@ function isServerInstalled(command) {
|
|
|
26243
26241
|
const paths = pathEnv.split(pathSeparator);
|
|
26244
26242
|
for (const p2 of paths) {
|
|
26245
26243
|
for (const suffix of exts) {
|
|
26246
|
-
if (
|
|
26244
|
+
if (existsSync19(join20(p2, cmd + suffix))) {
|
|
26247
26245
|
return true;
|
|
26248
26246
|
}
|
|
26249
26247
|
}
|
|
26250
26248
|
}
|
|
26251
26249
|
const cwd = process.cwd();
|
|
26252
26250
|
const configDir = getOpenCodeConfigDir({ binary: "opencode" });
|
|
26253
|
-
const dataDir =
|
|
26251
|
+
const dataDir = join20(getDataDir(), "opencode");
|
|
26254
26252
|
const additionalBases = [
|
|
26255
|
-
|
|
26256
|
-
|
|
26257
|
-
|
|
26258
|
-
|
|
26253
|
+
join20(cwd, "node_modules", ".bin"),
|
|
26254
|
+
join20(configDir, "bin"),
|
|
26255
|
+
join20(configDir, "node_modules", ".bin"),
|
|
26256
|
+
join20(dataDir, "bin")
|
|
26259
26257
|
];
|
|
26260
26258
|
for (const base of additionalBases) {
|
|
26261
26259
|
for (const suffix of exts) {
|
|
26262
|
-
if (
|
|
26260
|
+
if (existsSync19(join20(base, cmd + suffix))) {
|
|
26263
26261
|
return true;
|
|
26264
26262
|
}
|
|
26265
26263
|
}
|
|
@@ -26332,20 +26330,20 @@ function getLspCheckDefinition() {
|
|
|
26332
26330
|
}
|
|
26333
26331
|
|
|
26334
26332
|
// src/cli/doctor/checks/mcp.ts
|
|
26335
|
-
import { existsSync as
|
|
26333
|
+
import { existsSync as existsSync20, readFileSync as readFileSync15 } from "fs";
|
|
26336
26334
|
import { homedir as homedir7 } from "os";
|
|
26337
|
-
import { join as
|
|
26335
|
+
import { join as join21 } from "path";
|
|
26338
26336
|
init_shared();
|
|
26339
26337
|
var BUILTIN_MCP_SERVERS = ["context7", "grep_app"];
|
|
26340
26338
|
var MCP_CONFIG_PATHS = [
|
|
26341
|
-
|
|
26342
|
-
|
|
26343
|
-
|
|
26339
|
+
join21(homedir7(), ".claude", ".mcp.json"),
|
|
26340
|
+
join21(process.cwd(), ".mcp.json"),
|
|
26341
|
+
join21(process.cwd(), ".claude", ".mcp.json")
|
|
26344
26342
|
];
|
|
26345
26343
|
function loadUserMcpConfig() {
|
|
26346
26344
|
const servers = {};
|
|
26347
26345
|
for (const configPath of MCP_CONFIG_PATHS) {
|
|
26348
|
-
if (!
|
|
26346
|
+
if (!existsSync20(configPath))
|
|
26349
26347
|
continue;
|
|
26350
26348
|
try {
|
|
26351
26349
|
const content = readFileSync15(configPath, "utf-8");
|
|
@@ -26439,11 +26437,11 @@ function getMcpCheckDefinitions() {
|
|
|
26439
26437
|
|
|
26440
26438
|
// src/features/mcp-oauth/storage.ts
|
|
26441
26439
|
init_shared();
|
|
26442
|
-
import { chmodSync, existsSync as
|
|
26443
|
-
import { dirname as dirname2, join as
|
|
26440
|
+
import { chmodSync, existsSync as existsSync21, mkdirSync as mkdirSync6, readFileSync as readFileSync16, unlinkSync, writeFileSync as writeFileSync7 } from "fs";
|
|
26441
|
+
import { dirname as dirname2, join as join22 } from "path";
|
|
26444
26442
|
var STORAGE_FILE_NAME = "mcp-oauth.json";
|
|
26445
26443
|
function getMcpOauthStoragePath() {
|
|
26446
|
-
return
|
|
26444
|
+
return join22(getOpenCodeConfigDir({ binary: "opencode" }), STORAGE_FILE_NAME);
|
|
26447
26445
|
}
|
|
26448
26446
|
function normalizeHost(serverHost) {
|
|
26449
26447
|
let host = serverHost.trim();
|
|
@@ -26480,7 +26478,7 @@ function buildKey(serverHost, resource) {
|
|
|
26480
26478
|
}
|
|
26481
26479
|
function readStore() {
|
|
26482
26480
|
const filePath = getMcpOauthStoragePath();
|
|
26483
|
-
if (!
|
|
26481
|
+
if (!existsSync21(filePath)) {
|
|
26484
26482
|
return null;
|
|
26485
26483
|
}
|
|
26486
26484
|
try {
|
|
@@ -26494,8 +26492,8 @@ function writeStore(store) {
|
|
|
26494
26492
|
const filePath = getMcpOauthStoragePath();
|
|
26495
26493
|
try {
|
|
26496
26494
|
const dir = dirname2(filePath);
|
|
26497
|
-
if (!
|
|
26498
|
-
|
|
26495
|
+
if (!existsSync21(dir)) {
|
|
26496
|
+
mkdirSync6(dir, { recursive: true });
|
|
26499
26497
|
}
|
|
26500
26498
|
writeFileSync7(filePath, JSON.stringify(store, null, 2), { encoding: "utf-8", mode: 384 });
|
|
26501
26499
|
chmodSync(filePath, 384);
|
|
@@ -26529,7 +26527,7 @@ function deleteToken(serverHost, resource) {
|
|
|
26529
26527
|
if (Object.keys(store).length === 0) {
|
|
26530
26528
|
try {
|
|
26531
26529
|
const filePath = getMcpOauthStoragePath();
|
|
26532
|
-
if (
|
|
26530
|
+
if (existsSync21(filePath)) {
|
|
26533
26531
|
unlinkSync(filePath);
|
|
26534
26532
|
}
|
|
26535
26533
|
return true;
|
|
@@ -26558,10 +26556,10 @@ function listAllTokens() {
|
|
|
26558
26556
|
}
|
|
26559
26557
|
|
|
26560
26558
|
// src/cli/doctor/checks/mcp-oauth.ts
|
|
26561
|
-
import { existsSync as
|
|
26559
|
+
import { existsSync as existsSync22, readFileSync as readFileSync17 } from "fs";
|
|
26562
26560
|
function readTokenStore() {
|
|
26563
26561
|
const filePath = getMcpOauthStoragePath();
|
|
26564
|
-
if (!
|
|
26562
|
+
if (!existsSync22(filePath)) {
|
|
26565
26563
|
return null;
|
|
26566
26564
|
}
|
|
26567
26565
|
try {
|
|
@@ -26725,29 +26723,29 @@ function getVersionCheckDefinition() {
|
|
|
26725
26723
|
}
|
|
26726
26724
|
|
|
26727
26725
|
// src/cli/doctor/checks/project-layout.ts
|
|
26728
|
-
import { existsSync as
|
|
26729
|
-
import { join as
|
|
26726
|
+
import { existsSync as existsSync23 } from "fs";
|
|
26727
|
+
import { join as join23 } from "path";
|
|
26730
26728
|
async function checkProjectLayout(testCwd) {
|
|
26731
26729
|
const cwd = testCwd ?? process.cwd();
|
|
26732
26730
|
const errors3 = [];
|
|
26733
26731
|
const missing = [];
|
|
26734
|
-
const kordDir =
|
|
26735
|
-
if (!
|
|
26732
|
+
const kordDir = join23(cwd, KORD_DIR);
|
|
26733
|
+
if (!existsSync23(kordDir)) {
|
|
26736
26734
|
missing.push(KORD_DIR);
|
|
26737
26735
|
} else {
|
|
26738
|
-
if (!
|
|
26736
|
+
if (!existsSync23(join23(kordDir, "templates"))) {
|
|
26739
26737
|
missing.push(`${KORD_DIR}/templates`);
|
|
26740
26738
|
}
|
|
26741
26739
|
}
|
|
26742
|
-
const docsKordDir =
|
|
26743
|
-
if (!
|
|
26740
|
+
const docsKordDir = join23(cwd, KORD_DOCS_DIR);
|
|
26741
|
+
if (!existsSync23(docsKordDir)) {
|
|
26744
26742
|
missing.push(KORD_DOCS_DIR);
|
|
26745
26743
|
} else {
|
|
26746
|
-
if (!
|
|
26744
|
+
if (!existsSync23(join23(docsKordDir, "plans"))) {
|
|
26747
26745
|
missing.push(`${KORD_DOCS_DIR}/plans`);
|
|
26748
26746
|
}
|
|
26749
26747
|
}
|
|
26750
|
-
if (!
|
|
26748
|
+
if (!existsSync23(join23(cwd, KORD_RULES_FILE))) {
|
|
26751
26749
|
missing.push(KORD_RULES_FILE);
|
|
26752
26750
|
}
|
|
26753
26751
|
if (missing.length > 0) {
|
|
@@ -26783,6 +26781,49 @@ function getProjectLayoutCheckDefinition() {
|
|
|
26783
26781
|
};
|
|
26784
26782
|
}
|
|
26785
26783
|
|
|
26784
|
+
// src/cli/doctor/checks/project-structure.ts
|
|
26785
|
+
import { existsSync as existsSync24 } from "fs";
|
|
26786
|
+
import { join as join24 } from "path";
|
|
26787
|
+
async function checkProjectStructure(testCwd) {
|
|
26788
|
+
const cwd = testCwd ?? process.cwd();
|
|
26789
|
+
const missing = [];
|
|
26790
|
+
const kordDir = join24(cwd, KORD_DIR);
|
|
26791
|
+
if (!existsSync24(kordDir)) {
|
|
26792
|
+
missing.push(KORD_DIR);
|
|
26793
|
+
}
|
|
26794
|
+
const docsKordDir = join24(cwd, KORD_DOCS_DIR);
|
|
26795
|
+
if (!existsSync24(docsKordDir)) {
|
|
26796
|
+
missing.push(KORD_DOCS_DIR);
|
|
26797
|
+
}
|
|
26798
|
+
if (missing.length > 0) {
|
|
26799
|
+
return {
|
|
26800
|
+
name: CHECK_NAMES[CHECK_IDS.PROJECT_STRUCTURE],
|
|
26801
|
+
status: "warn",
|
|
26802
|
+
message: "Project not initialized \u2014 run `bunx kord-aios init` to set up your project",
|
|
26803
|
+
details: [
|
|
26804
|
+
"Missing directories:",
|
|
26805
|
+
...missing.map((m2) => `Missing: ${m2}`),
|
|
26806
|
+
"Run `bunx kord-aios init` to set up your project"
|
|
26807
|
+
]
|
|
26808
|
+
};
|
|
26809
|
+
}
|
|
26810
|
+
return {
|
|
26811
|
+
name: CHECK_NAMES[CHECK_IDS.PROJECT_STRUCTURE],
|
|
26812
|
+
status: "pass",
|
|
26813
|
+
message: "Project initialized",
|
|
26814
|
+
details: [`${KORD_DIR}/ and ${KORD_DOCS_DIR}/ verified`]
|
|
26815
|
+
};
|
|
26816
|
+
}
|
|
26817
|
+
function getProjectStructureCheckDefinition() {
|
|
26818
|
+
return {
|
|
26819
|
+
id: CHECK_IDS.PROJECT_STRUCTURE,
|
|
26820
|
+
name: CHECK_NAMES[CHECK_IDS.PROJECT_STRUCTURE],
|
|
26821
|
+
category: "installation",
|
|
26822
|
+
check: checkProjectStructure,
|
|
26823
|
+
critical: false
|
|
26824
|
+
};
|
|
26825
|
+
}
|
|
26826
|
+
|
|
26786
26827
|
// src/cli/doctor/checks/index.ts
|
|
26787
26828
|
function getAllCheckDefinitions() {
|
|
26788
26829
|
return [
|
|
@@ -26791,6 +26832,7 @@ function getAllCheckDefinitions() {
|
|
|
26791
26832
|
getConfigCheckDefinition(),
|
|
26792
26833
|
getModelResolutionCheckDefinition(),
|
|
26793
26834
|
getProjectLayoutCheckDefinition(),
|
|
26835
|
+
getProjectStructureCheckDefinition(),
|
|
26794
26836
|
...getAuthCheckDefinitions(),
|
|
26795
26837
|
...getDependencyCheckDefinitions(),
|
|
26796
26838
|
getGhCliCheckDefinition(),
|
|
@@ -27494,14 +27536,14 @@ function createMcpOAuthCommand() {
|
|
|
27494
27536
|
// src/cli/extract.ts
|
|
27495
27537
|
init_shared();
|
|
27496
27538
|
import { promises as fs6 } from "fs";
|
|
27497
|
-
import { basename, dirname as dirname3, join as
|
|
27539
|
+
import { basename, dirname as dirname3, join as join25, relative } from "path";
|
|
27498
27540
|
import { fileURLToPath as fileURLToPath2 } from "url";
|
|
27499
27541
|
var MODULE_DIR = dirname3(fileURLToPath2(import.meta.url));
|
|
27500
|
-
var FEATURES_DIR =
|
|
27501
|
-
var BUILTIN_AGENTS_DIR =
|
|
27502
|
-
var BUILTIN_SKILLS_DIR =
|
|
27503
|
-
var BUILTIN_SQUADS_DIR =
|
|
27504
|
-
var BUILTIN_COMMANDS_TEMPLATES_DIR =
|
|
27542
|
+
var FEATURES_DIR = join25(MODULE_DIR, "..", "features");
|
|
27543
|
+
var BUILTIN_AGENTS_DIR = join25(FEATURES_DIR, "builtin-agents");
|
|
27544
|
+
var BUILTIN_SKILLS_DIR = join25(FEATURES_DIR, "builtin-skills", "skills");
|
|
27545
|
+
var BUILTIN_SQUADS_DIR = join25(FEATURES_DIR, "builtin-squads");
|
|
27546
|
+
var BUILTIN_COMMANDS_TEMPLATES_DIR = join25(FEATURES_DIR, "builtin-commands", "templates");
|
|
27505
27547
|
function resolveSelectedCategories(options) {
|
|
27506
27548
|
const hasCategoryFlag = options.agentsOnly || options.skillsOnly || options.squadsOnly || options.commandsOnly;
|
|
27507
27549
|
if (!hasCategoryFlag) {
|
|
@@ -27525,7 +27567,7 @@ async function listFilesRecursive(directory) {
|
|
|
27525
27567
|
for (const entry of entries) {
|
|
27526
27568
|
if (entry.name.startsWith("."))
|
|
27527
27569
|
continue;
|
|
27528
|
-
const fullPath =
|
|
27570
|
+
const fullPath = join25(directory, entry.name);
|
|
27529
27571
|
if (entry.isDirectory()) {
|
|
27530
27572
|
files.push(...await listFilesRecursive(fullPath));
|
|
27531
27573
|
} else if (entry.isFile()) {
|
|
@@ -27540,8 +27582,8 @@ async function collectAgentItems(targetDir) {
|
|
|
27540
27582
|
for (const entry of entries) {
|
|
27541
27583
|
if (!entry.isFile() || !entry.name.endsWith(".md"))
|
|
27542
27584
|
continue;
|
|
27543
|
-
const sourcePath =
|
|
27544
|
-
const destinationPath =
|
|
27585
|
+
const sourcePath = join25(BUILTIN_AGENTS_DIR, entry.name);
|
|
27586
|
+
const destinationPath = join25(targetDir, "agents", entry.name);
|
|
27545
27587
|
items.push({
|
|
27546
27588
|
category: "agents",
|
|
27547
27589
|
sourcePath,
|
|
@@ -27557,7 +27599,7 @@ async function collectSkillItems(targetDir) {
|
|
|
27557
27599
|
if (!sourcePath.endsWith("SKILL.md"))
|
|
27558
27600
|
continue;
|
|
27559
27601
|
const skillName = basename(dirname3(sourcePath));
|
|
27560
|
-
const destinationPath =
|
|
27602
|
+
const destinationPath = join25(targetDir, "skills", skillName, "SKILL.md");
|
|
27561
27603
|
items.push({
|
|
27562
27604
|
category: "skills",
|
|
27563
27605
|
sourcePath,
|
|
@@ -27572,8 +27614,8 @@ async function collectSquadItems(targetDir) {
|
|
|
27572
27614
|
for (const entry of entries) {
|
|
27573
27615
|
if (!entry.isDirectory() || entry.name.startsWith("."))
|
|
27574
27616
|
continue;
|
|
27575
|
-
const squadDir =
|
|
27576
|
-
const squadYamlPath =
|
|
27617
|
+
const squadDir = join25(BUILTIN_SQUADS_DIR, entry.name);
|
|
27618
|
+
const squadYamlPath = join25(squadDir, "SQUAD.yaml");
|
|
27577
27619
|
try {
|
|
27578
27620
|
await fs6.access(squadYamlPath);
|
|
27579
27621
|
} catch {
|
|
@@ -27582,7 +27624,7 @@ async function collectSquadItems(targetDir) {
|
|
|
27582
27624
|
const files = await listFilesRecursive(squadDir);
|
|
27583
27625
|
for (const sourcePath of files) {
|
|
27584
27626
|
const relativePath = relative(squadDir, sourcePath);
|
|
27585
|
-
const destinationPath =
|
|
27627
|
+
const destinationPath = join25(targetDir, "squads", entry.name, relativePath);
|
|
27586
27628
|
items.push({
|
|
27587
27629
|
category: "squads",
|
|
27588
27630
|
sourcePath,
|
|
@@ -27599,7 +27641,7 @@ async function collectCommandItems(targetDir) {
|
|
|
27599
27641
|
if (sourcePath.endsWith(".test.ts"))
|
|
27600
27642
|
continue;
|
|
27601
27643
|
const relativePath = relative(BUILTIN_COMMANDS_TEMPLATES_DIR, sourcePath);
|
|
27602
|
-
const destinationPath =
|
|
27644
|
+
const destinationPath = join25(targetDir, "commands", relativePath);
|
|
27603
27645
|
items.push({
|
|
27604
27646
|
category: "commands",
|
|
27605
27647
|
sourcePath,
|
|
@@ -27631,7 +27673,7 @@ function printSummary(summary, targetDir, isDiff) {
|
|
|
27631
27673
|
async function extract(options) {
|
|
27632
27674
|
const cwd = options.directory ?? process.cwd();
|
|
27633
27675
|
const selected = resolveSelectedCategories(options);
|
|
27634
|
-
const targetDir = options.global ? getOpenCodeConfigDir({ binary: "opencode", checkExisting: false }) :
|
|
27676
|
+
const targetDir = options.global ? getOpenCodeConfigDir({ binary: "opencode", checkExisting: false }) : join25(cwd, ".opencode");
|
|
27635
27677
|
const plan = [];
|
|
27636
27678
|
if (selected.agents) {
|
|
27637
27679
|
plan.push(...await collectAgentItems(targetDir));
|
package/dist/cli/init/index.d.ts
CHANGED
|
@@ -13,6 +13,11 @@ export interface InitResult {
|
|
|
13
13
|
skipped: string[];
|
|
14
14
|
errors: string[];
|
|
15
15
|
};
|
|
16
|
+
squadExport: {
|
|
17
|
+
success: boolean;
|
|
18
|
+
exported: boolean;
|
|
19
|
+
error?: string;
|
|
20
|
+
};
|
|
16
21
|
config: {
|
|
17
22
|
success: boolean;
|
|
18
23
|
configPath?: string;
|
|
@@ -28,6 +33,7 @@ export interface InitResult {
|
|
|
28
33
|
* - docs/kord/ subdirectories (plans, drafts, notepads)
|
|
29
34
|
* - Template files (story.md, adr.md, kord-rules.md)
|
|
30
35
|
* - Project config (.opencode/kord-aios.json)
|
|
36
|
+
* - Exports code squad to .kord/squads/code/
|
|
31
37
|
*
|
|
32
38
|
* Does NOT touch global config.
|
|
33
39
|
*/
|
|
@@ -2,6 +2,16 @@ export declare const KORD_DIR = ".kord";
|
|
|
2
2
|
export declare const KORD_DOCS_DIR = "docs/kord";
|
|
3
3
|
export declare const KORD_RULES_FILE = "kord-rules.md";
|
|
4
4
|
export declare const KORD_INPUT_SUBDIRS: readonly ["scripts", "templates", "checklists", "skills", "squads"];
|
|
5
|
+
/**
|
|
6
|
+
* Subdirectories that are actively created by createKordDirectory()
|
|
7
|
+
* These are the only .kord/ subdirs that get created automatically.
|
|
8
|
+
*/
|
|
9
|
+
export declare const KORD_ACTIVE_SUBDIRS: readonly ["templates", "squads"];
|
|
10
|
+
/**
|
|
11
|
+
* Reserved subdirectories that are NOT created automatically.
|
|
12
|
+
* These document future intent but are not currently used.
|
|
13
|
+
*/
|
|
14
|
+
export declare const KORD_RESERVED_SUBDIRS: readonly ["scripts", "checklists", "skills"];
|
|
5
15
|
export declare const KORD_OUTPUT_SUBDIRS: readonly ["plans", "drafts", "notepads"];
|
|
6
16
|
export declare const KORD_RULES_CONTENT = "# Kord AIOS \u2014 Project Rules\n\nThis file is loaded by OpenCode via the `instructions` array in `opencode.json`.\nIt provides project-level rules that all Kord agents follow.\n\n## Agent Workflow\n\n- **Planning**: Use `/plan` to create structured work plans in `docs/kord/plans/`\n- **Execution**: Use `/start-work` to execute plans via the Build orchestrator\n- **Delegation**: Build delegates to specialist agents via `task()`\n- **Verification**: Build verifies all subagent work before marking tasks complete\n\n## Directory Conventions\n\n| Path | Purpose |\n|------|---------|\n| `docs/kord/plans/` | Work plans (markdown) |\n| `docs/kord/drafts/` | Draft plans (deleted after finalization) |\n| `docs/kord/notepads/` | Agent working memory per plan |\n| `.kord/templates/` | Story, ADR, and other templates |\n\n## Rules\n\n1. Agents write plans and notes ONLY to `docs/kord/`\n2. Implementation code goes to the project source tree\n3. Use `task()` for delegation \u2014 never implement directly from Build\n4. Mark plan checkboxes `- [x]` as tasks complete\n5. Record learnings in `docs/kord/notepads/{plan-name}/`\n";
|
|
7
17
|
export declare const STORY_TEMPLATE_CONTENT = "---\ntitle: \"{TITLE}\"\ntype: story\nstatus: draft\npriority: medium\ncreated: \"{DATE}\"\n---\n\n# {TITLE}\n\n## Description\n\n_As a [user/role], I want [goal] so that [benefit]._\n\n## Acceptance Criteria\n\n- [ ] Criterion 1\n- [ ] Criterion 2\n- [ ] Criterion 3\n\n## Technical Notes\n\n_Implementation details, constraints, dependencies._\n\n## Definition of Done\n\n- [ ] Code implemented and passes linting\n- [ ] Unit tests written and passing\n- [ ] Integration tests passing (if applicable)\n- [ ] Documentation updated\n- [ ] PR reviewed and approved\n";
|
package/dist/config/schema.d.ts
CHANGED
|
@@ -140,6 +140,8 @@ export declare const BuiltinCommandNameSchema: z.ZodEnum<{
|
|
|
140
140
|
status: "status";
|
|
141
141
|
squad: "squad";
|
|
142
142
|
"squad-create": "squad-create";
|
|
143
|
+
"git-commit": "git-commit";
|
|
144
|
+
"git-create-pr": "git-create-pr";
|
|
143
145
|
}>;
|
|
144
146
|
export declare const AgentOverrideConfigSchema: z.ZodObject<{
|
|
145
147
|
model: z.ZodOptional<z.ZodString>;
|
|
@@ -2358,6 +2360,8 @@ export declare const OhMyOpenCodeConfigSchema: z.ZodObject<{
|
|
|
2358
2360
|
status: "status";
|
|
2359
2361
|
squad: "squad";
|
|
2360
2362
|
"squad-create": "squad-create";
|
|
2363
|
+
"git-commit": "git-commit";
|
|
2364
|
+
"git-create-pr": "git-create-pr";
|
|
2361
2365
|
}>>>;
|
|
2362
2366
|
disabled_tools: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
2363
2367
|
agents: z.ZodOptional<z.ZodObject<{
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const GIT_COMMIT_TEMPLATE = "# /git-commit\n\nThis command MUST be executed by @devops with git-master loaded.\n\nAction:\n- Immediately delegate to @devops using the task tool with `load_skills=[\"git-master\"]`.\n- Pass the user arguments through unchanged.\n\nDelegation prompt for @devops:\n\n1. TASK: Create atomic git commit(s) locally (no push).\n2. EXPECTED OUTCOME: One or more focused commits; working tree clean or only intentionally uncommitted changes remain.\n3. REQUIRED TOOLS: bash (git).\n4. MUST DO:\n - Detect commit message style from `git log -30 --oneline` and follow it.\n - Prefer multiple commits when changes span modules/concerns.\n - Refuse to commit secret-like files/content (.env, tokens, private keys).\n - Do NOT push.\n5. MUST NOT DO:\n - Do not amend unless explicitly requested.\n - Do not use destructive git commands.\n6. USER ARGS:\n $ARGUMENTS\n\nNow delegate:\ntask(subagent_type=\"devops\", load_skills=[\"git-master\"], run_in_background=false, description=\"Create atomic git commits\", prompt=\"<use the Delegation prompt above>\")\n";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const GIT_CREATE_PR_TEMPLATE = "# /git-create-pr\n\nThis command MUST be executed by @devops with git-master loaded.\n\nAction:\n- Immediately delegate to @devops using the task tool with `load_skills=[\"git-master\"]`.\n- Pass the user arguments through unchanged.\n\nDelegation prompt for @devops:\n\n1. TASK: Create or update a GitHub Pull Request.\n2. EXPECTED OUTCOME: PR exists/updated; returns PR URL.\n3. REQUIRED TOOLS: bash (git), gh.\n4. MUST DO:\n - Determine target base branch using this priority order:\n 1. If user specified a branch in USER ARGS (e.g. \"/git-create-pr dev\"), use it.\n 2. Otherwise, run `git rev-parse --abbrev-ref @{upstream}` to get the tracked upstream (e.g. \"origin/dev\"). Strip the remote prefix to get the branch name (e.g. \"dev\").\n - If the upstream branch name DIFFERS from the current branch \u2192 use it as target (e.g. feature/foo tracking origin/dev \u2192 target is \"dev\").\n - If the upstream branch name is the SAME as the current branch (e.g. on \"dev\" tracking \"origin/dev\") \u2192 run `gh repo view --json defaultBranchRef --jq .defaultBranchRef.name` and use the repo default branch (usually \"main\") as target.\n 3. If no upstream is set, stop and ask the user: \"Which branch should this PR target? (e.g. dev, main)\"\n - Do NOT push in this command; if current branch is not on origin, stop and instruct user to run `git push -u origin <current-branch>`.\n - If PR already exists for the current branch, update (gh pr edit) instead of creating a duplicate.\n - Generate title/body from commits + diff if user didn't specify.\n5. MUST NOT DO:\n - Do not merge.\n6. USER ARGS:\n $ARGUMENTS\n\nNow delegate:\ntask(subagent_type=\"devops\", load_skills=[\"git-master\"], run_in_background=false, description=\"Create PR\", prompt=\"<use the Delegation prompt above>\")\n";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { CommandDefinition } from "../claude-code-command-loader";
|
|
2
|
-
export type BuiltinCommandName = "init-deep" | "ralph-loop" | "cancel-ralph" | "ulw-loop" | "refactor" | "start-work" | "stop-continuation" | "checkpoint" | "status" | "squad" | "squad-create";
|
|
2
|
+
export type BuiltinCommandName = "init-deep" | "ralph-loop" | "cancel-ralph" | "ulw-loop" | "refactor" | "start-work" | "stop-continuation" | "checkpoint" | "status" | "squad" | "squad-create" | "git-commit" | "git-create-pr";
|
|
3
3
|
export interface BuiltinCommandConfig {
|
|
4
4
|
disabled_commands?: BuiltinCommandName[];
|
|
5
5
|
}
|
package/dist/index.js
CHANGED
|
@@ -4673,29 +4673,11 @@ function getTauriConfigDir(identifier) {
|
|
|
4673
4673
|
}
|
|
4674
4674
|
}
|
|
4675
4675
|
}
|
|
4676
|
-
function getCliConfigDir(
|
|
4676
|
+
function getCliConfigDir(_checkExisting) {
|
|
4677
4677
|
const envConfigDir = process.env.OPENCODE_CONFIG_DIR?.trim();
|
|
4678
4678
|
if (envConfigDir) {
|
|
4679
4679
|
return resolve4(envConfigDir);
|
|
4680
4680
|
}
|
|
4681
|
-
if (process.platform === "win32") {
|
|
4682
|
-
const appData = process.env.APPDATA || join20(homedir5(), "AppData", "Roaming");
|
|
4683
|
-
const appdataDir = join20(appData, "opencode");
|
|
4684
|
-
const appdataConfig = join20(appdataDir, "opencode.json");
|
|
4685
|
-
const appdataConfigC = join20(appdataDir, "opencode.jsonc");
|
|
4686
|
-
const crossPlatformDir = join20(homedir5(), ".config", "opencode");
|
|
4687
|
-
const crossPlatformConfig = join20(crossPlatformDir, "opencode.json");
|
|
4688
|
-
const crossPlatformConfigC = join20(crossPlatformDir, "opencode.jsonc");
|
|
4689
|
-
if (checkExisting) {
|
|
4690
|
-
if (existsSync15(appdataConfig) || existsSync15(appdataConfigC)) {
|
|
4691
|
-
return appdataDir;
|
|
4692
|
-
}
|
|
4693
|
-
if (existsSync15(crossPlatformConfig) || existsSync15(crossPlatformConfigC)) {
|
|
4694
|
-
return crossPlatformDir;
|
|
4695
|
-
}
|
|
4696
|
-
}
|
|
4697
|
-
return appdataDir;
|
|
4698
|
-
}
|
|
4699
4681
|
const xdgConfig = process.env.XDG_CONFIG_HOME || join20(homedir5(), ".config");
|
|
4700
4682
|
return join20(xdgConfig, "opencode");
|
|
4701
4683
|
}
|
|
@@ -41007,6 +40989,68 @@ The squad will be created in .opencode/squads/<domain-name>/ with:
|
|
|
41007
40989
|
\`\`\`
|
|
41008
40990
|
`;
|
|
41009
40991
|
|
|
40992
|
+
// src/features/builtin-commands/templates/git-commit.ts
|
|
40993
|
+
var GIT_COMMIT_TEMPLATE = `# /git-commit
|
|
40994
|
+
|
|
40995
|
+
This command MUST be executed by @devops with git-master loaded.
|
|
40996
|
+
|
|
40997
|
+
Action:
|
|
40998
|
+
- Immediately delegate to @devops using the task tool with \`load_skills=["git-master"]\`.
|
|
40999
|
+
- Pass the user arguments through unchanged.
|
|
41000
|
+
|
|
41001
|
+
Delegation prompt for @devops:
|
|
41002
|
+
|
|
41003
|
+
1. TASK: Create atomic git commit(s) locally (no push).
|
|
41004
|
+
2. EXPECTED OUTCOME: One or more focused commits; working tree clean or only intentionally uncommitted changes remain.
|
|
41005
|
+
3. REQUIRED TOOLS: bash (git).
|
|
41006
|
+
4. MUST DO:
|
|
41007
|
+
- Detect commit message style from \`git log -30 --oneline\` and follow it.
|
|
41008
|
+
- Prefer multiple commits when changes span modules/concerns.
|
|
41009
|
+
- Refuse to commit secret-like files/content (.env, tokens, private keys).
|
|
41010
|
+
- Do NOT push.
|
|
41011
|
+
5. MUST NOT DO:
|
|
41012
|
+
- Do not amend unless explicitly requested.
|
|
41013
|
+
- Do not use destructive git commands.
|
|
41014
|
+
6. USER ARGS:
|
|
41015
|
+
$ARGUMENTS
|
|
41016
|
+
|
|
41017
|
+
Now delegate:
|
|
41018
|
+
task(subagent_type="devops", load_skills=["git-master"], run_in_background=false, description="Create atomic git commits", prompt="<use the Delegation prompt above>")
|
|
41019
|
+
`;
|
|
41020
|
+
|
|
41021
|
+
// src/features/builtin-commands/templates/git-create-pr.ts
|
|
41022
|
+
var GIT_CREATE_PR_TEMPLATE = `# /git-create-pr
|
|
41023
|
+
|
|
41024
|
+
This command MUST be executed by @devops with git-master loaded.
|
|
41025
|
+
|
|
41026
|
+
Action:
|
|
41027
|
+
- Immediately delegate to @devops using the task tool with \`load_skills=["git-master"]\`.
|
|
41028
|
+
- Pass the user arguments through unchanged.
|
|
41029
|
+
|
|
41030
|
+
Delegation prompt for @devops:
|
|
41031
|
+
|
|
41032
|
+
1. TASK: Create or update a GitHub Pull Request.
|
|
41033
|
+
2. EXPECTED OUTCOME: PR exists/updated; returns PR URL.
|
|
41034
|
+
3. REQUIRED TOOLS: bash (git), gh.
|
|
41035
|
+
4. MUST DO:
|
|
41036
|
+
- Determine target base branch using this priority order:
|
|
41037
|
+
1. If user specified a branch in USER ARGS (e.g. "/git-create-pr dev"), use it.
|
|
41038
|
+
2. Otherwise, run \`git rev-parse --abbrev-ref @{upstream}\` to get the tracked upstream (e.g. "origin/dev"). Strip the remote prefix to get the branch name (e.g. "dev").
|
|
41039
|
+
- If the upstream branch name DIFFERS from the current branch \u2192 use it as target (e.g. feature/foo tracking origin/dev \u2192 target is "dev").
|
|
41040
|
+
- If the upstream branch name is the SAME as the current branch (e.g. on "dev" tracking "origin/dev") \u2192 run \`gh repo view --json defaultBranchRef --jq .defaultBranchRef.name\` and use the repo default branch (usually "main") as target.
|
|
41041
|
+
3. If no upstream is set, stop and ask the user: "Which branch should this PR target? (e.g. dev, main)"
|
|
41042
|
+
- Do NOT push in this command; if current branch is not on origin, stop and instruct user to run \`git push -u origin <current-branch>\`.
|
|
41043
|
+
- If PR already exists for the current branch, update (gh pr edit) instead of creating a duplicate.
|
|
41044
|
+
- Generate title/body from commits + diff if user didn't specify.
|
|
41045
|
+
5. MUST NOT DO:
|
|
41046
|
+
- Do not merge.
|
|
41047
|
+
6. USER ARGS:
|
|
41048
|
+
$ARGUMENTS
|
|
41049
|
+
|
|
41050
|
+
Now delegate:
|
|
41051
|
+
task(subagent_type="devops", load_skills=["git-master"], run_in_background=false, description="Create PR", prompt="<use the Delegation prompt above>")
|
|
41052
|
+
`;
|
|
41053
|
+
|
|
41010
41054
|
// src/features/builtin-commands/commands.ts
|
|
41011
41055
|
var BUILTIN_COMMAND_DEFINITIONS = {
|
|
41012
41056
|
"init-deep": {
|
|
@@ -41111,6 +41155,28 @@ ${SQUAD_CREATE_TEMPLATE}
|
|
|
41111
41155
|
$ARGUMENTS
|
|
41112
41156
|
</user-request>`,
|
|
41113
41157
|
argumentHint: "<domain-name>"
|
|
41158
|
+
},
|
|
41159
|
+
"git-commit": {
|
|
41160
|
+
description: "(builtin) Create atomic git commits (DevOps)",
|
|
41161
|
+
template: `<command-instruction>
|
|
41162
|
+
${GIT_COMMIT_TEMPLATE}
|
|
41163
|
+
</command-instruction>
|
|
41164
|
+
|
|
41165
|
+
<user-request>
|
|
41166
|
+
$ARGUMENTS
|
|
41167
|
+
</user-request>`,
|
|
41168
|
+
argumentHint: '[--staged|--all] [--message="..."]'
|
|
41169
|
+
},
|
|
41170
|
+
"git-create-pr": {
|
|
41171
|
+
description: "(builtin) Create GitHub PR (DevOps)",
|
|
41172
|
+
template: `<command-instruction>
|
|
41173
|
+
${GIT_CREATE_PR_TEMPLATE}
|
|
41174
|
+
</command-instruction>
|
|
41175
|
+
|
|
41176
|
+
<user-request>
|
|
41177
|
+
$ARGUMENTS
|
|
41178
|
+
</user-request>`,
|
|
41179
|
+
argumentHint: '[<base-branch>] [--title="..."]'
|
|
41114
41180
|
}
|
|
41115
41181
|
};
|
|
41116
41182
|
function loadBuiltinCommands(disabledCommands) {
|
|
@@ -62483,7 +62549,9 @@ var BuiltinCommandNameSchema = exports_external.enum([
|
|
|
62483
62549
|
"checkpoint",
|
|
62484
62550
|
"status",
|
|
62485
62551
|
"squad",
|
|
62486
|
-
"squad-create"
|
|
62552
|
+
"squad-create",
|
|
62553
|
+
"git-commit",
|
|
62554
|
+
"git-create-pr"
|
|
62487
62555
|
]);
|
|
62488
62556
|
var AgentOverrideConfigSchema = exports_external.object({
|
|
62489
62557
|
model: exports_external.string().optional(),
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "kord-aios",
|
|
3
|
-
"version": "3.3.
|
|
3
|
+
"version": "3.3.6",
|
|
4
4
|
"description": "Kord AIOS: multi-model orchestration with story-driven development methodology",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -82,13 +82,13 @@
|
|
|
82
82
|
"typescript": "^5.7.3"
|
|
83
83
|
},
|
|
84
84
|
"optionalDependencies": {
|
|
85
|
-
"kord-aios-darwin-arm64": "3.3.
|
|
86
|
-
"kord-aios-darwin-x64": "3.3.
|
|
87
|
-
"kord-aios-linux-arm64": "3.3.
|
|
88
|
-
"kord-aios-linux-arm64-musl": "3.3.
|
|
89
|
-
"kord-aios-linux-x64": "3.3.
|
|
90
|
-
"kord-aios-linux-x64-musl": "3.3.
|
|
91
|
-
"kord-aios-windows-x64": "3.3.
|
|
85
|
+
"kord-aios-darwin-arm64": "3.3.6",
|
|
86
|
+
"kord-aios-darwin-x64": "3.3.6",
|
|
87
|
+
"kord-aios-linux-arm64": "3.3.6",
|
|
88
|
+
"kord-aios-linux-arm64-musl": "3.3.6",
|
|
89
|
+
"kord-aios-linux-x64": "3.3.6",
|
|
90
|
+
"kord-aios-linux-x64-musl": "3.3.6",
|
|
91
|
+
"kord-aios-windows-x64": "3.3.6"
|
|
92
92
|
},
|
|
93
93
|
"trustedDependencies": [
|
|
94
94
|
"@ast-grep/cli",
|