kord-aios 3.3.4 → 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.
@@ -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 {};
@@ -11,4 +11,5 @@ export * from "./mcp";
11
11
  export * from "./mcp-oauth";
12
12
  export * from "./version";
13
13
  export * from "./project-layout";
14
+ export * from "./project-structure";
14
15
  export declare function getAllCheckDefinitions(): CheckDefinition[];
@@ -0,0 +1,3 @@
1
+ import type { CheckResult, CheckDefinition } from "../types";
2
+ export declare function checkProjectStructure(testCwd?: string): Promise<CheckResult>;
3
+ export declare function getProjectStructureCheckDefinition(): CheckDefinition;
@@ -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(checkExisting) {
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: true, hasOpencodeZen: true, hasZaiCodingPlan: false, hasKimiForCoding: false };
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: true, hasOpencodeZen: true, hasZaiCodingPlan: false, hasKimiForCoding: false };
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: true, hasOpencodeZen: true, hasZaiCodingPlan: false, hasKimiForCoding: false };
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: true,
20121
- isMax20: true,
20122
- hasOpenAI: true,
20102
+ hasClaude: false,
20103
+ isMax20: false,
20104
+ hasOpenAI: false,
20123
20105
  hasGemini: false,
20124
20106
  hasCopilot: false,
20125
- hasOpencodeZen: true,
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 KORD_INPUT_SUBDIRS = [
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.4",
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.4",
21904
- "kord-aios-darwin-x64": "3.3.4",
21905
- "kord-aios-linux-arm64": "3.3.4",
21906
- "kord-aios-linux-arm64-musl": "3.3.4",
21907
- "kord-aios-linux-x64": "3.3.4",
21908
- "kord-aios-linux-x64-musl": "3.3.4",
21909
- "kord-aios-windows-x64": "3.3.4"
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 = 7;
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: options.force ?? false
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 existsSync13 } from "fs";
25167
+ import { existsSync as existsSync14 } from "fs";
25172
25168
  import { homedir as homedir5 } from "os";
25173
- import { join as join15 } from "path";
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
- join15(home, "Applications", "OpenCode.app", "Contents", "MacOS", "OpenCode")
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(join15(programFiles, "OpenCode", "OpenCode.exe"));
25258
+ paths.push(join16(programFiles, "OpenCode", "OpenCode.exe"));
25261
25259
  }
25262
25260
  if (localAppData) {
25263
- paths.push(join15(localAppData, "OpenCode", "OpenCode.exe"));
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
- join15(home, "Applications", "opencode-desktop-linux-x86_64.AppImage"),
25272
- join15(home, "Applications", "opencode-desktop-linux-aarch64.AppImage")
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 = existsSync13) {
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 existsSync14, readFileSync as readFileSync10 } from "fs";
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 (existsSync14(paths.configJsonc)) {
25412
+ if (existsSync15(paths.configJsonc)) {
25415
25413
  return { path: paths.configJsonc, format: "jsonc" };
25416
25414
  }
25417
- if (existsSync14(paths.configJson)) {
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 existsSync15, readFileSync as readFileSync11 } from "fs";
25522
- import { join as join16 } from "path";
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 = join16(USER_CONFIG_DIR2, `${PACKAGE_NAME3}`);
25526
- var PROJECT_CONFIG_BASE = join16(process.cwd(), ".opencode", PACKAGE_NAME3);
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 (!existsSync15(configPath.path)) {
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 existsSync16 } from "fs";
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 join17 } from "path";
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 join17(xdgCache, "opencode");
25632
- return join17(homedir6(), ".cache", "opencode");
25629
+ return join18(xdgCache, "opencode");
25630
+ return join18(homedir6(), ".cache", "opencode");
25633
25631
  }
