{
"name": "jjj-vscode",
"displayName": "JJJ — Popperian Project Management",
"description": "Problems, Solutions, Critiques — managed visually in VS Code",
"version": "0.1.0",
"publisher": "jjj",
"license": "Apache-2.0",
"repository": {
"type": "git",
"url": "https://github.com/doug/jjj"
},
"engines": {
"vscode": "^1.85.0"
},
"categories": [
"Other",
"SCM Providers"
],
"keywords": [
"jujutsu",
"jj",
"project management",
"code review"
],
"bugs": {
"url": "https://github.com/doug/jjj/issues"
},
"main": "./out/extension.js",
"activationEvents": [
"onView:jjj-project-tree"
],
"contributes": {
"configuration": {
"title": "JJJ",
"properties": {
"jjj.path": {
"type": "string",
"default": "jjj",
"description": "Path to the jjj executable"
},
"jjj.filterMode": {
"type": "string",
"enum": [
"all",
"open"
],
"default": "open",
"description": "Tree view filter mode: 'all' shows everything, 'open' hides completed items"
}
}
},
"commands": [
{
"command": "jjj.refreshAll",
"title": "JJJ: Refresh All",
"icon": "$(refresh)"
},
{
"command": "jjj.newProblem",
"title": "JJJ: New Problem",
"icon": "$(plus)"
},
{
"command": "jjj.newSolution",
"title": "JJJ: New Solution",
"icon": "$(plus)"
},
{
"command": "jjj.newCritique",
"title": "JJJ: New Critique"
},
{
"command": "jjj.newMilestone",
"title": "JJJ: New Milestone",
"icon": "$(plus)"
},
{
"command": "jjj.approveSolution",
"title": "JJJ: Approve Solution"
},
{
"command": "jjj.withdrawSolution",
"title": "JJJ: Withdraw Solution"
},
{
"command": "jjj.submitSolution",
"title": "JJJ: Submit Solution",
"icon": "$(beaker)"
},
{
"command": "jjj.lgtmSolution",
"title": "JJJ: LGTM (Sign Off)",
"icon": "$(thumbsup)"
},
{
"command": "jjj.openActiveSolution",
"title": "JJJ: Open Active Solution"
},
{
"command": "jjj.solveProblem",
"title": "JJJ: Solve Problem"
},
{
"command": "jjj.dissolveProblem",
"title": "JJJ: Dissolve Problem"
},
{
"command": "jjj.addressCritique",
"title": "JJJ: Address Critique"
},
{
"command": "jjj.dismissCritique",
"title": "JJJ: Dismiss Critique"
},
{
"command": "jjj.addCritiqueHere",
"title": "JJJ: Add Critique Here"
},
{
"command": "jjj.resumeSolution",
"title": "JJJ: Resume Solution"
},
{
"command": "jjj.switchToChange",
"title": "JJJ: Switch to Change",
"icon": "$(git-branch)"
},
{
"command": "jjj.openEntity",
"title": "JJJ: Open Entity"
},
{
"command": "jjj.showOpenOnly",
"title": "JJJ: Show Open Only",
"icon": "$(filter)"
},
{
"command": "jjj.showAll",
"title": "JJJ: Show All",
"icon": "$(filter-filled)"
},
{
"command": "jjj.toggleTreeFilter",
"title": "JJJ: Toggle Filter"
},
{
"command": "jjj.nextOpenItem",
"title": "JJJ: Next Open Item"
},
{
"command": "jjj.prevOpenItem",
"title": "JJJ: Previous Open Item"
},
{
"command": "jjj.syncGithub",
"title": "JJJ: Sync GitHub",
"icon": "$(cloud-download)"
},
{
"command": "jjj.syncGithubImport",
"title": "JJJ: Import GitHub Issue"
},
{
"command": "jjj.syncGithubStatus",
"title": "JJJ: GitHub Sync Status"
},
{
"command": "jjj.validateCritique",
"title": "JJJ: Validate Critique",
"icon": "$(error)"
},
{
"command": "jjj.commentSubmitCritique",
"title": "Submit"
},
{
"command": "jjj.commentAddressCritique",
"title": "Address",
"icon": "$(check)"
},
{
"command": "jjj.commentDismissCritique",
"title": "Dismiss",
"icon": "$(close)"
},
{
"command": "jjj.commentValidateCritique",
"title": "Validate (Confirmed Flaw)",
"icon": "$(error)"
},
{
"command": "jjj.assignToMe",
"title": "JJJ: Assign to Me"
},
{
"command": "jjj.moveProblemToMilestone",
"title": "JJJ: Move to Milestone…"
},
{
"command": "jjj.newProblemInMilestone",
"title": "JJJ: New Problem in Milestone",
"icon": "$(plus)"
},
{
"command": "jjj.reopenProblem",
"title": "JJJ: Reopen Problem"
},
{
"command": "jjj.editProblem",
"title": "Rename Problem",
"category": "JJJ"
},
{
"command": "jjj.editSolution",
"title": "Rename Solution",
"category": "JJJ"
},
{
"command": "jjj.editProblemTags",
"title": "Edit Problem Tags",
"category": "JJJ"
},
{
"command": "jjj.editSolutionTags",
"title": "Edit Solution Tags",
"category": "JJJ"
}
],
"viewsContainers": {
"activitybar": [
{
"id": "jjj-sidebar",
"title": "JJJ",
"icon": "media/jjj-icon.svg"
}
]
},
"views": {
"jjj-sidebar": [
{
"id": "jjj-project-tree",
"name": "Project"
}
]
},
"viewsWelcome": [
{
"view": "jjj-project-tree",
"contents": "The jjj CLI was not found.\n\nInstall with cargo:\n```\ncargo install jjj\n```\n\nOr see the [installation guide](https://github.com/doug/jjj#installation) for other options.\n\nIf jjj is already installed but not on PATH, set the path in settings:\n\n[Open Settings](command:workbench.action.openSettings?%5B%22jjj.path%22%5D)",
"when": "!jjj.cliAvailable"
},
{
"view": "jjj-project-tree",
"contents": "No problems yet.\n\n[Create a Problem](command:jjj.newProblem)",
"when": "jjj.cliAvailable"
}
],
"menus": {
"view/title": [
{
"command": "jjj.showOpenOnly",
"when": "view == jjj-project-tree && jjj.filterMode == all",
"group": "navigation@1"
},
{
"command": "jjj.showAll",
"when": "view == jjj-project-tree && jjj.filterMode == open",
"group": "navigation@1"
},
{
"command": "jjj.refreshAll",
"when": "view == jjj-project-tree",
"group": "navigation@2"
},
{
"command": "jjj.newProblem",
"when": "view == jjj-project-tree",
"group": "navigation@3"
},
{
"command": "jjj.newMilestone",
"when": "view == jjj-project-tree",
"group": "navigation@4"
}
],
"view/item/context": [
{
"command": "jjj.newSolution",
"when": "viewItem == problem",
"group": "1_actions@1"
},
{
"command": "jjj.solveProblem",
"when": "viewItem == problem",
"group": "1_actions@2"
},
{
"command": "jjj.dissolveProblem",
"when": "viewItem == problem",
"group": "1_actions@3"
},
{
"command": "jjj.submitSolution",
"when": "viewItem == solution-proposed",
"group": "1_actions@1"
},
{
"command": "jjj.lgtmSolution",
"when": "viewItem == solution-submitted",
"group": "1_actions@1"
},
{
"command": "jjj.approveSolution",
"when": "viewItem == solution-submitted",
"group": "1_actions@2"
},
{
"command": "jjj.withdrawSolution",
"when": "viewItem =~ /^solution-(proposed|submitted)$/",
"group": "1_actions@3"
},
{
"command": "jjj.newCritique",
"when": "viewItem =~ /^solution-(proposed|submitted)$/",
"group": "1_actions@3"
},
{
"command": "jjj.resumeSolution",
"when": "viewItem =~ /^solution-(proposed|submitted)$/",
"group": "1_actions@4"
},
{
"command": "jjj.switchToChange",
"when": "viewItem =~ /^solution-/",
"group": "2_navigate@1"
},
{
"command": "jjj.addressCritique",
"when": "viewItem =~ /^critique-(open|valid)$/",
"group": "1_actions@1"
},
{
"command": "jjj.dismissCritique",
"when": "viewItem =~ /^critique-(open|valid)$/",
"group": "1_actions@2"
},
{
"command": "jjj.validateCritique",
"when": "viewItem == critique-open",
"group": "1_actions@3"
},
{
"command": "jjj.newProblem",
"when": "viewItem == milestone || viewItem == backlog",
"group": "1_actions@1"
},
{
"command": "jjj.assignToMe",
"when": "viewItem == problem",
"group": "2_assign@1"
},
{
"command": "jjj.assignToMe",
"when": "viewItem =~ /^solution-/",
"group": "2_assign@1"
},
{
"command": "jjj.moveProblemToMilestone",
"when": "viewItem == problem",
"group": "2_assign@2"
},
{
"command": "jjj.newProblemInMilestone",
"when": "viewItem == milestone || viewItem == backlog",
"group": "1_actions@2"
},
{
"command": "jjj.reopenProblem",
"when": "viewItem == problem",
"group": "3_status@1"
},
{
"command": "jjj.editProblem",
"when": "viewItem == problem",
"group": "3_status@2"
},
{
"command": "jjj.editProblemTags",
"when": "viewItem == problem",
"group": "3_status@3"
},
{
"command": "jjj.editSolution",
"when": "viewItem =~ /^solution-/",
"group": "3_status@2"
},
{
"command": "jjj.editSolutionTags",
"when": "viewItem =~ /^solution-/",
"group": "3_status@3"
}
],
"editor/context": [
{
"command": "jjj.addCritiqueHere",
"group": "jjj@1"
}
],
"comments/commentThread/title": [
{
"command": "jjj.commentAddressCritique",
"when": "commentController == jjj-critiques && commentThreadContextValue =~ /open|valid/",
"group": "inline@1"
},
{
"command": "jjj.commentDismissCritique",
"when": "commentController == jjj-critiques && commentThreadContextValue =~ /open|valid/",
"group": "inline@2"
},
{
"command": "jjj.commentValidateCritique",
"when": "commentController == jjj-critiques && commentThreadContextValue == open",
"group": "inline@3"
}
],
"comments/commentThread/context": [
{
"command": "jjj.commentSubmitCritique",
"when": "commentController == jjj-critiques",
"group": "inline"
}
]
},
"keybindings": [
{
"command": "jjj.toggleTreeFilter",
"key": "cmd+shift+o",
"mac": "cmd+shift+o",
"win": "ctrl+shift+o",
"linux": "ctrl+shift+o"
},
{
"command": "jjj.nextOpenItem",
"key": "tab",
"when": "focusedView == jjj-project-tree"
},
{
"command": "jjj.prevOpenItem",
"key": "shift+tab",
"when": "focusedView == jjj-project-tree"
}
]
},
"scripts": {
"compile": "tsc -p ./",
"watch": "tsc -watch -p ./",
"lint": "eslint src --ext ts",
"test": "tsc -p ./tsconfig.test.json && mocha out-test/**/*.test.js",
"package": "vsce package",
"install-ext": "vsce package && code --install-extension *.vsix"
},
"devDependencies": {
"@types/mocha": "^10.0.0",
"@types/node": "^20.0.0",
"@types/sinon": "^17.0.0",
"@types/vscode": "^1.85.0",
"@typescript-eslint/eslint-plugin": "^7.0.0",
"@typescript-eslint/parser": "^7.0.0",
"@vscode/vsce": "^3.0.0",
"eslint": "^8.56.0",
"mocha": "^11.7.5",
"sinon": "^17.0.0",
"typescript": "^5.3.0"
}
}