openplanr 3.0.1 → 3.1.1
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/CHANGELOG.md +35 -0
- package/README.md +1 -1
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.js +24 -1
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/init-deterministic.d.ts.map +1 -1
- package/dist/cli/commands/init-deterministic.js +49 -6
- package/dist/cli/commands/init-deterministic.js.map +1 -1
- package/dist/dashboard/.vite/manifest.json +2 -2
- package/dist/dashboard/assets/{index-Bk8DyO_2.css → index-BU5fzjyz.css} +1 -1
- package/dist/dashboard/assets/index-G7ygVDGg.js +572 -0
- package/dist/dashboard/assets/index-G7ygVDGg.js.map +1 -0
- package/dist/dashboard/dashboard-manifest.json +14 -14
- package/dist/dashboard/index.html +2 -2
- package/dist/models/types.d.ts +0 -46
- package/dist/models/types.d.ts.map +1 -1
- package/dist/services/capability-map-service.d.ts +4 -0
- package/dist/services/capability-map-service.d.ts.map +1 -1
- package/dist/services/capability-map-service.js +7 -1
- package/dist/services/capability-map-service.js.map +1 -1
- package/dist/services/claude-plugin-service.d.ts +6 -1
- package/dist/services/claude-plugin-service.d.ts.map +1 -1
- package/dist/services/claude-plugin-service.js +54 -15
- package/dist/services/claude-plugin-service.js.map +1 -1
- package/dist/services/config-service.d.ts +24 -1
- package/dist/services/config-service.d.ts.map +1 -1
- package/dist/services/config-service.js +69 -2
- package/dist/services/config-service.js.map +1 -1
- package/dist/services/git-service.d.ts +5 -0
- package/dist/services/git-service.d.ts.map +1 -1
- package/dist/services/git-service.js +27 -0
- package/dist/services/git-service.js.map +1 -1
- package/dist/services/global-install-service.d.ts +24 -0
- package/dist/services/global-install-service.d.ts.map +1 -0
- package/dist/services/global-install-service.js +68 -0
- package/dist/services/global-install-service.js.map +1 -0
- package/dist/services/linear-pull-service.d.ts.map +1 -1
- package/dist/services/linear-pull-service.js +1 -2
- package/dist/services/linear-pull-service.js.map +1 -1
- package/dist/services/pipeline-package-service.d.ts +2 -0
- package/dist/services/pipeline-package-service.d.ts.map +1 -1
- package/dist/services/pipeline-package-service.js +2 -1
- package/dist/services/pipeline-package-service.js.map +1 -1
- package/dist/services/runtime-change-summary.d.ts.map +1 -1
- package/dist/services/runtime-change-summary.js +4 -0
- package/dist/services/runtime-change-summary.js.map +1 -1
- package/dist/services/runtime-manager-service.d.ts.map +1 -1
- package/dist/services/runtime-manager-service.js +14 -3
- package/dist/services/runtime-manager-service.js.map +1 -1
- package/dist/services/spec-service.d.ts.map +1 -1
- package/dist/services/spec-service.js +11 -22
- package/dist/services/spec-service.js.map +1 -1
- package/dist/services/upgrade-service.d.ts +15 -1
- package/dist/services/upgrade-service.d.ts.map +1 -1
- package/dist/services/upgrade-service.js +105 -14
- package/dist/services/upgrade-service.js.map +1 -1
- package/dist/templates/rules/shared/capability-map.md.hbs +2 -2
- package/lib/host-packages/adapter-registry.json +5 -5
- package/lib/host-packages/capability-map.json +89 -29
- package/lib/host-packages/claude/.claude-plugin/marketplace.json +2 -2
- package/lib/host-packages/claude/openplanr/.claude-plugin/plugin.json +1 -1
- package/lib/host-packages/claude/openplanr/.openplanr-content.json +69 -37
- package/lib/host-packages/claude/openplanr/CONNECTORS.md +62 -0
- package/lib/host-packages/claude/openplanr/README.md +1 -1
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-share.mjs +1 -1
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-shared-protocol-contracts-31a760fc.mjs +259 -36
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/notices/THIRD_PARTY_NOTICES.txt +54 -54
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/artifact/lib/artifact/ui/studio-shell.css +1 -1
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/03-protocol-contracts.js +259 -36
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources.json +4 -4
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/package.json +3 -3
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/02-react.js +43 -24
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/03-react-dom-client-fiber-foundations.js +279 -58
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/04-react-dom-client-reconciliation-hooks.js +50 -42
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/05-react-dom-client-render-phases.js +282 -146
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/06-react-dom-client-commit-effects.js +949 -316
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/07-react-dom-client-work-loop-scheduling.js +143 -87
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/08-react-dom-client-dom-events-properties-hydration.js +930 -183
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/09-react-dom-client-public-roots.js +17 -15
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/14-interface-primitives.js +375 -191
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/15-interface-primitives.js +140 -105
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources.json +23 -23
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/protocol/package.json +4 -4
- package/lib/host-packages/claude/openplanr/runtime/plan/scripts/design-protocol-contracts.mjs +259 -36
- package/lib/host-packages/claude/openplanr/runtime/plan/scripts/runtime/packages/protocol/package.json +4 -4
- package/lib/host-packages/claude/openplanr/skills/connect/SKILL.md +60 -0
- package/lib/host-packages/claude/openplanr/skills/connect/references/connectors.md +62 -0
- package/lib/host-packages/claude/openplanr/skills/openplanr/SKILL.md +4 -0
- package/lib/host-packages/claude/openplanr/skills/plan/SKILL.md +4 -1
- package/lib/host-packages/claude/openplanr/skills/plan/scripts/planning-ids.mjs +49 -3
- package/lib/host-packages/claude/openplanr/skills/share/SKILL.md +87 -0
- package/lib/host-packages/claude/openplanr/skills/share/references/connectors.md +62 -0
- package/lib/host-packages/claude/openplanr/skills/ship/SKILL.md +6 -3
- package/lib/host-packages/claude/openplanr/skills/ship/scripts/discover-verification.mjs +2 -1
- package/lib/host-packages/claude/openplanr/skills/sprint/SKILL.md +15 -6
- package/lib/host-packages/claude/openplanr/skills/sprint/references/connectors.md +62 -0
- package/lib/host-packages/claude/openplanr/skills/sprint/references/tracker-connections.md +9 -13
- package/lib/host-packages/claude/openplanr/skills/status/SKILL.md +14 -3
- package/lib/host-packages/claude/openplanr/skills/status/references/connectors.md +62 -0
- package/lib/host-packages/claude/openplanr/skills/status/references/tracker-connections.md +9 -13
- package/lib/host-packages/claude/openplanr/skills/sync/SKILL.md +25 -10
- package/lib/host-packages/claude/openplanr/skills/sync/references/connectors.md +62 -0
- package/lib/host-packages/claude/openplanr/skills/sync/references/tracker-connections.md +9 -13
- package/lib/host-packages/cursor/openplanr/.openplanr-content.json +68 -36
- package/lib/host-packages/cursor/openplanr/CONNECTORS.md +62 -0
- package/lib/host-packages/cursor/openplanr/manifest.json +4 -2
- package/lib/host-packages/cursor/openplanr/rules/planr-connect/references/connectors.md +62 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-connect.mdc +58 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-openplanr.mdc +4 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/planning-ids.mjs +49 -3
- package/lib/host-packages/cursor/openplanr/rules/planr-plan.mdc +4 -1
- package/lib/host-packages/cursor/openplanr/rules/planr-share/references/connectors.md +62 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-share.mdc +85 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-ship/scripts/discover-verification.mjs +2 -1
- package/lib/host-packages/cursor/openplanr/rules/planr-ship.mdc +6 -3
- package/lib/host-packages/cursor/openplanr/rules/planr-sprint/references/connectors.md +62 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-sprint/references/tracker-connections.md +9 -13
- package/lib/host-packages/cursor/openplanr/rules/planr-sprint.mdc +15 -6
- package/lib/host-packages/cursor/openplanr/rules/planr-status/references/connectors.md +62 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-status/references/tracker-connections.md +9 -13
- package/lib/host-packages/cursor/openplanr/rules/planr-status.mdc +14 -3
- package/lib/host-packages/cursor/openplanr/rules/planr-sync/references/connectors.md +62 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-sync/references/tracker-connections.md +9 -13
- package/lib/host-packages/cursor/openplanr/rules/planr-sync.mdc +25 -10
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-share.mjs +1 -1
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-shared-protocol-contracts-31a760fc.mjs +259 -36
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/notices/THIRD_PARTY_NOTICES.txt +54 -54
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/artifact/lib/artifact/ui/studio-shell.css +1 -1
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/03-protocol-contracts.js +259 -36
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources.json +4 -4
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/package.json +3 -3
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/02-react.js +43 -24
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/03-react-dom-client-fiber-foundations.js +279 -58
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/04-react-dom-client-reconciliation-hooks.js +50 -42
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/05-react-dom-client-render-phases.js +282 -146
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/06-react-dom-client-commit-effects.js +949 -316
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/07-react-dom-client-work-loop-scheduling.js +143 -87
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/08-react-dom-client-dom-events-properties-hydration.js +930 -183
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/09-react-dom-client-public-roots.js +17 -15
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/14-interface-primitives.js +375 -191
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/15-interface-primitives.js +140 -105
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources.json +23 -23
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/protocol/package.json +4 -4
- package/lib/host-packages/cursor/openplanr/runtime/plan/scripts/design-protocol-contracts.mjs +259 -36
- package/lib/host-packages/cursor/openplanr/runtime/plan/scripts/runtime/packages/protocol/package.json +4 -4
- package/lib/host-packages/openai/.claude-plugin/marketplace.json +2 -2
- package/lib/host-packages/openai/openplanr/.codex-plugin/plugin.json +1 -1
- package/lib/host-packages/openai/openplanr/.openplanr-content.json +87 -39
- package/lib/host-packages/openai/openplanr/CONNECTORS.md +62 -0
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-share.mjs +1 -1
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-shared-protocol-contracts-31a760fc.mjs +259 -36
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/notices/THIRD_PARTY_NOTICES.txt +54 -54
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/artifact/lib/artifact/ui/studio-shell.css +1 -1
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/03-protocol-contracts.js +259 -36
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources.json +4 -4
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/package.json +3 -3
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/02-react.js +43 -24
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/03-react-dom-client-fiber-foundations.js +279 -58
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/04-react-dom-client-reconciliation-hooks.js +50 -42
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/05-react-dom-client-render-phases.js +282 -146
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/06-react-dom-client-commit-effects.js +949 -316
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/07-react-dom-client-work-loop-scheduling.js +143 -87
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/08-react-dom-client-dom-events-properties-hydration.js +930 -183
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/09-react-dom-client-public-roots.js +17 -15
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/14-interface-primitives.js +375 -191
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/15-interface-primitives.js +140 -105
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources.json +23 -23
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/protocol/package.json +4 -4
- package/lib/host-packages/openai/openplanr/runtime/plan/scripts/design-protocol-contracts.mjs +259 -36
- package/lib/host-packages/openai/openplanr/runtime/plan/scripts/runtime/packages/protocol/package.json +4 -4
- package/lib/host-packages/openai/openplanr/skills/connect/SKILL.md +59 -0
- package/lib/host-packages/openai/openplanr/skills/connect/agents/openai.yaml +6 -0
- package/lib/host-packages/openai/openplanr/skills/connect/openplanr.skill.json +37 -0
- package/lib/host-packages/openai/openplanr/skills/connect/references/connectors.md +62 -0
- package/lib/host-packages/openai/openplanr/skills/openplanr/SKILL.md +4 -0
- package/lib/host-packages/openai/openplanr/skills/plan/SKILL.md +4 -1
- package/lib/host-packages/openai/openplanr/skills/plan/scripts/planning-ids.mjs +49 -3
- package/lib/host-packages/openai/openplanr/skills/share/SKILL.md +86 -0
- package/lib/host-packages/openai/openplanr/skills/share/agents/openai.yaml +6 -0
- package/lib/host-packages/openai/openplanr/skills/share/openplanr.skill.json +37 -0
- package/lib/host-packages/openai/openplanr/skills/share/references/connectors.md +62 -0
- package/lib/host-packages/openai/openplanr/skills/ship/SKILL.md +6 -3
- package/lib/host-packages/openai/openplanr/skills/ship/scripts/discover-verification.mjs +2 -1
- package/lib/host-packages/openai/openplanr/skills/sprint/SKILL.md +15 -6
- package/lib/host-packages/openai/openplanr/skills/sprint/openplanr.skill.json +11 -0
- package/lib/host-packages/openai/openplanr/skills/sprint/references/connectors.md +62 -0
- package/lib/host-packages/openai/openplanr/skills/sprint/references/tracker-connections.md +9 -13
- package/lib/host-packages/openai/openplanr/skills/status/SKILL.md +14 -3
- package/lib/host-packages/openai/openplanr/skills/status/openplanr.skill.json +11 -0
- package/lib/host-packages/openai/openplanr/skills/status/references/connectors.md +62 -0
- package/lib/host-packages/openai/openplanr/skills/status/references/tracker-connections.md +9 -13
- package/lib/host-packages/openai/openplanr/skills/sync/SKILL.md +25 -10
- package/lib/host-packages/openai/openplanr/skills/sync/openplanr.skill.json +11 -0
- package/lib/host-packages/openai/openplanr/skills/sync/references/connectors.md +62 -0
- package/lib/host-packages/openai/openplanr/skills/sync/references/tracker-connections.md +9 -13
- package/lib/json-schema.mjs +313 -36
- package/lib/schemas/v1.0.0/spec.schema.json +120 -0
- package/lib/schemas/v1.0.0/story.schema.json +95 -0
- package/lib/schemas/v1.0.0/task.schema.json +171 -0
- package/lib/schemas/v1.7.0/spec.schema.json +117 -0
- package/lib/schemas/v1.7.0/story.schema.json +107 -0
- package/lib/schemas/v1.7.0/task.schema.json +217 -0
- package/package.json +31 -31
- package/dist/dashboard/assets/index-n08LJ6bK.js +0 -557
- package/dist/dashboard/assets/index-n08LJ6bK.js.map +0 -1
- package/dist/services/audit-log-service.d.ts +0 -47
- package/dist/services/audit-log-service.d.ts.map +0 -1
- package/dist/services/audit-log-service.js +0 -211
- package/dist/services/audit-log-service.js.map +0 -1
- package/dist/services/delta-apply-service.d.ts +0 -16
- package/dist/services/delta-apply-service.d.ts.map +0 -1
- package/dist/services/delta-apply-service.js +0 -74
- package/dist/services/delta-apply-service.js.map +0 -1
- package/dist/services/evidence-verifier.d.ts +0 -71
- package/dist/services/evidence-verifier.d.ts.map +0 -1
- package/dist/services/evidence-verifier.js +0 -174
- package/dist/services/evidence-verifier.js.map +0 -1
- package/dist/services/revise-apply-service.d.ts +0 -55
- package/dist/services/revise-apply-service.d.ts.map +0 -1
- package/dist/services/revise-apply-service.js +0 -265
- package/dist/services/revise-apply-service.js.map +0 -1
- package/dist/services/revise-cache-service.d.ts +0 -46
- package/dist/services/revise-cache-service.d.ts.map +0 -1
- package/dist/services/revise-cache-service.js +0 -89
- package/dist/services/revise-cache-service.js.map +0 -1
- package/dist/services/revise-plan-service.d.ts +0 -38
- package/dist/services/revise-plan-service.d.ts.map +0 -1
- package/dist/services/revise-plan-service.js +0 -153
- package/dist/services/revise-plan-service.js.map +0 -1
- /package/lib/host-packages/claude/openplanr/runtime/design/scripts/{design-runtime-support-336900df0d39.mjs → design-runtime-support-e34c388a8e59.mjs} +0 -0
- /package/lib/host-packages/cursor/openplanr/runtime/design/scripts/{design-runtime-support-336900df0d39.mjs → design-runtime-support-e34c388a8e59.mjs} +0 -0
- /package/lib/host-packages/openai/openplanr/runtime/design/scripts/{design-runtime-support-336900df0d39.mjs → design-runtime-support-e34c388a8e59.mjs} +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
import {
|
|
4
|
-
import { resolve } from 'node:path';
|
|
3
|
+
import { open, readdir, readFile, rename, stat, unlink, writeFile } from 'node:fs/promises';
|
|
4
|
+
import { dirname, join, resolve } from 'node:path';
|
|
5
5
|
|
|
6
6
|
const KINDS = Object.freeze(['SPEC', 'US', 'T']);
|
|
7
7
|
const EMPTY = Object.freeze({ SPEC: 1, US: 1, T: 1 });
|
|
@@ -71,9 +71,55 @@ function parseArgs(argv) {
|
|
|
71
71
|
return options;
|
|
72
72
|
}
|
|
73
73
|
|
|
74
|
+
const shellQuote = (value) => (/^[\w./-]+$/u.test(value) ? value : `'${value.replaceAll("'", "'\\''")}'`);
|
|
75
|
+
|
|
76
|
+
/** Returns the nearest `.planr/config.json` at or above `directory` and the specs folder it configures. */
|
|
77
|
+
async function configuredRoot(directory) {
|
|
78
|
+
for (let current = directory; ; current = dirname(current)) {
|
|
79
|
+
const configPath = join(current, '.planr', 'config.json');
|
|
80
|
+
const raw = await readFile(configPath, 'utf8').catch((error) => {
|
|
81
|
+
if (error.code === 'ENOENT' || error.code === 'ENOTDIR') return null;
|
|
82
|
+
throw error;
|
|
83
|
+
});
|
|
84
|
+
if (raw !== null) {
|
|
85
|
+
let agile;
|
|
86
|
+
try {
|
|
87
|
+
agile = JSON.parse(raw).outputPaths?.agile ?? '.planr';
|
|
88
|
+
} catch (error) {
|
|
89
|
+
throw new Error(`Project config ${configPath} is not valid JSON: ${error.message}`);
|
|
90
|
+
}
|
|
91
|
+
if (typeof agile !== 'string') throw new Error(`Project config ${configPath} has a non-string outputPaths.agile.`);
|
|
92
|
+
return { configPath, expected: resolve(current, agile, 'specs') };
|
|
93
|
+
}
|
|
94
|
+
if (dirname(current) === current) return null;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/** Accepts only an existing directory that the nearest project config names as its planning folder. */
|
|
99
|
+
async function assertPlanningRoot(planningRoot) {
|
|
100
|
+
const project = await configuredRoot(planningRoot);
|
|
101
|
+
if (!project) {
|
|
102
|
+
throw new Error(`Planning root ${planningRoot} is not inside an OpenPlanr project: no .planr/config.json in it or any parent directory.`);
|
|
103
|
+
}
|
|
104
|
+
const { configPath, expected } = project;
|
|
105
|
+
if (planningRoot !== expected) {
|
|
106
|
+
throw new Error(`Planning root ${planningRoot} is not the planning folder configured by ${configPath}, which expects ${expected}.`);
|
|
107
|
+
}
|
|
108
|
+
const status = await stat(planningRoot).catch((error) => {
|
|
109
|
+
if (error.code === 'ENOENT') return null;
|
|
110
|
+
throw error;
|
|
111
|
+
});
|
|
112
|
+
if (!status) {
|
|
113
|
+
throw new Error(
|
|
114
|
+
`Planning root ${planningRoot} does not exist; ${configPath} expects it. Create it with \`mkdir -p ${shellQuote(planningRoot)}\`, or fix outputPaths.agile in ${configPath}.`,
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
if (!status.isDirectory()) throw new Error(`Planning root ${planningRoot} is not a directory; ${configPath} expects a directory there.`);
|
|
118
|
+
}
|
|
119
|
+
|
|
74
120
|
async function reserve({ root, preview, counts }) {
|
|
75
121
|
const planningRoot = resolve(root);
|
|
76
|
-
|
|
122
|
+
await assertPlanningRoot(planningRoot);
|
|
77
123
|
const run = async () => {
|
|
78
124
|
const sequence = await currentSequence(planningRoot);
|
|
79
125
|
const ids = Object.fromEntries(
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: share
|
|
3
|
+
description: Share a status report, sprint note or release notes with the team as a chat message draft that the user approves and sends. Use when the user asks to post a planning update to chat.
|
|
4
|
+
argument-hint: "[status|sprint|release] [destination]"
|
|
5
|
+
license: MIT
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# OpenPlanr Share
|
|
9
|
+
|
|
10
|
+
Turn the current planning state into a team update and hand it to ~~chat as a
|
|
11
|
+
draft that the user reviews and sends. Perform the work in this session. Nothing
|
|
12
|
+
leaves the session until the user approves the exact text and destination.
|
|
13
|
+
|
|
14
|
+
## Choose the update
|
|
15
|
+
|
|
16
|
+
The first argument picks the source; default to `status`.
|
|
17
|
+
|
|
18
|
+
- `status`: the delivery report `planr-status` gives. Read the planning artifacts
|
|
19
|
+
directly, or use `openplanr status --json` when it is available.
|
|
20
|
+
- `sprint`: the current sprint under `.planr/sprints/`: the one in progress, else
|
|
21
|
+
the most recent. Use its goal, selected items, progress and leftovers.
|
|
22
|
+
- `release`: the newest release notes or changelog entry, or the version the
|
|
23
|
+
user names.
|
|
24
|
+
|
|
25
|
+
When the working directory has no OpenPlanr planning files for the chosen source,
|
|
26
|
+
say so and ask which project to use, or stop. Never build an update from guesses.
|
|
27
|
+
|
|
28
|
+
The second argument is the destination: a channel or person. When it names a chat
|
|
29
|
+
product from [connectors](references/connectors.md) instead, use that product's
|
|
30
|
+
connection and still ask for the channel or person. When it is missing, ask for it.
|
|
31
|
+
Never pick a destination yourself.
|
|
32
|
+
|
|
33
|
+
## Write it
|
|
34
|
+
|
|
35
|
+
Lead with the outcome in one line, then at most ten short lines: what finished,
|
|
36
|
+
what is in progress, what is blocked and who can unblock it, and what comes next.
|
|
37
|
+
Use counts and dates, link pull requests or issues when their URLs are known, and
|
|
38
|
+
leave out local file paths, backlog IDs and internal detail the team cannot act
|
|
39
|
+
on. Never include credentials or the contents of secret files.
|
|
40
|
+
|
|
41
|
+
Format the text for where it goes, as listed under "Message format" in
|
|
42
|
+
[connectors](references/connectors.md): when drafting through a connector, use the
|
|
43
|
+
connector's input format, and follow the connector tool's own description when it
|
|
44
|
+
states one; for text the user pastes, use the paste format. Use plain text when no
|
|
45
|
+
format is listed.
|
|
46
|
+
|
|
47
|
+
## Preview, then ask
|
|
48
|
+
|
|
49
|
+
Show the complete text exactly as it will appear, the destination, and what will
|
|
50
|
+
happen: "create a draft in <destination>; nothing is sent". Ask through the host's
|
|
51
|
+
structured question surface, or one short chat question when there is none:
|
|
52
|
+
create the draft, edit the text, or cancel. Create nothing without a clear yes.
|
|
53
|
+
After an edit, preview again.
|
|
54
|
+
|
|
55
|
+
## If ~~chat is connected
|
|
56
|
+
|
|
57
|
+
A category is connected when the host exposes a tool for one of its products,
|
|
58
|
+
loaded or deferred. On approval, use that connection to create a message draft
|
|
59
|
+
in the destination, then report where the draft is and that the user sends it
|
|
60
|
+
from the chat app.
|
|
61
|
+
|
|
62
|
+
- Send directly only when the user explicitly asks to send and the connection
|
|
63
|
+
can send; confirm the destination once more first.
|
|
64
|
+
- When the connection cannot create drafts, say so and offer to send on an
|
|
65
|
+
explicit request, or print the text instead.
|
|
66
|
+
- When the connection fails, for example because a workspace admin has not
|
|
67
|
+
approved the app, report the error, print the text ready to paste, and stop.
|
|
68
|
+
|
|
69
|
+
## With nothing connected
|
|
70
|
+
|
|
71
|
+
Print the update ready to paste and the one connect step for the current host
|
|
72
|
+
from [connectors](references/connectors.md), and suggest `/planr:connect`. Make no
|
|
73
|
+
remote call and do not retry; the user runs this skill again once connected.
|
|
74
|
+
|
|
75
|
+
## Rules
|
|
76
|
+
|
|
77
|
+
- Never ask for, read, store or print a token, key or password, and never edit
|
|
78
|
+
host configuration.
|
|
79
|
+
- One destination per run.
|
|
80
|
+
- Never change planning files.
|
|
81
|
+
|
|
82
|
+
## Return
|
|
83
|
+
|
|
84
|
+
Lead with the result: draft created (where), sent (where, on explicit request),
|
|
85
|
+
printed for pasting, or cancelled. Name the source used and any section that was
|
|
86
|
+
empty or unavailable.
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
interface:
|
|
2
|
+
display_name: "OpenPlanr Share"
|
|
3
|
+
short_description: "Share a status report, sprint note or release notes with the…"
|
|
4
|
+
default_prompt: "Use $planr:share to share a status report, sprint note or release notes with the team as a chat message draft that the user approves and sends. Use when the user asks to post a planning update to chat."
|
|
5
|
+
policy:
|
|
6
|
+
allow_implicit_invocation: false
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"kind": "openplanr-skill-package",
|
|
3
|
+
"schemaVersion": "1.0.0",
|
|
4
|
+
"protocolVersion": "1.8.0",
|
|
5
|
+
"skillId": "planr-share",
|
|
6
|
+
"skillVersion": "1.0.0",
|
|
7
|
+
"entrypoint": "SKILL.md",
|
|
8
|
+
"hosts": [
|
|
9
|
+
"claude-code",
|
|
10
|
+
"codex",
|
|
11
|
+
"chatgpt",
|
|
12
|
+
"cursor"
|
|
13
|
+
],
|
|
14
|
+
"execution": "host-agent",
|
|
15
|
+
"resources": [
|
|
16
|
+
{
|
|
17
|
+
"path": "agents/openai.yaml",
|
|
18
|
+
"kind": "agent-metadata",
|
|
19
|
+
"hosts": [
|
|
20
|
+
"codex",
|
|
21
|
+
"chatgpt"
|
|
22
|
+
],
|
|
23
|
+
"executable": false
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"path": "references/connectors.md",
|
|
27
|
+
"kind": "reference",
|
|
28
|
+
"hosts": [
|
|
29
|
+
"claude-code",
|
|
30
|
+
"codex",
|
|
31
|
+
"chatgpt",
|
|
32
|
+
"cursor"
|
|
33
|
+
],
|
|
34
|
+
"executable": false
|
|
35
|
+
}
|
|
36
|
+
]
|
|
37
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# Connectors
|
|
2
|
+
|
|
3
|
+
OpenPlanr skills name a kind of service, such as `~~chat`, instead of a product. Connect
|
|
4
|
+
the product your team uses through your host: the vendor publishes the connector, and
|
|
5
|
+
you sign in through the host. OpenPlanr bundles no connectors; they and their credentials
|
|
6
|
+
live in your host. Two optional features need a token: Linear sync (`openplanr linear`) and
|
|
7
|
+
company sign-in (`openplanr company login`). Only when you use them does OpenPlanr store a
|
|
8
|
+
token, in your OS keychain, or in an encrypted file at `~/.planr/credentials.enc` if you set
|
|
9
|
+
`PLANR_CREDENTIAL_FILE_PASSPHRASE`. Tokens are sent only to Linear or to the company server
|
|
10
|
+
you sign in to.
|
|
11
|
+
`openplanr company logout` removes company tokens.
|
|
12
|
+
Every skill also works with nothing connected and reports any remote step it skipped.
|
|
13
|
+
|
|
14
|
+
| Category | Placeholder | Products |
|
|
15
|
+
| --- | --- | --- |
|
|
16
|
+
| Chat | `~~chat` | Slack, Microsoft Teams |
|
|
17
|
+
| Project tracker | `~~project tracker` | Linear, GitHub Issues, Jira, Asana |
|
|
18
|
+
| Source control | `~~source control` | GitHub, GitLab, Bitbucket |
|
|
19
|
+
|
|
20
|
+
Never paste a token into a chat, file or command for OpenPlanr. After you connect a
|
|
21
|
+
service, start a new request so the host loads its tools.
|
|
22
|
+
|
|
23
|
+
## Chat (`~~chat`)
|
|
24
|
+
|
|
25
|
+
Share a status report, sprint note or release notes as a message draft that you review and send yourself.
|
|
26
|
+
|
|
27
|
+
| Product | Use | Claude Code | Codex | Cursor |
|
|
28
|
+
| --- | --- | --- | --- | --- |
|
|
29
|
+
| Slack | Message drafts | Run `/plugin install slack@claude-plugins-official`, then sign in to Slack from `/mcp`. A workspace admin may need to approve the app. | Install Slack from `/plugins` and sign in when asked. A workspace admin may need to approve the app. | Run `/add-plugin slack`, or install Slack from Customize, then sign in when asked. A workspace admin may need to approve the app. |
|
|
30
|
+
|
|
31
|
+
Message format for Slack, drafting through the connector: standard Markdown, which the connector converts on send ([Slack's messaging guidance](https://github.com/slackapi/slack-mcp-plugin/blob/main/skills/slack-messaging/SKILL.md)): `**bold**`, `_italic_`, `[link text](https://example.com)`, `-` lists, `>` quotes. Do not use mrkdwn's `*bold*` or `<url|text>` here.
|
|
32
|
+
|
|
33
|
+
Message format for Slack, text to paste: Slack mrkdwn ([formatting](https://docs.slack.dev/messaging/formatting-message-text)): `*bold*`, `_italic_`, `<https://example.com|link text>`, lines starting with `•` or `-` for lists, `>` for quotes; no headings or tables; escape `&`, `<` and `>` as `&`, `<` and `>`.
|
|
34
|
+
|
|
35
|
+
Also works with: [Microsoft Teams](https://learn.microsoft.com/en-us/microsoft-copilot-studio/mcp-teams-tools) (read for context). Add the vendor's connector in your host the same way.
|
|
36
|
+
|
|
37
|
+
Verified: [Slack](https://docs.slack.dev/ai/slack-mcp-server) on 2026-10-09, [Microsoft Teams](https://learn.microsoft.com/en-us/microsoft-copilot-studio/mcp-teams-tools) on 2026-10-09.
|
|
38
|
+
|
|
39
|
+
## Project tracker (`~~project tracker`)
|
|
40
|
+
|
|
41
|
+
Push planning status to linked issues after you approve each change, and read issue state back.
|
|
42
|
+
|
|
43
|
+
| Product | Use | Claude Code | Codex | Cursor |
|
|
44
|
+
| --- | --- | --- | --- | --- |
|
|
45
|
+
| Linear | OpenPlanr syncs with it | Run `/plugin install linear@claude-plugins-official`, then sign in to Linear from `/mcp`. | Install Linear from `/plugins` and sign in when asked. | Run `/add-plugin linear`, or install Linear from Customize, then sign in when asked. |
|
|
46
|
+
| GitHub Issues | OpenPlanr syncs with it | Install the GitHub CLI from cli.github.com and run `gh auth login`. | Install GitHub from `/plugins` and sign in when asked, or install the GitHub CLI and run `gh auth login`. | Install the GitHub CLI from cli.github.com and run `gh auth login`. |
|
|
47
|
+
|
|
48
|
+
Also works with: [Jira](https://support.atlassian.com/atlassian-ai-gateway/docs/get-started-with-the-atlassian-remote-mcp-server/) (read for context), [Asana](https://developers.asana.com/docs/using-asanas-mcp-server) (read for context). Add the vendor's connector in your host the same way.
|
|
49
|
+
|
|
50
|
+
Verified: [Linear](https://linear.app/docs/mcp) on 2026-10-09, [GitHub Issues](https://cli.github.com/manual/gh_auth_login) on 2026-10-09, [Jira](https://support.atlassian.com/atlassian-ai-gateway/docs/get-started-with-the-atlassian-remote-mcp-server/) on 2026-10-09, [Asana](https://developers.asana.com/docs/using-asanas-mcp-server) on 2026-10-09.
|
|
51
|
+
|
|
52
|
+
## Source control (`~~source control`)
|
|
53
|
+
|
|
54
|
+
Read pull request and branch state for status reports and sprint reviews.
|
|
55
|
+
|
|
56
|
+
| Product | Use | Claude Code | Codex | Cursor |
|
|
57
|
+
| --- | --- | --- | --- | --- |
|
|
58
|
+
| GitHub | Read for context | Install the GitHub CLI from cli.github.com and run `gh auth login`. | Install GitHub from `/plugins` and sign in when asked, or install the GitHub CLI and run `gh auth login`. | Install the GitHub CLI from cli.github.com and run `gh auth login`. |
|
|
59
|
+
|
|
60
|
+
Also works with: [GitLab](https://docs.gitlab.com/user/gitlab_duo/model_context_protocol/mcp_server/) (read for context), [Bitbucket](https://support.atlassian.com/atlassian-ai-gateway/docs/get-started-with-the-atlassian-remote-mcp-server/) (read for context). Add the vendor's connector in your host the same way.
|
|
61
|
+
|
|
62
|
+
Verified: [GitHub](https://cli.github.com/manual/gh_auth_login) on 2026-10-09, [GitLab](https://docs.gitlab.com/user/gitlab_duo/model_context_protocol/mcp_server/) on 2026-10-09, [Bitbucket](https://support.atlassian.com/atlassian-ai-gateway/docs/get-started-with-the-atlassian-remote-mcp-server/) on 2026-10-09.
|
|
@@ -62,13 +62,16 @@ Discover checks in this order:
|
|
|
62
62
|
4. applicable CI and pre-commit configuration.
|
|
63
63
|
|
|
64
64
|
The packaged read-only [verification discovery helper](scripts/discover-verification.mjs)
|
|
65
|
-
may list candidates. Resolve it relative to this `SKILL.md
|
|
66
|
-
root
|
|
65
|
+
may list candidates. Resolve it relative to this `SKILL.md` and run
|
|
66
|
+
`node <helper> --project <repository-root> --task <task-path>`; omit `--task` for a
|
|
67
|
+
direct request. It never executes checks or writes files. If it is unavailable,
|
|
67
68
|
inspect those four sources directly. Missing commands are diagnostics, not a
|
|
68
69
|
reason to invent or skip all verification.
|
|
69
70
|
|
|
70
71
|
Run the strongest applicable focused checks while working, then the relevant
|
|
71
|
-
regression checks.
|
|
72
|
+
regression checks. Run each check on its own or under `set -o pipefail`, and judge
|
|
73
|
+
it by its own exit code; to shorten output, write it to a log and read the tail.
|
|
74
|
+
Fix failures caused by the change and rerun affected checks.
|
|
72
75
|
Read [the result contract](references/result-contract.md) before reporting.
|
|
73
76
|
|
|
74
77
|
Do not write progress into an approved design package. The studio derives
|
|
@@ -5,6 +5,7 @@ import { resolve } from 'node:path';
|
|
|
5
5
|
|
|
6
6
|
const COMMAND = /^(?:npm|npx|pnpm|yarn|bun|node|deno|cargo|go|make|just|pytest|python(?:3)?\s+-m|dotnet|mvn|gradle|\.\/gradlew)\b/u;
|
|
7
7
|
const PRIORITY = Object.freeze(['test', 'test:unit', 'test:integration', 'typecheck', 'check', 'lint', 'build']);
|
|
8
|
+
const USAGE = 'Usage: node discover-verification.mjs --project <repository-root> [--task <task-path>]';
|
|
8
9
|
const read = (path) => readFileSync(path, 'utf8').replace(/\r\n/gu, '\n');
|
|
9
10
|
|
|
10
11
|
function commands(markdown) {
|
|
@@ -57,7 +58,7 @@ function parseArgs(argv) {
|
|
|
57
58
|
for (let index = 0; index < argv.length; index += 1) {
|
|
58
59
|
if (argv[index] === '--project') options.project = argv[++index];
|
|
59
60
|
else if (argv[index] === '--task') options.task = argv[++index];
|
|
60
|
-
else throw new Error(`Unknown argument: ${argv[index]}`);
|
|
61
|
+
else throw new Error(`Unknown argument: ${argv[index]}\n${USAGE}`);
|
|
61
62
|
}
|
|
62
63
|
return options;
|
|
63
64
|
}
|
|
@@ -36,7 +36,7 @@ capability; it never blocks the run. Name every degraded input in `Issues`.
|
|
|
36
36
|
| Capacity (engineers × working days) | Fit the list and name the overflow | Ask once; default 1 engineer × 10 days, stated in the return |
|
|
37
37
|
| Previous sprint or refinement note (`.planr/sprints/SPRINT-NNN/refinement.json`) | Carry `leftovers`; `openplanr sprint diff` is possible | First run, no diff |
|
|
38
38
|
| Last Operate cycle | Rank its unfinished actions alongside | Skipped silently |
|
|
39
|
-
|
|
|
39
|
+
| ~~project tracker or ~~source control ([connectors](references/connectors.md)) | Update linked issues on approval, read PR state | Local files only; report the external step as not run and name the category to add |
|
|
40
40
|
|
|
41
41
|
## Step 0: Frame the run
|
|
42
42
|
|
|
@@ -135,11 +135,20 @@ openplanr sprint apply SPRINT-NNN --dry-run # show the status and prior
|
|
|
135
135
|
openplanr sprint apply SPRINT-NNN --yes --commit # one commit: chore(planr): refine backlog for SPRINT-NNN
|
|
136
136
|
```
|
|
137
137
|
|
|
138
|
-
Then update the issue linked to each changed
|
|
139
|
-
|
|
140
|
-
[tracker
|
|
141
|
-
|
|
142
|
-
the
|
|
138
|
+
Then, if ~~project tracker is connected, update the issue linked to each changed
|
|
139
|
+
item through the host's connection, with the status mapping in the
|
|
140
|
+
[tracker sync reference](references/tracker-connections.md). Before any remote write,
|
|
141
|
+
list every issue change: each issue to create, update, close or reopen, with its
|
|
142
|
+
title and the status it moves to. Write only when the request explicitly asked for
|
|
143
|
+
that push or the user approves the list. Afterwards, report each item that was not
|
|
144
|
+
updated and why, and name the category and product used.
|
|
145
|
+
|
|
146
|
+
With nothing connected, the local apply is the whole step: report the tracker
|
|
147
|
+
update as not run and give the current host's step from
|
|
148
|
+
[connectors](references/connectors.md).
|
|
149
|
+
|
|
150
|
+
When the CLI is unavailable, apply the same status changes with the repository's
|
|
151
|
+
own vocabulary and commit them with the same message.
|
|
143
152
|
|
|
144
153
|
Close a finished sprint with `openplanr sprint close SPRINT-NNN`; it records the
|
|
145
154
|
leftovers the next run carries.
|
|
@@ -44,6 +44,17 @@
|
|
|
44
44
|
],
|
|
45
45
|
"executable": false
|
|
46
46
|
},
|
|
47
|
+
{
|
|
48
|
+
"path": "references/connectors.md",
|
|
49
|
+
"kind": "reference",
|
|
50
|
+
"hosts": [
|
|
51
|
+
"claude-code",
|
|
52
|
+
"codex",
|
|
53
|
+
"chatgpt",
|
|
54
|
+
"cursor"
|
|
55
|
+
],
|
|
56
|
+
"executable": false
|
|
57
|
+
},
|
|
47
58
|
{
|
|
48
59
|
"path": "references/tracker-connections.md",
|
|
49
60
|
"kind": "reference",
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# Connectors
|
|
2
|
+
|
|
3
|
+
OpenPlanr skills name a kind of service, such as `~~chat`, instead of a product. Connect
|
|
4
|
+
the product your team uses through your host: the vendor publishes the connector, and
|
|
5
|
+
you sign in through the host. OpenPlanr bundles no connectors; they and their credentials
|
|
6
|
+
live in your host. Two optional features need a token: Linear sync (`openplanr linear`) and
|
|
7
|
+
company sign-in (`openplanr company login`). Only when you use them does OpenPlanr store a
|
|
8
|
+
token, in your OS keychain, or in an encrypted file at `~/.planr/credentials.enc` if you set
|
|
9
|
+
`PLANR_CREDENTIAL_FILE_PASSPHRASE`. Tokens are sent only to Linear or to the company server
|
|
10
|
+
you sign in to.
|
|
11
|
+
`openplanr company logout` removes company tokens.
|
|
12
|
+
Every skill also works with nothing connected and reports any remote step it skipped.
|
|
13
|
+
|
|
14
|
+
| Category | Placeholder | Products |
|
|
15
|
+
| --- | --- | --- |
|
|
16
|
+
| Chat | `~~chat` | Slack, Microsoft Teams |
|
|
17
|
+
| Project tracker | `~~project tracker` | Linear, GitHub Issues, Jira, Asana |
|
|
18
|
+
| Source control | `~~source control` | GitHub, GitLab, Bitbucket |
|
|
19
|
+
|
|
20
|
+
Never paste a token into a chat, file or command for OpenPlanr. After you connect a
|
|
21
|
+
service, start a new request so the host loads its tools.
|
|
22
|
+
|
|
23
|
+
## Chat (`~~chat`)
|
|
24
|
+
|
|
25
|
+
Share a status report, sprint note or release notes as a message draft that you review and send yourself.
|
|
26
|
+
|
|
27
|
+
| Product | Use | Claude Code | Codex | Cursor |
|
|
28
|
+
| --- | --- | --- | --- | --- |
|
|
29
|
+
| Slack | Message drafts | Run `/plugin install slack@claude-plugins-official`, then sign in to Slack from `/mcp`. A workspace admin may need to approve the app. | Install Slack from `/plugins` and sign in when asked. A workspace admin may need to approve the app. | Run `/add-plugin slack`, or install Slack from Customize, then sign in when asked. A workspace admin may need to approve the app. |
|
|
30
|
+
|
|
31
|
+
Message format for Slack, drafting through the connector: standard Markdown, which the connector converts on send ([Slack's messaging guidance](https://github.com/slackapi/slack-mcp-plugin/blob/main/skills/slack-messaging/SKILL.md)): `**bold**`, `_italic_`, `[link text](https://example.com)`, `-` lists, `>` quotes. Do not use mrkdwn's `*bold*` or `<url|text>` here.
|
|
32
|
+
|
|
33
|
+
Message format for Slack, text to paste: Slack mrkdwn ([formatting](https://docs.slack.dev/messaging/formatting-message-text)): `*bold*`, `_italic_`, `<https://example.com|link text>`, lines starting with `•` or `-` for lists, `>` for quotes; no headings or tables; escape `&`, `<` and `>` as `&`, `<` and `>`.
|
|
34
|
+
|
|
35
|
+
Also works with: [Microsoft Teams](https://learn.microsoft.com/en-us/microsoft-copilot-studio/mcp-teams-tools) (read for context). Add the vendor's connector in your host the same way.
|
|
36
|
+
|
|
37
|
+
Verified: [Slack](https://docs.slack.dev/ai/slack-mcp-server) on 2026-10-09, [Microsoft Teams](https://learn.microsoft.com/en-us/microsoft-copilot-studio/mcp-teams-tools) on 2026-10-09.
|
|
38
|
+
|
|
39
|
+
## Project tracker (`~~project tracker`)
|
|
40
|
+
|
|
41
|
+
Push planning status to linked issues after you approve each change, and read issue state back.
|
|
42
|
+
|
|
43
|
+
| Product | Use | Claude Code | Codex | Cursor |
|
|
44
|
+
| --- | --- | --- | --- | --- |
|
|
45
|
+
| Linear | OpenPlanr syncs with it | Run `/plugin install linear@claude-plugins-official`, then sign in to Linear from `/mcp`. | Install Linear from `/plugins` and sign in when asked. | Run `/add-plugin linear`, or install Linear from Customize, then sign in when asked. |
|
|
46
|
+
| GitHub Issues | OpenPlanr syncs with it | Install the GitHub CLI from cli.github.com and run `gh auth login`. | Install GitHub from `/plugins` and sign in when asked, or install the GitHub CLI and run `gh auth login`. | Install the GitHub CLI from cli.github.com and run `gh auth login`. |
|
|
47
|
+
|
|
48
|
+
Also works with: [Jira](https://support.atlassian.com/atlassian-ai-gateway/docs/get-started-with-the-atlassian-remote-mcp-server/) (read for context), [Asana](https://developers.asana.com/docs/using-asanas-mcp-server) (read for context). Add the vendor's connector in your host the same way.
|
|
49
|
+
|
|
50
|
+
Verified: [Linear](https://linear.app/docs/mcp) on 2026-10-09, [GitHub Issues](https://cli.github.com/manual/gh_auth_login) on 2026-10-09, [Jira](https://support.atlassian.com/atlassian-ai-gateway/docs/get-started-with-the-atlassian-remote-mcp-server/) on 2026-10-09, [Asana](https://developers.asana.com/docs/using-asanas-mcp-server) on 2026-10-09.
|
|
51
|
+
|
|
52
|
+
## Source control (`~~source control`)
|
|
53
|
+
|
|
54
|
+
Read pull request and branch state for status reports and sprint reviews.
|
|
55
|
+
|
|
56
|
+
| Product | Use | Claude Code | Codex | Cursor |
|
|
57
|
+
| --- | --- | --- | --- | --- |
|
|
58
|
+
| GitHub | Read for context | Install the GitHub CLI from cli.github.com and run `gh auth login`. | Install GitHub from `/plugins` and sign in when asked, or install the GitHub CLI and run `gh auth login`. | Install the GitHub CLI from cli.github.com and run `gh auth login`. |
|
|
59
|
+
|
|
60
|
+
Also works with: [GitLab](https://docs.gitlab.com/user/gitlab_duo/model_context_protocol/mcp_server/) (read for context), [Bitbucket](https://support.atlassian.com/atlassian-ai-gateway/docs/get-started-with-the-atlassian-remote-mcp-server/) (read for context). Add the vendor's connector in your host the same way.
|
|
61
|
+
|
|
62
|
+
Verified: [GitHub](https://cli.github.com/manual/gh_auth_login) on 2026-10-09, [GitLab](https://docs.gitlab.com/user/gitlab_duo/model_context_protocol/mcp_server/) on 2026-10-09, [Bitbucket](https://support.atlassian.com/atlassian-ai-gateway/docs/get-started-with-the-atlassian-remote-mcp-server/) on 2026-10-09.
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Tracker sync reference
|
|
2
2
|
|
|
3
|
-
These skills store and read no
|
|
4
|
-
connection the host already has; the planning files stay the source of
|
|
3
|
+
These skills store and read no tracker or source control credentials. Remote steps
|
|
4
|
+
run through a connection the host already has; the planning files stay the source of
|
|
5
|
+
truth. OpenPlanr syncs with the trackers marked "OpenPlanr syncs with it" in
|
|
6
|
+
[connectors](connectors.md), and reads other products for context only.
|
|
5
7
|
|
|
6
8
|
## Use the host's connection
|
|
7
9
|
|
|
@@ -14,16 +16,10 @@ command, URL or file.
|
|
|
14
16
|
|
|
15
17
|
## When a connection is missing
|
|
16
18
|
|
|
17
|
-
Finish the local work first. Then report the remote step as not run
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
| --- | --- | --- |
|
|
22
|
-
| Claude Code | Run `/plugin install linear@claude-plugins-official`, then sign in to Linear from `/mcp`. | Install the GitHub CLI (cli.github.com) and run `gh auth login`. |
|
|
23
|
-
| Codex | Run `codex mcp add linear --url https://mcp.linear.app/mcp`, then `codex mcp login linear`. | Install the GitHub plugin from `/plugins`, or run `gh auth login`. |
|
|
24
|
-
| Cursor | Add Linear from the Cursor Marketplace and sign in to Linear. | Install the GitHub CLI (cli.github.com) and run `gh auth login`. |
|
|
25
|
-
|
|
26
|
-
Ask the user to try again once connected; never retry the remote step on your own.
|
|
19
|
+
Finish the local work first. Then report the remote step as not run, naming the
|
|
20
|
+
category, and give the one connect step for the current host from
|
|
21
|
+
[connectors](connectors.md). Ask the user to try again once connected; never retry the
|
|
22
|
+
remote step on your own.
|
|
27
23
|
|
|
28
24
|
## Status mapping
|
|
29
25
|
|
|
@@ -11,9 +11,6 @@ planning artifacts, task statuses, dependency graph, current branch, and relevan
|
|
|
11
11
|
runtime markers directly. Use the optional deterministic `openplanr status --json`
|
|
12
12
|
utility when available, but do not require it or a semantic subprocess.
|
|
13
13
|
|
|
14
|
-
Add GitHub or Linear lookups only when the user requests live remote state, through
|
|
15
|
-
the host's connections as described in [tracker connections](references/tracker-connections.md).
|
|
16
|
-
Keep local results useful when a connection is unavailable, and name the one to add.
|
|
17
14
|
Report counts, ready and blocked work, dependency problems, and the most useful next
|
|
18
15
|
action. Do not repair artifacts, start Plan or Ship, or change lifecycle state.
|
|
19
16
|
|
|
@@ -21,6 +18,20 @@ When the OpenPlanr dashboard is running (`planr-dashboard`), the same delivery
|
|
|
21
18
|
state is browsable there: `#/overview` for the whole project, `#/detail/<id>`
|
|
22
19
|
for one feature. This is navigation only.
|
|
23
20
|
|
|
21
|
+
## With nothing connected
|
|
22
|
+
|
|
23
|
+
The report comes entirely from local planning files and git. When the user asks
|
|
24
|
+
for live remote state, report that step as not run, name the category it needs,
|
|
25
|
+
and give the current host's step from [connectors](references/connectors.md).
|
|
26
|
+
|
|
27
|
+
## If ~~project tracker or ~~source control is connected
|
|
28
|
+
|
|
29
|
+
Add remote lookups only when the user requests live remote state: issue state
|
|
30
|
+
from ~~project tracker, pull request and branch state from ~~source control,
|
|
31
|
+
through the host's connections as described in the
|
|
32
|
+
[tracker sync reference](references/tracker-connections.md). Name the category each
|
|
33
|
+
remote fact came from. Status never writes to a remote service.
|
|
34
|
+
|
|
24
35
|
## Return
|
|
25
36
|
|
|
26
37
|
Lead with the current delivery state, then summarize ready, blocked and pending
|
|
@@ -22,6 +22,17 @@
|
|
|
22
22
|
],
|
|
23
23
|
"executable": false
|
|
24
24
|
},
|
|
25
|
+
{
|
|
26
|
+
"path": "references/connectors.md",
|
|
27
|
+
"kind": "reference",
|
|
28
|
+
"hosts": [
|
|
29
|
+
"claude-code",
|
|
30
|
+
"codex",
|
|
31
|
+
"chatgpt",
|
|
32
|
+
"cursor"
|
|
33
|
+
],
|
|
34
|
+
"executable": false
|
|
35
|
+
},
|
|
25
36
|
{
|
|
26
37
|
"path": "references/tracker-connections.md",
|
|
27
38
|
"kind": "reference",
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# Connectors
|
|
2
|
+
|
|
3
|
+
OpenPlanr skills name a kind of service, such as `~~chat`, instead of a product. Connect
|
|
4
|
+
the product your team uses through your host: the vendor publishes the connector, and
|
|
5
|
+
you sign in through the host. OpenPlanr bundles no connectors; they and their credentials
|
|
6
|
+
live in your host. Two optional features need a token: Linear sync (`openplanr linear`) and
|
|
7
|
+
company sign-in (`openplanr company login`). Only when you use them does OpenPlanr store a
|
|
8
|
+
token, in your OS keychain, or in an encrypted file at `~/.planr/credentials.enc` if you set
|
|
9
|
+
`PLANR_CREDENTIAL_FILE_PASSPHRASE`. Tokens are sent only to Linear or to the company server
|
|
10
|
+
you sign in to.
|
|
11
|
+
`openplanr company logout` removes company tokens.
|
|
12
|
+
Every skill also works with nothing connected and reports any remote step it skipped.
|
|
13
|
+
|
|
14
|
+
| Category | Placeholder | Products |
|
|
15
|
+
| --- | --- | --- |
|
|
16
|
+
| Chat | `~~chat` | Slack, Microsoft Teams |
|
|
17
|
+
| Project tracker | `~~project tracker` | Linear, GitHub Issues, Jira, Asana |
|
|
18
|
+
| Source control | `~~source control` | GitHub, GitLab, Bitbucket |
|
|
19
|
+
|
|
20
|
+
Never paste a token into a chat, file or command for OpenPlanr. After you connect a
|
|
21
|
+
service, start a new request so the host loads its tools.
|
|
22
|
+
|
|
23
|
+
## Chat (`~~chat`)
|
|
24
|
+
|
|
25
|
+
Share a status report, sprint note or release notes as a message draft that you review and send yourself.
|
|
26
|
+
|
|
27
|
+
| Product | Use | Claude Code | Codex | Cursor |
|
|
28
|
+
| --- | --- | --- | --- | --- |
|
|
29
|
+
| Slack | Message drafts | Run `/plugin install slack@claude-plugins-official`, then sign in to Slack from `/mcp`. A workspace admin may need to approve the app. | Install Slack from `/plugins` and sign in when asked. A workspace admin may need to approve the app. | Run `/add-plugin slack`, or install Slack from Customize, then sign in when asked. A workspace admin may need to approve the app. |
|
|
30
|
+
|
|
31
|
+
Message format for Slack, drafting through the connector: standard Markdown, which the connector converts on send ([Slack's messaging guidance](https://github.com/slackapi/slack-mcp-plugin/blob/main/skills/slack-messaging/SKILL.md)): `**bold**`, `_italic_`, `[link text](https://example.com)`, `-` lists, `>` quotes. Do not use mrkdwn's `*bold*` or `<url|text>` here.
|
|
32
|
+
|
|
33
|
+
Message format for Slack, text to paste: Slack mrkdwn ([formatting](https://docs.slack.dev/messaging/formatting-message-text)): `*bold*`, `_italic_`, `<https://example.com|link text>`, lines starting with `•` or `-` for lists, `>` for quotes; no headings or tables; escape `&`, `<` and `>` as `&`, `<` and `>`.
|
|
34
|
+
|
|
35
|
+
Also works with: [Microsoft Teams](https://learn.microsoft.com/en-us/microsoft-copilot-studio/mcp-teams-tools) (read for context). Add the vendor's connector in your host the same way.
|
|
36
|
+
|
|
37
|
+
Verified: [Slack](https://docs.slack.dev/ai/slack-mcp-server) on 2026-10-09, [Microsoft Teams](https://learn.microsoft.com/en-us/microsoft-copilot-studio/mcp-teams-tools) on 2026-10-09.
|
|
38
|
+
|
|
39
|
+
## Project tracker (`~~project tracker`)
|
|
40
|
+
|
|
41
|
+
Push planning status to linked issues after you approve each change, and read issue state back.
|
|
42
|
+
|
|
43
|
+
| Product | Use | Claude Code | Codex | Cursor |
|
|
44
|
+
| --- | --- | --- | --- | --- |
|
|
45
|
+
| Linear | OpenPlanr syncs with it | Run `/plugin install linear@claude-plugins-official`, then sign in to Linear from `/mcp`. | Install Linear from `/plugins` and sign in when asked. | Run `/add-plugin linear`, or install Linear from Customize, then sign in when asked. |
|
|
46
|
+
| GitHub Issues | OpenPlanr syncs with it | Install the GitHub CLI from cli.github.com and run `gh auth login`. | Install GitHub from `/plugins` and sign in when asked, or install the GitHub CLI and run `gh auth login`. | Install the GitHub CLI from cli.github.com and run `gh auth login`. |
|
|
47
|
+
|
|
48
|
+
Also works with: [Jira](https://support.atlassian.com/atlassian-ai-gateway/docs/get-started-with-the-atlassian-remote-mcp-server/) (read for context), [Asana](https://developers.asana.com/docs/using-asanas-mcp-server) (read for context). Add the vendor's connector in your host the same way.
|
|
49
|
+
|
|
50
|
+
Verified: [Linear](https://linear.app/docs/mcp) on 2026-10-09, [GitHub Issues](https://cli.github.com/manual/gh_auth_login) on 2026-10-09, [Jira](https://support.atlassian.com/atlassian-ai-gateway/docs/get-started-with-the-atlassian-remote-mcp-server/) on 2026-10-09, [Asana](https://developers.asana.com/docs/using-asanas-mcp-server) on 2026-10-09.
|
|
51
|
+
|
|
52
|
+
## Source control (`~~source control`)
|
|
53
|
+
|
|
54
|
+
Read pull request and branch state for status reports and sprint reviews.
|
|
55
|
+
|
|
56
|
+
| Product | Use | Claude Code | Codex | Cursor |
|
|
57
|
+
| --- | --- | --- | --- | --- |
|
|
58
|
+
| GitHub | Read for context | Install the GitHub CLI from cli.github.com and run `gh auth login`. | Install GitHub from `/plugins` and sign in when asked, or install the GitHub CLI and run `gh auth login`. | Install the GitHub CLI from cli.github.com and run `gh auth login`. |
|
|
59
|
+
|
|
60
|
+
Also works with: [GitLab](https://docs.gitlab.com/user/gitlab_duo/model_context_protocol/mcp_server/) (read for context), [Bitbucket](https://support.atlassian.com/atlassian-ai-gateway/docs/get-started-with-the-atlassian-remote-mcp-server/) (read for context). Add the vendor's connector in your host the same way.
|
|
61
|
+
|
|
62
|
+
Verified: [GitHub](https://cli.github.com/manual/gh_auth_login) on 2026-10-09, [GitLab](https://docs.gitlab.com/user/gitlab_duo/model_context_protocol/mcp_server/) on 2026-10-09, [Bitbucket](https://support.atlassian.com/atlassian-ai-gateway/docs/get-started-with-the-atlassian-remote-mcp-server/) on 2026-10-09.
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Tracker sync reference
|
|
2
2
|
|
|
3
|
-
These skills store and read no
|
|
4
|
-
connection the host already has; the planning files stay the source of
|
|
3
|
+
These skills store and read no tracker or source control credentials. Remote steps
|
|
4
|
+
run through a connection the host already has; the planning files stay the source of
|
|
5
|
+
truth. OpenPlanr syncs with the trackers marked "OpenPlanr syncs with it" in
|
|
6
|
+
[connectors](connectors.md), and reads other products for context only.
|
|
5
7
|
|
|
6
8
|
## Use the host's connection
|
|
7
9
|
|
|
@@ -14,16 +16,10 @@ command, URL or file.
|
|
|
14
16
|
|
|
15
17
|
## When a connection is missing
|
|
16
18
|
|
|
17
|
-
Finish the local work first. Then report the remote step as not run
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
| --- | --- | --- |
|
|
22
|
-
| Claude Code | Run `/plugin install linear@claude-plugins-official`, then sign in to Linear from `/mcp`. | Install the GitHub CLI (cli.github.com) and run `gh auth login`. |
|
|
23
|
-
| Codex | Run `codex mcp add linear --url https://mcp.linear.app/mcp`, then `codex mcp login linear`. | Install the GitHub plugin from `/plugins`, or run `gh auth login`. |
|
|
24
|
-
| Cursor | Add Linear from the Cursor Marketplace and sign in to Linear. | Install the GitHub CLI (cli.github.com) and run `gh auth login`. |
|
|
25
|
-
|
|
26
|
-
Ask the user to try again once connected; never retry the remote step on your own.
|
|
19
|
+
Finish the local work first. Then report the remote step as not run, naming the
|
|
20
|
+
category, and give the one connect step for the current host from
|
|
21
|
+
[connectors](connectors.md). Ask the user to try again once connected; never retry the
|
|
22
|
+
remote step on your own.
|
|
27
23
|
|
|
28
24
|
## Status mapping
|
|
29
25
|
|