25634
25632
  function loadAvailableModels() {
25635
- const cacheFile = join17(getOpenCodeCacheDir2(), "models.json");
25636
- if (!existsSync16(cacheFile)) {
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 = join17(homedir6(), ".config", "opencode");
25657
- var USER_CONFIG_BASE2 = join17(USER_CONFIG_DIR3, PACKAGE_NAME4);
25658
- var PROJECT_CONFIG_BASE2 = join17(process.cwd(), ".opencode", PACKAGE_NAME4);
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 existsSync17, readFileSync as readFileSync13 } from "fs";
25826
- import { join as join18 } from "path";
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 = join18(OPENCODE_CONFIG_DIR, "opencode.json");
25830
- var OPENCODE_JSONC = join18(OPENCODE_CONFIG_DIR, "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 = existsSync17(OPENCODE_JSONC) ? OPENCODE_JSONC : OPENCODE_JSON;
25838
- if (!existsSync17(configPath))
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: existsSync18 } = await import("fs");
25980
- const { join: join19 } = await import("path");
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
- join19(homedir7(), ".config", "opencode", "node_modules", "@ast-grep", "napi"),
25984
- join19(process.cwd(), "node_modules", "@ast-grep", "napi")
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 (existsSync18(napiPath)) {
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 existsSync18, readFileSync as readFileSync14 } from "fs";
26217
- import { join as join19 } from "path";
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 (existsSync18(cmd))
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 (existsSync18(join19(p2, cmd + suffix))) {
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 = join19(getDataDir(), "opencode");
26251
+ const dataDir = join20(getDataDir(), "opencode");
26254
26252
  const additionalBases = [
26255
- join19(cwd, "node_modules", ".bin"),
26256
- join19(configDir, "bin"),
26257
- join19(configDir, "node_modules", ".bin"),
26258
- join19(dataDir, "bin")
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 (existsSync18(join19(base, cmd + suffix))) {
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 existsSync19, readFileSync as readFileSync15 } from "fs";
26333
+ import { existsSync as existsSync20, readFileSync as readFileSync15 } from "fs";
26336
26334
  import { homedir as homedir7 } from "os";
26337
- import { join as join20 } from "path";
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
- join20(homedir7(), ".claude", ".mcp.json"),
26342
- join20(process.cwd(), ".mcp.json"),
26343
- join20(process.cwd(), ".claude", ".mcp.json")
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 (!existsSync19(configPath))
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 existsSync20, mkdirSync as mkdirSync5, readFileSync as readFileSync16, unlinkSync, writeFileSync as writeFileSync7 } from "fs";
26443
- import { dirname as dirname2, join as join21 } from "path";
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 join21(getOpenCodeConfigDir({ binary: "opencode" }), STORAGE_FILE_NAME);
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 (!existsSync20(filePath)) {
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 (!existsSync20(dir)) {
26498
- mkdirSync5(dir, { recursive: true });
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 (existsSync20(filePath)) {
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 existsSync21, readFileSync as readFileSync17 } from "fs";
26559
+ import { existsSync as existsSync22, readFileSync as readFileSync17 } from "fs";
26562
26560
  function readTokenStore() {
26563
26561
  const filePath = getMcpOauthStoragePath();
26564
- if (!existsSync21(filePath)) {
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 existsSync22 } from "fs";
26729
- import { join as join22 } from "path";
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 = join22(cwd, KORD_DIR);
26735
- if (!existsSync22(kordDir)) {
26732
+ const kordDir = join23(cwd, KORD_DIR);
26733
+ if (!existsSync23(kordDir)) {
26736
26734
  missing.push(KORD_DIR);
26737
26735
  } else {
26738
- if (!existsSync22(join22(kordDir, "templates"))) {
26736
+ if (!existsSync23(join23(kordDir, "templates"))) {
26739
26737
  missing.push(`${KORD_DIR}/templates`);
26740
26738
  }
26741
26739
  }
26742
- const docsKordDir = join22(cwd, KORD_DOCS_DIR);
26743
- if (!existsSync22(docsKordDir)) {
26740
+ const docsKordDir = join23(cwd, KORD_DOCS_DIR);
26741
+ if (!existsSync23(docsKordDir)) {
26744
26742
  missing.push(KORD_DOCS_DIR);
26745
26743
  } else {
26746
- if (!existsSync22(join22(docsKordDir, "plans"))) {
26744
+ if (!existsSync23(join23(docsKordDir, "plans"))) {
26747
26745
  missing.push(`${KORD_DOCS_DIR}/plans`);
26748
26746
  }
26749
26747
  }
26750
- if (!existsSync22(join22(cwd, KORD_RULES_FILE))) {
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 join23, relative } from "path";
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 = join23(MODULE_DIR, "..", "features");
27501
- var BUILTIN_AGENTS_DIR = join23(FEATURES_DIR, "builtin-agents");
27502
- var BUILTIN_SKILLS_DIR = join23(FEATURES_DIR, "builtin-skills", "skills");
27503
- var BUILTIN_SQUADS_DIR = join23(FEATURES_DIR, "builtin-squads");
27504
- var BUILTIN_COMMANDS_TEMPLATES_DIR = join23(FEATURES_DIR, "builtin-commands", "templates");
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 = join23(directory, entry.name);
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 = join23(BUILTIN_AGENTS_DIR, entry.name);
27544
- const destinationPath = join23(targetDir, "agents", entry.name);
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 = join23(targetDir, "skills", skillName, "SKILL.md");
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 = join23(BUILTIN_SQUADS_DIR, entry.name);
27576
- const squadYamlPath = join23(squadDir, "SQUAD.yaml");
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 = join23(targetDir, "squads", entry.name, relativePath);
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 = join23(targetDir, "commands", relativePath);
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 }) : join23(cwd, ".opencode");
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));
@@ -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";
@@ -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(checkExisting) {
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.4",
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.4",
86
- "kord-aios-darwin-x64": "3.3.4",
87
- "kord-aios-linux-arm64": "3.3.4",
88
- "kord-aios-linux-arm64-musl": "3.3.4",
89
- "kord-aios-linux-x64": "3.3.4",
90
- "kord-aios-linux-x64-musl": "3.3.4",
91
- "kord-aios-windows-x64": "3.3.4"
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",