bkper 4.9.0 → 4.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,14 @@
1
+ export interface LiveCheckConfig {
2
+ cliCmd: string;
3
+ bookId: string;
4
+ accountName?: string;
5
+ balanceSheetRootGroup?: string;
6
+ profitAndLossRootGroup?: string;
7
+ }
8
+ export interface MaterializedCommand {
9
+ command?: string;
10
+ skipReason?: string;
11
+ }
12
+ export declare function extractRunnableQueryCommands(content: string): string[];
13
+ export declare function materializeCommand(command: string, config: LiveCheckConfig): MaterializedCommand;
14
+ //# sourceMappingURL=live-readme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-readme.d.ts","sourceRoot":"","sources":["../../src/docs-compliance/live-readme.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,mBAAmB;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AA4DD,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CActE;AAED,wBAAgB,kBAAkB,CAC9B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,eAAe,GACxB,mBAAmB,CAiCrB"}
@@ -0,0 +1,89 @@
1
+ function getBashCodeBlocks(content) {
2
+ const blocks = [];
3
+ const regex = /```bash\n([\s\S]*?)```/g;
4
+ let match;
5
+ while ((match = regex.exec(content)) !== null) {
6
+ blocks.push(match[1]);
7
+ }
8
+ return blocks;
9
+ }
10
+ function flattenContinuationLines(block) {
11
+ const lines = block.split('\n').map(line => line.trimEnd());
12
+ const flattened = [];
13
+ let buffer = '';
14
+ for (const rawLine of lines) {
15
+ const line = rawLine.trim();
16
+ if (!line || line.startsWith('#')) {
17
+ continue;
18
+ }
19
+ if (!buffer) {
20
+ buffer = line;
21
+ }
22
+ else {
23
+ buffer = `${buffer} ${line}`;
24
+ }
25
+ if (line.endsWith('\\')) {
26
+ buffer = buffer.slice(0, -1).trimEnd();
27
+ continue;
28
+ }
29
+ flattened.push(buffer.replace(/\s+/g, ' ').trim());
30
+ buffer = '';
31
+ }
32
+ if (buffer) {
33
+ flattened.push(buffer.replace(/\s+/g, ' ').trim());
34
+ }
35
+ return flattened;
36
+ }
37
+ function isRunnableQueryCommand(command) {
38
+ if (command.includes('|')) {
39
+ return false;
40
+ }
41
+ const queryListPattern = /^bkper\s+(transaction|balance)\s+list\b/i;
42
+ if (!queryListPattern.test(command)) {
43
+ return false;
44
+ }
45
+ return command.includes('-q ') || command.includes('--query ');
46
+ }
47
+ export function extractRunnableQueryCommands(content) {
48
+ const blocks = getBashCodeBlocks(content);
49
+ const commands = [];
50
+ for (const block of blocks) {
51
+ const flattened = flattenContinuationLines(block);
52
+ for (const command of flattened) {
53
+ if (isRunnableQueryCommand(command)) {
54
+ commands.push(command);
55
+ }
56
+ }
57
+ }
58
+ return commands;
59
+ }
60
+ export function materializeCommand(command, config) {
61
+ const replacements = [
62
+ ['abc123', config.bookId],
63
+ ['<bookId>', config.bookId],
64
+ ['$BOOK_ID', config.bookId],
65
+ ['$BOOK', config.bookId],
66
+ ['$BOOK_A', config.bookId],
67
+ ['$SOURCE', config.bookId],
68
+ ['<accountName>', config.accountName],
69
+ ['<balanceSheetRootGroup>', config.balanceSheetRootGroup],
70
+ ['<profitAndLossRootGroup>', config.profitAndLossRootGroup],
71
+ ];
72
+ let materialized = command.replace(/^bkper\b/, config.cliCmd);
73
+ for (const [token, value] of replacements) {
74
+ if (value) {
75
+ materialized = materialized.split(token).join(value);
76
+ }
77
+ }
78
+ const unresolvedPlaceholderPattern = /<[^>]+>|\$[A-Z_]+/;
79
+ if (unresolvedPlaceholderPattern.test(materialized)) {
80
+ return {
81
+ skipReason: `unresolved placeholders in command: ${materialized}`,
82
+ };
83
+ }
84
+ if (!materialized.includes('--format ')) {
85
+ materialized = `${materialized} --format csv`;
86
+ }
87
+ return { command: materialized };
88
+ }
89
+ //# sourceMappingURL=live-readme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-readme.js","sourceRoot":"","sources":["../../src/docs-compliance/live-readme.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export interface ComplianceError {
2
+ code: string;
3
+ message: string;
4
+ line?: number;
5
+ }
6
+ export interface ComplianceResult {
7
+ errors: ComplianceError[];
8
+ }
9
+ export declare function evaluateReadmeCompliance(content: string): ComplianceResult;
10
+ //# sourceMappingURL=rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../src/docs-compliance/rules.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC7B,MAAM,EAAE,eAAe,EAAE,CAAC;CAC7B;AA4BD,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,CA8E1E"}
@@ -0,0 +1,74 @@
1
+ function getLineNumber(content, index) {
2
+ return content.slice(0, index).split('\n').length;
3
+ }
4
+ function findMissingQueryErrors(content, commandPattern, code, message) {
5
+ const errors = [];
6
+ const regex = new RegExp(commandPattern.source, 'g');
7
+ let match;
8
+ while ((match = regex.exec(content)) !== null) {
9
+ const command = match[0];
10
+ if (!command.includes('-q ') && !command.includes('--query ')) {
11
+ errors.push({
12
+ code,
13
+ message,
14
+ line: getLineNumber(content, match.index),
15
+ });
16
+ }
17
+ }
18
+ return errors;
19
+ }
20
+ export function evaluateReadmeCompliance(content) {
21
+ const errors = [];
22
+ errors.push(...findMissingQueryErrors(content, /^\s*bkper\s+transaction\s+list\b.*$/gm, 'transaction-list-missing-query', 'Found `bkper transaction list` example without `-q/--query`.'));
23
+ errors.push(...findMissingQueryErrors(content, /^\s*bkper\s+balance\s+list\b.*$/gm, 'balance-list-missing-query', 'Found `bkper balance list` example without `-q/--query`.'));
24
+ const sameDayRangePattern = /after:\$DATE\s+before:\$DATE/g;
25
+ let sameDayMatch;
26
+ while ((sameDayMatch = sameDayRangePattern.exec(content)) !== null) {
27
+ errors.push({
28
+ code: 'same-day-range-antipattern',
29
+ message: 'Found `after:$DATE before:$DATE` anti-pattern. Prefer `on:$DATE`.',
30
+ line: getLineNumber(content, sameDayMatch.index),
31
+ });
32
+ }
33
+ const periodInQueryPattern = /-q\s+"[^"]*period:/g;
34
+ let periodMatch;
35
+ while ((periodMatch = periodInQueryPattern.exec(content)) !== null) {
36
+ errors.push({
37
+ code: 'period-operator-in-query-example',
38
+ message: 'Found `period:` in query example. Prefer documented query operators such as `on:`, `after:`, `before:`, and `by:`.',
39
+ line: getLineNumber(content, periodMatch.index),
40
+ });
41
+ }
42
+ if (!content.includes('LLM-first output guidance (important):')) {
43
+ errors.push({
44
+ code: 'missing-llm-guidance-title',
45
+ message: 'Missing `LLM-first output guidance (important):` section.',
46
+ });
47
+ }
48
+ if (!content.includes('**LLM consumption of lists/reports** → CSV')) {
49
+ errors.push({
50
+ code: 'missing-csv-guidance',
51
+ message: 'Missing guidance mapping LLM list/report consumption to CSV.',
52
+ });
53
+ }
54
+ if (!content.includes('**Programmatic processing / pipelines** → JSON')) {
55
+ errors.push({
56
+ code: 'missing-json-guidance',
57
+ message: 'Missing guidance mapping programmatic pipelines to JSON.',
58
+ });
59
+ }
60
+ if (!content.includes('### Query semantics (transactions and balances)')) {
61
+ errors.push({
62
+ code: 'missing-query-semantics-section',
63
+ message: 'Missing `Query semantics (transactions and balances)` section.',
64
+ });
65
+ }
66
+ if (!content.includes('`after:` is **inclusive** and `before:` is **exclusive**.')) {
67
+ errors.push({
68
+ code: 'missing-after-before-semantics',
69
+ message: 'Missing explicit semantics for `after:` and `before:`.',
70
+ });
71
+ }
72
+ return { errors };
73
+ }
74
+ //# sourceMappingURL=rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/docs-compliance/rules.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bkper",
3
- "version": "4.9.0",
3
+ "version": "4.10.0",
4
4
  "description": "Command line client for Bkper",
