openspec-stat 1.3.4 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -1
- package/README.zh-CN.md +2 -1
- package/dist/esm/branch-selector.js +87 -214
- package/dist/esm/cli.js +14 -64
- package/dist/esm/commands/init.js +17 -44
- package/dist/esm/commands/multi.js +123 -180
- package/dist/esm/commands/single.js +143 -152
- package/dist/esm/config.js +22 -64
- package/dist/esm/formatters.js +285 -520
- package/dist/esm/git-analyzer.js +116 -354
- package/dist/esm/i18n/index.js +22 -10
- package/dist/esm/i18n/locales/en.json +43 -43
- package/dist/esm/i18n/locales/zh-CN.json +43 -43
- package/dist/esm/multi/config-validator.d.ts +1 -1
- package/dist/esm/multi/config-validator.js +25 -26
- package/dist/esm/multi/config-wizard.js +217 -459
- package/dist/esm/multi/multi-repo-analyzer.d.ts +11 -1
- package/dist/esm/multi/multi-repo-analyzer.js +228 -426
- package/dist/esm/stats-aggregator.js +115 -193
- package/dist/esm/time-utils.js +11 -17
- package/dist/esm/ui/spinner.d.ts +12 -0
- package/dist/esm/ui/spinner.js +38 -0
- package/package.json +21 -7
- package/dist/cjs/branch-selector.d.ts +0 -7
- package/dist/cjs/branch-selector.js +0 -128
- package/dist/cjs/cli.d.ts +0 -2
- package/dist/cjs/cli.js +0 -19
- package/dist/cjs/commands/init.d.ts +0 -7
- package/dist/cjs/commands/init.js +0 -58
- package/dist/cjs/commands/multi.d.ts +0 -16
- package/dist/cjs/commands/multi.js +0 -172
- package/dist/cjs/commands/single.d.ts +0 -2
- package/dist/cjs/commands/single.js +0 -148
- package/dist/cjs/config.d.ts +0 -3
- package/dist/cjs/config.js +0 -66
- package/dist/cjs/formatters.d.ts +0 -7
- package/dist/cjs/formatters.js +0 -482
- package/dist/cjs/git-analyzer.d.ts +0 -11
- package/dist/cjs/git-analyzer.js +0 -165
- package/dist/cjs/i18n/index.d.ts +0 -7
- package/dist/cjs/i18n/index.js +0 -84
- package/dist/cjs/i18n/locales/en.json +0 -154
- package/dist/cjs/i18n/locales/zh-CN.json +0 -154
- package/dist/cjs/index.d.ts +0 -6
- package/dist/cjs/index.js +0 -50
- package/dist/cjs/multi/config-validator.d.ts +0 -3
- package/dist/cjs/multi/config-validator.js +0 -130
- package/dist/cjs/multi/config-wizard.d.ts +0 -50
- package/dist/cjs/multi/config-wizard.js +0 -331
- package/dist/cjs/multi/multi-repo-analyzer.d.ts +0 -14
- package/dist/cjs/multi/multi-repo-analyzer.js +0 -210
- package/dist/cjs/stats-aggregator.d.ts +0 -7
- package/dist/cjs/stats-aggregator.js +0 -155
- package/dist/cjs/time-utils.d.ts +0 -6
- package/dist/cjs/time-utils.js +0 -55
- package/dist/cjs/types.d.ts +0 -136
- package/dist/cjs/types.js +0 -17
package/README.md
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://npmjs.com/package/openspec-stat)
|
|
4
4
|
[](https://npmjs.com/package/openspec-stat)
|
|
5
|
+
[](https://github.com/Orchardxyz/openspec-stat/actions/workflows/ci.yml)
|
|
5
6
|
|
|
6
7
|
English | [简体中文](./README.zh-CN.md)
|
|
7
8
|
|
|
@@ -272,7 +273,7 @@ pnpm dev
|
|
|
272
273
|
pnpm build
|
|
273
274
|
|
|
274
275
|
# Local testing
|
|
275
|
-
node dist/
|
|
276
|
+
node dist/cjs/cli.js
|
|
276
277
|
```
|
|
277
278
|
|
|
278
279
|
## Contributing & Release Process
|
package/README.zh-CN.md
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://npmjs.com/package/openspec-stat)
|
|
4
4
|
[](https://npmjs.com/package/openspec-stat)
|
|
5
|
+
[](https://github.com/Orchardxyz/openspec-stat/actions/workflows/ci.yml)
|
|
5
6
|
|
|
6
7
|
用于追踪团队成员在 Git 仓库中的 OpenSpec 提案和代码变更的命令行工具。
|
|
7
8
|
|
|
@@ -270,7 +271,7 @@ pnpm dev
|
|
|
270
271
|
pnpm build
|
|
271
272
|
|
|
272
273
|
# 本地测试
|
|
273
|
-
node dist/
|
|
274
|
+
node dist/cjs/cli.js
|
|
274
275
|
```
|
|
275
276
|
|
|
276
277
|
## 贡献与发布流程
|
|
@@ -1,222 +1,95 @@
|
|
|
1
|
-
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
2
|
-
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
|
|
3
|
-
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
4
|
-
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
|
|
5
|
-
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
|
|
6
|
-
function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, catch: function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; }
|
|
7
|
-
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
8
|
-
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
|
|
9
|
-
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
10
|
-
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
|
|
11
|
-
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
12
|
-
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
13
|
-
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
|
|
14
|
-
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
|
|
15
1
|
import { select, checkbox, input } from '@inquirer/prompts';
|
|
16
2
|
import simpleGit from 'simple-git';
|
|
17
3
|
import chalk from 'chalk';
|
|
18
4
|
import { t } from "./i18n/index.js";
|
|
19
|
-
export function getActiveBranches(
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
case 0:
|
|
37
|
-
limit = _args.length > 1 && _args[1] !== undefined ? _args[1] : 10;
|
|
38
|
-
git = simpleGit(repoPath);
|
|
39
|
-
_context.next = 4;
|
|
40
|
-
return git.branch(['-r']);
|
|
41
|
-
case 4:
|
|
42
|
-
branches = _context.sent;
|
|
43
|
-
branchNames = branches.all.filter(function (b) {
|
|
44
|
-
return !b.includes('HEAD');
|
|
45
|
-
});
|
|
46
|
-
branchInfos = [];
|
|
47
|
-
_iterator = _createForOfIteratorHelper(branchNames);
|
|
48
|
-
_context.prev = 8;
|
|
49
|
-
_iterator.s();
|
|
50
|
-
case 10:
|
|
51
|
-
if ((_step = _iterator.n()).done) {
|
|
52
|
-
_context.next = 24;
|
|
53
|
-
break;
|
|
54
|
-
}
|
|
55
|
-
branchName = _step.value;
|
|
56
|
-
_context.prev = 12;
|
|
57
|
-
_context.next = 15;
|
|
58
|
-
return git.log(_defineProperty({
|
|
59
|
-
'--max-count': '1'
|
|
60
|
-
}, branchName, null));
|
|
61
|
-
case 15:
|
|
62
|
-
log = _context.sent;
|
|
63
|
-
if (log.latest) {
|
|
64
|
-
branchInfos.push({
|
|
65
|
-
name: branchName,
|
|
66
|
-
lastCommitDate: new Date(log.latest.date),
|
|
67
|
-
commitCount: 0
|
|
68
|
-
});
|
|
69
|
-
}
|
|
70
|
-
_context.next = 22;
|
|
71
|
-
break;
|
|
72
|
-
case 19:
|
|
73
|
-
_context.prev = 19;
|
|
74
|
-
_context.t0 = _context["catch"](12);
|
|
75
|
-
return _context.abrupt("continue", 22);
|
|
76
|
-
case 22:
|
|
77
|
-
_context.next = 10;
|
|
78
|
-
break;
|
|
79
|
-
case 24:
|
|
80
|
-
_context.next = 29;
|
|
81
|
-
break;
|
|
82
|
-
case 26:
|
|
83
|
-
_context.prev = 26;
|
|
84
|
-
_context.t1 = _context["catch"](8);
|
|
85
|
-
_iterator.e(_context.t1);
|
|
86
|
-
case 29:
|
|
87
|
-
_context.prev = 29;
|
|
88
|
-
_iterator.f();
|
|
89
|
-
return _context.finish(29);
|
|
90
|
-
case 32:
|
|
91
|
-
branchInfos.sort(function (a, b) {
|
|
92
|
-
return b.lastCommitDate.getTime() - a.lastCommitDate.getTime();
|
|
93
|
-
});
|
|
94
|
-
return _context.abrupt("return", branchInfos.slice(0, limit));
|
|
95
|
-
case 34:
|
|
96
|
-
case "end":
|
|
97
|
-
return _context.stop();
|
|
5
|
+
export async function getActiveBranches(repoPath, limit = 10) {
|
|
6
|
+
const git = simpleGit(repoPath);
|
|
7
|
+
const branches = await git.branch(['-r']);
|
|
8
|
+
const branchNames = branches.all.filter(b => !b.includes('HEAD'));
|
|
9
|
+
const branchInfos = [];
|
|
10
|
+
for (const branchName of branchNames) {
|
|
11
|
+
try {
|
|
12
|
+
const log = await git.log({
|
|
13
|
+
'--max-count': '1',
|
|
14
|
+
[branchName]: null
|
|
15
|
+
});
|
|
16
|
+
if (log.latest) {
|
|
17
|
+
branchInfos.push({
|
|
18
|
+
name: branchName,
|
|
19
|
+
lastCommitDate: new Date(log.latest.date),
|
|
20
|
+
commitCount: 0
|
|
21
|
+
});
|
|
98
22
|
}
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
|
|
23
|
+
} catch (error) {
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
branchInfos.sort((a, b) => b.lastCommitDate.getTime() - a.lastCommitDate.getTime());
|
|
28
|
+
return branchInfos.slice(0, limit);
|
|
102
29
|
}
|
|
103
|
-
export function selectBranches(
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
activeBranches = _context2.sent;
|
|
117
|
-
if (!(activeBranches.length === 0)) {
|
|
118
|
-
_context2.next = 7;
|
|
119
|
-
break;
|
|
120
|
-
}
|
|
121
|
-
console.log(chalk.yellow(t('warning.noBranches')));
|
|
122
|
-
return _context2.abrupt("return", defaultBranches || []);
|
|
123
|
-
case 7:
|
|
124
|
-
choices = activeBranches.map(function (branch) {
|
|
125
|
-
return {
|
|
126
|
-
name: "".concat(branch.name, " (").concat(t('branch.lastCommit', {
|
|
127
|
-
date: branch.lastCommitDate.toLocaleDateString()
|
|
128
|
-
}), ")"),
|
|
129
|
-
value: branch.name,
|
|
130
|
-
checked: false
|
|
131
|
-
};
|
|
132
|
-
});
|
|
133
|
-
choices.push({
|
|
134
|
-
name: chalk.gray(t('branch.customSeparator')),
|
|
135
|
-
value: '__custom__',
|
|
136
|
-
checked: false
|
|
137
|
-
});
|
|
138
|
-
_context2.next = 11;
|
|
139
|
-
return select({
|
|
140
|
-
message: t('branch.selectMode'),
|
|
141
|
-
choices: [{
|
|
142
|
-
name: t('branch.mode.select'),
|
|
143
|
-
value: 'select'
|
|
144
|
-
}, {
|
|
145
|
-
name: t('branch.mode.default'),
|
|
146
|
-
value: 'default'
|
|
147
|
-
}, {
|
|
148
|
-
name: t('branch.mode.custom'),
|
|
149
|
-
value: 'custom'
|
|
150
|
-
}]
|
|
151
|
-
});
|
|
152
|
-
case 11:
|
|
153
|
-
mode = _context2.sent;
|
|
154
|
-
if (!(mode === 'default')) {
|
|
155
|
-
_context2.next = 14;
|
|
156
|
-
break;
|
|
157
|
-
}
|
|
158
|
-
return _context2.abrupt("return", defaultBranches || []);
|
|
159
|
-
case 14:
|
|
160
|
-
if (!(mode === 'custom')) {
|
|
161
|
-
_context2.next = 19;
|
|
162
|
-
break;
|
|
163
|
-
}
|
|
164
|
-
_context2.next = 17;
|
|
165
|
-
return input({
|
|
166
|
-
message: t('branch.customInput'),
|
|
167
|
-
default: (defaultBranches === null || defaultBranches === void 0 ? void 0 : defaultBranches.join(', ')) || ''
|
|
168
|
-
});
|
|
169
|
-
case 17:
|
|
170
|
-
customInput = _context2.sent;
|
|
171
|
-
return _context2.abrupt("return", customInput.split(',').map(function (b) {
|
|
172
|
-
return b.trim();
|
|
173
|
-
}).filter(function (b) {
|
|
174
|
-
return b;
|
|
175
|
-
}));
|
|
176
|
-
case 19:
|
|
177
|
-
_context2.next = 21;
|
|
178
|
-
return checkbox({
|
|
179
|
-
message: t('branch.selectPrompt'),
|
|
180
|
-
choices: choices.slice(0, -1),
|
|
181
|
-
pageSize: 15
|
|
182
|
-
});
|
|
183
|
-
case 21:
|
|
184
|
-
selected = _context2.sent;
|
|
185
|
-
if (selected.length === 0) {
|
|
186
|
-
console.log(chalk.yellow(t('warning.noBranchesSelected')));
|
|
187
|
-
process.exit(1);
|
|
188
|
-
}
|
|
189
|
-
if (selected.length > 0) {
|
|
190
|
-
console.log(chalk.green(t('branch.selected')));
|
|
191
|
-
selected.forEach(function (branch) {
|
|
192
|
-
console.log(chalk.green(" \u2022 ".concat(branch)));
|
|
193
|
-
});
|
|
194
|
-
}
|
|
195
|
-
if (!selected.includes('__custom__')) {
|
|
196
|
-
_context2.next = 30;
|
|
197
|
-
break;
|
|
198
|
-
}
|
|
199
|
-
_context2.next = 27;
|
|
200
|
-
return input({
|
|
201
|
-
message: t('branch.additionalInput')
|
|
202
|
-
});
|
|
203
|
-
case 27:
|
|
204
|
-
_customInput = _context2.sent;
|
|
205
|
-
customBranches = _customInput.split(',').map(function (b) {
|
|
206
|
-
return b.trim();
|
|
207
|
-
}).filter(function (b) {
|
|
208
|
-
return b;
|
|
209
|
-
});
|
|
210
|
-
return _context2.abrupt("return", [].concat(_toConsumableArray(selected.filter(function (b) {
|
|
211
|
-
return b !== '__custom__';
|
|
212
|
-
})), _toConsumableArray(customBranches)));
|
|
213
|
-
case 30:
|
|
214
|
-
return _context2.abrupt("return", selected);
|
|
215
|
-
case 31:
|
|
216
|
-
case "end":
|
|
217
|
-
return _context2.stop();
|
|
218
|
-
}
|
|
219
|
-
}, _callee2);
|
|
30
|
+
export async function selectBranches(repoPath, defaultBranches) {
|
|
31
|
+
console.log(chalk.blue(t('branch.fetching')));
|
|
32
|
+
const activeBranches = await getActiveBranches(repoPath, 10);
|
|
33
|
+
if (activeBranches.length === 0) {
|
|
34
|
+
console.log(chalk.yellow(t('warning.noBranches')));
|
|
35
|
+
return defaultBranches || [];
|
|
36
|
+
}
|
|
37
|
+
const choices = activeBranches.map(branch => ({
|
|
38
|
+
name: `${branch.name} (${t('branch.lastCommit', {
|
|
39
|
+
date: branch.lastCommitDate.toLocaleDateString()
|
|
40
|
+
})})`,
|
|
41
|
+
value: branch.name,
|
|
42
|
+
checked: false
|
|
220
43
|
}));
|
|
221
|
-
|
|
44
|
+
choices.push({
|
|
45
|
+
name: chalk.gray(t('branch.customSeparator')),
|
|
46
|
+
value: '__custom__',
|
|
47
|
+
checked: false
|
|
48
|
+
});
|
|
49
|
+
const mode = await select({
|
|
50
|
+
message: t('branch.selectMode'),
|
|
51
|
+
choices: [{
|
|
52
|
+
name: t('branch.mode.select'),
|
|
53
|
+
value: 'select'
|
|
54
|
+
}, {
|
|
55
|
+
name: t('branch.mode.default'),
|
|
56
|
+
value: 'default'
|
|
57
|
+
}, {
|
|
58
|
+
name: t('branch.mode.custom'),
|
|
59
|
+
value: 'custom'
|
|
60
|
+
}]
|
|
61
|
+
});
|
|
62
|
+
if (mode === 'default') {
|
|
63
|
+
return defaultBranches || [];
|
|
64
|
+
}
|
|
65
|
+
if (mode === 'custom') {
|
|
66
|
+
const customInput = await input({
|
|
67
|
+
message: t('branch.customInput'),
|
|
68
|
+
default: defaultBranches?.join(', ') || ''
|
|
69
|
+
});
|
|
70
|
+
return customInput.split(',').map(b => b.trim()).filter(b => b);
|
|
71
|
+
}
|
|
72
|
+
const selected = await checkbox({
|
|
73
|
+
message: t('branch.selectPrompt'),
|
|
74
|
+
choices: choices.slice(0, -1),
|
|
75
|
+
pageSize: 15
|
|
76
|
+
});
|
|
77
|
+
if (selected.length === 0) {
|
|
78
|
+
console.log(chalk.yellow(t('warning.noBranchesSelected')));
|
|
79
|
+
process.exit(1);
|
|
80
|
+
}
|
|
81
|
+
if (selected.length > 0) {
|
|
82
|
+
console.log(chalk.green(t('branch.selected')));
|
|
83
|
+
selected.forEach(branch => {
|
|
84
|
+
console.log(chalk.green(` • ${branch}`));
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
if (selected.includes('__custom__')) {
|
|
88
|
+
const customInput = await input({
|
|
89
|
+
message: t('branch.additionalInput')
|
|
90
|
+
});
|
|
91
|
+
const customBranches = customInput.split(',').map(b => b.trim()).filter(b => b);
|
|
92
|
+
return [...selected.filter(b => b !== '__custom__'), ...customBranches];
|
|
93
|
+
}
|
|
94
|
+
return selected;
|
|
222
95
|
}
|
package/dist/esm/cli.js
CHANGED
|
@@ -1,72 +1,22 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
3
|
-
function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, catch: function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; }
|
|
4
|
-
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
5
|
-
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
6
|
-
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
7
|
-
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
|
|
8
|
-
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
9
|
-
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
|
|
10
|
-
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
|
|
11
2
|
import { Command } from 'commander';
|
|
12
3
|
import { runSingleRepoCommand } from "./commands/single.js";
|
|
13
4
|
import { runMultiRepoCommand } from "./commands/multi.js";
|
|
14
5
|
import { runInitCommand } from "./commands/init.js";
|
|
15
|
-
|
|
16
|
-
program.name('openspec-stat').description("Track team members' OpenSpec proposals and code changes in Git repositories").version("1.
|
|
6
|
+
const program = new Command();
|
|
7
|
+
program.name('openspec-stat').description("Track team members' OpenSpec proposals and code changes in Git repositories").version("1.4.0").enablePositionalOptions().passThroughOptions();
|
|
17
8
|
|
|
18
9
|
// Default command for single-repository mode (for backward compatibility)
|
|
19
|
-
program.argument('[repo]', 'Repository path', '.').option('-r, --repo <path>', 'Repository path (alternative)', '.').option('-b, --branches <branches>', 'Branch list, comma-separated').option('--no-interactive', 'Disable interactive branch selection').option('-s, --since <datetime>', 'Start time (default: yesterday 20:00)').option('-u, --until <datetime>', 'End time (default: today 20:00)').option('-a, --author <name>', 'Filter by specific author').option('--json', 'Output in JSON format').option('--csv', 'Output in CSV format').option('--markdown', 'Output in Markdown format').option('-c, --config <path>', 'Configuration file path').option('-v, --verbose', 'Verbose output mode').option('-l, --lang <language>', 'Language for output (en, zh-CN)', 'en').option('--no-fetch', 'Skip fetching remote branches').action(
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
}
|
|
32
|
-
}, _callee);
|
|
33
|
-
}));
|
|
34
|
-
return function (_x, _x2) {
|
|
35
|
-
return _ref.apply(this, arguments);
|
|
36
|
-
};
|
|
37
|
-
}());
|
|
38
|
-
program.command('multi').description('Multi-repository analysis mode (BETA)').option('-c, --config <path>', 'Configuration file path', '.openspec-stats.multi.json').option('-s, --since <datetime>', 'Override start time').option('-u, --until <datetime>', 'Override end time').option('-a, --author <name>', 'Filter by specific author').option('--json', 'Output in JSON format').option('--csv', 'Output in CSV format').option('--markdown', 'Output in Markdown format').option('-v, --verbose', 'Verbose output mode').option('-l, --lang <language>', 'Language (en, zh-CN)', 'en').option('--no-cleanup', 'Do not cleanup temporary directories').option('--show-contributors', 'Show detailed contributor statistics (default: only show summary)').option('--no-fetch', 'Skip fetching remote branches for local repositories').action( /*#__PURE__*/function () {
|
|
39
|
-
var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(options) {
|
|
40
|
-
return _regeneratorRuntime().wrap(function _callee2$(_context2) {
|
|
41
|
-
while (1) switch (_context2.prev = _context2.next) {
|
|
42
|
-
case 0:
|
|
43
|
-
_context2.next = 2;
|
|
44
|
-
return runMultiRepoCommand(options);
|
|
45
|
-
case 2:
|
|
46
|
-
case "end":
|
|
47
|
-
return _context2.stop();
|
|
48
|
-
}
|
|
49
|
-
}, _callee2);
|
|
50
|
-
}));
|
|
51
|
-
return function (_x3) {
|
|
52
|
-
return _ref2.apply(this, arguments);
|
|
53
|
-
};
|
|
54
|
-
}());
|
|
55
|
-
program.command('init').description('Initialize configuration file').option('--multi', 'Create multi-repository configuration (interactive)').option('--template <type>', 'Generate template (single|multi)').option('-o, --output <path>', 'Output file path').action( /*#__PURE__*/function () {
|
|
56
|
-
var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(options) {
|
|
57
|
-
return _regeneratorRuntime().wrap(function _callee3$(_context3) {
|
|
58
|
-
while (1) switch (_context3.prev = _context3.next) {
|
|
59
|
-
case 0:
|
|
60
|
-
_context3.next = 2;
|
|
61
|
-
return runInitCommand(options);
|
|
62
|
-
case 2:
|
|
63
|
-
case "end":
|
|
64
|
-
return _context3.stop();
|
|
65
|
-
}
|
|
66
|
-
}, _callee3);
|
|
67
|
-
}));
|
|
68
|
-
return function (_x4) {
|
|
69
|
-
return _ref3.apply(this, arguments);
|
|
70
|
-
};
|
|
71
|
-
}());
|
|
10
|
+
program.argument('[repo]', 'Repository path', '.').option('-r, --repo <path>', 'Repository path (alternative)', '.').option('-b, --branches <branches>', 'Branch list, comma-separated').option('--no-interactive', 'Disable interactive branch selection').option('-s, --since <datetime>', 'Start time (default: yesterday 20:00)').option('-u, --until <datetime>', 'End time (default: today 20:00)').option('-a, --author <name>', 'Filter by specific author').option('--json', 'Output in JSON format').option('--csv', 'Output in CSV format').option('--markdown', 'Output in Markdown format').option('-c, --config <path>', 'Configuration file path').option('-v, --verbose', 'Verbose output mode').option('-l, --lang <language>', 'Language for output (en, zh-CN)', 'en').option('--no-fetch', 'Skip fetching remote branches').action(async (repo, options) => {
|
|
11
|
+
await runSingleRepoCommand({
|
|
12
|
+
...options,
|
|
13
|
+
repo: repo || options.repo || '.'
|
|
14
|
+
});
|
|
15
|
+
});
|
|
16
|
+
program.command('multi').description('Multi-repository analysis mode (BETA)').option('-c, --config <path>', 'Configuration file path', '.openspec-stats.multi.json').option('-s, --since <datetime>', 'Override start time').option('-u, --until <datetime>', 'Override end time').option('-a, --author <name>', 'Filter by specific author').option('--json', 'Output in JSON format').option('--csv', 'Output in CSV format').option('--markdown', 'Output in Markdown format').option('-v, --verbose', 'Verbose output mode').option('-l, --lang <language>', 'Language (en, zh-CN)', 'en').option('--no-cleanup', 'Do not cleanup temporary directories').option('--show-contributors', 'Show detailed contributor statistics (default: only show summary)').option('--no-fetch', 'Skip fetching remote branches for local repositories').action(async options => {
|
|
17
|
+
await runMultiRepoCommand(options);
|
|
18
|
+
});
|
|
19
|
+
program.command('init').description('Initialize configuration file').option('--multi', 'Create multi-repository configuration (interactive)').option('--template <type>', 'Generate template (single|multi)').option('-o, --output <path>', 'Output file path').action(async options => {
|
|
20
|
+
await runInitCommand(options);
|
|
21
|
+
});
|
|
72
22
|
program.parse();
|
|
@@ -1,49 +1,22 @@
|
|
|
1
|
-
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
2
|
-
function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, catch: function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; }
|
|
3
|
-
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
|
|
4
|
-
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
|
|
5
1
|
import chalk from 'chalk';
|
|
6
2
|
import { writeFileSync } from 'fs';
|
|
7
3
|
import { t } from "../i18n/index.js";
|
|
8
4
|
import { runConfigWizard, SINGLE_REPO_TEMPLATE, MULTI_REPO_TEMPLATE } from "../multi/config-wizard.js";
|
|
9
|
-
export function runInitCommand(
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
console.log(chalk.green(t('init.templateCreated', {
|
|
27
|
-
path: outputPath
|
|
28
|
-
})));
|
|
29
|
-
console.log(chalk.gray(t('init.templateEdit')));
|
|
30
|
-
return _context.abrupt("return");
|
|
31
|
-
case 8:
|
|
32
|
-
_context.next = 10;
|
|
33
|
-
return runConfigWizard(options.multi || false);
|
|
34
|
-
case 10:
|
|
35
|
-
_context.next = 16;
|
|
36
|
-
break;
|
|
37
|
-
case 12:
|
|
38
|
-
_context.prev = 12;
|
|
39
|
-
_context.t0 = _context["catch"](0);
|
|
40
|
-
console.error(chalk.red(t('error.prefix')), _context.t0);
|
|
41
|
-
process.exit(1);
|
|
42
|
-
case 16:
|
|
43
|
-
case "end":
|
|
44
|
-
return _context.stop();
|
|
45
|
-
}
|
|
46
|
-
}, _callee, null, [[0, 12]]);
|
|
47
|
-
}));
|
|
48
|
-
return _runInitCommand.apply(this, arguments);
|
|
5
|
+
export async function runInitCommand(options) {
|
|
6
|
+
try {
|
|
7
|
+
if (options.template) {
|
|
8
|
+
const template = options.template === 'multi' ? MULTI_REPO_TEMPLATE : SINGLE_REPO_TEMPLATE;
|
|
9
|
+
const outputPath = options.output || `.openspec-stats.${options.template}.json`;
|
|
10
|
+
writeFileSync(outputPath, JSON.stringify(template, null, 2));
|
|
11
|
+
console.log(chalk.green(t('init.templateCreated', {
|
|
12
|
+
path: outputPath
|
|
13
|
+
})));
|
|
14
|
+
console.log(chalk.gray(t('init.templateEdit')));
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
await runConfigWizard(options.multi || false);
|
|
18
|
+
} catch (error) {
|
|
19
|
+
console.error(chalk.red(t('error.prefix')), error);
|
|
20
|
+
process.exit(1);
|
|
21
|
+
}
|
|
49
22
|
}
|