@harborppm/cli 0.28.0 → 0.29.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/lib/cli.mjs +42 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -57,7 +57,7 @@ Your harbor is the same one at [harborppm.com](https://harborppm.com/today?utm_s
|
|
|
57
57
|
- **GitHub**: a pull request that names a task's key (RR-42) shows on the task and moves it along.
|
|
58
58
|
- **Claude and other AI apps**, connected over MCP from [harborppm.com/ai](https://harborppm.com/ai?utm_source=npm&utm_medium=readme&utm_campaign=cli).
|
|
59
59
|
|
|
60
|
-
`harbor open RR-42` opens a task on the website (in the right harbor, even when the browser had another one open), `harbor open Ridge` a project, and `harbor open` on its own opens Today. `harbor invite sam@example.com` sends Sam the same invite letter the People page does (`--viewer` to let them look but not change anything); only a harbor's owner can invite. `harbor calendar` prints your private calendar link, to add to Google, Apple or Outlook calendar: your due dates, milestones and sign-offs beside your meetings, kept up to date (`--program NAME` for everything dated in one program, `--new` to swap the link for a fresh one, `--off` to turn it off).
|
|
60
|
+
`harbor open RR-42` opens a task on the website (in the right harbor, even when the browser had another one open), `harbor open Ridge` a project, and `harbor open` on its own opens Today. `harbor invite sam@example.com` sends Sam the same invite letter the People page does (`--viewer` to let them look but not change anything); only a harbor's owner can invite. `harbor calendar` prints your private calendar link, to add to Google, Apple or Outlook calendar: your due dates, milestones and sign-offs beside your meetings, kept up to date (`--program NAME` for everything dated in one program, `--new` to swap the link for a fresh one, `--off` to turn it off). `harbor roadmap "Next steps"` publishes a project as a public roadmap page (Now, Next and Shipped, task titles only) and prints its link; `--dates` adds the day each thing shipped and `--off` takes it down. Only a harbor's owner can publish.
|
|
61
61
|
|
|
62
62
|
The website has the commands too: turn on **Command line at the bottom** in your menu, press `/`, and type `mine`, `add "Call the mill" #ridge @sam --due fri` or `done RR-12`.
|
|
63
63
|
|
|
@@ -103,6 +103,7 @@ harbor show TASK one task in full, with its web link
|
|
|
103
103
|
harbor open [TASK|PROJECT] open it on the website (or Today)
|
|
104
104
|
harbor invite EMAIL [--viewer] invite someone to your harbor by email
|
|
105
105
|
harbor calendar [--program P] [--new|--off] your private calendar link (.ics)
|
|
106
|
+
harbor roadmap PROJECT [--dates] [--off] publish a project's public roadmap
|
|
106
107
|
|
|
107
108
|
harbor program "NAME" [--portfolio P] [--lead me|NAME] [--starts DATE]
|
|
108
109
|
[--ends DATE]
|
package/lib/cli.mjs
CHANGED
|
@@ -79,6 +79,8 @@ export const HELP = `harbor: Harbor from the terminal
|
|
|
79
79
|
harbor prompt --init SHELL how to add it: zsh, bash, fish
|
|
80
80
|
or starship
|
|
81
81
|
harbor calendar [--program P] [--new|--off] your private calendar link (.ics)
|
|
82
|
+
harbor roadmap PROJECT [--dates|--no-dates] [--off]
|
|
83
|
+
publish a project's public roadmap
|
|
82
84
|
|
|
83
85
|
harbor program "NAME" [--portfolio P] [--lead me|NAME] [--starts DATE]
|
|
84
86
|
[--ends DATE]
|
|
@@ -1011,6 +1013,46 @@ export async function run(argv, io = {}) {
|
|
|
1011
1013
|
);
|
|
1012
1014
|
return 0;
|
|
1013
1015
|
}
|
|
1016
|
+
case "roadmap": {
|
|
1017
|
+
const { positionals, values, harbor } = parse(
|
|
1018
|
+
spec(["dates", "no-dates", "site", "no-site", "off"]),
|
|
1019
|
+
);
|
|
1020
|
+
const project = text(positionals, "which project");
|
|
1021
|
+
if (values.dates && values["no-dates"])
|
|
1022
|
+
throw new HarborError("Say --dates or --no-dates, not both.");
|
|
1023
|
+
if (values.site && values["no-site"])
|
|
1024
|
+
throw new HarborError("Say --site or --no-site, not both.");
|
|
1025
|
+
if (!hasFullAccess(creds)) {
|
|
1026
|
+
throw new HarborError("Publishing needs full access. Run harbor login, then try again.");
|
|
1027
|
+
}
|
|
1028
|
+
const r = await client.app({
|
|
1029
|
+
op: "roadmap",
|
|
1030
|
+
...(harbor ? { harbor } : {}),
|
|
1031
|
+
project,
|
|
1032
|
+
...(values.off ? { off: true } : {}),
|
|
1033
|
+
...(values.dates || values["no-dates"] ? { showDates: Boolean(values.dates) } : {}),
|
|
1034
|
+
...(values.site || values["no-site"] ? { onSite: Boolean(values.site) } : {}),
|
|
1035
|
+
});
|
|
1036
|
+
if (asJson) {
|
|
1037
|
+
out(jsonText(r));
|
|
1038
|
+
return 0;
|
|
1039
|
+
}
|
|
1040
|
+
if (!r.url) {
|
|
1041
|
+
out(
|
|
1042
|
+
plain(
|
|
1043
|
+
`${r.project} isn't published any more. Its link says the roadmap isn't published.`,
|
|
1044
|
+
),
|
|
1045
|
+
);
|
|
1046
|
+
return 0;
|
|
1047
|
+
}
|
|
1048
|
+
const shows = r.showDates ? "titles and the day each shipped" : "titles only";
|
|
1049
|
+
out(
|
|
1050
|
+
plain(
|
|
1051
|
+
`${r.project}'s public roadmap (Now, Next and Shipped; ${shows}, no people):\n\n ${r.url}${r.siteUrl ? `\n\nIt's also Harbor's own roadmap at ${r.siteUrl}.` : ""}\n\nharbor roadmap "${r.project}" --off takes it down.`,
|
|
1052
|
+
),
|
|
1053
|
+
);
|
|
1054
|
+
return 0;
|
|
1055
|
+
}
|
|
1014
1056
|
case "add": {
|
|
1015
1057
|
const { positionals, values, harbor } = parse(
|
|
1016
1058
|
spec(["over-limit"], ["project", "assignee", "due", "priority", "status"]),
|