5
5
  "bin": {
6
6
  "bkper": "./lib/cli.js"
@@ -32,7 +32,7 @@
32
32
  "build:compile": "tsc",
33
33
  "api:platform": "openapi-typescript https://platform.bkper.app/openapi.json -o src/platform/types.d.ts",
34
34
  "api:platform:local": "openapi-typescript http://localhost:8790/openapi.json -o src/platform/types.d.ts",
35
- "build:copy-docs": "mkdir -p lib/docs && cp -f docs/*.md lib/docs/ 2>/dev/null || true",
35
+ "build:copy-docs": "mkdir -p lib/docs && cp -f docs/*.md lib/docs/ 2>/dev/null || true && cp -f README.md lib/docs/cli-reference.md",
36
36
  "predev": "bun run build",
37
37
  "dev": "tsc -w",
38
38
  "ports": "devpod ssh ../ -L 6274",
@@ -41,6 +41,8 @@
41
41
  "test:integration": "BKPER_API_URL=${BKPER_API_URL:-http://localhost:8081/_ah/api/bkper} TS_NODE_PROJECT=tsconfig.test.json mocha --config .mocharc.integration.json",
42
42
  "test:deploy": "BKPER_PLATFORM_URL=http://localhost:8790 BKPER_API_URL=https://api-dev.bkper.app TS_NODE_PROJECT=tsconfig.test.json mocha --config .mocharc.deploy.json",
43
43
  "test:all": "bun run test:unit && bun run test:integration",
44
+ "docs:compliance": "TS_NODE_PROJECT=tsconfig.test.json node --loader ts-node/esm ./test/tools/docs-compliance/check.ts",
45
+ "docs:compliance:live": "TS_NODE_PROJECT=tsconfig.test.json node --loader ts-node/esm ./test/tools/docs-compliance/live.ts",
44
46
  "upgrade:api": "bun update @bkper/bkper-api-types --latest && bun update bkper-js --latest",
45
47
  "patch": "yarn version --patch",
46
48
  "minor": "yarn version --minor",
@@ -50,7 +52,7 @@
50
52
  },
