NAME
curo - distributed project management tool
VERSION
0.0.2 Development Release
SYNOPSIS
curo COMMAND [...]
DESCRIPTION
Curo is a project management system that enables efficient communication through inter-project cooperation. The key features of disconnected operation and fast synchronisation provide provide location independent performance.
Every Curo repository contains a fully-functional database of state and history. The database schema allows for the creation and efficient querying of nested (hierarchical) projects and their associated components. Updates do not require access to a central server.
Tasks and issues can be distributed across multiple projects. Entire projects can be replicated between repositories. Meta information (e.g. task state) is tracked on a per-project basis, but is globally visible along with all comments.
Don't let this flexibility scare you away; the curo command-line interface is designed for ease of use and is eminently suitable for standalone projects.
DEFINITIONS
- Repository
-
A directory containing a configuration file and a collection of threads stored in a database. The current repository is the first .curo directory found when searching upwards from the current working directory. The terms repository and database are often used interchangeably.
- Thread
-
A conversion (history) about a specific topic plus its current properties (state). Tasks, Issues, Feature Requests, Bugs, FAQs etc as well as Projects, Hubs and Links can all be considered threads.
- Project
-
A collection of threads and possibly sub-projects. Has a name, title, phase and a history. Is always specified by its path which includes the names of all parent projects concatenated together with /. A project can be replicated across multiple repositories.
- Task
-
An item of work to be performed. Has an ID, UUID, title, state and a history. A task can be distributed across multiple projects in multiple repositories.
- Issue
-
A problem that may prevent project completion. Has an ID, UUID, title, state and a history. An issue can be distributed across multiple projects in multiple repositories.
- Hub
-
A repository located at a remote synchronization point around which you can share projects, tasks, or issues. Is specified either by its location URI or by an alias created with the 'new hub' command.
- ID
-
A locally-unique integer identifying a thread in the local repository.
- UUID
-
A globally-unique SHA1 hash identifying a task or issue anywhere.
- UPDATE_ID
-
A locally-unique integer prefixed with a "u" indentifying a single update or comment.
COMMANDS
The command map summary for curo is shown below. Commands are based on the initialize, modify, display and propagate ideas that users of distributed version control systems should find familiar.
curo init [DIRECTORY]
curo new TYPE
curo new project [NAME] [TITLE...]
curo new task [TITLE...]
curo new issue [TITLE...]
curo new hub [ALIAS] [LOCATION]
curo list [TYPE]
curo list projects
curo list tasks [PROJECT]
curo list issues [PROJECT]
curo list hubs
curo list links
curo list project-threads
curo show THREAD
curo log [THREAD]
curo update THREAD
curo drop THREAD
curo upgrade [HUB]
curo pull THREAD HUB [PROJECT]
curo push THREAD HUB [PROJECT]
curo sync [THREAD] [HUB]
curo ALIAS
Input is accepted on stdin. Arguments and options not supplied on the command line are prompted for. An editor based on the EDITOR or VISUAL environment variables may be invoked for certain types of input.
Normal output is printed to stdout and sometimes paged with less(1) when stdout is connected to a terminal. Error messages are sent to stderr. Adding -d all
to the end of any command adds debugging information to stdout.
An exit value of zero indicates success.
The only commands requiring network communication with a hub are push
, pull
and sync
; everything else performs local-only actions.
Initialization
- init [--hub] [--todo | -t] [DIRECTORY]
-
Create an empty Curo repository. The repository is created inside a hidden .curo sub-directory unless
--hub
is used.A personal TODO project can be automatically created after initialization with the
--todo | -t
options.
Creation
- new hub [ALIAS] [LOCATION]
-
Create an alias for a remote Curo hub. The hub LOCATION must be one of the following:
A local filesystem directory name
- new issue [-p PROJECT] [-s STATE] [-c COMMENT] [TITLE]
-
Create a new issue.
- new task [-p PROJECT] [-s STATE] [-c COMMENT] [TITLE]
-
Create a new task.
- new project [-p PHASE] [-c COMMENT] [PARENT/]NAME [TITLE]
-
Create a new project. The optional [PARENT/] may be specified in order to create this as a sub-project.
Retrieval
- list
-
List all projects, issues and tasks combined together in a single table.
- list hubs
-
List references to remote databases showing name/alias and URI, ordered by name.
- list issues
-
List issues in the database showing issue ID, title, project, and state. Issues are ordered by project path, then by ID.
- list tasks
-
List tasks in the database showing issue ID, title, project, and state. Tasks are ordered by project path, then by ID.
- list projects
-
List projects in the database showing path, title, phase, number of tasks and number of issues. Rows are ordered by path.
- list project-phases
-
List the phases that a project can have. A per-project value.
- list task-states
-
List the types that a task can have. A per-project value.
- list issue-states
-
List the types that an issue can have. A per-project value.
- log
-
Display a summary of the combined history of all activities in the repository.
- log ID
-
Display the history of the task or issue identified by ID. Output is paged with
less
ormore
. - log PROJECT
-
Display the history of the project.
Modification
- update ID [-s STATE] [--title TITLE]
-
Modify the state or title of the task or issue identified by ID. A comment is expected.
- update PROJECT [-p PHASE]
-
Modify the phase or title of a project. A comment is expected.
-
Add a comment to a task, issue or project. If an UPDATE_ID is given instead of an ID or PROJECT the comment will be recorded as a reply to a previous update or comment.
- drop [--force | -f] [PROJECT:]ID
-
Delete a task or issue from the database. Will prompt for confirmation without
--force
. - drop [--force | -f] PROJECT
-
Delete a project from the database. Will prompt for confirmation without
--force
.
Propagation
- push PROJECT HUB[:REMOTE_PROJECT] [--no-track]
-
Send changes from a local project (including its task and issue updates) to a remote project. REMOTE_PROJECT defaults to PROJECT. HUB is either a location or a previously created hub name.
A project can be re-parented during a push, but the name must remain the same.
- pull HUB:REMOTE_PROJECT [PROJECT]
-
Pull a project (including its tasks and issues) from a remote repository into the local repository. HUB is either a location URI or a previously defined hub alias. A project can be re-parented during a pull by specifying PROJECT.
Administration
- upgrade
-
Upgrade the database schema to match the current version of the software.
EXAMPLES
We'll begin with the standalone scenario: a single individual who needs to manage a to-do list, which in this particular case can be automatically created when a repository is initialised:
$ curo init --todo
Database initialised (v93) in .curo/
Project created: todo <adb8215b>
For the standalone scenario (as for all scenarios) the repository is modifiable completely independently of any other repository.
$ curo new task
Task: Take out the rubbish
Task created: 2 <353b8a75>
$ curo new issue
Title: I'm sick of taking out the rubbish
Issue created: 3 <569e2e5d>
Tasks and issues can be viewed, commented on and updated with the appropriate commands:
$ curo list
ID Topic (todo) State
------------------------------------------------------
2 Take out the rubbish open (task)
3 I'm sick of taking out the rubbish open (issue)
$ curo update 2 -s done
Comment: Sigh, had to take it out myself
Task updated: 2 (c6) <353b8a75>
$ curo log 4
Task: 4 <f0417b4b0ac625461d65be3e7c681f984e27d65c>
From: Mark Lawrence <nomad@null.net>
When: 1 hour ago <2012-03-25 20:39:09Z>
State: todo:open
lkjsd flkdsf lkjds f
Comment: c6 <2465ce6d2d9ab77b7b02bcf171494c1261a38f5a>
From: Mark Lawrence <nomad@null.net>
When: 3 seconds ago <2012-03-25 21:50:39Z>
State: todo:done
Just because I did it
Our user knows that the catch all to-do list will quickly become too unwieldy to manage everything in life, and so decides to group the next set of tasks and issues together. This can be done with a new project:
$ curo new project garden A growing project
Project created: garden <36dfe243>
$ curo new task Turn the dirt over
Project: garden
Task created: 5 <36dfe243>
Because there is now more than one project in the repository, a new task or issue command will prompt for the associated project, or the project can be specified with a flag:
$ curo new task Buy the seeds for later sowing -p garden
Task created: 6 <36dfe243>
$ curo list
ID Topic (garden) State
------------------------------------------------------
5 Turn the dirt over open (task)
6 Buy the seeds for later sowing open (task)
ID Topic (todo) State
------------------------------------------------------
2 Take out the rubbish open (task)
3 I'm sick of taking out the rubbish open (issue)
The current project summary is easily obtained:
$ curo list projects
Project Title Phase Tasks Issues
----------------------------------------------------
garden A growing project run 2 0
todo A personal TODO list run 1 0
By default, the various list
commands assume a task and issue status of "active". Detailed summaries of task and issue states are also available:
$ curo list task-states
Project Rank Status Default State Count
---------------------------------------------------
garden 10 active * open 1
garden 20 active assigned 0
garden 30 stalled needinfo 0
garden 40 stalled upstream 0
garden 50 stalled depends 0
garden 60 resolved done 0
garden 70 closed cancel 0
todo 10 active * open 1
todo 20 active assigned 0
todo 30 stalled needinfo 0
todo 40 stalled upstream 0
todo 50 stalled depends 0
todo 60 resolved done 1
todo 70 closed cancel 0
FILES
A Curo repository consists of the following files:
- .curo/config
-
Ini-style text configuration file.
- .curo/curo.sqlite
-
SQLite database containing all data.
The following other files may also be used:
SUPPORT
Not yet available.
SEE ALSO
Curo(3p)
AUTHOR
Mark Lawrence <nomad@null.net>
COPYRIGHT AND LICENSE
Copyright 2011 Mark Lawrence <nomad@null.net>
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version.