51
53
  "dependencies": {
52
54
  "@mariozechner/pi-coding-agent": "^0.60.0",
53
- "bkper-js": "^2.29.4",
55
+ "bkper-js": "^2.31.1",
54
56
  "commander": "^13.1.0",
55
57
  "dotenv": "^8.2.0",
56
58
  "esbuild": "^0.27.2",
@@ -1,8 +0,0 @@
1
- import type { Command } from 'commander';
2
- import { type UpdateSkillsResult } from './skills.js';
3
- export interface SkillsCommandDependencies {
4
- updateSkills: () => Promise<UpdateSkillsResult>;
5
- log: (message: string) => void;
6
- }
7
- export declare function registerSkillsCommands(program: Command, dependencies?: SkillsCommandDependencies): void;
8
- //# sourceMappingURL=skills-command.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"skills-command.d.ts","sourceRoot":"","sources":["../../src/commands/skills-command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,EAAgB,KAAK,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEpE,MAAM,WAAW,yBAAyB;IACtC,YAAY,EAAE,MAAM,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAChD,GAAG,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC;AASD,wBAAgB,sBAAsB,CAClC,OAAO,EAAE,OAAO,EAChB,YAAY,GAAE,yBAAuD,GACtE,IAAI,CA2BN"}
@@ -1,36 +0,0 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
- import { withAction } from './action.js';
11
- import { updateSkills } from './skills.js';
12
- function createDefaultDependencies() {
13
- return {
14
- updateSkills: () => updateSkills(),
15
- log: message => console.log(message),
16
- };
17
- }
18
- export function registerSkillsCommands(program, dependencies = createDefaultDependencies()) {
19
- const skillsCommand = program.command('skills').description('Manage Bkper skills');
20
- skillsCommand
21
- .command('sync')
22
- .description('Sync Bkper skills to ~/.agents/skills')
23
- .action(withAction('syncing skills', () => __awaiter(this, void 0, void 0, function* () {
24
- const result = yield dependencies.updateSkills();
25
- if (result.updated.length > 0) {
26
- dependencies.log(`Synced skills (${result.updated.join(', ')})`);
27
- return;
28
- }
29
- if (result.reason) {
30
- dependencies.log(result.reason);
31
- return;
32
- }
33
- dependencies.log('No skill updates found.');
34
- }), { skipSetup: true }));
35
- }
36
- //# sourceMappingURL=skills-command.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"skills-command.js","sourceRoot":"","sources":["../../src/commands/skills-command.ts"],"names":[],"mappings":";;;;;;;;;AACA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAA2B,MAAM,aAAa,CAAC;AAOpE,SAAS,yBAAyB;IAC9B,OAAO;QACH,YAAY,EAAE,GAAG,EAAE,CAAC,YAAY,EAAE;QAClC,GAAG,EAAE,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;KACvC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,sBAAsB,CAClC,OAAgB,EAChB,eAA0C,yBAAyB,EAAE;IAErE,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,qBAAqB,CAAC,CAAC;IAEnF,aAAa;SACR,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,uCAAuC,CAAC;SACpD,MAAM,CACH,UAAU,CACN,gBAAgB,EAChB,GAAS,EAAE;QACP,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,YAAY,EAAE,CAAC;QAEjD,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,YAAY,CAAC,GAAG,CAAC,kBAAkB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO;QACX,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAChB,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAChC,OAAO;QACX,CAAC;QAED,YAAY,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IAChD,CAAC,CAAA,EACD,EAAE,SAAS,EAAE,IAAI,EAAE,CACtB,CACJ,CAAC;AACV,CAAC"}
@@ -1,13 +0,0 @@
1
- export declare function getSkillsDirectory(homeDir?: string): string;
2
- export declare function getSkillsStateFile(homeDir?: string): string;
3
- export interface UpdateSkillsResult {
4
- updated: string[];
5
- skipped: boolean;
6
- reason?: string;
7
- commit?: string;
8
- }
9
- export interface UpdateSkillsOptions {
10
- silent?: boolean;
11
- }
12
- export declare function updateSkills(options?: UpdateSkillsOptions): Promise<UpdateSkillsResult>;
13
- //# sourceMappingURL=skills.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/commands/skills.ts"],"names":[],"mappings":"AAyBA,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,MAAqB,GAAG,MAAM,CAEzE;AAED,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,MAAqB,GAAG,MAAM,CAEzE;AAuID,MAAM,WAAW,kBAAkB;IAC/B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAChC,MAAM,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAsB,YAAY,CAAC,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAgEjG"}
@@ -1,200 +0,0 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
- import fs from 'fs';
11
- import os from 'os';
12
- import path from 'path';
13
- import * as YAML from 'yaml';
14
- const SKILLS_REPO = 'bkper/skills';
15
- const SKILLS_BASE_PATH = 'skills';
16
- const GITHUB_API_BASE = 'https://api.github.com';
17
- const GITHUB_RAW_BASE = 'https://raw.githubusercontent.com';
18
- export function getSkillsDirectory(homeDir = os.homedir()) {
19
- return path.join(homeDir, '.agents', 'skills');
20
- }
21
- export function getSkillsStateFile(homeDir = os.homedir()) {
22
- return path.join(getSkillsDirectory(homeDir), '.bkper-skills.yaml');
23
- }
24
- function getLocalCommit() {
25
- const skillsStateFile = getSkillsStateFile();
26
- try {
27
- if (fs.existsSync(skillsStateFile)) {
28
- const content = fs.readFileSync(skillsStateFile, 'utf8');
29
- const state = YAML.parse(content);
30
- return state.commit || null;
31
- }
32
- }
33
- catch (_a) {
34
- // Ignore errors, treat as no commit
35
- }
36
- return null;
37
- }
38
- function saveLocalCommit(commit) {
39
- const skillsStateFile = getSkillsStateFile();
40
- fs.mkdirSync(path.dirname(skillsStateFile), { recursive: true });
41
- const state = { commit };
42
- fs.writeFileSync(skillsStateFile, YAML.stringify(state), 'utf8');
43
- }
44
- function fetchLatestCommit() {
45
- return __awaiter(this, void 0, void 0, function* () {
46
- const url = `${GITHUB_API_BASE}/repos/${SKILLS_REPO}/commits?path=${SKILLS_BASE_PATH}&per_page=1`;
47
- const response = yield fetch(url, {
48
- headers: {
49
- Accept: 'application/vnd.github.v3+json',
50
- 'User-Agent': 'bkper-cli',
51
- },
52
- });
53
- if (!response.ok) {
54
- throw new Error(`Failed to fetch commit: ${response.statusText}`);
55
- }
56
- const commits = (yield response.json());
57
- if (!commits.length) {
58
- throw new Error('No commits found for skills path');
59
- }
60
- return commits[0].sha;
61
- });
62
- }
63
- function fetchGitHubDirectory(repo, dirPath) {
64
- return __awaiter(this, void 0, void 0, function* () {
65
- const url = `${GITHUB_API_BASE}/repos/${repo}/contents/${dirPath}`;
66
- const response = yield fetch(url, {
67
- headers: {
68
- Accept: 'application/vnd.github.v3+json',
69
- 'User-Agent': 'bkper-cli',
70
- },
71
- });
72
- if (!response.ok) {
73
- throw new Error(`Failed to fetch ${url}: ${response.statusText}`);
74
- }
75
- return response.json();
76
- });
77
- }
78
- function downloadGitHubFile(repo, filePath) {
79
- return __awaiter(this, void 0, void 0, function* () {
80
- const url = `${GITHUB_RAW_BASE}/${repo}/main/${filePath}`;
81
- const response = yield fetch(url, {
82
- headers: {
83
- 'User-Agent': 'bkper-cli',
84
- },
85
- });
86
- if (!response.ok) {
87
- throw new Error(`Failed to download ${url}: ${response.statusText}`);
88
- }
89
- return response.text();
90
- });
91
- }
92
- function downloadSkillDirectory(skillName, targetDir) {
93
- return __awaiter(this, void 0, void 0, function* () {
94
- const skillPath = `${SKILLS_BASE_PATH}/${skillName}`;
95
- const files = yield fetchGitHubDirectory(SKILLS_REPO, skillPath);
96
- for (const file of files) {
97
- const localPath = path.join(targetDir, file.name);
98
- if (file.type === 'dir') {
99
- fs.mkdirSync(localPath, { recursive: true });
100
- const subFiles = yield fetchGitHubDirectory(SKILLS_REPO, file.path);
101
- for (const subFile of subFiles) {
102
- if (subFile.type === 'file' && subFile.download_url) {
103
- const content = yield downloadGitHubFile(SKILLS_REPO, subFile.path);
104
- fs.writeFileSync(path.join(localPath, subFile.name), content, 'utf8');
105
- }
106
- }
107
- }
108
- else if (file.type === 'file') {
109
- const content = yield downloadGitHubFile(SKILLS_REPO, file.path);
110
- fs.writeFileSync(localPath, content, 'utf8');
111
- }
112
- }
113
- });
114
- }
115
- function clearBkperSkills(skillsDir) {
116
- if (!fs.existsSync(skillsDir)) {
117
- return;
118
- }
119
- const entries = fs.readdirSync(skillsDir, { withFileTypes: true });
120
- for (const entry of entries) {
121
- if (entry.isDirectory() && entry.name.startsWith('bkper-')) {
122
- fs.rmSync(path.join(skillsDir, entry.name), { recursive: true });
123
- }
124
- }
125
- }
126
- function fetchAvailableSkills() {
127
- return __awaiter(this, void 0, void 0, function* () {
128
- const files = yield fetchGitHubDirectory(SKILLS_REPO, SKILLS_BASE_PATH);
129
- return files.filter(f => f.type === 'dir' && f.name.startsWith('bkper-')).map(f => f.name);
130
- });
131
- }
132
- function getInstalledBkperSkills(skillsDir) {
133
- if (!fs.existsSync(skillsDir)) {
134
- return [];
135
- }
136
- const entries = fs.readdirSync(skillsDir, { withFileTypes: true });
137
- return entries
138
- .filter(entry => entry.isDirectory() && entry.name.startsWith('bkper-'))
139
- .map(entry => entry.name);
140
- }
141
- function shortSha(sha) {
142
- return sha.substring(0, 7);
143
- }
144
- export function updateSkills() {
145
- return __awaiter(this, arguments, void 0, function* (options = {}) {
146
- const skillsDir = getSkillsDirectory();
147
- try {
148
- const remoteCommit = yield fetchLatestCommit();
149
- const localCommit = getLocalCommit();
150
- const installedSkills = getInstalledBkperSkills(skillsDir);
151
- const skillsExist = installedSkills.length > 0;
152
- if (remoteCommit === localCommit && skillsExist) {
153
- return {
154
- updated: [],
155
- skipped: true,
156
- reason: `Skills are up to date (${shortSha(localCommit)})`,
157
- commit: localCommit,
158
- };
159
- }
160
- const availableSkills = yield fetchAvailableSkills();
161
- if (availableSkills.length === 0) {
162
- return {
163
- updated: [],
164
- skipped: true,
165
- reason: 'No bkper-* skills found in repository',
166
- };
167
- }
168
- clearBkperSkills(skillsDir);
169
- fs.mkdirSync(skillsDir, { recursive: true });
170
- const updated = [];
171
- for (const skillName of availableSkills) {
172
- const skillTargetDir = path.join(skillsDir, skillName);
173
- fs.mkdirSync(skillTargetDir, { recursive: true });
174
- try {
175
- yield downloadSkillDirectory(skillName, skillTargetDir);
176
- updated.push(skillName);
177
- }
178
- catch (err) {
179
- if (!options.silent) {
180
- console.error(` Warning: Failed to download skill '${skillName}':`, err instanceof Error ? err.message : err);
181
- }
182
- }
183
- }
184
- saveLocalCommit(remoteCommit);
185
- return {
186
- updated,
187
- skipped: false,
188
- commit: remoteCommit,
189
- };
190
- }
191
- catch (err) {
192
- return {
193
- updated: [],
194
- skipped: true,
195
- reason: `Could not check for updates: ${err instanceof Error ? err.message : err}`,
196
- };
197
- }
198
- });
199
- }
200
- //# sourceMappingURL=skills.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/commands/skills.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAiB7B,MAAM,WAAW,GAAG,cAAc,CAAC;AACnC,MAAM,gBAAgB,GAAG,QAAQ,CAAC;AAClC,MAAM,eAAe,GAAG,wBAAwB,CAAC;AACjD,MAAM,eAAe,GAAG,mCAAmC,CAAC;AAE5D,MAAM,UAAU,kBAAkB,CAAC,UAAkB,EAAE,CAAC,OAAO,EAAE;IAC7D,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,UAAkB,EAAE,CAAC,OAAO,EAAE;IAC7D,OAAO,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,oBAAoB,CAAC,CAAC;AACxE,CAAC;AAED,SAAS,cAAc;IACnB,MAAM,eAAe,GAAG,kBAAkB,EAAE,CAAC;IAE7C,IAAI,CAAC;QACD,IAAI,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;YACjC,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;YACzD,MAAM,KAAK,GAAgB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC/C,OAAO,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC;QAChC,CAAC;IACL,CAAC;IAAC,WAAM,CAAC;QACL,oCAAoC;IACxC,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,SAAS,eAAe,CAAC,MAAc;IACnC,MAAM,eAAe,GAAG,kBAAkB,EAAE,CAAC;IAC7C,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACjE,MAAM,KAAK,GAAgB,EAAE,MAAM,EAAE,CAAC;IACtC,EAAE,CAAC,aAAa,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;AACrE,CAAC;AAED,SAAe,iBAAiB;;QAC5B,MAAM,GAAG,GAAG,GAAG,eAAe,UAAU,WAAW,iBAAiB,gBAAgB,aAAa,CAAC;QAElG,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC9B,OAAO,EAAE;gBACL,MAAM,EAAE,gCAAgC;gBACxC,YAAY,EAAE,WAAW;aAC5B;SACJ,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,2BAA2B,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QACtE,CAAC;QAED,MAAM,OAAO,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAmB,CAAC;QAC1D,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACxD,CAAC;QAED,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAC1B,CAAC;CAAA;AAED,SAAe,oBAAoB,CAAC,IAAY,EAAE,OAAe;;QAC7D,MAAM,GAAG,GAAG,GAAG,eAAe,UAAU,IAAI,aAAa,OAAO,EAAE,CAAC;QAEnE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC9B,OAAO,EAAE;gBACL,MAAM,EAAE,gCAAgC;gBACxC,YAAY,EAAE,WAAW;aAC5B;SACJ,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,mBAAmB,GAAG,KAAK,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QACtE,CAAC;QAED,OAAO,QAAQ,CAAC,IAAI,EAA2B,CAAC;IACpD,CAAC;CAAA;AAED,SAAe,kBAAkB,CAAC,IAAY,EAAE,QAAgB;;QAC5D,MAAM,GAAG,GAAG,GAAG,eAAe,IAAI,IAAI,SAAS,QAAQ,EAAE,CAAC;QAE1D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC9B,OAAO,EAAE;gBACL,YAAY,EAAE,WAAW;aAC5B;SACJ,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,sBAAsB,GAAG,KAAK,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QACzE,CAAC;QAED,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;CAAA;AAED,SAAe,sBAAsB,CAAC,SAAiB,EAAE,SAAiB;;QACtE,MAAM,SAAS,GAAG,GAAG,gBAAgB,IAAI,SAAS,EAAE,CAAC;QACrD,MAAM,KAAK,GAAG,MAAM,oBAAoB,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QAEjE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACvB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAElD,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;gBACtB,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC7C,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBACpE,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;oBAC7B,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;wBAClD,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;wBACpE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;oBAC1E,CAAC;gBACL,CAAC;YACL,CAAC;iBAAM,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC9B,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBACjE,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;YACjD,CAAC;QACL,CAAC;IACL,CAAC;CAAA;AAED,SAAS,gBAAgB,CAAC,SAAiB;IACvC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5B,OAAO;IACX,CAAC;IAED,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACnE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC1B,IAAI,KAAK,CAAC,WAAW,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzD,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrE,CAAC;IACL,CAAC;AACL,CAAC;AAED,SAAe,oBAAoB;;QAC/B,MAAM,KAAK,GAAG,MAAM,oBAAoB,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;QACxE,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC/F,CAAC;CAAA;AAED,SAAS,uBAAuB,CAAC,SAAiB;IAC9C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,CAAC;IACd,CAAC;IAED,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACnE,OAAO,OAAO;SACT,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;SACvE,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,QAAQ,CAAC,GAAW;IACzB,OAAO,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC/B,CAAC;AAaD,MAAM,UAAgB,YAAY;yDAAC,UAA+B,EAAE;QAChE,MAAM,SAAS,GAAG,kBAAkB,EAAE,CAAC;QAEvC,IAAI,CAAC;YACD,MAAM,YAAY,GAAG,MAAM,iBAAiB,EAAE,CAAC;YAC/C,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;YAErC,MAAM,eAAe,GAAG,uBAAuB,CAAC,SAAS,CAAC,CAAC;YAC3D,MAAM,WAAW,GAAG,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC;YAE/C,IAAI,YAAY,KAAK,WAAW,IAAI,WAAW,EAAE,CAAC;gBAC9C,OAAO;oBACH,OAAO,EAAE,EAAE;oBACX,OAAO,EAAE,IAAI;oBACb,MAAM,EAAE,0BAA0B,QAAQ,CAAC,WAAW,CAAC,GAAG;oBAC1D,MAAM,EAAE,WAAW;iBACtB,CAAC;YACN,CAAC;YAED,MAAM,eAAe,GAAG,MAAM,oBAAoB,EAAE,CAAC;YAErD,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC/B,OAAO;oBACH,OAAO,EAAE,EAAE;oBACX,OAAO,EAAE,IAAI;oBACb,MAAM,EAAE,uCAAuC;iBAClD,CAAC;YACN,CAAC;YAED,gBAAgB,CAAC,SAAS,CAAC,CAAC;YAC5B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAE7C,MAAM,OAAO,GAAa,EAAE,CAAC;YAC7B,KAAK,MAAM,SAAS,IAAI,eAAe,EAAE,CAAC;gBACtC,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;gBACvD,EAAE,CAAC,SAAS,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAElD,IAAI,CAAC;oBACD,MAAM,sBAAsB,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;oBACxD,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC5B,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACX,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;wBAClB,OAAO,CAAC,KAAK,CACT,wCAAwC,SAAS,IAAI,EACrD,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAC3C,CAAC;oBACN,CAAC;gBACL,CAAC;YACL,CAAC;YAED,eAAe,CAAC,YAAY,CAAC,CAAC;YAE9B,OAAO;gBACH,OAAO;gBACP,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,YAAY;aACvB,CAAC;QACN,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO;gBACH,OAAO,EAAE,EAAE;gBACX,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,gCAAgC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE;aACrF,CAAC;QACN,CAAC;IACL,CAAC;CAAA"}